From fb15609c9e6226ef1637d167ddf4208656098633 Mon Sep 17 00:00:00 2001 From: ekeeke31 Date: Thu, 7 Aug 2008 12:26:07 +0000 Subject: [PATCH] restored from bountysource --- Makefile.gc | 126 + Makefile => Makefile.wii | 121 +- compile_all.bat | 6 + gen_eeprom.doc | Bin 1193472 -> 0 bytes genplus.doc | Bin 290304 -> 0 bytes history.txt | 236 +- pcutil/inject.c | 2 +- source/cart_hw/cart_hw.c | 600 + source/cart_hw/cart_hw.h | 53 + source/{ => cart_hw}/eeprom.c | 902 +- source/{ => cart_hw}/eeprom.h | 179 +- source/cart_hw/sram.c | 98 + source/{ => cart_hw}/sram.h | 84 +- source/cart_hw/svp/imageformat.txt | 67 + source/cart_hw/svp/ssp16.c | 1330 + source/cart_hw/svp/ssp16.h | 82 + source/cart_hw/svp/svp.c | 26 + source/cart_hw/svp/svp.h | 30 + source/cart_hw/svp/svpdoc.txt | 524 + source/cpu/cpuintrf.h | 89 +- source/cpu/osd_cpu.h | 168 +- source/cpu/z80.c | 8100 ++--- source/cpu/z80.h | 122 +- source/cpu/z80daa.h | 2051 -- source/doc/license | 680 +- source/genesis.c | 270 +- source/genesis.h | 87 +- source/hvc.h | 855 +- source/input.c | 758 +- source/input.h | 112 +- source/io.c | 404 +- source/io.h | 63 +- source/{ngc/gui/rominfo.c => loadrom.c} | 845 +- source/{ngc/gui/rominfo.h => loadrom.h} | 119 +- source/{cpu => m68k}/m68k.h | 723 +- source/{cpu => m68k}/m68kconf.h | 384 +- source/m68k/m68kcpu.c | 1921 +- source/m68k/m68kcpu.h | 3875 ++- source/m68k/m68kopac.c | 11948 ------- source/m68k/m68kopdm.c | 13286 -------- source/m68k/m68kopnz.c | 8746 ----- source/m68k/m68kops.c | 38775 ++++++++++++++++++++-- source/m68k/m68kops.h | 2006 +- source/macros.h | 67 +- source/mem68k.c | 1809 +- source/mem68k.h | 65 +- source/membnk.c | 662 +- source/membnk.h | 45 +- source/memvdp.c | 142 +- source/memvdp.h | 37 +- source/memz80.c | 509 +- source/memz80.h | 43 +- source/ngc/config.c | 68 + source/ngc/config.h | 42 + source/ngc/gcaram.c | 151 +- source/ngc/gcaram.h | 39 +- source/ngc/gui/confjoy.c | 208 - source/ngc/gui/dkpro.h | 1754 +- source/ngc/gui/dvd.c | 326 +- source/ngc/gui/dvd.h | 47 +- source/ngc/gui/filesel.c | 1185 +- source/ngc/gui/filesel.c.new | 526 - source/ngc/gui/filesel.c.old | 540 - source/ngc/gui/font.c | 699 +- source/ngc/gui/font.h | 27 +- source/ngc/gui/ggentry.c | 698 +- source/ngc/gui/gpback.h | 17982 +++++----- source/ngc/gui/iso9660.c | 460 +- source/ngc/gui/iso9660.h | 75 +- source/ngc/gui/iso9660.h.new | 45 - source/ngc/gui/iso9660.h.old | 44 - source/ngc/gui/legal.c | 200 +- source/ngc/gui/{mcard.c => memfile.c} | 1175 +- source/ngc/gui/menu.c | 1747 +- source/ngc/gui/saveicon.h | 272 +- source/ngc/history.c | 101 + source/ngc/history.h | 40 + source/ngc/loadrom.c | 196 - source/ngc/ngc.c | 878 +- source/ngc/ogc_audio.c | 86 + source/ngc/ogc_audio.h | 31 + source/ngc/ogc_input.c | 671 + source/ngc/ogc_input.h | 42 + source/ngc/ogc_video.c | 713 + source/ngc/ogc_video.h | 34 + source/ngc/osd.h | 64 +- source/ngc/png/crosshair-1.c | 1863 ++ source/ngc/png/crosshair-1.h | 14 + source/ngc/png/crosshair-1.png | Bin 0 -> 29674 bytes source/ngc/png/crosshair-2.c | 1859 ++ source/ngc/png/crosshair-2.h | 14 + source/ngc/png/crosshair-2.png | Bin 0 -> 29601 bytes source/ngc/unzip.c | 370 +- source/ngc/unzip.c.new | 193 - source/ngc/unzip.c.old | 190 - source/ngc/unzip.h | 40 +- source/ngc/vfat/diskio.c | 99 - source/ngc/vfat/diskio.h | 36 - source/ngc/vfat/vfat.c | 841 - source/ngc/vfat/vfat.h | 226 - source/ngc/wdvd.c | 160 + source/ngc/wdvd.h | 27 + source/render.c | 3197 +- source/render.h | 102 +- source/shared.h | 78 +- source/sound/fm.c | 4334 +-- source/sound/fm.h | 206 +- source/sound/sn76489.c | 581 +- source/sound/sn76489.h | 195 +- source/sound/sn76496.c | 311 - source/sound/sn76496.h | 38 - source/sound/sound.c | 342 +- source/sound/sound.h | 70 +- source/sound/ym2612.c | 219 +- source/sound/ym2612.h | 92 +- source/sram.c | 78 - source/ssf2tnc.c | 98 - source/ssf2tnc.h | 17 - source/state.c | 267 +- source/state.h | 15 +- source/system.c | 610 +- source/system.h | 179 +- source/types.h | 46 +- source/unused/dos/SEALINTF.C | 576 +- source/unused/dos/SEALINTF.H | 34 +- source/unused/dos/config.c | 545 +- source/unused/dos/config.h | 157 +- source/unused/dos/dos.c | 1121 +- source/unused/dos/dos.h | 43 +- source/unused/dos/error.c | 59 +- source/unused/dos/error.h | 26 +- source/unused/dos/osd.h | 40 +- source/unused/fileio.c | 304 +- source/unused/fileio.h | 29 +- source/unused/loadrom.c | 52 - source/unused/loadrom.h | 10 - source/unused/make.bat | 1 + source/unused/makefile.dj2 | 111 + source/unused/makefile.mgw | 107 + source/unused/unzip.c | 2602 +- source/unused/unzip.h | 548 +- source/unused/win/error.c | 78 +- source/unused/win/error.h | 26 +- source/unused/win/main.c | 424 +- source/unused/win/main.h | 31 +- source/unused/win/osd.h | 38 +- source/vdp.c | 1075 +- source/vdp.h | 155 +- 148 files changed, 80605 insertions(+), 79992 deletions(-) create mode 100644 Makefile.gc rename Makefile => Makefile.wii (61%) create mode 100644 compile_all.bat delete mode 100644 gen_eeprom.doc delete mode 100644 genplus.doc create mode 100644 source/cart_hw/cart_hw.c create mode 100644 source/cart_hw/cart_hw.h rename source/{ => cart_hw}/eeprom.c (76%) rename source/{ => cart_hw}/eeprom.h (90%) create mode 100644 source/cart_hw/sram.c rename source/{ => cart_hw}/sram.h (82%) create mode 100644 source/cart_hw/svp/imageformat.txt create mode 100644 source/cart_hw/svp/ssp16.c create mode 100644 source/cart_hw/svp/ssp16.h create mode 100644 source/cart_hw/svp/svp.c create mode 100644 source/cart_hw/svp/svp.h create mode 100644 source/cart_hw/svp/svpdoc.txt delete mode 100644 source/cpu/z80daa.h rename source/{ngc/gui/rominfo.c => loadrom.c} (53%) rename source/{ngc/gui/rominfo.h => loadrom.h} (69%) rename source/{cpu => m68k}/m68k.h (80%) rename source/{cpu => m68k}/m68kconf.h (66%) delete mode 100644 source/m68k/m68kopac.c delete mode 100644 source/m68k/m68kopdm.c delete mode 100644 source/m68k/m68kopnz.c create mode 100644 source/ngc/config.c create mode 100644 source/ngc/config.h delete mode 100644 source/ngc/gui/confjoy.c delete mode 100644 source/ngc/gui/filesel.c.new delete mode 100644 source/ngc/gui/filesel.c.old delete mode 100644 source/ngc/gui/iso9660.h.new delete mode 100644 source/ngc/gui/iso9660.h.old rename source/ngc/gui/{mcard.c => memfile.c} (65%) create mode 100644 source/ngc/history.c create mode 100644 source/ngc/history.h delete mode 100644 source/ngc/loadrom.c create mode 100644 source/ngc/ogc_audio.c create mode 100644 source/ngc/ogc_audio.h create mode 100644 source/ngc/ogc_input.c create mode 100644 source/ngc/ogc_input.h create mode 100644 source/ngc/ogc_video.c create mode 100644 source/ngc/ogc_video.h create mode 100644 source/ngc/png/crosshair-1.c create mode 100644 source/ngc/png/crosshair-1.h create mode 100644 source/ngc/png/crosshair-1.png create mode 100644 source/ngc/png/crosshair-2.c create mode 100644 source/ngc/png/crosshair-2.h create mode 100644 source/ngc/png/crosshair-2.png delete mode 100644 source/ngc/unzip.c.new delete mode 100644 source/ngc/unzip.c.old delete mode 100644 source/ngc/vfat/diskio.c delete mode 100644 source/ngc/vfat/diskio.h delete mode 100644 source/ngc/vfat/vfat.c delete mode 100644 source/ngc/vfat/vfat.h create mode 100644 source/ngc/wdvd.c create mode 100644 source/ngc/wdvd.h delete mode 100644 source/sound/sn76496.c delete mode 100644 source/sound/sn76496.h delete mode 100644 source/sram.c delete mode 100644 source/ssf2tnc.c delete mode 100644 source/ssf2tnc.h delete mode 100644 source/unused/loadrom.c delete mode 100644 source/unused/loadrom.h create mode 100644 source/unused/make.bat create mode 100644 source/unused/makefile.dj2 create mode 100644 source/unused/makefile.mgw diff --git a/Makefile.gc b/Makefile.gc new file mode 100644 index 0000000..f7f0642 --- /dev/null +++ b/Makefile.gc @@ -0,0 +1,126 @@ +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(DEVKITPPC)),) +$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC) +endif + +include $(DEVKITPPC)/gamecube_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := genplus_cube +BUILD := build_cube +SOURCES := source source/m68k source/cpu source/sound source/cart_hw \ + source/cart_hw/svp source/ngc source/ngc/gui +INCLUDES := source source/m68k source/cpu source/sound source/cart_hw \ + source/cart_hw/svp source/ngc source/ngc/gui + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +CFLAGS = -g -fno-strict-aliasing -O2 -Wall $(MACHDEP) $(INCLUDE) -DWORDS_BIGENDIAN -DNGC="1" -DHW_DOL +CXXFLAGS = $(CFLAGS) + +LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lfat -logc -lm -lz + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export LD := $(CC) +else + export LD := $(CXX) +endif + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) \ + -I$(LIBOGC_INC) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + -L$(LIBOGC_LIB) + +export OUTPUT := $(CURDIR)/$(TARGET) +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).dol: $(OUTPUT).elf +$(OUTPUT).elf: $(OFILES) + + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + diff --git a/Makefile b/Makefile.wii similarity index 61% rename from Makefile rename to Makefile.wii index 24ea67a..9290e11 100644 --- a/Makefile +++ b/Makefile.wii @@ -1,49 +1,46 @@ #--------------------------------------------------------------------------------- -# Generic makefile for Gamecube projects -# -# Tab stops set to 4 -# | | | | -# 0 1 2 3 -#--------------------------------------------------------------------------------- # Clear the implicit built in rules #--------------------------------------------------------------------------------- .SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(DEVKITPPC)),) +$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC) +endif + +include $(DEVKITPPC)/wii_rules + #--------------------------------------------------------------------------------- # TARGET is the name of the output # BUILD is the directory where object files & intermediate files will be placed # SOURCES is a list of directories containing source code # INCLUDES is a list of directories containing extra header files #--------------------------------------------------------------------------------- -TARGET := genplus -BUILD := build -SOURCES := source source/m68k source/cpu source/sound \ - source/ngc source/ngc/gui source/ngc/vfat -INCLUDES := source source/m68k source/cpu source/sound \ - source/ngc source/ngc/gui source/ngc/vfat +TARGET := genplus_wii +BUILD := build_wii +SOURCES := source source/m68k source/cpu source/sound source/cart_hw\ + source/cart_hw/svp source/ngc source/ngc/gui +INCLUDES := source source/m68k source/cpu source/sound source/cart_hw\ + source/cart_hw/svp source/ngc source/ngc/gui #--------------------------------------------------------------------------------- # options for code generation #--------------------------------------------------------------------------------- -MACHDEP = -DGEKKO -mcpu=750 -meabi -mhard-float -CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) -DWORDS_BIGENDIAN \ - -DNGC="1" -DGENESIS_HACKS="1" \ -LDFLAGS = $(MACHDEP) -mogc -Wl,-Map,$(notdir $@).map -Wl,--cref +CFLAGS = -g -O2 -mrvl -Wall $(MACHDEP) -fno-strict-aliasing $(INCLUDE) -DWORDS_BIGENDIAN -DNGC="1" -DHW_RVL +CXXFLAGS = $(CFLAGS) -PREFIX := powerpc-gekko- +LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map -#export PATH:=/c/devkitPPC_r11/bin:/bin +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lfat -lwiiuse -lbte -logc -lm -lz #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing # include and lib #--------------------------------------------------------------------------------- -LIBDIRS := /c/devkitPro/devkitPPC - -#--------------------------------------------------------------------------------- -# any extra libraries we wish to link with -#--------------------------------------------------------------------------------- -LIBS := -logc -lm -lz -logcsys -lsdcard +LIBDIRS := #--------------------------------------------------------------------------------- # no real need to edit anything past this point unless you need to add additional @@ -51,13 +48,14 @@ LIBS := -logc -lm -lz -logcsys -lsdcard #--------------------------------------------------------------------------------- ifneq ($(BUILD),$(notdir $(CURDIR))) #--------------------------------------------------------------------------------- -export OUTPUT := $(CURDIR)/$(TARGET) -export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) -export CC := $(PREFIX)gcc -export CXX := $(PREFIX)g++ -export AR := $(PREFIX)ar -export OBJCOPY := $(PREFIX)objcopy +export OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + #--------------------------------------------------------------------------------- # automatically build a list of object files for our project #--------------------------------------------------------------------------------- @@ -65,6 +63,8 @@ CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + #--------------------------------------------------------------------------------- # use CXX for linking C++ projects, CC for standard C #--------------------------------------------------------------------------------- @@ -74,32 +74,36 @@ else export LD := $(CXX) endif -export OFILES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(sFILES:.s=.o) $(SFILES:.S=.o) +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) #--------------------------------------------------------------------------------- # build a list of include paths #--------------------------------------------------------------------------------- export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ - -I$(CURDIR)/$(BUILD) + -I$(CURDIR)/$(BUILD) \ + -I$(LIBOGC_INC) #--------------------------------------------------------------------------------- # build a list of library paths #--------------------------------------------------------------------------------- -export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + -L$(LIBOGC_LIB) export OUTPUT := $(CURDIR)/$(TARGET) .PHONY: $(BUILD) clean #--------------------------------------------------------------------------------- $(BUILD): - @[ -d $@ ] || mkdir $@ + @[ -d $@ ] || mkdir -p $@ @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile #--------------------------------------------------------------------------------- clean: @echo clean ... - @rm -fr $(BUILD) *.elf + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol #--------------------------------------------------------------------------------- run: @@ -119,56 +123,19 @@ DEPENDS := $(OFILES:.o=.d) # main targets #--------------------------------------------------------------------------------- $(OUTPUT).dol: $(OUTPUT).elf - @echo output ... $(notdir $@) - @$(OBJCOPY) -O binary $< $@ - -#--------------------------------------------------------------------------------- $(OUTPUT).elf: $(OFILES) - @echo linking ... $(notdir $@) - @$(LD) $^ $(LDFLAGS) $(LIBPATHS) $(LIBS) -o $@ #--------------------------------------------------------------------------------- -# Compile Targets for C/C++ +# This rule links in binary data with the .jpg extension #--------------------------------------------------------------------------------- - +%.jpg.o : %.jpg #--------------------------------------------------------------------------------- -%.o : %.cpp - @echo Compiling ... $(notdir $<) - @$(CXX) -MMD $(CFLAGS) -o $@ -c $< - -#--------------------------------------------------------------------------------- -%.o : %.c - @echo Compiling ... $(notdir $<) - @$(CC) -MMD $(CFLAGS) -o $@ -c $< - -#--------------------------------------------------------------------------------- -%.o : %.S - @echo Compiling ... $(notdir $<) - @$(CC) -MMD $(CFLAGS) -D_LANGUAGE_ASSEMBLY -c $< -o $@ - -#--------------------------------------------------------------------------------- -%.o : %.s - @echo Compiling ... $(notdir $<) - @$(CC) -MMD $(CFLAGS) -D_LANGUAGE_ASSEMBLY -c $< -o $@ - -#--------------------------------------------------------------------------------- -# canned command sequence for binary data -#--------------------------------------------------------------------------------- -define bin2o - cp $(<) $(*).tmp - $(OBJCOPY) -I binary -O elf32-powerpc -B powerpc \ - --rename-section .data=.rodata,readonly,data,contents,alloc \ - --redefine-sym _binary_$*_tmp_start=$*\ - --redefine-sym _binary_$*_tmp_end=$*_end\ - --redefine-sym _binary_$*_tmp_size=$*_size\ - $(*).tmp $(@) - echo "extern const u8" $(*)"[];" > $(*).h - echo "extern const u32" $(*)_size[]";" >> $(*).h - rm $(*).tmp -endef + @echo $(notdir $<) + $(bin2o) -include $(DEPENDS) #--------------------------------------------------------------------------------- endif #--------------------------------------------------------------------------------- + diff --git a/compile_all.bat b/compile_all.bat new file mode 100644 index 0000000..b8f1820 --- /dev/null +++ b/compile_all.bat @@ -0,0 +1,6 @@ +cp Makefile.gc Makefile +make +cp Makefile.wii Makefile +make +rm Makefile +cp genplus_wii.dol boot.dol diff --git a/gen_eeprom.doc b/gen_eeprom.doc deleted file mode 100644 index 4cafa9e955a2fcdd2bf3af6a00c4b3b6c3a519ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1193472 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�(Z2P>f+H%wzctN_6i$SQ@XNh_d0cuP!I| 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­3NugU%WVZ$JWMS()%?lJF+ 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

Y6OCKY$bn%OE8TCYFugpS8YOS@>D}Wd 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

xkRR0#T?$I zz24?n=&3y}G~4_1nhH}2UCx=K=z1CrB1D3&+BPU!i}EVR^gvR7~kZ4TRB#DY+WCS-19>;=JakN6kLV9?@`S zD{n?H@fb~TX}pl*R%cNf)wC%~=7(gNmRX^<>MW6u18JRnz}~OITR;TvMHc3VSR}c3 z?Y1`f*Wo067yxuZWBKHzDwAaM|86E0kX`H%rZiY|gePgN^X20R1-X3tVmo-BG9sXH zYdo?TH{kGZAZTPz$NI|m8$h2ISH$>yx0Cz~MsvD*>ery4QasaVMQRQ&P}eI>C6u0n zx13tP=TZmsH#+tjl4S}m?z17z%LdRcN&p|;zRzy=J{k3;iygfN+vbBl`@F>$0<5{N zp5B!c)G?(ud^w7*9FK||W=`2kqtCp&OPwa`J6*^V%QJyKPtLyt_~+k)eLp)`Jl#WL zK$q9OmiR;VD{+5`r>~E z#a?!qUKm=;gw%KHj4+U44F)=km?-SF>Lxm;W4JNoer0l7eq(wCszH32A=yF@arF^- zhoOszgwdquej4iglLh}_<|M>zVRUvN*wsKIhH&2^783CX*`WCdS`DLvKtT}I4wF2w zF_7Vpsl1I@u}7Pmng8XDC4$iV_%SDJ2O*FRx!mTxVL!E=NBd|!HMEmMVyF>BSKD-x zJK;4Cg~ZWUv$GLlKm!#g`k_4V+u_CsOkEydm*NH}n?de~DU7okk9>lYJw|+U?ommR z@7e_FH#7FQ^7~Jeb?sx#d}V}^%wS9qhvtpr`nOTe?Mv#h`4Kmp$8*n%k#Jz_r728u zv?P#(%wrJ@Ejl;cIkQP@SOfL`_jSlD;XCREo2gBQ-eQz<&tZ1I z5)e5HYwk|R+4`Vr?;I$QE5QLI8yJiPMmG`Sg(VVzPY?Q(0Fkvfa+Ju?y>o&*fXZw8 z1$V{Vl41(B0tP~L1S2TU+avX9k|;U@ZwQQBtL%gbw(|3);c^CPh0Z&;l%td=1Nu`# zWr>~T8=#Vmt*4O4fORo>mugdc-of zq35#8s=Q1q0!_Fb*v7sB_!ga0C3fB06bn|&f))bzuz27Deja_3lLu8buH za^=1E4T7y;c?7>;`ePly-Fd@y-Mru#i9sECGrfRvqVMQBdp7SY*nzc>#12p7;*hTg z483j00tVO7VZA^!+ku^df8 z^Lkad^;MosQz_-S3kas4M4W<}R}yxRWAbrg21rC1sZJvEoYW(cg9`Kx1B*hgkh+Dr z{^=RbgX&HcbXf*f#jF6lIjxv&v|Mrvx?}%RKm$|hO^3oz39ON%wG1hQbO&FTet+dYnD0t>|lDdUN)Zmr^k*lr3t_dU!_>N zg4Ybt=pX_V`E@8A$o(G#r zkV?bd7U%va^d~3?VD<;S=d>6YCX(|BsvKrRZhl}YfAm+G;GJpP{?HDlTVmtT$?j(l zqYZ!M{^gFoQNTGsd^H5}7^NqVk~x4(o2=7svuFXF?zfOwVC%20z|3EQ7%gCH?U~`R zJN-SDKvXz}fR<>YVbXkdRG@M&E~50lUo&vir@VRKB4*xB%J(B$3U5LDIv{b!ifH)O zhVJq30G8sTlFN@9Pz~^<)F#e9>#W4XfG=n@j8ILP$!_MdPkqYeXpUN$0i@YPV7q_7 zGg5|+A@f(OE)*op8j7a&86le#G=}|ubQ-jMFB*up;#|E!caZ{UplcM=*^%*DX*+Q_ z;p`S{3hTSA>xA;;d-1}s+LJNYjF@P9YntzKtzAuk&>1{uowXu)UNF^_0RuhU=+bN1 zW@6UGib`)#J_9M{b)GQ)C?U|wG46kvWyrrm1hg^g14vp-p{mcE-yl?DLc;ZdHJ<@c zqouvXDdPAEUVaQ20tV?_`2={=Ims*VT>Z1PPsT<1#HT?N#yl%6y<8DYMVE^cm<~15 z*&F!%7DDgLMJL7M#0*9zj8ipuq7iBE;zP!e<^n}If4nACL0jX1C{?+QaUd1qlK-xe z;q2gL*4Bi{;?jbwUHL!4)J&KzjgyRDJLKUe@w8+v38hqb2tbpO`?YfKe>L z|Im+?RJJt>dr8b@^s6RFPWpJIJ7yJ(ds(OViK;_(qGA7lR_?Dosl(u#mYQPY;Wt$j z*Iywh-to;#k46xYNPz|59kEOVnJgKIn?>iP;hkTIYL4w7)9h_pY#UzHT@G!DLmb>t zpx|ULqx_}sP4d0`d&$4wqB_lYOu8f%n{~>oSzWY6D?$&TJ@DLR)w*h^FIYb-f%Pq+ z+iMp4AnQGC4?5O_E{JU~tT%`ktx76dJNAw_{$Sre>}WY(T>o$fm`Zv%8dZ0za6fE6 zp02i(xmKp^zuhuP{+-q)%;cjcW_0xSrhBPKa)34dxD9a+pkpK;_`_v;Xs!s}f8AC! zB7WoX)p0z%pY$SW&e`1K1ltvhnrr39@6=EG^XTSw!k zoX&8`KuegD|L-X=+ipdvo?Sbew$cN*tJi5iDb$aX9fJ3JU|Ioro}#XCc)~(Pw*q#ENik!z)W@P1aVyM*T!b0Ms3J6jo=p&q^xZt(a9*2j`F;S*% z8%s*u-D3^dYwPt5wsp(o?aaF)opBmbjEM=lQDKVMLA3&J`n5XNGuni{RLz*!hFc=< zd+h?cxjFJ3J~CYt_nx!APz1gA_AkL?P+Fu0&{h`vLJu8;w9wGJKFtlaq>&?)0UIH9 znR433r39_<$NB2S0kp&U_KB(X$Q+$L#Qd1MeP7J9P-;Dc&9j5zoV+{hTKP`W!6zua z&u2Qz(y_j-i_LbYDgwXF%2S`SF^_~9^R0D{)`=_F-qvW0+7y*EH`yX8TnUr($5*0l zcE{cD|x;nJkX8=2Q_7Qd6|VP7$i3dnFTLTSaPPsARWW9$ampC{YS zv+wuR#C4{j8KODObf%9jyQ+Pu`_5E9nH4q2U%Doy)^=;Ir|P|yN6}{K#_T!hVg~h- zv#@GOWVz5@z?z!hwfb9Dvt8lvdYxXNRv`={QG70)RM(qdqFgM8gh=n*w!# zLm{e!S(?xuBK(786euaM&_TPPJnpJ2Kv|(dYbl$^<0P2fpQZ6u zM>G3$o6AzxqmG3uc3nZaNCR>E8`Q~s6hQVs+G`UVR(SmJ&$O?w-*VjP6_K@=igSo} zX5_QJ=3>%y?sSCDO^ovTqb4k%!--<=AmADGL)nwHs5^qanYZ8{y8R)s_q4XW;0+8X z(gch9uLA2!YxvLtVF&-w0zR%!i|W_x1>&9v5jbZm=%>SBv2ly|$ik9Gb1yIkk>NNZ zE~yuN;jh|d0zE}+0q&Pa#BqxHr{NxujcFyW8{{@+q&Ei79ghbr0L|NL_jkId5Gvia zheB|TL_OdA7()MbX9tm&7X+WNo!vD%JQ7+FK`i)L6TAcF!C5RFPhJyS(2)}*Qu>SI z3suHG0U0GuZDjBtEkhyWV9m^MCV#dGCp3P-Y!&XQ1jf2(LJBwmJ%%?4@*nsvP^5KR z#U1IqSSwOsQ#*e=~Qp+p?@Cr(JQ!w7V@MV@Ce8ZZj?Pw?!OI~z*xv_wt-9o z_iLc8_L(;6`2x4+?jvI}82X8Dz4!S~?5Om6jf|seKlOh>L&x?^uy)&k(G7s+g2S5! zWMcA%%m@ag>=N}t!qxQO@7=rs)!aq93RcIXse14aRsj6Ol(cmVo(DP%!SxYpBs??+ z047uC-FE*N$4zU50M*M#z_5ZcvVRV;^M?i(q_BDskZBSDAwnFre~<&+$)7kY0wUee zb|wuzHPly~T4eDhNrBKr(t#gdiH@Kk{tp04K(xP$ZWcG$U>1+KpQaDbV0r%bujT|V zTDIV|!G`wX?eG?`6NkdLY`u|o^_Yw0YZq0e5M}@*fp*~_wBRWEmeI~+9~d-`pU7@V z6qDhdXa&G03^H7f(7_DAY>1r&Z$>g%oJp!E<92+=1u;B(UZA=xdz_>_rNmr!c8`Kt{TjU`- z^8Ul-j%SVX8H_RlX85@{k1)8fwAkE^z0$BNdE>+cuxyH#9sGNog4o4(11FD*}gqWrCa88v48@ z+|zt1{$_E=$b3=2&H;*(nIW-o%IZj#ecrCaVkr0~BfPjpntZn49h_?6yH+D>DgQ;RUnGjvV(4FEeofNje;0 z3JYO+ViFdC1mql;rL0)8v1`oSm!~tn9pRuY@&NyV1~^77Kf1qf^ywaLdbC&?i!E0b zB-Ts><%qM9{01cM$ucrkjRG97ifP~!B2pEPbtEF}L1c)bg5~~@X4|aMc@gj|u=;TM zJT3qT3_@WXTLeGxxFME453&H$KO+`I2H1dxnZy5o=MEMdcsHC_AG44GqKpVE5Jv?9 zc?8-n%lKZ>Yltor>bB+>qr5q>+S5B4NFjjMgN%^P@y&0#f#7G8 zGaF&c4jZCZcAR2tC9_3S^K`F+&)w691PibZ8#GSNc7R<3dlcvyz8AMF?ck4hEuL(C z+g=zi4jzkUL$sM>$9xkB4&OQF^q3)L9(TAoxst=6pQ)ec3uWDjzHW|*Y)<^w-Zr5_9Ea8B`yOV#yJ2G5c?_#TUiH$$KbTa;F}P3 z!6OS&uIOM!mZuHmb?`!2;uV#d60&?ptFTHG^f zDCg2z4y@dO~3u*jgri&p;mJ z%`nA{fc~0^Ijjcbw4uagfd0yAMF3q%EB0+pZU1T?ZYQml{Wc zx-o6X;6pZeFqX-Q4%`FE+XO4`SEo4`@qk82R~y`66JNyaVoIXqljX6y#!a79_oP8>y&xIwHhibe&T;Fv1d5|C+V5Sl!2Jm=WCI`6$) z8hK35SBSnb@|-btU?Stk*t8z2+5>8K=equWH8+sj*1xVlEhn>*YMdzBmXpi%f+(TA zsb@B1G56*yP8Na1W9p{9Mi{vS(*P5lv4MxTr#AG!-t^u*V7gBJL}6l5&u$v%|H?q= zdt-{raKWZ$VjU3uh7tk4{p;6vFl~ZQypjerm|ct?Mmfg3v}+p&CdAF@frqw(L|J|= zuk`kL8*^i43;}T=SUDUpY6sr6yc`@n_#>iGH*k1ocoA59c4KPju^q`ySv#>GBWu2` z5q}ew7U#FufQO=N&LN>4SYv`!DH;iAR=@JKIM#G^G|eBaPRfblxW%Nxd2Y@wZibw` zkL(cfhhlgE&SRq@8FOl?GmWFz3kmRIl+J8X2O|e2od?|SA(RRt0l*XFZw5zL08rDl zC4DIc@`|GvKjq8&ZQe@fI=86}1&Li|A$0+dPmH-zjLC>B%xN>r=lKhb?d zN?n=434=Q=SB>n(UKlexlf835S)0lA_HX~nPV5s+p9yRZ))}r?$ZgIkpUD*t=2^*5 zW*r&vbWk23G67rSe`A81gZL|3dC{N;BZMCfz)2#Ua&2b+3%lh_sf?Nw&e#M0aVYzr zb{fC09+@>kkM(LOFabvz2|GH@DLF%&FJ5xlOsQCUvj|6Y+gHHW8$PmsWayE>Yz6j;8r;B#inU(8t1^~ z*RhXvL^Wdv8|e+b5-fS}0<&gm6&THAd6p187L&Y)gD3^>3p{}S6Tl)coA@Q((_W4& znwN#+_Od3uq6sI8dmh=ZIi-?s>hJ{N-L>L=ZKB>$9!jD3wc-CHyf= zZo0d>|Dm0VD5b-q5)r^=EX^8N0kPGO%y)29Z)*K|l~#f?z;ky%XuIEC#3w<$<7 z!;(0Nk{Re>4gK&Dyqm=F6USyu7d(}88RvJ9U?)xwW%&8**8UkE81drrqUG@GJNT2g z6I>dm0G1Tn7jJ?X1^6@mJeZ6{)7o^|;EcevKBE*Tg;;ks78Uh3u_m!1JaxIU?TcBd zBV(EX)QB&@q6Fsx3!&8sLmgap^E9E=YXz=5s2zCKas>#KR{?zhF%H~aQ&}nRd~Bfi z?raSHnu{bimcFU!8eg|zu`_Ek#VM2v39yKuhJj8iCqP3qMt6OE_^Sh8U1814l=SWQ z^k%yi_937*s#rO4a9rXW@L}zh(zt6mSTVRhPc0nh!8ujU#28}pB)8tfVTqWS$x zQ%T+~OrDoAoWg8zU}F~8RC2khAJ<1-nUKG@&0HQc>LyMIY<;+Y7@Zhh3K`ubFX<;r z#S;a)hHFa}G)J#B;Jbq3(u5^3A4tt+H}{eA9jr>SpPxuGEKcS}H$$GmqJ0iv0J5hz zJ_E!mn1x>k_vBVN*h6DSM@OI1M)w)nEjhf8Ww(s zNGXm8kuHXYlEWe*hkzzkB)TU-1-LarP5?0RW#5vQCo`LRloSA_01yq+omjgFA0io7P!Wh-Vw^5Ip!-;0%n1Yc^$k2W zSn}=6BLfCe4i?Xg-(lZqn1Tro{7ph9I04AwqF3V5p+(+f;K~pVyf~~pQM0&4+G)%j zm{1=CTn#54fgrDIW$mZBq-F~)D`Qr|e2fTtmgU(xiw)JK0mJ~m588ggtKyza<1~;t z2^{ew@Y>*i!Z{TI5%5+!pV~TL&SLurO#o6RoE8rO{3<5cVTg_aT;jK&R}%XL!_J#P zH*ugM@Wsj?a1^tP{YnPb;gmfGz3hWCJr7%Z9?$KW%9bm6S16tU z2oEBk2=b-w2!&S)>?Ry&Vli(N_gmR@eFA0(8NBuka$?(`+QHzBZct!EOh9tTTfknD zX(vneYhS++2mkW-VpHF^KHn4f}aV%Z+wAaS_pB@ChLFg!$E^`hD(nd^~!0rIl z!1!Wa9jnO&mS(Ga6*r2++dpr%;F$ew#5X&-~=^v#G2k3L{U)Ja3SF zxLu5@NDyThYK~xMIhJOpa{|HU!CnwWXzI=(uzW*G_rpbWFH3SbpEA2SBZ6N~tvFc=#(%mJSwD2^=Wn<3~rk zH>CjcSxD!24efBg{7RmJC9uzCVV{5J9{yJ*IM~|1@r9>==^)dIUuNpeK3Y(=c6X;# zxK5NO;bLaR<`e0eb|vqEDbFVOOu0R4v}bJaxlk$xs+iA%2Oks$G8Xbs8WW4lsDGi4 z3RWWCT>brw2bMBIQi_qt;j*bN2uK;Mxi^jq8cxQWgUGnQ#>UQg`wcHY%O*57a=;sY z+8KHTi5M#J}19(F8 zr#6rgp;FA}XviGU5_wvBY?T&y3Tt=533ma!j6i zc>;Kd5)~Ujoj#Mc-Yyeic6C~4mr`4l?o9y8Z94fPHjr^bP(3gAV87Iz)@nF_l``1Z zHGZJGHwGx_#j#A?=?{y-WU=tr(D+}D>J%x>Bpuc*D%ezXZ2hZHxBMq& zn%pJg7b5T%{YJX(6pl{xkhg`?UP1w&f`}HG>O^|XYD{#b%N-(;Qs7M?Aqu!I$jI`x zu8|P{*^_F4#B_JI1gC>wguoRFvXzLJ06Gw^fK#6W6&XaeBfdDwsUz*F(O72OSM#&6 zongcbYS~W@&2{%1nL#}>F_kS(rEM-Jt0?nI8Soc~zhawnbT zLkE7&n}>_?8;*KYx^Q>`$Ws4Js_Hg?W_8!RY>lb9BbSVnCv+oHcT5ARPlOEr>IDDF zHl=?o&h&4y=rD!YOn}0h3F@$iD#7xzqdb5hPXv1nhq+$YfIwR7~dE z)1HtNBvotAj4to%x2#c67@_Wff@as2dD)Jqw0PD$UjV*~SQZ~=p9fScO9B`zvMk{w z<74eI9InQBkB>;GkwmD5Dz^X;4P*;q3Q>0v?7?E6FS51$dc3DmE62Q|Au6MsQs6}R zIFy~Gv=kA$35)=eQ!4IpGy`%8FhXHD7gZ6}AX~#g==DLaE9btdNGt8eti(G>8MO(> zpfWI`MFc{)HjIE%vyk&rJCywKG5ktiE`XG1xE2mF6pMgfmeAYtC*8gfSxV@jJBOngrO zz6ysD**mF@Ka^Q435qVwyz7-Tvp5C26br00InuzfDavY>#kHv!#27@DZkPxHVLZZ$ z5>k{8sQ{u8mCU&6Y#4CXZ8JJmL&T?8ylbeY)ot36kZn+6*_NUnXlqzE;)e~}oUzR# zfL4ILAR!O;7ceUE3tT6&RuQ9tum$l+BrucU22JW2Y5oqwiiOj}4Z zC^_Z+SDqX!O^lX`Ab9B2nVE(;a(pb~+BujvV!KiRX`qT9-+&S820^C?nvt_=mk5EW zH)6=p{C}R{k0HR1AAAH*%K#(szU01Al$k=N`jve5*0hO&S4nQTycEyyQ6!^qMuI&L z7y;)T5k<&YVsXGD#5bMb@)nHAXs8JJ{z_i=_ZL5kdq@tFH&?qG#lqZF~|l5MGYKvR4OQCs6N=w5AI^S zpBl&?m>7As0Jsfi8NWusPVYul*HBg9$Wh!J0&z9dZ4dp4nCaFVmCJV@ zgPsJx3{?SBD7=(xWUnL4K4WAPX>5auw@b)1B;gG%mv!Gk>}SG7#}Y>tHVlRZSn}8e zHv9#$b4X;L*=WBg6M1}?VFv~qBT;=?>P<6 zQ06fLz?ejSqFzw9Axh6`XXH^`!=J&hOO`nL*GRVrnVV91W5TdxLXCK6dxIELi~f5y<~|Gdy|nn{1dQaiReU`+aQuDg5e*>0Zg<&ng*6*!5Ao;0H%;Y$4E&@+R` zp}`oCY{!{VP%lwZjKUvvb9T2@oB-7(mew7yJQuT!+|Zr*-S_0}w|UJG3%)Sp3B^PD z$V7R(WaxE%{6x8^gC+%y8<0I>1{egZ@e|kzimeqBJRaA?9#}*se#v@RG^_tB6a6ds zxTZh#8|QY@yAA_kka30u!G{MA5CNUx!s-NTj$zJ?nTml@a>o@+2Z0YPkIF&{;4cZw z7Udh*W$**x)5bIUw4p?)e9tDq1PP=y_zoXsifDzV5nZ?_^hN}Y3j*8(2U~>efeUFw zFc2h9klB(OIWRi1YbQR#G-eu>mRs#)lrh;KWwre>KeqQ7DcdbM6`Ws)bCbp61<%Wa zU5q(yYN>#)0}^Fmdzp4Z6Wi^v1N#e;I=KDNuSu887UP94~&^%L9ZD{4r|(R1E91DVqu44 zq-<#eTu_!v@Yzmb+ZF|)6@1EJ8`(_CEO$F)-kPXe6SEdHF$iE;uE@)Q76ju?8#g!^ z1Ahho5Aq?u{p*v#Z;%gP{Q8}LV8a-4GGKS2 za88zIV^v*{GAQVU@pnE1xy~`BfiKFLwf)<^n8WHG*H9uQsEL_=B&QL}AaBTJz|bga zMXxRzlla5}#8A>3$6VL+UQwB*mkW`7iBj~az0Dn zpx9X4LFML0Ob6Ik!2Z8Iru~G$Zaxfvq)*!MUr!I?@Ik4TWyE5t1wkF?H~3EO@l0}) z%CAIa16AzNdLj`y9JjK{lnh`2dPfiq4ZzEW#+N3cF9G7MuFo=nJI*Z9rrm`TM)z6; zP8l{T%s?=^0igp*9dgVxEKFAps*5!Mhzg_Qnu#IAA&OZmN{$S?w|fJVS4-A$n0!EB z4)DdMl9VMt> zi^ckfAMY(qnd7?(tUH_A(!<;$900<+#9TI&Os!=3SIWSWoC*V!h$JIX#cP%s7WE&L zoYMvuJNz5^i{G8D)SLzTj@P{_&44NNSy3jP-efuSr9G@^hUhvNhf zOl70ceRqH9mEw`7bQEt=F(d8ZU){66JKGkV!5`DK{Ke5x zM*u+D5a7am`UF^FL6C<9BY`arE+1qQk#poFi4(FoR!tn<5&&7^4+#WlFllHtX>%dWToXklnqUTM$lemXm_)qxq+ss+R`Y9fg&h#FID3qcU*JMaPI znJLpWu)l44RnTTl=QaTOJXmB$uW+)p(d4q^JlGZ+UKh1qGBV?F|9F6vm6b*}cvid?=%;b~0|2Cr3b(A_hM)?bx_3RIv)i8IqG|%***hUVc&>`R;_Wk!|}EMX#D8 zPa9@MQkDl&kJ$1)*izuBj45GN6lA9%Q7&GHflvpDE9Emx=_dS@$N0=L>ut}{JnuAP zRbcW+qr;y9Smgn`f|pF|x&faVUKWBVN<~xRT#})p0f{QHL&$DUmui~Rq?82NzmF&N zH*-QC{|eQG+@nL=`T3BCxkh1{?>+y+y3L9|h1?H) zR6?P0&~Fp{R*Cb%`PXOb@7lM2KJLuVnHS@-+?7C?+=4s(=BXzhdsMH?syB8<_>guq zKlkSJ^n8oUxm{5|dM+~go)o!J<>1eF5!6-s^V9D8z!wthZ;`y&YWQMQ>WJ#EPYn;R zl{@sv(op3c_tgW9mtOY9Ue%5r;i}Va^&h-zRGBT|rvLs_z3#2=$rS!uK6&}vilx)M zwaPtr-f?96tmnI(T)o9St?b`-G~U@*)4l%r0~e*w?W}@JSo70~sKe$See%_*(=Vl$ zu4i6U_!OvzE_ZHDiVND*$hRL^mEPdi-5US%c>N!z87kl|xbdhQ=AzD}b6#srzAPN& zB$Td&TP40V>duFJ4)t#|c_^BV2$KCTo^)LtHM;fLy3`h(o1GKi^Dd%fx0Ux>{fNgE zu3j^}EWz4*{{p-B7FoICSE>u2Y*rUG&O@OuD7nGH0dYQ8M#dMF8m!Kjr|u`3iKVib zF4f^8@de(3Ujn=0i76XiF=WZ$!J|~NJxwB)A8+(##);ON36IP;qru;{933o5u(#QV zFp|h0L(;P`@L(1je)#Fq@YCPVZcQTTs_)CoY`YT6j2t(5?;I)YAJ-2|nDEvi)MaVv zN=gS5PTS&5Y0bjYPRUXlC?4FB(HDnf%X$3`&oIpVE4s}O58UG=CCQk87#r)mdw@m3 z*P%K}&}qF|84jQ4NP}M;W4@YsK;=F35k;ih|K7*N~^i? zUq0C9i8vg)%Q0vP$R*_V`7BTiL6jR1E5UowEZPtsA%z}5OU4(No`2)d4|}8W8doAez#saL1kgZH%+H%bSr|q7KH-a zGwa5AG3nuC0w9W-FcDQffi3`3q;{vbH;WZ&nwnLET~rZPnbTu^>lFL6mj1mgVD0RE zeOa*8z)}M=)KqUK9vziV@f|5=Hjn}$KpKVfNOP(A6VQ7zCp0)XgGQ+^S~2?W+zauI zk;5Y>F-3X`D55pz#0ZxKEP*o@v7Q+7WotS={50EkkL{fCyb6?SY%>CN4mtm=qBITo zA^;^oCT~}4aQqPBa~`$|$UUIG;BX^POjUJNht6Kp9$Rl1s6%ojW$)9PGHGPn71?X( zt~0!@e_}OW!^E05`gkt48ZbUaRcs#CP}!jZ@WDq1`8E`n$}K7L&r2vbo@S3m*R|7!q4Vb#^2)_b)z&?RzN(8#Va>(FRq_ z3k>Dwu3O_z|$Nyt%@UwbD;2 z>{36uIyrQ|oLZeb`4j)p|1;&ZMv8B{$Now`bfkFnhq~ISCa#P6Yz`U$Y@vnki1-%_ zNOAB>1h_qb?!wo|+CRF3-#YZ#>&W&bqYJ{JBjeh;#e^*DKQ~@GGGWc?=Gm&}hgw>R zx9Wvl=U?ia&$mb9xqo)9LXulPF?c_67lMO24lMLmU$``^zw5fM*Sg*ZlG6^kf-v~d zt;lM4kp-qMjYQ7Q2@Af8#p3$w{qX4Ni`viX^0mDD=@7?>bMG?ueK*qPdRMd3t95y) ziea2vBAoejR^z+CfZ)!$ciht12@{PKdKSkh9{At*#*;w-I8rq*(Rc>7)H8b?0jXYB z!WpD5x(^P5A0x+dlsIw}*ixhiiAsmueLF?Nq^V8nhX^&m0*sLpNYsXadbFt7>Ifm) z+!R9L0qh1<$r7+HNXXb>_eiK|M%>)+OG3CjaJ!Pbn-@_xd;(4{-Uvn*aHGTfnf_iN z%HUcA31ciFu%cWZf(ih!5w9uBGkgU82=cz*HfsPbGfKv*Xt}irkobHF+31vU9zq6{VTVq6{kV&1S~ z5@&UzU{lWOViqTZEqa**41+EBvN6Z+e0&(=4I#8Z!eM9-+82cQo^vm9{;NkVtJRXG zM!i}|VwE}0n>$yp&z^LxL$Y&HNujpil%n-W$e4cnP^4{6j6&eTaOZvZLfx@up>7df z+7j~Z5IA?|YTQB;IvODQ%%L8iS(-$wC@_l5I4t;(@gv3@1hrR zF9`O$%i5yywPJkM>D#y}ds{5qduy^gz5a8FGQPUmkbQ z*7&6nw%}RsJK|NTv4dwG9eQ=uwVB$xI0$M(|3Ml4_Fy_5i7(-tD}CqPy7@QOTRvnU z;@GSq-{&uJ=l-$Gd^di%?AHBu32GOFjPrB!AonR~H2F*tjDftfhcuFZkXC zq|`lsDPtGh!cy;~XSG1%4gmc;7jNa=cWbo{z=iI;^9kpD*SfZ)^V*14sfI3#o}cGh z-UF1kYU-T3W}EWI|23Jti`})Uar+(9cWr{qRwaGi2i&|@I5oZg^L?z9-?Qfjm%zmA zc<9Sii+ush5GPQ}^Dma`;5^qOzQaYAq=mL*s5K4|41eLgv`V_>%511DE`_6^HlX<4 zj>jIo_n{qq_ubX|eHgEXzR{i~H->>p*4qK>bZ;U6dcRYG8$0E~jnN)o7zS-5eN?ajZe_w$Y&M!%S^V_B8#|kU1mpeZb-TSSt z4SbFcP^b&4?``W|X!(qsIFgDL0J2GB4YSrJFrA zc=bA^>oaS1@7;Y{&uzJ$+~;miS58kG|6(Ms?^3Qzgcc$~TRfrOX1o{O^K2!qL_0gN z$z8v#T0aXFizNI#lvW~q5SDbl^pYVhNdOaQZ&l{rb>*wP5F}HW(=rbk5{r02u65q6 z*50+B*jm5q_BGJa@j~%EW5t&aPB~{UKKjr=yfbaSUz6Jf?icoL2zrHV6nM*cC6jEmf~E(3V{8B9}j`8$OrFxrYMMO+9RGDY7M!q=b@PC zoOU7ai=p!06^x=(_`gAvQ$no>tfR%h@e^zBlH@pKalY}*Coh3!&=bQ$FtS`LGiT>^ z{87JuArV>Xg}i8V30RrPwF1Sf%L@<^4YwF>%MxGt^fi%I0h0{1%P&9p$J_--*YJ~t zg7I!$f2-o2BefogzDP(0fY@C*Ir#AQ*T!G!`-8h!7`jM&I2>6KQ@*orfBMGssh^zU zE{#f8M5|}@;?MMum@zc}uK(ckP%dhdxYjkV9X{s%i=Vh6>eeIqSEsX`p)N&_)ZOZg zd6Ap5{fpiOqs58FmiaAS3u~Qoy{QPl3gP@q-~B`1jfA1+w8TwxC!YNNOWTK@NOZ56 z{z>6GBTsyD_|bd6{AKHmb=RHuN=sV&d7Yi(wV7j&?z;E2qoYHQeY1b-|K+^r z+k9KRd)37cNP;zSOB`w%>C4k&({*b>N+kH9M|z@==YjEC8jZ$Ru*+C{nR8d4z%DdQ zJrtGsa2u<>5jysYF#w>(ot0O%;~+S;P%kb44LUNtg!R1ZOmnl5bH$Ha6y2bLBijiLbvWvXRY7O~)?(Pu(?c{OnigRF zcseF0$xov*gyM5%K?xgU-_3L*qg0#e+W`g!SIGExkqw#5@Jr8y#As3ST@?Li7lCu6t`g$gnJ& z1koh5j?YGCWVEA!(v>OZ59&kD=7*jdBLLaf`@0qE3>1Mq;N`^N^wiN(VW@^1msFtg zXJCC)9thw*McT#04f5zlKKEiS_n4UaiVBq{U ziK&Kpt{U;H&J}aQS+^ye4qxEH=jyAjNmeC8@WZw0EGED^cYe;QSKqHz-!&!qs#&XI z{=IQ=S=1FdcOm4>`%%=@{j;kk!t5Qd<#V0cEq%>v57q-Tx`w2yC6v1R9uOQC{xFP) z(xGRsUv>I#EA_wU%EzOJ_6habcG!u`&FT{m^|gNr4h#^8I*d)`vt9Z-&Z*hj$peo< ztC-D4$cV6ycoO+a=@7^zc(dE`-hAtxlI;?YTAXw-BBWb^RFICbk>Mr3b z%Pi}HQ*RTrE4@sAGV!^nurZXmxihj1xs58f)D4~GT3$D!ZHbrsX>E%#Em*0ayMh>n zu`FHYB(N!bSH67J+`Gm2)#~IM-gK>A^(yQ8V!56bq07{lUe+?7yLbH^{RBkJ)BJwp z$!|cSjvf&ciJG{u)W$66Gag8XkoIJjf}9KRQRHM$pCe~*d(@8sv3yhnnHdWC)~vbz z2cyJk0&%xHJ@Bnz2MZa3Khz3@L8u@Dk`ZXrYctwUHSI(R1$4$_34;8vA;_bssT=}g z58~)(F5wydcf#mpzy5fCZiBl0p}y@n-nxa+7Y2qNgTf=T^fK6Sq`!V1$Cr>@r}V7_ z)g9?2Vc-FDK42)mE1b~9SgMHXJ=AbEtNoj$>jY?%oM}J=l+6l=%6WuFB=7(T4?+e& zjyM77JhSFOTNcTjSf`xMWl+{fO$w;e%0k|nfE}Rbq-P0UrdceNQ>!zYR>*XtEX7WD z$}B`>LLy3)@Xi8kfS#EpTI&&J6d&&{ZlxL(Rslw)SRP7y4SprwmU@hMoMVHdV*$Eh zuuMor!Lm}O7fF;3MV)5IRH9{$bKXEsiEl`$n|S0S#k-Zv<|K%WyZ1xND4n}|`y$rV z+`+&!11yJVP{eT|Iy>qGBvDlzz~r2gg-C^0_S!AJ6NDJ1c*sXm&kZt1gj*3YT~(9m zM0#}JnBgFnrD}7r127&q3>H-GwVHXPisI-zYF>vP9~$}Ao*fVG?Cb4Au@|lwByXx5 zr!*yMN1eXSY48@D*%{I{a7|4cAAV{;L3aa0r~r&q6|6W~jS(7~M0c^%zusr;v$KJ;^eekAcNWKgbB-)^%c1`qQ#gSPcEl=cqLD!O2$M{Xa2aRk^ zPQPqqbzbU#wlUU|W6wGUx>iIah@wD|9O7A6rNki@V`C+I=!Kb)qh4n7PGAGg0@uZC zA~f@8yaH(sn&v=~8v>?ISQ1xe#dvQZW}qR5FSSEr2e>RTe(~qno{&t%l1IvmQqZ7Y zbl_}eJ)8TGybBgMXb!wFXMzjLR0XYN(kg1tL@Wz24Ai$*p+84+6QpBFa|+acqHm$x zYdLZ|m|Y+bDYPTO79piq=zhv7K7P+@6MLQ=rL_evKwO4L0B_!^v+)CCxx4$Qj|V5r zRCPcHNE8w*6UcsLQlu|kdPB!nCOMzw+2TQscZB}C2hjV$sPNeLU<)~Q0}8}D|70Mg zBmw1tAeQaMLPP?TQEQ4#S<2|4L>ApiFi#S+idkwcwzvW{E6}OXc8@?`_!e_~`3)Nd zX-EEA?*?d!Md^AuM;iDZQw|u#cB|((RO}UrcMZB_AUZ{8BubHZC;hl&-VLPG%)JeY zfQ*CHh9z*Bwi4Vym{J?uXp_kLp3(t{BUU(IjGmCkj2|L^Q)8sf9>|^P)?mfW_;kC4@*OG_(Zq zF>7fJHR^U`NkqO(?D}k`4z$5_qf4SJiu4f2pxEi07v@8uc0r2D5cETWDm2gP7lir+ zd>~XIBd$9a4g21Em1HMG2NC`@e9nn>gicK6jp>T85chm(&**o0Hh=!ke|tOsVGDp# zt|NZvdoM?CNXO%es#(2i3AbltzcVj+;iwds-S@QH|7|)7=~Ud;ia1n1r>3;XmA>_p zQ_A&9*XPn**NT1rrYp>c4;`LZb^SGN9YJ}d{W^8kwd$%BN;t%IscZVy^*HZU#t-L_ z(_8b|L~IF2N1@kVI*DE&KnkNv+oem)^vzP&ja_r^o1u`NRFGEjsR|4u|| z|^x?4XRRXY$3HK&+t zG@#1BM3cJ}6uKjG-Q-aKkR_GCBFKV}iy|`zMJm+7Vv+g{)G^Zj3&W2jD-APjQ4RqN-nic-VN;8-8f~{@eSp`ckSI6dX|V8~C@~8#8*)XDOLbcRn`Qd*?QsI!Jpo zlc}U@fP@Wx*39f`=;1qFr2v{K?Nq_bZA{|ShhXc#7kW}?)Uv4;)DhAj^UPEy)I`B0 zw8x(t9(!h3pUmerWKgrupfrNB95hqhH(0=)Fk|TUd9!=-fHtkEH;{coE(L)lbkLw` zrkvpsVq$P0yaf?BbDd~*FgTXZaZ|EV-WhBm>cIn@$Dnux}*6!y`{VxckXR zhB7xP;5eWL1k_#RTPQV!ybV%7zzbsH-WNtdVNa!!17GNeGy>7Mpbbgv5Hd)#Qjs^o z^Oo7OF4c`n0!fAAgLy$V8Cfi(=JH3&Fwurihcs2GuSBCp@Z-Hqr#x_H2CZjuYZd)4 zQi=c`z`TLlII4uPY;Yy$2FK@mv({+?Lh8sBf|7;LNUav}8&q~@d8Lf(A-IUX03BGb zRO+`F|47k($TT+^g{|fOzbrtlRIEWfn$AvLXM473g)N%;qS;HDnvm}FMmQ8esJ)%p z!hUTAa4-BG!vBTQ17&43N-p3bBI^n$J7B{D`-U^INYkJZz62@!;U}KpTEpy|TjzbK z`966Vv7jFgyW-DIM6W&X|C7YMQ;42*O!xfU8?!AJJnu>YRk%(YbY@tRQ}hcq*X9Zf z61(6FZ6WU$p8j`lUDbJwa%1NTDZ2j7K8wf}KCVhwpxg$urrm|}-aHGnN|iIU7Lc~N zT9k94n_Dp|y$&*|sf(N;J2 z?cOz?3tfEI_G_Wqh4XUeDq$h!)xsx6O4~iYB4;K^zB|laaC+7zI#EH}_DeGKH@*?* zMGrkO1l%8RIi#?|9QU2Wa~{%sni0QH?3#7uRtG$Z_|kap59*04d^6<6uSj?Z99tv8 z666A*rR{T}S4hHe!CJD3;$ z13(4v>YPZM7hmFc$#EqlPW*6kMJ%pdw}xE^@mI>zKRfmO*yvU9YwGA=fSlK5th4(z zZXv|ZAyP{G`Cn)g2M%?uMT)6D{i9?4Ii{bD%w2+totE%I9SCCQ=Tayy^IN&_r)7v# zyqvsRSadO&0o9(kn7HI6THkMT}ufg1=XrYE(`ee0d2?A1S;;AcdCYj*ZV zu3px{^Wl?MNUI)FGAkW;DE`%)+!?li>g0bitty>|zP-OItnlZY$*b2-qkjPq!V6yC zx`f&eWO6Z33eI4}!OgE3xs%?mXI;`_t6G3(CM(Q+B0qQY*AP;A3-8ADovc$Pux8V|tvhgLB{Y6cA>e5*LF zBj8!0)ZR0|NUzye#ooXF$o}WXKtY98OLkKZwwmWt|b0wn_+-~Y?nq~Dk3@tTI0WN?#@d|ioY1_(MaPBQS4NCWxjTEd-Phl{DOWC)j~p+X z9E8Ooy~?LI-9Pa3sAltnPoaZj3L2*k=n|qB@CG&8n?=u0G|jcDIFn)p;(Tu1|zmK{lSe1e(S`^@f)DCIh0BU`t9|BE{^96z|V8>RSg-#{<|1dA4Kkl3VC zAKX}CCb0lVK)Aor2@uiE+(u>e>Fs--Mzc%@N_~1&@7vN}oHV>yyabLajk*~1(wkKh zZ=empTaZD-VvpfgJ@2^II0``)he5x)t~--JEOWM?AX!Zx;y~CM^Mw)whuUQz7KBRzFAnV?@kS&KjTcaF4Y*|p z`@&2IScVEMRCdGRf>QzvXoJ$YJDG~1^rH{TQ1*Gdq!mVfup7*t;m3BcwQ9MJMvp1A zduP7n_1-t;aA{C)K-mFmfigQdDKWsak!GPAa`-5*Eo;+=1F#V(fTcZzvZ;3b5n^l1 zI@JU#Yg0fiin^thiip&AerX5Q`amaOoVCp`%sk(sh`~KIbAns@<<}2S#d^9ikdYSa#$dZi#lpMO|w2@qK;J8Ai|4mJGn9R5hqEyz->3FIv)w_m1Jpu_ z7)d+QtLxZr;!1VwaAEZ2arLGQT5@7N0qvkAL*38$+{P5zBVvE2Q{AIKC@oGe)-hN_ z%*lN*t8pe6f#^I0@C3s^Ck>H_8zO3dYv^~wVvxFrg62v@kAf~LW2>EkT~vXf;p#)~(ToPRLVw^!gNJxriHs;jd19VG53cXvH<}S_zproj zsbTa(?Ek_}qJi?sz6XZV8%A>Xr3e(Q!+(Lpxi*^#=QeIS=2>J(+MkOZJ!Yb1Cp z<`0yVn%4(C0t@XL30wy3Ps{Ha-#t4QqW7aZ5tH;dkvhm2$4xy4t|zWEJ4mZ(7-|@Zh&v#z$g+U z)%Ctka0ir(X-OfNv#H-7aSGLX*$jKoV}0_mVH;JZbdx9^9ME-Jjav-}Dmb9%!hX)+ zeUy&g-h2A{{$v}3QBdWEhE>pJ=-a3aOwRPn=qybw>iZwq?)_jad-o0yuMnoDAKZ?5 zGTbCVswKRM1gI5a944C)2onLpwxq&?^;gG)L$&X&tbJ z=2>z$hDo>HHjsPJnOS5;|1-TYq+O_S6Lz}EpU0Ad90k@fUp`=LU&*t#gL*B1Cq624 z;eSCI6QbS(-Tzh_-Q2;XCjy@$&_{wHMdtw05yxDxpL*q^s7nyhP!oN?c{go%$?`)o z5p@mTLV(P)9w!;P{fIEv?u9>*CtKC#o#2DHN0Eqy!ZsWCgXmE|6S zo;Wle;q1z>x&VA175iAlDBy%n1G@6D1WI$@vi5r6WP{5JF&o`KvZ-RayF4>Japd@s zA5D*y=f;jq4fXFDp#6ZFRo+A{0vhTKP8@|m97xNQI-#bid%vga7Su~{hzzlI-4^)5 zn+yft)WO!*cYJk3;m2U58e-B$#z%V>Uys5ifmYH?3E&T)^H=Jq!`Upn798g zMhL!l!F!?VDU@#P{lVDiegGyjqfe1CwDqPzok>V048ocA;I}eksAQ+AXbI_C3(h(2 z9LI!en!qeR2&3b`?P4sWPu!8gabCJ z03A9D;86s^hJkbUQPtt%bpQ4+DL5&ibj}YwH-Sd!Sfpw<`l=QCzEB?AIOZ)cvru;8 zt6J8xbG%Z58fRyAU~QV6))=%#b)&x%-S^P!9BnIXl;UPxu^08;b*I;{GsjDrqda>& z#m6)DW_9ESBfk>5C!n-@5+tBpxa$f_8F{F7prM0kHR=X>;!$_Tt>x@Z8T)Mo@-Ec< zC!BPAI4cSuD#Ro(2?4}PN`)my&pq6~^Wh;J4%!<|ajF1S5EMM-HtvLDW#ZTQF>|ua z01#TE;k8B^14lML7et1CY5a4|6d1fzsdla;>578h1?L`5ZnaU%XqG+S5kj3R@xbAV69}nB3 z?IrCg#d{&GzL?4GO3NDv+QeV+A7+$BBPJ+D!pNiB_T$BE9jXZ``0C(f`1mVup2;Jo zYxwO>RukxWf}2OjFb^07IFa8uTm|m}Ev4$U!lPgPe0w|+U1qX{i}9;F|LD*4FMmGW z_gJ*@<0<*o_BHOT(^|{dSaeJ1%YX1SG{#Ebxa!u<&h@wS;8dC_Ph@Ttjkg@{!o?Qe zs)7WzphUw__w2OX9$zzCnSTGYcXPs#S5@9NlFMXbW&8X~7u>}CtDZj!Cf9&llZ962 zwk?MSdc$#5*fTs{oejNqV66OhN&A^@zUzd3At)6iS9cfk7Tki1_Ep;7PRVj2dPUTFuNGbk*Mb9u zkzXn#JCo^EncaW!Li)ydB;r%Mv4ybDKJY?T;(9OMDNWDU$`Lbi$2DCKrE-51Pv`jf z^^tg_A)j|57ipq=Bw5h&*SEt9u)IvKtva@Q@{W1n#x0&$_2+>{p^S(~QD`g|@r7eo zc4|u$)V8pBzo$FVc@A#!x z?@}ACXusg4xDs?_3hm17332S<@u6qN5RkxUMoPH&c6sl`ZC#zwkB{pI$83oB?%N+U+~Bo0jnVIp&6LVJ?;b$y3ao-@@et{z1U|59 zxDTZxu-eEZg1oTj1$lfT1HCkO5}uFl5#{j%AU~t5bR5TU&_@}Sb4b_+=~2!rP9fDu z2Xj!?#}7U}Jo4N~{@{@q^;;pbK_)k7vz)yRJ^4_Nh(a|g6AcPSG5A3@Cz2?E6|tO%QnZ-&FHjlusSjB4>d! z)}yVq!&Yx69>aq^{RV^x(n|fa<6PRuXIMghkg{F_uRU`0n^kH z*GKY)kIlKU%$iOm7D>jV@yjCDL_*%bIMsLbmdjD+@8u618hh!rT+bc-cixYEeCYLK z>+k6K#;%uUXSmQZ%Xib#HGcNiKKEZdu;>hPr1XrO3x@Ij#*oZjU`q zs!JKQ2ep*Q!4DD zJ-|0mKrV3;<0rt^L9Ym^XhoYGK$zNJ&+LA|Dx64pK4d58Vgns;!*udk0maENkmG$L$(RlvTb-lrtkrk}P7lQWPDS3aYr!FxPf$N=@M!5_kukoF98=mSh4&}j9f z!Oq^%7^DqIZ+qX#fQ4 zD?C`uT>s;)6%Gvz*>NrrZi~9nh<}*`=MMEbZky{zOy9TI{6%2vr+#dV{KXyGiDT?N z73J$wNOXT;edZ6>4sFrxdgoQ~E@RHZ!3H@0I*{au}JYZ17J6t|suHv3j` z>Zr40$9g3Z%^!K$^ZjT9oj(O<{ybcs@P)=z&}ILHdrd+f-S<4ZQ~-(k`R|Tur|S`} zn_mLnY`leo+}5h|7hKc=F~7yFS8uzcetXX#J0@VJ$-AlV-M=RU*e@+dF&9hqL__d??8GWzm2m8d!2d% zV{L+qg}@nL71C-7`Tzpd1f#40yU&cwhQjs-GQ|mI{*;HbI8Q}RX!b&g6Yycu3*$u% zwXM(we%thxXR&V@b%ag`k%9R`WH{SETQ3}|PI>nWnsFMH{j+!v7oAhJiLwg_bB7@B)n4kB!{4fD`j2#(b# zy!VF@Qk%+6D3*lVkQ#n)L^)dAz7kTUAS(v6y4Qt zqBEm*mWKY5YS#IoXW-+gP=!Rw#eN%HGNb=tz#cLR?}vB6kpT{XN_MDrfK31zc2M;N z_XXu#WVApX(b4oVKzd-}Ktw`w0(3>hEdar>GTkh@4p=5{o;FcoOls9=bPi>wD4Aaq zf7_lZ9F@@lU4Rl1AV8O)QWPDqp)G|S54aR)B%Cd9YvI}iyc5vM^nrVr{NcdXgWvg}ia^c;+F_N8`}5X`wCa=C5 zHY-IE*zcvkaw1#G9{w_ZTS$ zwm91KGM`+S>U&e@+KVqXAA)ihXeKC{@D}g{)*NCG&Y!>NIqSo1D>#-gejYw`qNVb4 zN4`$D?GI!%x&E4z8~rq58K}He#4BazeRjS+CoJ!>>n$Nj-(Ju!V!bZQ2uo$xucBz+ zBD%qcFQS=mh(jqHDoA0*rQ_wAHGki6bvbrnlU+>fb2gwdq4srRjI8PFv`$1!o#(fWtl)P8@P()oWF0 z88{u`aQm7>q6-D6#i>&tK*4w+61_kLPUzfmEWT!XX@dGGb6%esRj&=B%d~$k$dk5G z|KLwdFrMRRg7+M(0Q?34OL@B>iIEmq*}5flD(TJZb6akU|9({aZ)4GUc}|Rk-YTpI zWqpYwb+)^1i+pAL&^QG9t@CG58lylg%RT33uJ@%gmAD(Oyc-d(>h&&M6v5eAm zN4$j~p=Y^O5d$oEljn>m1=PK7>KUerA(eScW#%xu(A|73e6PisN zJ}F2E0iHpt^vKjU1*hwEP42?;1xTJQ_Ee z+ZK25caBt?1+-H)<3HD=tK02bol+LpM|lCF5q@-GRrcSe%Wvc_zI*DAm-x~-EFMt zYx_fYRo|-~Jvt3Gm2&~4T7>x!nm}J}Fdf*K6`5d;ipxvS7xWZ3ogh#9_#U1E3r?zU;El0-?jOU>C=-qr^Ea;6{wUh<)mf6 zA5f-fvUw}CP;HzAh+dDk$Awm+*+#FBVNpy+_u6Xc_#VBYlP#ElznK?@1b}r}1+`dWA1bHifTo%eoqffhfeao9~iMPe=3sszT$xkN>v(ukzUth4M<)57FcXi3PrhM7Gxhou=`oVY8 zV0~8JvbZY~1!GDInaQ*6`ggs)rE75Fh3D%~t_PRD$erS&=3O_-kN%gt{`gP+@Z^yR zX$e2|H4rjPpIRxqq3|B@DV0UTJWaPjADV$Z;JytHM_ z<$bz#>fS%>%G?rG*G98_N@jyR_dmJgM{AAw%Ki7}Zr^h2s%xX`*R7Q=m-4S4ie8m$ zL6YqP9E2#!@gib^3nyCmup3T#ZBZfI0_vq(*H(3~)V0h#do0wJIqy`2Hmh;LkG3i1 z`%_WTh_tctPvzNnd~4pVIyL}qtyEGU9EqqwDv4lyHJ6)L};n#ykm(SiTLLA-`M?)+ip(E z*Lco*M*aP{`g@`8ymXT1*VNAfD}~-TD05_HLXhOaQH-q!DG20yNtl=N+tDR_r0tr> zJQ$`Z!K<3@KHu3Xs5e#P*IOtgWUUvm1tXWGop-CVXX?=v$&xlv_|fZBj~|xr`r`WP zTQ7kv%PpWFmh)OKRz2HV04D)uVj(b1ET`1XT@d7&{eQMk;3bRfjfJ4KXHGjDn+A^ zs)?s>&aVG_cJf^T_}3Ht3H|k=HYHEYYN4&`F@GpSWb>}Gz#>=umetBfhsH{30I(4~P=}41mtml6|$)7y+gJY$xOxH-1GKkHyjz>RR+6bWIvzXgcXPoLo(h} z1|OKozg9Mk(!iIt4L|<%fd{_c`-MS8&7cPXB#n``@7vZ3h|rwX;Hv{HB^@&SY5hn# zVeWl;VDAgV=m%MZWT7v59jV@XGRjKgpQgH#G8(Ty-?xrB50b;7#_jMCFt*Tvz^$2f z@wG7|^$PpO`ZkH%zXF#HGK-W-q5Gki6#BoElf_K_@I>#H?2+R|9uDkrqua+=S=3>h z7wsCH1y3cm@?y0Z#)0}n;2T1aI9EW7MUo2CpAD%ZHQ^=UTCiErJ7VnMo^qui$Dw|R z1Qm)VkW~cXk+EO=;uk@E62=vY(%6az3y4u-C-!HUp(CT-&hG}Ix>is`ph|qsq2}wcK=qP z8v?MnUP6UXaYV=wP%ZsUZS+|q)0xd~wuc}0GMfg}bpsfAj0<#X#haPs!<8pcl)A)6C6*->P zrgiWDbp+)BQHipYM3)4`g>WAH`^e#8r2|BNaCu45h%~v7dqr87h}%Q6WO3xFJj?@h zvP2j^8*3N6d}1gqBn2n0p)OBS^2$`uzScn+%$b9k0zYJe=Vq|68jg%cMz&X0Q{M0{1pAqcsv1hsqC6@ido<=N%<)Kok0Wc7VX9b$J z=n?R?jyepqq&YjD8C+VQl+4MFE$Sr1jB0+py6^C7ME65x9>i*$6O0%p_I7P?HqjMj5LZMQ$q) z8w=W$%}kdw2?ZxPHWEB}G2F2DB(H1(lLM70HuONjEX2z2$F|+4^lZUqMnSMV`n~bk za;N{nl)4%WJ(zkj#eqRi)2G3kb4`QGPCTS%9vc=bhW0=|`wEJ6RYB%wa1Ni5b6?s^ z8U*0HAaQ|HI%rI1==#v(gP2ro%Z6dXsgDEx|PVC7?28%}vAkC22K5DLrQpoZr2I#!S35q<2?&S}c(brVz5cM-S zI9X<$n(NLLO4^uKmN!7w&&0Bz5-RHHj@f2r#WH?6~KQsxR$J>a#>(0nsx&qIZQXOE=jJoTB;ZbzKiSMXGO^w}}Yy%^%mtUMZwHv%MR7Go3jQ zys=P@yiyo@c>-@i+7f|br_i37mIOPP6t^1NxAbk_lEd+Y<%<$)p#0FrLSq_IF+-s+ zv|h0l;r&#RzV=||wp;mV)L9WrKL6bbcS$@h$LmHl*)F3*2bc)d?c9aB`wMwZcfvS57Y?sM z;Eu4D^Ct_hWaC#OB!DAcyy|wG&KkB!|?)H&@x2%A@J(M5mamjjb5Q9X8xVA{<`EJfBD|bXXAHm%--93hwZxhdo^;K z9XHw@;jeB-nGbS?ei?8_IO5FR(cj{yqQE>Dys6sax=Bf5-I&q%BA)2UC? zCZRqF!VVl8JyLh(-THjWU((WjGGAJvhpr3n_;+h=zh@OXYse|Za%Uq;h0Ki!^h>(y z=B|O%nl%edyb2KG^w%D~1MM{&rwV0^Fu$tw6JynTU>BoM(yP2!pX&QO%XSmv7uh;)iOXHVS?^TDt5$%F672|oXY>cRtc!=+5G%v) zKn2u!zBPSp)KRazU3p!%pZsRgtwjF3dlJy`FW6n5?TW_JI5jJ0oW6UvYiD%8w(50> zNSIx0YZA~W@muCW03(wg;Un6ylY@8m%ggAxfSGV8l~-0&&dxxgPE75Q@^XQew~Si- zBUa^a*y)&W#cD;P!&J6(XYa|Xt34-T;sDLRQh@p~nWV5MuT{!t5KBPTP%LTr{s%yU z1Og66HIv_`@Bg#WjL7$X5#8PF;lJG0f4AJTLCT>HNiRZ@4=stzN07LTGA2^Ie!=Z~YvI)SDjd`8pFzZlD}Y$*G) z3UK9vrg^k6I8h+h&!$0ekp&wM7ylb$TuP8_s@_w}VjHgtDJB%Mdk>%f6-^17Y{ettq@(05lAbPzx?YJC5M z(yrh*Lz-$v*KqvM9wjFpW!4liVpU}~W}tmYJ?X)hMz+6cpIwlVsksi4rB0x>F#62i z9UF6LPC_?J&$@9EES=rD&iJdi%-ttnGNu?WJz5L|B0X-7pC^>6zX z;``!x9Mrlf_3>=D$TrxJIN`xVMz0q%mDGgZ(d$@>If!kx*115 zd!=l#Ba`;-U3ryLw=Gw8c2h?Z^#(;dF}nQ=sqU1ms@m{hs$c(0W$z=&k*71;ALDa( zntEw8-7a*mMcY9mf4sQ=K!IigBzcsAP{s{sNh8|E8Tjh<)Y|^-UmZdujX=n*qr`|NGKgKtu`p{6j!MKO)O?RR zF;N?zv5B$F#w;q{obyiihHhxSfZq)yVeEUuvS?)1;uMF5f6z`5Vswg}UDusi+pS3A z&{uXs0aoQir6Z=lJ%b!Gs;%Uxq{L$=5+~VCygi=ukyvcVO3XqP8VOe*Wez8tQjNd~ z5IB$)4D~F*MMB%07pJYlLwnScfli2M!iHX>h?Nm(VvXuQJp$iBj5MUU2zqD(G)MTz zsE1swRns=j{I=OZ;Qm+#QKz0_<8l#-lR5JfBwaj+yB!Ow|1|e&QGmb zvDUcYJpbcU(D@qp;wp1qj$9Wm{ZL=uovpXdN|%b!2zudYkxRRf%ZJzuq6Nh5b~QRkzZ&B<5;XWGQwZqv~YRV}CP_J*6@GfVN~ILhXX{)_gVInQ$-Q z+-06`2_*_Ywm7BTcI$fL z^!Oqwi8&6ck>?9XE3y>ty5*Xdc_x243Vw`b)+-ggt5apIVCi5Egp?8=eB!nAA4nk6 zl>V%0)wE+y-Mv;paeikc(syGt{tFXQH_2N*uXNu9!H?*wc-PHcg##zM?)h?cwi>-$ zmah=uw}Ki>(Cz|#<1uj!7a)X7XL9AeYVzhp;n<AL{tYks{&3t?^o^fCC}ou_I;qYEXbf{{KXcaG+0h2|T-yzksHW zh(vrKesyf8Dsl_8z8OAB=) z&b#r5{r6RjdG!OA`)u6*yvlW5Q-d;Nh^tiCiir2p3&RnSe;#GGr>!-KG{lcdWryrP z`~iwRs5p+fh0Jne=s{R;^sxnJOw~$;Q$-Uw(VjI>i>KTGqJ@O|creL8{lwvh7UrpN zY|nnwR-*S5YTuM?cMl>+f-+kUwG6IKLOMaE6b?3wsCEKs;0WMAcZJFo!9f^^bZ445 z4Z@tLOOm9Zqmk7ZePIkGCj_yfzZwcOfL$Lqq4zzGBH9h9^gY?)2?N#%hhlF^+P*d2 zy;2(c-d-S0%@`6Q4RD-LYz`IhCZJ2G7+p+2HKmkc;C&!U;aIr>jV%c-BD}NUd1wf+ ziG6u!_d%!$nj&&LwZE`@6D+>b6Gf>r+5f-*$gq4E^=fD#6)Q}FjzO2&g!cnIz{U4p z>}Z2f2QA#7=KV`*9JO?Wf(QCd@yoFjz^+YYw)RLV@ZLpnLz4eu#=I}X9?B_OP#7kr z<1&gOapU}E#oHjGRiKK(^LB6e!NI+c4|x`J0?}l|OLnBFU1Lz}A6yK1lvF_kFIHy7 z{&fxL<>%PMQ5}5XZY3qx%mEaw zc+SL`BD|K~jvQabd1f0H4!_)sO5mj2J7{8JjJGh%|IhF0(EJy&A}|Ao?EK zni+feR>)W3V8z)4)Pg_v0fla~3ITAUa1E+Rfj$+f zHwJZIpzok?0V@R{SMZ5A{we)TwSxd$+WE|e3{Fs+^MGvFVT^$T`50--r*MlI(Q8piKLdIOU}s}kuM9OP8E1zAU$U~;X3JB35RipM8Xs+~#@ z>5sN}#yE@}lhO3<&Hfx?Y%4BVaBabF)w#fBf;(YqlhGYQ#`0l1@cT6T*H-*{+a z#ygnrjw$({LJbOfcW6=$Out#;Zpd+l{>)~LjXswT+?^yrR2Xim+CU{PnmS@axXvJ|-f&4KjEtynL$D39XELP9sK}N&?qJD7Z9Bk&y%=gcAx#97J{E(&4#fgg z;SN9ib!BBzY%kY9tkd$&6lR{?BcPBTIW=Zt7PF{k z2pDDhaSh!D$$>>?*EH0%a{oPPtReW@4tmjmgN-Q&$ACQnks)w47-FkxWeVhRb_p--1*f$*W;K=3#)-y{1*gW7ZShnS&m z$4GK=9)&{z*wgG8LQ;l^mx4Z1xJ|g7#+x&k4CSUwYGeQQ$M?$1Q*xNNf7;v7mOw?T zUU(bfgXo}HnrmXsL0AdMYtU{~G(dKu=E`IeusU%gIF%92k_Ev{h4~@|vs0z5N!yn; zF#*x^BDB}0DaTGme1$0wXo$4uARrGdG{DpJWB_}?Tc z(aRyBS*^a~rZ;ljW$;4L9K!W4Ws!)xzWcUA|G!BSI_pcL)%WLsrGftduX8R4r8!A} zFm<(RC9hpm`mq+dIw8Qpxr~o2v$CJfOzbO7RZevNpMBcTrb};>GpWw#k``Q&@ei{h zAv))>_1DMuA1q}z-PMA$rss;SD=zXv{93+cf$AAB2O-e>DC>>fvx0LD<72fm(#< zHd>iBD{q_7yC%R4Pq&~E5#uf)U=@mS+$Egx&uG!%NY^Vq;2Oq4Ko8;QQB?w=>Ua(C z5E55gBDo09+QN7PG`fQ_4h0d6gIo|P&!H*_^8Bc{z;w5=`Z*WD*s&iTlOpk|&E+Sj z_{*c_dlrW`Wc<`={Stiq6OTQ?F2HboF!Epa!dj+pZUI@Gj80qh)mID2PiJrm*87$0 zzst;BsLcM2S2$C-W{sM>DT=-_Vk@k8ge8-G5B53@_t^2{cAG7I`WkG$u3Nh1TC39~ z5eh+j?gin)KT zg+iQkS(Kgkm8+Fk|N3P57PTwY0{58XqVa#XzJ3YX`>`)SbieEPP*zx#STpy29g?${ zK7f%TdWpR4ByL#`!f5e*D|yvg18oAY1ywd|pT(3yUXR1tnkt>t-kP2}Yj@q4%4}L+ zIirt#`-Sw)U8y_!BZ|6b@96rJamPCT5F{r*v%>dIP5n*Rw&4`)0XS16SOid_Ey6E_ z1#ewJb9^u0+;YiIg zT)!oLO&oy}o(ClbZ8-cT&?1632VuAZLb7?_THFV1oH!3%K`2y%Tj@hF5K$ip{VWvH ze#}k3JuO@rie4Q2 zSDKZsjh4%mYusr31~LEh>056`!qD&{E!5QM96XFT`;-ZV*4Ms=%z?7%<`w?@c`|OW zPV)>bQMM4F3&S4x6tgrvyS6L(Y0w5yb^&1A&vdVX2hPH-ax)j=+xyc`vw4aiR)YRpP*$m07rO;5aZGJRvzxqzBAl#)r+e{Nj-ln|zZ4-5TA>i>K`?^V28WNs-F5aMIzu82cd z+}t(mtpCN zhfYjME3qZS`YbfiTs4_JblCEjd0n@tY~GPSB?t?s35p=xt6xBB8wZLL{*>&VLkF<% zH3%zR4^=I-Gybu^)4Hxqc$y)9HsQr3;T(%B!8|dyEi^Z0$yc`HEP%jg@;ZgPB;c6f z+@Pa_JR(Gj%`Xt0=Gx=sY^Jo;M9ld>0U#g0Tc>qwWzr+%WxuZFmqk0u4E9|20w zMWdB>rA$xX^ZQ;~+nuSu-*TQ+_4C%mPo}(9KlM3;-HF6?oyKhC$v^*3BVYJt{mtr} ztHp2W?7#QX)5mx8ZzyH&?sA|+Cnjgh)#+kYk=J;aa%--KT7KYj`w^lVFG1s+u=74w zIB^2nwS=?LiB9bdfTBY@C<@*AdH>LxI#`(TPba0;$lO0vJt0)HtU3Ly_^K6=Yoq+- z%=jPGDms}80tn$`uz%(ies~g(g)5O`2tzO>((WY{De=$DIaSu)tHI$@mS7X2Yg$M; zXSyPx;>xnP_YyeyD6YnO{}gEWHN`wFVK zY7<#BUO0TBH?cncspv#`N?p6Y^#7j<`{B^#f@#~~%R#g9R;ke+ym%t9qN~N5CC$A6 zTKcu`h$xrdoI?9hv~fevJ)D|gUUJl$sR7|Jz<@QZ5y$KVf`5*XFD{HblPd4Bx_@T! zC*w6s8y^1p3*XJd8|u0_0n%Z}jTR1Q!$bFv{>4z`)U*QAFIxSN?atou=&`ZE;rsaX zbpWi;ObPkbdi+`m`I#5?=clIUKA+2Reht@&MT8H+p~fv!CJvw*2`5~N_9?i2umuA? zJ@dgAj4Kdb``}frj7djty8OPpf2p6|ke&QVKDV|@iif3TTx3}oB}w8Xg8$FVt=Yi5 zq9~%gE|I)BiTpXV@*>wotxvi2Wj@Kd-W*qixOSpYoUg!^qN$zG(Na0-VWckqeu}ctEAzkR6t<%6QjVG1QfAgp@aon4$y>{Fre6=KUW=#NI`W~-Mx00^XVuNwSQJQcI@Q6 zOA;%tj%!Q&>8a_dSC9MulR+vUP;6#>#&bTXn?~fy7Vc9C;~f^i8sx%YYJWrh2YUkQ z^5LaYJRZfCB~J+?Q=pi@8e16-2n3Ro|If*^3TCSr!P;7YK#lm?;fd6S^N&8>XFJo! z4^+3`|L84%I<1Q*4?J<|$A2WX9Ex6GEwxZP7Q?D+*WmMFXYbVblY@U)OQ0BXDL@i* z7=)pK)SMT+S{CD(6D3P~OY7~+fCNd+r>GkvWKq4BUOWbb5^uwQ!1zm14jPaQJ|q`e z|3~Z4WTB-~imsHq)@FoOCSP%t({R%8QP8#n)C_OV@;`u&4S9O+5vE?-LnmVhw$ADKw&-5(XcU zPYwNTEes~q&sB(y;nf`?#Hr}lkQPLT`kLv1r3HQ$1iWS;VvDd%(eh@Dnd#dz##AA- zQXPJLBv36ULc{~tKZ#;BNm$9Nl*K_knTVwiE|>w3>Fx5)E!lz1#ASv$PGO(^ zI)j=o|Y{nTXjP zeXM`mmMpbY;Lt~!1`YMWaA|lGdLIF)fWQTh&pfqXKLh>{$%l_l?*z;{3I!q2Q8o@t z93AU@xF5U_2}nA5}~qTnJBW;9TaW~W0PZ<<)R{B z4e;eEG`5(5jE*nGI%8BYc%Jotp(nQ`2GqCs8lTM({Sp8_K)}Dk_#c1qixZ4BDd#5( zy<5SKgKz@n;Hc>j5Ix$&*vj(Y7e+IyQJF5zfD(xI?P&SYEoSdVb`L-gq%;9|306H8 zqbx6R1fiWwm>#iYF=)ud=@UmAW9V z(;~Eum@~Xd9oP)BMC3bICP1`;EW=y%kxhcz0*zic1(f?dKJA_h*ZCU6q5Erx67SEg z;-hz9M2}U|B47FYsg@eZ_pWsLHJVvFbV{pU5H6yHAf(6}ZeodqbCKlOS4h*$|I>pL zqwg34%R3|I97IP1CoYjEUCY0gGz25+RY)A6D^}sJN}=#{_7?Tzfx4nbX*6*R2YxDC zevWz^Gyek@VIsFQ3KG;B6iR`G0TT^c4~QtO5f>FMoOJSlp1mdQ`SnA`PPy>#uWJ9? zzfbT>XE`|S00tH=k|6dHREHq36XsEi1#}VqIr6}$;-0DA`*Qt|E3LRC39hEI3`cBO zn(cyDftUzLmb4^kpQ{VJ9T%edkLIMyFDjpIuNw8zUm0C%yFYC+n z&eudPf`P%Ev8qfCAAhUV9$8h_j6OB<#2*f*-RqOrtw6A39x0w*axs1_@-3u_h?5&d zS#{UT|G23A#h>z*p#`Hg>P(;D-AWr@1e@9A5^q~w^S+E4_@$D3&M)$6NzHf{Le4yQ zd$ucm1qCyRVBj*NMr%=og|JcDzF5x0X_ZjV4~vHt01`F~84($wi={xDHRTC?vvRD) zkXr^_Ay8hIEx_UqREe-ZWYYYB+s72`jJW?WtY|EYbxcaKmVF*(pV!dh9tuP^NDR%D zk)*+A;u!z^+}Mi^P}fw&%U28lsWFF0lijIwuaN2eP|n0MU}dBd0I35tQTzv-2V~vR z-3Ve2s4_tQ+%-J3OkgIur?TIZQjggEyP#+$P=*{0HF3g0qYz;-9ZxV8KDYDSvz>i%Ro3 zoH-DP@thBlG=#zgx>A-?o5)-bKcwpaZ+q__9LIUyc{ZJ))8h=B9tX&E+dzz#0f&tc zI?bG*H7235953bLaG9)tl3gN7cG<9<*kqi74=Kc4sb`Td&N95`oBPw#g|hd)^gy5s0L6z6(n)ptHS3U<@v*CvlVHc@$I&VA0C zd8~Z!vwOoAE3VTh1E~sFnIvP|>=&ia7Y`pRjvpI!Kc20fmmmbK6sQXovmupVVjd#x zTV8GwMOYxpReA8sV!J6HJjc`j*;{AYiSI=`a87?ls&y; z^D?jmar*R+ef{0p#h)xweM5cessFyXtc8m&M~na9Pyd&>422FK__fN}TA}}gU8`Y# zs%!b>=47<^=?DJs6YsmZ|Gh^31NQ9E^5Fk+N9m62(tjiNn)$@%KW1qiw{5z~{l(>> zf02)${BHKc&Z&OOd1*CsY?*Yb+y2ei%(rGrfAk3=_Qtz!X7J+Z{NlTU^i5;+zt`>T zfPItYyf6RZdvCXY^M*dhIstmD_R8rCz%!LyqRl;9K^X`b~>V z*6APhls-THkuG~vSDM)S?Rx*sg99G{tJ~@s{YB@F9yYe%B;J+xf*-Bj{(;~5a(&>o zzvtPDvp)sm=llo%)$Ltj^$Kk{#GzwJZC z(|_lce)EpM`eAwMsjq&pb9423<=eLmI{%{owjH+({Dz(SY1;0;`OA;}JFJn#6|dvh zcSWnqw-0uG;`ZAhHg+7dxT~k@rk|#aT-W<-|NBc8tbH#xPyNyd=ibwAyrTnG8p!nd zUrXeC%MxJ)Z!o~GC={1eYHa1ZWO2Zun95k*E8#MgZhZBgG@w`6cV~mwghr{E>BtQZ zGWLLc-}bL}kruS+UD?||a)6;`VzBi4d+zAhH~m?y{>kFZLRo*_|L!{$XYVfF z{yz*zA_{_mH2o_IR`^e0xjBIlvW=>Mr3M>ogE z+|~aV11zWYHnsm$um7w6!}w7)_0*~8R3@G{mHCYW=WClb{mVbK>c5*^+5FSR(?iEj z-Tc>C?O)%7i+|UVRp+@=89&a<#$C^!DsJv+_NMDU3HH5j)IR(jzsp{6jQamo9qF`g z8oC*>wEnM5+jF&!U!jU8zU@7BJW(dDo%_^i^xXHI|4`W!EZej7;yb#$&wn*P{K4WM z6;@vaBq{wnpBjr_3sUdIE39{Q_m{u--I*6=i(|i&wY$8(-E3Ruzr6o2<< zAy5hkWTyLUQkDwC!xA+Y7Ff7@ed0aDLkdnV-#ak|RTg+TBdSpR|VSW2} z^zDlNLP6h_HHSxnM@O`;TiQdm{<&hM;U77*U=ZKDH+yL3^uZzj$mboD^IXbw2}TZE z-ra?RyBqsD?flOii(5x+n z2MQ5n%uT;^Yu-Iq0s56fA<6e#$!be>uowiV2?L9|CzkC6c3d1$ZwLsUgoTqsiE2r+ zAb^-eQqg-s!=+pen~c&)ElmKJbI2%TlZ%#v>E~t+Kl~s;E3z_tiV6Yljlz7NBiNIW z7_WGv+e)x%45M@Q7qsPIhTyqrnLCFUY+wd;P$$1QxBD4I+q(JV69wNT6r@ zsiX6hD2PRy39(D}e&OKsbCu~Qr>5?kFeykdh?|T3EOUeC?*@lj!Rrf0*PkcwD-yxQ z5KLpDIr-{~3&3DSRN(Yj{yBGH(Iq?y5Wdsrl<7>(6h^Cv5h zKQ%QoTSk#}wrkm)dU_bk5x}fUEmhHNDzrTN{yp018T=bsUtWWNAoc!&=SciEQJPS@h+rp($r1z|E}DGc0dIm-(Nv+;i4897nbb`&SG6w{!sS;py^ zy`Hl-vPTwc+V;`8b7jx+W`NtMR{*f1{?F@;j3LW{o*UH3qZ4}{I_P~apFTM=yd5l4 zaBRR{L8Xi1j~8nY4Pf6h7()`e2E#vI1!Y#~11V4wCirvsZH)4XGA0wIa2$jvpjsw> z@PUedR`kJve!I9kH~J@~!}lMes$zg3be&2O1glC9Y6D|kIm%Z@d{0EQ*ddsiyq94n zhM_~TD#;0Sa<@$ij=1B*J0r^59EDs0ajZd7NoZ{H$tf_wIDxA3(5DR7aJnEc^Za_i z0xjVL$m%wdCz_A4r0fX8dd>*bT@C@fu-nRZ2icW)V5l(qnbO|f24~H@V7ezlF921x*Tl?>`^|n2pmKy8?OK!q+D-ctj@(l7^(Wx$0`RO zngj!V>{ErwM-ERtH97IvYP?U^S#^$s&;CY<*$LBVF6s;=sGW7f>fwm>1(>uU+Vrs#Z$vh)GmVOlti+zUTLb z?rFevNk6H9$1U~UXK)WL?El;WvW2X!C=9}QGmbAKB0V@a5_V?iPX&y$&;%Iz3|k<1 z$X!zB7S)ky~jny*P$zi84GCVqe+>agK0vKIz*8Rix&Kz>azZC0}7smGM zMQ?L$sxxxIk8d`f_vXnS!`oQ-VI^KM_C5;Rl4g?D(lxIw&KuhblYcfnKf5q_vRoLl z9-lche(%2VyGJb}joZuWvH=*7vZeE6rWpaWHMU>;OwQUpI{uZJ3Rc->Xy4gX0JIVg z6RM~sQ2?SW95r}gHaL_P{lK5H20;kWUlw2g(+k$(YNh$EeC8GJ_7(rPf8s5_D*#GQ z`#ap3Jsq2jnZI>U{UkaCbA^uI9}7hCFE+grZ+aPRaP#?>FLZQvkRxEf*8IJp-$djN z4E9T1I#8{KweqrN0HaioHvPoz83z5g>+4@`&YY@^{(e4wSI<}fwD!{w(SdeY6?zVp~ui=Xc3q9EWkJM~UB z{oA#F_`cS=T7P-acxNhp&F^94-?IYnP5j>G&F`)kodbp6sN7_rGG=f4^=!v`e~QyL z^}-#${f_j__D7rV{kHvq%;xCVtp4-byH~UC3R1sX@5()0f5kSMzn#k59KZ8a$NNt8 z+xh;%UHv;(I(`A0UHjALo=v}N^B)fU{_Vehe$%hIn?=}eI&uP(ovgbGphvxD@FUHv zyLif8T&Wy9@U7c+>;1o;`p4I5+AH2y|3gLVus-&gKm3cMfBuPW+28FwU+7vYZ8xm< zr{+(dj$Vqpe!=p8?4SCZ(`?fA`);3o;y>Qpw0qt`6(ojy`qVG?oP5tmSZBmlOG7>R z_e%Uj4)w1xlO&_#kVHigx3A#uh@U;?o?rcb?(dd5UOByKbN&Caa6$X2cW!ahE1OA_A;R5E5xLuhzwM`FT)f7Ijm@uVAAJ7@S6-YSB<1%V zu@4pwkzlQ-hUar>N|LkTy z5Ow`ZN6(fIYVYi^`uSBH1BUVrVYbR>caR5HIr--^N6U+U)71f&W52ih9^$(z#=Cwe zTIzcC&*yvI_raB)G~k);c&%`HCEN9Z{Bqq(b;Mnk{a1epoK%1P1N~opto-jDDd_qN zgUwe&Xfd zUH{+ySLefBo0pFNxifTg4@;RW4(KN9jnip+)&SpzynQvmKpCzR$_(%(2KMy}uZ#a! z5_*y4(dfsgwWu-@$8#nag8smgfH64e!&+R%%kS9kxdj484g|8NJt<>NQh&jY0?eeP zfh!=cC>(%Cryk{rv-Dd0%3bzyLwS+}Dko<4w>QUa5gA2fVF#Z zh^xC;DvjP<)J*WvJ^O{xMm#_BEmCObEjwE|9v*sP*TkdGkMGEu+bB4uzJ{_TGFXWL zP*h2UIMFQp)ogonLEV{rCah8c(=(u@<}Ij`RJkYEf+Tg8;Hue9`^B-0%8YxQ^kWnY zWjenyrw(dnbm);o!2P-_*}@QboIn!5Cc|=p zY7k$O4Y;k9aYCp$PIw1CnI0J~dS}Clr)&A)VaF*r87MKr%9**Tr>nu4>fr|pxvfey z#yaBHLTVr>E|P1_;v;BQ&uXBXK!LgvH+S zuLfAOv511IvC^c|tYvXe0+Sk(Y{EVn;uV5_FzCZuWQoKVKW^xqCPag>mnG~a_huUv z_kApmOm!PdhI3suXc(lp;!%SJ1#TOF9*b0H8`;{D5248n%!Z0v2`n0-WpQK^6Eyqu z0f)|&f?z+yXKp*g42Vt~5X)@lnVG`&l8>s}6OG>qdjEnBuY=$ZQeiB+kx(EM0tWg{_2dj42f@88jK4=x^t^dNQVs@CIV?Ooas`j%OI)ngRlz`_)~o& z-L7V{Acw^BbDDd6KGH`)(g4<-MbMO=3$2xBA=wcMpuTZ9-4d(KAJC=XEjJ6D!ED2+xy1xweA0dLxuzW55D5#xX zyyGLqAU93jjJ zk!i1-*WZcPX*r`o&@PKL^Gf!+Q>z`#rSs>$e|x=We0$gLeJXp~Z}xP(S2CEX&L9N` z?{xE>n^|)N@F8-bd!uGH^X^5Re9Cx}qIT;@y#|9E9=`J=WToHNQ`~OdKGd|kYODX{ zG+9%|4twPth!8T}xFGDifGhf4Cdijw%2=ttW}W+QtJeGTANy?a_MIPTHdm=E)mBsP z-}w_$&qBzH_bT;E*|UGWGI$fz%*|AtY&%0z`+j_Z6eR(9{D~B>%gP}`{Z*2dQuv;0 zT2CdD*Ga8;EwzD&*3}ATrl@>uR`B?qnY1?zF<4Lso3sJPkh7CrZZCUQAsx?^fN#b4c zTERF?g9aY8Jgm9-VQ2c-Ouip`k3|qdugl_{d}4(Ad5iOSL`i)zOyVGtks3pcr&ogn zIzsG10FIDjxX-AWpl-SlYZZ8w+(nkDZ}ezRC#@9nTv>}cMFRqZfv=Gux`5KsXB15I zf&qhQa*Sq8@w;Q6nBq>5vQ^@M7l%@cY@TOm#c`yDrQ8BPD<8+vrmrRMkHMWOwuT0=4qmO4&(+YZEQSS}mTe7Y}xhvko^J;P#Fz zOF^Z-&@&m!CDo?00iZFz6AT}86__2VYj`zAC*6}PRBBasb`EbN!GYSO2L^2+ESKrEAditoP!+wUIBV*9 zujX}xd%t*?oESQQos#|n=||R_=z}^nJh(HQ9|A%(0tyw2(u?ifwnI{6-86_G3B_|l z7{`7bnb~bjP`KWO5}rxGR2HZd1P?1iDo2cTZ_QXilX_aKKaV59fYl}#k3LiM!NHdL z6fjx9`jEXjE%gwrNG(381&ykgiR_-VGdQOAjzFg)vxlgA6A)>3-$Z})HJE;kz|J*l za}}^kre<-QNBZ4PT64n)wjPw28ew~H#dNk5-9=o`(o_k^N)4IXexXuhge0X&`jl#M znZ+u@DH-{z9+G>imJZTDrl(9&NTPD%?rfaz#OofDy}$o$G zZ%?zv30Lczm7KuuCsBcD{NuxWKUWNoKX~}qLT#&WZL>|VUBD|!Ih3U%3YhtlslzPK zYTk-LbK&vO71=9O9`st<_gVQZE&dfw9&Ox;X`%eV7 zqzA##?S=JuzgdI5Nbe%6O)`nt4#OseHDNXKiXD-?dz?+~=?AK0yU83CpPVWKRA?IV z3IE|LBJvSS6{OLZpZvxQX?3K`B>F+CSQLK`uY|oGhfX~dnpYBQl9DeB1i1JDAGU7M zSEcvN=v)-CYc#V{PtDL)oP!vF5cGlY0LQAR=1UMoXl7k^mr!fN;XUJ)W*>TF3K1Mi zMo3KANl3;XWlP``q{8t}7L5QBq>8;WpUdU2#F&6SXfl}q4a4XL-G_No(=$?O>nTVe zIhdxG9H<=%WQdp8FDm6w5fW~6Tt2{S;~)0qUCs8+Lo~rQ2^pO~U=phm&;d4dtJ`A3 zC~PZ&I7DZWV}<}>2+{9IKorjaef4~QIn`{$^)24uLT9xD;+&-YpiBZKH&TWQczf&+WL3C`UvO4b)dX+pdnS6qI zL{2vt@XZKpGLlfGZmjMXah|uvjMlYVo_x|8UG`GaI+-Nb8eLAmIKY=JZSW!Do}xT3 z5=r!0t;NqSmy#E!VTB7+k@{A~ z#!qK0peu8S9+{DnNY#4fe2`Z*BX}-R3icL?`z(7kTi7!et!PJ{D%$|AiiRcouH^Rs zJIK85)W<$KqMchPdsRJWyOg4{B;@h&rRLMW3hl{oGo$awymcmsQ zsOT%CnaaN+6q7l8wWBq_myNE>dI1c}4cqyc_^wcmT9lwm&3Puvq{bU15U8}?u$+F! zC2e1@aKM5=WX0@Dm_SHfOrkUd&a{B~QdV}H1<571BYW`cx&8NNOFO6{bfthgXy_#0 zP@H+%E8VFVVeBOQ*J)Re`y_*rPAm*RGI?cCk_Q%-S!<5t=Y|%zM02K|t%x^@acb4o zD^}aqp}IhQEwXpxjJAuIY~0}^xgEW5|p z`^n*GX>R(NNkU-kDYleBiw+^&1lW6a1M1e9C(7f4*2HJC-+Urxb^A1Ciu{bwyk<_Vq%^KTBG_x@A zwHhg=wmBe5Ahsm~k!S#^#^?@eHMH>LRBZb8DtZR&%d!FmVi`abiptoZ`kj$a?Wwr) z;AKKdEllN@<8mY;%D*VjmuMg@icvJ4s|xUSqqwmaElJGm`5-ZQd+y1XhHc;v!Oal$ z^#ZQ^EQK7*Wt6OZj>KyNKIehK#`wLKGZY$q?${TN0}mHVyGzuYJHz_E2hw~(wTKW9 z;pUay5Vcv5zBO`cq4N<7kNjjyJIR{(l73Fx`^fXQBi<-OcN-nT%H2|M)X1qVR!R%S z&hE9R=c*o#wx(`UQPP6pXif1}7pS!U_RJ7vzNLF5eW8-k8Zd2hms@jz0SGDyT`&x) zi6B2qq%mt(a#59@C8mLPi-Te{aiWsX*nl8pMZ8hZL6RvW)UbQ3@jHjLQ)Mf1#~v6n z-5O=}zy{+92$)Y`8-Rfh9x_utm9A>peb3a0JcHCgn%4T2cG-KHqrPqrxggYRczQCx z?Wa{WAQ}c7dnsX=I9}+pg3hd!nlIhueCZK8Zd9ZiNF)_!gw<1JJQb*;@O|&UFCPB_ zu^K51!AXQ^X>5r`9?~A4v-W>|V0bqh4@(y4Btjt|=qu=Aj6`8ff-+ic_J9SqRPhV~ zYW9I|m9w_Mp9+pi)1saSr3g= zvb~*7kNM)e=ICA3eV?k#9S_ULssUMcbS8-_B$vrbC2vBMd6gE&t-&g$4U81D#ONri|Cq}`ftQShNhFk|D4d+43@^uP3HRA;>==II!03}9LF6Fx&_vC^D z7V^0eEL^SOj?>_ywc2y@V}s7r=kxPl8!K%YSUAP%+B^O2@Zf#(0AkDU zA#C2)d0az83kHf(E)+#07AutvL-ygXkLQ8Y-%L^%#++BJO~X@h=%HQ0A|NxH57nNL z9P8V0*)WTqX&9tU(Hjz;HN=gc8P)sp)8CyVJt*-xNdK~SRn$z|ETKRdYWY*?u`J(} z7yus8Xp@zej2Uk((X?C5X$wAGXS~^?b-0X7p z@%s*-Fz@-dg>OE3XuNNy$Jqw;VzUFoaWAI*GL>pQf#TN zuDV_Uj_c@Fei%~~t!R4HI+xSbt$Cj;-$XnoULjepiRfOlxa5rh^OzRkPSZyTr4adm zGy&JRvO|(rvhLe2>1Z^&qgA~_EN|JEJ5a;rULj6dXSlH2ihfYh;8VSCl7$@|ORDa|`uA){gB;bP%a#mR4#!F3Db1$~E)u$=kMG8q=A0pact;u}S(7voNnK$7 zK^01TX`&&kv23rI^|w`D$(Du_iY#Zr8JD#0bZV4{(98*3V>ky`tO{s|l_ku~xaAmY z9Hzx3>Q?Og?s;P;qcSL zhaR=Q`IIyLY-wQ7uf8~0c?3Z7=a1aGALjW3Bc++Il&8N~o4VJVdaCU7m!_XCgL^)* zCyz!ZjPkOG*Dc@c5Y$&2U{$V}$O7eRQ}QseE>b89P@E`T5l^+mxD;0|Vi~RS;~$ z7%qVvt1!1jTck!5FQyJ^oXG0@mO_5e_fA$!)6;Ij=JBGGZ)OIla>D^4gMEvi+u`r| zV|(m#_V^R?`|s8Ee>AVJ`p=gq_CDb3eMsN?S+}r*z)$(W7jvaM({>-ql*m)Iwbt=Q z*3sI6y7mg@@f3YAFGY1Aqk@~62)1}G(eV;-EHk?$CFl{(YB`c*6j}@VlDQ^(iP(W6 zz!i-0EI%nx%|3lhB@W=(mUyc4I}3uoYl+rGz$TZHH`!VZe~Zj8p6a4!f35v(Uq2prins}rCrwJUaWzY#(hf4c zH0w-7>k&sME@x8Mv?iV+W*#|TZL0+(Lug_l;@4@^K=bBZYGVn@iw7abiJCjpkU62fXisPh>BY%}03(}II1 z7Lmx3c7Q=Wep^m6Lt$HD{BQ{<&~OP%G3xogT!D1pGm+s<`tWp_5pM zIY&paUda4fz?&@)tZ?9VQq>M*02%YXLANgnVgP0m95oV=6MIrP7%t9l)!<|*UgNm5 zbVbZxEiq0AhzZ{ty3A(K3zB>f)(QxSyx49Pr41$}%~gCCB2%SPmw?IZ-*T)CQr zImyh6|7~q6*$9-6Odf_aQ$(4> z^pZe@tYCQ@S(jqC<8qPi6#0Y4TkSm7Bh@wLVH186(&-*W%NtxfT?1S_>Vq(n555O1QKGIdx&;`m})l+IWCAYwu3 zu0ZO5x=FdN*q$2_zay9mZUYLJC~+;Vr!{30!Kg+(*+->W z{5FHj5MNT#=48<)Q@l0a>mMdjqvT%(Gt>Hpb;&y)U>BxGR|noxBSBG+Y+T=Td> zjY=M^HHOLijony$+aBQc7sA?0I;FkgwWoyoe>qd>$?K0qy;@W7TBoVo1H0JCa+e?@ zUOgjaQ_ifNchdmcZUHM2O=>*eGW`5W7w1OSL@ufH5-_6aMtUEJ>70te$yB|l8@Jjf z%~T6l&Srr^86Z`6@~IlRRxn)2;g)b~eYIvIt=rd?YN@WH?xm)bD3wWnCib7SL~XaK zi(2BbB_Y^-2k=j6%QNCB^{Pk9wQ{L6euIgy z;n&FkUt5e{?3&hPS}ohap|Ngs#kxvasQ9=s&|lCzf|D+o!TJytJ0eS?7j%8wXt=69 zecH{|3EhbQPmJj#h668xWAjSf8%hsY|59eIEI#QtuEz4+wPP3`3jRwrfq z=u;a2dseqLyj_oaYwj}@;~d_23xFa~Ffl_Uspy)vhII9Mk=v3htpQU5vEf8f4|NSK zdi|tmDL9u%cfOa#t@o<5jo{>`YL&}Rs3fT4aLszhCZWeL2K9)12cCQuzxqBvkSj-P z#EESKTr?6E=|oa)1tbRPM_xzL{jy|Qs!+1#+N)W5QFdH5_`;A)SpbPaEmw0({I)g3 z^&VOE^JJB`gn?R`L`@O}Uhdfpi$h>+DIH#|+ScSy8?g+w%tG1P$=ISRMzbRzuT|W{x`hG3gaOu{3>1N!X zFRe}Jdha1)-vBt8dJt{NaF3Slow{}lDap-QZh~_Nu zi~#+uFigUsq`j%@x7Bzxs0=ZBzQ`NVzZxvx+*UoRm2JBUb{GSnCY4$Qm!cIFMa@FznSKVg)QcET|3Av4C0k(Z8u_DG%%7l5~%-{5=VHDj-^~> zr|F)p1hZA!$VE#ce=g~2Wu9GhDy)6?vo7&#is<%5FPF@%ySDYLH7R{rBh;VKW3JPq zn>*O7s2gKOo05Km?s+_JY#Z^<1(ijS#@QYg423;X9f6aXJ(bd8dyA=bF0orK-F*}7 zDOsJuM2eV=HMmIB9zHcq6_3LV_GuJk0^-1d)lXhP39-M4C@_T796=2D7u{x{%suLM#8J-R@ zAhD{J@_gw^<%gs<@Dt`MAeAx!NuaZVmC|Nozt3gb0tYQ-JAq##i0GhWu{XRIda&|w zQmGB`L|(ut4efP95I|l9L_r?|FjB6GW7(BO)QWs0o4S%);+W-r7Sy)*#B;rpWrTql z0;&g|B4!WP7IrP~iQ8veX*x;h6Q`r7NJ+XHmttPkZNDSJ%>tk}8dG7XxTyHL(G8TBPlXP~Zo(H*Q$yx?*tGZVkS@}moj2}u4UqvrXo+sMc1Y$uLyn-9O;?!7^xcLv z7<Y;@wh^C2|cHj%)mmHCMiElg1!_Xs!(ZSy>YbX$GWUa zxhQ%~l!zlTp*%QDUA?@Rtu-Cj$WxP4i9;7|k@c@Q?W$KzkK9aD(dWICRY|#(vlZub z&dt=E?ebt6I0`DJL?FSer-O5jy?qon7Jz*r>@^r>SracMcM$fwk!a{ zjI!xskCp}3^u(MuSXRXY8y#wyCI{C=2{*MYfaY`MIH16giu6j2vNa8AJIkX=gK`3S z@uvL}mj~5m3-DTaox`3v8xwxYBCQ-jQ6(Mwf{IiE=*x9qRdGC(;v-L52TM;3ciF88(MuSZMT3V< zOOq+*rN@R1eKq!uPg-~HRmT0=9+fBrX}Mr4qlB&6l%}1jYWH9Qh?Khe2&D|_BSQpkN!@AzaF~HW2ON;zKSKw>$HsbR#=HjI= z&E!xDe#>N6zi(%Bw0$CIK!rZ=NLWVjwMUS8goeeUbTM)eJ;Lv<`_%06;?25OKp{}d zo(GSy9$Qgk|L4MJ$kn=Ww@P-WQagD^Ub`8cGR$pzyd^-1J=T!bk+u+@_>(siH4+;X z!`JT9qvs}o5@JUNSq-11q(_mMo@OdY_Pl`iQJBe}dOWs!SUX$OE|h`TkcmjE8b0~@ zk_50>&f$mT(TMX;$$8+YfcKWnn#~P?be0dr9|aPw#HK90bgL83PQ|sVWE4q~kX%87 zosNsByOY&~+CWdjC<6(&cC4&*&)X=^)F5qitlLvtdN0lEB#da6obpJoOJ=oH4rGY> zQo3mIK6&|MMDb#CkQWZ*(ABUeslu>8qy;VreU$7>?rzYwL^Y9xs@k!x-e1iZ^&MsE zquX-^tj_^i7E~&71@g}jbVzvo;IfwF-{d8-UtV}{vbZF>8>Lj`@p~%zc1ll8>Nq5+ z3b9DlizL&;@hOsw#!xk=4uS(g3aZ4&%xbU7B*4d;4z)ZSPm~uR?{Q~IaZyYKjYN49 zGl{gtW?G(>diz)P+#taT&7UjlgUq*(;h^M%G9=O0MYWKcA_+e*&P|eP`5pltDE`(^ za=1G1VS_FSoSSXouLuQ=m>tevnsD%liG?FSZ+9GTm=`K^LCH)JlAXNhflVzf`cho4UwYancIw9 zYCmv-(7kr33=oS>haaup7-JZZdnacMqe47#M650;7;*u%KyOdi0VNo*OWMw%wSU@P7=!!dD}9mR4j;6tKzm&X^Z9^Ka$-NX=iaa zat>u=(wj*>p3Fv7r5A;Mi5+OG5ucdRw~+CQdMD5i>*e{S-E{Gwlx@x zZ=Z8#2YjdG1OC-ThSx>lob{G2xY4o;B>6U-M19gW-t+E((VbLx%AhJ2uez6-g~{7> z+k>Q;8BVtbQ{H8}Y|_A1%E;QpxF~sCcS(;=?8<$HQHgQ*%dHY^oI9D3?87Wyvxs!7 zodR+e^%&h-df8A31vJ9S#Kr9eZKb9~Q~K7B0ak4_K%v!vE|5m^VgbpXD(N(tET~)2 zH;&lbe63fv@R#tA`U2%Ykc9wwlxz$Jl2iG*NQ+>M`5phN%~|$cHE)nYp>`oGZqqeN zu!AXMH&GD48_49X0j@`q1_fm7BT0mttv}mOMME0q=y+*b+bKH{6H7TRF5PP{ALRAl zsyl;O2VS}1={qZrQ<6HQ$6H1u)FuMIHKo>HBe4Q5{UnkU2|iLGuk{-+XKv#2*I!q@ zi^-|q(I= zJ~tJ2LMp6bjU=FGvcl@h(IGhi60p;ro7OuY)OLE>W43np0((EH?^2qb7z{{e^&}E| zQ)np$pq2NLBp>N>k87VSNkqMF15S*|!TOUbQn5qG%Z;2qnI*vr`v3@=?6}-B5vn|7 zY@)oFk^R)PW$&lMduNU9$2(TA_5GRyvm84d$uT59^IIH6gy*+MZ!IwX>gwB+~ zEu#X4)DPo$v1H~Zf~`CTIpkOqB9deLLl_|nG2$w{cFAnG_L#PY;P(|k~oie5b>80t4A}g;hB*IdX(Ql_JDYgM8+_iUxS;Rt&3~;bHI?cY2)X$JC|y?d&?&BUi=;Y=!vc=Yh?V?Xrt>a`)Cj*>p zfL`is7c@!)%wN1(}QF7kMv!2Dji)#r5i7ihF3=y`Rfd^aBa7!Ej=Z>o! z&W0L7b}2G}$)Jtg zsULpSwnc8Y=5Qh;-mtqjI6*zB+Dg=usv!pq?^sFOc1VZSSDuk6f4K+adT#f#4lp6{ z3~n=VE^EgR#Oy=EShQjYD(5==s0Od4BgiK$!Ih}oN(tPkKN2lHi7&PK595`ysnKhi z`F<7?@MioR8(WE8QNmHw#T&q)=Hi9~?FEBJ{!DH|Pz!cwY#t`1SeEiBfgp0sW$K7< z79w5_fiFkpPieNYJNe$|hA_o#W$~%0Il5bW{9E#*Dk_XFa#5{qO~vc!`}OCvRzJ_7 z`b`>a#K+hd4ja4oBTl%Pq(Mk{N^KL@ef%r~oVZAof5(W=%<1l!z7wU`G*e78$v9WT zk_cgSB%*9hAzb@h{JK{=L}Qns5!FL%7<3#ZlhJU%fCd3t(~4VdOlSDHs^>&S8tcv$ z2kq*zKXpa`E{a=hhSN?PRWGRGb45MN=wsUoLS8{WsH|@;-=L6dioz3N_!O3Er+Wa1 zrwY}usd%*4$N_j0rE6yzRV}~@9^L}2d0bne{?iz}Gk*NrYU0SVTsl#Ic0sKaW7*Es z7^7@`bCBpx(Cyl`ZR4(O+qP|6cWv9YZR@UW+t%A(z4yHg7ER%G@8Vp5xPULd5h-TVg?#AQ* zV7wO==$VhP9L^sX6(%|H9`ohAH3^m6R2434h&&RU7~)lTGUr$r{?aFSq?s3@jfl@8 z5k%wTYREqlfF>dQwJuwf(us8sYkIYGa!;B|g#(Be^AYY#+~Ze@MlUBhp0fU7>+GCZ zx$_DD{7S>0o#EPG=|(%GH58bXB#b%yw7`K_cfPwP5*wedz-S+;n(_fgFDuU(iG{%e z3BY{3-;7aJR0Is#A~ua`@B`@`MYP#M@IoO=fl#|&0=yaz6SFJb@Db=O6aw#@+mJ{2 z8i1}O@cs7|dM!uE0(uegvr}3{xqS)jkjMJL;s^tY#0xB?bDXK5E-5e2`h0??uT)y~ z*cQp|=$p;+uVf*Zyy3Rw4Kg*~ZjjbkF9<1q0a1Y7!MkO{_NoIea90bOmfEraDY*%Q zric6m*==}7x$uO^Y>RJQy1&(6_FpTG#aEp-$wS?Ozu|eR5B!Vz@m2eg1ww0xo;0Jf zTy>BZo)%>g{z&Q`@)L7&FpYDV7XWV=YlgXuFr$XGCN3GCbm(xL4!POWsEuE*XALNZ zMyAJ@bP+#g%{&)Ghw*pKv9K`K6lFYbj=F_qR-L|=jJl)wyN#b4U> zu69kZE4;ltX34#x7U{3O1?p{O19!Nx@kN@S17nQJe4hYC9pQ}~0XuUuSjG7Rbo0gb z?$z%0HlkT0yik|W&9*Yt?0*e;H4oDgE9?2Zx$QF-h zyAcP;JojGbz`2l8TA$A{hf0-NV6z<@0rnpL*J4*WdYyDt=e_b-!`8*v<QAr&QOW@CbkNR_6xG^m+;b?;Z3}i0Lmd6 z8!sW4JzU$!rTZwgUz|HZl|bvl@sQuK<+ zy-gzPa0eR>|FhJRJh^siz;U{zK0Wp5I_GdfnqURk0xb28fmI&-S$c4mTdNCL{P!US zUG?a8EGEDfMMie!4(wM)4Sux0YK#571M!rq>Fa=r6qr7P`j= z!`E;%m5W4rDzpbGNYUvc-(a|4s?DAV(=|+JghSZLhh>L?R8SzG)oH9%q(wu!|E0+1 zN6bb!9I@`6OGcB)&tm%55cnKY8S<#jKwR@1hWHefcW-YJk6VeuZNsoO?RuR3 zU~|`4fwrbFBj%5>q4D9|7_+=NGD8MRRvpQp&llY7NhRo-!qf33=D4rs`psc508dy3 zbPu&iaL-P0{{!CYdkS*z`-3a05a`eVI0+C*8O{=@BovUma396kdmeBRQ?9elWWBOf zGo?#Sm1#UB?QBp$o*{_mxUcAubU zrtqr5TZQ0jDZh(3{4Bi;o2p;Pz&|`u?`OT{G>6HT?1 z7Q8(whkO+8(-PoJiR6K@uL?zD6qapfU2AhN))G{amUJ{_kA(zspO$@{wSr1-Sf6RX zG~zB-8uM}rhP&9yn0t%^yQ8m`tYD?fcAS9R0)y<%+nqeh+YHSR9V((ow+IhN1pZ}*KNmKWY#W|?_HuJq zqoP`@gp#R!)efD)@1i-&)+jI2NuNm^NY8-R>@W;N$9A~Q(U*(&8O=4Y2`PUb^Njj6 zG|@rAu-qlv^{44uJ;A65rS^~SyFOS zw@gjFCNtzwMNri6U)ecQaWw)Uh;Wjy4rZIMUq3!kUt(ZkSiF@!QKdYFoA^kMOt@Cs zR#nonviW#>YY8}AC-lMk)kP_(85v@ZC1{U8ZH-#PVl7=Z;(ffh#S=#}n@>Ns?p-cx z)XJ~m-OEMH5KArG__-xODa2-C5n3f>x&5SxB~VHbDt4ekg)9D=<{~p$2;Mkp5{PoQ zXilthg@TBH1X7F~OC3z(>)864wPQBh6=iLgJ=ZjZgJ4dCYsnO4#hMNJ2}|@rrNvxo zGcRKt!+@ena$g*d-5nT>oAnuJf<iHURyD68pB`e5u7}gXOj7iXFYr#;(ceZM%qEhA zLR}l5IQgcc!SGkfNYqqw_-J!O{IgB1dR#7+a_68T1Plh@JuJiTMXtf22 z(BCB+LfFszT&a@Pgw5>}szq_wC~(}YobSrQV_`G}*0|^pJ!8gS z6U%{V)d0ZG(^vu!IAjHOMwWoG(&7qTM%B(Su2b5KgV<^WowtDozd@dUr3ngpj0k)&97 z)Dj^VGE}PDop=uJow&tN2=mjBrNO80V+S~g7(*mZyvwVh^|yiy7Bgc%*B#YU1W-HgFkasP!jyp}!`o5EYJ6_B#ut^d(6Hh&+Er|LEvK@p+tEKKD)cn&2Kk}t4UztU zk_ws%QXkS9{IL1?wgwqp!5I&LS`M6h?npPCuOG5d%+P#yiaOO?jqgjOZEAi7VQyip zw8V|s244N7oX4d~BmDa(v7Lvx{vdZuhW~tP8Wq_sbyp*(oeZ0r7q_@Clan?$c=Wjb zhIfufSzi1qUF})S*NC>Kwad9pRY)gjd1H4(v#(GUWkPQS{6Q(~9Y-=P40v+Wy|Vq& z>x33y9CA#KNohAr2<)9eYqsvctep^uJi53PdvPl=DF`-g>8n#dweg_O1aa6885zX! zmE^M<+3dW<>8@5DH`gdrAe@7O76H$sqXUDXBWaW+J73{^pyHUxLZu8Fr(Arh)yVlr zQl%Q^xHjdc*|Egn_nzUcpeKbxo&e9M!x`S&N(uqB=HL1-v)uc*ZarqXz&S9D@D)bB zU2&NT+P2gP8r39Dv14uL2ciRE$NQ)r;;5ImggY(QaP3A1^Z6H$Zjs=;b-7;G>YAF> z*G(axYvC;ymMiz z$r5ajv)Div?BrMru(CUrX{L-b3Qt5^H%uqe-a>s35v%Wk5Xo7OvF#y#Hoc@IanDg4 z%BGry@z>PJSH*=Nuqn^tgJFgD?*e^Ojf<#&AFEj&RyxA6??Ig|nFZPm`Ninkqfv6= zoxnWJGzkCT|$FHtTcdTsl@Z;hsU~wGS%br;U-GMKy!v`LTP+ji&f9xh4bivFO~?N7T1Wz-QXqtz?IVet z@88rA77XK47G(dZj+qPrh1Opp9lW3LGVbgK%Gl(mJgFI<9Xbfx#TRRAa^zf<@}|To z{7McudyzNO8q2YfkOu85PBM7{ur(bzA>Z5VA)z}95&$=7yjla4AN=Xp4R12UKN1xV zSp#iw9bw8m3smZpi6*i!+0`pfnY*1y`@YYtHPC6KKYZSb@3St;pyptGuF~N;lU>Ug zfX)^VN-6nXhOf@ZZ-X~TdbD2+QOGE81YYd&-=wi8_`^i8pcq_`22RROL19vjU|^_( z2qt>l19d7(6cEgXK;ppE1p$ZbmUpOjme^3Qp#vr@KhbN@2WYacJ$|=L7}FT=vYo0lI?NUh6>pO)>o=u3 zFL5je{>Pt<#5&Saap)l>!nbQ2V;!K*!g<2+n_W&p*9l}uf0}OMnqvfS>Vhq9yo^-8 z{@hsZLuRF*f4#jlMG}`lu;FAD|Bic50e`F>8zHC?K87>ep24PA7V%(ArL7Lxds%`f zRERct=bStaoD4N4*{ou2T7Aq;Wx>HW7=ss{#ESxyS4m{xBT0UpDNdm%*Wrl zD5XVT(~^NwOvx9HBGESvBV-5yP4DRhiXVuE-{B?A zWHWwtR^RpDYafHm?WRIJ3%z#x8D8c-xv_huap4FFZ9VO z>G81)f2k=Yo~y_e!!H7+VUu64?P^B;wTAg4%`sxl@2QkR;88nqu?PbGOR1}}pDfv? z3^$W<@SvjOgiZahr%1}Jwx>3?CV8MO^1$Jw3!qVFn~o`+`rg%|89plm-dz5ufsUqf z7@QbR=S!s*;!qyYBq1A=lmh&&NVpd69YW2qr+|_pWet6Yb`2lv)Pe7xE37=jxSgE6-Q# z<{^^w6Su7vO%g)A1YQhyFrh+eM+{yR7o<{fg=DPrE)e<@A0S>5Z08bCoiu;?6$a)A z5nQNRWavmeE~lTRm>X+}`Xu^-OtOqUIg|pC6PieSo5xl*q?Zu1mo02&7xzy>o4F=wuZLkrNCQq0NTKtxpP|K5R`mRm zdtVQq>QsHY_y6dg;NX^}wC+7owWg@8GQ9kRlNdPs1xPlKN(fujD!)zF*%Wx&Q2X!ve5dg5{*|g8(}1|hYF6N9qy9oKrbrF)^rT) z-umF`_GI28oPR(zGS{hT3)SDF2368B|MG8olkY?eb0a^T4z|8PQ{FFAx4fNksGgZv z)tC0b2MujTzCLGCd86%$__6L}yL51m|P>Hncg|gsx?yEN6g?XhZW#l)e)&^|G@hod!1B*hIp)mdOz9#6t8Y>}7 z808TF19B?xH+O$pzXQR`MG-wgi9Kvy35kiDCe@x&F-97@EO69cWMG6aqQyLlTYJIr z0YCs{c8w`jPef^9VK7Efe^->VQZEc54(jR;*B}ErC6xPtFYROARJ4 zB2yI;Y7yb;ONr)FQco%h52QY^&QK?LU+O)|VRjiKWB;|~kcrq($lHiO9ZkQ#U>h0I z)r`8mtVvC6pXM5A`+$XIg42?Fohf+wv8e^vfIcG7QNRreOV=^{g4#^!q$>cZ@Z{Mb z97ujd6pjRlQme*hgx4iqYn$dRRir(79f2YMEpf`mAMqDV4CAInfe1ElBzBA1qDU<; z;Jo`Mfp|&Er8s~Vavh2v$66d);U*s{n*{kA01}FP6sxNG)-`TV@U#y`{EcIs?sgLE6iN>BUl%O&BYd1-sv#? zVSltUn^IxAVHBlk$}3yQ!Wj%3&L9*MH6;s9$5`XdfuW9N1Ol7bh&A{eV+0@g9pfv2 z>H;c&Kz6iPT(%hWT>O!X}NeRQ!h!X+;dQ#sQ5{0Lw}jyx-iRg0}whJ71SW58h7 z&YleG(;A*$cb9Mc5+1AP}M-u?^x_>z*>t5xfs@~3wMrq%D}%KHu=3x9|ilEskB4aX~u&OuG5ule-tsE%=>d_R6xJ_?tvTy;sXBud5z(;_<9@KH^03)Zk#6E=z{)7I`F zEr@=RTOJd47_zGey2FZ<^7aD88~rrcJEt7yK`_Aq#PK{649zloK102Vcb7AAf^C3+ z>+8<6p$6ir3Y#oSgt(n@J`Sao<|Ks&Ktb6KAvh_XIlZbA4(DgX$p@ldsluyJo)tb~ zx96zFf#kU+)hiCx%{%}I4VlT{kL*L7EKl%hq68usRk4QQDZr%0>CsOs&PTl=%v@3W zBm~bg(U`Y)I_%{b)^o-FOJ!Bqf4g;e==Nkc^Q+J)5nq?>+P8=Zgro`f2d)iz%vl2w zY{iddt>hJM9$hMeRk0+y0e5Q#$d!)r=2KF)zryNS;^`(|>{-d$f_<&~<%asw`ISY6 z=W{52GtAnm(&BM{bQxv=2crSb$K>YpdQa%(hMaU3#D`o+F-0c4ZpjMW^|HaqBWI}H z#r+c+eCax_%Y41Kwpotuct_7+rX$yXC(u8ne1B{qxox35Cx{1NWRW4;zyj(nLJdA7 zBnWgtgoTq6-oU-OL)$7X6rD}G2Xq@+8?&DBc9CjYDz>sTw-kG#6rzw4C6qd*8I@*3 z<3sCA^W2KCE8s48*wVCWAMRK3f?5u*-W~|K715Fa30cV7E7$<}DCH6T5}hFG*cT(s zFc*}0b}5kgdC$z~MP!_d&Tq8P6AyRCXO0qXqi?kgFmCp%rRhijPH zv^78+V|(IxWSYR{c-y$6F$e-1de>6h@)J)#eJFNXZpt>z2^BA;jMk>MHV{l4CA|nr zm{6-ZOOJNRK!;vWdx2pd=sjRk1POVb!I37boIfVOf$iO)U$=A>M;nOVysqc22|dgD z4$WyF(gVv6waAKET~nR?M6ENMpctQ1b;*uWg(tP_wr|<+X;u1jTrh#mCw=5!NlT(C z*?Ga~pk-6>3vrbkAX4HQp>}f_;eMc-IR*7bAd+MP(7z4@-hHu0)e2|IWrkSI&2n7N zV3W&f`~}BWVdkBC(;Pv!NI2fS*zK#|&xL8i&@M8T!?PWeUBpI&9u^+8Eqyf1_4=3zVVSAu!7eX$#;9q$@Pkt>@2#heZ zk|z8P(W`}Zr(bDUpY=@&GViWGm|k@&nsn6uhV2p~!776|Rob#EYI42%q|? zNnClr{I`A8uPxW32>m$t3vx;O$jCsUoZ!1h?%Zn2-QD675yw7&Fg zzT#`qI6t-w>fIGQAQ6lI^?H&nbnS4worROls=-O8#^>ZI)-8np?qRu9d+o4$CPzOwier&7&WR?c`<|M-@B1OI%AMD>Gw3_UPFeRftQEce8 zVUoRyHKQJR6RJ9TEiw`;X==)Aw{^Z=n1hEKF|+@bGtl`reP~~IS{||J(R-WsEy&@y z$KP~svB^~j0-EkS77$6cCZdeV@8FMWw67Q&fMr><3h-3cE%IB zEd!)R_^Xw+UOKGQ;VZmC{^Y5^=f@w!tIu5G&A7~?zvWV0!9v~);lXR?EMwJ=_p9KX z4vavEO{up^K?kC#SES`ZC=^CO2BjeNWV`Y=4t=nhP5>bn5P7GYB3c5-~C-43I@H zpC|KDj)SLj()nK4Mb3+K%QL7#5GE@F1aOp|1qM^s4uY_fh8Uj6RI>< z^+Q}qw1lYGbDT8Ffdc^JZ$d*SBKL`dpK%g3^Y!cNjMS8nJ3Z zfp_bc6cQ>tEzExaz7oB#phS)$;!S9H`5Z#o-A6y$&al2bl;1`9eT#6)s#ege7)dE$ z<;z@h6eoi<9=IK6>*{=%+upBv(CWq+I;mbNR=sR^wH#qd{SErZ2hPie)(8oT?=B$Q z3+u1eBUU-3cx!jSfU#j#3nV@<^3VyBLvc`l7pzYnOBky6Xt8O(@AwQ!~}>K(SNV#2i~G~ zQU_c>W%zaUMN<)C0zv{Nh@*p__{+z~0kAV!i|MgeW23#OP z(eqv6Z>}5-lJH!%j9VNT42C5S{(Q%AMfQ8j!l>@0pq>?a|p;wJyab+NHX_D-Onmjv67G=VJymmpBSAqP`K;$?~MfNAbo9o`w3cC0DAnwt` zygx%bmtT%wcp_Gl0Nws13#prkPiB|IHxE6V`9DnyM09E1mnEZ_-fv6ChCkX{34D6{ zG1cISR+36@HusRU@tG~Qi|5KuR!gzfiLYGB*~GmzK9x*1>stwrQ622Dg`CMul$%F+|^o-IgfYJ3UlPQ&%_T;G=0$*?t5yghRlReV35*Diww zK`ygi<4+r33mv;)TaI@MwWqVqWsC2Vx?NaOw-uwJY?hEQPrYkR9Nmx-d-T0U!F5^r z`^`lBN$#H~L3rvr`4w_>(CE6`64-)m$M_o`5GGC}#))EcYvc`9)-39B{*=$~0c zd3LYzcJq*GhpeBQ*G>vqx*UDs70vzC2|YS~RjDA=e+ZtMz3JW`js)@!Th&+9@R-W3 zxb-ajDclf>)}Lh>0)>7^2Dj~Xqn$8aGTc11hq zY<)Lodhv$OJ+a&hCssmVw)6|M8${_hCO78Q9qE?WJ%_h1YcJl5+dvahD=mKbu5h2%A=tL4 z0e+i=h^%mppnf0}0U&@dfboCOZ-e^3?*CbRNJQ8s;3nYz5By&a-~m8x8Gi8w5U5*- zUk?lNYkn_93;=x#^ScWo0Q+ly00990>qWTzulpDGHv|B`4aElp00T3?_7xw*MR?y( zS5oj)^C9^GF#N@TPXOqz`hDpEus{H8@oqJLvHvkLTwYcT77FXXnZrtm3oHKmyx(mH z0_fL%ugTf|IzT5yF+qTu8Jx4cc5v5YG)_A+yu zU30RYcCvEch!_1v5F+4@oO z+x7f*^Zn9u0sZm2>&Y-RaVpUWB}Fcy(yZU7l$>FTNcQTjLbs8z(5lER3s;rDTx{H| zNuZL*xV>54d}zqrd6=e+6;?=4@!0qlI@ofNIXJo@mmHoU%llEwaX*kzygJ_SeU;4V zzxjaQF8Yyi#bo9CUR;+vWNP?$KMO+}Pu_g>dG5bgT@UNscu%U9I@iNq8K?c38eOLS z%#!<91vlZ__Uz9vHS4|jx?K5Lv~$s!9T7`pi}#wf4Y}dtyvOg6UD75!E5S0_M@tx* zr|ZS>ITD~Rr5N5X?XBv}DG`>mZr*|a(`i;&Qy?rce?f}hyK#9U?B!?GmGGT+f_mgr z`D37|JEx+<++rch&l(b8CLf8q6cla=i^yTI#s!xmQ1Th|bq zc&Bl-&E)ak`w~>xc2O^(Qo9A&)Ktx0bMO1hjxc-d&U~@pSCm$h@cbtP7l%?*P0D)X zK5f?)$H#hn6C=agthbg#x>_6UC$)JEA4X=uhB$Lkx!x9E>3+>{iq2<}WUSG)%Eaa3 zym9W3l+BK2%@guw;;$e3zps-W@Aj$D(HlKeMz3`_e2OpJe?Kp!-=2}#Yo3!@evK?k zYn2I)W|tx|bAB_=KQFTXMsxF?(9M398&JnVzBb(qVAkXuxD>cWcO*9gE(^-O`JTvM z6Ms|+jB1b>=QIm2b-0%P7_momNZY%Tb4~`>P_gAr#NO{Q^>Xw-ZNb<)xs?Y!V;A+DX0vx&CYjW-wl%(PzaecRb`^R`eoocKDA z`n@h{Rc*>;epOHE`}^j!&iReZzFF-YdSAw;uVHuIo~*6Lb|0TepUmp;XV{Wn{iR)3 zig?pCT$OCq{W?iZGcSIH_Df<%r8Q_oLnbv0)EQoaTUS`M6>~&-5##Nwv|hB`*7}Lt z_I#Yh@K~iGB6FV<_PVd=!EZ9LLykGA-tl%<(-Lz`aOAuN*+z>TD4n>LQ%`aDILYc~ z<8Ae`+*GHCnE$#(`N1^uJy65vSh8&cU4!bpi@K!Zy+7r`!cJIB{{Xo!F&2cecm8JJWRK4`R73|)^1Qj0=je_w}dIKqM~1W zHRa4)motgPA<9A;9L0uTf~}DaFAiP-{4i-6{!ocjW&xY{v8TqGN=t8Jv8$j$d$J_q zvhm2`e(KM*bmG&WqtvcRQ=;DY+xVi3`{W`I79ABfBOB%=HlyrRlK74s8}n^H|DRi% z=ltKG&gKf%IANW|0tTFIh3%fS)1lLA;1N( zzD2Q)1x*8{CA?C<>NsSog^3=8|53^KF#RDEf9lQ_n$yl4?s_7zra~2_|-*KyxYjMLffaj{;WRbPa?GR;FG$7jgh=cXZD|3N*dR< ziI(HzXnYP{R#YK{EIf!X&IPj%1&Fcy4TCN zj)cc_GAs|8^NcG&4K19ON0LF|4+5o4)r?)t&p1I+EMV;Pj>SHjbvR^`o((mWTu8~q zajRs@c3#xU5|@0oTZWER)*6%3>Tn_bT`Xnpua=WP6-C@`$Lf^fIkhXjOfKGnIu8fU zwX!fiOKqxHs-tRpKl^7~J-k&*6G6TYhCb&xieI%oj^}X1wLOa(IoP!B5(gq~USF46 zVr&Iw2Wm5&0^^(C$@6{8sozfzM}Wnj{SVDId}?&bZLRF851u(Tad2f*Lt?VC@UtOW z(=%Z`8_OKdgB3gMQFhXwa^2jx%8M>MTQLd@(eSqhDo?=OPg}KP>B~A-mThY-w6Yu< zvVE|O#GWm??pBQL-0wZ}(JB=9;gqMHtm?Zo=GP`O3Okp^D?_pB>$IutUY0v=NEijv zc($_}l~2sA)Oz2)KLWq*S5x_vKKFy(jdG32ASQrA2xxz!$raW_I`LD)TJp;zKYW#Z z?Wooc7RTex+lWxII_t+gLuST&qf$Z8^Pr{My|~GHF-3T2>BK=|A8_;T6nR&DJo)(( zehuF{1)1dJyv+q+ez0VnbboR$X`q|p`Vd<#p_v57Adu&*cE7Myp_l8nv zDQ_Y7(^Z9zbEzy!_eSR+{JI(5;e)rDQ=vF9$(0GQ#RDaqzyN&hZHmpt&rvk;-m#4} z?6TNO-?H4-*LVG>+?OeTW0U!uSuf%$0^0c8*cij!n&-k$`-#`x$2;L=HQsJCSVnv~aN@W)Vhj$80-HF@=!Wc?Kf&EJ}N3u=cQ zfSvp4 z<;Cycvg;3Qt4Fh$+h~^f>BlfD!^wXy0Sqxi6!)T36pH*(_}duDf+G-QCW#>+=?4ehNh%0CahSS{P<2Bea$rM0f3uqG9XG-z+^$4vFt zAa-XB#|-3%HzRFhpnDB#5l1Q$;cAzbm7aD>pwS92DJXj%aI+F)LOH?(c@)VTzvQ<3MR%;l`;Du>gv*Yrcb=bj6R2B-3AN3mXUVR z&$GFkv0ozKWv5zeS~Qqq=I_IP&r1(}8}iGE2^YcCo8cLe$S(5ScRB8KOtnbx#y4SM zA#R109&qiO{Jd}c60IhFYa?8fj>(buQx{o)YaICWU}H@C$Pt)(u|VlvSJ>5_#>56y!~->bCVf0R#zl387sdji?UY~{d!XDyGC!1 zu_C+?hHw?*WEYL4h_MpF#Tg(FLg(#vxtZ^q2hpjyc3qEVwq+~FxttFd+jc*$KF_2t zQ+AdMjp$N2X4kU5H!qdMFQ1W{0pOg?9ZJfQAP+&a+@Efv^xmZks4~Bx|l>HW$T+=+bjk9V1myG#g z1sNf`ZxLHu$5lV6G=LKMQ>C&hpD`3~opzza9q?Vj@b83S3*(^gF(jyCUibc<%ZZ)xv7tQ4rmQ~D< z^T;0L?4pSqL9?pG--JI!zp>zV{eb(5ufyX#?Z-E*y+}>2!Bwo9P$;eMs?RJtmG3Gd131!TeJc*Z6`DG`>bI0rv|?j8oorb}?y;BO z#SUIGnSb^`E;v{FqakM?iTqBCA{ft-xp!(ibwgk;Q0>`JiSlX7m^#_(G178g0#I2l znNx$o37<6vw4;Dqq-OMEYyzn2XMAEWg+;);q04}?CV;d_J?_!vVyJx?(_%87hHfK_ z%#s320r~+3L9S>juBoa!ybCPfwm_OT2g%sz`C9XOnKaxY6|QWK>pez%SKExN}~P@hln4H@@JT`ieU`EdJn z`&taCp8d@4UD`cszrQVb_(2(VA)9tx!a05i7WfVm0q&?=%U)=WW*ZW%lQbj~mws2K z@<*jVCqw-K4WOt0ymegK&x-OW34!sRl4^`KVc5dc8|g|5iaiv-m5Z!0U9r;w)>tsb z03>7VmxBRNY*Vs_3dmk!P-(SJQ0%~~a$GxoN|LH9&?ps3rS{ ziR1SG?qq>X>aWwnQ|pyKgj9UAFSQ+%fAgF!HkL)<1!W zB9QyDP@T2({KONQhG#!_q{mXig|h-5E3v0yDs7j+5+r`1{;Qe%VG1LeM1#Ph z|JiS}&bH@sDaOhdJ1(~MXqI@EUJl-f7Qj0i8|5L1i?>^4rzH0Fn1GtWQ>aQ{sciRq zoNftYR?yE@pzy(im=SZ3TBb@?{PCx-<#F%%~Z$6w!_$Zf#weXLF(d#0-d)wW7 z!0UC0arSaO$R=fOe~EqFIU^g6w>Eu5vq8OKUWki@xk63vT`66^+8wM_Y|9woD#^)K zXBH6pfLC)pvG=nt9egtJMRrI4J+k^_KEbHO>h9(%RZcdCLMDfzb&y0us<0Uky)`6N zS8mBWM+t=u7G|w|dSM$f85hjM)QE?jN1cbu)Z9x#c7qAeQWkgr77TwwAG>Mi{tB3V z-U5X=yThdY(ju=i4L6~x^T*)V^zfwg zA;(^libzI?PV4ZZ&wM%2W2fGjFf$DgLdbu$nCxe4OGOWc{;j@SZ~EzktZD< zRB`C;TY-&GYrwbBMui6LSiMYz0D?s4N0KQehB8^0i$da*;(A17j@Obbpsou!MlBmsHcfxZw4lvW(Rn@fhwaqpC+s+fzbiIc{8@8$Mntu=WXL6s zJ!)+=d)?inYanFr_aRP3E|pck1zeG9X3rtWmx+b)qhE$(#=~%Pfehh-jB}aia->Hq z=6X9h*%SxACwmgNc^@&6Db8+iy3sNZ%P_YDazU<$9S@NAb9oHm_BIYY0X&!x*9sFt zPwtOzwei?mDUnkfwRRdKB@J5?ub7?~k5^wh45BChATdGPiumj4!=9p<@i@ha`bx24 z|17|IKyuT2q`5AhJ^T3Hbu*W82Gt){bJr3jHnH=mMD;vUoALhWd5?EK82^h11lY91 ztDHfK_&E@LE zpB&%(ydwh_00L>rOL2A~#cD|yy?*+x^kaWM4BAecQw?;|WYCeWJZN<*mAo3I@soTS zo$m`&08uV5){6cLRvQK_Y7io`Yn|Pcaz$f~GbUFmB9F%t^F%py=$p>Qr2f9HmHC?C z<8(UyW`uXl;%3%@!qn_?@u75%GM+bLFb1r1qqQ%UuXH*VT-I-=9$zGHl87T(`*RuG zQn?}B7iOk>jAGI_)oI0<8LvdBUmvQ?Y}Q_#9tYMy(?$1B8pS9Zw06AYeQ@v6ZzET? z=hJmbs({{S-sj#)q9Aj%IZy6N+l?#KIsRiO%eN34<5$Fq9WfbJGxz znT(;X+0*_dbwfd4?aIYNDZz%r1MPg)IT#fig^DiGlen7&+&cVTR)_b!`tQl zbdmI5{lSbilkObT?Saa7@q$0~k{KJ;UQscscFZw@Pr(c}h5w6~>EE&VQ9 z;loKQ=Mz>g)VIycCdI6k$|o#=#rnD$FiB*KaB2vS)mF@uNL!}nZ?muOJ8Ao|yzr`aS{xI z<>E=|avWxP7q@8R#1M1_Ex&K11O#RP3J@O^_n_t;(Z)Ve;o*94sjP_POUPTZ31lM* zcTuiPoExTs_sL*&p4Lu+x&kXN(fn1?G8(CuaZd3gVmz{#Hc>i$yVV6Ek_qNlGS_L3 z#cQVmQ^>r63CsJ6bC;xkFYdVxH!is*4kWRPa6>|3V#x)_iD=lifq4=3mb{%H9&$N$ zhkN$jXhwOtts7p1m5cpKDt22r=qg3Kjhpb=JO{8WmcUmEO7Pl@QlC%Gzo5*`DpxKO z4YP5zYTy^gl#*hpGm)Io<60LIfn7E%8%Pimz7|xAHHqqH5J6vQwGuUA2r1!;N9{ZioRUW%D8B^!A zq~4Bu$q_z9*E@=r%$&KGXL?CmFG9_Ti-2@OyPl z>`W7Ti`r;4;89qz0Hv&Uh}KV7~83$#%&6UC!D>96f&#Zz(uK zbTC$NCF8L*6|w;moR1q6@xC!P#HeeWsu3XunK6wOcgFC++8{%57M>)>RLJ1G%&We+ z__l_(KgiiQ^Um2v$b4fIDHvCU|S81b~!J1Zuc3XL#+LJho7s1_*YT1jM$yM$?O8=i3oZX``OhId_$I z&G%o!byqI?k$$8y_RCLbpLtk0F{xE5LifdRWxfJyEz2{@C-lE?~$b1j=uxdJ(5WnP8$#6<(A zkj(>Bz=O;TvNBoFK2Lyp(6Z8?>rZT4lYxj4v zt%SkkC)_h9i$!8my0i)OafL9;eVioQ zwSs*T0busBxs-wJFBgpdhZmh$ay-^3Bvc8oy))G+p$fKy$Y*lI&b(_riJ{}N<%sMl zI$38fY_de|AVVOSdRP)zy-2C9dcH~)pg+M|pv2b4^}$#lPhx8D!7i~T_j1P zo6NQA)p^${GMZ7Uj6L=kNS4o`B1a}f?uZNM-=3UasZFKEhhy~7?{IfO!tl1c?K;zW z=F|3*pQ$`{(tYCo;@K1KQEi_Yb1MZM7eU~NY)ty-x_r}ra~VN) zr5FH<=$<&fWGe?j^AqMcQte*eYX=c~QFiB+PsO32_4no0P~*mO@b_Wuj4i{DLNvCl zV!^Ts7CVPOMXEJD$213g+SrMr#gpY^B&#vw6&>M$Qp#FpDof^&d%W67m^CdhLj!21Zy2^fH$pGd_yuHOw%npxW7pI{?ryyAgv&Fxy?6DaEwx zk&1hN#rs^vdvH=`Mh_OfUl_xBv%ti+#ak3JN75<6fbgC^r%mdTXS{Xaez=__ZPEo; z7&~ZBorEpL2_h&>08c6u%S_0Dlgu2S`GhrfyE1tYltALzY&MG7U1XtoyahjHeocQq zGGm?DFfc5>*hyNCNK~Exg+_o=3>Xq0+^4i@ziwW&g32!pzuP;u*>n=dm_=I}ZU$ zi^LcKnBWsj(pQ2I4qC_ceqp?Lvci^#R56bh!_VzFfY|H=TTByMx+@edaU;Y+kp@-* zF4AI=eDtwpexUOwQ+ImfUeT}n(=W~X%`P*Cwd7nEH$Ed1%2pn6A%%VZgl(xoB6Bb2 zv1|}3JoxC$r^&2z{}yF-GLIKJ7%`GXvP{Z>5>LV%48G#K2XRQnLF07m^8@(_5UPJF zXRqy#O!kKTDeupHfAD3F#R%hDfwyCI#>+(@=c)UQ_?a~bE#Jf+Q$Zc zWkhf9wyrPgo%JLh$~$+DY9~)AJ4l4+sb$3Q55SQI^EOm%Q&S6MXyRn4uDu%un+*g1 zd3jZhuQ!*yL!bG*`E|9i6sJRG9Ch5?WWaiPAtGZAO2Klh54e}Fwi~ZpNmt|H+q{Xp zN?;2cn-P>-Dbyfqx2bA76`|B5jgl3sYfW_s)Yp!d6RS{)C7lIZh@t^oBZbQI*WrvM zP0equIB`4~FWJpk7K3f+rFY#hjLmdGSqnXDvSn9D>d9>kkvN3KEYq5u<|-K?9#Clc zXrY%gn^Z`UU?tdHj23JIF3<bjqze&M1Zs=|4XxQCEhG@PDZ;k(!Mu8({a)=# z*T072m1~Fb{FUbU@7Fs)qHH$}!_+rbRw64ylDs5VHA!f4-D+vn9$Y0-X~M%?Q^w!x zXuH$+xXo-yfsMLB!BV=ZX)x>7Rb?3`IaJn?bS*=l(hX&$t1feIvC@j!MpWK(1}%GR zG8xp3qLFSy3k#{KnejTSs*tL>!@gPTa^;51*f64(>uP(}%}tkgh9zay z8MNKCgzc+VCc7h(c{pV770D`Rwpci3%rzG8|sq5t+d8&2+PyZUVT+oi#G}-TLKf?ak)Q_hvbHs+WTcB*|WFRbOk& z{$T#ne7#m{DT5X}Cj9`5w?R5un2~9Z>t_k~OB>XZM^2R6>u6@~y6Sc#Cr|ZEWWB3H z-h_{#@rAFAZC?qPPUYQZ!gw(ua2v3bO!;!=VZ9qE8)?WD?)CILCfX~jwq-kN-d{?B zSW1*ZV^k+DnVklccmCEqvF9Az}{#>RBFKzA=|ITLuA~j z-oT4uDS!zHvqIb*CWh_18AmJa=Cxe?Z#qe1u42#N2^u`pFlCfi0uzrtpSK++8Zi4a z#~zhvlZ1c9KV;`}k1~;4+f^_NzJnqmptiL9e`e6^k|HIt;JaSObPEr64<)Jfis;uYBmgo>Q# z{(z~CoidM%#H>QrBU^u;?O$EMbc$24#$o9{bobHI_Y_nv6`L%+3;bEePU=UbE>d_! zk${yjNpO@_5?DATuJvjm)Y0gN= zM<-zEvC>iF07IQDbwK=lry{<{AX6*s!@h&Onh|%i@+|q{%CXFBWtr@Cd8QcZ{vzN` zxkyU!_o~j$ytR{6s6#nb2l+D9K?_%hlPiq7hL&UfCPBNsl(@$yltUBB&Y~)za7|17 zyzX4Qk~GhM?Zyt?o}Ix|go?R0O^&`zXdvB3&rBX2J{B!?@ZxH(FQ(hg^tu=maVSkr zyL|F~8h1PF0d-pzU-1r154`AX2Sau-%B*oG|DK}1--!p5CSlU1YAwfte2OK@d>I^{ zb;+%3L#h&{nCK*4O_w>?B<@spSjryAVoGOsDJhP)CmxOm)OcM@S7acZy%_SeakZI~ z%CqG0zc(><8&eIDC?jUeSLWKtc7zfoRh--l2?!zuA((|sToAw0y#8ji8g|%rE`*f< z66JBSwu)QFD$;f`QPE;6P6ta9_f8g%TUx%OvPV`DwcsR!vG@nqjcD0aN)=E7ZcD85 zdW=b9y>rlJxI%UyXUBw0XZ8?t&35OnnN^21WvZ#Olgy1~4Pi>y)j4=PvgL?SgoK1w z5~(;qxF&0>V&QtJ>6F#mCuHOq^R<=|bH+8G5X~*+Yk&33hi7p5eoBEE6RasFSKt)f zX5+%+pFd6AnY-Vq{b1H~+~D0+Bd;5~SVlQ>r=@%#{t)y4m}YW;aFuZrAXp7x>%_@| zhUSz@)TQNfS*Z<+>SjK-9BC_@VQI1^C^*pyBrmLVy2`|B227)Z zlkRrwgC+IQgfns<;44@-yP5r}@05U~wBNxDw}a5$sZCTI&hKccT{>vTo7q8_rnzjf zv9R!ObK=^>)Inn#)8%$P3GIQVx$Y~Aby#*RkzAJVHyC#=W;2hG2Ue>7?cDUmX1rlX z1F?U#*}SI0xQk<|^dv%&>-Q75&`G(J93BA|idR^;vJ)Z}>pG{V#vNfQaLy%G5>Ps; z(h~|F)tX|plQkwdF$a~Bp%uh~78;~PQ#`s=L-7-r8%bk9J#yl?Kfk$yStUFpn_v}s*d`RW*xVjJ_L&JLELh^L)A5t1 z{A*$SZdYTv(jH|EQb&rd-mXRK6d`g+l!VKFu|QJUfMMKB?89EFhR`C@L6;f@!{C~% za9btalRGvt;+mxG+qo5SXqgD%Xs(H+l8R z$JjZQB;bIR8lJJh z!0dRy8A0K>dG@_nRdLs{^BY$S7^|xqPO<`s1w_C%o%XfJ`P3=6W0E6SYbwF3(YgWR z5xrR(`OI(p;U9iw8)c30?Pt^NJwup-5+;>E8FmX0#~MEU;A9dvaf|A&R3Dl;<>I#B zZp5oBx9HuR?Udpb2#}rPKF3vaz!<7{n}peU@l8~fv&ShPh0U4YWbQN4Q)25&47c`q?=3UwneN)2l?C{C*0=_Xu@{RQ!@#n1^4SL%wzhBMQpsVYfd2VvcKm=ya}McSCR{(Flhzrvc_fYHM*XpsgA^HAnR=7|lC5L6qS2 zW^&-PF*@FSH=288KD-)M_LY@ui%Qf`8j=1+Be+;A9Vox}dem6aChskq15wE+yZLnS z;?pj?SK&Xn%~&aEqt6{EOzzf?rgQp_zUp1Ao4edOkdsbVYCCfhK4l)0tWi01S#VkK zwmQhsL^i8C<(b9+pd;}*2mhiHHKX@zRY-bC zJD^Zji>=_2@=84}PFdxNfBHZCVOCeP|BL_~j6Ovfn~A<@CxfXmq&0uiI_e!Au9VVL zf9bokr|z9HP3XIZDf|sJyw*;ENw%xn4%}i`^Mbhb6$O|=d{j&Vo2+z)CwytF5bhrp z#{IxRQAP@mS2DuoSQ~WqA1UW|nHmK^a6CpPJG-4=pBo>WNKZ^fhlekJpw6`euLMb7 zLMKS3S%HlBFBv|-q0ZjKR8fR(y9Y|%A!Bt#0`W}wKu*7Y;Zy%dCcd+l`aiBs-cd;6 zP~E8qZ}^s(Yir}ryzrtoGNGu4+yj-xAI`_ijd*Dxxa#LtK)7PXbXuv3pFBC@Y3prB z70F;U^3asj3+%O&J#D*t;T|(OkHcTkhb2f-$AcEB!FTO08xT>g)Lw~ZQp3RMpm{IN8PvE zwH4>oLyv}uK6g3%lRx>h#~yybf9>L-0;p{Y&}i?`azmC~I#et><%6cNzGxOTE?i~{ z$51!pYYlxHmk=#xB`_kKZ5$7^*Xm?`C-14m*RO}2c5gkl zcRS_VJjX8JzRKY(0FWp;FxJFsQhUgFtE{)wfo+t9ahXHgcOC_HJz7w`+f*FjCY0|D zLm3hvt+}k?7%u)etS@vrv97bp_cUx6Pd>tSxyxK^2dgCJ%bEj6n5_gy5Q2=+Y z@a|z_kAXK1%7*Xi-ZkzV^o&7#K)`&9 zOAhTIOs_WMg+{Uz;4n(5K$av=U$3PLtu!rIcTXt0DHM&r@`uF1GQp24+vN%U3D#3H zrfhgME$k~Xcwx7j-$8n3ufNtgpA@YNKZm#}DL;O9E!8w(7KpDcI{fc3L3@it|q;8mMni))pfk8=HwB*aq)SZ z+E83V*vz|}=3>Ly>Ex~xsF+FIIrX`RGIvHr8_TU$>^8hJ=?c>(3z6MP&8;A5VyijVgiFCU z1eV4?P~M-Z>IkzmtFB;8P$eQ;R*K1(U8wT$)pl|%N(s9+V>6$XhTx;U3*WSvTnnt* z$Ccyb$z}-6<||*pi_eeJ8}0FTR*C&AQsz+Dmgsz&8yA1AJ)(%VPa&ClU02F z+LgL^&6G8ADY!NiK3%-LY1;v7G3$c=Ny7-%qZvN z1>mWXjapbDo|E>JkbkES|=`Ad_PkU}99Xs^!* z8!)sFuH&Iv>v@9$Q4V9uUkHj@ey0^VgE1kya(t5Qn?ipZQ2yX6U%xTI2&phb+ewgZ zpwGet!?tn{yXFuV+%fi;`E^ywXJV!P#*5{nWoMtO?J{-4Y+POhX$ReuQ@?L2vk4|l z!XRUm+_DIvWj@gsj?>RJWBI9XlS7$z5&O&;xf;VE0oKW)L{>V8Lsh2no<-c!9^IG=$fuX3o(D+sb}Nv5yLN z6gSl*_xpeH+>HsQ`d=nkoUHx?V>JX@&hT>OgIx07YH1%ywA`boE0gz5f?S4gce-mE z(=+oi_&o@hWK1RPDe^u8d4MWLcSE80tg=NL>1V`nkuo1x9V(?#*4+(*4R)Zpk7HQJ zO|uCbHdUR007QHb#0u-gTd{Hh3Sy2}-4Oq=i|7tZd(Z%SWJ4G`*{`Y$qKt&z||D6W40TwZQq8xbH@)`)UO@J^;VYGmdbo8Lc*@lS{mS9l3mrVfB9xuDm{*s zt~2F>8TSK~g!dv{?G<)jH`FM%tp{$E+m?6M6YE{YSS~+R)9R&%nn{7xlS=i50v;eV z2_kX1aM4!M)gU0tX_V8I$k_~s_o*_5VN;CNN)}yRDS$GGgOmLh0e6X|MSyx$Us2UQ2%eg}OkM#@@%19fFDpo;=9uh-3m$1~U|c zGe^N9+8qTe{o;T6g?p$MT@EmJ>MmE?ZiUOa`IleCSlWA}`k^1>soS!wJ-#mX72S`K zGMhl`^M_)BnXLv(qA*m_BWkqPP1iS~l}EhpZ)j!&1Hi?q2-C)!n(%a_!oK~xg5=183HM(x!J);Cy666~ptKzM@yc}={- z(ss$_%Atea+k0KsCCV1SmQv%05FB0sIFF^Pj;$0+ko&bgl84atl??(JN+YO@`*G90 z8bs^rA702NSl#<*x+7cqc+o1LV^$x$sq|JlYCf#oQ9Sd&gs#S4`1@n=3Mp?b&709X z>GVu}cDBCQ4#{n%>Gf;lpDtD7 z^KJjFq^2JY4wQ}E&}fuo97HKnhWe3OZB@Os_SdHP&^1qcFRaZw`7<-o`^j z2nPKZ@MJ-0GS&|M2TKq{A&v6RAU-p01Z-b*W34^BM>XDSKwrhh!^0AuAt46y`c4wV zCeJvP+5tx)>vg!G>~hs25J zF~oOihJ&aFtZG*~!QiPmck=nazL`y8f^pskbUC*Q)c z!-V;}opW=+OMf+UVWysLniP(5M#Sq~V~9{nZnU5OrNIiCMCC+i;45>JR`c7)64EQxB=M5VUnS^X|C2h%FTx;XQcbFlrDu-vl zxqT|q$1miypg00Q*W=L2VFLhh)Q~}zyrd@x0#B%7|YPwdvaspN6-oZk(T zmDSX6uzZ48;aeC6BbjG;y&H@4!@It=4RKICB14;M8*kOkjihv~t*i);BA>yzgKcLq z5qEf2_x;#DT2^f2U#wJ;i5LLpA7Rl*StFAZDJ!|>_nf_Cjm&-Hk8c7HH;9q)e*NMI zp+Jv)LQ3AGL|3Td_5tfW!DC?Ky2`@S$2y%pF51HNU#{V}S!Y9n0 z7Eu*JR4&zTTkuH6o!qL764quH_?eJGr4QGJWKqS|3uFjrAk3c`%i*k?)Ns=;8&Mh5O^(a;hEgxYnGPS4d9*Mls_l=w)b z1n~T|Ucs{}CnXDHYQg)FRzR9W$X}O3t!qsNs)xF_--BOmF_Kb&-K8|NP0^K9L7H&H zva)Udl?-=8k!{lMSw-F|+X*cMSS7=;rCp4P-U5|U_b$SupDFE>@meyy zX)FY<$I+NIl|CUM+q zWTpA0Lj>5)1_bt!+0%V=koLo1=d#z z37q2G;!-#NO4aGLwXi;MrBzIu?);0Ro1K=OZ<)HjX%yC#Aj|9uc=7@Gqa}FwCbuuq z9eHSmLfM3D)EM#1i94*(JKT7wQ5uRp(sVZG7c#q8^&D2j!bS~g-4AkvJ7Cmg%-wxv z<(`T1$sm(2=0%3BR(F^n$z>EBkh`ELCx zgW7WQ!MX3uY~yT)lZ6@(bHkY;6U>T&jW9sph4j?D6BHI)nrl3FZqA3D`8JLiR7y6bt?gzw@3CJdxs5FYWH!>kW+>8_{ zNTFURxz0P?^!*smi_>!iu4K|Vwi&ydk*liZl56d9NJi=V9LyseMC=$=oyed3t0WKs zQaP5uJ)%fWI&)9|NqM>BU2Q-(Z7wvgywx@=^QbH8Q5?gNoEb?%UFx=xIXw2my85lB zN8hTAE>%lEXpA~t^Of_)`(f>X)h(4AJT?w_787=C8R!G-IG21tR)aA_E5~Xx$0#=p zrR4*;U;XS!I0z8G#<$mxDlM1=#z1Heg59#BfZoW!L$1!n@CH}9!~4zP_3FfbFmdeD zR)eBd&53jQqvfN;efIS@f&`$v6Dws0yrpy)d=Sr!tZN+CYyQhsvymn(zpzAY%P`n( zW#Ce2u<`pB0(5|7f|VU`MZrfn17M75_P|CwC}J~@pPl@ZKcD@xZ_fv42gYf^&a)?o zo!G>Jp0C0F#R&)~O)5Yu;q+o7BRamBhw#n+Sf}De%julqSAFGm_9HGW2M6cMIvdvt zejK>_T;}o6K?nYfKoY_nMkkR=5>Y}tWW0~xI)3Ppg>w(D)sn&b*l+*(pZ--Xy=JuI z&iIKD<(jai(5uq9BtV$GZ9mwE$VEng;nsy$s^ym#A8NL|J*#DP;TS*>*@c%cG+z1| z+^ZOEn^Nh;xzv6mPOmj6%r(CE;`n9^WbF#Qrdtd*+;uJ23QC>esIE2lnip-eM4Y`Z zsr>O*CZb083!e3^tE~{lghIQ4$g$k?j(g45>W>^Rr&rHytUTwfPnV8U1kfmljq#;+ zfrIbpZ-x+&*$!nANq$1;x66XDZZaC2_J>)4J{SRhq8Sx!fn`D0&IgdPvl1`lI0JQ*UK`10%_qor4;#u(WdUV zE|dAm?JZ~{4}AT#?xoi{_P~BNi{s%&LZjCyon%dW7A_@0PAmLz-T$}KjcWDE4=$eB zU8qE@cq264h47H->pF9k7QEWB-s%~_)mUvc>>t-$J<9*&)sZ;L2fj(3D3N4Q%$R~! zQwP143*iA`O-rRJZa}g){x>tjhx7|?E$Vv7xxu7{Lmz(hq|ppr&4kJ#p?oc2}U***IE-=38- z*xGwG$tIXk8b4Scgj688`uw(N>~_;Byq%#5)4_wU%b$=ieYOCAOZP$!J_&N5KWeO}w zoMO8mfk3|nJ(VnQGGsMa2}5RMg|m8cwt-ijUY+n{(4I zT{?DK$^UWV?89T_J!b3tGb}%2Fn;b$<;&kV|ICH@VykV!2Qnx%Sv~U)9>upGJ)qh< zG`xz^0pr*~MQGImSw{+Kq9Nv3C+CLqrQ5+G+bQEqwJgU(R5ocoqep%oQcsfJ;R<5O&u(&hF&*|H&7|Dy4~g z%FVZGzx&%~Cq|6PyGJKZmdD4u%JIVJUBfSZ_hOb&XYz!i#j?QavYTasGmBlqMt$f~ z_a|7aw6)WLw#RoIWA0u^BS6QT`bLXvE+Nr+Pvpnm6?2UvNWlyhCCbh`_tJvnkeI9R zXNQbV)B@eWtIkyP4MP)7Bu=<@ zV*Kir_QLa(O6sk17u0N(PTg~=bmUlPv2`80;@C&ERW+#U%dZl{MB1bO-B-R|e^Y6^ z5lxPrYAwa}FgvnLafv$)9HC0(O+{=VvZalK^>BA|$@oUK@;SEtP zwVKhaV%|kVCltLPK z>J}SSH>$#NmbN4uIs6aV3BnAZ48sk`NOL!&b4av1N>EaI^i-?QSH5#jyEvnL!b%Qu zOOdkZ(@0EIK3q%UZy-D(7}QgP%M=DCtw4+G2wfp~20~Jgk{A4Fx{VH&OCW}{d|QM7 zq!&>Zdrn}pA_LcNTE57=w^DE=_ zVLe8?Ysj<96VorxRo`sB_??UQ-7{6W!!?rylX5lSKPG-CvNw~F+w9S@ySiMXmMGqg zr~acy$lXfb6Ky*b4+cb1L0BkM_il1B39U>Lmn-Tjv$-tN*v%FAnp!DOeMQ|POo-d* zny(GT?j6TqRkBE_Pe|sQ$=?Q!?*0B^eG8b7c>c!V%M8=Q1Iem_CI#U1(Xnh`d4LXT zNCnDZ2GRe|1TQEQ<_TcLoZmOBZ=b&3->O@?_rnd{|1Lvt0ji=H#|XFrB&F-W=097V z*4k}vWPEJI^KKtUI$hLF#Kp-x4t9AOy>MlE^2Eu>!W6ZjQN#CJ$;`#+_CkG%Y|X*S z@BZdvQ@{8G;KR)M8NJBL*Q>MVl;Rl#FsP!azclU9no(*iU97z~#(siY(5@iuBl}DQ zV(8PU*d7E&xpvNCm^e^WxjWIZ=rYElk%r4!k@|P`3J}C)v*`ZHlWt*bzB;RgJ@245 zGdoi(k_GMw!e`N9tZPO7napq$3$hn`2T^NuD{RBCF6K^ZHg&4SrPw?Z>c!;9hNeVT zZeP$9v2*COqLskt;Sm(vYO9T)vfRyyaY?%&)HqwV`PZW7zg@4@)91c9^Wwj&J@aqA^Zd7FXJ;BO{#C8|O4w+` z7VhW(VvgNpo0P7|RSY1xDQ7U=5!s|$c5pVg{kb1tZA!|zwAYxrr*isUWJZ#i>2r^N zs&e-1qm->W2OJ$>QEr_SbsE7{-{iFGMsHS+-BD5xlAKP;yM!eC;`E>X#+}7dFNNmn zd}fNYW4pefzcg1lSt%WLM(!QI((`A&J3X-!pVA!XkQZ@=-7|Udj*{}kWO^8C!(92W z(OHbm6_{M9H8LuFZg%M5a%4~eR(3VVjdoeEF|>pjQqpDwc#X8?nT|SkLS5UaK_L9h zSqPAEKB>Ra0tvxAEFI9xZfdUh8UKD&cgP`_;e`?>jz21zXrhC^Jdt}^ooaSceu0#uq)n^u8{j-1l z+>_3zN6p(ovhLm1f&J-&r)R?G^c|iPUe_UO+D5)stFI)LlaEkwh;lISb?40m8(Da3 zOnN(_xo5(E ztMwQ3ct`7b?*J9k8u2NblaY%JADhnDu4@BnL9{Q8x~ zqxao2_iv{4;?d5aGI_kDEJcmW3x3e)thdx%uGZQm+XwxqgHKlg8^k3H~2 zX;O?7je+WV-UJcHCzV+NC8v9 z%T`x`tx`WtCcx(A=Ip!5(MmV2pHFwJ8g#i>cFz5EW2WGk_dn#A`LtEFdkcE14p zaRE967G`SLTLu-!lD1rFmrLf1184kjRQHB+h?A)t=BC>q~xe$Q=K_KN0L}7~5j%5gKG_KU^&4&LQ|KL#<4IC6HZ1wD;XTcTsbNi96CatNvhr8f8)=~H5 zBgqdgUHaBD!D6EUDaW+!kzq(%T%mTn%qZea__5li%uFhkB~T$)I`n2Wd3Cn(i%-Pw z$JVtu>yS;ISFKf2_E*f`{B@_~>fgVF!x7ugS6^#nK*vGi;B11W!k?qupf-u$6MCO{ z=#;ZtU0n$puh+dJhvJo{cc26pb>fqi)ozf}jj#Wk^Xhg-7;aS33AJ%64$dZ6$PYBb z$viD!ZYk0gXCiKIT=Rp!{2ENeXfsEleg_5`RdS^7;MXnGM(;c0FGbP1dHSI<-klz4 z!PRIZM-|EDs&G}qi_ z#>gPoYLkZ@i^g=yYGufniIchI$h>2i`feMaJPKiLI)|Lj)i_@&#fBCSaJX|ub}S-b z&fw)JnVpL%ZG{Ghu-#`y-2ZSS84A1UqTN_kUWsOxwf4SY<3L5MI>O7UReiZ`nn->p zFaDc9*4LY*UAg4#ma|xOe=^T8~yg-KbX&uEJKj2EFFY4jhIt1njPfpb87tf-#;C$1g)hmQB!$% zL|jP8-3nr7xMscX2O(5-VY1SJg#$PP+<~=qTe7oC4kYV%MShvV&O$>GZ!c8dUMz)e zXMZW(LysKe(#s2EY7tL@A4ziO>F>^e^*fDPTb=%HHF#t0)Nz*pL)i_5qhFf}Vb1{D z(~72nK<(8kUiVW^KmYinPdxG1qmAkd(94=X@=tB(=1T0ON+}OlQjJ}^Q987ExHS66 z~pzPSj*x*Jc5k#%9WURUgAzIo1d zy|B}S+97c;C=akBjd`*OUfoQFKQ$(`wvsUw-UM?DuTFnI8R0)W?40X0-%aa3YC5*l z{z*jDP^!8$xT(eQ@sm@!ZjK(YDt7_MvnVvcudJMh+)ri`I7GrwD?57VbNY6!>t?w! z^Lo`p75_cOKB5xH8v9&xO|SnbXqP7zC(g7_JOXLnIDC{v3aW{$j=nt^If7Z%31%Q; z0*IzVI@L6=N@|Vp(v@bzvS%r-9Im*3?=Cut$*eUP$ zlyk>aZqxBoh{mI}8foN_U?mruP(ked<>q&hJdwB#-=^ zFKBx~XPT@3_BnfDLAwp7Db}tjUum^&A&S-4I#87F(kro%K}I<~r@FRtlL0wKFphtEdPLXq*O#+vrA=8Bdd()HbjHE7_R za|qi~z8ytxHlpS5(kl&^D!|3luQlh|>7|vNKj^-gsNv3|a|_WkFI}4daTLCr#7m*c zu4=}OJ>~Y{@uSDbh7XZ($>%mg|Bc4wH|O^cY*XjTiszY^&9tyE6BMUwW)|**A8V&Ygd;hSal;+sT>`=osRR z1h~?@WorkEiN2$h5kI&z)SeW$%{WK)rj(zo8g{7J7w6{n9S&LB9@9_4gfh$b0(+oy zW~4N7IIn!r3E^#(Cnt}Ob+5L9*K6!`DLxy3OeyOoF-(+E;MqU-N~C@2m!dRZzt;Bd zf3&HbtnD3%4v(bNp*WgIvg>MzT5=k=KqN8{qP{SG2ZB-8h3)2F=`1vAv$fgFo%yRt zeNAl+x-G?_4OTqpBFopjOuQLv$^^HAwb+=eHwO&k2){k09aObAuv>i``ireVRejHO^JDPiH0T+MH` zB4WFwd9^K#I0%tZ`H)f#Xz`(=7gocK2mVf(;uWsK!TM*!I`?)j(n||VR7^{f(cBFg zShdy~s1(Q7lnd8~O2jTxNys_Xu79k~Y@0co33ihXOtWArFVjVZFJ&dL1b(F}83pOlQQ6 zmK%9@JS~oONIBD(hdWt9RY9x1^0nbzX5+6KX=QBDa3==p>T5KdO^Wn^paMVetAFuS_xw3w zRM5K%(L7aYL%hmDZA2fzHS1UWnd&@ZiLUFSuj!VAyj}O(U;NL$a{0CT7zLJLw|Hb6 ztp7{@&!-?Mjy-tBEfS$cum!jo5kSu{S7}a(4yC|^A40BRdr$rAr>E|Hm^(rfPQ;HF z>LQjOM$o7{q|YO2cBcO1ThaLEp0dZjGW{!Ge)_}{PgJ|VJLmg=z7!XrvkbV*dxC{B zv_*huS~&FT{(Scc!3OpGzH8A0wT;lIfVE(ys!~PtuVA@%j^U@w`$>I)JOxLfRjCXo zL0~N=m9|~2x1TO3Us{;q&9^34awvW5IP1qMk8E}&VU#^?V9PKyX`#X_l5xtU425>U z%cSj@0J;5lkqwtYo)S)it)i|;RWT``trdXGp9pgciYlE&v(L#I<)KH)Z=tMNTD4wB zEfFz(*8jU0#$)LqjXegpo)S@n%JEhIY4ywxpL@ z#S}S9`UquJg|tXu;W7pp&MZ2U%qSy+0K*B!-?!3g#jd-mZ_{!`bj)oUW{7VH0|MG! zz=SI8j%ZCIEll$ot)a~PPcuPFdDc+AqO@HEA`_UtguVM8NubSsAl!LAO?rgmwuwAb z`0#@hBE`3ER9_YVj_m9ce}AHVEsR#u`kQUIcI1?Ru%%(C(Ab$Id5BukAmtH)Y!u6G zAMxO}37|853Pf(T>zfqgQLiAzmM@ADfJ)3ECfANTWJsFj1NP)tneHsOj^6EMngOat zK4{f}wCZms7Z#I6b@-n>Tbusd;Nsu-)3tV}9c@ED-yu?P{?&kbINL55@Y)%597d!7 zGnQ_&CKP`s4IVhbChPw3bJN;^3HQiIB>Cx5?X?BGnB3+Dx)>1ZkQ5PBORjk{#SGEs zOI%Upj5brDc5JGp{qFNGyx0lDqn_vNm7ZC~L9MwKcQ*|RNcKuz)9Xb@BQ%H zL|lJhdpvnSEpi|ZDOAyz$0uVvo*1kutOYZbq1b$*My;D)cHq{e>-C5B1zONrj7y!N zVHw|nq_p0&(+#*pM+ftT#Lu;A_GVn(XGcGZE<8J5OLJch{Du9-xIuj94E99W43ubh!Q3g}5kE4`on>Nc={rH4u?d?~3TLGVt4IZUj(|Au z5x79tZY6Fkwx9oB&%HRC{@J%`wMFgR%Nx_xd~IdqLdyvUPvsp?-8Zb>c1k@^iQ?<+ zYwd0rwifH&9TPA5-ei_VZ<4=yW1k(+i3OUVX^ z{eir<4Srm6Vpp7Bjv8yF_5l6T@)TA~F3+maiNfZHx;jpS5-O2?JlA?Yi^{Z60Q+&e)UZf#Son58$r#0> z!s7xP5gCJQeY}Hbo|4%24wu6f<;B0A3FCP5QxnmyheETom^zJj)eT5;hli;O$|J_N zuA{__6dTUGy#r4C24xEb6T#A|xl5yzTN%hvs40bq135upkWQrlTuWbk@tG(7(Qo;X z)CVk!5M`Gcz7*&O1;}+H@mtv zx936EAF+tR7~$D6I-`byGxvni|^65~>MA|0Nk(lUDxw1~`~6kdut3aPQyRUaJ)O30ND z5>OtL5~wI5QtG`Mq0yAAMARdC`vG#iacF0^m6+fxgBjyxLKfnkH;YCtyYaA)i<5gM?A}5xv(Q%Ui zK89@>Ej7RNrT@JBUSfMA3s+ks2V7c?HLf(^HmnkYyRJxFEhjkXRKT(;&COo(a!ov) z^;OA&N+|;pLOBdWB%+FX{f*kGdnQ~`oP&tGkStfItunW_E5!}*6%t)aXYB3WIK5tv(>e6n1_5tVEK0m?&tHog$gnAC3AV`9&Z##p za0tb%M)c-9j59;BIBIk)@qYCY^J?(eiaGH*Y|Ajcw{&44cz%&=63*2AY=Wg0meLiD zNh-CNY^W#U+0Rabkj0TYGh53l`AHpiC~K!oBaE+8rzNa&CX?IS8TsicMnG!$@AZx1^H@Sseb+G=fJ$ncMOY|>JE`j5QREsl388r zvUV4*RN29qhasj$BdaF5v^m;U5>upWA>Q}M@k(>A8w@HJeiY=?)lq8C7N1Y&E?93z z^;|$P6#1Kw#b=q(HpF+G?ha>Us5ARUXdd8p=A5$g;^o4 zl<}39dD1~%saF$~7ajT>xsZ3GE>y0|)iV!_z^$|>5&Ls^j`5{^g<$6?do9Q>Hyr1v zzO%C0@PU0ol>)UEqGr`s*g{RT=G>KpOkcFO1XG@C4z7Vbl15RLA+vU^{^+lsE~%y; z)UI!oRa)99bt2z4Y<<|2dO+eYB^|;`^m~2AW3~? z7S?)sY(jxA@PkHYt@p?CRoTI?Dk&e82_B&FZGvzWae%1+O2!X=W+dyMnO5g!CQgnv zg9aK87~bpe^EuQGCsk@C*chmh_LXl$O;t`=k#OLFH%_Pznj%G4aCgDFIGWMBlwcZx zT3HR-MCA^=1`+`pp2;?mB=BqV$#Q_L_KqC$wj02|r`G%q>ScFN=3tL(lHh_pEe;M9 zm;y^@%C=%T`*o_>LBVG-uc%JPYdy3D)8slz&e64cc@xz%$2b7~(4`0roDiwHsWcqF zV&xhX-@75J%HBNK*5ZQV^hlBQM4D+pDDvLD-il>Oz zIq_1*8A_a8h$gGrE(0YS${~SINKu-t;56CfwK6vZ#KGbhvli$ zg6|GWtJG+ztGrG zI!qI;O0_CYIYez9xavmZnXO_hF>l#h$~iBzBl!ko2!+3*ODNn9y11;;f-DO$rBjW( zMEYH3;eXPt*Jr-@bp7IVw0N1sDon~uHb8<=%J-ywLcascEe{FAGju}Y*NmWzh(C-r zQOKo93Fw3C%~$6MVe8GFujuW9_1Nbhn<`IvBbKk(ZNrtmI9Hx)fAcGD?b)Xubk7#r zlgjLPI$cTW>O~t_NMagF`!ZbpcCevOH!%sp4R`+HWhri=JE0Eus%~{4g6VDAupG4g zBVN_0%v)2lw%7gSm^(Hp@n84zL!raT;vP+_@1aTs8^6EZ zqrF*Dpf8OlVy?V1b40@$Tqi#WT0$9vYAIh)x7~pH+UH~)r1&gzOxVGoi~~;Qp(O4B zyIP%R59wxM`uo+hkDdx+Qojy3uz-trPl;Y%Bvk;>M;d4M-Dt_^Q3}?VdBrM-rn}gF zm_O{YzPPHs4T`E%Lla#geZoUdH8KzuwM6ZBEr(Oqcx5(tqaIupM545Ly|>nl%j4?t zQ~pXm!d(zYJr^yt%$*!AnVvco>*CRGi9%yDaEK@d7c@;r>JK?SX)8{>CRJSdeWlJi zvKR#4&fIHZesA$oqSThsL+h>1|MG?L_1c$y@AvRCqJ=sQVa}eW-?B^7)<%osh`d%T zpuKY0C_`+W&WXpyLuz<8>*I%O6~t3kl=@l}k4)Cx@eZqa9qX!i zca0{4R_m>c?zT1*Nx-;nWV@Bqap6#-*(mIRMj01&PMQNw`>g~rrASGyQwJ-W5wHFz z@di!T7G#aOB=!p~p>tT+0o05WJtI%leY=SsZ8)GlzZ7Q0XCmp}*O?MdmT-cxw7`n! zj4X#2{-!qf!^Otc_|LvE_tJM4&YiD4`h*(+on{I}Z3L^Hu6Y`rCwC1t)_ z^}z%fB{##$Mbt==i99pgWX$z-!izO(Q}Lh?=VZZ1WB783Km&E&#IMbTOHE@CbqhFI zihkF9tDl&R50AE2gjTRY?|IP3Zdcub`i`ute#}M)E2@R!rsaCnJWAOvX=w$;R2(;a zt|V-37`fs;Ev?Na|8CmZq}8iZBg9(sCX8JBfBCI1l#^1q^o=Fu%s=^O;}1^U_u1d3 zaHjs9ryswoG;wG7FJG<)Yow(W>sUFsT!-*+>d{BapMTUl`$z&nu@HD8Kr7`au2o7K z&VZY2mi&DsfA0v2_?FsG*IUO995V}EXL&Y_>PV7>*Mk(s*?KA5F;RbewQyfg^g7r#2WC(?)V-e>>wiC=osC4IMZ z1Cj5em62T7D767ep5@K!hjyAe30O5#~!L&&C_ll$*-L4byH8 z6fm?-as1TXr_2xN>o{wr>FD0kWJxvN?3i!0j2*}YA$kY-B2s)(1Dx-=u+AX_(sde)Q;jON1cHB zGp0w}9f_>A+Sg+}Z#r2hY6%-&N_hKHSuzvM@#_1`#)j0_0;-UR-bLBFfS2Vx2oR|T zy`{FLO}|C0F!RGb)Bh~Mv04gjl!fqIAOx=K=0G7Pi=6elkgse9Z#}N3P`CQM5Ja6y zDjIPt%#t35P~#faFF!g_GP-F=uSIF&N`ylb*Pr)F*4MsYw{Dv}dp|7^2)^)yj1OC|zD#3FeKp@}Tt?Nz)jG67wXuIJYdjP5iX?;bra3H0Nr_G$)rvB~Boh&9vSGVX*lB7F zuq!z3LmEa2+z<_rFbctW&B0uJwb@;$Bm6@>t~QAAcO>(a9lcv$Qt{R=ut*>PNlP0v zdsu#bz8Dv#*-a`w!uGJOSMDEP++RwZ@y6feN=ui=&GhWU4?p+Um!N1pa?deDUaCV@ z2|+TTwcf_!OXox#+;T3w;ZtFsTM7T@|MN%HrRu-<{eL!@nC`o3d89JkYIyrS<%9FE zwbM=4tRU4HL2f;h7Z6mcfdhrL((qr`0G0%+S>6SYDLC#z5Ajp@zM}9)6A@=<}Ul|3ymzBl(oo$J};gj&EiOnul9NfZRfjR`Y)&45wt@nUyye3i6%`!$>=5> zpT3D-{7;{ZsA`}=G_Ry>WM9ugzQkS5YDqalXlxchPL+Pyq>S2uv}WV5&6*!?xx{#< zy@=l<%s>ysanI7zt{*GjgJ%dyP(r4?1^1M`RUn`9-ZkDI)3UmMTxp)f0E}^Y=eFX=v@*mzC<*&)(0f?MxD_7CZ=R_}%FK6^;i~`T#`N!`G*+GQ@N8+_ z+^x_lx;ppl3;+GstN+?p+9Z(9=pmT5GShy_Z_a!6q~G%VkkW>+pirqx+i!XfN;|IM zUpuROdie5U*Z#G!;)5qCzc_dC>4Z+`Bt#weX?mL}%GjMnYMwCWZL&*6j^j4fYtrvI zb`|usx=FiA|M+O~lhTg1pG`U=Qs8LUAbBfmT+z1axgnLr*O>>#lfh&)i5owxjeTmA z!yH^%q&V_9lB8^-3*W1XCi4e5dpqiKY*VU?q@@n-I2~WW^M3c&r$#+{yy8sUVOLyR zWZh)#CF*-3hK7+KkHq@0_lWQfHMlm%H4xZZj&&`W0mLM(wPB290j?zB#90uH1aZwo zgN|ZE5;6j!3B)Y`nIJaOB}wMGUo=JiV1d88tB`TlG5=U;dZ12|5y$kxU4&#N;_X?4x^PMqqjsIBi$pIT}i zP2%Y!S@6cK^2mMnJ)k+I4X(#@%v}Y1y}4KF=e~21Y9kzYxJ@KH8Z94f5JHWaOSSr| zjplOKv0O9n`PYK#k6!Go`1m5LD-;IDUp;p&-n$X~czU!nip|e0Cyyn@IPJaOXtMP3 zYo@h^AR6gL=^Bdjkt|cng_Fesq^Y#?hx5e2AJ!4|Q^NiHFZ)kguhQX^jYx_(>x{@R zB^k`TFcn)0EFhhdLCz+Le?RtaX)<|)&hy=hQFoPjTbZ#HzDa1>#u*_&Th_`}I{MNd zJ@b)-SeteJ)3eqZl{?2s<@TG2-w1a_qD?&Lwok88Vrt2chAf7tpPc7kdi;reXI3fM z|5u0reaV<4Di-aC7(8gtzg(sJC=EZyKQT;0n#l)G@>ANwq2M9TEHr|Z?~WW}Aj zciek$s`$xCx);lpagTA=)hczVrHoMDxtwZ2dCVI*NmUX}Z?jMsr`?KFxBb40Dg;fs zpF5vC_nr3a99xmMXk(nE9iiq$)>xu>h`-SKoI)%LC!sa~HbjNud|0KLkjm_nWy^0+ zhFDQny zWiqlBm%;`y$ape;T@266NV=c87;{qih?2S5Psjam1p zdXSdtf?sC%%@&N)U%c`oF=y1Bdhn!xDsaTwJ~#QqBU4^UIx51F$6kWlRDVzp;=nsG zRyo33aSpW=n;ynqkIN8GUE0k>MC}D>9qS)-yT34{QPPx@_}8R%fEjx9EEq^sKIR#4CCguD?!?Z<>r7U5<@O%?6)Q zJX&N^Vy7YPBa^}k7j0poB=q8`&z}?a3=_W9S=9Dh{<(|O z^NYTZUSie@TDTkqq>+kv5XeOf$RI31y=yTOS~M~lm51q<37S+i5H{kl@6mm;*QMxE zE<^f9N{>jo<&M>_c=fu~i@75_o6EctTr>AhM3cJH)#>NHb#D566-q24E3N3Gs1id3 zk#4rE@@_E`#pjQ0#l=a|aMQ#VMhji(M=A|b$YT^7*Kw7l6jofZA@UA#5?trdU7=&%m3TcLEOlx>reop; zLqp_K{lN?=_dZ2LtVX6T5?m<#@T9TGH5noTGg8Yygq^iO zPH-ZW0W>}nQ_nj^-Vr=I5RJEWN*6@dl}=|)q#hdBK)`<^HT5u<(vahGpQ+OtSIZNU z?De`q+`1NCilf?4+dQsEI}{j_*J=7jzHBI_9Rpf!&X5xA)V|h=Zcea`aEZ1_Yddm+ zah?LK0k&{FarX$dfysut_+ym#G-XF#+m4iD`s6Q9Am+pMoO|gaUK%u6!Lc%OG!NuV z1(v3Yd_6vUH<3^W8GK92*}BnLRsb6PPM9+sOSV^{7hcOTpAg z^T7uiAXJkcW-(l&0jW*BnRVWpxU2(7Mk2T#5i~Eg^!Ha?8X6J5$-M~5c5{M7_ zJFrZQ1NYQd!6ZO?ZTC2>G=3V4^EX2dSSgmu3D;fB7_j*PHW-H zmHKRpCb(X*(KzN!pikLZi`xrTs7CM~%vg^%#LKlQ zM65apda-Zol!g}K6^Xx+mEfL2sj}j#b2aCUS?g6lUp^hZ_3GpIO?>r=>YL8S+tt#M zk-&6wN6YGiXYBv@S4)qKpL%>Gzc-8zkRnQweX4y}wW)x1jWYj^l>Yb!em_hS-=lwG zWj~6aBDPo3sEDQG%=qn)0&r?eq#?TW3(f}Z<{>Rvf)5`z8G3SLVrisu8X<&;5DQqa zO^-U4*1(egMM5v@o!xiMgso+{2coCx(~eMSro)dnBE@|D73l5RvQ6&edn1d2asvv}d&DaaIz`zUFA zdJ3-xslSdb#KIrfW{%4a=yOd8K?4l6Cn ziV^5DC)+a%967(Tp~-wGsV?_LrUQhF@g-*>UK9?IoI;k&3JM!p!)o|N*%PvJH*;|M zZLhP_KC#-7?su$e4Wi-j<+#$Ot4~p=ll`+F?GcIOM2o{m{X@E>Q<~3@()mKx0v+PL z`=3mZ?WPt%p(%S}(`kw>+2X(8#N*4Ln#qf7i{o7U=cs-0Y5zM0uPqYE@bTuJJeQBvb@(Vd+TdfN}*KSB45^aJPl7iP)j(ifqi6GLMUVem*G3oQ$u z0GIvjeWfnP5h~kcu@qMnc43Db$jTR3Ph!$JwxyjB+(LraoWopm>ci8Mjtk&21lFP~ zqwgNa*PQk2Qe17;yIrn~K4C+xQ z_uThhz3^Jw-o0PaP(umSKKsD_iF+s9+r0AeadpUg>4g{DZ!Wg|hIiPLQVvTed7$k? z7%wsn2rbf_M5Iaq?*N0NdZ}ps_OCjnT`|>Yr5(08=%C(&PC#y;fDESdz*sVJtQxts zYaaDoN>VN5=wlRm2PrRh47!9a)A=cV@w=Vr+2q_@^TqFn(?5)>ucdQW(%CoCYM@+v z8BW%qqGk=ErFd7g53w7<@6~s*aN~RK9;LL6#94E(30)My-RLL2ZKjWYc0xfOUe%_* zSG9*q_6}QMNRj-Ogaap{6rW{I*3_M(2I50-qTS(^FcaU5u-{vUS zC;N`$Gk6xN>}iwu#}} zZQDB3xvr#dfGvi@(9k8p#oKktmEr5_QTk>GUSt<+YPujM3p5clIMu)SSv?=M+(E^b zPNxXdxOo%hJ*S(tOOHJATsx^J$NV)<;ZB#&o2!tu^Uglf6{1bnU1`!4vAzT=&%ukX zujq}~Zf?3kVm97ko!AhhZYbULdl#b6plz5#E^1Be1}zOwjg12K<4!d$*O-RryRj4 zgdA#!+_*cX5LwDPIO5g?EfLvg+_oXfSBeB0eH5h<4zd+R*wonD<-K7?8~*;OS6rI`l)+QU0<#j_j}b^`>Wr0kzU17!uX`6L)Nhq_hG%! zfT1;-NdgC(fnlMg3q>yLNq0HgSXphnR~pPdo^w)DX^rU zGeVj%>vuq-(3M@(NSf+yJ!1MkxSk(c^%rhR8FG+i4Wc0r&_jqQl3inOMyLMHC=#6z zN+_fz-J@)yz@|x0*6VTjYP}x4uYkireImUptvjA{DcOlNAsTTk0!x)Ed^PO~N z*{p9KMZlW;V!9N2gXyqmovK*FhcjhrGE>*c*fpTxiL@OaKdt(NstIFqLy$up-gE2su+=eFDNzTEU%9Q&P>X0!<#I!uv3+a?vAvRBE0D*47ditl}`N{|K# zF=2AA(hHdSV7k{JiaK@QBy4gtMS-d(M#d32J$3*1v9eb#AG7xr&E58;*XmhkbX__E zZ817{OK81-DCCNgGbdOfCgJ&F>UN;>LG^<89(5k5nC1P3SCoj2chENwLrhCH{di;( zQv=aqj3`IQ1o^pQjF`k5??kKb(-SFANkk5c=XL}kVlb?d=N%iFI93@i9U68~Za9v7 zl{5YeQ>Q=oL<_)c4OPlRqsP6+pLpEab~(LTLp2%_U~`)hYlogYKOd{kFcM*scv7O^ z%EcF+rR=akCVOr5tKU3#;g$9V^v4qqNZ++xW^*N3TtO!J3}wvlTin|!sL{bbFgR`? zXJDTSE=hm(v&)uXU!o%_&3##uydY02By}Z>0w2yZr^%&j7k}&5&&HI{ZA9uWM+Q@a zwXJrxr_*nYZtNUO)&f)Y5s`#GmfIXAXaH5fn~+LU_>^IuUZJUMl$GJ3o)e4G7+Uw#D54`rJ^J3F1O zN0qxKW`7h<|8S0@%cM@NSQ@+cG+jq12>#;#@TZ5y9&LR9pJt+d6*+^@KIqjWGkZ87?dtEixom&XT1s2mQO@oXb9d=r26Mm@J6W zKKma&%!>P|?8W9F?G&-Ik|OEGjiB^gMu$d#vhPdNnF(#qwyy z9(8laEb4S+7^J9~V>^qK1eVUaPO58x@Dy2#>*<-#j8VNJNu{=*?ipj9A*w8Dl$619 z=I4{vTlN3$Q9TA=dNXK6Ia(B_us)FHfV_kN#X5`*rF6hPduD3lxN+2?gMBly+?gwC z_m+dx0@pztSGN_hFVY%%`!t zM`q{ii8Y)*d@63vGTBbK(rCkTQOad+BZ*ru(G{BxU(5l8Gg7}iL>4|pg%(GF<_alI zuqm@(DNv?7NG2FQN}j}PY2QXlM8N351?5kuxzzpc_fRmeqtO*!@*Ccur z9VhY(aWgj%Y6kv8O&KgprARJGx6{6SHQuDSA=i2}qs^-O&m=pPUEN zjNDVs@oP1$w_5Izap-V3Vz@9klen)TqH3?vdksEp79B~Wsy2~pK(P~^hcHBW1 zz<+(g+9eu2B;X)HbJE~@0m+RIG)MNuwQs+eY>GgzX{en>EZy*WiZc+OJYIP8ff0|I zS{$@Z)sJmTdyxn3_R_h_)Qu`*e|Kv1)8+X6pj)qLn>iTK&BAD_JgFQ%l{4&^>J7tb zTxJSiJixuKGkzM(U%g{g`jNJ3lpV08saFRU z(bhN=#Z3X-qX+|DEM+^uIq6zs^w)k{aVGuH_K!|RJ5Qy7ozqJ7U5{x+DZ<$Z()LOe zh)#f_NiVRJ2KCLz&nK%8Z@NT=YnltCYqhE6@{JxmM$28?AQZyYX??HXb)_hk4Z=;P zh5{)dg3Zi;G?(abe|`3EtFK;Oti9T#t<>z_)Z1aFb+xs+(u0tIfTfh6@ebRChbA(2 z5~xV~BHD;#h*Nyu10!>b;pr1oE-J1=V6Au-Y5?v{mY&{jLa>*u97;cR!`>?lg{%gU zS*K7+=pO>9t%VJsbDq3TsGYHX-p8iN+L$T@-X4zBt~%%ji0~VBnnRx-qH^=(3Gd;1 zJ@24w4Cz}Irv6XD)z~0-2w_u@{Tzf_gDb8dD~(X2;Ouc~FVE9o6q!3r3hZLeQ(Q3d z^#E?A{)Jk|RpIz4Il?NZSjrQ{;S#=&{2MKB1m1D5EUIDewCx@FqqmJDJ4*gFV*U!2 zj}jH6gM>m(`5T@mjpf!;CpAz1<`<(C<4~dEhj=sNakM`gbfY1Tm}GIO-F%zmQ4e`= zku9Uy!4iTbO_McBFiAZoeSj$1rvnrwD?!^UD+^`83H3?|zQ+zmMydFSBBd+h>odXT z0EeTh?Y82z>kNedRwrIXAdY*>ce|^RNRvuo5qcePVxXo<_ewIvf51mx6|l0!sNt_I}32$2hx-U_1L&dS7@f1FY+cf7109!GsG zYy3lnpY(CZBBAtl^pS^25AbptdC^#fLIU?W-UHDZ=^2X(~+xpUHS@v0HWr;2ETfEQ1{k$|Gl|&|1tv8;uh1 zI~sVBO_rXCId&0qOe4^IN+)-Y2xf(M$|?#oK%a270MJ1zf*WCyKy}Rb!+&oadv@wX znY0N+;>Oh^9#jzxY+dWd)P_){xFqw$sPR$3a!7^k#+u@CUXm4|b@N)%S|^9B19gUhDQfx%0aoAlMblZ5~>6t zA{Sk0Dk=6>R_j^*7BCRMz7Zm}2iG#Ojv)FhNeCgwlj*s3p(uv8J8?6?M zTcb|@bwl(0>xphqXoO3wtb}^6Bc0rU#oKeexqt~q~}6$(N3<)Gx0X3NB>nU&z&xDGea12WoVosElB(P2%{p_$iU|@n~uK4sRslK|9?#QQ| zj{h1Ohy)QK5_aj;OW}`Zsp@yZ8FJ?^4bAuM7MZwAfEqx+SZSmv@zBjgdfjKGg3^Rb z;^WFdZSoGg{z|jHlvi$Z=-yR2P%a&@`duRYAi4A-pC)Q7Urv*7F_;{twpg;6)Rp5c zI{S3$mry|ff3{J1Ph-z35H>VkZxHMgLNm%77g-fE0-SkKE&#hAx@AG*4M0`}92McI z>r#cx9;dzmy7Oj~TdMuz&p$SC_e68C?xJQj;N+67p={7rAVlf#>J@8$aq6>=jGjIf zuE%BiVJyyQKpH!e&Qb&4SUPG+k1cY=Objs&4UlQd)Nx*`5tZfkx#wU$^U=5w*p6%M z@@98pFnz!?EB1!xSWulIrv^XBcCcDR!h!e5yl5oDX}KY5$Lg+R)dK51v{)rOgvSUE zUhNSd35%Tx#ze~jOj!!~S6+jYCDc@)J88KrK~ws~7bZ;l>_XSwjOM=i%*1UTAiMV3 zdGsS(qwDUDCJw}7yHn3jOZ%N;BNc6ZVIyB?zmrn*kz5m)6r__ywn67Gav|@*alk&~ zpGzpoM?dbR#z0hiBkC50kNyXfgf0f~B&0(cC;?Q{G|Bm5voG2p4te#FOu05@hCv`zQ7xv zt$+ZMF5z$19#_X2Eq6xl97O?d_*3I3G(gxR=B6MEf1tP0LJ@P~!G})&(&K2f$M1AT z*TQ7sqWvjnw!0`f7|{ylUt#-ZrvUh6#+iXxC*|Q*P0f)D3yD<#9OL*{7@r!7Ckv`u z-cSoYW4E3R!QXEC^Het6^rACBRp71x8!!vEiTDRVSf?{CwmK^!P2R=zAP5n`BRW|U znBwx_9SF84B`LDh_`+x)b|<5fCTE|RSbPnbhXTGpf6M>J|KO1cPqp8inYhob99FzN zamk46T?s4#-VKQ>-=qtPo}+0y2oQuLG4K}Aeu&y2HUFyuWP4PDk$ZWJ?=U4SGqZ=w${SsjT|~2d#u%W z6aUS~LU9v3fy1B3bTg^k=AHZN^TfV%V3NsWlxQKz(2LnXlTrF9$Zwc{KHXEaA_N7O zsy7&)Fs&|EPu(+#Y;%+&S5=xiUOIZLM1^<>Fz24}hdz7S`{XFTR{Snyu#Wv&baYTd zRj;w>#u20xZ*_fvT_QA0Vht7+t(G`3KEOsQbpJqZGuds&J5i(y-~mky8dEglIG`s7 zd+`v=oP4a=7p`;~^C;a>X0!KkAOJCX{0F!LF;cao8J(QA(QbFSTG0O4H+|sT+lt~qo8@WmAAOkbz;%&%y0h?g7NbjU6-a&rP28}v#N8Kd<$Xa?|*m&rm zSu*PCNu;WCHc%y|&hRe07S}H~Z=ub~hLFTupJdu)c5q%%>O@dT@I-R{!e^sSLUG0p}2dw&A#c zx}u<(yd{NUXh8``Pg)he6r2T~TyJ)vG=YRomT4Ly z6~>VBYYQ&NEp8-c&hu+tRG!wn!}{t67RYl_^7i9JG_?!{`^ya{xo}<%0&VM zE?e?Jk*{@FxzXtrvxG`JAeet+N z(JTm(Cx7t?nJlmy{$*>ac9r5_r!wRBpb)hIq@;93;$UfQN3d%mb0N|ma7Rex=A*Y8 zBPA8V+2O;MyW4!|-qEqUN)J7Fg05H-Cq^btl)c+ZtyTkukG;DfV(<7oQq3p5Km{)2 zBGcsY&rHD9!6$3JQk%M`ywD7t+fGnDXCTvL8R4>z6fq-1-;zcv@eUHr)B8rHQlY&= zi59D0sEh`$P@IW6>QOR{@Y-W^lUiN6S)+h%?uS@raxOk_H$kV;09@PD&`)lo?XyD- zIU^CnN1)+tiH6Zc;yh!Zg5_vteugOD+kXr+O4*k4ulmPs8}9a!+K-#hoS$v3C;&@9 zw7;gcA2A+lATEK3EYl4&M;5@OW*qAFPr}v@YSBU?YPG}<9k6jK0j2S`jUmU3q`f#& z4bbj@N+=pWHatvtO^q@|&oVwhG}3Pi52hbyAQnv(B!uLS07ueY;ry?oS#kJqs8h5 zexn>S!k&--6hDh}AuH&yhbG8hlAiA@2A-R51Yw~x!c!2X(F@vF{>2~1-PZW0CTK9= z9wf&=Zxga;Y5A_wcmCb^aZ5Y8(joSrd$XgJCqO-;56Ch>p+yRbb*-2sD0s5^Iq)c8 zY@+p>M}ja#(>BB_6ZjL&A$%zD=m}mIueDc~NNe)xt;xG5(d)Bzy2RGG?fU%pXW*R- z-}9*AjMQk=^CO?g*mVr=4!2wx{lowEE1j!hd@V*D%pO3`LL^E0ltKXyq#sI}!(k-$R&s;jN~&!*C18s?pR$$#3JyS*pcR8H_^QH4IqSE)$U(W#^m5vPKz2mpY)|6UmRD75W5s%6b5HC6wqld(P z5O7=CAFy8}+)qS$pBh~<8FB9&Y)Mxea88|gVEnFAl_Q4oX4Q!5_7P$qtr4fyLATDi z8^@)c(j*<$dE?Stb_Q=94B7FJJ+@8@sH_E{l!_-zG2y|jQX+_3;uOSEF_s@Gg0{?tUvmM3kn`wCoU{$h9!4Qgo{H=C7b!n$?+6Ou+hwMq6nlVk3k6`0eg`T9Mr`dWSZThAhO^4!;-s?N^f;%9Dj z-~A-<)c;Aw`^GONgxPvXSG_HNR{SCQ&qc}j$mA2B`~2i5to8!(ry9ltnsHL3g2wF@ zsDH_f3X5LaP08$Jv{^cU?~>XRDIXQPPci{)(Jt*(&fHVR7?NoA-=v8j3wW|X!!WZ4Qo}~VXP?es~J0? z$J!Tun0h0p{qQ;}{@vxcvCwK=YlGgQF$K=hS>iOdMA(bJ^6gTRTQfmANRB%A@8l!a z!wuL+Z6bf)Qeza^qh$!>t`HL-po$IWDZV%X`LCn zyWtX*K(pIdTi(&~bwV;GKmvIIc9gXUD{b92Y#%JMwxC?4-R`NoCn$mf9`UcXL7>=H zsQg{{?nNXSktyWB=I~|29LH?FjpkVkzDjrviUA7hnn`c*Wxt0oDL{~)I4$K^J^I~) zqv^>>V@R=gl1al|d{yl((m6O8G^;^c`w5>S@U^L$&8sak)2%E0(v@sQ+_Vgt6gbfW zp4BVc@l*g)lowLH2=NP)LOL4~6j3$F z@lE3^CJCM{f8m>(PFA*qG0}7mmB!p?F@nTgKXo^bRZJ=S>})HC>zFsb_-mu#a@ttv zRxgL@5K1sHL_x?7B56aWC7XTO!9+o6MBkRl-9A+X=peoL*O#UqK8rdJQlc+?cg{nR zfHr-5xd)%>cw?tQrI*ozY+ntUbh43c2!r(v)lXHDqX#2pEtvnYsY4v6 zxJ@W1d9X(I7E%SG9~8l)HvvAfdU;5!sSBBr3@+t*DAd6YSXnI{AnUBnT{>^>bcLG$ z;e^5&5=7S;G{?vlO47!jW8(Fiv^PcdnYrHS#M|*$jrtp4XF!AEfjTC9(lmM=UDD;Pak4^cG9&V z1w#2Cu;@uh$AO;y;wxAHT1VI%wFrPTulaN}X$kRt%Ztt?Sc)XkIzg+F-fqacrl;2~_`1!w@gB~T(g0$r6!H$Eo2UUt?CnCYJh~d7)U;KO0 zJ^=u^xfoUJi;Tklf;0K4u}d5J^RHZ*d2>#K+5c8EzZlLxeU5@YWk=Lp(w}>wJ#pr@ zs7!(x37@&y>3!o{7n)b8enWGK>9WXWu0WAcvFiZ9Ys z*d2&R4kgwBt8uC74yCz`pz-7OTvX26)D4)Veq=dj^*E>t2+u2yMFods#&Q@T=Sm#A zMrqk76PyA#!_Hwzt8SbJLE^3K>XR$the7Hn!@qs+K zaCi;YF173(t^MsB!A6d*AVqt2ey+RRet;fqLq_Sa(;^Rir2!+QRPrWIAtJ5~FLx)x zD_^{$Fu@VD9;S2&rx&dd707;eiA3n0M>!14vbp8l#VbvCl2Xj3aGq1T_b21qjOB`BC^q%^*ua&02mnl3HXIs_k3y}am zfNXTQ;0u<;jWdNQmh=X1NCjJJ)2dOU1PW=tMx=DWs1&+~X+4U+U^)X&p#yWny!S0H z_3cVe{Lc5qAN5| z!l*L$8eW}kiVj3SJ&@fMp%lxsOFJv)(U}82OQcaGabgQsf<}dwO-(7s{A2&=@3LC` zpxdL<@R3S=cILUSJuQ-4TXe=(x zjI%r8U&2TYae@BC^^+6sLA!|7M+sbYt5AN+A?okNen*uogVbN+QgSKHiun$~6mdEv z%OIK>1ji_n=Kp`Sy$g67=XvKlltFo*0P>7Y*ch9THHs)3w5bG0q=d*yUcqa-rq=PA zTqnokrrCx`+f?o?)@Hkj>fQBGvuz%^J;|}sCl|)2@k8gtUeU+$5p*J*KpV3GQ?Vf& zQzaBr(XawmgPMpi6%k=9L(2KR-++{S+qT;tgjRULW#+rQ-+TGL|39}RFOlLzkWF1m zrAoXD8-b!5MK0Y=WlcDcDGyY&Sth$nZ$?n(@NAkX*Y;<&JTmK~d+*x0^U=@Sw;GbI ztol#ZyIqXRkoL;wc+DHjscl0h6R!)4fYH-O=|b0pkw95 zcyOt;cJA4+{GojCWVRFK3l@h>L4HBcg!^?pt2a<}k+PV+7GhP_XB{o*>PZI{G0&%e z8dL=Cm4wQmH6@Ww!-!PUWJ50{IxYv-?X>{zh!R{01rW(8tNI`%Jh?vc4A~iYkCYn3 zm8Anhs(kH-46C|fDL1l5*U~Jj*F))2*qH4yr$g3s$;)&blO?Bg5=#JS2xi|;r9@kf zaY^-sNl;MsDLQ&?(y?w&@`pN%Kh#d>DN?C+R=U(%_z2z4+BlHr=oG#v>@-j@=Z%D> z_oPJQTM9BZWa&1d-l2FrzQYXlS1Z$&TNu`z-EluVpWkKCn_KnEz}Y>$>Y(3O<@2nJ zufr=0Xv`PY(OZ|yHmKo#Oq)sT_rg$q(gBv9KoIa+ z+8ZH((GPAmell13?(;o1$Zj_hsz%RF`+q&XZH z)s2lC%qWTI^9v!iJBi_wa}lI1ft?cD5<*|noby`gXN$*PZOlUvu5@D={MdCyly+HZ z{Ad-Qn^^LqRr{z+@Ji{P20s(JU`DU?@7cDgfyVb4vQ({I|Ni5{|K{%O2k+kWp-iTK z^F9A^YtM${v6oIX{h*ZiwPoH&bf6%_Mm2JgKk0Ud8?x@f{08jU{l7t?$Hj~q>iG0V2Dv)7br zeWB=9y=#pZ&NM>V^Lo$e#xwtMueIJBPHmilP(RX2t_&6b-vdNJkn*A+T|=+xyu0Sd z)BovT-n0AnJ|63)3|Wd2VcW2S`r6OSTCJqLT7qZ&wewo+I+%ZIy|-;tlp{)KNF7?z zYC%9LureW|r-7D4ATVK!VF-Mg!uOVnGaKHs5wZ2i^>kS|w$W*I!IcT2hl^lhm*oGk zmlWGj$Ox6Zi^tps4OR0rGPOD*!q_aSw{7gcgh@dQRu61~-5^*jAw@<)nSi;CP=4&u6usXFGJB2WJRczRvA=lnqg&F} zFZ|46BSt?FiFMx2^CJoeUOiJ{XUtWr6D8;HacANuNXmI=zyl34sjiaiT@|&iON6N2 zl9pMaPwYR?p5Vs2SYr)+1%r-IGXb7tGB1YQ)cZt`x>|u!XFhpLqT{Mg4!&(3xo_LuJk+QD8k%V)Mqo-P~K<0L6-&`>lxeh|k*7W>j z$F&W2Rb%Rc7d=(Wtl5aHMJyKixNYCv8QOY7c)Mk7y~(ghV#exI8z zPb$S%WopGwhm;%K_$84B!Nj96Vv$nyVXN-UkBzq{*q8Bw@tyV?_8+uW0-Gj8LWN|_ z8l!cUx$vq>f~&J5+IU@q!B^V5=|Y16WVXU#fI&d)0m3XPS(D>s2TLxR_UIO!oLa1> zMq+_90u4*&vC-9`J5#Y}gfs%?8a^mqC1_`=`c!QGrb@q8yfZ`vGs-H%>q zknZ32#N%Dp=ynEZZI4HL&bsu*+cxX3cbL|WoMdRU3(W>AI0Ru=FL({>W}9AW3ImrX7!7P;h+u+Y zLBpQFJb!&p>8CS=0&1l~+)ev}heFdCtwOib>00$H!cTPi`_5@Pmw+g6qBlFJVv^z^ z@1Q0ae+@6!zZr*r4cG7*{eX({9}kJnLF>j4Jtji;zG9I~Ju3>B0c(P^L5!>lI_ovZ zph>V^7OYRSb3-CQVAcU{f^I94i_n^M>R2{<^~=B*C>xzDQKqn{v2<#sx$?UA-IKnp zM~5^VDcDBi-~Pt0ZQOQGV^wUbZ>#pfJ6ox2Wp$!VkNKr$_5<0%%camc58U0R-H2chBju>j2Y&h`3m;aHQ3Wvt)z4+0%2VdOD|SQFCq;_5RE&Q)~qqkepSm%>8%QzF&x5xJZ(vIA4hx5u!`jBsR44#T6I#U6`^T z`>20&DDf`tP&x`1{uT%;F>L3>^C5D&u^TQ{E*kC%s{wifDHaAnR3OQWszkA%H+-E-yM>#ga-hYlahm#zyRTcP2NTE1Wt zIK2gn&xp}T4rvauQ#V`0$I11*G#g6M7H1vG1<#v$Vf-qfSpGUNS&$xru8!)o0$k7+ zR|$YTdI=qJItmv$uAxKMXrAk!7SRD_pR_!5AvDUN&Vi5fbDGkCVu>6Us$lAvp}#{Q zDezcnSND3&ddq?w0&=TJYXQPOXXE>NdM<$K)@wD;dVZ&uZ!CX;^lx zj?St7cKAz^$CNHd$KlDtov~OE1l7+PzxU`!A9~hp3of~3wd;^#e|A<}?NuGmvVb3fQAiXYdc^p#doea?^RgtLd{JiwV z3-pC87@5LK{j0mZTdY}R4&1Wf^61tC9VVwil}((uA)2_!j$Dh|U~Y(SZlNO2?z&ol zBAvg8cKV^i-}%;6auTc=l0+}Z1E&k*9kj6`ZoHBo-}`!KBXs_1E_78m7VD}lEMTPtbSH|8A|e{(%)~zuy|1eFi^k&5(X!)H1d55g zdJjc)dP7(T9^wk(i3lCxPs{W!QzsMcdcoP$F}c0noe5(Rji!hJ>_);Ydqpk$v*LID zw}0PjMnC%CR)2o3)mW%j=O{X(=`m9(nYYi5O-1Xr$=j^?6h3Y=Z=Px~UW9tstX&x9kiG{o$y^}%iTWbVFy!?kgn3b4I# z-7Oo?sJK|GCEgWD-E~S3DM_UUW88`x%7pBtsX`%j<6Fi2}!Y6|{OZ z*_TeIkkPX#X547^CT_69VakXh%p(9o(pMm;q%qQO$OOwps0o%16y91*a3jRgb+LbA zV$bIWHuv{wtHQa%&qKKT+n*ZVcpHqEFf)b|An}2CxeN5L&|9ost>QiDLj>n5V1HGA zY$dMa|7mfgy513K(RB|^2OzKVo%e37v2RF9g+kV9y@a6e>yYiBFvtOn6F^K&?G|3N z&P0sr&V}iL#K?x8jgrf_hFIEaEyC&o!I=X6GmFTw2(T3~5*;R;!{1(>V7iJ( zjFJ_inv3aJb+NP2OkDfg{rB`SXN}kWXAb1p93TCcTN#wp#zyN z+(lWg>iQ&0Egd@z_GOx61Bp}u9xk6Czj*WFeAi>d1DROu(B2yL=IcyZqsAII4tgayd{ zr9axOcbkOMc;ML&Y)#*??&LhNPuV%+ZNKYI)6_t=)|78d2Rd7S;yX__N=1w|zz!q@ z2|PA_AiMR>yCD$5&_RgQqEV6q6K{4E>KxKZn?QcAr5!yvomgWN9fse9R4)F2iV!&w zu>xjv8u;}EgG#Mnx1oGMv{+_Zr92?1QJYwiUdR^ah=SRvPU}7cB`c3K4z&sobIsf% z;rX9_e@}MXoxOI?{daD~Iudz6uOM(AvcynKX`M0CB3IFIbp+HVrW9CiXr&|r4v&qZ zE2nAf;H!av_)IWQ#|^uLqOEL)=FdY&r5yl6Cc`?Y=MvDs17L^mkZjl zm%v%lLE9N!C73BCRH;PbMV^P1rQP4-*U?fYmv*7EzwVs`A$zPeBQTUR^lhOWLCfieb^*8BSUZb^s$^)EE`aXx=w{*_W+-v&6- ziW7$?_CG^ba_en9J)nV;$-*mhy?5Nd>7&B{q6GTayTLnC1K1Ms*ld4MgMPW)k+y337EI==lFh4cY>U;GheoE+ZcoGc%^2n4p%F+co)T5 zA*o@>;P{~NSzGXo>$)O@mjDU~xvA^JM|R%JJ@r)}*l(O*98oYWt03C*?YKU8Zx1b8 zV6vY7zYYVy$bKLR)v8;mSvPkrP{>}P1Dll;@w?D6Vr`208UGU!7U`Ph8!c-$ODD?y ztD<;FYpk`Z8Ke32yfB=Gu8sN~;pl2(;k6E0!qN7GXctkP=&N;Y+C+;jU6?0-6PwU$cS>!Nz=)pq=-v9j#~B&| zH7IIO5;RuBlger=LmEEuo$=|3LPtj{5s!ts%-D)Z>8CY@)UsnRdXUhieHpnwL9SCi zS{0od5&1Txdls6h?MS3WY2@ z(j72hFu@^h5xD$@o3uG#%q@5qFe$zj7p5nZxNU{E@VZBGAC^(F%Is9L;U@mp+lqMi z>0<21g~airvFXE!pB(FXtz!Rexu@mD{`_$C*_p{pR7RGcz;%e=-e{21OXnwL3ZAwmO9Ey8=4Q<+}QFJZE5Ap9oicA0Y>lBMu< zF_^$&JsY)aVzHZ(u%ff!tu;wjk9(>-Gx6f|v8l|Kt>S`FZCC+xQlx|-A;BTXYY~vP z)bi9BFTy5`+>>8Y;*`P4QY}ycHiOb85i})LzF0{Lsv$46D1+OeEJ_4b(ugK_;4tF9 z&}G*ffRwMm^tKl(ur?fYqBKBu6h-B?@@`TqrLhdeD~RPHKg2`LB=G#>`TEgarZbuh z(iMb#CA1`k-#tH3LzyiN5JRH5KEOyCxRUrXLK2oHaisw&7Kg-(G5!kLRA-G_(*Pn2YMt?9v)fMIH=KQ7xT%>|cN*8IS@oTX($Iaw(EbY?1HyL6 z>{0)x8&8tN0!&w53T+2AR%n`}yHKi+K`WPdd>W|kFx7aV4gh5IIK@ZR5htw9JP&_7 z-bz{m0*JdHcI7XoW>T{RCnJ4<3d1d{At?Kk-Ij_pT$^64VJM9vRdJ_kN$ zYvSq5p;7CpJ;}Lov?mOO!jYQ?qQQsqej(^?Y|&0?=_JOqnOQ0O+q_Z9n*sX(Hx*-q z(gO;TGP3ma$qYqYZ7m&z9%33?uYi!&X0dBUIvPbu70|flm8x!;inV5M8<6W>tH2WA z7s6B->ZOoVFbZy8-PxiQZx@PgZ?2vUlZ5s`(i^R+ozTrH>&P-HZmB*?(axtz7BYe7 zkKCKoyh6P;%Mf@%SgpXI@bWOURMtV^(=Q7yz+yFshfK>WE&DcH9n{C9S5Nu?X{56^ zWsSa+b=P2c%b=S`HCy#PkM7?6*@v58cZksebOHb{G!&KuID&2yYj?3oyMkxL8Lpti zUz*Q^p$cXpDOD0^H-v@pTL1n#lla?s9M3#=D6+b>`9lzpd%5x4_J6fe17i0J?J&AY zbcX)C0`sq;I*_6VWhLst3IyMY&Q|FRW&q_TNQG&y6?P}qQA1yhVdJ35apv_?PWT-C zQbGfWjV1R+LO{w|)PtouMMt{GQ;-o5@X&cU-x{s!G}1TJSZ97P31k!XbNazsf8&O3 zz`tO3Rzs_7dJ*;J#g6!LPgWRVV<_3h z6NZYwzbS^u19W*Dy`<{E=}8mS$|wMA(%Oqqt6gh_yDaMl*h3?8FPDxUJiN6pZG4+`1tXI8tuhz|$hu2Nk%|Ew@VxFXJv3_KKcq(^G{1%)oA#I^i?>rCd zgIW1&$NNR=rI_iyD2lcC0fbd4%_iI*9D3Rz`9d7)zq`!s$5{(5>>wJSo$K*x85hvZ3r%AlT=#>hG%Ri&l zD%=UW3J*}?T*{~*7`udTL#PQmqi$#Tyw-^zV<((>2P3^boEgU^^pf9zuvXEDy70`QoSo{S+rYTcS$T0PdA;wS znbUqz)7O*SNk*>ENZB(KE??c?<7l+%Jm2|8ujFIbbl|l@!WjKog9I#HRrwbVAi;;O zaOb<%I22Jh_$a~yioT#3=TVSjp*KUTJ2`wIQ#G#x>s%&X5AM~EMP`Vn;c_6oLk1qZ zb#5UBIpx^}=;gxKT5h9k-?AG-P5d!^&mP|N(}FbNQWg66(E z0U1Ly3Vj-ON115sGN~xsLLvFlX+r8`cebh!Zcxi3-sjv;aKxSSDaN5!FTyyN>bR?h z_+L!}o*{~8tT0|a+gP{l?w)w6b$Y?LbP=6Pspq^)FO*85NaQsL z##V)iQJ|`;R-8>A$~r$h1`V(g72Yx&rYiN^m9d3WTE{{Ns=es7q4LxeOcZ#qf5zNs zjfK+=CBIZp`n6LFX3bBph$KJ}!FtrFC9V%guIiM20<7tIFS@Fu?|Q@HmVPpG5!HuR zrji#HqNnF+0rF3~%=scd2xWXSBD*{y(RGOja7fPo>OcuGw$&1cIKEQKe5u(!xFL|4@^eF@Su?%7E0|DKUl z*d>~}7J6?=+<&i4rUDb40}i;t4g*A#0)qr84jX6(gkPKaL6RV}u0~RwI z*xz|ScBT?zqYDub^_ET%ALqsA8VkJ}1$hsDitzf#dJ%%ACf`Rw5K*0%)I70D$VgNm zGTM-c_SptBbXB+a#zaqY4e=r!_({9hT=ZIJDj~RuoRhWO#N6TU&)7HFCWUAC z?qFHC)Hqx$P+6Xf6q*?Q&x$AO`k~M@9GP+k zv)9;vWF&x(K>m>3mXb*8ZzC^G&zM)&^>DRQt4k2sM><;o3Ez2svUL^csyb1z_(PIj zkwk|~u*yY)G1TdgYt=T~D5|xQl^q*k_pVh9gvwTRLLk(hoH~FfNQmSi}VQI;mYvb`5Gs1McO*+=;qGM7H2ARvLG1xAI(JZ zJw$&=XssHJ(2GBIsQe6n;*p-~qkg$c2@3}vU?=6K$c5cZrZl=4%*4jI@6VZ)h1zVP_2cBR^W-rafcMh@o2xk{`vw0UjpABLMXLf0l4l6RYK zcoA}y*iBF%QxWmW4SQbs?mlbdHMPyCp1wP3UlXzuo&KwH6oEqL-E~H1<+KyODcOpy znLGJnZ`_JqV|ZjYfeKw?(K~tgPt^qDMXOA))Pq%%d8D%ioKWvs8@c}ud+w)YM5Ds* z(gq*gde6T|41D;GyZifMHwqlSem?Te|9UtS?jcSg8!liD$*-bn%^8e0E^#SoUQK{} ze$S1tC8Lemvf1LN%c507zKzL+QMeKE&bal}or!z<8{3BJCmjFf8MEop?vK)JJ)5PdX$;zTZ8geet$n&rU=wRrqxHVDb;s7R zALYI7Sm9jR+>$Aqtb<9ex&yA>LlfHZxjWvwp{~2X|D8W1gzD?tOy2pxPo{VMum5i9 z`-flt-uV3F;f49hjq6P3rK8*XqQ!6go__kUcjBmi&YAJ%HupuWtIC<4j_mtv3Vl;& zDhqm7`LBuzNSZHol81|#U4&|lpLxgr?2iJr*r|=Xao`&Elg?ieCy)M$akL46LLk~m5}pHQP0V)rISaU$GkZSasR*1 zv-*5+5v_VQ9@FPfBJe{LNjr%!XsnK~0)SO^yf53hXT&&fR-ZqRe05%ujrbg~1bu9f z^SridLxY7vq3bN%z41KVt@nRC`@ly-KbT2?HUTkyy%oKwFLWtZrgL}jPUH09#A?C; zGdI5wYsAbmy1ip4MjEmWqowkV7p-Fn+wb!(RLa-*8|JlEGVTA~$nX5?hl|hU8-F!pjD2f< zCg1bq+_zTGr$5pYJ6H^D8SuMe)^`uwc?R&b-#lNNIA8hFqk9+U%fI)XeVOBp=~w4A ze)N-ewe?5yhn-`t)fF0fkM)R`z&hILMEKp2-2XY2xeyvT*V^oB#bZVD1F7&YIwZ%j zqE&jO&?ujH@wo$0$f)hU(y0ZK;bBgC??h6YOT_dqJ(*i-9}P03SA0oYN`o3zG8SZN z>%K$N09_$2^7D#~gZXX5K^XD#{6u&3UQXbW~C>9qJc;;1>aMUvF^%IoEKeKP@VZs3@c32-glerDWMG zOH1{J@9X!!wLAY{#(wM(cU#83cZb7t^bhQRdeUzA`7iDx%dD?YYgI(~IF}ugPQELI zK=xYu@h|Lw)r&rV>@c98{tygStl#?ZwxQ&`S^ZW!_re%#1@cQ@n>^|4eRQuw=BrE3 zKbOyvu4;vwwK}2bfSm+M?p8cpEUuH1XmK)6mx_Dbv1=YI>`0*54-S@2R0|Ubd!@og z(q5lQ_YW|%P=h&Bd3TO}Hc~59dOoBF#VJBC6il!rprp}4rP+d{8ksb*cC#~{NYH^h zhfhiJlquSHX@()i#GK|KV-m6~$#A{-A=wOBG4vm(1fEQ)8IN0Qsglaa#g!_tgh$mn z!)@N1)%wz~l1WB}q-UAd5>|#{N8%XmX7$&Nc)T?4y772k^V1J*pPie|eQoc<4{V>M zq3xUF2)J5JeQ?Ww39RFrIgR!n*ppBwUmK?mm!F@`6$^z*X`fc#-(wc zy7k?qgM)|m%|5oT`X{5+FOC+U8i#z?CQWLa#g__M-ALD(@oiZxWNTARa*A|&!0n~Y zySQnEqq$69+P=M4>oW2$73ub{YjtTxI_^L;rQe%<`p7tPZIl-gI7PW;;8#XiUiPiY z(WB!T^vb+?rbR1qVVcR9EDmfNkdaaSP7G6h#witrzaUA+mESBin&GbpPls*AMKYm>*S6_MESr;g1`{bhB3?iiknVrHa-i6=}3NX&A(9*h|g zHV;3xvT-9h%}`_WhqfjXi7Fa@d=|BRs(~boVAY8ytcQQQY$V8PSXkxn7mZh-YYF-9 ziV|oMn`*0&<|Iz)@FG@jg}>=nKYrj3ztni@nUCC<7`hbOdhLc-&3}2my!p=UXvwt7 zG~v%ZGe5WPeVZvR`SDotxNPIP>&u^YxxTl4_T4yf0ICb!7V{8T$u;%HCxx!D~xS@I$kI#&4 z$$awBUAzDDe;(?JXE0Hq2g&fRGAA$8+?&l8_dT#8pof2}(K%|ZmWxJc|vFHaLa{`zWyLvMmp@4inu zKc*2R0^JO?YRXEDvsII>(R0=9+j@WdS3gc+fQDNU7FrFo%{_SNuqrkL7F8Kl*~H{P zA?!osmg*Pkj3=s-Q}hw}qu(wbJmQW$HJy8|m^)OOhWZOGrJi0@b>Kpgnv_P0%^k5+v>fUAZYE;=46Z`q$wiq-!)`7Gq|f{hdnF5d}K0 zZjhZ8ZZm7g(DvWjHKZAjL~OHCjf1?cl=84X+?xq+N=m0@%FcdnB)x6BbJ87uY;W!p zyS%TAdxwN!aQMMt^0zh}O}d82cM`iwRS~yq-bn%>Ol-^I)jE_NXtax zg#(lJ`fSoj(({xy;z^W%Ytn)5yfh7RIDhCMcP+Asv<+dd8eX=`g3E2+lVdyA+BQ7O z>$Ih(1rFZxf!}})=##Pr~RfbecV`)h^^BYye5Ryk} zffRd;Hkl-UY9-rfW>d!4S04HNXGf@;a1=r^M~@`>!5n{B*(DRLEUFYb=z36E-0_|y zBrZl5XCa%6{y|zs#LVJgu`?;bkTI{5MwpwX_{2p^@38bh21lg|#)TC-dCx7gmcWF6Cr_#*d@oVTYZDGk5@-0%-h z6_Q;v->G^Ax%&u#s#faO?S}@&CMQvCFT8Lt_vKM-vXCq}k8~wRLe`+K50b<`?(YB7 zv3$juB?IMSU^OqU71wIH_4?#`Emzg{opcU1{LFoW#a7t8HSN5FF9uqa!hmO0>dBsd zjVqDDlvX_nn<2O%ZD32*f61w{8Q>F?iWP|uTE^=B$&!YnGF8f|)E*0m(GbUl#48LH z#X_bbqU`yG^ztSBa2y5H9?BbjFQp-Rb7@195{kEDZ5;Y#Cc8>9o`b2&$ljMp-EP+B z^BG&)^O>R1FN}QtQ(2;GIwiqWNjv9B2WLPQ1erfc881I%Zrb}#epmC7ac%6&Bl%}` zKJn-dIAb!K%EMi!>{1`dF>Lv+9ggsw2m%L%Q?CdOg3%N~Y5Jznlg$oAR~nt-?UUFlBu+ zcO>U@VU0Wu6@c|gd_AS89M;R8Y%E5z231HsPD6Pd)(5vg6y8ZsGyUM}QJf>?rI?c7 zfYQAEFO2S7OGl``AO2{+nQ0l5#p!&xWOZ5nJd^j){83f69g2jvBPkAf6U~wlE!ku4 zdF+w>&yJ2fm>sz{oxPQrtRgsCFBiR9$uCcHvo@@Y$bL1Xg_Tux#RSX5$hJcqp3kN` zoK7*i89Att0yjhTJ)awV_*d-ACax8d6m~x=i*9xfR|6J48fp~@tQzq)W2Km7^`ls6 zI%1hn)~{~c2z(SZpN4TT8j^RV( zQSUZ&C{7|+Xv3(54bQYf+|J;x-`q3$#cv$^^zPAnhaQf^tv?>imR+M#+Kz3g7J`mv z)Nnbo><`m5s!blBp2i@-*s|7gO0&!>$sD3eG~>x(K`6kcH@b~%B%bx8@H~3lkrK6G zmMSiVgi>`D_(re9CUh%Hg~w{>`9nDdWcsBNT-xjkp1+^iL8l1q4l-6O4ek_9g)W&R zoH(SGOd*{q8lk3JE=jw(AsnA%Z>Sw6gbfZm2@5Fuy} z4mh6We(v-8@7=!ZQx7|L4URlJy0_|l1AMgaC9CQn5PqoHY*#psE7_CvLst4%M)EV$ z{YdGEd9M5L_G7qUhVcAiMB9E>_K8nDLby_gzW_}@vcFUkD1J_}hdq7g34c3mWU0*V z9eA*gUxC6*mL>yQFwE?|+ucL^9S6qZrrr~G)`smr-lKhD1w80 z_ZFMExNUSLK|Pe{Fhr_nOWOVHu#+&TQd@-A*yy-6TJsA?JM^a)ygR829xdYVy!N-W*iuN`eV zzr1^NaAf~CN8{^FXmg1pQBx+))JdE*3Q5BS)Znm#b%|{G9JPZXF6Ljw#nBFhgKekU z#ThI{O?Vv?$1S^))f&(_s1sKxJ7hou%dG6Ydbg!Hrg2DztyeK1srxkI6ftf6y*4_L z<3|n_PRzPpCTvPtH=XUu8BtD|j0oGEvwzNw_b1)Y?br_h1OEj#4aPkFDhrDLP}-qhgletyTNcM{yVlMcm`Ayxl(8m=i`lbuZ^oAXZLPxj>> zd%W=E{=(F>Q+BZVHrp|x=ZQ}U$CZ1LKR#LSw@WF4b<6nTuE7_^vR~Vq{`AQ7q8G=3 zkODh|(vU#;B`7ZN7yu*)>x0Lf$&pKx?>a?}7`~x-UN!%h48n1dlFLoz2qXDijZm15 zbxe`wx?SLelUM~TIS7S)zx7F;>z15eJ6YuHC%;R;YC~lk>?{dirR|=9lbW{7(Hl&( znxw#^R%{P&RZBWpJX>MJ2<)xEI|MY*p60;WQTUBu>&m}@tEFBmef}ZhS-aT^6Q4~N zVZ7Dix2BT6HIkoqbQ7^NZM0GvtvUtLCDbG2qb18Bw85b;rp%a!L__oLBBspK{*}R4 z;k98$#N#6dM_ANIu1~tyRp5@6p}fp~>xY{;u~XMYjsn$PZLrZa41ub%zP$ly00AN=AI z_Lc!46YMdJuy?}6WzpuV(&wT1@K+ac$h&(B!rGxFNrSS{YHqSWS@>Zd*EUYqKK7Xt z5NZnUx>D!kiZA5w*aaRFVF$bQxaNfXVz7q0Ea?j8(;vvf20r|;k<_Nlv{N5_p-_ic z7`p8MStYV?sG{R)30u}%CRq8sZPOaelR6C8Pb?Fey1>)s3lcsdarc#;y1b;#O%be& zfS^M?7-$wQmk1XL`9QnBJ!A=y}OkA7wBiEoYd62I5H9A|1*T&{KLZ8;@4 zP17wnZFA0)<2;+s3eygu2%a|~ySVFu8)H8DlGSQe=(d5vz}O6Z0(p`yc-NBI_h)GQ z;BazU&c2yE*H1c)V+9v!_ISxDg8mU2alPi4wK~k2;clyR(#b|F3?|23(bo%fwc-o{ z>zQ*)rCB;G{0ieh*3owY}GVpzBvY0Nvhv6Z1<@= zfS6*#o%S59+aCGc9<8gFk%aL=#7-rr1k*0%B17%q_IbJFIx{isSMFYBP9kB5iGpbr z%M3nD=1fs!1mUu>z^14|2T&uhAf_;s2d`0Y9vE}Bx+2AC7x1~y{A6MBrP9t%X9w;b z^yaIODLwIYX5@ja|L2qB@C0%t_PL3>EvzEA3|$7iaHW=o^z-1_6u%XxT1+utV$!R8 zM%+p!k|3?*DrJ}$yE-fwrC-?vL5}c(hFk~V;zTK<87blD!zaLPhiH#~6(0T5QO-qKZ7r8*l?|Kfvx_IIBe#-EmE)g% z&j`-8eEdOoz3rZa(;Si+;qNIPEqJvm=}cOs3mlnUP?>v$mghhd)5SJ5*s`DGRSe%+ zJ8Rj~MC2jQ1;Bj7$r$m}`_qM(_Q;_zX17#v#*a?+Zpk`F_V=@N8g5f3ziWDMqmvo- zI2;%PiOZG}9ZMTdCJYRiaO$)THs+F$plx!MpX|ThHo{mZ`Mo4DBw$zaSixc3emegr zS!FRhaQLI&A?$uE0q9@HzMgYV(*C8+EpWl`%0?v9Chw+>RhR+A-a&8_k(ehpv7d$A zi$TDi5JWZrdEtnW64wQFruhT+4Y`YTd4G_UIGiDU$gp0l0j}k80DK1j+6gDm7zPXyH(N|VYsqQ2)j_6 zH#tznIf7d11Ry=@slOHKa<)5y2>A^ zmUee*4>z2BwJM(TeiHucmW?A6;*)s4~ah{yGw4xG$ zDTE2W63v^f>ab>xdd>juF{KW?n0YVNCG0lx?gSphnha!jT%*rM^? zLS;7Hond0CbU+dKNkYX(IAi3~BiT<308*?TDsmYv9hj)LPZrXwZyc*g7%NJapM?OC zuUMrj$*-n6QE2wCXyVp;?ReO9rV7Hu8Sf=xDYg8P(M$z#o)a0#-8n zvFzZdA7OZlF9D3p*_NIDU_@!<%P4{j;0@7H{=)Kxhqa4y8RrwlC4ys|r~ z^}VWD*?8jQCg1yex!x@P+azhL(OH<9F#r-V)k4bYY=1>au1h z@}%YDb|M;(JEF4TxJ`PJG?vk5W`V>W$~mN>-kWA**-873j5~2-&xyhw&l#C7j@C-O z{r$tgJiPah_j)rWRAVSP7{4;O^XVrZ`Pvh?slx7Wjeh>AQ49tf>5)(GeE6|F@vbCn zB>6=b7h!a2@?gc;d1P!?X`IopyKpNVWZ-+bF<$cF)aZX1EghLmtxab8QW8oCH4}Ij zVffbXBBMQ0|^qO1$b|G7Z22qrF*xVGLCg=5$ z?yT`rPJ6$NpP$2l$LG2|S;U(&ye3_S4Xt#<-{bGw{l&eb-yS8i#wa`ZRe)XISNoIL6)sE})1|0JHk=}-WNMj}c5JJh)%5MQ9>bjY$@P$}$xC3Ob71MlqXv~I zK9yQASG<)N0Ch$J5fl4BsLK0n%S^jYI$@XQ7;7Euw_Ee~KQ}I`PJ#-7r%PXgrcKve z>Z93sQWAlRQeBu3*T!=%l|&bZpoNV{h(dUcd55Xj_h(-!W|a3Q1{Tqiq&4u+h*vC3 zPL~GEJ z{lk93aNcX#HD~vxfx@4Rm1=(TL2^JTSb>bi;;wsBb_o+=A3QlbK9e^AyK|M~!7+aE z_|UDX{E5;ZaHf1@r2k_h#BBIU`@X!#>XMjH+zJ7K1JkdegEC{q%R>Jlv!Dzna7sMA(JbO|yku~Iyi&mGw z;^3GU9}1F?6XaPfUP4?u8#6~;seNS{GE4Z*+{?&XW26-xpvMlg0oe$}V_r+mV11HL z*F z@RKyM9&|MOu91>vhr3hO`V@*gqm-+mVA516f8mkc>+O_;`P{1vB!e(;YjVe?^ucGwAOGBL^40u0e&z#Ino>~ z!3CbI3_zXSM|*JDqoP#`DXBzMZ&?* z%0$w{S~{NNWEY;f^lJH()6ixJS-Ga2-?npaJiWKc=+vME z3G|@hjecd{&_hEsgENMpC^&%0YRMc6QiCu@&SN$B0avAZ$QUXISSZYuCyFnsc9n{w zsoqG{L6M?L=~uQL{GK8!(J6xH)Re@ws~pH>s}Lkcpy>trIPW>+ddP2d!^le9+$1~i z%puoofHJ|vp)es!Rl+zC%HtAA_Y_D#wiBp&kwZcDI*U!RCyH=gE*QUBPQj|Eqsb{w zo`eNgE$vuqq^Aly8vf3>jo(EH4WlP!W35%~GV=|8yjI^!lu|A3_M9hbMPLxwZ3DX= z+x3kDPs~m^JGKl|XD0J=*8U0a;Yarrjvn;prtP(R~9?Qd_}I65p1UG%zrLi^?d0a*@1^P=2bBXO3l3 zaJ%G3Wuk*Qmb`?@Lc$@7lY|>bknza3~JPG}M|rpBER3)meypBLeA>J}E`P zt7`so!R>^HsxeS7}Ho){{6>5)&(edTkm6 zmXK77JASb0#&1tSd3-<8q|e=;)qnIY1Sgr1xbhGzBZmNn-LEI9cG2lAhJSf3+X?%I~&x>Xzluk5-D z0HR%|PEFmXgyZ(;IFGDpGHlsY7PFkP1~4ULuLlihX#U{9@w|U@KX+VcG^^5)CdN6i zgiI|NZpJ#3N-;|=*n!(q$O&Q6rLU3913l0g*_;SFNFMS zqu;7|UHx|#UoEpmH?0bhhn(n6=(lXF9iO^;y=D0ey6_^1(9_HB>*qhgMA5HxZtTD3D^TMMMKyih5BXQ~`aZEam+Hp(-J z)k{Fvjn#84SlaKuO;2`p3=V8RF!qd{9-cqrgsvlDIkVxc zQyd#F%+D1sC2Hq&xaeaSoPkKKHF>yps${HL^U;4h98UI%4&{%gJ1=(7@2kW0uF{Mb z-xZy!d&#@A8#Zl*=`nn%qja(ii84o*7blTP8Jo1dILcu2Up$H()NlO?wzu1$crQzl*2l9^s!+BW-Q&*e0g z_zCksnnD|Yj)bZ;OQE||U~{LE$%BNI^H45I47%im3!$?Pdf}hZ(y8y4GMvf2x9{FrpVyJ(^oC=y8M7!87bh z>h*EkVLj=EWGa4e-k~xd|I~1QUphmTdP^FErbpp>PvVYDPfiYj(UcJ)kQS>1hkTOqgya}jvw)JE7Ju)4xb!*drLkJjaq%!t5q_=o z71xQik;I}%g(U{9PhCg~7b*ay*iQqi@T}wOk{RHDps-Jumm~qPV07&@Gw?0oBKlz< z1AG?M51xz-&1!C1FWDa(K(F4dY9qh=@aTFYi{;?}^6)B~ySsY_pWHM2z<^h^c6a+w zr0<=`4}E3N?AON&xAqH%Gof@#n+$pTyR4z7_V0dRc%uwpuw3JIMR}a#8PU0y-YB({3p4Eg(X|$w*@{>lNppWJ4WiFnepV`s^rY65gd| zr-Xvsb4Gm|AKtjtD$bX36NPMl_K82~J}vu%{r$v~Id!)4B{-nBK7!*TaNi`zR#grb zlLxd-Z^rpk65rLO!Chc)#J;L@;Umb*iQZ~HeDA=XCnxvMJ45#k%1PFebTm*j@skDQ z*6i1))o7y+jL^#Gq>>NM6sN&Fhe$ug_k3(b@5{)$`R<-?j)pf4CHsaA2hc6=ee0PEC&^R=j-voeKAydJaldeLl6`>{;+6Qf*%zDVUL4-<;y zvl~8<&(M9Dz0V%B?;F7_5O@w#>k|-C%Z#(bEQ>YaW@1Bya??y?jRh;6H0rutDwc-& zl9~RI!bG0lC4`Hr=&we?R3}EZnfd>)+w`hMs-HWC_b*_v^xi~PTPTr{1_DOLd*{cJ z`=8BGjDS0TsSM0`t75S7sCit*MZalolIyMBTdm;-lj-*|j1FjT(LeR7G?s(!g-o6| zii-p-9+^^4l9i!?r7LEXZv!dZpy*@-NP!lqP$>^oOHTDjL7-}&DY3#tKE4hr81q5+ z8&6uvxH)p)cKg=2wIx3I*j}rrmr4Lq5tuEK8xBEQ2&4cYia16di!?ehi6^}KcXt-P z_>JLh!}f8c}9rxfo369LH zk;&K0{U@6FR=T7Q6>9*(&9Pj;*OJxOZ6|7ZECmQ@q83RjywSa1+2?BEV#q3mfq@A2 zn+T_f1e2Ne6B)Ou)hmEX{Mc4 za=LD9|JIoGkpb(3w%2*%*s4)mFCS$8| z9f1nB+IGviXqk)4bIf^D!@vZ z7BTbf`Ifp~TU}UvlE_4BnNIz;jUZ@vh27(fmPKrflFCMOG|EuEH$cCRD`{CWw^LOPI8F*xZC-DR^n z$G?4$N?(6}TFS;WSm=~P*qR28F{d6C`zpN4z{O%@b9e5W(_FwzFBJ8VJ^Ph0?S-f7 z#oWNX1I;S$mQCAs{)O?!zqmJ<6a=7zHj*l4MAPxrCYIfRuU7B z;tB0JY+8}Lh-hTzWqFWoMncXYG7&F&S^R7{5DrQakk3jfN^y6Hh@;B6R2SmaB#arh z`($4KOBwbiDV2~=g-}{CBtpPqVBQ>{kVww3=`$Zpv3)t=stIG%tM2^E;y%vR2Y2rI z+Wtp=V^{r9q4`wKo^c=|wr|z-6Q$%@Bjwk3&{;EIB0u1~FpkBA)1(OKHIPpucEaH;f7%r3K$8trYdOEQ%w3u75A~O-`9~fc2J|zH<>M>>9}ygyc3f24(2>E( z2_f4fUM>GF?O>H{mMl^*yF$SbAbOO7Hd(s5w&zct9{$zGcRo70^D|>3zp?L=pBa7R zb5D;xm1hUnnRqeOiei?zRL8nOX?FIvfWzPH1j3bBjxGWlbb+_XC?y=nz7Q9G}Gbg!V(9dSuUm{BE3! zF1zp&iG{l1I5uA#$*}pvEqi@hKUvSCu43UHN*_a}<@NXVb12%Kv^>?#E_-}}<^a1i zktfjz1&Cx7H)VzGMwK8X=R)d@Gl;X6^f)U9kPQgSkl7FA!Bmb;A-!h+wW#5319itK z(WD$f|CpJp17(%EZ^+6|(JW-3&!cxD{AcceVRp~Aaz?jlpfOx5np*}+P0e~;uZB(P z*%D}y&|Rp*DpjXiM(%^+eaofBR(A{TT+vDnWgplx{L6npW7xxwJ-+wZNm{Y&{z0b- z%MulKc!`3-fp{|n|6Y?ANOB}{1}|GwWxgd9CC^hZSPH}9TQTw&u$c5j5N7zV7 zjoiFr#(M!RyHgG&MPT76a@8|cZLJ-inikU$2R2j`^Eg-Hn3ofZF$w_#Xi`Sxbl`hS zx4oLwApu=`0`wpSZn!hf?uW8ktw?VID@O!3MHjP~U z>LgIR7;fN|{4#Db7nDpU@%Bi{$E8qakYxljTg0>qXC3_~Tu|LlzA!ytXGT6Y;vFxT zI3IJ(LfN+-7m|FuQMR0WV5g90q_kOY3gA&V^MpJLyCsN5 z2`Ri*9VD}80dZbY=w>o$E9w$CO{uam9B7rR3^PPuvaw#rO`sZsKf=Zp{35}eq#7js zElCMG!uFyF1Rk8G6`LJnld|^Rk^A~n-6&n;HD-wFI?I@MP=s8Ji{9l_7hI!Q&%UtV zs*p*RLX$L~k@61_Q|UVzPJHHx?4g5kHjPoO8+G!QnJNTVG_z0xH!0tSfv8EfL(3c= z8%XKS98tcl(c(dnMn<#ZXigDi5Jm{EJ=q<`+x6&!l0`}0l!6500a786P7<>8>=Yvt zkEAdRV0*$sQ6-HIU=!jYt2qw}G44WBxmfQFgWU6d%7|0r292EwgPtXkY%R@Zw)DRethTs07~_2Pydbw@E&$GUwD|bYpwy{7jyte zEps6ebDcI;wjcBk3VcEIq2L%y5Vl9G;hQ=e)V5P+C#tWa0;7r({(?*`l?L{$Ez4H- z%TnnwLR3?g))Fsiknt61tXe#FjN2SJ*7u?o6n66mP;dkeW2>30LlQp_{&L!rll%^mF zc?JHT&`7G%Od%q5sEU)>D7gdcQ!cb*w5#G#ZyIoDW}$Uqz9coBZh@~-At+U7qNuZz z$ca%mgycA^P3xgj7(>-6Aze87>>lKAbZuJN0zwvb-)aR2m?cORptWckR!Vv&JGN>UTr!{+Qj>53)43MpXD>{9Ga-LnK>;|}w z6CD?V^hkZyX?o`R{wASj!*S>Gw4HFwrc>#`fuY<{$259NhenM?zBIAdCyggPfjkAI z5JG`s=}MD1DYwu>(wEuw#eL0?NxjlPG07j~0A+&3DQTmwmc5@hJ5%cCx7)#L^973{ z$m<%>=HR{QJ&z82yh!V?Hv8`$gWQhKpukiHlX+jw(OhcSR!yqS&Q|M z(w+`|lig#|BA0nkOC}I$aDa9ci;lH6ldo!HRezuFZ-4ZWfo-;SWFPrLK|yl@MUql9 zCCftwQLozxT6MU*CVrDN-L!pv0ulme-PmHA{o&MINs=A{BvPo7IH{OYHNIB&$_4bj z*)c5t!lfFdw*~K$bMW9yDN#Uve)*HJ~!>+6UMW~?E{>j zR@ikb(;OnoKN3JGN|W2~8?pfwLYzrYo(0I>$ZqK+zetrD(MGl}Lu4kzr{4Kswsd3+ zO#v%ZC#`754SQ3@#OBv&cmckXqsk6Uf9SJ&az)t5lA{wP`@S6(?t{Qx@Q@_b4E!54 zM^{d+Z1JTBREFGs_lJE^UFi%%zryheeK`CnE6v0Wt^Q3msx4*L>(mx{Z-d?$&bP?o zIYeHd#E-BQzB4|db;J;C5TXku(EAM<1x+FMj zCuim}+eUo<;zrX?n$7(8XEy%Q5I#rb)buCs*}D7RJzVn^OH)(D?|!E*5j}cvJbb3= z9?yqQ9xWaIGw;>P#WOShY~HV&ocYO%v5u;}#?0RH;bT86Zn!b#%+EtV=KOT(WMv`N ze?JuHu}0^)42tyKO zJs1$76@yd|`7P*$IyKNrsII(mf;Ig$HiWQ_UkKSZhc@>mV7sc+ygHn?W=q%${cz&~ zo(F}Z-Ml#1Mi>e$c$$@JgDzZ^Y}XYHIH%H})PR~o>~pQr`+-#I1DnIEWj?Iv zM&}2PdGp5K|N1jiFKT0gegFU;ElET{RF-;f4e$EG!2LVYoo6Qd&{X@I#`tWla?Z3n z5?zaab+M?OCy*8jOd-MhdBAdy%mp{&g^)lHy$c~J=(tXg+|=P;Cp>CaEb-zTZCkK% z7*sXUeVQ}FGp8MUO}-j!Zd5wB`wKa|0<1q}{Tp)$noMMa_-pB0Jra20mDzGVMhcQ>dp|Jb<*=i|9kgPglCGH9}__iM~uMl`WlUm_H+J*ori(`ZbmiVM=~fgR&mt zG|8#Mp@k9=&WX5Ls^EhI`WQy@a?Uu(XcG4T;=;%P*eydT+8e z-Vj5LYwm1${^X2tzL9=krtrN3FvlZc&wIj~_ww|ynfYo*sK-4QO7|fBq}SiobNJXC zxVRbsoCe~@H_ptuL?{@DUPz)YHHxR^)+J;4XOAc%;Tllh)-NK5i^sIejCXFXZ-bqE z&t^!Rq7*PXU{>*2J?Nnu@RoL=dTmnNZTTIIi!o?3(mflj)JDrnWN%4kx6nyrbzBNZ zJ+1nSa7#Mz!!ZN~TSB?sI)^ZpQhH2yAx

1rrQY2W9FN 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%0D?O+%rZt3<%@5_w_|%uH5JTH>zvBR!uOx# zlIvf}iVgv~yVu+0-D!~>nclX_P4=yV1l(B6lFPjBPa*r}LR})lt_sV!0EP}JivYfR zV!?nj`eosq8_{fm`(JtCLAnpDIyah>4O!l=ITZ*WL!0kC`)0Yn3-f@$>eB;>{Ir

JwW?Eua}UcgkmNg%%) zD0_Q)VaOepyMEG2_drOcX--VH1>Y7RFwHCa%s>(O1@a*QF~_dP-Ybes+RxND`{b!p zc5)U5ie@K$dxW322iiw+0aQ<;;fV!G)eFo6E)f!03~{^eV>Nr1ZB*l)BcbE4&lWjH zTbd7%_*AIe+|xHI40Yor>Do8zelK3sjdeJJUR~u3aN;%A+CF5wrPiv^g6hXf2h$xA zX&pBlNnGmcU-!PvYt5F>%{E6Uj{?r{N>tdDqg|h|Tezwl>#C2NdC!vy)-vlVl$A9k zd={o2Bid~aI>L*Ip1W<1+qn--U%`FLxi;RWyk;7^Ml#ttGSz+$w7PA z%#ybHliG;gVSnIoorU}?%iZ-K=R3&}f?vIlZ@t%q<9zD3(|ny{Z2b5(y2H(`&f1G5 z9EXYfyllTCId}U)B@dtZOL)rFISXDzgkvi_LR?LOa5f6UWv9{o6zS<%G3*!1#LF){ z7M^$Y3+=aAm}|RZhuyl?sF=U8el@Vt5rufJ?885c42qtf-`lWja4zUA-kR%D{m3wu zHZ4kR9v(B+&E%a;yCr1mCp@i0Szw!0AFWP!JQaZY_hkwWHe%ex!#7)<8`(JoFUe+! zy_x&aikdM2Y&LqeXUkkwU#ws;lqi$6K=dqjmN$sZTYRw;&AEG`%7-*!=%BFr$+Fm$ zVkTe0ZsT>!)jw>QHd`!s3NBeMH!iFD0Ztj@xC)oZ9?zJ!8#y>=cCBkpei7TSxVmM1 z5X&Al!uQDfQ(@F6cC8*=eo{+=26k|D(W3Bzg-h?-V@@+XrFb;MdWA0T;bH)j7*;rw^@?wyQkQ#TI^QnDnzIC#y%vo{OiEV0EF@8>^u#DN9rfRw6F5n7Pty zT2k}4hBw`TbRAJH^fQd*QeR4K*Pp8yeoHaC<%!3D#Etr&rEU3?)dcByO)~vwf$Rd| zjDwk}yhCdC7`Bu3^*R$Z!0A*utQxY1?y*dEy2@<%tnZL$3_3jm%hn((- z5ZE}nC-P97SQo7Elk z?#pZhq%|3782RKMNUsbJ2PekF@^Udw-?zd8Wih=mDiC*03GZ+mE14SjL!Eb+V zOgKqH7+~9;^O7l8-HmyZ1#0kBvndgS>ZhZeLJ{4Jd*|uDKxJyk`3jltU-x|j0w%Jv86c9R1l53i zNMYi;>LB*mJ7Grg0s=-AP&LF4Bs4lbC|y?YLy_5669rKp+Gb@3ov}QS#F`rUB9F>p zz~gv>p=0K63G!{C*=^Jmcd^gdc0>dQ+YQwOXR@kdaeb^qw0rFvnnjyHoVU>9uyMSY zLH9l>f#&|O)Sy)54gPK~xnnxWWZ$s2drv;uy?$*;2@aE@#6{n*dLMTp-*=`=;dl@- zhbCggQ2-ASE}`YRA5%Vni%@-|QWZP6KkJq!bFE!VVcNyDYA6U7`CjW8#j^}B%4gH{ zygrP1Hi|bvou=E)RTfdkKHkbw ze?zEh-Zt$=y^+j7n1 zP)KS8qa{yKgJ~Si zgNe7Z&b{D9$zET>F2`X{e9;=2)xn(0)Nbs=skqJ!#D0R9AZPQe&(zSzKg=hb!|-lw zfTPU6l(iKIav03Jfpz4q(3LFvT` z45V;px%DMZU-59-Y=|X^{f71&BBZiExo{rIO_-3Rqg@Xqs8aL#M_(es6N)15uiNsY zD~3@61?sEcXrDPr&dUo%vcxeeL8zR((228mG}WG{&6@Z7_v6l2TPTXT#%wkqk63HshrpO~LRfD|4q6!6^2(?TZQ&+4tAn7b{N zy}nnS6z+RbVHONroH)k!W5^L)_8j<1hqHI2ZlfJpGD$_An9eHa?L_RDUNpGj`ldW( zJS;{^XuOZ38qBM{B%z{+Ta>M#npTayaHmX?YoyByHk+_agHM}x}l9z_5RT-`vSSxF;eckl9yV2i?!;!WBDHox_ah=B^SwJiLJax7b1h6VnACq z@lKdJe0UjdH;{Kl8Kt5>!5VsZD^@GCOGRWl!0hAqD3Qtq}rAcyo z^~luv*fFYxJaEG(0t>Ldk~Uh)?sf7~y8Vj4Pcv7xiH+J3Rk~O^nXL;G=EBL>x?VSC zo$ESot_QaItBX8N8U0lug9|p(h(7Vo!0l@Gn|?Jj_Ya1>?ObAJmA=z7;$E(C81{V} zSax+1x{VqrrHU|;yJuYYU=#@LdS|&)ZlZji@94b!VBDc}SME`KCk121=Q)|`{0V43 zGOOYEw1eYiNYH6~+7M)TTYsmE>$NHG?p#_WB`sNy8HUsK$EbaVErf#HUA&Cp(mwT@ z|EuyMlDFoC0Tc|Yz=;yJaOUckDo$(V%57xoijVnky|TO%);YOFhzoPmH4YhSbAZAC zd7{!sS%_}$Euib^Pdq&$%;albTeVKo=0{KW1nNS@v|p5Tice4;bIDRG=v$ahUPyXQ zMVkhF5WCe%Gbg`Pf-&l+{Q*d$=-2-!lr{#hyY(L)Ygogn?O;ZqlcOVxrpL6I-sUZc@I?d4hmZ1_q zjUC>Lw%PKa@9#e>f#49C+Al0oWszpv6DJR}1vDXDg4Zz7j^Sg!d5G?Y&87rLhT>au zIYI|@)jR!uE;^4Oj0u3g?ncCE=M1@1R>s0oF48(7KyH3H=e?P~$C<}Rtug%P7K+d)K9ney zKdIFcL`o8>#x^`Wo?@U8l(uJCURr$nn?W^!5VV|gj6DmEeeIKeO!cSLr8rYv9)Ee3 z9(Nm@pR}$8sOY{b2?|# z(=(R9{cf(cgpou_C(DyIE9t~BwybzV=3N0iuK~3UpcwTEuN9V9RSvqkrt83!z^ro-|!A{6x}ezfe<@g`{^I z%ia_#J=anqa8cZ`sl#XE)C&WtG zK%mwrOTmMG&K4#N=Hc!OV5CM3UF(Lbbe)|ZE5P$LNA}1^tX$wUmv`UzJB<$nTw)Ip zw+q4fvI`(TbC48Tb%=FbY_Z~y&t{`GjR~1b10XRn1|gP0{rtmso|X-3gDJVYOdx&MxCzQd7dg zUs~MM_G%LF#GteV?snie&*P&u&UK5Qt(>aD6rx*4NkIXVV@jnSP_Ja%ke<`g!r6ub z8KBqcIn?NC{hFb#RCPP1Mzvv2In*K(yR)HAhH>=@UcPDCKfkZNgjvz{=O0FC_xYMf zRk#ct;eFFeZd0FFgqL_L0$V`$&R4qDB_Lyte|qQxI_s}W#z2y%QOicrTp-SjAKi)b z{rY?6ttD0=OROB^rR6r4#m}~y^48mC+5>zv7EU`zm!!-V_Y((XNIp0^I&fY-s&c$$ z><@(fC`03a`%5$b@bZ3xU2lZeL@F6~%!Khu>xpm%^12FJ1ZgA-ldxUCD?1IuMp1l; zgC4m{<&^CGzLfd5D}O&p@W#GRq;CnYT75EYo_6+)W^f)dx#f`XpZGquOzW!N7{AZ$ z2=6Jsg#bLyqO13F&BcTh#{z{MNB^{-WdEv7$9i;6##0jUnP#R`pU5E3tNMO;07tZc z-8Vu`g|GMu@>P2tKe$a7_9>|49o%=&eRUj%?bNkP?S-0! zszEeX5AlaB(0So9s8w21G1u z$UY+n-Nb7yP9XV@>gp=D|G2+L2!(K29}_0Few1a8=t`~QEZAA?#1zJ2#=e0qj3pbA zZLk+`)r*RG`Xs1KfB>u)PLvXo3}d>z^&}AF2n>>=onI%86@To7CiGY`a~KlJPd9vfEKx={-8^xcZAL(7H0Iji#l;I+Pf- zJk#fHw|2FJMtW(@#1e`gOy!ZP91iruGl(p411&A#^xF)rZTFgVYQ*afLhO|uaq7Ru zEY5}4=u{E({AB3)m z*n;ut^9<4;gT@6(a+>KVdu@wkl-4-qJjm_w)Aw%+_XHwdZPA*}m&y|$|9t5~K*qZ( zmCyekZpWy_G6^@ztrPHs8-Z4Nq&rsppwlCs0lh%bN@8o-9rGVIOG& z5a-LzF^s`f48W0Gi-$a2uL-^!zzkdME^p#}Aq+EWgr98-z*b*P3guVOf%WL!FR9dgDyGxk<}a!|LXXdrN0y3YP}%bQP!c-IUsgyrFzc zrCV8*tz`=SkIPBe4*uEa6#)Ccg$m_3=FLso@s_~Oj_U-Ns}^&ws>zz=93VzV^0zS?#b%XWA6J61kb(&|zbM+S7`GH$M|DiY9;Q-FrOSc}C!@ zWimdBbcyGX^sUs~wD{m(|n~ZxZH`0WZ++Axnz- zybj?-&XO;uS03^7+7_w6bJ+XCz81JZZb=fr6-hy8WB{K`QtMd|Oxn6tZ%8iVkY?Y2 z$FWGxy+z+zi>|wMsEvNOlty~Ba3bQ;XCs8o;WIruW5?Y@bP3| zEPQ!=%$ds@17q49oA@03{_pTOPNfj56YHg+O@Z*uQQ6{u`vIl?@^ zf>eE#(zC~i3H?5L%5$JDtn?$jlQ>xRr$pI75yTg^M6niW8S3lh<6zixc7^lf;1Q?s zn5sMxw=#-02ch{rjvez_k8EsY@WB*OLswHR(Xi3h{ABO&ItHO~r9gA}EbhcMyU6Wv zuvthN?RMlb#;Nr)?6~)sPEACNH5(rY%35aknI8bIqxT*bf?gQo)+suWQpVh^lr$0z zHpP&B_``8ZO8bpZ<|2NLikir|&-|8enNP`AwL|AF;T(sm(qJ)uA?rYc@O9(m5ZVzZ z-bIWCji^dKp}RS@hM^w!Su3jP3h@%uxLH=FbF zrG?Xv@7@9JNUFW0{%CqOT;G#5Iw3T6y60N*XSz&MuD28?INr5C`81USc4_=;bNh-+ ztr3oNnQ7CjvT{id$1|&Wd{To-7ABF-IAk`9uah5ECfTCRJ`6f`U2onNxp}d0A$}G1 zh6-x!qzuw4-wmFQPYX{2wE3$jm{n&w40YOZz|{|Uz;rO{gpX~enNU}9{SUb#6zvL~ zp$Q|jFQm$s(|9X9a=Sc6*X-=>VrIX&|Zc=NO66v$AW5Qdf zDUZjP1gfxYFG9lfT}S{uoBbGUEuz%K6irdTAwx*0^A{6b9=O)9(W-B2PTAe_qyJtBhH|>_&mJq&6O6H@ z3^-1>lo+MMU=c;&*k{|Vm|qhZA7fTOZ2x#%XwUwdDNCeKdMIhRA@Sa{a)nwCGH}wO zZESSl54_wF32iAhw~xd10F}Z+`fNgTn^D|YC#d?4+(pVeSK{08bJ*-vk`%e*$aE8IF-8z5@6;!0|qb$fAWdH3^je)nxjoo@2!7$ox~Yn;~p z2;hU46m@2GaB%3kx4s1EGbUv1I52n|cDj_jk6mO?ct)H#) zujDjVaI3y|+3y|#$w^@N+a52qKhRq0-5nN0;)qQLD_41)>##X{e7KH)Q92Dq%4SpBKU?C1PLJNa1M{E~OP7QgMgadi6=3X$qzjtlTK2w8M2+!nh z0Iv|=&+G4`jCGz*s27i=e5liBp9d91{@Bv!|)wvvqCrPolHM zhxjSz8~U>!uvG~Du&Dnu&$sF{{I+%0LfPp;jr-^<_OOc!bt|0~4)upkqsH08Jqs2TaZP&9nW#j&Qwryax+xN-2)_SAKC~Nis)jy!k^=}1wZ%w!BxdS?XAR# zi~3mx4`3zL)4gC5I3x=mW}Uvs1B_?wbw@|9_cO;LBcJCQ_*0}6O@au2dXe*o6Du|{ zqTNojY#JLcicps`hDEO0;K9=mD`6tWgj4_J!;>~APsiP+jPv!IDErrkY&_x8U^l>c zrX9=e*j)*O!&;Z`y1vg#zCP2QYUsm7h2*1Kaz<5I?Qrw1{6PG+b(})l-ko8dbaEF( z#@)D5(GR*Y_XC#}f3l)TSm$t^yltuuzHc!a_UmK^Ko8F>yzuLDSBG=n^8e$NVuhh4{AH$4b5Vu3~tdmg5A!K_rx*lf&@ALX<8+b9)s(06x72 zcFnYB&h2XzkQXovy&>|nQFLBxU9fP^-VIbC2DV! zA0$m|UnYI=yjC3B$P(u%TH-lI8ww4Op*6nnsBi61?-Z|FHo@Rm`3oeJ5_9&`5O3X4 z?hmi5yEo^<+VJq8s`B)<<_R@^$&|WwHnQ21(cb9Pw1)~&NM%>|yM4BNK9)8X3LIox z2-!oXJi%M&m@I8_Vv;rUIoW4sXaFHR zaL@eiSN1!VIa{CfMTK2F*G)pbrowjV`=ZWdmmBvg=U~AogAN&&O$&~+Kwnx&Z`QjL zk=O$y(W%j_p@NG5tSA8X|Pq?_K5LXTJ;M*r>32l zI4mHMv^-Vjg0btL=Kq`p@dTDViilBqLDJBqDiJabyPo9~cLe};nidx9^+{jnVs63? zeFstYs(uE2#fUen-y4!9hLFQ>sgEJESPE>anip)q0|(=@-0WqEYw;APiQ17xe%Su- z&O+0MGG+QAl;A(_@*1v4gvV{q8ANkz1a3SkD>Yz6>Ay$nTe+RQKdjlb+TVOHAc*{M z^k*KnuI+CBYAcE4?n!~iL5Hn1p)82^m9OQ?@Sw*RVf2ET)A8>(*T{^e&WFD#V-ZY_ zWav&IP4@X#4#uD;@$jKwQu!Dc{8zv~Z=#`gnj-sW$;k?@WDq*O)L1U%2JsesvAci z+gYO}#FZ+@#OsS`ze^x;DORPZnhYbt4(m1v>pmS`iI}Nk;B=AhHg&fmy`}*u16YK~_n49_W*cc$)OY_kxl{Y`$3LywNH}3i18R(kN0OF27oZ;zm!#B8NE%~ltOlrFekJl9ov*p!iGn&7HR^{K$X(_Y$NhvSS7U=6--M=7r4Q*C(S8x` z`W{ZPSd9)}O)xNxy0o`-DaCt1##cJh8n8BWtnll|;BVGV5JBsJ7%y^dqPNAY z>{?=FD+Lw65B_ktC}KplUDdUTMZ1lUo-xic78vRAy`WczaCO2FoGsgl(VD`LkbHGw6 zDps+95e>4cM9wX7nxNDonkvP-ut1&oT7p= zW9s(M;nBsBX|=NWzQSPTlY2YKM)@)^$(4;An=gyIn$41CH-2nKH%7(1OpsuJU4*aU zE=!Ji(^9vi>t@Gh!?UwiUtC$9vM&->)VlV4BOu1=w*|0AbgH?Wc%c-+GP49OAEfAH z=f1kAoY^uHMczAm94vNT|GZYML&%KXCD_40`J__x2X2QupW2 zeL-zj)9f86zJRo)JIpcsuJi9>m8~!8utx@#MlN9069ym(qRql+#vVJ_+TlUF(-j6T zjA;v4b6L1-E^Jb`1HXd1$z7vb9=>#s?)Sve3*izC&*BuQ&^;Ke*_#2 z`qDWxa{i0A3h^CAGq}dzMAES5=GqA3vKODuP;CMYohW!l;e<7(@ zPII12XlkOI@p2O?cU9!N2Qri3W$q7g)QO8!2co<*_XI<9$OzbCZFL} z$s_jDz>bn61I;u^`2Wg3Q_gfX_q(29&h4IXt5#Ii9N!w2{vl+%ns-bNY_~o}rf%k1 zsu3B|<-Jr!`H~QOL-%WS4R}&JsSmt0zca)^?uNO)H8 z1k?_4tXcg-nLGg^$13c}0uIu!+`&GLL`a<{C6RiRGjTeCrBR{?!fjG|%i}B%n@2okyd{$eUTF)4L$%mt8_0$V>zRAE+_2IQv<1>j zMza%WwD+4X%5SFKuLV7=Pgli=llrue`igonzYzv&l57i1p_u$S>dhfG+jNXs;pUOZBse? zhXb_~q~lMHvgB(Ocys3@1$g_0`CA>O*|!{Jn!@_fJq*_?6OMc5D4mtx@BNw--%Er~8sGcrMg=>PFJ0Lh~ae}vk zoy#GrbK#Cnss{Y$@y4EoYHA*+!tfQRm|gwF`TZ*2Au{G?y!8T2Z5^p-OoJmFq8abf zVkTY5n#q1-_mO&B!LvGA>u}~Eq@o)5hY&qjXzA?wc0*185y3;aLbpVPzPM5i z)_Vx>tqN9VFw`11nVKKZA8XDZUMHlPbyJ2O7G-iZ&ke!+Df{pOTWu$~MOkMp!u~hD zQv*4r?GN&u;I^`9FW#UvyN)?@i!S~$=UtJxG*l!<0G<4`w%YaDUS}|@yr(3uMm|xl z>_Yi@c)0#E;V9f&f1ob<8QlZ=syxpE4?PysQSX$QRZA~VSI8t2%h<_hGT?m^cR_z3Wa)3A+4*>oZ!KHcQ)~n1J1_-jdY11 zC>Z<1Cw*?6n~#Q zBaZ^zM6DvXG>fX#_?yZX$U5I!j-uDfZ@2o{+{JNXr{(N z_QguL>=H7^O@^^EjoHEKO(~z*ExjBe;j09z8(ZJnTVZ_wLP)~CBlR#<`}5}_p|;hl ziE9vv_|>h0EV%Y}bu!^s7y-g{^jRludO(|QoB-*4&0MynbAUT7C`bQy3HekkHZ@b0 zSth8HJpjyAT5Pi-)Im272Yn7f62 zpL!r?@Wza$$-HiLc3doHVjNPy0|oOaE0Kcsw2Lizq=ragId#oG{>S$c(p-2VPc=ur zn}ScP_t^r?@Zo4GFSBF$#SrCe&O!%&_;%m$LMEn0jpqJqkav%<8+0S;>;H~lz^D|-inigKV^Eg~Qw*~pM)zR#q9C|O^5TtHaAJhyZ5|)m%<`f6vQvH7{ zM z+HpOqtN_F@@a9=k=%1RTmhI9A)TGUWFgf1W=N6~}W(G?Q?G#aF6*y1T0$xK7p%=xS zueKBxOTmhG*-m$Hv+X$@C6GZTT?9H-t0Ow<3y`H)4Ge?QK8Z5A4at65R%lL^ziNq< z>LcfWi$C9VEr}u~21^P04D2ibl=UWIoE-^xZ(v9u$L4RoW8w++C_=?G6pPZCRpRw$ z$=-z~->JfS(zXnIKo3eWVc5^`Z2+WMxJO@G{pFF~A;TC+H9^S6vy$++ zr8I>C2JdyL8}0qL5EVpKAtbS&aHi1DCMC$|OJzsOW4|Prq~B8~V=3qRuBW0{B=a*} zg$8c7cspnhKh?3+yi~AM*-J)~PK5fM3{}WwIYbS&o_LJ0{Jx#tZ7h|tj?D?xUDc_* zUe||0);Lu*e;x+2$bYpa2f=+meW7k*q87L+1KbCxVtuadP}Wr)`;9Fb@Krwq{f1yR`2oBw#b)$KmfdAvDvV&m<6P5X0ow>#iL41%F$*1nuXp!8qP zLsMBcF9=5CyKEfAKbD+)wxGT58R_aK`q=uvva@cyRJ8;~)t5a^YP`KJvMEHQo>LYxKEM`~ukTDPl z;)O$<@0>kE7Xcl3Cv!O?JP)M1X`PV@>L)$9LAnq7YqOkYWX7?3t}h|nA@5i-o^sWS zHvJYy=m*r--^b6NO%DxJf# z4J63W4M?0^68W}u>Lk#>^#Dz{x*0W@+$; zQT;&_qWYp5?k-DiFMvz;HEZ2TQ_V z6_*N$ihT@%iWTLPm|!_(D(W>)Sh(M863gnsj9-|-$IgvWr#zA2*z&O20a=c2)yLoK zY7|<=y1?#2bn}rW8g0&JIab`+N7V{Cz_Ird#6}Z zMsH+PXQN>4n)cKRBq<0tB+&f2Nun)DaTP0Q3DqcDI%{8lzR`S&$v{L$)Xsp|C?KQc z(wK4?N{W~#Vq@$TPCN*H*+JF6pB13B8R0C?!m`Ap<}@Ob0oJ5Emp_B>07BDGx-m)L zXl-o~a_(8po-K<9N{a(6AM6$nyw}spBOsmX$~7UO%%h$sY90g*0;)F9HDueAZX8D`*=C$dU!TTauo?_Fc>2^4ZV^W~)a2@; z0(Z|m+i=gVYi>gW_8|@_I`C3;GUs_OKjA^+4<2@r8z@f(mlP6(E)@ntq%nZ&%se418fK8lK z`yw_Y`fJcf`0rlT|HUBRrHWaK@0?jjpL5F@w{${lY0X}HDd)hJx-IdD0^l z)H&)%gE?<=b!oj3g7;JaXGkTAV2X^H$fi&#s4AcZa8QIm2~mo?(~XN{n-o^Lmn7Xz zt;{{BMe_=)SNG3oBWt3ADs{VCKi<~s%hp-y)~cg%+1^d9j;KtWQNK z>7M6)b0D%QMYhLjD3UhBiJ&$p`iK+|V4pa{O3;b%5NAix*(Uck(O?h(y$YwD$rk;g zi5w9R!{U>Ra5fK^T3H+X@fetFayhdet!wkkih<1FCsolk#{)Z*1P@hq8f7CtNYZpaov*AVq{UP(2V;h+;{G*B>t*DaLo1(tsu5CT21!qI%o><>G znCrcfzzXjKo6eZ{#pl`;6TGQ@?!Oz^Odenc_2W`+%ICS(oi z6{aoK4?2KL+ApA~7R{AwLZTXP2d9YUwc;dp8I+Lg5DlrZ;+B};*CrE;i9RWY4z`kh zf;|Vj(m>@>LSmH9qzqZ4EaCBDBq4(qnvaRl&jyQ60Uj9reNnlx4pP}nP|H3VY6rLp zg=h~g7Iwy+p|awMgANX$|%rxYI?J`tx=e zVw@FmkkM08BT^8DrQwT}tLz1?G)u~u8u+tZtEcU46BGu`6=trtmuDbTA6H)eT$xfc zrm>RJw_DxYuQ{gz;_sVpC*S;=*O3Jbn^z0p$qrzGc2Ly7nrB~ozsy%E~vin zijG^RM*w4Fokajk?u!wUIvNEf9qS#9ad9PrV`7H;n3g^%2k;*saE+)HgEZ>uqga=X zOWF(|h4stQf+knPEa9(-$Qe5&&rCnmY$9X!e@`DLI&mgS81HS@qR76mp>^3&BtTh4 zaQ}zZIN*;!&N;l~EEf;z(GFhu4}Vvmt~oX4o|B-kPKXKu+-43B@vy`XQXDQ>V-&#G zg~dLTgy+1lv7wz>6jsoz9A7}Ycp_4OeZm-MR)OxSX=QWG^1@0LZWQ6FUSA?JDkl?9 zB1Q~tSusp}8gs_Q!IOQ@ZvW&qhyLdCtL7}Qfe4bx)=iy{TZmXkpTby}sW>&hdUt76oj0Yud z7t!d)x$s`+48t?36H3Gmmwttc&m(8A)4Tos+TGW+Y=@)NJ{@4B*Z~vtUiL0Wfcy`C zC20WU+%zb?JQU!^44L%Oo<##NEB46?b*tTWLD?!Gvq0N&fJ;Oxi&$`LDRaR117JBp z1zUhyB4mQ?2%jb~-Q5iL7cR;_W(Ud)LRT$@kn{XcNoFY|)+z6`x5Ju?$VgTJT3E=)u5uoMb;%RofFyDZ|cdp@{UplNg1FEU+ zv-}YhNXTij+ppI38W?u8={J`fr^{dg>M}J}DiIV~4upoYxS7N1;o-2RdzY3lf)ymB z*6nbV*e4~{=w|(LE+8={J6O`|ug z_w!ELf6&7mh|G~vW16TjV$X4vwLy=STF&|S&m7g|Ub`w%{exlgAafVi^p!8A2VHv# zKf26+`euHBQ+-{f0gu=)vQ`9=w9Qd%>3o27m-E{EHq)iaBfQE33KNuvrIt+W^2O*y^s<))y6gCEl8kr+f* zxW`@Wr;v7e90IDi6%*cz$Sh0?m}xMlc=Kd5pb?5iks`6jFHx99tCxE|?xrKtd8}3^ zTU9+Cxo(@31ctIt$eZuP>5p3JpKZw()tc=@ZVP-jO-$}2rHEdH56lPy8JVnOiZppf zD$?MLl^*;lDM}N1$>jA3&r)TRew`hRdK)W?Evp1Yrv>X5cmG&YX`-?!FM>ACKD@0u zr{ydQ3}lMao}4QHDP~{mq4%_pu_HHHEI&EN$HC$ z20Q7(z~vnh$VF5yEcP%e~ftGq4+YQcA&A&aS}$3yzSq5OLH4R*^Ur z1Rl(mG3t3R7+C0&ABx1GBs~SnW?xJcUx79;7l7&_Qz(Uju)|Ci4IEkc6o-X9@0bgr zK1Ycgx=L-F82tmttlM{rFt#@x7Sx9blrVmz?_f$vg_J#2zVU-6Cm7Bf6FgHP(p1en z@*R|a_~<3ON;HU+Y6l|?JO{njq5HwCWf7R-2UJg9oR14-ah)K#FVFHnPa(DCgYK8+o& zY3DX{8-4+QZ@IIMJ&nL}Wt}K|N|{}dBg;l_8K7!L^tN&qjcDeY7TM^r*}+Mzw5;ak z(^2XB#sWXg%iT7_FKH+-@A#J-@eS`+U0?unv6{mDAvMXa1?vzYSb})&P$a7nMHY!- z{;WCzU#zkab|JD^3aC;6Gx1VMBt}gf=3Hfl}jU3u0 z02p%-V)Tme@BVh4CfhUDQgb=T-Yia7H4;D5D0o<+mpf*HwKx9F??2kX)E`LV2@zlA zvQu)ZysA%ssej4d5&>@Rg_JOA*Ta#t*C19QXcnYfiLj|SRrGWr2yn|n{ZR&jNVAKCiC zBD5^I+K7%0zQf4ILV2|&TOPnW{0C!pmEBQ0~}R&mY6F}Wrzucr$aDW z{!PLoILmnVu+3GkF8uwY&)DG#CoHtv$@pk$h`9Bv`)M;Me! zKN?h2Y~GK{2c2Z9(Q&V{w#?*q?l*@sL`r~~aGQza_R zYEr~X6S=B?k~k7$%9dg%X&E7OGO0$cY7iZmfFlX;rS*g$O|t#mLv`vB5wekCs35>C z#~w&EnJ1;h%_Jf4Bg-27MbT;#%Ph-SLPIsr3Ydg94jX-P77hZ1?bD8L8P-Q-@ex#K?@m^~H@etAB430$uCRt=*9t&el^>B!Q9_a; zN+=Vi7*mW^?#%(}67|YRh>AOZ`C-3e^(0!rZVL770;Ty#2X zwUc%aqxMn%=wmss2!2Fe6P-)IaN!dvYcav`F-ja-6fv24P)7ib6BS5Roo8CLHlIXI zA9-SZdc~Hsrf4?_mQGv-yHN?W+ioZa1s0On>i%}`y|`qT2WuSIYAs6OGkD5{wPl?? zGS6zpd1?)OH3skj6}3uoCtNO$X1XHysBqlQcoBl zXp^Tf9`^j1!mH&9&`?6*GP{yj7423|U*P74tO;2bY$fxoXP!ae*3(ZfRA(r)p_Kv3 z;G#`X{GyZOhPM}kL+p4jZqL-uRop z!-&hykX(&2CM*Q$ASGh{ssoM6e@(t2wM8;q7w;5Kg7~x(fKREk_55x7TZL=Ve+TnZ| zlt(qVQ2V*Q--9h<_AUK@%8K5=EiAa2XFME!G-LF6pCw4KnhuXlni$|YL#;9Szv*cE5Depow~F1zT27KM8`Q;Co!$_}9wGTL1d*uoy{P0bL0_mpw-&bOJC< z)~BEyimS)Qn4)ddL?D&?g#r>rLCXF?f0@S z{N(%HEbXQ{T~tw$2b}^%6NDb6zlVk?0MloofB*}YDhL-CwbE(jo|MfOVhUDBoHlS0 z@N#46yptZF?_=w;hDdfOkxlf#D7YS=Nv7L?D^Oz$AA z>N?C{Rd}JC)IoJb7{M~iDd>o&8@Igm%(VP0wmWfVJ8@&#g!CeuEGdz~|BxLquHN{b zn&8df_#K8%q8v$HvVPG_V-uML#2+*{kp-`g?uZ?s8(6wF8=CbP*A>NVS6zj~6lGu?H+A4*Ze1193;NCBmVS z^9Aor+(zkm1v?++re&YvpEll{borQQF5#v~fe9r6W%*HI9-!RTqsk6HivUWPa>8qu zV@p5p4PbXr{pBy{{FfRSxMt#M_O+2hVaGypEl&7ba~m<0e^Ui2m~8x`+2w(^%ALy` z37tdKrI}F5M{Z0ec;h$N!N5j>7xE^8Frmy!prU5?i4M==p{d|q)ikNj66&`k3X9#8 z-9;4u#KCN@9|PCYgj$5WRj&^T2xTqG*l|&aEYlvCRBc?#_R|pPiN$eJNA#EXDa=y* zFTpp)2ASZl=UG^*CZ$%5}3W8YbPAe=^neeey%eZ^gxgI zd-ds>SUWboEdwQ;VtB?=jkx@i;&9sLtf|u+$&`4Zz(GUQpD61i z7QN(qu~>HGXZXINAtbsj!~)6PZ10Hg(u%s6g8 z4~8%g@cvrpzpxUlUI|H8>!+w=u>8{wX$NrZf*BAyh;e7Ut`qKoMK!6j^Pi6FqnqDa|X` zibW2W>S$_c%!sBC1QeAoJ0c7cw!P3Kv`hjIIi6W<5?NJd>vn7V)mM@~z7hZFYuVfF zVkgt)Bv(y^0-gm3Jwo9)NupPU^hsG8e9$xA-11+$X|`i)H(S5o2|vzjKWph9#1y

o2ZK(c)<~e+GX&oGAj@ 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

C6&xs=Mk9K7w*-~n(X(80{k^tJUaCJc6U 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

E;kn*ZXkmD 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%0Aj`&ViB~+_JT2 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 diff --git a/genplus.doc b/genplus.doc deleted file mode 100644 index 7d52d71e4f1d64f768273305d90cd714317a8719..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290304 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%0AeyX-$gVSqSc5wr*$EJX-NQgI?0 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ξpn|$^O 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⋙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 19] = EEPROM; + m68k_readmap_16[eeprom.type.sda_out_adr >> 19] = EEPROM; + m68k_writemap_8[eeprom.type.sda_in_adr >> 19] = EEPROM; + m68k_writemap_16[eeprom.type.sda_in_adr >> 19] = EEPROM; + m68k_writemap_8[eeprom.type.scl_adr >> 19] = EEPROM; + m68k_writemap_16[eeprom.type.scl_adr >> 19] = EEPROM; + } + else + { + /* 64KB SRAM */ + m68k_readmap_8[sram.start >> 19] = SRAM; + m68k_readmap_16[sram.start >> 19] = SRAM; + if (sram.write) + { + m68k_writemap_8[sram.start >> 19] = SRAM; + m68k_writemap_16[sram.start >> 19] = SRAM; + } + } + } + /********************************************** + SVP CHIP + ***********************************************/ + svp = NULL; + if ((strstr(rominfo.product,"MK-1229") != NULL) || + (strstr(rominfo.product,"G-7001") != NULL)) + { + svp_init(); + m68k_readmap_16[6] = SVP_DRAM; + m68k_writemap_16[6] = SVP_DRAM; + m68k_readmap_16[7] = SVP_CELL; + m68k_writemap_16[7] = SVP_CELL; + } + + /********************************************** + SEGA MENACER + ***********************************************/ + input.x_offset = 0; + input.y_offset = 0; + + if (strstr(rominfo.product,"MK-1658") != NULL) /* Menacer 6-in-1 pack */ + { + /* save current setting */ + if (old_system[0] == -1) old_system[0] = input.system[0]; + if (old_system[1] == -1) old_system[1] = input.system[1]; + + input.system[0] = NO_SYSTEM; + input.system[1] = SYSTEM_MENACER; + + /* specific game adjustment */ + input.x_offset = 0x52; + } + else if (strstr(rominfo.product,"T-081156") != NULL) /* T2: Arcade Game */ + { + input.system[0] = SYSTEM_GAMEPAD; + input.system[1] = SYSTEM_MENACER; + + /* specific game adjustment */ + input.x_offset = 0x84; + input.y_offset = 8; + } + else if (strstr(rominfo.product,"T-95136") != NULL) /* Lethal Enforcers II */ + { + input.system[0] = SYSTEM_GAMEPAD; + input.system[1] = SYSTEM_JUSTIFIER; + + /* specific game adjustment */ + input.x_offset = 0x18; + } + else if ((strstr(rominfo.product,"T-95096") != NULL) || /* Lethal Enforcers (USA,Europe) */ + (strstr(rominfo.product,"T-95073") != NULL)) /* Lethal Enforcers (J)*/ + { + input.system[0] = SYSTEM_GAMEPAD; + input.system[1] = SYSTEM_JUSTIFIER; + } + + /********************************************** + J-CART + ***********************************************/ + j_cart = 0; + if (((strstr(rominfo.product,"00000000") != NULL) && (rominfo.checksum == 0x168b)) || /* Super Skidmarks, Micro Machines Military*/ + ((strstr(rominfo.product,"00000000") != NULL) && (rominfo.checksum == 0x165e)) || /* Pete Sampras Tennis (1991), Micro Machines 96 */ + ((strstr(rominfo.product,"00000000") != NULL) && (rominfo.checksum == 0xcee0)) || /* Micro Machines Military (bad) */ + ((strstr(rominfo.product,"00000000") != NULL) && (rominfo.checksum == 0x2c41)) || /* Micro Machines 96 (bad) */ + ((strstr(rominfo.product,"XXXXXXXX") != NULL) && (rominfo.checksum == 0xdf39)) || /* Sampras Tennis 96 */ + ((strstr(rominfo.product,"T-123456") != NULL) && (rominfo.checksum == 0x1eae)) || /* Sampras Tennis 96 */ + ((strstr(rominfo.product,"T-120066") != NULL) && (rominfo.checksum == 0x16a4)) || /* Pete Sampras Tennis (1994)*/ + (strstr(rominfo.product,"T-120096") != NULL)) /* Micro Machines 2 */ + { + if (genromsize <= 0x380000) /* just to be sure (checksum might not be enough) */ + { + j_cart = 1; + m68k_readmap_16[7] = J_CART; + m68k_writemap_16[7] = J_CART; + + /* save current setting */ + if (old_system[0] == -1) old_system[0] = input.system[0]; + if (old_system[1] == -1) old_system[1] = input.system[1]; + + /* PORT B by default */ + input.system[0] = SYSTEM_GAMEPAD; + input.system[1] = SYSTEM_GAMEPAD; + } + } + + /********************************************** + ULTIMATE MK3 HACK + ***********************************************/ + if (genromsize > 0x600000) + { + for (i=8; i<20; i++) + { + m68k_readmap_8[i] = UMK3_HACK; + m68k_readmap_16[i] = UMK3_HACK; + } + +#if M68K_EMULATE_ADDRESS_ERROR + /* this game does not work properly on real hardware */ + emulate_address_error = 0; +#endif + } +#if M68K_EMULATE_ADDRESS_ERROR + /* default behavior */ + else emulate_address_error = 1; +#endif + + /********************************************** + Mappers & HW registers + ***********************************************/ + memset(&cart_hw, 0, sizeof(cart_hw)); + + /* default write handler for !TIME signal */ + cart_hw.time_w = default_time_w; + + /* search for game into database */ + for (i=0; i < CART_CNT + 1; i++) + { + /* known cart found ! */ + if ((rominfo.checksum == rom_database[i].chk_1) && + (realchecksum == rom_database[i].chk_2)) + { + /* retrieve hardware information */ + memcpy(&cart_hw, &(rom_database[i].cart_hw), sizeof(cart_hw)); + + /* initialize memory handlers for $400000-$7fffff region */ + int j = rom_database[i].bank_start; + while (j <= rom_database[i].bank_end) + { + if (cart_hw.regs_r) m68k_readmap_8[j] = CART_HW; + if (cart_hw.regs_w) m68k_writemap_8[j] = CART_HW; + j++; + } + i = CART_CNT + 1; + } + } +} + +/************************************************************ + MAPPER handlers +*************************************************************/ +/* + "official" ROM/RAM switch +*/ +static inline void sega_mapper_w(unsigned int address, unsigned int value) +{ + uint8 bank = (address >> 1) & 7; + + switch (bank) + { + case 0: + { + /* ROM/RAM switch (Phantasy Star IV, Story of Thor/Beyond Oasis, Sonic 3 & Knuckles) */ + if (value & 1) + { + /* SRAM is mapped above 200000h */ + m68k_readmap_8[4] = SRAM; + m68k_readmap_16[4] = SRAM; + + if (value & 2) + { + /* SRAM write protected */ + m68k_writemap_8[4] = UNUSED; + m68k_writemap_16[4] = UNUSED; + } + else + { + /* SRAM write enabled */ + m68k_writemap_8[4] = SRAM; + m68k_writemap_16[4] = SRAM; + } + } + else + { + /* ROM is mapped above 200000h */ + m68k_readmap_8[4] = ROM; + m68k_readmap_16[4] = ROM; + m68k_writemap_8[4] = UNUSED; + m68k_writemap_16[4] = UNUSED; + } + break; + } + + default: + /* ROM Bankswitch (Super Street Fighter 2) + documented by Bart Trzynadlowski (http://www.trzy.org/files/ssf2.txt) + */ + rom_readmap[bank] = &cart_rom[value << 19]; + break; + } +} + +/* + custom ROM Bankswitch used by pirate "Multi-in-1" carts + (documented by Haze) +*/ +static inline void multi_mapper_w(unsigned int address, unsigned int value) +{ + int i; + uint32 bank_addr = (address & 0x3F) << 16; + + /* those games are generally not bigger than 1MB but it's safer to update all 512K banks */ + for (i=0; i<8; i++) + { + if (bank_addr >= genromsize) return; + rom_readmap[i] = &cart_rom[bank_addr]; + bank_addr += 0x80000; + } +} + +/* + Special ROM Bankswitch used for copy protection + Used by unlicensed cartridges (Lion King III, Super King Kong 99) + (documented by Haze) +*/ +void special_mapper_w(unsigned int address, unsigned int value) +{ + rom_readmap[0] = &cart_rom[value << 15]; +} + +/* + Realtec ROM Bankswitch (Earth Defend, Balloon Boy & Funny World, Whac-A-Critter) + (documented by TascoDeluxe) +*/ +void realtec_mapper_w(unsigned int address, unsigned int value) +{ + uint32 base_addr; + + if (cart_hw.realtec & 2) + { + int i; + cart_hw.realtec &= ~2; + + /* disable Realtec BOOTROM */ + for (i=0; i<8; i++) + { + m68k_readmap_8[i] = ROM; + m68k_readmap_16[i] = ROM; + } + } + + switch (address) + { + case 0x404000: /* three lower bits of ROM base address */ + cart_hw.regs[0] = value; + base_addr = (value | ((cart_hw.regs[1] & 6) << 2)) << 17; + rom_readmap[0] = &cart_rom[base_addr]; + return; + + case 0x400000: /* two higher bits of ROM base address */ + cart_hw.regs[1] = value; + base_addr = ((cart_hw.regs[0] & 7) | ((value & 6) << 2)) << 17; + rom_readmap[0] = &cart_rom[base_addr]; + return; + + case 0x402000: /* size of ROM range to map */ + cart_hw.regs[2] = value; + return; + + default: + return; + } +} + + +/* Game no Kanzume Otokuyou ROM Mapper */ +void seganet_mapper_w(unsigned int address, unsigned int value) +{ + int i; + switch (address & 0xff) + { + case 0x01: + if (value & 1) + { + /* ROM disabled */ + for (i=0; i<8; i++) + { + m68k_readmap_8[i] = UNUSED; + m68k_readmap_16[i] = UNUSED; + } + } + else + { + /* ROM enabled */ + for (i=0; i<8; i++) + { + m68k_readmap_8[i] = ROM; + m68k_readmap_16[i] = ROM; + } + } + break;; + + case 0xf1: + if (value & 1) + { + /* ROM Write protected*/ + for (i=0; i<8; i++) + { + m68k_writemap_8[i] = UNUSED; + m68k_writemap_16[i] = UNUSED; + } + } + else + { + /* ROM Write enabled */ + for (i=0; i<8; i++) + { + m68k_writemap_8[i] = ROM; + m68k_writemap_16[i] = ROM; + } + } + break; + + default: + break; + } +} + +/* + RADICA ROM Bankswitch + (documented by Haze) +*/ +unsigned int radica_mapper_r(unsigned int address) +{ + /* 64KB ROM banks */ + uint8 bank = (address >> 1) & 0x3F; + rom_readmap[0] = &cart_rom[bank * 0x10000]; + rom_readmap[1] = &cart_rom[bank * 0x10000 + 0x80000]; /* ROM is max. 1MB */ + return 0xff; +} + + +/************************************************************ + default !TIME signal handler +*************************************************************/ + +/* default ROM bankswitch */ +void default_time_w(unsigned int address, unsigned int value) +{ + if ((address & 0xf1) == 0xf1) sega_mapper_w(address, value); + else if (address < 0xa13040) multi_mapper_w(address, value); +} + +/************************************************************ + Internal register handlers +*************************************************************/ + +unsigned int default_regs_r(unsigned int address) +{ + uint8 i; + for (i=0; i<4; i++) + { + if ((address & cart_hw.mask[i]) == cart_hw.addr[i]) + return cart_hw.regs[i]; + } + + /* unused */ + return -1; +} + +void default_regs_w(unsigned int address, unsigned int value) +{ + uint8 i; + for (i=0; i<4; i++) + { + if ((address & cart_hw.mask[i]) == cart_hw.addr[i]) + { + cart_hw.regs[i] = value; + } + } +} + +/* special register behaviour (Lion King III, Super Donkey Kong 99) */ +void special_regs_w(unsigned int address, unsigned int value) +{ + /* ROM bankswitch */ + if ((address >> 16) > 0x6f) + { + special_mapper_w(address, value); + return; + } + + /* write regs */ + default_regs_w(address, value); + + /* bitswapping (documented by Haze) */ + uint8 temp = cart_hw.regs[0]; + switch (cart_hw.regs[1]) + { + case 1: + cart_hw.regs[2] = (temp >> 1); + return; + + case 2: + cart_hw.regs[2] = ((temp >> 4) | ((temp & 0x0F) << 4)); + return; + + default: + cart_hw.regs[2] = (((temp >> 7) & 0x01) | ((temp >> 5) & 0x02) | + ((temp >> 3) & 0x04) | ((temp >> 1) & 0x08) | + ((temp << 1) & 0x10) | ((temp << 3) & 0x20) | + ((temp << 5) & 0x40) | ((temp << 7) & 0x80)); + return; + } +} diff --git a/source/cart_hw/cart_hw.h b/source/cart_hw/cart_hw.h new file mode 100644 index 0000000..a7eec0a --- /dev/null +++ b/source/cart_hw/cart_hw.h @@ -0,0 +1,53 @@ +/**************************************************************************** + * Genesis Plus 1.2a + * Cartridge Hardware support + * + * code by Eke-Eke, GC/Wii port + * + * Lots of protection mechanism have been discovered by Haze + * (http://haze.mameworld.info/) + * + * Realtec mapper has been figured out by TascoDeluxe + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ***************************************************************************/ + +#ifndef _CART_HW_H_ +#define _CART_HW_H_ + +/* Hardware description */ +typedef struct +{ + uint8 regs[4]; /* internal registers (R/W) */ + uint32 mask[4]; /* registers address mask */ + uint32 addr[4]; /* registers address */ + uint8 realtec; /* bit 0: realtec mapper detected, bit 1: bootrom enabled */ + unsigned int (*time_r)(unsigned int address); /* !TIME signal ($a130xx) read handler */ + void (*time_w)(unsigned int address, unsigned int data); /* !TIME signal ($a130xx) write handler */ + unsigned int (*regs_r)(unsigned int address); /* cart hardware region ($400000-$7fffff) read handler */ + void (*regs_w)(unsigned int address, unsigned int data); /* cart hardware region ($400000-$7fffff) write handler */ +} T_CART_HW; + +/* global variables */ +extern T_CART_HW cart_hw; +extern uint8 j_cart; + +/* Function prototypes */ +extern void cart_hw_reset(); +extern void cart_hw_init(); + +#endif + + diff --git a/source/eeprom.c b/source/cart_hw/eeprom.c similarity index 76% rename from source/eeprom.c rename to source/cart_hw/eeprom.c index cf3bf33..5611ac0 100644 --- a/source/eeprom.c +++ b/source/cart_hw/eeprom.c @@ -1,439 +1,463 @@ -/**************************************************************************** - * Serial EEPROM support for Sega Genesis games - * - * Copyright (C) 2007 EkeEke - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - ***************************************************************************/ - -#include "shared.h" -#include "rominfo.h" - -#define GAME_COUNT 21 - -typedef struct -{ - char game_id[14]; - uint16 chk; - T_EEPROM_TYPE type; -} T_GAME_ENTRY; - -T_GAME_ENTRY database[GAME_COUNT] = -{ - /* ACCLAIM mappers */ - /* 24C02 (old mapper) */ - {{"T-081326" }, 0, {8, 0xFF, 0xFF, 0x200000, 0x200000, 0x200000, 0, 1, 1}}, /* NBA Jam (UE) */ - {{"T-81033" }, 0, {8, 0xFF, 0xFF, 0x200000, 0x200000, 0x200000, 0, 1, 1}}, /* NBA Jam (J) */ - /* 24C02 */ - {{"T-81406" }, 0, {8, 0xFF, 0xFF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, /* NBA Jam TE */ - {{"T-081276" }, 0, {8, 0xFF, 0xFF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, /* NFL Quarterback Club */ - /* 24C16 */ - {{"T-081586" }, 0, {8, 0x7FF, 0x7FF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, /* NFL Quarterback Club '96 */ - /* 24C65 */ - {{"T-81576" }, 0, {16, 0x1FFF, 0x1FFF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, /* College Slam */ - {{"T-81476" }, 0, {16, 0x1FFF, 0x1FFF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, /* Frank Thomas Big Hurt Baseball */ - - /* EA mapper (24C01 only) */ - {{"T-50396" }, 0, {7, 0x7F, 0x7F, 0x200000, 0x200000, 0x200000, 7, 7, 6}}, /* NHLPA Hockey 93 (UE) */ - {{"T-50176" }, 0, {7, 0x7F, 0x7F, 0x200000, 0x200000, 0x200000, 7, 7, 6}}, /* Rings of Power */ - - /* SEGA mapper (24C01 only) */ - {{"T-12046" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Megaman - The Wily Wars */ - {{"T-12053" }, 0xEA80, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Rockman Mega World (J) [A] */ - {{"MK-1215" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Evander 'Real Deal' Holyfield's Boxing */ - {{"MK-1228" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Greatest Heavyweights of the Ring (U) */ - {{"G-5538" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Greatest Heavyweights of the Ring (J) */ - {{"PR-1993" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Greatest Heavyweights of the Ring (E) */ - {{"G-4060" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Wonderboy in Monster World */ - - /* CODEMASTERS mapper */ - /* 24C08 */ - {{"T-120096" }, 0, {8, 0x3FF, 0x3FF, 0x300000, 0x380001, 0x300000, 0, 7, 1}}, /* Micro Machines 2 - Turbo Tournament (E) */ - {{"00000000-00"}, 0x168B, {8, 0x3FF, 0x3FF, 0x300000, 0x380001, 0x300000, 0, 7, 1}}, /* Micro Machines Military */ - {{"00000000-00"}, 0xCEE0, {8, 0x3FF, 0x3FF, 0x300000, 0x380001, 0x300000, 0, 7, 1}}, /* Micro Machines Military (Bad)*/ - /* 24C16 */ - {{"00000000-00"}, 0x165E, {8, 0x7FF, 0x7FF, 0x300000, 0x380001, 0x300000, 0, 7, 1}}, /* Micro Machines Turbo Tournament 96 */ - {{"00000000-00"}, 0x2C41, {8, 0x7FF, 0x7FF, 0x300000, 0x380001, 0x300000, 0, 7, 1}} /* Micro Machines Turbo Tournament 96 (Bad)*/ -}; - - -T_EEPROM eeprom; - -void EEPROM_Init() -{ - uint8 i = 0; - - /* initialize eeprom */ - memset(&eeprom, 0, sizeof(T_EEPROM)); - eeprom.sda = eeprom.old_sda = 1; - eeprom.scl = eeprom.old_scl = 1; - eeprom.state = STAND_BY; - - sram.custom = 0; - - /* look into game database */ - while ((i eeprom.type.sda_out_adr) sram.start = eeprom.type.sda_out_adr; - if (sram.start > eeprom.type.scl_adr) sram.start = eeprom.type.scl_adr; - } - else if ((sram.end - sram.start) < 2) - { - /* Game not found in database but header indicates it uses EEPROM */ - sram.custom = 1; - sram.on = 1; - sram.write = 1; - - /* set SEGA mapper as default */ - memcpy(&eeprom.type, &database[9].type, sizeof(T_EEPROM_TYPE)); - } -} - -static void Detect_START() -{ - if (eeprom.old_scl && eeprom.scl) - { - if (eeprom.old_sda && !eeprom.sda) - { - eeprom.cycles = 0; - eeprom.slave_mask = 0; - if (eeprom.type.address_bits == 7) - { - eeprom.word_address = 0; - eeprom.state = GET_WORD_ADR_7BITS; - } - else eeprom.state = GET_SLAVE_ADR; - } - } -} - -static void Detect_STOP() -{ - if (eeprom.old_scl && eeprom.scl) - { - if (!eeprom.old_sda && eeprom.sda) - { - eeprom.state = STAND_BY; - } - } -} - -void EEPROM_Write(unsigned int address, unsigned int value) -{ - uint16 sram_address = 0; - - /* decode SCL and SDA value */ - if (eeprom.type.sda_in_adr == address) eeprom.sda = (value >> eeprom.type.sda_in_bit) & 1; - else eeprom.sda = eeprom.old_sda; - if (eeprom.type.scl_adr == address) eeprom.scl = (value >> eeprom.type.scl_bit) & 1; - else eeprom.scl = eeprom.old_scl; - - /* EEPROM current state */ - switch (eeprom.state) - { - /* Standby Mode */ - case STAND_BY: - Detect_START(); - Detect_STOP(); - break; - - - /* Suspended Mode */ - case WAIT_STOP: - Detect_STOP(); - break; - - - /* Get Word Address 7 bits: MODE-1 only (24C01) - * and R/W bit - */ - case GET_WORD_ADR_7BITS: - Detect_START(); - Detect_STOP(); - - /* look for SCL LOW to HIGH transition */ - if (!eeprom.old_scl && eeprom.scl) - { - if (eeprom.cycles == 0) eeprom.cycles ++; - } - - - /* look for SCL HIGH to LOW transition */ - if (eeprom.old_scl && !eeprom.scl && (eeprom.cycles > 0)) - { - if (eeprom.cycles < 8) eeprom.word_address |= (eeprom.old_sda << (7 - eeprom.cycles)); - else if (eeprom.cycles == 8) eeprom.rw = eeprom.old_sda; - else - { /* ACK CYCLE */ - eeprom.cycles = 0; - eeprom.word_address &= eeprom.type.size_mask; - eeprom.state = eeprom.rw ? READ_DATA : WRITE_DATA; - } - - eeprom.cycles ++; - } - break; - - - /* Get Slave Address (3bits) : MODE-2 & MODE-3 only (24C01 - 24C512) (0-3bits, depending on the array size) - * or/and Word Address MSB: MODE-2 only (24C04 - 24C16) (0-3bits, depending on the array size) - * and R/W bit - */ - case GET_SLAVE_ADR: - - Detect_START(); - Detect_STOP(); - - /* look for SCL LOW to HIGH transition */ - if (!eeprom.old_scl && eeprom.scl) - { - if (eeprom.cycles == 0) eeprom.cycles ++; - } - - /* look for SCL HIGH to LOW transition */ - if (eeprom.old_scl && !eeprom.scl && (eeprom.cycles > 0)) - { - if ((eeprom.cycles > 4) && (eeprom.cycles <8)) - { - if ((eeprom.type.address_bits == 16) || - (eeprom.type.size_mask < (1 << (15 - eeprom.cycles)))) - { - /* this is a SLAVE ADDRESS bit */ - eeprom.slave_mask |= (eeprom.old_sda << (7 - eeprom.cycles)); - } - else - { - /* this is a WORD ADDRESS high bit */ - if (eeprom.old_sda) eeprom.word_address |= (1 << (15 - eeprom.cycles)); - else eeprom.word_address &= ~(1 << (15 - eeprom.cycles)); - } - } - else if (eeprom.cycles == 8) eeprom.rw = eeprom.old_sda; - else if (eeprom.cycles > 8) - { - /* ACK CYCLE */ - eeprom.cycles = 0; - if (eeprom.type.address_bits == 16) - { - /* two ADDRESS bytes */ - eeprom.state = eeprom.rw ? READ_DATA : GET_WORD_ADR_HIGH; - eeprom.slave_mask <<= 16; - } - else - { - /* one ADDRESS byte */ - eeprom.state = eeprom.rw ? READ_DATA : GET_WORD_ADR_LOW; - eeprom.slave_mask <<= 8; - } - } - - eeprom.cycles ++; - } - break; - - /* Get Word Address MSB (4-8bits depending on the array size) - * MODE-3 only (24C32 - 24C512) - */ - case GET_WORD_ADR_HIGH: - - Detect_START(); - Detect_STOP(); - - /* look for SCL HIGH to LOW transition */ - if (eeprom.old_scl && !eeprom.scl) - { - if (eeprom.cycles < 9) - { - if ((eeprom.type.size_mask + 1) < (1 << (17 - eeprom.cycles))) - { - /* ignored bit: slave mask should be right-shifted by one */ - eeprom.slave_mask >>= 1; - } - else - { - /* this is a WORD ADDRESS high bit */ - if (eeprom.old_sda) eeprom.word_address |= (1 << (16 - eeprom.cycles)); - else eeprom.word_address &= ~(1 << (16 - eeprom.cycles)); - } - - eeprom.cycles ++; - } - else - { - /* ACK CYCLE */ - eeprom.cycles = 1; - eeprom.state = GET_WORD_ADR_LOW; - } - } - break; - - - /* Get Word Address LSB: 7bits (24C01) or 8bits (24C02-24C512) - * MODE-2 and MODE-3 only (24C01 - 24C512) - */ - case GET_WORD_ADR_LOW: - - Detect_START(); - Detect_STOP(); - - /* look for SCL HIGH to LOW transition */ - if (eeprom.old_scl && !eeprom.scl) - { - if (eeprom.cycles < 9) - { - if ((eeprom.type.size_mask + 1) < (1 << (9 - eeprom.cycles))) - { - /* ignored bit (X24C01): slave mask should be right-shifted by one */ - eeprom.slave_mask >>= 1; - } - else - { - /* this is a WORD ADDRESS high bit */ - if (eeprom.old_sda) eeprom.word_address |= (1 << (8 - eeprom.cycles)); - else eeprom.word_address &= ~(1 << (8 - eeprom.cycles)); - } - - eeprom.cycles ++; - } - else - { - /* ACK CYCLE */ - eeprom.cycles = 1; - eeprom.word_address &= eeprom.type.size_mask; - eeprom.state = WRITE_DATA; - } - } - break; - - - /* - * Read Cycle - */ - case READ_DATA: - - Detect_START(); - Detect_STOP(); - - /* look for SCL HIGH to LOW transition */ - if (eeprom.old_scl && !eeprom.scl) - { - if (eeprom.cycles < 9) eeprom.cycles ++; - else - { - eeprom.cycles = 1; - - /* ACK not received */ - if (eeprom.old_sda) eeprom.state = WAIT_STOP; - } - } - break; - - - /* - * Write Cycle - */ - case WRITE_DATA: - - Detect_START(); - Detect_STOP(); - - /* look for SCL HIGH to LOW transition */ - if (eeprom.old_scl && !eeprom.scl) - { - if (eeprom.cycles < 9) - { - /* Write DATA bits (max 64kBytes) */ - sram_address = (eeprom.slave_mask | eeprom.word_address) & 0xFFFF; - if (eeprom.old_sda) sram.sram[sram_address] |= (1 << (8 - eeprom.cycles)); - else sram.sram[sram_address] &= ~(1 << (8 - eeprom.cycles)); - - if (eeprom.cycles == 8) - { - /* WORD ADDRESS is incremented (roll up at maximum pagesize) */ - eeprom.word_address = (eeprom.word_address & (0xFFFF - eeprom.type.pagewrite_mask)) | - ((eeprom.word_address + 1) & eeprom.type.pagewrite_mask); - } - - eeprom.cycles ++; - } - else eeprom.cycles = 1; /* ACK cycle */ - } - break; - } - - eeprom.old_scl = eeprom.scl; - eeprom.old_sda = eeprom.sda; -} - - -unsigned int EEPROM_Read(unsigned int address) -{ - uint16 sram_address; - uint8 sda_out = eeprom.sda; - - /* EEPROM state */ - switch (eeprom.state) - { - case READ_DATA: - if (eeprom.cycles < 9) - { - /* Return DATA bits (max 64kBytes) */ - sram_address = (eeprom.slave_mask | eeprom.word_address) & 0xFFFF; - sda_out = (sram.sram[sram_address] >> (8 - eeprom.cycles)) & 1; - - if (eeprom.cycles == 8) - { - /* WORD ADDRESS is incremented (roll up at maximum array size) */ - eeprom.word_address ++; - eeprom.word_address &= eeprom.type.size_mask; - } - } - break; - - case GET_WORD_ADR_7BITS: - case GET_SLAVE_ADR: - case GET_WORD_ADR_HIGH: - case GET_WORD_ADR_LOW: - case WRITE_DATA: - if (eeprom.cycles == 9) sda_out = 0; - break; - - default: - break; - } - - if (address == eeprom.type.sda_out_adr) return (sda_out << eeprom.type.sda_out_bit); - else return 0; -} +/**************************************************************************** + * Genesis Plus 1.2a + * Serial EEPROM support + * + * code by Eke-Eke, GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ***************************************************************************/ + +#include "shared.h" + +typedef struct +{ + char game_id[14]; + uint16 chk; + T_EEPROM_TYPE type; +} T_GAME_ENTRY; + +T_GAME_ENTRY database[24] = +{ + /* ACCLAIM mappers */ + /* 24C02 (old mapper) */ + {{"T-081326" }, 0, {8, 0xFF, 0xFF, 0x200001, 0x200001, 0x200001, 0, 1, 1}}, /* NBA Jam (UE) */ + {{"T-81033" }, 0, {8, 0xFF, 0xFF, 0x200001, 0x200001, 0x200001, 0, 1, 1}}, /* NBA Jam (J) */ + + /* 24C02 */ + {{"T-81406" }, 0, {8, 0xFF, 0xFF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, /* NBA Jam TE */ + {{"T-081276" }, 0, {8, 0xFF, 0xFF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, /* NFL Quarterback Club */ + /* 24C16 */ + {{"T-081586" }, 0, {8, 0x7FF, 0x7FF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, /* NFL Quarterback Club '96 */ + /* 24C65 */ + {{"T-81576" }, 0, {16, 0x1FFF, 0x1FFF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, /* College Slam */ + {{"T-81476" }, 0, {16, 0x1FFF, 0x1FFF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, /* Frank Thomas Big Hurt Baseball */ + + /* EA mapper (24C01 only) */ + {{"T-50396" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 7, 7, 6}}, /* NHLPA Hockey 93 (UE) */ + {{"T-50176" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 7, 7, 6}}, /* Rings of Power */ + + /* SEGA mapper (24C01 only) */ + {{"T-12046" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Megaman - The Wily Wars */ + {{"T-12053" }, 0xEA80, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Rockman Mega World (J) [A] */ + {{"MK-1215" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Evander 'Real Deal' Holyfield's Boxing */ + {{"MK-1228" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Greatest Heavyweights of the Ring (U) */ + {{"G-5538" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Greatest Heavyweights of the Ring (J) */ + {{"PR-1993" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Greatest Heavyweights of the Ring (E) */ + {{"G-4060" }, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Wonderboy in Monster World */ + {{"00001211-00"}, 0, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Sports Talk Baseball */ + + /* CODEMASTERS mapper */ + /* 24C01 */ + {{"T-120106"}, 0, {7, 0x7F, 0x7F, 0x300000, 0x380001, 0x300000, 0, 7, 1}}, /* Brian Lara Cricket */ + /* 24C08 */ + {{"T-120096" }, 0, {8, 0x3FF, 0x3FF, 0x300000, 0x380001, 0x300000, 0, 7, 1}}, /* Micro Machines 2 - Turbo Tournament (E) */ + {{"00000000-00"}, 0x168B, {8, 0x3FF, 0x3FF, 0x300000, 0x380001, 0x300000, 0, 7, 1}}, /* Micro Machines Military */ + {{"00000000-00"}, 0xCEE0, {8, 0x3FF, 0x3FF, 0x300000, 0x380001, 0x300000, 0, 7, 1}}, /* Micro Machines Military (Bad)*/ + /* 24C16 */ + {{"00000000-00"}, 0x165E, {8, 0x7FF, 0x7FF, 0x300000, 0x380001, 0x300000, 0, 7, 1}}, /* Micro Machines Turbo Tournament 96 */ + {{"00000000-00"}, 0x2C41, {8, 0x7FF, 0x7FF, 0x300000, 0x380001, 0x300000, 0, 7, 1}}, /* Micro Machines Turbo Tournament 96 (Bad)*/ + /* 24C65 */ + {{"T-120146-50"}, 0, {16, 0x1FFF, 0x1FFF, 0x300000, 0x380001, 0x300000, 0, 7, 1}} /* Brian Lara Cricket 96, Shane Warne Cricket */ +}; + + +T_EEPROM eeprom; + +void eeprom_init() +{ + uint8 i = 0; + + /* initialize eeprom */ + memset(&eeprom, 0, sizeof(T_EEPROM)); + eeprom.sda = eeprom.old_sda = 1; + eeprom.scl = eeprom.old_scl = 1; + eeprom.state = STAND_BY; + + sram.custom = 0; + + /* look into game database */ + while ((i<24) && (!sram.custom)) + { + if (strstr(rominfo.product,database[i].game_id) != NULL) + { + /* additional check (Micro Machines, Rockman Mega World) */ + if ((database[i].chk == 0) || (database[i].chk == rominfo.checksum)) + { + sram.custom = 1; + sram.on = 1; + sram.write = 1; + memcpy(&eeprom.type, &database[i].type, sizeof(T_EEPROM_TYPE)); + } + } + i++; + } + + /* Game not found in database but header seems to indicate it uses EEPROM */ + if (!sram.custom) + { + if ((sram.end - sram.start) < 2) + { + sram.custom = 1; + sram.on = 1; + sram.write = 1; + + /* set SEGA mapper as default */ + memcpy(&eeprom.type, &database[9].type, sizeof(T_EEPROM_TYPE)); + } +} +} + +static inline void Detect_START() +{ + if (eeprom.old_scl && eeprom.scl) + { + if (eeprom.old_sda && !eeprom.sda) + { + eeprom.cycles = 0; + eeprom.slave_mask = 0; + if (eeprom.type.address_bits == 7) + { + eeprom.word_address = 0; + eeprom.state = GET_WORD_ADR_7BITS; + } + else eeprom.state = GET_SLAVE_ADR; + } + } +} + +static inline void Detect_STOP() +{ + if (eeprom.old_scl && eeprom.scl) + { + if (!eeprom.old_sda && eeprom.sda) + { + eeprom.state = STAND_BY; + } + } +} + +void eeprom_write(uint32 address, uint32 value, uint32 word_access) +{ + error("eeprom write%d 0x%x = 0x%x (0x%x)\n", 8*(1+word_access), address, value, m68k_get_reg (NULL, M68K_REG_PC)); + + /* decode SCL and SDA value */ + if (word_access) + { + /* 16-bits access */ + if (eeprom.type.sda_in_adr == address) eeprom.sda = (value >> (8 + eeprom.type.sda_in_bit)) & 1; /* MSB */ + else if (eeprom.type.sda_in_adr == (address | 1)) eeprom.sda = (value >> eeprom.type.sda_in_bit) & 1; /* LSB */ + else eeprom.sda = eeprom.old_sda; + + if (eeprom.type.scl_adr == address) eeprom.scl = (value >> (8 + eeprom.type.scl_bit)) & 1; /* MSB */ + else if (eeprom.type.scl_adr == (address | 1)) eeprom.scl = (value >> eeprom.type.scl_bit) & 1; /* LSB */ + else eeprom.scl = eeprom.old_scl; + } + else + { + if (eeprom.type.sda_in_adr == address) eeprom.sda = (value >> eeprom.type.sda_in_bit) & 1; + else eeprom.sda = eeprom.old_sda; + + if (eeprom.type.scl_adr == address) eeprom.scl = (value >> eeprom.type.scl_bit) & 1; + else eeprom.scl = eeprom.old_scl; + } + + /* EEPROM current state */ + switch (eeprom.state) + { + /* Standby Mode */ + case STAND_BY: + Detect_START(); + Detect_STOP(); + break; + + + /* Suspended Mode */ + case WAIT_STOP: + Detect_STOP(); + break; + + + /* Get Word Address 7 bits: MODE-1 only (24C01) + * and R/W bit + */ + case GET_WORD_ADR_7BITS: + Detect_START(); + Detect_STOP(); + + /* look for SCL LOW to HIGH transition */ + if (!eeprom.old_scl && eeprom.scl) + { + if (eeprom.cycles == 0) eeprom.cycles ++; + } + + + /* look for SCL HIGH to LOW transition */ + if (eeprom.old_scl && !eeprom.scl && (eeprom.cycles > 0)) + { + if (eeprom.cycles < 8) + { + eeprom.word_address |= (eeprom.old_sda << (7 - eeprom.cycles)); + } + else if (eeprom.cycles == 8) + { + eeprom.rw = eeprom.old_sda; + } + else + { /* ACK CYCLE */ + eeprom.cycles = 0; + eeprom.word_address &= eeprom.type.size_mask; + eeprom.state = eeprom.rw ? READ_DATA : WRITE_DATA; + } + + eeprom.cycles ++; + } + break; + + + /* Get Slave Address (3bits) : MODE-2 & MODE-3 only (24C01 - 24C512) (0-3bits, depending on the array size) + * or/and Word Address MSB: MODE-2 only (24C04 - 24C16) (0-3bits, depending on the array size) + * and R/W bit + */ + case GET_SLAVE_ADR: + + Detect_START(); + Detect_STOP(); + + /* look for SCL LOW to HIGH transition */ + if (!eeprom.old_scl && eeprom.scl) + { + if (eeprom.cycles == 0) eeprom.cycles ++; + } + + /* look for SCL HIGH to LOW transition */ + if (eeprom.old_scl && !eeprom.scl && (eeprom.cycles > 0)) + { + if ((eeprom.cycles > 4) && (eeprom.cycles <8)) + { + if ((eeprom.type.address_bits == 16) || + (eeprom.type.size_mask < (1 << (15 - eeprom.cycles)))) + { + /* this is a SLAVE ADDRESS bit */ + eeprom.slave_mask |= (eeprom.old_sda << (7 - eeprom.cycles)); + } + else + { + /* this is a WORD ADDRESS high bit */ + if (eeprom.old_sda) eeprom.word_address |= (1 << (15 - eeprom.cycles)); + else eeprom.word_address &= ~(1 << (15 - eeprom.cycles)); + } + } + else if (eeprom.cycles == 8) eeprom.rw = eeprom.old_sda; + else if (eeprom.cycles > 8) + { + /* ACK CYCLE */ + eeprom.cycles = 0; + if (eeprom.type.address_bits == 16) + { + /* two ADDRESS bytes */ + eeprom.state = eeprom.rw ? READ_DATA : GET_WORD_ADR_HIGH; + eeprom.slave_mask <<= 16; + } + else + { + /* one ADDRESS byte */ + eeprom.state = eeprom.rw ? READ_DATA : GET_WORD_ADR_LOW; + eeprom.slave_mask <<= 8; + } + } + + eeprom.cycles ++; + } + break; + + /* Get Word Address MSB (4-8bits depending on the array size) + * MODE-3 only (24C32 - 24C512) + */ + case GET_WORD_ADR_HIGH: + + Detect_START(); + Detect_STOP(); + + /* look for SCL HIGH to LOW transition */ + if (eeprom.old_scl && !eeprom.scl) + { + if (eeprom.cycles < 9) + { + if ((eeprom.type.size_mask + 1) < (1 << (17 - eeprom.cycles))) + { + /* ignored bit: slave mask should be right-shifted by one */ + eeprom.slave_mask >>= 1; + } + else + { + /* this is a WORD ADDRESS high bit */ + if (eeprom.old_sda) eeprom.word_address |= (1 << (16 - eeprom.cycles)); + else eeprom.word_address &= ~(1 << (16 - eeprom.cycles)); + } + + eeprom.cycles ++; + } + else + { + /* ACK CYCLE */ + eeprom.cycles = 1; + eeprom.state = GET_WORD_ADR_LOW; + } + } + break; + + + /* Get Word Address LSB: 7bits (24C01) or 8bits (24C02-24C512) + * MODE-2 and MODE-3 only (24C01 - 24C512) + */ + case GET_WORD_ADR_LOW: + + Detect_START(); + Detect_STOP(); + + /* look for SCL HIGH to LOW transition */ + if (eeprom.old_scl && !eeprom.scl) + { + if (eeprom.cycles < 9) + { + if ((eeprom.type.size_mask + 1) < (1 << (9 - eeprom.cycles))) + { + /* ignored bit (X24C01): slave mask should be right-shifted by one */ + eeprom.slave_mask >>= 1; + } + else + { + /* this is a WORD ADDRESS high bit */ + if (eeprom.old_sda) eeprom.word_address |= (1 << (8 - eeprom.cycles)); + else eeprom.word_address &= ~(1 << (8 - eeprom.cycles)); + } + + eeprom.cycles ++; + } + else + { + /* ACK CYCLE */ + eeprom.cycles = 1; + eeprom.word_address &= eeprom.type.size_mask; + eeprom.state = WRITE_DATA; + } + } + break; + + + /* + * Read Cycle + */ + case READ_DATA: + + Detect_START(); + Detect_STOP(); + + /* look for SCL HIGH to LOW transition */ + if (eeprom.old_scl && !eeprom.scl) + { + if (eeprom.cycles < 9) eeprom.cycles ++; + else + { + eeprom.cycles = 1; + + /* ACK not received */ + if (eeprom.old_sda) eeprom.state = WAIT_STOP; + } + } + break; + + + /* + * Write Cycle + */ + case WRITE_DATA: + + Detect_START(); + Detect_STOP(); + + /* look for SCL HIGH to LOW transition */ + if (eeprom.old_scl && !eeprom.scl) + { + if (eeprom.cycles < 9) + { + /* Write DATA bits (max 64kBytes) */ + uint16 sram_address = (eeprom.slave_mask | eeprom.word_address) & 0xFFFF; + if (eeprom.old_sda) sram.sram[sram_address] |= (1 << (8 - eeprom.cycles)); + else sram.sram[sram_address] &= ~(1 << (8 - eeprom.cycles)); + + if (eeprom.cycles == 8) + { + /* WORD ADDRESS is incremented (roll up at maximum pagesize) */ + eeprom.word_address = (eeprom.word_address & (0xFFFF - eeprom.type.pagewrite_mask)) | + ((eeprom.word_address + 1) & eeprom.type.pagewrite_mask); + } + + eeprom.cycles ++; + } + else eeprom.cycles = 1; /* ACK cycle */ + } + break; + } + + eeprom.old_scl = eeprom.scl; + eeprom.old_sda = eeprom.sda; +} + +uint32 eeprom_read(uint32 address, uint32 word_access) +{ + error("eeprom read%d 0x%x (0x%x)\n", 8*(1+word_access), address, m68k_get_reg (NULL, M68K_REG_PC)); + uint8 sda_out = eeprom.sda; + + /* EEPROM state */ + switch (eeprom.state) + { + case READ_DATA: + if (eeprom.cycles < 9) + { + /* Return DATA bits (max 64kBytes) */ + uint16 sram_address = (eeprom.slave_mask | eeprom.word_address) & 0xffff; + sda_out = (sram.sram[sram_address] >> (8 - eeprom.cycles)) & 1; + + if (eeprom.cycles == 8) + { + /* WORD ADDRESS is incremented (roll up at maximum array size) */ + eeprom.word_address ++; + eeprom.word_address &= eeprom.type.size_mask; + } + } + break; + + case GET_WORD_ADR_7BITS: + case GET_SLAVE_ADR: + case GET_WORD_ADR_HIGH: + case GET_WORD_ADR_LOW: + case WRITE_DATA: + if (eeprom.cycles == 9) sda_out = 0; + break; + + default: + break; + } + + /* memory access */ + if (word_access) + { + /* 16-bits access */ + if (eeprom.type.sda_out_adr & 1) return (sda_out << eeprom.type.sda_out_bit); /* LSB */ + else return (sda_out << (eeprom.type.sda_out_bit + 8)); /* MSB */ + } + else return (sda_out << eeprom.type.sda_out_bit); +} diff --git a/source/eeprom.h b/source/cart_hw/eeprom.h similarity index 90% rename from source/eeprom.h rename to source/cart_hw/eeprom.h index 7381e08..1da1feb 100644 --- a/source/eeprom.h +++ b/source/cart_hw/eeprom.h @@ -1,87 +1,92 @@ -/**************************************************************************** - * Serial EEPROM support for Sega Genesis games - * - * Copyright (C) 2007 EkeEKe - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - ***************************************************************************/ - -typedef enum -{ - STAND_BY = 0, - WAIT_STOP, - GET_SLAVE_ADR, - GET_WORD_ADR_7BITS, - GET_WORD_ADR_HIGH, - GET_WORD_ADR_LOW, - WRITE_DATA, - READ_DATA, - -} T_EEPROM_STATE; - -/* this defines the type of EEPROM inside the game cartridge as Backup RAM - * - * Here are some notes from 8BitWizard (http://www.spritesmind.net/_GenDev/forum): - * - * Mode 1 (7-bit) - the chip takes a single byte with a 7-bit memory address and a R/W bit (24C01) - * Mode 2 (8-bit) - the chip takes a 7-bit device address and R/W bit followed by an 8-bit memory address; - * the device address may contain up to three more memory address bits (24C01 - 24C16). - * You can also string eight 24C01, four 24C02, two 24C08, or various combinations, set their address config lines correctly, - * and the result appears exactly the same as a 24C16 - * Mode 3 (16-bit) - the chip takes a 7-bit device address and R/W bit followed by a 16-bit memory address (24C32 and larger) - * - * Also, while most 24Cxx are addressed at 200000-2FFFFF, I have found two different ways of mapping the control lines. - * EA uses SDA on D7 (read/write) and SCL on D6 (write only), and I have found boards using different mapping (I think Accolade) - * which uses D1-read=SDA, D0-write=SDA, D1-write=SCL. Accolade also has a custom-chip mapper which may even use a third method. - */ - -typedef struct -{ - uint8 address_bits; /* number of bits needed to address memory: 7, 8 or 16 */ - uint16 size_mask; /* depends on the max size of the memory (in bytes) */ - uint16 pagewrite_mask; /* depends on the maximal number of bytes that can be written in a single write cycle */ - uint32 sda_in_adr; /* 68000 memory address mapped to SDA_IN */ - uint32 sda_out_adr; /* 68000 memory address mapped to SDA_OUT */ - uint32 scl_adr; /* 68000 memory address mapped to SCL */ - uint8 sda_in_bit; /* bit offset for SDA_IN */ - uint8 sda_out_bit; /* bit offset for SDA_OUT */ - uint8 scl_bit; /* bit offset for SCL */ - -} T_EEPROM_TYPE; - - -typedef struct -{ - uint8 sda; /* current /SDA line state */ - uint8 scl; /* current /SCL line state */ - uint8 old_sda; /* previous /SDA line state */ - uint8 old_scl; /* previous /SCL line state */ - uint8 cycles; /* current operation cycle number (0-9) */ - uint8 rw; /* operation type (1:READ, 0:WRITE) */ - uint16 slave_mask; /* device address (shifted by the memory address width)*/ - uint16 word_address; /* memory address */ - T_EEPROM_STATE state; /* current operation state */ - T_EEPROM_TYPE type; /* EEPROM characteristics for this game */ - -} T_EEPROM; - -/* global variables */ -extern T_EEPROM eeprom; - -/* Function prototypes */ -extern void EEPROM_Init(); -extern void EEPROM_Write(unsigned int address, unsigned int value); -extern unsigned int EEPROM_Read(unsigned int address); - +/**************************************************************************** + * Genesis Plus 1.2a + * Serial EEPROM support + * + * code by Eke-Eke, GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ***************************************************************************/ + +#ifndef _EEPROM_H_ +#define _EEPROM_H_ + +typedef enum +{ + STAND_BY = 0, + WAIT_STOP, + GET_SLAVE_ADR, + GET_WORD_ADR_7BITS, + GET_WORD_ADR_HIGH, + GET_WORD_ADR_LOW, + WRITE_DATA, + READ_DATA, + +} T_EEPROM_STATE; + +/* this defines the type of EEPROM inside the game cartridge as Backup RAM + * + * Here are some notes from 8BitWizard (http://www.spritesmind.net/_GenDev/forum): + * + * Mode 1 (7-bit) - the chip takes a single byte with a 7-bit memory address and a R/W bit (24C01) + * Mode 2 (8-bit) - the chip takes a 7-bit device address and R/W bit followed by an 8-bit memory address; + * the device address may contain up to three more memory address bits (24C01 - 24C16). + * You can also string eight 24C01, four 24C02, two 24C08, or various combinations, set their address config lines correctly, + * and the result appears exactly the same as a 24C16 + * Mode 3 (16-bit) - the chip takes a 7-bit device address and R/W bit followed by a 16-bit memory address (24C32 and larger) + * + * Also, while most 24Cxx are addressed at 200000-2FFFFF, I have found two different ways of mapping the control lines. + * EA uses SDA on D7 (read/write) and SCL on D6 (write only), and I have found boards using different mapping (I think Accolade) + * which uses D1-read=SDA, D0-write=SDA, D1-write=SCL. Accolade also has a custom-chip mapper which may even use a third method. + */ + +typedef struct +{ + uint8 address_bits; /* number of bits needed to address memory: 7, 8 or 16 */ + uint16 size_mask; /* depends on the max size of the memory (in bytes) */ + uint16 pagewrite_mask; /* depends on the maximal number of bytes that can be written in a single write cycle */ + uint32 sda_in_adr; /* 68000 memory address mapped to SDA_IN */ + uint32 sda_out_adr; /* 68000 memory address mapped to SDA_OUT */ + uint32 scl_adr; /* 68000 memory address mapped to SCL */ + uint8 sda_in_bit; /* bit offset for SDA_IN */ + uint8 sda_out_bit; /* bit offset for SDA_OUT */ + uint8 scl_bit; /* bit offset for SCL */ + +} T_EEPROM_TYPE; + + +typedef struct +{ + uint8 sda; /* current /SDA line state */ + uint8 scl; /* current /SCL line state */ + uint8 old_sda; /* previous /SDA line state */ + uint8 old_scl; /* previous /SCL line state */ + uint8 cycles; /* current operation cycle number (0-9) */ + uint8 rw; /* operation type (1:READ, 0:WRITE) */ + uint16 slave_mask; /* device address (shifted by the memory address width)*/ + uint16 word_address; /* memory address */ + T_EEPROM_STATE state; /* current operation state */ + T_EEPROM_TYPE type; /* EEPROM characteristics for this game */ + +} T_EEPROM; + +/* global variables */ +extern T_EEPROM eeprom; + +/* Function prototypes */ +extern void eeprom_init(); +extern void eeprom_write(uint32 address, uint32 value, uint32 word_access); +extern uint32 eeprom_read(uint32 address, uint32 word_access); + +#endif diff --git a/source/cart_hw/sram.c b/source/cart_hw/sram.c new file mode 100644 index 0000000..7579c97 --- /dev/null +++ b/source/cart_hw/sram.c @@ -0,0 +1,98 @@ +/*************************************************************************************** + * Genesis Plus 1.2a + * SRAM Hardware + * + * code by Eke-Eke, GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#include "shared.h" + +T_SRAM sram; + +/**************************************************************************** + * A quick guide to SRAM on the Genesis + * + * The SRAM definition is held at offset 0x1b0 of the ROM header. + * + * 1B0h: dc.b 'RA', %1x1yz000, %00100000 + * 1B4h: dc.l RAM start address + * 1B8h: dc.l RAM end address + * x 1 for BACKUP and 0 If not BACKUP + * yz 10 if even address only + * 11 if odd address only + * 00 if both even and odd address + * + * Assuming max. 64k SRAM / Battery RAM throughout + ****************************************************************************/ +void sram_init() +{ + memset (&sram, 0, sizeof (T_SRAM)); + memset (&sram.sram[0], 0xFF, 0x10000); + sram.crc = crc32 (0, &sram.sram[0], 0x10000); + + if ((cart_rom[0x1b0] == 0x52) && (cart_rom[0x1b1] == 0x41)) + { + /* retrieve informations from headezr */ + sram.detected = 1; + sram.start = READ_WORD_LONG(cart_rom, 0x1b4); + sram.end = READ_WORD_LONG(cart_rom, 0x1b8); + + /* fixe some bad header informations */ + if ((sram.start > sram.end) || ((sram.end - sram.start) >= 0x10000)) + sram.end = sram.start + 0xffff; + sram.start &= 0xfffffffe; + sram.end |= 1; + } + else + { + /* default SRAM region */ + sram.start = 0x200000; + sram.end = 0x20ffff; + } + + /* set SRAM ON by default when ROM is not mapped */ + if (genromsize <= sram.start) + { + sram.on = 1; + sram.write = 1; + } + + /* Some games with bad header or specific configuration */ + if (strstr(rominfo.product,"T-113016") != NULL) + { + /* Pugsy (try accessing unmapped area for copy protection) */ + sram.on = 0; + sram.write = 0; + } + else if ((strstr(rominfo.product,"T-26013") != NULL) && (rominfo.checksum == 0xa837)) + { + /* Psy-O-Blade (bad header) */ + sram.on = 1; + sram.write = 1; + sram.start = 0x200001; + sram.end = 0x203fff; + } + else if (((realchecksum == 0xaeaa) || (realchecksum == 0x8dba)) && (rominfo.checksum == 0x8104)) + { + /* Xin Qigai Wangzi, aka Beggar Prince (no header, use uncommon area) */ + sram.on = 1; + sram.write = 1; + sram.start = 0x400000; + sram.end = 0x40ffff; + } +} diff --git a/source/sram.h b/source/cart_hw/sram.h similarity index 82% rename from source/sram.h rename to source/cart_hw/sram.h index 5aed5d8..bdac2e5 100644 --- a/source/sram.h +++ b/source/cart_hw/sram.h @@ -1,40 +1,44 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * NGC MANAGER - ***************************************************************************/ - -typedef struct -{ - uint8 detected; - uint8 on; - uint8 write; - uint8 custom; - uint32 start; - uint32 end; - int crc; - uint8 sram[0x10000]; -} T_SRAM; - -/* Function prototypes */ -extern void SRAM_Init (); - -/* global variables */ -extern T_SRAM sram; - +/*************************************************************************************** + * Genesis Plus 1.2a + * SRAM Hardware + * + * code by Eke-Eke, GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#ifndef _SRAM_H_ +#define _SRAM_H_ + +typedef struct +{ + uint8 detected; + uint8 on; + uint8 write; + uint8 custom; + uint32 start; + uint32 end; + uint32 crc; + uint8 sram[0x10000]; +} T_SRAM; + +/* Function prototypes */ +extern void sram_init (); + +/* global variables */ +extern T_SRAM sram; + +#endif diff --git a/source/cart_hw/svp/imageformat.txt b/source/cart_hw/svp/imageformat.txt new file mode 100644 index 0000000..b1929cb --- /dev/null +++ b/source/cart_hw/svp/imageformat.txt @@ -0,0 +1,67 @@ + +vscroll: 1 (0); 209 (26) - alternates every 4 frames +vram range for patterns: 0000-999f (low scr 0000-395f,72e0-999f; high 3980-999f) +name table address: c000 +seen DMAs (in order): [300002-3026c3]->[0020-26e1] len 4961 + [3026c2-303943]->[26e0-3961] len 2369 + [303942-306003]->[72e0-99a1] len 4961 + --- + [306002-3086c3]->[3980-6041] len 4961 + [3086c2-309943]->[6040-72c1] len 2369 + [309942-30c003]->[72e0-99a2] len 4961 +tile arrangement: + +000: 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 +001: 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 +002: 001 003 005 007 009 00b 00d 00f 011 013 015 017 019 01b 01d 01f 021 023 025 027 029 02b 02d 02f 031 033 035 037 039 03b 03d 03f +003: 002 004 006 008 00a 00c 00e 010 012 014 016 018 01a 01c 01e 020 022 024 026 028 02a 02c 02e 030 032 034 036 038 03a 03c 03e 040 +004: 041 043 045 047 049 04b 04d 04f 051 053 055 057 059 05b 05d 05f 061 063 065 067 069 06b 06d 06f 071 073 075 077 079 07b 07d 07f +005: 042 044 046 048 04a 04c 04e 050 052 054 056 058 05a 05c 05e 060 062 064 066 068 06a 06c 06e 070 072 074 076 078 07a 07c 07e 080 +006: 081 083 085 087 089 08b 08d 08f 091 093 095 097 099 09b 09d 09f 0a1 0a3 0a5 0a7 0a9 0ab 0ad 0af 0b1 0b3 0b5 0b7 0b9 0bb 0bd 0bf +007: 082 084 086 088 08a 08c 08e 090 092 094 096 098 09a 09c 09e 0a0 0a2 0a4 0a6 0a8 0aa 0ac 0ae 0b0 0b2 0b4 0b6 0b8 0ba 0bc 0be 0c0 +008: 0c1 0c3 0c5 0c7 0c9 0cb 0cd 0cf 0d1 0d3 0d5 0d7 0d9 0db 0dd 0df 0e1 0e3 0e5 0e7 0e9 0eb 0ed 0ef 0f1 0f3 0f5 0f7 0f9 0fb 0fd 0ff +009: 0c2 0c4 0c6 0c8 0ca 0cc 0ce 0d0 0d2 0d4 0d6 0d8 0da 0dc 0de 0e0 0e2 0e4 0e6 0e8 0ea 0ec 0ee 0f0 0f2 0f4 0f6 0f8 0fa 0fc 0fe 100 +010: 101 103 105 107 109 10b 10d 10f 111 113 115 117 119 11b 11d 11f 121 123 125 127 129 12b 12d 12f 131 133 135 137 139 13b 13d 13f +011: 102 104 106 108 10a 10c 10e 110 112 114 116 118 11a 11c 11e 120 122 124 126 128 12a 12c 12e 130 132 134 136 138 13a 13c 13e 140 +012: 141 143 145 147 149 14b 14d 14f 151 153 155 157 159 15b 15d 15f 161 163 165 167 169 16b 16d 16f 171 173 175 177 179 17b 17d 17f +013: 142 144 146 148 14a 14c 14e 150 152 154 156 158 15a 15c 15e 160 162 164 166 168 16a 16c 16e 170 172 174 176 178 17a 17c 17e 180 +014: 181 183 185 187 189 18b 18d 18f 191 193 195 197 199 19b 19d 19f 1a1 1a3 1a5 1a7 1a9 1ab 1ad 1af 1b1 1b3 1b5 1b7 1b9 1bb 1bd 1bf +015: 182 184 186 188 18a 18c 18e 190 192 194 196 198 19a 19c 19e 1a0 1a2 1a4 1a6 1a8 1aa 1ac 1ae 1b0 1b2 1b4 1b6 1b8 1ba 1bc 1be 1c0 +016: 1c1 1c3 1c5 1c7 1c9 397 399 39b 39d 39f 3a1 3a3 3a5 3a7 3a9 3ab 3ad 3af 3b1 3b3 3b5 3b7 3b9 3bb 3bd 3bf 3c1 3c3 3c5 3c7 3c9 3cb +017: 1c2 1c4 1c6 1c8 1ca 398 39a 39c 39e 3a0 3a2 3a4 3a6 3a8 3aa 3ac 3ae 3b0 3b2 3b4 3b6 3b8 3ba 3bc 3be 3c0 3c2 3c4 3c6 3c8 3ca 3cc +018: 3cd 3cf 3d1 3d3 3d5 3d7 3d9 3db 3dd 3df 3e1 3e3 3e5 3e7 3e9 3eb 3ed 3ef 3f1 3f3 3f5 3f7 3f9 3fb 3fd 3ff 401 403 405 407 409 40b +019: 3ce 3d0 3d2 3d4 3d6 3d8 3da 3dc 3de 3e0 3e2 3e4 3e6 3e8 3ea 3ec 3ee 3f0 3f2 3f4 3f6 3f8 3fa 3fc 3fe 400 402 404 406 408 40a 40c +020: 40d 40f 411 413 415 417 419 41b 41d 41f 421 423 425 427 429 42b 42d 42f 431 433 435 437 439 43b 43d 43f 441 443 445 447 449 44b +021: 40e 410 412 414 416 418 41a 41c 41e 420 422 424 426 428 42a 42c 42e 430 432 434 436 438 43a 43c 43e 440 442 444 446 448 44a 44c +022: 44d 44f 451 453 455 457 459 45b 45d 45f 461 463 465 467 469 46b 46d 46f 471 473 475 477 479 47b 47d 47f 481 483 485 487 489 48b +023: 44e 450 452 454 456 458 45a 45c 45e 460 462 464 466 468 46a 46c 46e 470 472 474 476 478 47a 47c 47e 480 482 484 486 488 48a 48c +024: 48d 48f 491 493 495 497 499 49b 49d 49f 4a1 4a3 4a5 4a7 4a9 4ab 4ad 4af 4b1 4b3 4b5 4b7 4b9 4bb 4bd 4bf 4c1 4c3 4c5 4c7 4c9 4cb +025: 48e 490 492 494 496 498 49a 49c 49e 4a0 4a2 4a4 4a6 4a8 4aa 4ac 4ae 4b0 4b2 4b4 4b6 4b8 4ba 4bc 4be 4c0 4c2 4c4 4c6 4c8 4ca 4cc +026: 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 +027: 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 +028: 1cc 1ce 1d0 1d2 1d4 1d6 1d8 1da 1dc 1de 1e0 1e2 1e4 1e6 1e8 1ea 1ec 1ee 1f0 1f2 1f4 1f6 1f8 1fa 1fc 1fe 200 202 204 206 208 20a +029: 1cd 1cf 1d1 1d3 1d5 1d7 1d9 1db 1dd 1df 1e1 1e3 1e5 1e7 1e9 1eb 1ed 1ef 1f1 1f3 1f5 1f7 1f9 1fb 1fd 1ff 201 203 205 207 209 20b +030: 20c 20e 210 212 214 216 218 21a 21c 21e 220 222 224 226 228 22a 22c 22e 230 232 234 236 238 23a 23c 23e 240 242 244 246 248 24a +031: 20d 20f 211 213 215 217 219 21b 21d 21f 221 223 225 227 229 22b 22d 22f 231 233 235 237 239 23b 23d 23f 241 243 245 247 249 24b +032: 24c 24e 250 252 254 256 258 25a 25c 25e 260 262 264 266 268 26a 26c 26e 270 272 274 276 278 27a 27c 27e 280 282 284 286 288 28a +033: 24d 24f 251 253 255 257 259 25b 25d 25f 261 263 265 267 269 26b 26d 26f 271 273 275 277 279 27b 27d 27f 281 283 285 287 289 28b +034: 28c 28e 290 292 294 296 298 29a 29c 29e 2a0 2a2 2a4 2a6 2a8 2aa 2ac 2ae 2b0 2b2 2b4 2b6 2b8 2ba 2bc 2be 2c0 2c2 2c4 2c6 2c8 2ca +035: 28d 28f 291 293 295 297 299 29b 29d 29f 2a1 2a3 2a5 2a7 2a9 2ab 2ad 2af 2b1 2b3 2b5 2b7 2b9 2bb 2bd 2bf 2c1 2c3 2c5 2c7 2c9 2cb +036: 2cc 2ce 2d0 2d2 2d4 2d6 2d8 2da 2dc 2de 2e0 2e2 2e4 2e6 2e8 2ea 2ec 2ee 2f0 2f2 2f4 2f6 2f8 2fa 2fc 2fe 300 302 304 306 308 30a +037: 2cd 2cf 2d1 2d3 2d5 2d7 2d9 2db 2dd 2df 2e1 2e3 2e5 2e7 2e9 2eb 2ed 2ef 2f1 2f3 2f5 2f7 2f9 2fb 2fd 2ff 301 303 305 307 309 30b +038: 30c 30e 310 312 314 316 318 31a 31c 31e 320 322 324 326 328 32a 32c 32e 330 332 334 336 338 33a 33c 33e 340 342 344 346 348 34a +039: 30d 30f 311 313 315 317 319 31b 31d 31f 321 323 325 327 329 32b 32d 32f 331 333 335 337 339 33b 33d 33f 341 343 345 347 349 34b +040: 34c 34e 350 352 354 356 358 35a 35c 35e 360 362 364 366 368 36a 36c 36e 370 372 374 376 378 37a 37c 37e 380 382 384 386 388 38a +041: 34d 34f 351 353 355 357 359 35b 35d 35f 361 363 365 367 369 36b 36d 36f 371 373 375 377 379 37b 37d 37f 381 383 385 387 389 38b +042: 38c 38e 390 392 394 397 399 39b 39d 39f 3a1 3a3 3a5 3a7 3a9 3ab 3ad 3af 3b1 3b3 3b5 3b7 3b9 3bb 3bd 3bf 3c1 3c3 3c5 3c7 3c9 3cb +043: 38d 38f 391 393 395 398 39a 39c 39e 3a0 3a2 3a4 3a6 3a8 3aa 3ac 3ae 3b0 3b2 3b4 3b6 3b8 3ba 3bc 3be 3c0 3c2 3c4 3c6 3c8 3ca 3cc +044: 3cd 3cf 3d1 3d3 3d5 3d7 3d9 3db 3dd 3df 3e1 3e3 3e5 3e7 3e9 3eb 3ed 3ef 3f1 3f3 3f5 3f7 3f9 3fb 3fd 3ff 401 403 405 407 409 40b +045: 3ce 3d0 3d2 3d4 3d6 3d8 3da 3dc 3de 3e0 3e2 3e4 3e6 3e8 3ea 3ec 3ee 3f0 3f2 3f4 3f6 3f8 3fa 3fc 3fe 400 402 404 406 408 40a 40c +046: 40d 40f 411 413 415 417 419 41b 41d 41f 421 423 425 427 429 42b 42d 42f 431 433 435 437 439 43b 43d 43f 441 443 445 447 449 44b +047: 40e 410 412 414 416 418 41a 41c 41e 420 422 424 426 428 42a 42c 42e 430 432 434 436 438 43a 43c 43e 440 442 444 446 448 44a 44c +048: 44d 44f 451 453 455 457 459 45b 45d 45f 461 463 465 467 469 46b 46d 46f 471 473 475 477 479 47b 47d 47f 481 483 485 487 489 48b +049: 44e 450 452 454 456 458 45a 45c 45e 460 462 464 466 468 46a 46c 46e 470 472 474 476 478 47a 47c 47e 480 482 484 486 488 48a 48c +050: 48d 48f 491 493 495 497 499 49b 49d 49f 4a1 4a3 4a5 4a7 4a9 4ab 4ad 4af 4b1 4b3 4b5 4b7 4b9 4bb 4bd 4bf 4c1 4c3 4c5 4c7 4c9 4cb +051: 48e 490 492 494 496 498 49a 49c 49e 4a0 4a2 4a4 4a6 4a8 4aa 4ac 4ae 4b0 4b2 4b4 4b6 4b8 4ba 4bc 4be 4c0 4c2 4c4 4c6 4c8 4ca 4cc +052: 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 +053: 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 diff --git a/source/cart_hw/svp/ssp16.c b/source/cart_hw/svp/ssp16.c new file mode 100644 index 0000000..117734e --- /dev/null +++ b/source/cart_hw/svp/ssp16.c @@ -0,0 +1,1330 @@ +// basic, incomplete SSP160x (SSP1601?) interpreter +// with SVP memory controller emu + +// (c) Copyright 2008, Grazvydas "notaz" Ignotas +// Free for non-commercial use. + +// For commercial use, separate licencing terms must be obtained. + + +/* modified for Genesis Plus GCN port (EkeEke) - inverted mode&addr in ssp_PMC register (more logical ?)*/ + + +/* + * Register info + * + * 0. "-" + * size: 16 + * desc: Constant register with all bits set (0xffff). + * + * 1. "X" + * size: 16 + * desc: Generic register. When set, updates P (P = X * Y * 2) + * + * 2. "Y" + * size: 16 + * desc: Generic register. When set, updates P (P = X * Y * 2) + * + * 3. "A" + * size: 32 + * desc: Accumulator. + * + * 4. "ST" + * size: 16 + * desc: Status register. From MAME: bits 0-9 are CONTROL, other FLAG + * fedc ba98 7654 3210 + * 210 - RPL (?) "Loop size". If non-zero, makes (rX+) and (rX-) respectively + * modulo-increment and modulo-decrement. The value shows which + * power of 2 to use, i.e. 4 means modulo by 16. + * (e: fir16_32.sc, IIR_4B.SC, DECIM.SC) + * 43 - RB (?) + * 5 - GP0_0 (ST5?) Changed before acessing PM0 (affects banking?). + * 6 - GP0_1 (ST6?) Cleared before acessing PM0 (affects banking?). Set after. + * datasheet says these (5,6) bits correspond to hardware pins. + * 7 - IE (?) Not directly used by SVP code (never set, but preserved)? + * 8 - OP (?) Not used by SVP code (only cleared)? (MAME: saturated value + * (probably means clamping? i.e. 0x7ffc + 9 -> 0x7fff)) + * 9 - MACS (?) Not used by SVP code (only cleared)? (e: "mac shift") + * a - GPI_0 Interrupt 0 enable/status? + * b - GPI_1 Interrupt 1 enable/status? + * c - L L flag. Carry? + * d - Z Zero flag. + * e - OV Overflow flag. + * f - N Negative flag. + * seen directly changing code sequences: + * ldi ST, 0 ld A, ST ld A, ST ld A, ST ldi st, 20h + * ldi ST, 60h ori A, 60h and A, E8h and A, E8h + * ld ST, A ld ST, A ori 3 + * ld ST, A + * + * 5. "STACK" + * size: 16 + * desc: hw stack of 6 levels (according to datasheet) + * + * 6. "PC" + * size: 16 + * desc: Program counter. + * + * 7. "P" + * size: 32 + * desc: multiply result register. P = X * Y * 2 + * probably affected by MACS bit in ST. + * + * 8. "PM0" (PM from PMAR name from Tasco's docs) + * size: 16? + * desc: Programmable Memory access register. + * On reset, or when one (both?) GP0 bits are clear, + * acts as status for XST, mapped at 015004 at 68k side: + * bit0: ssp has written something to XST (cleared when 015004 is read) + * bit1: 68k has written something through a1500{0|2} (cleared on PM0 read) + * + * 9. "PM1" + * size: 16? + * desc: Programmable Memory access register. + * This reg. is only used as PMAR. + * + * 10. "PM2" + * size: 16? + * desc: Programmable Memory access register. + * This reg. is only used as PMAR. + * + * 11. "XST" + * size: 16? + * desc: eXternal STate. Mapped to a15000 and a15002 at 68k side. + * Can be programmed as PMAR? (only seen in test mode code) + * Affects PM0 when written to? + * + * 12. "PM4" + * size: 16? + * desc: Programmable Memory access register. + * This reg. is only used as PMAR. The most used PMAR by VR. + * + * 13. (unused by VR) + * + * 14. "PMC" (PMC from PMAC name from Tasco's docs) + * size: 32? + * desc: Programmable Memory access Control. Set using 2 16bit writes, + * first address, then mode word. After setting PMAC, PMAR sould + * be blind accessed (ld -, PMx or ld PMx, -) to program it for + * reading and writing respectively. + * Reading the register also shifts it's state (from "waiting for + * address" to "waiting for mode" and back). Reads always return + * address related to last PMx register accressed. + * (note: addresses do not wrap). + * + * 15. "AL" + * size: 16 + * desc: Accumulator Low. 16 least significant bits of accumulator. + * (normally reading acc (ld X, A) you get 16 most significant bits). + * + * + * There are 8 8-bit pointer registers rX. r0-r3 (ri) point to RAM0, r4-r7 (rj) point to RAM1. + * They can be accessed directly, or 2 indirection levels can be used [ (rX), ((rX)) ], + * which work similar to * and ** operators in C, only they use different memory banks and + * ((rX)) also does post-increment. First indirection level (rX) accesses RAMx, second accesses + * program memory at address read from (rX), and increments value in (rX). + * + * r0,r1,r2,r4,r5,r6 can be modified [ex: ldi r0, 5]. + * 3 modifiers can be applied (optional): + * + : post-increment [ex: ld a, (r0+) ]. Can be made modulo-increment by setting RPL bits in ST. + * - : post-decrement. Can be made modulo-decrement by setting RPL bits in ST (not sure). + * +!: post-increment, unaffected by RPL (probably). + * These are only used on 1st indirection level, so things like [ld a, ((r0+))] and [ld X, r6-] + * ar probably invalid. + * + * r3 and r7 are special and can not be changed (at least Samsung samples and SVP code never do). + * They are fixed to the start of their RAM banks. (They are probably changeable for ssp1605+, + * Samsung's old DSP page claims that). + * 1 of these 4 modifiers must be used (short form direct addressing?): + * |00: RAMx[0] [ex: (r3|00), 0] (based on sample code) + * |01: RAMx[1] + * |10: RAMx[2] ? maybe 10h? accortding to Div_c_dp.sc, 2 + * |11: RAMx[3] + * + * + * Instruction notes + * + * ld a, * doesn't affect flags! (e: A_LAW.SC, Div_c_dp.sc) + * + * mld (rj), (ri) [, b] + * operation: A = 0; P = (rj) * (ri) + * notes: based on IIR_4B.SC sample. flags? what is b??? + * + * mpya (rj), (ri) [, b] + * name: multiply and add? + * operation: A += P; P = (rj) * (ri) + * + * mpys (rj), (ri), b + * name: multiply and subtract? + * notes: not used by VR code. + * + * mod cond, op + * mod cond, shr does arithmetic shift + * + * 'ld -, AL' and probably 'ld AL, -' are for dummy assigns + * + * memory map: + * 000000 - 1fffff ROM, accessable by both + * 200000 - 2fffff unused? + * 300000 - 31ffff DRAM, both + * 320000 - 38ffff unused? + * 390000 - 3907ff IRAM. can only be accessed by ssp? + * 390000 - 39ffff similar mapping to "cell arrange" in Sega CD, 68k only? + * 3a0000 - 3affff similar mapping to "cell arrange" in Sega CD, a bit different + * + * 30fe02 - 0 if SVP busy, 1 if done (set by SVP, checked and cleared by 68k) + * 30fe06 - also sync related. + * 30fe08 - job number [1-12] for SVP. 0 means no job. Set by 68k, read-cleared by SVP. + * + * + figure out if 'op A, P' is 32bit (nearly sure it is) + * * does mld, mpya load their operands into X and Y? + * * OP simm + * + * Assumptions in this code + * P is not directly writeable + * flags correspond to full 32bit accumulator + * only Z and N status flags are emulated (others unused by SVP) + * modifiers for 'OP a, ri' are ignored (invalid?/not used by SVP) + * 'ld d, (a)' loads from program ROM + */ + +#include "shared.h" + + +#define u32 unsigned int + +//#define USE_DEBUGGER + +// 0 +#define rX ssp->gr[SSP_X].h +#define rY ssp->gr[SSP_Y].h +#define rA ssp->gr[SSP_A].h +#define rST ssp->gr[SSP_ST].h // 4 +#define rSTACK ssp->gr[SSP_STACK].h +#define rPC ssp->gr[SSP_PC].h +#define rP ssp->gr[SSP_P] +#define rPM0 ssp->gr[SSP_PM0].h // 8 +#define rPM1 ssp->gr[SSP_PM1].h +#define rPM2 ssp->gr[SSP_PM2].h +#define rXST ssp->gr[SSP_XST].h +#define rPM4 ssp->gr[SSP_PM4].h // 12 +// 13 +#define rPMC ssp->gr[SSP_PMC] // will keep addr in .h, mode in .l +#define rAL ssp->gr[SSP_A].l + +#define rA32 ssp->gr[SSP_A].v +#define rIJ ssp->r + +#define IJind (((op>>6)&4)|(op&3)) + +#define GET_PC() (PC - (unsigned short *)svp->iram_rom) +#define GET_PPC_OFFS() ((unsigned int)PC - (unsigned int)svp->iram_rom - 2) +#define SET_PC(d) PC = (unsigned short *)svp->iram_rom + d + +#define REG_READ(r) (((r) <= 4) ? ssp->gr[r].h : read_handlers[r]()) +#define REG_WRITE(r,d) { \ + int r1 = r; \ + if (r1 >= 4) write_handlers[r1](d); \ + else if (r1 > 0) ssp->gr[r1].h = d; \ +} + +// flags +#define SSP_FLAG_L (1<<0xc) +#define SSP_FLAG_Z (1<<0xd) +#define SSP_FLAG_V (1<<0xe) +#define SSP_FLAG_N (1<<0xf) + +// update ZN according to 32bit ACC. +#define UPD_ACC_ZN \ + rST &= ~(SSP_FLAG_Z|SSP_FLAG_N); \ + if (!rA32) rST |= SSP_FLAG_Z; \ + else rST |= (rA32>>16)&SSP_FLAG_N; + +// it seems SVP code never checks for L and OV, so we leave them out. +// rST |= (t>>4)&SSP_FLAG_L; +#define UPD_LZVN \ + rST &= ~(SSP_FLAG_L|SSP_FLAG_Z|SSP_FLAG_V|SSP_FLAG_N); \ + if (!rA32) rST |= SSP_FLAG_Z; \ + else rST |= (rA32>>16)&SSP_FLAG_N; + +// standard cond processing. +// again, only Z and N is checked, as SVP doesn't seem to use any other conds. +#define COND_CHECK \ + switch (op&0xf0) { \ + case 0x00: cond = 1; break; /* always true */ \ + case 0x50: cond = !((rST ^ (op<<5)) & SSP_FLAG_Z); break; /* Z matches f(?) bit */ \ + case 0x70: cond = !((rST ^ (op<<7)) & SSP_FLAG_N); break; /* N matches f(?) bit */ \ + default:elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: unimplemented cond @ %04x", GET_PPC_OFFS()); break; \ + } + +// ops with accumulator. +// how is low word really affected by these? +// nearly sure 'ld A' doesn't affect flags +#define OP_LDA(x) \ + rA = x + +#define OP_LDA32(x) \ + rA32 = x + +#define OP_SUBA(x) { \ + rA32 -= (x) << 16; \ + UPD_LZVN \ +} + +#define OP_SUBA32(x) { \ + rA32 -= (x); \ + UPD_LZVN \ +} + +#define OP_CMPA(x) { \ + u32 t = rA32 - ((x) << 16); \ + rST &= ~(SSP_FLAG_L|SSP_FLAG_Z|SSP_FLAG_V|SSP_FLAG_N); \ + if (!t) rST |= SSP_FLAG_Z; \ + else rST |= (t>>16)&SSP_FLAG_N; \ +} + +#define OP_CMPA32(x) { \ + u32 t = rA32 - (x); \ + rST &= ~(SSP_FLAG_L|SSP_FLAG_Z|SSP_FLAG_V|SSP_FLAG_N); \ + if (!t) rST |= SSP_FLAG_Z; \ + else rST |= (t>>16)&SSP_FLAG_N; \ +} + +#define OP_ADDA(x) { \ + rA32 += (x) << 16; \ + UPD_LZVN \ +} + +#define OP_ADDA32(x) { \ + rA32 += (x); \ + UPD_LZVN \ +} + +#define OP_ANDA(x) \ + rA32 &= (x) << 16; \ + UPD_ACC_ZN + +#define OP_ANDA32(x) \ + rA32 &= (x); \ + UPD_ACC_ZN + +#define OP_ORA(x) \ + rA32 |= (x) << 16; \ + UPD_ACC_ZN + +#define OP_ORA32(x) \ + rA32 |= (x); \ + UPD_ACC_ZN + +#define OP_EORA(x) \ + rA32 ^= (x) << 16; \ + UPD_ACC_ZN + +#define OP_EORA32(x) \ + rA32 ^= (x); \ + UPD_ACC_ZN + + +#define OP_CHECK32(OP) { \ + if ((op & 0x0f) == SSP_P) { /* A <- P */ \ + read_P(); /* update P */ \ + OP(rP.v); \ + break; \ + } \ + if ((op & 0x0f) == SSP_A) { /* A <- A */ \ + OP(rA32); \ + break; \ + } \ +} + + +static ssp1601_t *ssp = NULL; +static unsigned short *PC; +static int g_cycles; + +#ifdef USE_DEBUGGER +static int running = 0; +static int last_iram = 0; +#endif + +// ----------------------------------------------------- +// register i/o handlers + +// 0-4, 13 +static u32 read_unknown(void) +{ +#ifdef LOG_SVP + elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: unknown read @ %04x", GET_PPC_OFFS()); +#endif + return 0; +} + +static void write_unknown(u32 d) +{ +#ifdef LOG_SVP + elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: unknown write @ %04x", GET_PPC_OFFS()); +#endif +} + +// 4 +static void write_ST(u32 d) +{ + //if ((rST ^ d) & 0x0007) elprintf(EL_SVP, "ssp RPL %i -> %i @ %04x", rST&7, d&7, GET_PPC_OFFS()); +#ifdef LOG_SVP + if ((rST ^ d) & 0x0f98) elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME ST %04x -> %04x @ %04x", rST, d, GET_PPC_OFFS()); +#endif + rST = d; +} + +// 5 +static u32 read_STACK(void) +{ + --rSTACK; + if ((short)rSTACK < 0) { + rSTACK = 5; +#ifdef LOG_SVP + elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: stack underflow! (%i) @ %04x", rSTACK, GET_PPC_OFFS()); +#endif + } + return ssp->stack[rSTACK]; +} + +static void write_STACK(u32 d) +{ + if (rSTACK >= 6) { +#ifdef LOG_SVP + elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: stack overflow! (%i) @ %04x", rSTACK, GET_PPC_OFFS()); +#endif + rSTACK = 0; + } + ssp->stack[rSTACK++] = d; +} + +// 6 +static u32 read_PC(void) +{ + //g_cycles--; + return GET_PC(); +} + +static void write_PC(u32 d) +{ + SET_PC(d); + g_cycles--; +} + +// 7 +static u32 read_P(void) +{ + int m1 = (signed short)rX; + int m2 = (signed short)rY; + rP.v = (m1 * m2 * 2); + return rP.h; +} + +// ----------------------------------------------------- + +static int get_inc(int mode) +{ + int inc = (mode >> 11) & 7; + if (inc != 0) { + if (inc != 7) inc--; + //inc = (1<<16) << inc; // 0 1 2 4 8 16 32 128 + inc = 1 << inc; // 0 1 2 4 8 16 32 128 + if (mode & 0x8000) inc = -inc; // decrement mode + } + return inc; +} + +#define overwite_write(dst, d) \ +{ \ + if (d & 0xf000) { dst &= ~0xf000; dst |= d & 0xf000; } \ + if (d & 0x0f00) { dst &= ~0x0f00; dst |= d & 0x0f00; } \ + if (d & 0x00f0) { dst &= ~0x00f0; dst |= d & 0x00f0; } \ + if (d & 0x000f) { dst &= ~0x000f; dst |= d & 0x000f; } \ +} + +static u32 pm_io(int reg, int write, u32 d) +{ + if (ssp->emu_status & SSP_PMC_SET) + { + // this MUST be blind r or w + if ((*(PC-1) & 0xff0f) && (*(PC-1) & 0xfff0)) { +#ifdef LOG_SVP + elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: tried to set PM%i (%c) with non-blind i/o %08x @ %04x", + reg, write ? 'w' : 'r', rPMC.v, GET_PPC_OFFS()); +#endif + ssp->emu_status &= ~SSP_PMC_SET; + return 0; + } +#ifdef LOG_SVP + elprintf(EL_SVP, "PM%i (%c) set to %08x @ %04x", reg, write ? 'w' : 'r', rPMC.v, GET_PPC_OFFS()); +#endif + ssp->pmac_read[write ? reg + 6 : reg] = rPMC.v; + ssp->emu_status &= ~SSP_PMC_SET; +#ifdef LOG_SVP + if ((rPMC.v & 0x7f) == 0x1c && (rPMC.v & 0x7fff0000) == 0) { + elprintf(EL_SVP, "ssp IRAM copy from %06x", (ssp->RAM1[0]-1)<<1); +#ifdef USE_DEBUGGER + last_iram = (ssp->RAM1[0]-1)<<1; +#endif + } +#endif + return 0; + } + + // just in case + if (ssp->emu_status & SSP_PMC_HAVE_ADDR) { +#ifdef LOG_SVP + elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: PM%i (%c) with only addr set @ %04x", + reg, write ? 'w' : 'r', GET_PPC_OFFS()); +#endif + ssp->emu_status &= ~SSP_PMC_HAVE_ADDR; + } + + if (reg == 4 || (rST & 0x60)) + { +#ifdef LOG_SVP + #define CADDR ((((mode<<16)&0x7f0000)|addr)<<1) +#endif + unsigned short *dram = (unsigned short *)svp->dram; + if (write) + { + /*int mode = ssp->pmac_write[reg]&0xffff; + int addr = ssp->pmac_write[reg]>>16;*/ + int addr = ssp->pmac_write[reg]&0xffff; + int mode = ssp->pmac_write[reg]>>16; +#ifdef LOG_SVP + if ((mode & 0xb800) == 0xb800) + elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: mode %04x", mode); +#endif + if ((mode & 0x43ff) == 0x0018) // DRAM + { + int inc = get_inc(mode); +#ifdef LOG_SVP + elprintf(EL_SVP, "ssp PM%i DRAM w [%06x] %04x (inc %i, ovrw %i)", + reg, CADDR, d, inc >> 16, (mode>>10)&1); +#endif + if (mode & 0x0400) { + overwite_write(dram[addr], d); + } else dram[addr] = d; + ssp->pmac_write[reg] += inc; + } + else if ((mode & 0xfbff) == 0x4018) // DRAM, cell inc + { +#ifdef LOG_SVP + elprintf(EL_SVP, "ssp PM%i DRAM w [%06x] %04x (cell inc, ovrw %i) @ %04x", + reg, CADDR, d, (mode>>10)&1, GET_PPC_OFFS()); +#endif + if (mode & 0x0400) { + overwite_write(dram[addr], d); + } else dram[addr] = d; + //ssp->pmac_write[reg] += (addr&1) ? (31<<16) : (1<<16); + ssp->pmac_write[reg] += (addr&1) ? 31 : 1; + } + else if ((mode & 0x47ff) == 0x001c) // IRAM + { + int inc = get_inc(mode); +#ifdef LOG_SVP + if ((addr&0xfc00) != 0x8000) + elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: invalid IRAM addr: %04x", addr<<1); + elprintf(EL_SVP, "ssp IRAM w [%06x] %04x (inc %i)", (addr<<1)&0x7ff, d, inc >> 16); +#endif + ((unsigned short *)svp->iram_rom)[addr&0x3ff] = d; + ssp->pmac_write[reg] += inc; + } +#ifdef LOG_SVP + else + { + elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: PM%i unhandled write mode %04x, [%06x] %04x @ %04x", + reg, mode, CADDR, d, GET_PPC_OFFS()); + } +#endif + } + else + { + /*int mode = ssp->pmac_read[reg]&0xffff; + int addr = ssp->pmac_read[reg]>>16;*/ + int addr = ssp->pmac_read[reg]&0xffff; + int mode = ssp->pmac_read[reg]>>16; + + if ((mode & 0xfff0) == 0x0800) // ROM, inc 1, verified to be correct + { +#ifdef LOG_SVP + elprintf(EL_SVP, "ssp ROM r [%06x] %04x", CADDR, + ((unsigned short *)cart_rom)[addr|((mode&0xf)<<16)]); +#endif + /*if ((signed int)ssp->pmac_read[reg] >> 16 == -1) ssp->pmac_read[reg]++; + ssp->pmac_read[reg] += 1<<16;*/ + if ((signed int)(ssp->pmac_read[reg] & 0xffff) == -1) ssp->pmac_read[reg] += 1<<16; + ssp->pmac_read[reg] ++; + + d = ((unsigned short *)cart_rom)[addr|((mode&0xf)<<16)]; + } + else if ((mode & 0x47ff) == 0x0018) // DRAM + { + int inc = get_inc(mode); +#ifdef LOG_SVP + elprintf(EL_SVP, "ssp PM%i DRAM r [%06x] %04x (inc %i)", reg, CADDR, dram[addr], inc >> 16); +#endif + d = dram[addr]; + ssp->pmac_read[reg] += inc; + } + else + { +#ifdef LOG_SVP + elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: PM%i unhandled read mode %04x, [%06x] @ %04x", + reg, mode, CADDR, GET_PPC_OFFS()); +#endif + d = 0; + } + } + + // PMC value corresponds to last PMR accessed (not sure). + rPMC.v = ssp->pmac_read[write ? reg + 6 : reg]; + + return d; + } + + return (u32)-1; +} + +// 8 +static u32 read_PM0(void) +{ + u32 d = pm_io(0, 0, 0); + if (d != (u32)-1) return d; +#ifdef LOG_SVP + elprintf(EL_SVP, "PM0 raw r %04x @ %04x", rPM0, GET_PPC_OFFS()); +#endif + d = rPM0; + if (!(d & 2) && (GET_PPC_OFFS() == 0x800 || GET_PPC_OFFS() == 0x1851E)) { + ssp->emu_status |= SSP_WAIT_PM0; +#ifdef LOG_SVP + elprintf(EL_SVP, "det TIGHT loop: PM0"); +#endif + } + rPM0 &= ~2; // ? + return d; +} + +static void write_PM0(u32 d) +{ + u32 r = pm_io(0, 1, d); + if (r != (u32)-1) return; +#ifdef LOG_SVP + elprintf(EL_SVP, "PM0 raw w %04x @ %04x", d, GET_PPC_OFFS()); +#endif + rPM0 = d; +} + +// 9 +static u32 read_PM1(void) +{ + u32 d = pm_io(1, 0, 0); + if (d != (u32)-1) return d; + // can be removed? +#ifdef LOG_SVP + elprintf(EL_SVP|EL_ANOMALY, "PM1 raw r %04x @ %04x", rPM1, GET_PPC_OFFS()); +#endif + return rPM1; +} + +static void write_PM1(u32 d) +{ + u32 r = pm_io(1, 1, d); + if (r != (u32)-1) return; + // can be removed? +#ifdef LOG_SVP + elprintf(EL_SVP|EL_ANOMALY, "PM1 raw w %04x @ %04x", d, GET_PPC_OFFS()); +#endif + rPM1 = d; +} + +// 10 +static u32 read_PM2(void) +{ + u32 d = pm_io(2, 0, 0); + if (d != (u32)-1) return d; + // can be removed? +#ifdef LOG_SVP + elprintf(EL_SVP|EL_ANOMALY, "PM2 raw r %04x @ %04x", rPM2, GET_PPC_OFFS()); +#endif + return rPM2; +} + +static void write_PM2(u32 d) +{ + u32 r = pm_io(2, 1, d); + if (r != (u32)-1) return; + // can be removed? +#ifdef LOG_SVP + elprintf(EL_SVP|EL_ANOMALY, "PM2 raw w %04x @ %04x", d, GET_PPC_OFFS()); +#endif + rPM2 = d; +} + +// 11 +static u32 read_XST(void) +{ + // can be removed? + u32 d = pm_io(3, 0, 0); + if (d != (u32)-1) return d; +#ifdef LOG_SVP + elprintf(EL_SVP, "XST raw r %04x @ %04x", rXST, GET_PPC_OFFS()); +#endif + return rXST; +} + +static void write_XST(u32 d) +{ + // can be removed? + u32 r = pm_io(3, 1, d); + if (r != (u32)-1) return; +#ifdef LOG_SVP + elprintf(EL_SVP, "XST raw w %04x @ %04x", d, GET_PPC_OFFS()); +#endif + rPM0 |= 1; + rXST = d; +} + +// 12 +static u32 read_PM4(void) +{ + u32 d = pm_io(4, 0, 0); + if (d == 0) { + switch (GET_PPC_OFFS()) { + case 0x0854: + ssp->emu_status |= SSP_WAIT_30FE08; +#ifdef LOG_SVP + elprintf(EL_SVP, "det TIGHT loop: [30fe08]"); +#endif + break; + case 0x4f12: + ssp->emu_status |= SSP_WAIT_30FE06; +#ifdef LOG_SVP + elprintf(EL_SVP, "det TIGHT loop: [30fe06]"); +#endif + break; + } + } + if (d != (u32)-1) return d; + // can be removed? +#ifdef LOG_SVP + elprintf(EL_SVP|EL_ANOMALY, "PM4 raw r %04x @ %04x", rPM4, GET_PPC_OFFS()); +#endif + return rPM4; +} + +static void write_PM4(u32 d) +{ + u32 r = pm_io(4, 1, d); + if (r != (u32)-1) return; + // can be removed? +#ifdef LOG_SVP + elprintf(EL_SVP|EL_ANOMALY, "PM4 raw w %04x @ %04x", d, GET_PPC_OFFS()); +#endif + rPM4 = d; +} + +// 14 +static u32 read_PMC(void) +{ +#ifdef LOG_SVP + elprintf(EL_SVP, "PMC r a %04x (st %c) @ %04x", rPMC.h, + (ssp->emu_status & SSP_PMC_HAVE_ADDR) ? 'm' : 'a', GET_PPC_OFFS()); +#endif + if (ssp->emu_status & SSP_PMC_HAVE_ADDR) { + //if (ssp->emu_status & SSP_PMC_SET) + // elprintf(EL_ANOMALY|EL_SVP, "prev PMC not used @ %04x", GET_PPC_OFFS()); + ssp->emu_status |= SSP_PMC_SET; + ssp->emu_status &= ~SSP_PMC_HAVE_ADDR; + //return ((rPMC.h << 4) & 0xfff0) | ((rPMC.h >> 4) & 0xf); + return ((rPMC.l << 4) & 0xfff0) | ((rPMC.l >> 4) & 0xf); + } else { + ssp->emu_status |= SSP_PMC_HAVE_ADDR; + //return rPMC.h; + return rPMC.l; + } +} + +static void write_PMC(u32 d) +{ + if (ssp->emu_status & SSP_PMC_HAVE_ADDR) { + //if (ssp->emu_status & SSP_PMC_SET) + // elprintf(EL_ANOMALY|EL_SVP, "prev PMC not used @ %04x", GET_PPC_OFFS()); + ssp->emu_status |= SSP_PMC_SET; + ssp->emu_status &= ~SSP_PMC_HAVE_ADDR; + //rPMC.l = d; + rPMC.h = d; +#ifdef LOG_SVP + elprintf(EL_SVP, "PMC w m %04x @ %04x", rPMC.l, GET_PPC_OFFS()); +#endif + } else { + ssp->emu_status |= SSP_PMC_HAVE_ADDR; + //rPMC.h = d; + rPMC.l = d; +#ifdef LOG_SVP + elprintf(EL_SVP, "PMC w a %04x @ %04x", rPMC.h, GET_PPC_OFFS()); +#endif + } +} + +// 15 +static u32 read_AL(void) +{ + if (*(PC-1) == 0x000f) { +#ifdef LOG_SVP + elprintf(EL_SVP, "ssp dummy PM assign %08x @ %04x", rPMC.v, GET_PPC_OFFS()); +#endif + ssp->emu_status &= ~(SSP_PMC_SET|SSP_PMC_HAVE_ADDR); // ? + } + return rAL; +} + +static void write_AL(u32 d) +{ + rAL = d; +} + + +typedef u32 (*read_func_t)(void); +typedef void (*write_func_t)(u32 d); + +static read_func_t read_handlers[16] = +{ + read_unknown, read_unknown, read_unknown, read_unknown, // -, X, Y, A + read_unknown, // 4 ST + read_STACK, + read_PC, + read_P, + read_PM0, // 8 + read_PM1, + read_PM2, + read_XST, + read_PM4, // 12 + read_unknown, // 13 gr13 + read_PMC, + read_AL +}; + +static write_func_t write_handlers[16] = +{ + write_unknown, write_unknown, write_unknown, write_unknown, // -, X, Y, A +// write_unknown, // 4 ST + write_ST, // 4 ST (debug hook) + write_STACK, + write_PC, + write_unknown, // 7 P + write_PM0, // 8 + write_PM1, + write_PM2, + write_XST, + write_PM4, // 12 + write_unknown, // 13 gr13 + write_PMC, + write_AL +}; + +// ----------------------------------------------------- +// pointer register handlers + +// +#define ptr1_read(op) ptr1_read_(op&3,(op>>6)&4,(op<<1)&0x18) + +static u32 ptr1_read_(int ri, int isj2, int modi3) +{ + //int t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18); + u32 mask, add = 0, t = ri | isj2 | modi3; + unsigned char *rp = NULL; + switch (t) + { + // mod=0 (00) + case 0x00: + case 0x01: + case 0x02: return ssp->RAM0[ssp->r0[t&3]]; + case 0x03: return ssp->RAM0[0]; + case 0x04: + case 0x05: + case 0x06: return ssp->RAM1[ssp->r1[t&3]]; + case 0x07: return ssp->RAM1[0]; + // mod=1 (01), "+!" + case 0x08: + case 0x09: + case 0x0a: return ssp->RAM0[ssp->r0[t&3]++]; + case 0x0b: return ssp->RAM0[1]; + case 0x0c: + case 0x0d: + case 0x0e: return ssp->RAM1[ssp->r1[t&3]++]; + case 0x0f: return ssp->RAM1[1]; + // mod=2 (10), "-" + case 0x10: + case 0x11: + case 0x12: rp = &ssp->r0[t&3]; t = ssp->RAM0[*rp]; + if (!(rST&7)) { (*rp)--; return t; } + add = -1; goto modulo; + case 0x13: return ssp->RAM0[2]; + case 0x14: + case 0x15: + case 0x16: rp = &ssp->r1[t&3]; t = ssp->RAM1[*rp]; + if (!(rST&7)) { (*rp)--; return t; } + add = -1; goto modulo; + case 0x17: return ssp->RAM1[2]; + // mod=3 (11), "+" + case 0x18: + case 0x19: + case 0x1a: rp = &ssp->r0[t&3]; t = ssp->RAM0[*rp]; + if (!(rST&7)) { (*rp)++; return t; } + add = 1; goto modulo; + case 0x1b: return ssp->RAM0[3]; + case 0x1c: + case 0x1d: + case 0x1e: rp = &ssp->r1[t&3]; t = ssp->RAM1[*rp]; + if (!(rST&7)) { (*rp)++; return t; } + add = 1; goto modulo; + case 0x1f: return ssp->RAM1[3]; + } + + return 0; + +modulo: + mask = (1 << (rST&7)) - 1; + *rp = (*rp & ~mask) | ((*rp + add) & mask); + return t; +} + +static void ptr1_write(int op, u32 d) +{ + int t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18); + switch (t) + { + // mod=0 (00) + case 0x00: + case 0x01: + case 0x02: ssp->RAM0[ssp->r0[t&3]] = d; return; + case 0x03: ssp->RAM0[0] = d; return; + case 0x04: + case 0x05: + case 0x06: ssp->RAM1[ssp->r1[t&3]] = d; return; + case 0x07: ssp->RAM1[0] = d; return; + // mod=1 (01), "+!" + // mod=3, "+" + case 0x08: + case 0x18: + case 0x09: + case 0x19: + case 0x0a: + case 0x1a: ssp->RAM0[ssp->r0[t&3]++] = d; return; + case 0x0b: ssp->RAM0[1] = d; return; + case 0x0c: + case 0x1c: + case 0x0d: + case 0x1d: + case 0x0e: + case 0x1e: ssp->RAM1[ssp->r1[t&3]++] = d; return; + case 0x0f: ssp->RAM1[1] = d; return; + // mod=2 (10), "-" + case 0x10: + case 0x11: + case 0x12: ssp->RAM0[ssp->r0[t&3]--] = d; return; + case 0x13: ssp->RAM0[2] = d; return; + case 0x14: + case 0x15: + case 0x16: ssp->RAM1[ssp->r1[t&3]--] = d; return; + case 0x17: ssp->RAM1[2] = d; return; + // mod=3 (11) + case 0x1b: ssp->RAM0[3] = d; return; + case 0x1f: ssp->RAM1[3] = d; return; + } +} + +static u32 ptr2_read(int op) +{ + int mv = 0, t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18); + switch (t) + { + // mod=0 (00) + case 0x00: + case 0x01: + case 0x02: mv = ssp->RAM0[ssp->r0[t&3]]++; break; + case 0x03: mv = ssp->RAM0[0]++; break; + case 0x04: + case 0x05: + case 0x06: mv = ssp->RAM1[ssp->r1[t&3]]++; break; + case 0x07: mv = ssp->RAM1[0]++; break; + // mod=1 (01) + case 0x0b: mv = ssp->RAM0[1]++; break; + case 0x0f: mv = ssp->RAM1[1]++; break; + // mod=2 (10) + case 0x13: mv = ssp->RAM0[2]++; break; + case 0x17: mv = ssp->RAM1[2]++; break; + // mod=3 (11) + case 0x1b: mv = ssp->RAM0[3]++; break; + case 0x1f: mv = ssp->RAM1[3]++; break; + default: elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: invalid mod in ((rX))? @ %04x", GET_PPC_OFFS()); + return 0; + } + + return ((unsigned short *)svp->iram_rom)[mv]; +} + + +// ----------------------------------------------------- + +void ssp1601_reset(ssp1601_t *l_ssp) +{ + ssp = l_ssp; + ssp->emu_status = 0; + ssp->gr[SSP_GR0].v = 0xffff0000; + rPC = 0x400; + rSTACK = 0; // ? using ascending stack + rST = 0; +} + + +#ifdef USE_DEBUGGER +static void debug_dump(void) +{ + printf("GR0: %04x X: %04x Y: %04x A: %08x\n", ssp->gr[SSP_GR0].h, rX, rY, ssp->gr[SSP_A].v); + printf("PC: %04x (%04x) P: %08x\n", GET_PC(), GET_PC() << 1, ssp->gr[SSP_P].v); + printf("PM0: %04x PM1: %04x PM2: %04x\n", rPM0, rPM1, rPM2); + printf("XST: %04x PM4: %04x PMC: %08x\n", rXST, rPM4, ssp->gr[SSP_PMC].v); + printf(" ST: %04x %c%c%c%c, GP0_0 %i, GP0_1 %i\n", rST, rST&SSP_FLAG_N?'N':'n', rST&SSP_FLAG_V?'V':'v', + rST&SSP_FLAG_Z?'Z':'z', rST&SSP_FLAG_L?'L':'l', (rST>>5)&1, (rST>>6)&1); + printf("STACK: %i %04x %04x %04x %04x %04x %04x\n", rSTACK, ssp->stack[0], ssp->stack[1], + ssp->stack[2], ssp->stack[3], ssp->stack[4], ssp->stack[5]); + printf("r0-r2: %02x %02x %02x r4-r6: %02x %02x %02x\n", rIJ[0], rIJ[1], rIJ[2], rIJ[4], rIJ[5], rIJ[6]); + elprintf(EL_SVP, "cycles: %i, emu_status: %x", g_cycles, ssp->emu_status); +} + +static void debug_dump_mem(void) +{ + int h, i; + printf("RAM0\n"); + for (h = 0; h < 32; h++) + { + if (h == 16) printf("RAM1\n"); + printf("%03x:", h*16); + for (i = 0; i < 16; i++) + printf(" %04x", ssp->RAM[h*16+i]); + printf("\n"); + } +} + +static void debug_dump2file(const char *fname, void *mem, int len) +{ + FILE *f = fopen(fname, "wb"); + unsigned short *p = mem; + int i; + if (f) { + for (i = 0; i < len/2; i++) p[i] = (p[i]<<8) | (p[i]>>8); + fwrite(mem, 1, len, f); + fclose(f); + for (i = 0; i < len/2; i++) p[i] = (p[i]<<8) | (p[i]>>8); + printf("dumped to %s\n", fname); + } + else + printf("dump failed\n"); +} + +static int bpts[10] = { 0, }; + +static void debug(unsigned int pc, unsigned int op) +{ + static char buffo[64] = {0,}; + char buff[64] = {0,}; + int i; + + if (running) { + for (i = 0; i < 10; i++) + if (pc != 0 && bpts[i] == pc) { + printf("breakpoint %i\n", i); + running = 0; + break; + } + } + if (running) return; + + printf("%04x (%02x) @ %04x\n", op, op >> 9, pc<<1); + + while (1) + { + printf("dbg> "); + fflush(stdout); + fgets(buff, sizeof(buff), stdin); + if (buff[0] == '\n') strcpy(buff, buffo); + else strcpy(buffo, buff); + + switch (buff[0]) { + case 0: exit(0); + case 'c': + case 'r': running = 1; return; + case 's': + case 'n': return; + case 'x': debug_dump(); break; + case 'm': debug_dump_mem(); break; + case 'b': { + char *baddr = buff + 2; + i = 0; + if (buff[3] == ' ') { i = buff[2] - '0'; baddr = buff + 4; } + bpts[i] = strtol(baddr, NULL, 16) >> 1; + printf("breakpoint %i set @ %04x\n", i, bpts[i]<<1); + break; + } + case 'd': + sprintf(buff, "iramrom_%04x.bin", last_iram); + debug_dump2file(buff, svp->iram_rom, sizeof(svp->iram_rom)); + debug_dump2file("dram.bin", svp->dram, sizeof(svp->dram)); + break; + default: printf("unknown command\n"); break; + } + } +} +#endif // USE_DEBUGGER + + +void ssp1601_run(int cycles) +{ + SET_PC(rPC); + g_cycles = cycles; + + while (g_cycles > 0 && !(ssp->emu_status & SSP_WAIT_MASK)) + { + int op; + u32 tmpv; + + op = *PC++; +#ifdef USE_DEBUGGER + debug(GET_PC()-1, op); +#endif + switch (op >> 9) + { + // ld d, s + case 0x00: + if (op == 0) break; // nop + if (op == ((SSP_A<<4)|SSP_P)) { // A <- P + // not sure. MAME claims that only hi word is transfered. + read_P(); // update P + rA32 = rP.v; + } + else + { + tmpv = REG_READ(op & 0x0f); + REG_WRITE((op & 0xf0) >> 4, tmpv); + } + break; + + // ld d, (ri) + case 0x01: tmpv = ptr1_read(op); REG_WRITE((op & 0xf0) >> 4, tmpv); break; + + // ld (ri), s + case 0x02: tmpv = REG_READ((op & 0xf0) >> 4); ptr1_write(op, tmpv); break; + + // ldi d, imm + case 0x04: tmpv = *PC++; REG_WRITE((op & 0xf0) >> 4, tmpv); break; + + // ld d, ((ri)) + case 0x05: tmpv = ptr2_read(op); REG_WRITE((op & 0xf0) >> 4, tmpv); break; + + // ldi (ri), imm + case 0x06: tmpv = *PC++; ptr1_write(op, tmpv); break; + + // ld adr, a + case 0x07: ssp->RAM[op & 0x1ff] = rA; break; + + // ld d, ri + case 0x09: tmpv = rIJ[(op&3)|((op>>6)&4)]; REG_WRITE((op & 0xf0) >> 4, tmpv); break; + + // ld ri, s + case 0x0a: rIJ[(op&3)|((op>>6)&4)] = REG_READ((op & 0xf0) >> 4); break; + + // ldi ri, simm + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: rIJ[(op>>8)&7] = op; break; + + // call cond, addr + case 0x24: { + int cond = 0; + COND_CHECK + if (cond) { int new_PC = *PC++; write_STACK(GET_PC()); write_PC(new_PC); } + else PC++; + break; + } + + // ld d, (a) + case 0x25: tmpv = ((unsigned short *)svp->iram_rom)[rA]; REG_WRITE((op & 0xf0) >> 4, tmpv); break; + + // bra cond, addr + case 0x26: { + int cond = 0; + COND_CHECK + if (cond) { int new_PC = *PC++; write_PC(new_PC); } + else PC++; + break; + } + + // mod cond, op + case 0x48: { + int cond = 0; + COND_CHECK + if (cond) { + switch (op & 7) { + case 2: rA32 = (signed int)rA32 >> 1; break; // shr (arithmetic) + case 3: rA32 <<= 1; break; // shl + case 6: rA32 = -(signed int)rA32; break; // neg + case 7: if ((int)rA32 < 0) rA32 = -(signed int)rA32; break; // abs + default: +#ifdef LOG_SVP + elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: unhandled mod %i @ %04x", + op&7, GET_PPC_OFFS()); +#endif + break; + } + UPD_ACC_ZN // ? + } + break; + } + + // mpys? + case 0x1b: +#ifdef LOG_SVP + if (!(op&0x100)) elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: no b bit @ %04x", GET_PPC_OFFS()); +#endif + read_P(); // update P + rA32 -= rP.v; // maybe only upper word? + UPD_ACC_ZN // there checking flags after this + rX = ptr1_read_(op&3, 0, (op<<1)&0x18); // ri (maybe rj?) + rY = ptr1_read_((op>>4)&3, 4, (op>>3)&0x18); // rj + break; + + // mpya (rj), (ri), b + case 0x4b: +#ifdef LOG_SVP + if (!(op&0x100)) elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: no b bit @ %04x", GET_PPC_OFFS()); +#endif + read_P(); // update P + rA32 += rP.v; // confirmed to be 32bit + UPD_ACC_ZN // ? + rX = ptr1_read_(op&3, 0, (op<<1)&0x18); // ri (maybe rj?) + rY = ptr1_read_((op>>4)&3, 4, (op>>3)&0x18); // rj + break; + + // mld (rj), (ri), b + case 0x5b: +#ifdef LOG_SVP + if (!(op&0x100)) elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: no b bit @ %04x", GET_PPC_OFFS()); +#endif + rA32 = 0; + rST &= 0x0fff; // ? + rX = ptr1_read_(op&3, 0, (op<<1)&0x18); // ri (maybe rj?) + rY = ptr1_read_((op>>4)&3, 4, (op>>3)&0x18); // rj + break; + + // OP a, s + case 0x10: OP_CHECK32(OP_SUBA32); tmpv = REG_READ(op & 0x0f); OP_SUBA(tmpv); break; + case 0x30: OP_CHECK32(OP_CMPA32); tmpv = REG_READ(op & 0x0f); OP_CMPA(tmpv); break; + case 0x40: OP_CHECK32(OP_ADDA32); tmpv = REG_READ(op & 0x0f); OP_ADDA(tmpv); break; + case 0x50: OP_CHECK32(OP_ANDA32); tmpv = REG_READ(op & 0x0f); OP_ANDA(tmpv); break; + case 0x60: OP_CHECK32(OP_ORA32 ); tmpv = REG_READ(op & 0x0f); OP_ORA (tmpv); break; + case 0x70: OP_CHECK32(OP_EORA32); tmpv = REG_READ(op & 0x0f); OP_EORA(tmpv); break; + + // OP a, (ri) + case 0x11: tmpv = ptr1_read(op); OP_SUBA(tmpv); break; + case 0x31: tmpv = ptr1_read(op); OP_CMPA(tmpv); break; + case 0x41: tmpv = ptr1_read(op); OP_ADDA(tmpv); break; + case 0x51: tmpv = ptr1_read(op); OP_ANDA(tmpv); break; + case 0x61: tmpv = ptr1_read(op); OP_ORA (tmpv); break; + case 0x71: tmpv = ptr1_read(op); OP_EORA(tmpv); break; + + // OP a, adr + case 0x03: tmpv = ssp->RAM[op & 0x1ff]; OP_LDA (tmpv); break; + case 0x13: tmpv = ssp->RAM[op & 0x1ff]; OP_SUBA(tmpv); break; + case 0x33: tmpv = ssp->RAM[op & 0x1ff]; OP_CMPA(tmpv); break; + case 0x43: tmpv = ssp->RAM[op & 0x1ff]; OP_ADDA(tmpv); break; + case 0x53: tmpv = ssp->RAM[op & 0x1ff]; OP_ANDA(tmpv); break; + case 0x63: tmpv = ssp->RAM[op & 0x1ff]; OP_ORA (tmpv); break; + case 0x73: tmpv = ssp->RAM[op & 0x1ff]; OP_EORA(tmpv); break; + + // OP a, imm + case 0x14: tmpv = *PC++; OP_SUBA(tmpv); break; + case 0x34: tmpv = *PC++; OP_CMPA(tmpv); break; + case 0x44: tmpv = *PC++; OP_ADDA(tmpv); break; + case 0x54: tmpv = *PC++; OP_ANDA(tmpv); break; + case 0x64: tmpv = *PC++; OP_ORA (tmpv); break; + case 0x74: tmpv = *PC++; OP_EORA(tmpv); break; + + // OP a, ((ri)) + case 0x15: tmpv = ptr2_read(op); OP_SUBA(tmpv); break; + case 0x35: tmpv = ptr2_read(op); OP_CMPA(tmpv); break; + case 0x45: tmpv = ptr2_read(op); OP_ADDA(tmpv); break; + case 0x55: tmpv = ptr2_read(op); OP_ANDA(tmpv); break; + case 0x65: tmpv = ptr2_read(op); OP_ORA (tmpv); break; + case 0x75: tmpv = ptr2_read(op); OP_EORA(tmpv); break; + + // OP a, ri + case 0x19: tmpv = rIJ[IJind]; OP_SUBA(tmpv); break; + case 0x39: tmpv = rIJ[IJind]; OP_CMPA(tmpv); break; + case 0x49: tmpv = rIJ[IJind]; OP_ADDA(tmpv); break; + case 0x59: tmpv = rIJ[IJind]; OP_ANDA(tmpv); break; + case 0x69: tmpv = rIJ[IJind]; OP_ORA (tmpv); break; + case 0x79: tmpv = rIJ[IJind]; OP_EORA(tmpv); break; + + // OP simm + case 0x1c: + OP_SUBA(op & 0xff); +#ifdef LOG_SVP + if (op&0x100) elprintf(EL_SVP|EL_ANOMALY, "FIXME: simm with upper bit set"); +#endif + break; + case 0x3c: + OP_CMPA(op & 0xff); +#ifdef LOG_SVP + if (op&0x100) elprintf(EL_SVP|EL_ANOMALY, "FIXME: simm with upper bit set"); +#endif + break; + case 0x4c: + OP_ADDA(op & 0xff); +#ifdef LOG_SVP + if (op&0x100) elprintf(EL_SVP|EL_ANOMALY, "FIXME: simm with upper bit set"); +#endif + break; + // MAME code only does LSB of top word, but this looks wrong to me. + case 0x5c: + OP_ANDA(op & 0xff); +#ifdef LOG_SVP + if (op&0x100) elprintf(EL_SVP|EL_ANOMALY, "FIXME: simm with upper bit set"); +#endif + break; + case 0x6c: + OP_ORA (op & 0xff); +#ifdef LOG_SVP + if (op&0x100) elprintf(EL_SVP|EL_ANOMALY, "FIXME: simm with upper bit set"); +#endif + break; + case 0x7c: + OP_EORA(op & 0xff); +#ifdef LOG_SVP + if (op&0x100) elprintf(EL_SVP|EL_ANOMALY, "FIXME: simm with upper bit set"); +#endif + break; + + default: +#ifdef LOG_SVP + elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME unhandled op %04x @ %04x", op, GET_PPC_OFFS()); +#endif + break; + } + g_cycles--; + } + + read_P(); // update P + rPC = GET_PC(); + +#ifdef LOG_SVP + if (ssp->gr[SSP_GR0].v != 0xffff0000) + elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: REG 0 corruption! %08x", ssp->gr[SSP_GR0].v); +#endif +} + diff --git a/source/cart_hw/svp/ssp16.h b/source/cart_hw/svp/ssp16.h new file mode 100644 index 0000000..5c201cc --- /dev/null +++ b/source/cart_hw/svp/ssp16.h @@ -0,0 +1,82 @@ +/* The SVP chip emulator + + (c) Copyright 2008, Grazvydas "notaz" Ignotas + Free for non-commercial use. + + For commercial use, separate licencing terms must be obtained. + +*/ + +/* modified for Genesis Plus GCN port, added BIG ENDIAN support (EkeEke)*/ + +#ifndef _SSP16_H_ +#define _SSP16_H_ + +/* emulation event logging (from Picodrive) */ +#define EL_SVP 0x00004000 /* SVP stuff */ +#define EL_ANOMALY 0x80000000 /* some unexpected conditions (during emulation) */ +#ifdef LOG_SVP +#define elprintf(w,f,...) error("%d(%d): " f "\n",frame_count,v_counter,##__VA_ARGS__); +#else +#define elprintf(w,f,...) +#endif + +/* register names */ +enum { + SSP_GR0, SSP_X, SSP_Y, SSP_A, + SSP_ST, SSP_STACK, SSP_PC, SSP_P, + SSP_PM0, SSP_PM1, SSP_PM2, SSP_XST, + SSP_PM4, SSP_gr13, SSP_PMC, SSP_AL +}; + +typedef union +{ + unsigned int v; + struct { +#ifdef LSB_FIRST + unsigned short l; + unsigned short h; +#else + unsigned short h; + unsigned short l; +#endif + }; +} ssp_reg_t; + +typedef struct +{ + union { + unsigned short RAM[256*2]; // 2 internal RAM banks + struct { + unsigned short RAM0[256]; + unsigned short RAM1[256]; + }; + }; + ssp_reg_t gr[16]; // general registers + union { + unsigned char r[8]; // BANK pointers + struct { + unsigned char r0[4]; + unsigned char r1[4]; + }; + }; + unsigned short stack[6]; + unsigned int pmac_read[6]; // read modes/addrs for PM0-PM5 + unsigned int pmac_write[6]; // write ... + // + #define SSP_PMC_HAVE_ADDR 0x0001 // address written to PMAC, waiting for mode + #define SSP_PMC_SET 0x0002 // PMAC is set + #define SSP_HANG 0x1000 // 68000 hangs SVP + #define SSP_WAIT_PM0 0x2000 // bit1 in PM0 + #define SSP_WAIT_30FE06 0x4000 // ssp tight loops on 30FE08 to become non-zero + #define SSP_WAIT_30FE08 0x8000 // same for 30FE06 + #define SSP_WAIT_MASK 0xf000 + unsigned int emu_status; + unsigned int pad[30]; +} ssp1601_t; + + +void ssp1601_reset(ssp1601_t *ssp); +void ssp1601_run(int cycles); + +#endif diff --git a/source/cart_hw/svp/svp.c b/source/cart_hw/svp/svp.c new file mode 100644 index 0000000..a999591 --- /dev/null +++ b/source/cart_hw/svp/svp.c @@ -0,0 +1,26 @@ +// The SVP chip emulator + +// (c) Copyright 2008, Grazvydas "notaz" Ignotas +// Free for non-commercial use. + +// For commercial use, separate licencing terms must be obtained. + +/* SVP Controller */ +/* modified for Genesis Plus GCN port (eke-eke) */ + +#include "shared.h" + +svp_t *svp = NULL; +uint16 SVP_cycles = 850; + +void svp_init(void) +{ + svp = (void *) ((char *)cart_rom + 0x200000); + memset(svp, 0, sizeof(*svp)); +} + +void svp_reset(void) +{ + memcpy(svp->iram_rom + 0x800, cart_rom + 0x800, 0x20000 - 0x800); + ssp1601_reset(&svp->ssp1601); +} diff --git a/source/cart_hw/svp/svp.h b/source/cart_hw/svp/svp.h new file mode 100644 index 0000000..e46c210 --- /dev/null +++ b/source/cart_hw/svp/svp.h @@ -0,0 +1,30 @@ +/* The SVP chip emulator + + (c) Copyright 2008, Grazvydas "notaz" Ignotas + Free for non-commercial use. + + For commercial use, separate licencing terms must be obtained. + +*/ +/* SVP Controller */ +/* modified for Genesis Plus GCN port (eke-eke) */ + +#ifndef _SVP_H_ +#define _SVP_H_ + +#include "shared.h" +#include "ssp16.h" + +typedef struct { + unsigned char iram_rom[0x20000]; // IRAM (0-0x7ff) and program ROM (0x800-0x1ffff) + unsigned char dram[0x20000]; + ssp1601_t ssp1601; +} svp_t; + +extern svp_t *svp; +extern uint16 SVP_cycles; + +extern void svp_init(void); +extern void svp_reset(void); + +#endif diff --git a/source/cart_hw/svp/svpdoc.txt b/source/cart_hw/svp/svpdoc.txt new file mode 100644 index 0000000..001178c --- /dev/null +++ b/source/cart_hw/svp/svpdoc.txt @@ -0,0 +1,524 @@ +------------------------------------------------------------------------------- + notaz's SVP doc + $Id: svpdoc.txt 349 2008-02-04 23:13:59Z notaz $ + Copyright 2008, Grazvydas Ignotas (notaz) +------------------------------------------------------------------------------- + +If you use this, please credit me in your work or it's documentation. +Tasco Deluxe should also be credited for his pioneering work on the subject. +Thanks. + +Use monospace font and disable word wrap when reading this document. + +------------------------------------------------------------------------------- + Table of Contents +------------------------------------------------------------------------------- + + 0. Introduction + 1. Overview + 2. The SSP160x DSP + 2.1. General registers + 2.2. External registers + 2.3. Pointer registers + 2.4. The instruction set + 3. Memory map + 4. Other notes + + +------------------------------------------------------------------------------- + 0. Introduction +------------------------------------------------------------------------------- + +This document is an attempt to provide technical information needed to +emulate Sega's SVP chip. It is based on reverse engineering Virtua Racing +game and on various internet sources. None of information provided here +was verified on the real hardware, so some things are likely to be +inaccurate. + +The following information sources were used while writing this document +and emulator implementation: + + [1] SVP Reference Guide (annotated) and SVP Register Guide (annotated) + by Tasco Deluxe < tasco.deluxe @ gmail.com > + http://www.sharemation.com/TascoDLX/SVP%20Reference%20Guide%202007.02.11.txt + http://www.sharemation.com/TascoDLX/SVP%20Register%20Guide%202007.02.11.txt + [2] SSP1610 disassembler + written by Pierpaolo Prazzoli, MAME source code. + http://mamedev.org/ + [3] SSP1601 DSP datasheet + http://notaz.gp2x.de/docs/SSP1601.pdf + [4] DSP page (with code samples) in Samsung Semiconductor website from 1997 + retrieved from Internet Archive: The Wayback Machine + http://web.archive.org/web/19970607052826/www.sec.samsung.com/Products/dsp/dspcore.htm + [5] Sega's SVP Chip: The Road not Taken? + Ken Horowitz, Sega-16 + http://sega-16.com/feature_page.php?id=37&title=Sega's%20SVP%20Chip:%20The%20Road%20not%20Taken? + + +------------------------------------------------------------------------------- + 1. Overview +------------------------------------------------------------------------------- + +The only game released with SVP chip was Virtua Racing. There are at least 4 +versions of the game: USA, Jap and 2 different Eur revisions. Three of them +share identical SSP160x code, one of the Eur revisions has some differences. + +From the software developer's point of view, the game cartridge contains +at least: + + * Samsung SSP160x 16-bit DSP core, which includes [3]: + * Two independent high-speed RAM banks, accessed in single clock cycle, + 256 words each. + * 16 x 16 bit multiply unit. + * 32-bit ALU, status register. + * Hardware stack of 6 levels. + * 128KB of DRAM. + * 2KB of IRAM (instruction RAM). + * Memory controller with address mapping capability. + * 2MB of game ROM. + +[5] claims there is also "2 Channels PWM" in the cartridge, but it's either +not used or not there at all. +Various sources claim that SSP160x is SSP1601 which is likely to be true, +because the code doesn't seem to use any SSP1605+ features. + + +------------------------------------------------------------------------------- + 2. The SSP160x DSP +------------------------------------------------------------------------------- + +SSP160x is 16-bit DSP, capable of performing multiplication + addition in +single clock cycle [3]. It has 8 general, 8 external and 8 pointer registers. +There is a status register which has operation control bits and condition +flags. Condition flags are set/cleared during ALU (arithmetic, logic) +operations. It also has 6-level hardware stack and 2 internal RAM banks +RAM0 and RAM1, 256 words each. + +The device is only capable of addressing 16-bit words, so all addresses refer +to words (16bit value in ROM, accessed by 68k through address 0x84 would be +accessed by SSP160x using address 0x42). + +[3] mentions interrupt pins, but interrupts don't seem to be used by SVP code +(actually there are functions which look like interrupt handler routines, but +they don't seem to do anything important). + +2.1. General registers +---------------------- + +There are 8 general registers: -, X, Y, A, ST, STACK, PC and P ([2] [4]). +Size is given in bits. + +2.1.1. "-" + Constant register with all bits set (0xffff). Also used for programming + external registers (blind reads/writes, see 2.2). + size: 16 + +2.1.2. "X" + Generic register. Also acts as a multiplier 1 for P register. + size: 16 + +2.1.3. "Y" + Generic register. Also acts as a multiplier 2 for P register. + size: 16 + +2.1.4. "A" + Accumulator. Stores the result of all ALU (but not multiply) operations, + status register is updated according to this. When directly accessed, + only upper word is read/written. Low word can be accessed by using AL + (see 2.2.8). + size: 32 + +2.1.5. "ST" + STatus register. Bits 0-9 are CONTROL, other are FLAG [2]. Only some of + them are actually used by SVP. + Bits: fedc ba98 7654 3210 + 210 - RPL "Loop size". If non-zero, makes (rX+) and (rX-) respectively + modulo-increment and modulo-decrement (see 2.3). The value + shows which power of 2 to use, i.e. 4 means modulo by 16. + 43 - RB Unknown. Not used by SVP code. + 5 - ST5 Affects behavior of external registers. See 2.2. + 6 - ST6 Affects behavior of external registers. See 2.2. + According to [3] (5,6) bits correspond to hardware pins. + 7 - IE Interrupt enable? Not used by SVP code. + 8 - OP Saturated value? Not used by SVP code. + 9 - MACS MAC shift? Not used by SVP code. + a - GPI_0 Interrupt 0 enable/status? Not used by SVP code. + b - GPI_1 Interrupt 1 enable/status? Not used by SVP code. + c - L L flag. Similar to carry? Not used by SVP code. + d - Z Zero flag. Set after ALU operations, when all 32 accumulator + bits become zero. + e - OV Overflow flag. Not used by SVP code. + f - N Negative flag. Set after ALU operations, when bit31 in + accumulator is 1. + size: 16 + +2.1.6. "STACK" + Hardware stack of 6 levels [3]. Values are "pushed" by directly writing to + it, or by "call" instruction. "Pop" is performed by directly reading the + register or by "ret" instruction. + size: 16 + +2.1.7. "PC" + Program Counter. Can be written directly to perform a jump. It is not clear + if it is possible to read it (SVP code never does). + size: 16 + +2.1.8. "P" + multiply Product - multiplication result register. + Always contains 32-bit multiplication result of X, Y and 2 (P = X * Y * 2). + X and Y are sign-extended before performing the multiplication. + size: 32 + +2.2. External registers +----------------------- + +The external registers, as the name says, are external to SSP160x, they are +hooked to memory controller in SVP, so by accessing them we actually program +the memory controller. They act as programmable memory access registers or +external status registers [1]. Some of them can act as both, depending on how +ST5 ans ST6 bits are set in status register. After a register is programmed, +accessing it causes reads/writes from/to external memory (see section 3 for +the memory map). The access may also cause some additional effects, like +incremental of address, associated with accessed register. +In this document and my emu, instead of using names EXT0-EXT7 +from [4] I used different names for these registers. Those names are from +Tasco Deluxe's [1] doc. + +All these registers can be blind-accessed (as said in [1]) by performing +(ld -, PMx) or (ld PMx, -). This programs them to access memory (except PMC, +where the effect is different). +All registers are 16-bit. + +2.2.1. "PM0" + If ST5 or ST6 is set, acts as Programmable Memory access register + (see 2.2.7). Else it acts as status of XST (2.2.4). It is also mapped + to a15004 on 68k side: + ???????? ??????10 + 0: set, when SSP160x has written something to XST + (cleared when 015004 is read by 68k) + 1: set, when 68k has written something to a15000 or a15002 + (cleared on PM0 read by SSP160x) + Note that this is likely to be incorrect, but such behavior is OK for + emulation to work. + +2.2.2. "PM1" + Programmable Memory access register. Only accessed with ST bits set by + SVP code. + +2.2.3. "PM2" + Same as PM1. + +2.2.4. "XST" + If ST5 or ST6 is set, acts as Programmable Memory access register + (only used by memory test code). Else it acts as eXternal STatus + register, which is also mapped to a15000 and a15002 on 68k side. + Affects PM0 when written to. + +2.2.5. "PM4" + Programmable Memory access register. Not affected by ST5 and ST6 bits, + always stays in PMAR mode. + +2.2.6. "EXT5" + Not used by SVP, so not covered by this document. + +2.2.7. "PMC" + Programmable Memory access Control. It is set using 2 16bit writes, first + address, then mode word. After setting PMAC, PMx should be blind accessed + using (ld -, PMx) or (ld PMx, -) to program it for reading or writing + external memory respectively. Every PMx register can be programmed to + access it's own memory location with it's own mode. Registers are programmed + separately for reading and writing. + + Reading PMC register also shifts it's state (from "waiting for address" to + "waiting for mode" and back). Reads always return address word related to + last PMx register accessed, or last address word written to PMC (whichever + event happened last before PMC read). + + The address word contains bits 0-15 of the memory word-address. + The mode word format is as follows: + dsnnnv?? ???aaaaa + a: bits 16-20 of memory word-address. + n: auto-increment value. If set, after every access of PMx, word-address + value related to it will be incremented by (words): + 1 - 1 5 - 16 + 2 - 2 6 - 32 + 3 - 4 7 - 128 + 4 - 8 + d: make auto-increment negative - decrement by count listed above. + s: special-increment mode. If current address is even (when accessing + programmed PMx), increment it by 1. Else, increment by 32. It is not + clear what happens if d and n bits are also set (never done by SVP). + v: over-write mode when writing, unknown when reading (not used). + Over-write mode splits the word being written into 4 half-bytes and + only writes those half-bytes, which are not zero. + When auto-increment is performed, it affects all 21 address bits. + +2.2.8. "AL" + This register acts more like a general register. + If this register is blind-accessed, it is "dummy programmed", i.e. nothing + happens and PMC is reset to "waiting for address" state. + In all other cases, it is Accumulator Low, 16 least significant bits of + accumulator. Normally reading acc (ld X, A) you get 16 most significant + bits, so this allows you access the low word of 32bit accumulator. + +2.3. Pointer registers +---------------------- + +There are 8 8-bit pointer registers rX, which are internal to SSP160x and are +used to access internal RAM banks RAM0 and RAM1, or program memory indirectly. +r0-r3 (ri) point to RAM0, r4-r7 (rj) point to RAM1. Each bank has 256 words of +RAM, so 8bit registers can fully address them. The registers can be accessed +directly, or 2 indirection levels can be used [ (rX), ((rX)) ]. They work +similar to * and ** operators in C, only they use different types of memory +and ((rX)) also performs post-increment. First indirection level (rX) accesses +a word in RAMx, second accesses program memory at address read from (rX), and +increments value in (rX). + +Only r0,r1,r2,r4,r5,r6 can be directly modified (ldi r0, 5), or by using +modifiers. 3 modifiers can be applied when using first indirection level +(optional): + + : post-increment (ld a, (r0+) ). Increment register value after operation. + Can be made modulo-increment by setting RPL bits in status register + (see 2.1.5). + - : post-decrement. Also can be made modulo-decrement by using RPL bits in ST. + +!: post-increment, unaffected by RPL (probably). +These are only used on 1st indirection level, so things like ( ld a, ((r0+)) ) +and (ld X, r6-) are probably invalid. + +r3 and r7 are special and can not be changed (at least Samsung samples [4] and +SVP code never do). They are fixed to the start of their RAM banks. (They are +probably changeable for ssp1605+, Samsung's old DSP page claims that). +1 of these 4 modifiers must be used on these registers (short form direct +addressing? [2]): + |00: RAMx[0] The very first word in the RAM bank. + |01: RAMx[1] Second word + |10: RAMx[2] ... + |11: RAMx[3] + +2.4. The instruction set +------------------------ + +The Samsung SSP16 series assembler uses right-to-left notation ([2] [4]): +ld X, Y +means value from Y should be copied to X. + +Size of every instruction is word, some have extension words for immediate +values. When writing an interpreter, 7 most significant bits are usually +enough to determine which opcode it is. + +encoding bits are marked as: +rrrr - general or external register, in order specified in 2.1 and 2.2 + (0 is '-', 1 'X', ..., 8 is 'PM0', ..., 0xf is 'AL') +dddd - same as above, as destination operand +ssss - same as above, as source operand +jpp - pointer register index, 0-7 +j - specifies RAM bank, i.e. RAM0 or RAM1 +i* - immediate value bits +a* - offset in internal RAM bank +mm - modifier for pointer register, depending on register: + r0-r2,r4-r6 r3,r7 examples + 0: (none) |00 ld a, (r0) cmp a, (r7|00) + 1: +! |01 ld (r0+!), a ld (r7|01), a + 2: - |10 add a, (r0-) + 3: + |11 +cccc - encodes condition, only 3 used by SVP, see check_cond() below +ooo - operation to perform + +Operation is written in C-style pseudo-code, where: +program_memory[X] - access program memory at address X +RAMj[X] - access internal RAM bank j=0,1 (RAM0 or RAM1), word + offset X +RIJ[X] - pointer register rX, X=0-7 +pr_modif_read(m,X) - read pointer register rX, applying modifier m: + if register is r3 or r7, return value m + else switch on value m: + 0: return rX; + 1: tmp = rX; rX++; return tmp; // rX+! + 2: tmp = rX; modulo_decrement(rX); return tmp; // rX- + 3: tmp = rX; modulo_increment(rX); return tmp; // rX+ + the modulo value used (if used at all) depends on ST + RPL bits (see 2.1.5) +check_cond(c,f) - checks if a flag matches f bit: + switch (c) { + case 0: return true; + case 5: return (Z == f) ? true : false; // check Z flag + case 7: return (N == f) ? true : false; // check N flag + } // other conditions are possible, but they are not used +update_flags() - update ST flags according to last ALU operation. +sign_extend(X) - sign extend 16bit value X to 32bits. +next_op_address() - address of instruction after current instruction. + +2.4.1. ALU instructions + +All of these instructions update flags, which are set according to full 32bit +accumulator. The SVP code only checks N and Z flags, so it is not known when +exactly OV and L flags are set. Operations are performed on full A, so +(andi A, 0) would clear all 32 bits of A. + +They share the same addressing modes. The exact arithmetic operation is +determined by 3 most significant (ooo) bits: + 001 - sub - subtract (OP -=) + 011 - cmp - compare (OP -, flags are updated according to result) + 100 - add - add (OP +=) + 101 - and - binary AND (OP &=) + 110 - or - binary OR (OP |=) + 111 - eor - exclusive OR (OP ^=) + + syntax encoding operation + OP A, s ooo0 0000 0000 rrrr A OP r << 16; + OP A, (ri) ooo0 001j 0000 mmpp A OP RAMj[pr_modif_read(m,jpp)] << 16; + OP A, adr ooo0 011j aaaa aaaa A OP RAMj[a] << 16; + OPi A, imm ooo0 1000 0000 0000 A OP i << 16; + iiii iiii iiii iiii + op A, ((ri)) ooo0 101j 0000 mmpp tmp = pr_modif_read(m,jpp); + A OP program_memory[RAMj[tmp]] << 16; + RAMj[tmp]++; + op A, ri ooo1 001j 0000 00pp A OP RIJ[jpp] << 16; + OPi simm ooo1 1000 iiii iiii A OP i << 16; + +There is also "perform operation on accumulator" instruction: + + syntax encoding operation + mod cond, op 1001 000f cccc 0ooo if (check_cond(c,f)) switch(o) { + case 2: A >>= 1; break; // arithmetic shift + case 3: A <<= 1; break; + case 6: A = -A; break; // negate A + case 7: A = abs(A); break; // absolute val. + } // other operations are possible, but + // they are not used by SVP. + +2.4.2. Load (move) instructions + +These instructions never affect flags (even ld A). +If destination is A, and source is 16bit, only upper word is transfered (same +thing happens on opposite). If dest. is A, and source is P, whole 32bit value +is transfered. It is not clear if P can be destination operand (probably not, +no code ever does this). +Writing to STACK pushes a value there, reading pops. It is not known what +happens on overflow/underflow (never happens in SVP code). +ld -, - is used as a nop. + + syntax encoding operation + ld d, s 0000 0000 dddd ssss d = s; + ld d, (ri) 0000 001j dddd mmpp d = RAMj[pr_modif_read(m,jpp)]; + ld (ri), s 0000 010j ssss mmpp RAMj[pr_modif_read(m,jpp)] = s; + ldi d, imm 0000 1000 dddd 0000 d = i; + iiii iiii iiii iiii + ld d, ((ri)) 0000 101j dddd mmpp tmp = pr_modif_read(m,jpp); + d = program_memory[RAMj[tmp]]; + RAMj[tmp]++; + ldi (ri), imm 0000 110l 0000 mmpp RAMj[pr_modif_read(m,jpp)] = i; + iiii iiii iiii iiii + ld adr, a 0000 111j aaaa aaaa RAMj[a] = A; + ld d, ri 0001 001j dddd 00pp d = RIJ[jpp]; + ld ri, s 0001 010j ssss 00pp RIJ[jpp] = s; + ldi ri, simm 0001 1jpp iiii iiii RIJ[jpp] = i; + ld d, (a) 0100 1010 dddd 0000 d = program_memory[A[31:16]]; + // read a word from program memory. Offset + // is the upper word in A. + +2.4.3. Program control instructions + +Only 3 instructions: call, ret (alias of ld PC, STACK) and branch. Indirect +jumps can be performed by simply writing to PC. + + syntax encoding operation + call cond, addr 0100 100f cccc 0000 if (check_cond(c,f)) { + aaaa aaaa aaaa aaaa STACK = next_op_address(); PC = a; + } + bra cond, addr 0100 110f cccc 0000 if (check_cond(c,f)) PC = a; + aaaa aaaa aaaa aaaa + ret 0000 0000 0110 0101 PC = STACK; // same as ld PC, STACK + +2.4.4. Multiply-accumulate instructions + +Not sure if (ri) and (rj) really get loaded into X and Y, but multiplication +result surely is loaded into P. There is probably optional 3rd operand (1, 0; +encoded by bit16, default 1), but it's not used by SVP code. + + syntax encoding operation + mld (rj), (ri) 1011 0111 nnjj mmii A = 0; update_flags(); + X = RAM0[pr_modif_read(m,0ii)]; + Y = RAM1[pr_modif_read(m,1jj)]; + P = sign_extend(X) * sign_extend(Y) * 2 + mpya (rj), (ri) 1001 0111 nnjj mmii A += P; update_flags(); + X = RAM0[pr_modif_read(m,0ii)]; + Y = RAM1[pr_modif_read(m,1jj)]; + P = sign_extend(X) * sign_extend(Y) * 2 + mpys (rj), (ri) 0011 0111 nnjj mmii A -= P; update_flags(); + X = RAM0[pr_modif_read(m,0ii)]; + Y = RAM1[pr_modif_read(m,1jj)]; + P = sign_extend(X) * sign_extend(Y) * 2 + +------------------------------------------------------------------------------- + 3. Memory map +------------------------------------------------------------------------------- + +The SSp160x can access it's own program memory, and external memory through EXT +registers (see 2.2). Program memory is read-execute-only, the size of this +space is 64K words (this is how much 16bit PC can address): + + byte address word address name + 0- 7ff 0- 3ff IRAM + 800-1ffff 400-ffff ROM + +There were reports that SVP has internal ROM, but fortunately they were wrong. +The location 800-1ffff is mapped from the same location in the 2MB game ROM. +The IRAM is read-only (as SSP160x doesn't have any means of writing to it's +program memory), but it can be changed through external memory space, as it's +also mapped there. + +The external memory space seems to match the one visible by 68k, with some +differences: + + 68k space SVP space word address name + 0-1fffff 0-1fffff 0- fffff game ROM + 300000-31ffff 300000-31ffff 180000-18ffff DRAM + ? 390000-3907ff 1c8000-1c83ff IRAM + 390000-39ffff ? ? "cell arrange" 1 + 3a0000-3affff ? ? "cell arrange" 2 + a15000-a15009 n/a n/a Status/control registers + +The external memory can be read/written by SSP160x (except game ROM, which can +only be read). + +"cell arrange" 1 and 2 are similar to the one used in SegaCD, they map +300000-30ffff location to 390000-39ffff and 3a0000-3affff, where linear image +written to 300000 can be read as VDP patterns at 390000. Virtua Racing doesn't +seem to use this feature, it is only used by memory test code. + +Here is the list of status/control registers (16bit size): + a15000 - w/r command/result register. Visible as XST for SSP160x (2.2.4). + a15002 - mirror of the above. + a15004 - status of command/result register (see 2.2.1). + a15006 - possibly halts the SVP. Before doing DMA from DRAM, 68k code writes + 0xa, and after it's finished, writes 0. This is probably done to + prevent SVP accessing DRAM and avoid bus clashes. + a15008 - possibly causes an interrupt. There is (unused?) code which writes + 0, 1, and again 0 in sequence. + + +------------------------------------------------------------------------------- + 4. Other notes +------------------------------------------------------------------------------- + +The game has arcade-style memory self-check mode, which can be accessed by +pressing _all_ buttons (including directions) on 3-button controller. There was +probably some loopback plug for this. + +SVP seems to have DMA latency issue similar to one in Sega CD, as the code +always sets DMA source address value larger by 2, then intended for copy. +This is even true for DMAs from ROM, as it's probably hooked through SVP's +memory controller. + +The entry point for the code seems to be at address 0x800 (word 0x400) in ROM, +but it is not clear where the address is fetched from when the system powers +up. The memory test code also sets up "ld PC, .." opcodes at 0x7f4, 0x7f8 and +0x7fc, which jump to some routines, possibly interrupt handlers. This means +that mentioned addresses might be built-in interrupt vectors. + +The SVP code doesn't seem to be timing sensitive, so it can be emulated without +knowing timing of the instructions or even how fast the chip is clocked. +Overclocking doesn't have any effect, underclocking causes slowdowns. Running +10-12M instructions/sec (or possibly less) is sufficient. + diff --git a/source/cpu/cpuintrf.h b/source/cpu/cpuintrf.h index 148cad4..0c52e5f 100644 --- a/source/cpu/cpuintrf.h +++ b/source/cpu/cpuintrf.h @@ -1,30 +1,59 @@ - -#ifndef CPUINTRF_H -#define CPUINTRF_H - -#include "osd_cpu.h" - -#define CPU_16BIT_PORT 0x4000 -#define CPU_FLAGS_MASK 0xff00 -#define CLEAR_LINE 0 -#define ASSERT_LINE 1 -#define REG_PREVIOUSPC -1 -#define REG_SP_CONTENTS -2 - -/* daisy-chain link */ -typedef struct { - void (*reset)(int); /* reset callback */ - int (*interrupt_entry)(int); /* entry callback */ - void (*interrupt_reti)(int); /* reti callback */ - int irq_param; /* callback paramater */ -} Z80_DaisyChain; - -#define Z80_MAXDAISY 4 /* maximum of daisy chan device */ - -#define Z80_INT_REQ 0x01 /* interrupt request mask */ -#define Z80_INT_IEO 0x02 /* interrupt disable mask(IEO) */ - -#define Z80_VECTOR(device,state) (((device)<<8)|(state)) - - -#endif /* CPUINTRF_H */ + +#ifndef CPUINTRF_H +#define CPUINTRF_H + +#include "osd_cpu.h" + +/* Interrupt line constants */ +enum +{ + /* line states */ + CLEAR_LINE = 0, /* clear (a fired, held or pulsed) line */ + ASSERT_LINE, /* assert an interrupt immediately */ + HOLD_LINE, /* hold interrupt line until acknowledged */ + PULSE_LINE, /* pulse interrupt line for one instruction */ + + /* internal flags (not for use by drivers!) */ + INTERNAL_CLEAR_LINE = 100 + CLEAR_LINE, + INTERNAL_ASSERT_LINE = 100 + ASSERT_LINE, + + /* input lines */ + MAX_INPUT_LINES = 32+3, + INPUT_LINE_IRQ0 = 0, + INPUT_LINE_IRQ1 = 1, + INPUT_LINE_IRQ2 = 2, + INPUT_LINE_IRQ3 = 3, + INPUT_LINE_IRQ4 = 4, + INPUT_LINE_IRQ5 = 5, + INPUT_LINE_IRQ6 = 6, + INPUT_LINE_IRQ7 = 7, + INPUT_LINE_IRQ8 = 8, + INPUT_LINE_IRQ9 = 9, + INPUT_LINE_NMI = MAX_INPUT_LINES - 3, + + /* special input lines that are implemented in the core */ + INPUT_LINE_RESET = MAX_INPUT_LINES - 2, + INPUT_LINE_HALT = MAX_INPUT_LINES - 1, + + /* output lines */ + MAX_OUTPUT_LINES = 32 +}; + + +/* daisy-chain link */ +typedef struct { + void (*reset)(int); /* reset callback */ + int (*interrupt_entry)(int); /* entry callback */ + void (*interrupt_reti)(int); /* reti callback */ + int irq_param; /* callback paramater */ +} Z80_DaisyChain; + +#define Z80_MAXDAISY 4 /* maximum of daisy chan device */ + +#define Z80_INT_REQ 0x01 /* interrupt request mask */ +#define Z80_INT_IEO 0x02 /* interrupt disable mask(IEO) */ + +#define Z80_VECTOR(device,state) (((device)<<8)|(state)) + + +#endif /* CPUINTRF_H */ diff --git a/source/cpu/osd_cpu.h b/source/cpu/osd_cpu.h index 2c5edc2..e6a813b 100644 --- a/source/cpu/osd_cpu.h +++ b/source/cpu/osd_cpu.h @@ -1,77 +1,91 @@ -/******************************************************************************* -* * -* Define size independent data types and operations. * -* * -* The following types must be supported by all platforms: * -* * -* UINT8 - Unsigned 8-bit Integer INT8 - Signed 8-bit integer * -* UINT16 - Unsigned 16-bit Integer INT16 - Signed 16-bit integer * -* UINT32 - Unsigned 32-bit Integer INT32 - Signed 32-bit integer * -* UINT64 - Unsigned 64-bit Integer INT64 - Signed 64-bit integer * -* * -* * -* The macro names for the artithmatic operations are composed as follows: * -* * -* XXX_R_A_B, where XXX - 3 letter operation code (ADD, SUB, etc.) * -* R - The type of the result * -* A - The type of operand 1 * -* B - The type of operand 2 (if binary operation) * -* * -* Each type is one of: U8,8,U16,16,U32,32,U64,64 * -* * -*******************************************************************************/ - - -#ifndef OSD_CPU_H -#define OSD_CPU_H - -typedef unsigned char UINT8; -typedef unsigned short UINT16; -typedef unsigned int UINT32; -__extension__ typedef unsigned long long UINT64; -typedef signed char INT8; -typedef signed short INT16; -typedef signed int INT32; -__extension__ typedef signed long long INT64; - -/* Combine two 32-bit integers into a 64-bit integer */ -#define COMBINE_64_32_32(A,B) ((((UINT64)(A))<<32) | (UINT32)(B)) -#define COMBINE_U64_U32_U32(A,B) COMBINE_64_32_32(A,B) - -/* Return upper 32 bits of a 64-bit integer */ -#define HI32_32_64(A) (((UINT64)(A)) >> 32) -#define HI32_U32_U64(A) HI32_32_64(A) - -/* Return lower 32 bits of a 64-bit integer */ -#define LO32_32_64(A) ((A) & 0xffffffff) -#define LO32_U32_U64(A) LO32_32_64(A) - -#define DIV_64_64_32(A,B) ((A)/(B)) -#define DIV_U64_U64_U32(A,B) ((A)/(UINT32)(B)) - -#define MOD_32_64_32(A,B) ((A)%(B)) -#define MOD_U32_U64_U32(A,B) ((A)%(UINT32)(B)) - -#define MUL_64_32_32(A,B) ((A)*(INT64)(B)) -#define MUL_U64_U32_U32(A,B) ((A)*(UINT64)(UINT32)(B)) - - -/****************************************************************************** - * Union of UINT8, UINT16 and UINT32 in native endianess of the target - * This is used to access bytes and words in a machine independent manner. - * The upper bytes h2 and h3 normally contain zero (16 bit CPU cores) - * thus PAIR.d can be used to pass arguments to the memory system - * which expects 'int' really. - ******************************************************************************/ -typedef union { -#ifdef LSB_FIRST - struct { UINT8 l,h,h2,h3; } b; - struct { UINT16 l,h; } w; -#else - struct { UINT8 h3,h2,h,l; } b; - struct { UINT16 h,l; } w; -#endif - UINT32 d; -} PAIR; - -#endif /* defined OSD_CPU_H */ +/******************************************************************************* +* * +* Define size independent data types and operations. * +* * +* The following types must be supported by all platforms: * +* * +* UINT8 - Unsigned 8-bit Integer INT8 - Signed 8-bit integer * +* UINT16 - Unsigned 16-bit Integer INT16 - Signed 16-bit integer * +* UINT32 - Unsigned 32-bit Integer INT32 - Signed 32-bit integer * +* UINT64 - Unsigned 64-bit Integer INT64 - Signed 64-bit integer * +* * +* * +* The macro names for the artithmatic operations are composed as follows: * +* * +* XXX_R_A_B, where XXX - 3 letter operation code (ADD, SUB, etc.) * +* R - The type of the result * +* A - The type of operand 1 * +* B - The type of operand 2 (if binary operation) * +* * +* Each type is one of: U8,8,U16,16,U32,32,U64,64 * +* * +*******************************************************************************/ + + +#ifndef OSD_CPU_H +#define OSD_CPU_H + +#ifndef NGC +#ifndef DOS +#include "basetsd.h" +#endif +#undef TRUE +#undef FALSE +#define TRUE 1 +#define FALSE 0 +#endif + +typedef unsigned char UINT8; +typedef unsigned short UINT16; +//#ifdef DOS +typedef unsigned int UINT32; +__extension__ typedef unsigned long long UINT64; +//#endif +typedef signed char INT8; +typedef signed short INT16; +//#ifdef DOS +typedef signed int INT32; +__extension__ typedef signed long long INT64; +//#endif + +/* Combine two 32-bit integers into a 64-bit integer */ +#define COMBINE_64_32_32(A,B) ((((UINT64)(A))<<32) | (UINT32)(B)) +#define COMBINE_U64_U32_U32(A,B) COMBINE_64_32_32(A,B) + +/* Return upper 32 bits of a 64-bit integer */ +#define HI32_32_64(A) (((UINT64)(A)) >> 32) +#define HI32_U32_U64(A) HI32_32_64(A) + +/* Return lower 32 bits of a 64-bit integer */ +#define LO32_32_64(A) ((A) & 0xffffffff) +#define LO32_U32_U64(A) LO32_32_64(A) + +#define DIV_64_64_32(A,B) ((A)/(B)) +#define DIV_U64_U64_U32(A,B) ((A)/(UINT32)(B)) + +#define MOD_32_64_32(A,B) ((A)%(B)) +#define MOD_U32_U64_U32(A,B) ((A)%(UINT32)(B)) + +#define MUL_64_32_32(A,B) ((A)*(INT64)(B)) +#define MUL_U64_U32_U32(A,B) ((A)*(UINT64)(UINT32)(B)) + + +/****************************************************************************** + * Union of UINT8, UINT16 and UINT32 in native endianess of the target + * This is used to access bytes and words in a machine independent manner. + * The upper bytes h2 and h3 normally contain zero (16 bit CPU cores) + * thus PAIR.d can be used to pass arguments to the memory system + * which expects 'int' really. + ******************************************************************************/ +typedef union { +#ifdef LSB_FIRST + struct { UINT8 l,h,h2,h3; } b; + struct { UINT16 l,h; } w; +#else + struct { UINT8 h3,h2,h,l; } b; + struct { UINT16 h,l; } w; +#endif + UINT32 d; +} PAIR; + +#endif /* defined OSD_CPU_H */ diff --git a/source/cpu/z80.c b/source/cpu/z80.c index c657bf0..4ef8058 100644 --- a/source/cpu/z80.c +++ b/source/cpu/z80.c @@ -1,4511 +1,3589 @@ -/***************************************************************************** - * - * z80.c - * Portable Z80 emulator V2.8 - * - * Copyright (C) 1998,1999,2000 Juergen Buchmueller, all rights reserved. - * - * - This source code is released as freeware for non-commercial purposes. - * - You are free to use and redistribute this code in modified or - * unmodified form, provided you list me in the credits. - * - If you modify this source code, you must add a notice to each modified - * source file that it has been changed. If you're a nice person, you - * will clearly mark each change too. :) - * - If you wish to use this for commercial purposes, please contact me at - * pullmoll@t-online.de - * - The author of this copywritten work reserves the right to change the - * terms of its usage and license at any time, including retroactively - * - This entire notice must remain in the source code. - * - * Changes in 3.2 - * - Fixed undocumented flags XF & YF of RRCA, and CF and HF of - * INI/IND/OUTI/OUTD/INIR/INDR/OTIR/OTDR [Sean Young] - * Changes in 3.1 - * - removed the REPEAT_AT_ONCE execution of LDIR/CPIR etc. opcodes - * for readabilities sake and because the implementation was buggy - * (and I was not able to find the difference) - * Changes in 3.0 - * - 'finished' switch to dynamically overrideable cycle count tables - * Changes in 2.9: - * - added methods to access and override the cycle count tables - * - fixed handling and timing of multiple DD/FD prefixed opcodes - * Changes in 2.8: - * - OUTI/OUTD/OTIR/OTDR also pre-decrement the B register now. - * This was wrong because of a bug fix on the wrong side - * (astrocade sound driver). - * Changes in 2.7: - * - removed z80_vm specific code, it's not needed (and never was). - * Changes in 2.6: - * - BUSY_LOOP_HACKS needed to call change_pc16() earlier, before - * checking the opcodes at the new address, because otherwise they - * might access the old (wrong or even NULL) banked memory region. - * Thanks to Sean Young for finding this nasty bug. - * Changes in 2.5: - * - Burning cycles always adjusts the ICount by a multiple of 4. - * - In REPEAT_AT_ONCE cases the R register wasn't incremented twice - * per repetition as it should have been. Those repeated opcodes - * could also underflow the ICount. - * - Simplified TIME_LOOP_HACKS for BC and added two more for DE + HL - * timing loops. I think those hacks weren't endian safe before too. - * Changes in 2.4: - * - z80_reset zaps the entire context, sets IX and IY to 0xffff(!) and - * sets the Z flag. With these changes the Tehkan World Cup driver - * _seems_ to work again. - * Changes in 2.3: - * - External termination of the execution loop calls z80_burn() and - * z80_vm_burn() to burn an amount of cycles (R adjustment) - * - Shortcuts which burn CPU cycles (BUSY_LOOP_HACKS and TIME_LOOP_HACKS) - * now also adjust the R register depending on the skipped opcodes. - * Changes in 2.2: - * - Fixed bugs in CPL, SCF and CCF instructions flag handling. - * - Changed variable EA and ARG16() function to UINT32; this - * produces slightly more efficient code. - * - The DD/FD XY CB opcodes where XY is 40-7F and Y is not 6/E - * are changed to calls to the X6/XE opcodes to reduce object size. - * They're hardly ever used so this should not yield a speed penalty. - * New in 2.0: - * - Optional more exact Z80 emulation (#define Z80_EXACT 1) according - * to a detailed description by Sean Young which can be found at: - * http://www.msxnet.org/tech/Z80/z80undoc.txt - *****************************************************************************/ - - -#include "shared.h" -#include "cpuintrf.h" -#include "z80.h" - -#define cpu_readop cpu_readmem16 -#define cpu_readop_arg cpu_readmem16 - -#define VERBOSE 0 - -#if VERBOSE -#define LOG(x) logerror x -#else -#define LOG(x) -#endif - -/* execute main opcodes inside a big switch statement */ -#ifndef BIG_SWITCH -#define BIG_SWITCH 1 -#endif - -/* big flags array for ADD/ADC/SUB/SBC/CP results */ -#define BIG_FLAGS_ARRAY 1 - -/* Set to 1 for a more exact (but somewhat slower) Z80 emulation */ -#define Z80_EXACT 1 - -/* on JP and JR opcodes check for tight loops */ -#define BUSY_LOOP_HACKS 1 - -/* check for delay loops counting down BC */ -#define TIME_LOOP_HACKS 1 - -#ifdef X86_ASM -#undef BIG_FLAGS_ARRAY -#define BIG_FLAGS_ARRAY 0 -#endif - -#if 0 -static UINT8 z80_reg_layout[] = { - Z80_PC, Z80_SP, Z80_AF, Z80_BC, Z80_DE, Z80_HL, -1, - Z80_IX, Z80_IY, Z80_AF2,Z80_BC2,Z80_DE2,Z80_HL2,-1, - Z80_R, Z80_I, Z80_IM, Z80_IFF1,Z80_IFF2, -1, - Z80_NMI_STATE,Z80_IRQ_STATE,Z80_DC0,Z80_DC1,Z80_DC2,Z80_DC3, 0 -}; - -static UINT8 z80_win_layout[] = { - 27, 0,53, 4, /* register window (top rows) */ - 0, 0,26,22, /* disassembler window (left colums) */ - 27, 5,53, 8, /* memory #1 window (right, upper middle) */ - 27,14,53, 8, /* memory #2 window (right, lower middle) */ - 0,23,80, 1, /* command line window (bottom rows) */ -}; -#endif - -/****************************************************************************/ -/* The Z80 registers. HALT is set to 1 when the CPU is halted, the refresh */ -/* register is calculated as follows: refresh=(Regs.R&127)|(Regs.R2&128) */ -/****************************************************************************/ -typedef struct { -/* 00 */ PAIR PREPC,PC,SP,AF,BC,DE,HL,IX,IY; -/* 24 */ PAIR AF2,BC2,DE2,HL2; -/* 34 */ UINT8 R,R2,IFF1,IFF2,HALT,IM,I; -/* 3B */ UINT8 irq_max; /* number of daisy chain devices */ -/* 3C */ INT8 request_irq; /* daisy chain next request device */ -/* 3D */ INT8 service_irq; /* daisy chain next reti handling device */ -/* 3E */ UINT8 nmi_state; /* nmi line state */ -/* 3F */ UINT8 irq_state; /* irq line state */ -/* 40 */ UINT8 int_state[Z80_MAXDAISY]; -/* 44 */ Z80_DaisyChain irq[Z80_MAXDAISY]; -/* 84 */ int (*irq_callback)(int irqline); -/* 88 */ int extra_cycles; /* extra cycles for interrupts */ -} Z80_Regs; - -#define CF 0x01 -#define NF 0x02 -#define PF 0x04 -#define VF PF -#define XF 0x08 -#define HF 0x10 -#define YF 0x20 -#define ZF 0x40 -#define SF 0x80 - -#define INT_IRQ 0x01 -#define NMI_IRQ 0x02 - -#define _PPC Z80.PREPC.d /* previous program counter */ - -#define _PCD Z80.PC.d -#define _PC Z80.PC.w.l - -#define _SPD Z80.SP.d -#define _SP Z80.SP.w.l - -#define _AFD Z80.AF.d -#define _AF Z80.AF.w.l -#define _A Z80.AF.b.h -#define _F Z80.AF.b.l - -#define _BCD Z80.BC.d -#define _BC Z80.BC.w.l -#define _B Z80.BC.b.h -#define _C Z80.BC.b.l - -#define _DED Z80.DE.d -#define _DE Z80.DE.w.l -#define _D Z80.DE.b.h -#define _E Z80.DE.b.l - -#define _HLD Z80.HL.d -#define _HL Z80.HL.w.l -#define _H Z80.HL.b.h -#define _L Z80.HL.b.l - -#define _IXD Z80.IX.d -#define _IX Z80.IX.w.l -#define _HX Z80.IX.b.h -#define _LX Z80.IX.b.l - -#define _IYD Z80.IY.d -#define _IY Z80.IY.w.l -#define _HY Z80.IY.b.h -#define _LY Z80.IY.b.l - -#define _I Z80.I -#define _R Z80.R -#define _R2 Z80.R2 -#define _IM Z80.IM -#define _IFF1 Z80.IFF1 -#define _IFF2 Z80.IFF2 -#define _HALT Z80.HALT - -int z80_ICount; -static Z80_Regs Z80; -static UINT32 EA; -static int after_EI = 0; - -static UINT8 SZ[256]; /* zero and sign flags */ -static UINT8 SZ_BIT[256]; /* zero, sign and parity/overflow (=zero) flags for BIT opcode */ -static UINT8 SZP[256]; /* zero, sign and parity flags */ -static UINT8 SZHV_inc[256]; /* zero, sign, half carry and overflow flags INC r8 */ -static UINT8 SZHV_dec[256]; /* zero, sign, half carry and overflow flags DEC r8 */ - -#include "z80daa.h" - -#if BIG_FLAGS_ARRAY -#include -static UINT8 *SZHVC_add = 0; -static UINT8 *SZHVC_sub = 0; -#endif - -#if Z80_EXACT -/* tmp1 value for ini/inir/outi/otir for [C.1-0][io.1-0] */ -static UINT8 irep_tmp1[4][4] = { - {0,0,1,0},{0,1,0,1},{1,0,1,1},{0,1,1,0} -}; - -/* tmp1 value for ind/indr/outd/otdr for [C.1-0][io.1-0] */ -static UINT8 drep_tmp1[4][4] = { - {0,1,0,0},{1,0,0,1},{0,0,1,0},{0,1,0,1} -}; - -/* tmp2 value for all in/out repeated opcodes for B.7-0 */ -static UINT8 breg_tmp2[256] = { - 0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1, - 0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0, - 1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0, - 1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1, - 0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0, - 1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1, - 0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1, - 0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0, - 1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0, - 1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1, - 0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1, - 0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0, - 1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1, - 0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0, - 1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0, - 1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1 -}; -#endif - -static UINT8 cc_op[0x100] = { - 4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4, - 8,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4, - 7,10,16, 6, 4, 4, 7, 4, 7,11,16, 6, 4, 4, 7, 4, - 7,10,13, 6,11,11,10, 4, 7,11,13, 6, 4, 4, 7, 4, - 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, - 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, - 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, - 7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4, - 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, - 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, - 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, - 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, - 5,10,10,10,10,11, 7,11, 5,10,10, 0,10,17, 7,11, - 5,10,10,11,10,11, 7,11, 5, 4,10,11,10, 0, 7,11, - 5,10,10,19,10,11, 7,11, 5, 4,10, 4,10, 0, 7,11, - 5,10,10, 4,10,11, 7,11, 5, 6,10, 4,10, 0, 7,11}; - -static UINT8 cc_cb[0x100] = { - 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, - 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, - 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, - 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, - 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8, - 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8, - 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8, - 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8, - 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, - 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, - 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, - 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, - 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, - 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, - 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, - 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8}; - -static UINT8 cc_ed[0x100] = { - 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, -12,12,15,20, 8, 8, 8, 9,12,12,15,20, 8, 8, 8, 9, -12,12,15,20, 8, 8, 8, 9,12,12,15,20, 8, 8, 8, 9, -12,12,15,20, 8, 8, 8,18,12,12,15,20, 8, 8, 8,18, -12,12,15,20, 8, 8, 8, 8,12,12,15,20, 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, -16,16,16,16, 8, 8, 8, 8,16,16,16,16, 8, 8, 8, 8, -16,16,16,16, 8, 8, 8, 8,16,16,16,16, 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}; - -static UINT8 cc_xy[0x100] = { - 4, 4, 4, 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4, - 4,14,20,10, 9, 9, 9, 4, 4,15,20,10, 9, 9, 9, 4, - 4, 4, 4, 4,23,23,19, 4, 4,15, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4, - 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4, - 9, 9, 9, 9, 9, 9,19, 9, 9, 9, 9, 9, 9, 9,19, 9, -19,19,19,19,19,19, 4,19, 4, 4, 4, 4, 9, 9,19, 4, - 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4, - 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4, - 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4, - 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4,14, 4,23, 4,15, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4,10, 4, 4, 4, 4, 4, 4}; - -static UINT8 cc_xycb[0x100] = { -23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, -23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23}; - -/* extra cycles if jr/jp/call taken and 'interrupt latency' on rst 0-7 */ -static UINT8 cc_ex[0x100] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* DJNZ */ - 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* JR NZ/JR Z */ - 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* JR NC/JR C */ - 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, 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, - 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, /* LDIR/CPIR/INIR/OTIR LDDR/CPDR/INDR/OTDR */ - 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2, - 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2, - 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2, - 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2}; - -static UINT8 *cc[6] = { cc_op, cc_cb, cc_ed, cc_xy, cc_xycb, cc_ex }; -#define Z80_TABLE_dd Z80_TABLE_xy -#define Z80_TABLE_fd Z80_TABLE_xy - -static void take_interrupt(void); - -#define PROTOTYPES(tablename,prefix) \ - static __inline__ void prefix##_00(void); static __inline__ void prefix##_01(void); static __inline__ void prefix##_02(void); static __inline__ void prefix##_03(void); \ - static __inline__ void prefix##_04(void); static __inline__ void prefix##_05(void); static __inline__ void prefix##_06(void); static __inline__ void prefix##_07(void); \ - static __inline__ void prefix##_08(void); static __inline__ void prefix##_09(void); static __inline__ void prefix##_0a(void); static __inline__ void prefix##_0b(void); \ - static __inline__ void prefix##_0c(void); static __inline__ void prefix##_0d(void); static __inline__ void prefix##_0e(void); static __inline__ void prefix##_0f(void); \ - static __inline__ void prefix##_10(void); static __inline__ void prefix##_11(void); static __inline__ void prefix##_12(void); static __inline__ void prefix##_13(void); \ - static __inline__ void prefix##_14(void); static __inline__ void prefix##_15(void); static __inline__ void prefix##_16(void); static __inline__ void prefix##_17(void); \ - static __inline__ void prefix##_18(void); static __inline__ void prefix##_19(void); static __inline__ void prefix##_1a(void); static __inline__ void prefix##_1b(void); \ - static __inline__ void prefix##_1c(void); static __inline__ void prefix##_1d(void); static __inline__ void prefix##_1e(void); static __inline__ void prefix##_1f(void); \ - static __inline__ void prefix##_20(void); static __inline__ void prefix##_21(void); static __inline__ void prefix##_22(void); static __inline__ void prefix##_23(void); \ - static __inline__ void prefix##_24(void); static __inline__ void prefix##_25(void); static __inline__ void prefix##_26(void); static __inline__ void prefix##_27(void); \ - static __inline__ void prefix##_28(void); static __inline__ void prefix##_29(void); static __inline__ void prefix##_2a(void); static __inline__ void prefix##_2b(void); \ - static __inline__ void prefix##_2c(void); static __inline__ void prefix##_2d(void); static __inline__ void prefix##_2e(void); static __inline__ void prefix##_2f(void); \ - static __inline__ void prefix##_30(void); static __inline__ void prefix##_31(void); static __inline__ void prefix##_32(void); static __inline__ void prefix##_33(void); \ - static __inline__ void prefix##_34(void); static __inline__ void prefix##_35(void); static __inline__ void prefix##_36(void); static __inline__ void prefix##_37(void); \ - static __inline__ void prefix##_38(void); static __inline__ void prefix##_39(void); static __inline__ void prefix##_3a(void); static __inline__ void prefix##_3b(void); \ - static __inline__ void prefix##_3c(void); static __inline__ void prefix##_3d(void); static __inline__ void prefix##_3e(void); static __inline__ void prefix##_3f(void); \ - static __inline__ void prefix##_40(void); static __inline__ void prefix##_41(void); static __inline__ void prefix##_42(void); static __inline__ void prefix##_43(void); \ - static __inline__ void prefix##_44(void); static __inline__ void prefix##_45(void); static __inline__ void prefix##_46(void); static __inline__ void prefix##_47(void); \ - static __inline__ void prefix##_48(void); static __inline__ void prefix##_49(void); static __inline__ void prefix##_4a(void); static __inline__ void prefix##_4b(void); \ - static __inline__ void prefix##_4c(void); static __inline__ void prefix##_4d(void); static __inline__ void prefix##_4e(void); static __inline__ void prefix##_4f(void); \ - static __inline__ void prefix##_50(void); static __inline__ void prefix##_51(void); static __inline__ void prefix##_52(void); static __inline__ void prefix##_53(void); \ - static __inline__ void prefix##_54(void); static __inline__ void prefix##_55(void); static __inline__ void prefix##_56(void); static __inline__ void prefix##_57(void); \ - static __inline__ void prefix##_58(void); static __inline__ void prefix##_59(void); static __inline__ void prefix##_5a(void); static __inline__ void prefix##_5b(void); \ - static __inline__ void prefix##_5c(void); static __inline__ void prefix##_5d(void); static __inline__ void prefix##_5e(void); static __inline__ void prefix##_5f(void); \ - static __inline__ void prefix##_60(void); static __inline__ void prefix##_61(void); static __inline__ void prefix##_62(void); static __inline__ void prefix##_63(void); \ - static __inline__ void prefix##_64(void); static __inline__ void prefix##_65(void); static __inline__ void prefix##_66(void); static __inline__ void prefix##_67(void); \ - static __inline__ void prefix##_68(void); static __inline__ void prefix##_69(void); static __inline__ void prefix##_6a(void); static __inline__ void prefix##_6b(void); \ - static __inline__ void prefix##_6c(void); static __inline__ void prefix##_6d(void); static __inline__ void prefix##_6e(void); static __inline__ void prefix##_6f(void); \ - static __inline__ void prefix##_70(void); static __inline__ void prefix##_71(void); static __inline__ void prefix##_72(void); static __inline__ void prefix##_73(void); \ - static __inline__ void prefix##_74(void); static __inline__ void prefix##_75(void); static __inline__ void prefix##_76(void); static __inline__ void prefix##_77(void); \ - static __inline__ void prefix##_78(void); static __inline__ void prefix##_79(void); static __inline__ void prefix##_7a(void); static __inline__ void prefix##_7b(void); \ - static __inline__ void prefix##_7c(void); static __inline__ void prefix##_7d(void); static __inline__ void prefix##_7e(void); static __inline__ void prefix##_7f(void); \ - static __inline__ void prefix##_80(void); static __inline__ void prefix##_81(void); static __inline__ void prefix##_82(void); static __inline__ void prefix##_83(void); \ - static __inline__ void prefix##_84(void); static __inline__ void prefix##_85(void); static __inline__ void prefix##_86(void); static __inline__ void prefix##_87(void); \ - static __inline__ void prefix##_88(void); static __inline__ void prefix##_89(void); static __inline__ void prefix##_8a(void); static __inline__ void prefix##_8b(void); \ - static __inline__ void prefix##_8c(void); static __inline__ void prefix##_8d(void); static __inline__ void prefix##_8e(void); static __inline__ void prefix##_8f(void); \ - static __inline__ void prefix##_90(void); static __inline__ void prefix##_91(void); static __inline__ void prefix##_92(void); static __inline__ void prefix##_93(void); \ - static __inline__ void prefix##_94(void); static __inline__ void prefix##_95(void); static __inline__ void prefix##_96(void); static __inline__ void prefix##_97(void); \ - static __inline__ void prefix##_98(void); static __inline__ void prefix##_99(void); static __inline__ void prefix##_9a(void); static __inline__ void prefix##_9b(void); \ - static __inline__ void prefix##_9c(void); static __inline__ void prefix##_9d(void); static __inline__ void prefix##_9e(void); static __inline__ void prefix##_9f(void); \ - static __inline__ void prefix##_a0(void); static __inline__ void prefix##_a1(void); static __inline__ void prefix##_a2(void); static __inline__ void prefix##_a3(void); \ - static __inline__ void prefix##_a4(void); static __inline__ void prefix##_a5(void); static __inline__ void prefix##_a6(void); static __inline__ void prefix##_a7(void); \ - static __inline__ void prefix##_a8(void); static __inline__ void prefix##_a9(void); static __inline__ void prefix##_aa(void); static __inline__ void prefix##_ab(void); \ - static __inline__ void prefix##_ac(void); static __inline__ void prefix##_ad(void); static __inline__ void prefix##_ae(void); static __inline__ void prefix##_af(void); \ - static __inline__ void prefix##_b0(void); static __inline__ void prefix##_b1(void); static __inline__ void prefix##_b2(void); static __inline__ void prefix##_b3(void); \ - static __inline__ void prefix##_b4(void); static __inline__ void prefix##_b5(void); static __inline__ void prefix##_b6(void); static __inline__ void prefix##_b7(void); \ - static __inline__ void prefix##_b8(void); static __inline__ void prefix##_b9(void); static __inline__ void prefix##_ba(void); static __inline__ void prefix##_bb(void); \ - static __inline__ void prefix##_bc(void); static __inline__ void prefix##_bd(void); static __inline__ void prefix##_be(void); static __inline__ void prefix##_bf(void); \ - static __inline__ void prefix##_c0(void); static __inline__ void prefix##_c1(void); static __inline__ void prefix##_c2(void); static __inline__ void prefix##_c3(void); \ - static __inline__ void prefix##_c4(void); static __inline__ void prefix##_c5(void); static __inline__ void prefix##_c6(void); static __inline__ void prefix##_c7(void); \ - static __inline__ void prefix##_c8(void); static __inline__ void prefix##_c9(void); static __inline__ void prefix##_ca(void); static __inline__ void prefix##_cb(void); \ - static __inline__ void prefix##_cc(void); static __inline__ void prefix##_cd(void); static __inline__ void prefix##_ce(void); static __inline__ void prefix##_cf(void); \ - static __inline__ void prefix##_d0(void); static __inline__ void prefix##_d1(void); static __inline__ void prefix##_d2(void); static __inline__ void prefix##_d3(void); \ - static __inline__ void prefix##_d4(void); static __inline__ void prefix##_d5(void); static __inline__ void prefix##_d6(void); static __inline__ void prefix##_d7(void); \ - static __inline__ void prefix##_d8(void); static __inline__ void prefix##_d9(void); static __inline__ void prefix##_da(void); static __inline__ void prefix##_db(void); \ - static __inline__ void prefix##_dc(void); static __inline__ void prefix##_dd(void); static __inline__ void prefix##_de(void); static __inline__ void prefix##_df(void); \ - static __inline__ void prefix##_e0(void); static __inline__ void prefix##_e1(void); static __inline__ void prefix##_e2(void); static __inline__ void prefix##_e3(void); \ - static __inline__ void prefix##_e4(void); static __inline__ void prefix##_e5(void); static __inline__ void prefix##_e6(void); static __inline__ void prefix##_e7(void); \ - static __inline__ void prefix##_e8(void); static __inline__ void prefix##_e9(void); static __inline__ void prefix##_ea(void); static __inline__ void prefix##_eb(void); \ - static __inline__ void prefix##_ec(void); static __inline__ void prefix##_ed(void); static __inline__ void prefix##_ee(void); static __inline__ void prefix##_ef(void); \ - static __inline__ void prefix##_f0(void); static __inline__ void prefix##_f1(void); static __inline__ void prefix##_f2(void); static __inline__ void prefix##_f3(void); \ - static __inline__ void prefix##_f4(void); static __inline__ void prefix##_f5(void); static __inline__ void prefix##_f6(void); static __inline__ void prefix##_f7(void); \ - static __inline__ void prefix##_f8(void); static __inline__ void prefix##_f9(void); static __inline__ void prefix##_fa(void); static __inline__ void prefix##_fb(void); \ - static __inline__ void prefix##_fc(void); static __inline__ void prefix##_fd(void); static __inline__ void prefix##_fe(void); static __inline__ void prefix##_ff(void); \ -static void (*tablename[0x100])(void) = { \ - prefix##_00,prefix##_01,prefix##_02,prefix##_03,prefix##_04,prefix##_05,prefix##_06,prefix##_07, \ - prefix##_08,prefix##_09,prefix##_0a,prefix##_0b,prefix##_0c,prefix##_0d,prefix##_0e,prefix##_0f, \ - prefix##_10,prefix##_11,prefix##_12,prefix##_13,prefix##_14,prefix##_15,prefix##_16,prefix##_17, \ - prefix##_18,prefix##_19,prefix##_1a,prefix##_1b,prefix##_1c,prefix##_1d,prefix##_1e,prefix##_1f, \ - prefix##_20,prefix##_21,prefix##_22,prefix##_23,prefix##_24,prefix##_25,prefix##_26,prefix##_27, \ - prefix##_28,prefix##_29,prefix##_2a,prefix##_2b,prefix##_2c,prefix##_2d,prefix##_2e,prefix##_2f, \ - prefix##_30,prefix##_31,prefix##_32,prefix##_33,prefix##_34,prefix##_35,prefix##_36,prefix##_37, \ - prefix##_38,prefix##_39,prefix##_3a,prefix##_3b,prefix##_3c,prefix##_3d,prefix##_3e,prefix##_3f, \ - prefix##_40,prefix##_41,prefix##_42,prefix##_43,prefix##_44,prefix##_45,prefix##_46,prefix##_47, \ - prefix##_48,prefix##_49,prefix##_4a,prefix##_4b,prefix##_4c,prefix##_4d,prefix##_4e,prefix##_4f, \ - prefix##_50,prefix##_51,prefix##_52,prefix##_53,prefix##_54,prefix##_55,prefix##_56,prefix##_57, \ - prefix##_58,prefix##_59,prefix##_5a,prefix##_5b,prefix##_5c,prefix##_5d,prefix##_5e,prefix##_5f, \ - prefix##_60,prefix##_61,prefix##_62,prefix##_63,prefix##_64,prefix##_65,prefix##_66,prefix##_67, \ - prefix##_68,prefix##_69,prefix##_6a,prefix##_6b,prefix##_6c,prefix##_6d,prefix##_6e,prefix##_6f, \ - prefix##_70,prefix##_71,prefix##_72,prefix##_73,prefix##_74,prefix##_75,prefix##_76,prefix##_77, \ - prefix##_78,prefix##_79,prefix##_7a,prefix##_7b,prefix##_7c,prefix##_7d,prefix##_7e,prefix##_7f, \ - prefix##_80,prefix##_81,prefix##_82,prefix##_83,prefix##_84,prefix##_85,prefix##_86,prefix##_87, \ - prefix##_88,prefix##_89,prefix##_8a,prefix##_8b,prefix##_8c,prefix##_8d,prefix##_8e,prefix##_8f, \ - prefix##_90,prefix##_91,prefix##_92,prefix##_93,prefix##_94,prefix##_95,prefix##_96,prefix##_97, \ - prefix##_98,prefix##_99,prefix##_9a,prefix##_9b,prefix##_9c,prefix##_9d,prefix##_9e,prefix##_9f, \ - prefix##_a0,prefix##_a1,prefix##_a2,prefix##_a3,prefix##_a4,prefix##_a5,prefix##_a6,prefix##_a7, \ - prefix##_a8,prefix##_a9,prefix##_aa,prefix##_ab,prefix##_ac,prefix##_ad,prefix##_ae,prefix##_af, \ - prefix##_b0,prefix##_b1,prefix##_b2,prefix##_b3,prefix##_b4,prefix##_b5,prefix##_b6,prefix##_b7, \ - prefix##_b8,prefix##_b9,prefix##_ba,prefix##_bb,prefix##_bc,prefix##_bd,prefix##_be,prefix##_bf, \ - prefix##_c0,prefix##_c1,prefix##_c2,prefix##_c3,prefix##_c4,prefix##_c5,prefix##_c6,prefix##_c7, \ - prefix##_c8,prefix##_c9,prefix##_ca,prefix##_cb,prefix##_cc,prefix##_cd,prefix##_ce,prefix##_cf, \ - prefix##_d0,prefix##_d1,prefix##_d2,prefix##_d3,prefix##_d4,prefix##_d5,prefix##_d6,prefix##_d7, \ - prefix##_d8,prefix##_d9,prefix##_da,prefix##_db,prefix##_dc,prefix##_dd,prefix##_de,prefix##_df, \ - prefix##_e0,prefix##_e1,prefix##_e2,prefix##_e3,prefix##_e4,prefix##_e5,prefix##_e6,prefix##_e7, \ - prefix##_e8,prefix##_e9,prefix##_ea,prefix##_eb,prefix##_ec,prefix##_ed,prefix##_ee,prefix##_ef, \ - prefix##_f0,prefix##_f1,prefix##_f2,prefix##_f3,prefix##_f4,prefix##_f5,prefix##_f6,prefix##_f7, \ - prefix##_f8,prefix##_f9,prefix##_fa,prefix##_fb,prefix##_fc,prefix##_fd,prefix##_fe,prefix##_ff \ -} - -PROTOTYPES(Z80op,op); -PROTOTYPES(Z80cb,cb); -PROTOTYPES(Z80dd,dd); -PROTOTYPES(Z80ed,ed); -PROTOTYPES(Z80fd,fd); -PROTOTYPES(Z80xycb,xycb); - -/****************************************************************************/ -/* Burn an odd amount of cycles, that is instructions taking something */ -/* different from 4 T-states per opcode (and R increment) */ -/****************************************************************************/ -static __inline__ void BURNODD(int cycles, int opcodes, int cyclesum) -{ - if( cycles > 0 ) - { - _R += (cycles / cyclesum) * opcodes; - z80_ICount -= (cycles / cyclesum) * cyclesum; - } -} - -/*************************************************************** - * define an opcode function - ***************************************************************/ -#define OP(prefix,opcode) static __inline__ void prefix##_##opcode(void) - -/*************************************************************** - * adjust cycle count by n T-states - ***************************************************************/ -#define CC(prefix,opcode) z80_ICount -= cc[Z80_TABLE_##prefix][opcode] - -/*************************************************************** - * execute an opcode - ***************************************************************/ -#define EXEC(prefix,opcode) \ -{ \ - unsigned op = opcode; \ - CC(prefix,op); \ - (*Z80##prefix[op])(); \ -} - -#if BIG_SWITCH -#define EXEC_INLINE(prefix,opcode) \ -{ \ - unsigned op = opcode; \ - CC(prefix,op); \ - switch(op) \ - { \ - case 0x00:prefix##_##00();break; case 0x01:prefix##_##01();break; case 0x02:prefix##_##02();break; case 0x03:prefix##_##03();break; \ - case 0x04:prefix##_##04();break; case 0x05:prefix##_##05();break; case 0x06:prefix##_##06();break; case 0x07:prefix##_##07();break; \ - case 0x08:prefix##_##08();break; case 0x09:prefix##_##09();break; case 0x0a:prefix##_##0a();break; case 0x0b:prefix##_##0b();break; \ - case 0x0c:prefix##_##0c();break; case 0x0d:prefix##_##0d();break; case 0x0e:prefix##_##0e();break; case 0x0f:prefix##_##0f();break; \ - case 0x10:prefix##_##10();break; case 0x11:prefix##_##11();break; case 0x12:prefix##_##12();break; case 0x13:prefix##_##13();break; \ - case 0x14:prefix##_##14();break; case 0x15:prefix##_##15();break; case 0x16:prefix##_##16();break; case 0x17:prefix##_##17();break; \ - case 0x18:prefix##_##18();break; case 0x19:prefix##_##19();break; case 0x1a:prefix##_##1a();break; case 0x1b:prefix##_##1b();break; \ - case 0x1c:prefix##_##1c();break; case 0x1d:prefix##_##1d();break; case 0x1e:prefix##_##1e();break; case 0x1f:prefix##_##1f();break; \ - case 0x20:prefix##_##20();break; case 0x21:prefix##_##21();break; case 0x22:prefix##_##22();break; case 0x23:prefix##_##23();break; \ - case 0x24:prefix##_##24();break; case 0x25:prefix##_##25();break; case 0x26:prefix##_##26();break; case 0x27:prefix##_##27();break; \ - case 0x28:prefix##_##28();break; case 0x29:prefix##_##29();break; case 0x2a:prefix##_##2a();break; case 0x2b:prefix##_##2b();break; \ - case 0x2c:prefix##_##2c();break; case 0x2d:prefix##_##2d();break; case 0x2e:prefix##_##2e();break; case 0x2f:prefix##_##2f();break; \ - case 0x30:prefix##_##30();break; case 0x31:prefix##_##31();break; case 0x32:prefix##_##32();break; case 0x33:prefix##_##33();break; \ - case 0x34:prefix##_##34();break; case 0x35:prefix##_##35();break; case 0x36:prefix##_##36();break; case 0x37:prefix##_##37();break; \ - case 0x38:prefix##_##38();break; case 0x39:prefix##_##39();break; case 0x3a:prefix##_##3a();break; case 0x3b:prefix##_##3b();break; \ - case 0x3c:prefix##_##3c();break; case 0x3d:prefix##_##3d();break; case 0x3e:prefix##_##3e();break; case 0x3f:prefix##_##3f();break; \ - case 0x40:prefix##_##40();break; case 0x41:prefix##_##41();break; case 0x42:prefix##_##42();break; case 0x43:prefix##_##43();break; \ - case 0x44:prefix##_##44();break; case 0x45:prefix##_##45();break; case 0x46:prefix##_##46();break; case 0x47:prefix##_##47();break; \ - case 0x48:prefix##_##48();break; case 0x49:prefix##_##49();break; case 0x4a:prefix##_##4a();break; case 0x4b:prefix##_##4b();break; \ - case 0x4c:prefix##_##4c();break; case 0x4d:prefix##_##4d();break; case 0x4e:prefix##_##4e();break; case 0x4f:prefix##_##4f();break; \ - case 0x50:prefix##_##50();break; case 0x51:prefix##_##51();break; case 0x52:prefix##_##52();break; case 0x53:prefix##_##53();break; \ - case 0x54:prefix##_##54();break; case 0x55:prefix##_##55();break; case 0x56:prefix##_##56();break; case 0x57:prefix##_##57();break; \ - case 0x58:prefix##_##58();break; case 0x59:prefix##_##59();break; case 0x5a:prefix##_##5a();break; case 0x5b:prefix##_##5b();break; \ - case 0x5c:prefix##_##5c();break; case 0x5d:prefix##_##5d();break; case 0x5e:prefix##_##5e();break; case 0x5f:prefix##_##5f();break; \ - case 0x60:prefix##_##60();break; case 0x61:prefix##_##61();break; case 0x62:prefix##_##62();break; case 0x63:prefix##_##63();break; \ - case 0x64:prefix##_##64();break; case 0x65:prefix##_##65();break; case 0x66:prefix##_##66();break; case 0x67:prefix##_##67();break; \ - case 0x68:prefix##_##68();break; case 0x69:prefix##_##69();break; case 0x6a:prefix##_##6a();break; case 0x6b:prefix##_##6b();break; \ - case 0x6c:prefix##_##6c();break; case 0x6d:prefix##_##6d();break; case 0x6e:prefix##_##6e();break; case 0x6f:prefix##_##6f();break; \ - case 0x70:prefix##_##70();break; case 0x71:prefix##_##71();break; case 0x72:prefix##_##72();break; case 0x73:prefix##_##73();break; \ - case 0x74:prefix##_##74();break; case 0x75:prefix##_##75();break; case 0x76:prefix##_##76();break; case 0x77:prefix##_##77();break; \ - case 0x78:prefix##_##78();break; case 0x79:prefix##_##79();break; case 0x7a:prefix##_##7a();break; case 0x7b:prefix##_##7b();break; \ - case 0x7c:prefix##_##7c();break; case 0x7d:prefix##_##7d();break; case 0x7e:prefix##_##7e();break; case 0x7f:prefix##_##7f();break; \ - case 0x80:prefix##_##80();break; case 0x81:prefix##_##81();break; case 0x82:prefix##_##82();break; case 0x83:prefix##_##83();break; \ - case 0x84:prefix##_##84();break; case 0x85:prefix##_##85();break; case 0x86:prefix##_##86();break; case 0x87:prefix##_##87();break; \ - case 0x88:prefix##_##88();break; case 0x89:prefix##_##89();break; case 0x8a:prefix##_##8a();break; case 0x8b:prefix##_##8b();break; \ - case 0x8c:prefix##_##8c();break; case 0x8d:prefix##_##8d();break; case 0x8e:prefix##_##8e();break; case 0x8f:prefix##_##8f();break; \ - case 0x90:prefix##_##90();break; case 0x91:prefix##_##91();break; case 0x92:prefix##_##92();break; case 0x93:prefix##_##93();break; \ - case 0x94:prefix##_##94();break; case 0x95:prefix##_##95();break; case 0x96:prefix##_##96();break; case 0x97:prefix##_##97();break; \ - case 0x98:prefix##_##98();break; case 0x99:prefix##_##99();break; case 0x9a:prefix##_##9a();break; case 0x9b:prefix##_##9b();break; \ - case 0x9c:prefix##_##9c();break; case 0x9d:prefix##_##9d();break; case 0x9e:prefix##_##9e();break; case 0x9f:prefix##_##9f();break; \ - case 0xa0:prefix##_##a0();break; case 0xa1:prefix##_##a1();break; case 0xa2:prefix##_##a2();break; case 0xa3:prefix##_##a3();break; \ - case 0xa4:prefix##_##a4();break; case 0xa5:prefix##_##a5();break; case 0xa6:prefix##_##a6();break; case 0xa7:prefix##_##a7();break; \ - case 0xa8:prefix##_##a8();break; case 0xa9:prefix##_##a9();break; case 0xaa:prefix##_##aa();break; case 0xab:prefix##_##ab();break; \ - case 0xac:prefix##_##ac();break; case 0xad:prefix##_##ad();break; case 0xae:prefix##_##ae();break; case 0xaf:prefix##_##af();break; \ - case 0xb0:prefix##_##b0();break; case 0xb1:prefix##_##b1();break; case 0xb2:prefix##_##b2();break; case 0xb3:prefix##_##b3();break; \ - case 0xb4:prefix##_##b4();break; case 0xb5:prefix##_##b5();break; case 0xb6:prefix##_##b6();break; case 0xb7:prefix##_##b7();break; \ - case 0xb8:prefix##_##b8();break; case 0xb9:prefix##_##b9();break; case 0xba:prefix##_##ba();break; case 0xbb:prefix##_##bb();break; \ - case 0xbc:prefix##_##bc();break; case 0xbd:prefix##_##bd();break; case 0xbe:prefix##_##be();break; case 0xbf:prefix##_##bf();break; \ - case 0xc0:prefix##_##c0();break; case 0xc1:prefix##_##c1();break; case 0xc2:prefix##_##c2();break; case 0xc3:prefix##_##c3();break; \ - case 0xc4:prefix##_##c4();break; case 0xc5:prefix##_##c5();break; case 0xc6:prefix##_##c6();break; case 0xc7:prefix##_##c7();break; \ - case 0xc8:prefix##_##c8();break; case 0xc9:prefix##_##c9();break; case 0xca:prefix##_##ca();break; case 0xcb:prefix##_##cb();break; \ - case 0xcc:prefix##_##cc();break; case 0xcd:prefix##_##cd();break; case 0xce:prefix##_##ce();break; case 0xcf:prefix##_##cf();break; \ - case 0xd0:prefix##_##d0();break; case 0xd1:prefix##_##d1();break; case 0xd2:prefix##_##d2();break; case 0xd3:prefix##_##d3();break; \ - case 0xd4:prefix##_##d4();break; case 0xd5:prefix##_##d5();break; case 0xd6:prefix##_##d6();break; case 0xd7:prefix##_##d7();break; \ - case 0xd8:prefix##_##d8();break; case 0xd9:prefix##_##d9();break; case 0xda:prefix##_##da();break; case 0xdb:prefix##_##db();break; \ - case 0xdc:prefix##_##dc();break; case 0xdd:prefix##_##dd();break; case 0xde:prefix##_##de();break; case 0xdf:prefix##_##df();break; \ - case 0xe0:prefix##_##e0();break; case 0xe1:prefix##_##e1();break; case 0xe2:prefix##_##e2();break; case 0xe3:prefix##_##e3();break; \ - case 0xe4:prefix##_##e4();break; case 0xe5:prefix##_##e5();break; case 0xe6:prefix##_##e6();break; case 0xe7:prefix##_##e7();break; \ - case 0xe8:prefix##_##e8();break; case 0xe9:prefix##_##e9();break; case 0xea:prefix##_##ea();break; case 0xeb:prefix##_##eb();break; \ - case 0xec:prefix##_##ec();break; case 0xed:prefix##_##ed();break; case 0xee:prefix##_##ee();break; case 0xef:prefix##_##ef();break; \ - case 0xf0:prefix##_##f0();break; case 0xf1:prefix##_##f1();break; case 0xf2:prefix##_##f2();break; case 0xf3:prefix##_##f3();break; \ - case 0xf4:prefix##_##f4();break; case 0xf5:prefix##_##f5();break; case 0xf6:prefix##_##f6();break; case 0xf7:prefix##_##f7();break; \ - case 0xf8:prefix##_##f8();break; case 0xf9:prefix##_##f9();break; case 0xfa:prefix##_##fa();break; case 0xfb:prefix##_##fb();break; \ - case 0xfc:prefix##_##fc();break; case 0xfd:prefix##_##fd();break; case 0xfe:prefix##_##fe();break; case 0xff:prefix##_##ff();break; \ - } \ -} -#else -#define EXEC_INLINE EXEC -#endif - - -/*************************************************************** - * Enter HALT state; write 1 to fake port on first execution - ***************************************************************/ -#define ENTER_HALT { \ - _PC--; \ - _HALT = 1; \ - if( !after_EI ) \ - z80_burn( z80_ICount ); \ -} - -/*************************************************************** - * Leave HALT state; write 0 to fake port - ***************************************************************/ -#define LEAVE_HALT { \ - if( _HALT ) \ - { \ - _HALT = 0; \ - _PC++; \ - } \ -} - -/*************************************************************** - * Input a byte from given I/O port - ***************************************************************/ -#define IN(port) ((UINT8)cpu_readport16(port)) - -/*************************************************************** - * Output a byte to given I/O port - ***************************************************************/ -#define OUT(port,value) cpu_writeport16(port,value) - -/*************************************************************** - * Read a byte from given memory location - ***************************************************************/ -#define RM(addr) (UINT8)cpu_readmem16(addr) - -/*************************************************************** - * Read a word from given memory location - ***************************************************************/ -static __inline__ void RM16( UINT32 addr, PAIR *r ) -{ - r->b.l = RM(addr); - r->b.h = RM((addr+1)&0xffff); -} - -/*************************************************************** - * Write a byte to given memory location - ***************************************************************/ -#define WM(addr,value) cpu_writemem16(addr,value) - -/*************************************************************** - * Write a word to given memory location - ***************************************************************/ -static __inline__ void WM16( UINT32 addr, PAIR *r ) -{ - WM(addr,r->b.l); - WM((addr+1)&0xffff,r->b.h); -} - -/*************************************************************** - * ROP() is identical to RM() except it is used for - * reading opcodes. In case of system with memory mapped I/O, - * this function can be used to greatly speed up emulation - ***************************************************************/ -static __inline__ UINT8 ROP(void) -{ - unsigned pc = _PCD; - _PC++; - return cpu_readop(pc); -} - -/**************************************************************** - * ARG() is identical to ROP() except it is used - * for reading opcode arguments. This difference can be used to - * support systems that use different encoding mechanisms for - * opcodes and opcode arguments - ***************************************************************/ -static __inline__ UINT8 ARG(void) -{ - unsigned pc = _PCD; - _PC++; - return cpu_readop_arg(pc); -} - -static __inline__ UINT32 ARG16(void) -{ - unsigned pc = _PCD; - _PC += 2; - return cpu_readop_arg(pc) | (cpu_readop_arg((pc+1)&0xffff) << 8); -} - -/*************************************************************** - * Calculate the effective address EA of an opcode using - * IX+offset resp. IY+offset addressing. - ***************************************************************/ -#define EAX EA = (UINT32)(UINT16)(_IX+(INT8)ARG()) -#define EAY EA = (UINT32)(UINT16)(_IY+(INT8)ARG()) - -/*************************************************************** - * POP - ***************************************************************/ -#define POP(DR) { RM16( _SPD, &Z80.DR ); _SP += 2; } - -/*************************************************************** - * PUSH - ***************************************************************/ -#define PUSH(SR) { _SP -= 2; WM16( _SPD, &Z80.SR ); } - -/*************************************************************** - * JP - ***************************************************************/ -#if BUSY_LOOP_HACKS -#define JP { \ - unsigned oldpc = _PCD-1; \ - _PCD = ARG16(); \ - /* speed up busy loop */ \ - if( _PCD == oldpc ) \ - { \ - if( !after_EI ) \ - BURNODD( z80_ICount, 1, cc[Z80_TABLE_op][0xc3] ); \ - } \ - else \ - { \ - UINT8 op = cpu_readop(_PCD); \ - if( _PCD == oldpc-1 ) \ - { \ - /* NOP - JP $-1 or EI - JP $-1 */ \ - if ( op == 0x00 || op == 0xfb ) \ - { \ - if( !after_EI ) \ - BURNODD( z80_ICount-cc[Z80_TABLE_op][0x00], \ - 2, cc[Z80_TABLE_op][0x00]+cc[Z80_TABLE_op][0xc3]); \ - } \ - } \ - else \ - /* LD SP,#xxxx - JP $-3 (Galaga) */ \ - if( _PCD == oldpc-3 && op == 0x31 ) \ - { \ - if( !after_EI ) \ - BURNODD( z80_ICount-cc[Z80_TABLE_op][0x31], \ - 2, cc[Z80_TABLE_op][0x31]+cc[Z80_TABLE_op][0xc3]); \ - } \ - } \ -} -#else -#define JP { \ - _PCD = ARG16(); \ -} -#endif - -/*************************************************************** - * JP_COND - ***************************************************************/ - -#define JP_COND(cond) \ - if( cond ) \ - { \ - _PCD = ARG16(); \ - } \ - else \ - { \ - _PC += 2; \ - } - -/*************************************************************** - * JR - ***************************************************************/ -#define JR() \ -{ \ - unsigned oldpc = _PCD-1; \ - INT8 arg = (INT8)ARG(); /* ARG() also increments _PC */ \ - _PC += arg; /* so don't do _PC += ARG() */ \ - /* speed up busy loop */ \ - if( _PCD == oldpc ) \ - { \ - if( !after_EI ) \ - BURNODD( z80_ICount, 1, cc[Z80_TABLE_op][0x18] ); \ - } \ - else \ - { \ - UINT8 op = cpu_readop(_PCD); \ - if( _PCD == oldpc-1 ) \ - { \ - /* NOP - JR $-1 or EI - JR $-1 */ \ - if ( op == 0x00 || op == 0xfb ) \ - { \ - if( !after_EI ) \ - BURNODD( z80_ICount-cc[Z80_TABLE_op][0x00], \ - 2, cc[Z80_TABLE_op][0x00]+cc[Z80_TABLE_op][0x18]); \ - } \ - } \ - else \ - /* LD SP,#xxxx - JR $-3 */ \ - if( _PCD == oldpc-3 && op == 0x31 ) \ - { \ - if( !after_EI ) \ - BURNODD( z80_ICount-cc[Z80_TABLE_op][0x31], \ - 2, cc[Z80_TABLE_op][0x31]+cc[Z80_TABLE_op][0x18]); \ - } \ - } \ -} - -/*************************************************************** - * JR_COND - ***************************************************************/ -#define JR_COND(cond,opcode) \ - if( cond ) \ - { \ - INT8 arg = (INT8)ARG(); /* ARG() also increments _PC */ \ - _PC += arg; /* so don't do _PC += ARG() */ \ - CC(ex,opcode); \ - } \ - else _PC++; \ - -/*************************************************************** - * CALL - ***************************************************************/ -#define CALL() \ - EA = ARG16(); \ - PUSH( PC ); \ - _PCD = EA; - -/*************************************************************** - * CALL_COND - ***************************************************************/ -#define CALL_COND(cond,opcode) \ - if( cond ) \ - { \ - EA = ARG16(); \ - PUSH( PC ); \ - _PCD = EA; \ - CC(ex,opcode); \ - } \ - else \ - { \ - _PC+=2; \ - } - -/*************************************************************** - * RET_COND - ***************************************************************/ -#define RET_COND(cond,opcode) \ - if( cond ) \ - { \ - POP(PC); \ - CC(ex,opcode); \ - } - -/*************************************************************** - * RETN - ***************************************************************/ -#define RETN { \ - POP(PC); \ - if( _IFF1 == 0 && _IFF2 == 1 ) \ - { \ - _IFF1 = 1; \ - if( Z80.irq_state != CLEAR_LINE || \ - Z80.request_irq >= 0 ) \ - { \ - take_interrupt(); \ - } \ - } \ - else _IFF1 = _IFF2; \ -} - -/*************************************************************** - * RETI - ***************************************************************/ -#define RETI { \ - int device = Z80.service_irq; \ - POP(PC); \ -/* according to http://www.msxnet.org/tech/Z80/z80undoc.txt */ \ -/* _IFF1 = _IFF2; */ \ - if( device >= 0 ) \ - { \ - Z80.irq[device].interrupt_reti(Z80.irq[device].irq_param); \ - } \ -} - -/*************************************************************** - * LD R,A - ***************************************************************/ -#define LD_R_A { \ - _R = _A; \ - _R2 = _A & 0x80; /* keep bit 7 of R */ \ -} - -/*************************************************************** - * LD A,R - ***************************************************************/ -#define LD_A_R { \ - _A = (_R & 0x7f) | _R2; \ - _F = (_F & CF) | SZ[_A] | ( _IFF2 << 2 ); \ -} - -/*************************************************************** - * LD I,A - ***************************************************************/ -#define LD_I_A { \ - _I = _A; \ -} - -/*************************************************************** - * LD A,I - ***************************************************************/ -#define LD_A_I { \ - _A = _I; \ - _F = (_F & CF) | SZ[_A] | ( _IFF2 << 2 ); \ -} - -/*************************************************************** - * RST - ***************************************************************/ -#define RST(addr) \ - PUSH( PC ); \ - _PCD = addr; - -/*************************************************************** - * INC r8 - ***************************************************************/ -static __inline__ UINT8 INC(UINT8 value) -{ - UINT8 res = value + 1; - _F = (_F & CF) | SZHV_inc[res]; - return (UINT8)res; -} - -/*************************************************************** - * DEC r8 - ***************************************************************/ -static __inline__ UINT8 DEC(UINT8 value) -{ - UINT8 res = value - 1; - _F = (_F & CF) | SZHV_dec[res]; - return res; -} - -/*************************************************************** - * RLCA - ***************************************************************/ -#if Z80_EXACT -#define RLCA \ - _A = (_A << 1) | (_A >> 7); \ - _F = (_F & (SF | ZF | PF)) | (_A & (YF | XF | CF)) -#else -#define RLCA \ - _A = (_A << 1) | (_A >> 7); \ - _F = (_F & (SF | ZF | YF | XF | PF)) | (_A & CF) -#endif - -/*************************************************************** - * RRCA - ***************************************************************/ -#if Z80_EXACT -#define RRCA \ - _F = (_F & (SF | ZF | PF)) | (_A & CF); \ - _A = (_A >> 1) | (_A << 7); \ - _F |= (_A & (YF | XF) ) -#else -#define RRCA \ - _F = (_F & (SF | ZF | YF | XF | PF)) | (_A & CF); \ - _A = (_A >> 1) | (_A << 7) -#endif - -/*************************************************************** - * RLA - ***************************************************************/ -#if Z80_EXACT -#define RLA { \ - UINT8 res = (_A << 1) | (_F & CF); \ - UINT8 c = (_A & 0x80) ? CF : 0; \ - _F = (_F & (SF | ZF | PF)) | c | (res & (YF | XF)); \ - _A = res; \ -} -#else -#define RLA { \ - UINT8 res = (_A << 1) | (_F & CF); \ - UINT8 c = (_A & 0x80) ? CF : 0; \ - _F = (_F & (SF | ZF | YF | XF | PF)) | c; \ - _A = res; \ -} -#endif - -/*************************************************************** - * RRA - ***************************************************************/ -#if Z80_EXACT -#define RRA { \ - UINT8 res = (_A >> 1) | (_F << 7); \ - UINT8 c = (_A & 0x01) ? CF : 0; \ - _F = (_F & (SF | ZF | PF)) | c | (res & (YF | XF)); \ - _A = res; \ -} -#else -#define RRA { \ - UINT8 res = (_A >> 1) | (_F << 7); \ - UINT8 c = (_A & 0x01) ? CF : 0; \ - _F = (_F & (SF | ZF | YF | XF | PF)) | c; \ - _A = res; \ -} -#endif - -/*************************************************************** - * RRD - ***************************************************************/ -#define RRD { \ - UINT8 n = RM(_HL); \ - WM( _HL, (n >> 4) | (_A << 4) ); \ - _A = (_A & 0xf0) | (n & 0x0f); \ - _F = (_F & CF) | SZP[_A]; \ -} - -/*************************************************************** - * RLD - ***************************************************************/ -#define RLD { \ - UINT8 n = RM(_HL); \ - WM( _HL, (n << 4) | (_A & 0x0f) ); \ - _A = (_A & 0xf0) | (n >> 4); \ - _F = (_F & CF) | SZP[_A]; \ -} - -/*************************************************************** - * ADD A,n - ***************************************************************/ -#ifdef X86_ASM -#if Z80_EXACT -#define ADD(value) \ - asm ( \ - " addb %2,%0 \n" \ - " lahf \n" \ - " setob %1 \n" /* al = 1 if overflow */ \ - " addb %1,%1 \n" \ - " addb %1,%1 \n" /* shift to P/V bit position */ \ - " andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \ - " orb %%ah,%1 \n" \ - " movb %0,%%ah \n" /* get result */ \ - " andb $0x28,%%ah \n" /* maks flags 5+3 */ \ - " orb %%ah,%1 \n" /* put them into flags */ \ - :"=r" (_A), "=r" (_F) \ - :"r" (value), "1" (_F), "0" (_A) \ - ) -#else -#define ADD(value) \ - asm ( \ - " addb %2,%0 \n" \ - " lahf \n" \ - " setob %1 \n" /* al = 1 if overflow */ \ - " addb %1,%1 \n" \ - " addb %1,%1 \n" /* shift to P/V bit position */ \ - " andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \ - " orb %%ah,%1 \n" \ - :"=r" (_A), "=r" (_F) \ - :"r" (value), "1" (_F), "0" (_A) \ - ) -#endif -#else -#if BIG_FLAGS_ARRAY -#define ADD(value) \ -{ \ - UINT32 ah = _AFD & 0xff00; \ - UINT32 res = (UINT8)((ah >> 8) + value); \ - _F = SZHVC_add[ah | res]; \ - _A = res; \ -} -#else -#define ADD(value) \ -{ \ - unsigned val = value; \ - unsigned res = _A + val; \ - _F = SZ[(UINT8)res] | ((res >> 8) & CF) | \ - ((_A ^ res ^ val) & HF) | \ - (((val ^ _A ^ 0x80) & (val ^ res) & 0x80) >> 5); \ - _A = (UINT8)res; \ -} -#endif -#endif - -/*************************************************************** - * ADC A,n - ***************************************************************/ -#ifdef X86_ASM -#if Z80_EXACT -#define ADC(value) \ - asm ( \ - " shrb $1,%1 \n" \ - " adcb %2,%0 \n" \ - " lahf \n" \ - " setob %1 \n" /* al = 1 if overflow */ \ - " addb %1,%1 \n" /* shift to P/V bit position */ \ - " addb %1,%1 \n" \ - " andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \ - " orb %%ah,%1 \n" /* combine with P/V */ \ - " movb %0,%%ah \n" /* get result */ \ - " andb $0x28,%%ah \n" /* maks flags 5+3 */ \ - " orb %%ah,%1 \n" /* put them into flags */ \ - :"=r" (_A), "=r" (_F) \ - :"r" (value), "1" (_F), "0" (_A) \ - ) -#else -#define ADC(value) \ - asm ( \ - " shrb $1,%1 \n" \ - " adcb %2,%0 \n" \ - " lahf \n" \ - " setob %1 \n" /* al = 1 if overflow */ \ - " addb %1,%1 \n" /* shift to P/V bit position */ \ - " addb %1,%1 \n" \ - " andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \ - " orb %%ah,%1 \n" /* combine with P/V */ \ - :"=r" (_A), "=r" (_F) \ - :"r" (value), "1" (_F), "0" (_A) \ - ) -#endif -#else -#if BIG_FLAGS_ARRAY -#define ADC(value) \ -{ \ - UINT32 ah = _AFD & 0xff00, c = _AFD & 1; \ - UINT32 res = (UINT8)((ah >> 8) + value + c); \ - _F = SZHVC_add[(c << 16) | ah | res]; \ - _A = res; \ -} -#else -#define ADC(value) \ -{ \ - unsigned val = value; \ - unsigned res = _A + val + (_F & CF); \ - _F = SZ[res & 0xff] | ((res >> 8) & CF) | \ - ((_A ^ res ^ val) & HF) | \ - (((val ^ _A ^ 0x80) & (val ^ res) & 0x80) >> 5); \ - _A = res; \ -} -#endif -#endif - -/*************************************************************** - * SUB n - ***************************************************************/ -#ifdef X86_ASM -#if Z80_EXACT -#define SUB(value) \ - asm ( \ - " subb %2,%0 \n" \ - " lahf \n" \ - " setob %1 \n" /* al = 1 if overflow */ \ - " stc \n" /* prepare to set N flag */ \ - " adcb %1,%1 \n" /* shift to P/V bit position */ \ - " addb %1,%1 \n" \ - " andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \ - " orb %%ah,%1 \n" /* combine with P/V */ \ - " movb %0,%%ah \n" /* get result */ \ - " andb $0x28,%%ah \n" /* maks flags 5+3 */ \ - " orb %%ah,%1 \n" /* put them into flags */ \ - :"=r" (_A), "=r" (_F) \ - :"r" (value), "1" (_F), "0" (_A) \ - ) -#else -#define SUB(value) \ - asm ( \ - " subb %2,%0 \n" \ - " lahf \n" \ - " setob %1 \n" /* al = 1 if overflow */ \ - " stc \n" /* prepare to set N flag */ \ - " adcb %1,%1 \n" /* shift to P/V bit position */ \ - " addb %1,%1 \n" \ - " andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \ - " orb %%ah,%1 \n" /* combine with P/V */ \ - :"=r" (_A), "=r" (_F) \ - :"r" (value), "1" (_F), "0" (_A) \ - ) -#endif -#else -#if BIG_FLAGS_ARRAY -#define SUB(value) \ -{ \ - UINT32 ah = _AFD & 0xff00; \ - UINT32 res = (UINT8)((ah >> 8) - value); \ - _F = SZHVC_sub[ah | res]; \ - _A = res; \ -} -#else -#define SUB(value) \ -{ \ - unsigned val = value; \ - unsigned res = _A - val; \ - _F = SZ[res & 0xff] | ((res >> 8) & CF) | NF | \ - ((_A ^ res ^ val) & HF) | \ - (((val ^ _A) & (_A ^ res) & 0x80) >> 5); \ - _A = res; \ -} -#endif -#endif - -/*************************************************************** - * SBC A,n - ***************************************************************/ -#ifdef X86_ASM -#if Z80_EXACT -#define SBC(value) \ - asm ( \ - " shrb $1,%1 \n" \ - " sbbb %2,%0 \n" \ - " lahf \n" \ - " setob %1 \n" /* al = 1 if overflow */ \ - " stc \n" /* prepare to set N flag */ \ - " adcb %1,%1 \n" /* shift to P/V bit position */ \ - " addb %1,%1 \n" \ - " andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \ - " orb %%ah,%1 \n" /* combine with P/V */ \ - " movb %0,%%ah \n" /* get result */ \ - " andb $0x28,%%ah \n" /* maks flags 5+3 */ \ - " orb %%ah,%1 \n" /* put them into flags */ \ - :"=r" (_A), "=r" (_F) \ - :"r" (value), "1" (_F), "0" (_A) \ - ) -#else -#define SBC(value) \ - asm ( \ - " shrb $1,%1 \n" \ - " sbbb %2,%0 \n" \ - " lahf \n" \ - " setob %1 \n" /* al = 1 if overflow */ \ - " stc \n" /* prepare to set N flag */ \ - " adcb %1,%1 \n" /* shift to P/V bit position */ \ - " addb %1,%1 \n" \ - " andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \ - " orb %%ah,%1 \n" /* combine with P/V */ \ - :"=r" (_A), "=r" (_F) \ - :"r" (value), "1" (_F), "0" (_A) \ - ) -#endif -#else -#if BIG_FLAGS_ARRAY -#define SBC(value) \ -{ \ - UINT32 ah = _AFD & 0xff00, c = _AFD & 1; \ - UINT32 res = (UINT8)((ah >> 8) - value - c); \ - _F = SZHVC_sub[(c<<16) | ah | res]; \ - _A = res; \ -} -#else -#define SBC(value) \ -{ \ - unsigned val = value; \ - unsigned res = _A - val - (_F & CF); \ - _F = SZ[res & 0xff] | ((res >> 8) & CF) | NF | \ - ((_A ^ res ^ val) & HF) | \ - (((val ^ _A) & (_A ^ res) & 0x80) >> 5); \ - _A = res; \ -} -#endif -#endif - -/*************************************************************** - * NEG - ***************************************************************/ -#define NEG { \ - UINT8 value = _A; \ - _A = 0; \ - SUB(value); \ -} - -/*************************************************************** - * DAA - ***************************************************************/ -#define DAA { \ - int idx = _A; \ - if( _F & CF ) idx |= 0x100; \ - if( _F & HF ) idx |= 0x200; \ - if( _F & NF ) idx |= 0x400; \ - _AF = DAATable[idx]; \ -} - -/*************************************************************** - * AND n - ***************************************************************/ -#define AND(value) \ - _A &= value; \ - _F = SZP[_A] | HF - -/*************************************************************** - * OR n - ***************************************************************/ -#define OR(value) \ - _A |= value; \ - _F = SZP[_A] - -/*************************************************************** - * XOR n - ***************************************************************/ -#define XOR(value) \ - _A ^= value; \ - _F = SZP[_A] - -/*************************************************************** - * CP n - ***************************************************************/ -#ifdef X86_ASM -#if Z80_EXACT -#define CP(value) \ - asm ( \ - " cmpb %2,%0 \n" \ - " lahf \n" \ - " setob %1 \n" /* al = 1 if overflow */ \ - " stc \n" /* prepare to set N flag */ \ - " adcb %1,%1 \n" /* shift to P/V bit position */ \ - " addb %1,%1 \n" \ - " andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \ - " orb %%ah,%1 \n" /* combine with P/V */ \ - " movb %2,%%ah \n" /* get result */ \ - " andb $0x28,%%ah \n" /* maks flags 5+3 */ \ - " orb %%ah,%1 \n" /* put them into flags */ \ - :"=r" (_A), "=r" (_F) \ - :"r" (value), "1" (_F), "0" (_A) \ - ) -#else -#define CP(value) \ - asm ( \ - " cmpb %2,%0 \n" \ - " lahf \n" \ - " setob %1 \n" /* al = 1 if overflow */ \ - " stc \n" /* prepare to set N flag */ \ - " adcb %1,%1 \n" /* shift to P/V bit position */ \ - " addb %1,%1 \n" \ - " andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \ - " orb %%ah,%1 \n" /* combine with P/V */ \ - :"=r" (_A), "=r" (_F) \ - :"r" (value), "1" (_F), "0" (_A) \ - ) -#endif -#else -#if BIG_FLAGS_ARRAY -#define CP(value) \ -{ \ - UINT32 ah = _AFD & 0xff00; \ - UINT32 res = (UINT8)((ah >> 8) - value); \ - _F = SZHVC_sub[ah | res]; \ -} -#else -#define CP(value) \ -{ \ - unsigned val = value; \ - unsigned res = _A - val; \ - _F = SZ[res & 0xff] | ((res >> 8) & CF) | NF | \ - ((_A ^ res ^ val) & HF) | \ - ((((val ^ _A) & (_A ^ res)) >> 5) & VF); \ -} -#endif -#endif - -/*************************************************************** - * EX AF,AF' - ***************************************************************/ -#define EX_AF { \ - PAIR tmp; \ - tmp = Z80.AF; Z80.AF = Z80.AF2; Z80.AF2 = tmp; \ -} - -/*************************************************************** - * EX DE,HL - ***************************************************************/ -#define EX_DE_HL { \ - PAIR tmp; \ - tmp = Z80.DE; Z80.DE = Z80.HL; Z80.HL = tmp; \ -} - -/*************************************************************** - * EXX - ***************************************************************/ -#define EXX { \ - PAIR tmp; \ - tmp = Z80.BC; Z80.BC = Z80.BC2; Z80.BC2 = tmp; \ - tmp = Z80.DE; Z80.DE = Z80.DE2; Z80.DE2 = tmp; \ - tmp = Z80.HL; Z80.HL = Z80.HL2; Z80.HL2 = tmp; \ -} - -/*************************************************************** - * EX (SP),r16 - ***************************************************************/ -#define EXSP(DR) \ -{ \ - PAIR tmp = { { 0, 0, 0, 0 } }; \ - RM16( _SPD, &tmp ); \ - WM16( _SPD, &Z80.DR ); \ - Z80.DR = tmp; \ -} - - -/*************************************************************** - * ADD16 - ***************************************************************/ -#ifdef X86_ASM -#if Z80_EXACT -#define ADD16(DR,SR) \ - asm ( \ - " andb $0xc4,%1 \n" \ - " addb %%dl,%%cl \n" \ - " adcb %%dh,%%ch \n" \ - " lahf \n" \ - " andb $0x11,%%ah \n" \ - " orb %%ah,%1 \n" \ - " movb %%ch,%%ah \n" /* get result MSB */ \ - " andb $0x28,%%ah \n" /* maks flags 5+3 */ \ - " orb %%ah,%1 \n" /* put them into flags */ \ - :"=c" (Z80.DR.d), "=r" (_F) \ - :"0" (Z80.DR.d), "1" (_F), "d" (Z80.SR.d) \ - ) -#else -#define ADD16(DR,SR) \ - asm ( \ - " andb $0xc4,%1 \n" \ - " addb %%dl,%%cl \n" \ - " adcb %%dh,%%ch \n" \ - " lahf \n" \ - " andb $0x11,%%ah \n" \ - " orb %%ah,%1 \n" \ - :"=c" (Z80.DR.d), "=r" (_F) \ - :"0" (Z80.DR.d), "1" (_F), "d" (Z80.SR.d) \ - ) -#endif -#else -#define ADD16(DR,SR) \ -{ \ - UINT32 res = Z80.DR.d + Z80.SR.d; \ - _F = (_F & (SF | ZF | VF)) | \ - (((Z80.DR.d ^ res ^ Z80.SR.d) >> 8) & HF) | \ - ((res >> 16) & CF); \ - Z80.DR.w.l = (UINT16)res; \ -} -#endif - -/*************************************************************** - * ADC r16,r16 - ***************************************************************/ -#ifdef X86_ASM -#if Z80_EXACT -#define ADC16(Reg) \ - asm ( \ - " shrb $1,%1 \n" \ - " adcb %%dl,%%cl \n" \ - " lahf \n" \ - " movb %%ah,%%dl \n" \ - " adcb %%dh,%%ch \n" \ - " lahf \n" \ - " setob %1 \n" \ - " orb $0xbf,%%dl \n" /* set all but zero */ \ - " addb %1,%1 \n" \ - " andb $0xd1,%%ah \n" /* sign,zero,half carry and carry */\ - " addb %1,%1 \n" \ - " orb %%ah,%1 \n" /* overflow into P/V */ \ - " andb %%dl,%1 \n" /* mask zero */ \ - " movb %%ch,%%ah \n" /* get result MSB */ \ - " andb $0x28,%%ah \n" /* maks flags 5+3 */ \ - " orb %%ah,%1 \n" /* put them into flags */ \ - :"=c" (_HLD), "=r" (_F) \ - :"0" (_HLD), "1" (_F), "d" (Z80.Reg.d) \ - ) -#else -#define ADC16(Reg) \ - asm ( \ - " shrb $1,%1 \n" \ - " adcb %%dl,%%cl \n" \ - " lahf \n" \ - " movb %%ah,%%dl \n" \ - " adcb %%dh,%%ch \n" \ - " lahf \n" \ - " setob %1 \n" \ - " orb $0xbf,%%dl \n" /* set all but zero */ \ - " addb %1,%1 \n" \ - " andb $0xd1,%%ah \n" /* sign,zero,half carry and carry */\ - " addb %1,%1 \n" \ - " orb %%ah,%1 \n" /* overflow into P/V */ \ - " andb %%dl,%1 \n" /* mask zero */ \ - :"=c" (_HLD), "=r" (_F) \ - :"0" (_HLD), "1" (_F), "d" (Z80.Reg.d) \ - ) -#endif -#else -#define ADC16(Reg) \ -{ \ - UINT32 res = _HLD + Z80.Reg.d + (_F & CF); \ - _F = (((_HLD ^ res ^ Z80.Reg.d) >> 8) & HF) | \ - ((res >> 16) & CF) | \ - ((res >> 8) & SF) | \ - ((res & 0xffff) ? 0 : ZF) | \ - (((Z80.Reg.d ^ _HLD ^ 0x8000) & (Z80.Reg.d ^ res) & 0x8000) >> 13); \ - _HL = (UINT16)res; \ -} -#endif - -/*************************************************************** - * SBC r16,r16 - ***************************************************************/ -#ifdef X86_ASM -#if Z80_EXACT -#define SBC16(Reg) \ -asm ( \ - " shrb $1,%1 \n" \ - " sbbb %%dl,%%cl \n" \ - " lahf \n" \ - " movb %%ah,%%dl \n" \ - " sbbb %%dh,%%ch \n" \ - " lahf \n" \ - " setob %1 \n" \ - " orb $0xbf,%%dl \n" /* set all but zero */ \ - " stc \n" \ - " adcb %1,%1 \n" \ - " andb $0xd1,%%ah \n" /* sign,zero,half carry and carry */\ - " addb %1,%1 \n" \ - " orb %%ah,%1 \n" /* overflow into P/V */ \ - " andb %%dl,%1 \n" /* mask zero */ \ - " movb %%ch,%%ah \n" /* get result MSB */ \ - " andb $0x28,%%ah \n" /* maks flags 5+3 */ \ - " orb %%ah,%1 \n" /* put them into flags */ \ - :"=c" (_HLD), "=r" (_F) \ - :"0" (_HLD), "1" (_F), "d" (Z80.Reg.d) \ - ) -#else -#define SBC16(Reg) \ -asm ( \ - " shrb $1,%1 \n" \ - " sbbb %%dl,%%cl \n" \ - " lahf \n" \ - " movb %%ah,%%dl \n" \ - " sbbb %%dh,%%ch \n" \ - " lahf \n" \ - " setob %1 \n" \ - " orb $0xbf,%%dl \n" /* set all but zero */ \ - " stc \n" \ - " adcb %1,%1 \n" \ - " andb $0xd1,%%ah \n" /* sign,zero,half carry and carry */\ - " addb %1,%1 \n" \ - " orb %%ah,%1 \n" /* overflow into P/V */ \ - " andb %%dl,%1 \n" /* mask zero */ \ - :"=c" (_HLD), "=r" (_F) \ - :"0" (_HLD), "1" (_F), "d" (Z80.Reg.d) \ - ) -#endif -#else -#define SBC16(Reg) \ -{ \ - UINT32 res = _HLD - Z80.Reg.d - (_F & CF); \ - _F = (((_HLD ^ res ^ Z80.Reg.d) >> 8) & HF) | NF | \ - ((res >> 16) & CF) | \ - ((res >> 8) & SF) | \ - ((res & 0xffff) ? 0 : ZF) | \ - (((Z80.Reg.d ^ _HLD) & (_HLD ^ res) &0x8000) >> 13); \ - _HL = (UINT16)res; \ -} -#endif - -/*************************************************************** - * RLC r8 - ***************************************************************/ -static __inline__ UINT8 RLC(UINT8 value) -{ - unsigned res = value; - unsigned c = (res & 0x80) ? CF : 0; - res = ((res << 1) | (res >> 7)) & 0xff; - _F = SZP[res] | c; - return res; -} - -/*************************************************************** - * RRC r8 - ***************************************************************/ -static __inline__ UINT8 RRC(UINT8 value) -{ - unsigned res = value; - unsigned c = (res & 0x01) ? CF : 0; - res = ((res >> 1) | (res << 7)) & 0xff; - _F = SZP[res] | c; - return res; -} - -/*************************************************************** - * RL r8 - ***************************************************************/ -static __inline__ UINT8 RL(UINT8 value) -{ - unsigned res = value; - unsigned c = (res & 0x80) ? CF : 0; - res = ((res << 1) | (_F & CF)) & 0xff; - _F = SZP[res] | c; - return res; -} - -/*************************************************************** - * RR r8 - ***************************************************************/ -static __inline__ UINT8 RR(UINT8 value) -{ - unsigned res = value; - unsigned c = (res & 0x01) ? CF : 0; - res = ((res >> 1) | (_F << 7)) & 0xff; - _F = SZP[res] | c; - return res; -} - -/*************************************************************** - * SLA r8 - ***************************************************************/ -static __inline__ UINT8 SLA(UINT8 value) -{ - unsigned res = value; - unsigned c = (res & 0x80) ? CF : 0; - res = (res << 1) & 0xff; - _F = SZP[res] | c; - return res; -} - -/*************************************************************** - * SRA r8 - ***************************************************************/ -static __inline__ UINT8 SRA(UINT8 value) -{ - unsigned res = value; - unsigned c = (res & 0x01) ? CF : 0; - res = ((res >> 1) | (res & 0x80)) & 0xff; - _F = SZP[res] | c; - return res; -} - -/*************************************************************** - * SLL r8 - ***************************************************************/ -static __inline__ UINT8 SLL(UINT8 value) -{ - unsigned res = value; - unsigned c = (res & 0x80) ? CF : 0; - res = ((res << 1) | 0x01) & 0xff; - _F = SZP[res] | c; - return res; -} - -/*************************************************************** - * SRL r8 - ***************************************************************/ -static __inline__ UINT8 SRL(UINT8 value) -{ - unsigned res = value; - unsigned c = (res & 0x01) ? CF : 0; - res = (res >> 1) & 0xff; - _F = SZP[res] | c; - return res; -} - -/*************************************************************** - * BIT bit,r8 - ***************************************************************/ -#define BIT(bit,reg) \ - _F = (_F & CF) | HF | SZ_BIT[reg & (1<>8) & (YF|XF)) -#else -#define BIT_XY BIT -#endif - -/*************************************************************** - * RES bit,r8 - ***************************************************************/ -static __inline__ UINT8 RES(UINT8 bit, UINT8 value) -{ - return value & ~(1< flag 5 */ \ - if( (_A + io) & 0x08 ) _F |= XF; /* bit 3 -> flag 3 */ \ - _HL++; _DE++; _BC--; \ - if( _BC ) _F |= VF; \ -} -#else -#define LDI { \ - WM( _DE, RM(_HL) ); \ - _F &= SF | ZF | YF | XF | CF; \ - _HL++; _DE++; _BC--; \ - if( _BC ) _F |= VF; \ -} -#endif - -/*************************************************************** - * CPI - ***************************************************************/ -#if Z80_EXACT -#define CPI { \ - UINT8 val = RM(_HL); \ - UINT8 res = _A - val; \ - _HL++; _BC--; \ - _F = (_F & CF) | (SZ[res] & ~(YF|XF)) | ((_A ^ val ^ res) & HF) | NF; \ - if( _F & HF ) res -= 1; \ - if( res & 0x02 ) _F |= YF; /* bit 1 -> flag 5 */ \ - if( res & 0x08 ) _F |= XF; /* bit 3 -> flag 3 */ \ - if( _BC ) _F |= VF; \ -} -#else -#define CPI { \ - UINT8 val = RM(_HL); \ - UINT8 res = _A - val; \ - _HL++; _BC--; \ - _F = (_F & CF) | SZ[res] | ((_A ^ val ^ res) & HF) | NF; \ - if( _BC ) _F |= VF; \ -} -#endif - -/*************************************************************** - * INI - ***************************************************************/ -#if Z80_EXACT -#define INI { \ - UINT8 io = IN(_BC); \ - _B--; \ - WM( _HL, io ); \ - _HL++; \ - _F = SZ[_B]; \ - if( io & SF ) _F |= NF; \ - if( ( ( (_C + 1) & 0xff) + io) & 0x100 ) _F |= HF | CF; \ - if( (irep_tmp1[_C & 3][io & 3] ^ \ - breg_tmp2[_B] ^ \ - (_C >> 2) ^ \ - (io >> 2)) & 1 ) \ - _F |= PF; \ -} -#else -#define INI { \ - _B--; \ - WM( _HL, IN(_BC) ); \ - _HL++; \ - _F = (_B) ? NF : NF | ZF; \ -} -#endif - -/*************************************************************** - * OUTI - ***************************************************************/ -#if Z80_EXACT -#define OUTI { \ - UINT8 io = RM(_HL); \ - _B--; \ - OUT( _BC, io ); \ - _HL++; \ - _F = SZ[_B]; \ - if( io & SF ) _F |= NF; \ - if( ( ( (_C + 1) & 0xff) + io) & 0x100 ) _F |= HF | CF; \ - if( (irep_tmp1[_C & 3][io & 3] ^ \ - breg_tmp2[_B] ^ \ - (_C >> 2) ^ \ - (io >> 2)) & 1 ) \ - _F |= PF; \ -} -#else -#define OUTI { \ - _B--; \ - OUT( _BC, RM(_HL) ); \ - _HL++; \ - _F = (_B) ? NF : NF | ZF; \ -} -#endif - -/*************************************************************** - * LDD - ***************************************************************/ -#if Z80_EXACT -#define LDD { \ - UINT8 io = RM(_HL); \ - WM( _DE, io ); \ - _F &= SF | ZF | CF; \ - if( (_A + io) & 0x02 ) _F |= YF; /* bit 1 -> flag 5 */ \ - if( (_A + io) & 0x08 ) _F |= XF; /* bit 3 -> flag 3 */ \ - _HL--; _DE--; _BC--; \ - if( _BC ) _F |= VF; \ -} -#else -#define LDD { \ - WM( _DE, RM(_HL) ); \ - _F &= SF | ZF | YF | XF | CF; \ - _HL--; _DE--; _BC--; \ - if( _BC ) _F |= VF; \ -} -#endif - -/*************************************************************** - * CPD - ***************************************************************/ -#if Z80_EXACT -#define CPD { \ - UINT8 val = RM(_HL); \ - UINT8 res = _A - val; \ - _HL--; _BC--; \ - _F = (_F & CF) | (SZ[res] & ~(YF|XF)) | ((_A ^ val ^ res) & HF) | NF; \ - if( _F & HF ) res -= 1; \ - if( res & 0x02 ) _F |= YF; /* bit 1 -> flag 5 */ \ - if( res & 0x08 ) _F |= XF; /* bit 3 -> flag 3 */ \ - if( _BC ) _F |= VF; \ -} -#else -#define CPD { \ - UINT8 val = RM(_HL); \ - UINT8 res = _A - val; \ - _HL--; _BC--; \ - _F = (_F & CF) | SZ[res] | ((_A ^ val ^ res) & HF) | NF; \ - if( _BC ) _F |= VF; \ -} -#endif - -/*************************************************************** - * IND - ***************************************************************/ -#if Z80_EXACT -#define IND { \ - UINT8 io = IN(_BC); \ - _B--; \ - WM( _HL, io ); \ - _HL--; \ - _F = SZ[_B]; \ - if( io & SF ) _F |= NF; \ - if( ( ( (_C - 1) & 0xff) + io) & 0x100 ) _F |= HF | CF; \ - if( (drep_tmp1[_C & 3][io & 3] ^ \ - breg_tmp2[_B] ^ \ - (_C >> 2) ^ \ - (io >> 2)) & 1 ) \ - _F |= PF; \ -} -#else -#define IND { \ - _B--; \ - WM( _HL, IN(_BC) ); \ - _HL--; \ - _F = (_B) ? NF : NF | ZF; \ -} -#endif - -/*************************************************************** - * OUTD - ***************************************************************/ -#if Z80_EXACT -#define OUTD { \ - UINT8 io = RM(_HL); \ - _B--; \ - OUT( _BC, io ); \ - _HL--; \ - _F = SZ[_B]; \ - if( io & SF ) _F |= NF; \ - if( ( ( (_C - 1) & 0xff) + io) & 0x100 ) _F |= HF | CF; \ - if( (drep_tmp1[_C & 3][io & 3] ^ \ - breg_tmp2[_B] ^ \ - (_C >> 2) ^ \ - (io >> 2)) & 1 ) \ - _F |= PF; \ -} -#else -#define OUTD { \ - _B--; \ - OUT( _BC, RM(_HL) ); \ - _HL--; \ - _F = (_B) ? NF : NF | ZF; \ -} -#endif - -/*************************************************************** - * LDIR - ***************************************************************/ -#define LDIR \ - LDI; \ - if( _BC ) \ - { \ - _PC -= 2; \ - CC(ex,0xb0); \ - } - -/*************************************************************** - * CPIR - ***************************************************************/ -#define CPIR \ - CPI; \ - if( _BC && !(_F & ZF) ) \ - { \ - _PC -= 2; \ - CC(ex,0xb1); \ - } - -/*************************************************************** - * INIR - ***************************************************************/ -#define INIR \ - INI; \ - if( _B ) \ - { \ - _PC -= 2; \ - CC(ex,0xb2); \ - } - -/*************************************************************** - * OTIR - ***************************************************************/ -#define OTIR \ - OUTI; \ - if( _B ) \ - { \ - _PC -= 2; \ - CC(ex,0xb3); \ - } - -/*************************************************************** - * LDDR - ***************************************************************/ -#define LDDR \ - LDD; \ - if( _BC ) \ - { \ - _PC -= 2; \ - CC(ex,0xb8); \ - } - -/*************************************************************** - * CPDR - ***************************************************************/ -#define CPDR \ - CPD; \ - if( _BC && !(_F & ZF) ) \ - { \ - _PC -= 2; \ - CC(ex,0xb9); \ - } - -/*************************************************************** - * INDR - ***************************************************************/ -#define INDR \ - IND; \ - if( _B ) \ - { \ - _PC -= 2; \ - CC(ex,0xba); \ - } - -/*************************************************************** - * OTDR - ***************************************************************/ -#define OTDR \ - OUTD; \ - if( _B ) \ - { \ - _PC -= 2; \ - CC(ex,0xbb); \ - } - -/*************************************************************** - * EI - ***************************************************************/ -#define EI { \ - /* If interrupts were disabled, execute one more \ - * instruction and check the IRQ line. \ - * If not, simply set interrupt flip-flop 2 \ - */ \ - if( _IFF1 == 0 ) \ - { \ - _IFF1 = _IFF2 = 1; \ - _PPC = _PCD; \ - _R++; \ - while( cpu_readop(_PCD) == 0xfb ) /* more EIs? */ \ - { \ - CC(op,0xfb); \ - _PPC =_PCD; \ - _PC++; \ - _R++; \ - } \ - if( Z80.irq_state != CLEAR_LINE || \ - Z80.request_irq >= 0 ) \ - { \ - after_EI = 1; /* avoid cycle skip hacks */ \ - EXEC(op,ROP()); \ - after_EI = 0; \ - take_interrupt(); \ - } else EXEC(op,ROP()); \ - } else _IFF2 = 1; \ -} - -/********************************************************** - * opcodes with CB prefix - * rotate, shift and bit operations - **********************************************************/ -OP(cb,00) { _B = RLC(_B); } /* RLC B */ -OP(cb,01) { _C = RLC(_C); } /* RLC C */ -OP(cb,02) { _D = RLC(_D); } /* RLC D */ -OP(cb,03) { _E = RLC(_E); } /* RLC E */ -OP(cb,04) { _H = RLC(_H); } /* RLC H */ -OP(cb,05) { _L = RLC(_L); } /* RLC L */ -OP(cb,06) { WM( _HL, RLC(RM(_HL)) ); } /* RLC (HL) */ -OP(cb,07) { _A = RLC(_A); } /* RLC A */ - -OP(cb,08) { _B = RRC(_B); } /* RRC B */ -OP(cb,09) { _C = RRC(_C); } /* RRC C */ -OP(cb,0a) { _D = RRC(_D); } /* RRC D */ -OP(cb,0b) { _E = RRC(_E); } /* RRC E */ -OP(cb,0c) { _H = RRC(_H); } /* RRC H */ -OP(cb,0d) { _L = RRC(_L); } /* RRC L */ -OP(cb,0e) { WM( _HL, RRC(RM(_HL)) ); } /* RRC (HL) */ -OP(cb,0f) { _A = RRC(_A); } /* RRC A */ - -OP(cb,10) { _B = RL(_B); } /* RL B */ -OP(cb,11) { _C = RL(_C); } /* RL C */ -OP(cb,12) { _D = RL(_D); } /* RL D */ -OP(cb,13) { _E = RL(_E); } /* RL E */ -OP(cb,14) { _H = RL(_H); } /* RL H */ -OP(cb,15) { _L = RL(_L); } /* RL L */ -OP(cb,16) { WM( _HL, RL(RM(_HL)) ); } /* RL (HL) */ -OP(cb,17) { _A = RL(_A); } /* RL A */ - -OP(cb,18) { _B = RR(_B); } /* RR B */ -OP(cb,19) { _C = RR(_C); } /* RR C */ -OP(cb,1a) { _D = RR(_D); } /* RR D */ -OP(cb,1b) { _E = RR(_E); } /* RR E */ -OP(cb,1c) { _H = RR(_H); } /* RR H */ -OP(cb,1d) { _L = RR(_L); } /* RR L */ -OP(cb,1e) { WM( _HL, RR(RM(_HL)) ); } /* RR (HL) */ -OP(cb,1f) { _A = RR(_A); } /* RR A */ - -OP(cb,20) { _B = SLA(_B); } /* SLA B */ -OP(cb,21) { _C = SLA(_C); } /* SLA C */ -OP(cb,22) { _D = SLA(_D); } /* SLA D */ -OP(cb,23) { _E = SLA(_E); } /* SLA E */ -OP(cb,24) { _H = SLA(_H); } /* SLA H */ -OP(cb,25) { _L = SLA(_L); } /* SLA L */ -OP(cb,26) { WM( _HL, SLA(RM(_HL)) ); } /* SLA (HL) */ -OP(cb,27) { _A = SLA(_A); } /* SLA A */ - -OP(cb,28) { _B = SRA(_B); } /* SRA B */ -OP(cb,29) { _C = SRA(_C); } /* SRA C */ -OP(cb,2a) { _D = SRA(_D); } /* SRA D */ -OP(cb,2b) { _E = SRA(_E); } /* SRA E */ -OP(cb,2c) { _H = SRA(_H); } /* SRA H */ -OP(cb,2d) { _L = SRA(_L); } /* SRA L */ -OP(cb,2e) { WM( _HL, SRA(RM(_HL)) ); } /* SRA (HL) */ -OP(cb,2f) { _A = SRA(_A); } /* SRA A */ - -OP(cb,30) { _B = SLL(_B); } /* SLL B */ -OP(cb,31) { _C = SLL(_C); } /* SLL C */ -OP(cb,32) { _D = SLL(_D); } /* SLL D */ -OP(cb,33) { _E = SLL(_E); } /* SLL E */ -OP(cb,34) { _H = SLL(_H); } /* SLL H */ -OP(cb,35) { _L = SLL(_L); } /* SLL L */ -OP(cb,36) { WM( _HL, SLL(RM(_HL)) ); } /* SLL (HL) */ -OP(cb,37) { _A = SLL(_A); } /* SLL A */ - -OP(cb,38) { _B = SRL(_B); } /* SRL B */ -OP(cb,39) { _C = SRL(_C); } /* SRL C */ -OP(cb,3a) { _D = SRL(_D); } /* SRL D */ -OP(cb,3b) { _E = SRL(_E); } /* SRL E */ -OP(cb,3c) { _H = SRL(_H); } /* SRL H */ -OP(cb,3d) { _L = SRL(_L); } /* SRL L */ -OP(cb,3e) { WM( _HL, SRL(RM(_HL)) ); } /* SRL (HL) */ -OP(cb,3f) { _A = SRL(_A); } /* SRL A */ - -OP(cb,40) { BIT(0,_B); } /* BIT 0,B */ -OP(cb,41) { BIT(0,_C); } /* BIT 0,C */ -OP(cb,42) { BIT(0,_D); } /* BIT 0,D */ -OP(cb,43) { BIT(0,_E); } /* BIT 0,E */ -OP(cb,44) { BIT(0,_H); } /* BIT 0,H */ -OP(cb,45) { BIT(0,_L); } /* BIT 0,L */ -OP(cb,46) { BIT(0,RM(_HL)); } /* BIT 0,(HL) */ -OP(cb,47) { BIT(0,_A); } /* BIT 0,A */ - -OP(cb,48) { BIT(1,_B); } /* BIT 1,B */ -OP(cb,49) { BIT(1,_C); } /* BIT 1,C */ -OP(cb,4a) { BIT(1,_D); } /* BIT 1,D */ -OP(cb,4b) { BIT(1,_E); } /* BIT 1,E */ -OP(cb,4c) { BIT(1,_H); } /* BIT 1,H */ -OP(cb,4d) { BIT(1,_L); } /* BIT 1,L */ -OP(cb,4e) { BIT(1,RM(_HL)); } /* BIT 1,(HL) */ -OP(cb,4f) { BIT(1,_A); } /* BIT 1,A */ - -OP(cb,50) { BIT(2,_B); } /* BIT 2,B */ -OP(cb,51) { BIT(2,_C); } /* BIT 2,C */ -OP(cb,52) { BIT(2,_D); } /* BIT 2,D */ -OP(cb,53) { BIT(2,_E); } /* BIT 2,E */ -OP(cb,54) { BIT(2,_H); } /* BIT 2,H */ -OP(cb,55) { BIT(2,_L); } /* BIT 2,L */ -OP(cb,56) { BIT(2,RM(_HL)); } /* BIT 2,(HL) */ -OP(cb,57) { BIT(2,_A); } /* BIT 2,A */ - -OP(cb,58) { BIT(3,_B); } /* BIT 3,B */ -OP(cb,59) { BIT(3,_C); } /* BIT 3,C */ -OP(cb,5a) { BIT(3,_D); } /* BIT 3,D */ -OP(cb,5b) { BIT(3,_E); } /* BIT 3,E */ -OP(cb,5c) { BIT(3,_H); } /* BIT 3,H */ -OP(cb,5d) { BIT(3,_L); } /* BIT 3,L */ -OP(cb,5e) { BIT(3,RM(_HL)); } /* BIT 3,(HL) */ -OP(cb,5f) { BIT(3,_A); } /* BIT 3,A */ - -OP(cb,60) { BIT(4,_B); } /* BIT 4,B */ -OP(cb,61) { BIT(4,_C); } /* BIT 4,C */ -OP(cb,62) { BIT(4,_D); } /* BIT 4,D */ -OP(cb,63) { BIT(4,_E); } /* BIT 4,E */ -OP(cb,64) { BIT(4,_H); } /* BIT 4,H */ -OP(cb,65) { BIT(4,_L); } /* BIT 4,L */ -OP(cb,66) { BIT(4,RM(_HL)); } /* BIT 4,(HL) */ -OP(cb,67) { BIT(4,_A); } /* BIT 4,A */ - -OP(cb,68) { BIT(5,_B); } /* BIT 5,B */ -OP(cb,69) { BIT(5,_C); } /* BIT 5,C */ -OP(cb,6a) { BIT(5,_D); } /* BIT 5,D */ -OP(cb,6b) { BIT(5,_E); } /* BIT 5,E */ -OP(cb,6c) { BIT(5,_H); } /* BIT 5,H */ -OP(cb,6d) { BIT(5,_L); } /* BIT 5,L */ -OP(cb,6e) { BIT(5,RM(_HL)); } /* BIT 5,(HL) */ -OP(cb,6f) { BIT(5,_A); } /* BIT 5,A */ - -OP(cb,70) { BIT(6,_B); } /* BIT 6,B */ -OP(cb,71) { BIT(6,_C); } /* BIT 6,C */ -OP(cb,72) { BIT(6,_D); } /* BIT 6,D */ -OP(cb,73) { BIT(6,_E); } /* BIT 6,E */ -OP(cb,74) { BIT(6,_H); } /* BIT 6,H */ -OP(cb,75) { BIT(6,_L); } /* BIT 6,L */ -OP(cb,76) { BIT(6,RM(_HL)); } /* BIT 6,(HL) */ -OP(cb,77) { BIT(6,_A); } /* BIT 6,A */ - -OP(cb,78) { BIT(7,_B); } /* BIT 7,B */ -OP(cb,79) { BIT(7,_C); } /* BIT 7,C */ -OP(cb,7a) { BIT(7,_D); } /* BIT 7,D */ -OP(cb,7b) { BIT(7,_E); } /* BIT 7,E */ -OP(cb,7c) { BIT(7,_H); } /* BIT 7,H */ -OP(cb,7d) { BIT(7,_L); } /* BIT 7,L */ -OP(cb,7e) { BIT(7,RM(_HL)); } /* BIT 7,(HL) */ -OP(cb,7f) { BIT(7,_A); } /* BIT 7,A */ - -OP(cb,80) { _B = RES(0,_B); } /* RES 0,B */ -OP(cb,81) { _C = RES(0,_C); } /* RES 0,C */ -OP(cb,82) { _D = RES(0,_D); } /* RES 0,D */ -OP(cb,83) { _E = RES(0,_E); } /* RES 0,E */ -OP(cb,84) { _H = RES(0,_H); } /* RES 0,H */ -OP(cb,85) { _L = RES(0,_L); } /* RES 0,L */ -OP(cb,86) { WM( _HL, RES(0,RM(_HL)) ); } /* RES 0,(HL) */ -OP(cb,87) { _A = RES(0,_A); } /* RES 0,A */ - -OP(cb,88) { _B = RES(1,_B); } /* RES 1,B */ -OP(cb,89) { _C = RES(1,_C); } /* RES 1,C */ -OP(cb,8a) { _D = RES(1,_D); } /* RES 1,D */ -OP(cb,8b) { _E = RES(1,_E); } /* RES 1,E */ -OP(cb,8c) { _H = RES(1,_H); } /* RES 1,H */ -OP(cb,8d) { _L = RES(1,_L); } /* RES 1,L */ -OP(cb,8e) { WM( _HL, RES(1,RM(_HL)) ); } /* RES 1,(HL) */ -OP(cb,8f) { _A = RES(1,_A); } /* RES 1,A */ - -OP(cb,90) { _B = RES(2,_B); } /* RES 2,B */ -OP(cb,91) { _C = RES(2,_C); } /* RES 2,C */ -OP(cb,92) { _D = RES(2,_D); } /* RES 2,D */ -OP(cb,93) { _E = RES(2,_E); } /* RES 2,E */ -OP(cb,94) { _H = RES(2,_H); } /* RES 2,H */ -OP(cb,95) { _L = RES(2,_L); } /* RES 2,L */ -OP(cb,96) { WM( _HL, RES(2,RM(_HL)) ); } /* RES 2,(HL) */ -OP(cb,97) { _A = RES(2,_A); } /* RES 2,A */ - -OP(cb,98) { _B = RES(3,_B); } /* RES 3,B */ -OP(cb,99) { _C = RES(3,_C); } /* RES 3,C */ -OP(cb,9a) { _D = RES(3,_D); } /* RES 3,D */ -OP(cb,9b) { _E = RES(3,_E); } /* RES 3,E */ -OP(cb,9c) { _H = RES(3,_H); } /* RES 3,H */ -OP(cb,9d) { _L = RES(3,_L); } /* RES 3,L */ -OP(cb,9e) { WM( _HL, RES(3,RM(_HL)) ); } /* RES 3,(HL) */ -OP(cb,9f) { _A = RES(3,_A); } /* RES 3,A */ - -OP(cb,a0) { _B = RES(4,_B); } /* RES 4,B */ -OP(cb,a1) { _C = RES(4,_C); } /* RES 4,C */ -OP(cb,a2) { _D = RES(4,_D); } /* RES 4,D */ -OP(cb,a3) { _E = RES(4,_E); } /* RES 4,E */ -OP(cb,a4) { _H = RES(4,_H); } /* RES 4,H */ -OP(cb,a5) { _L = RES(4,_L); } /* RES 4,L */ -OP(cb,a6) { WM( _HL, RES(4,RM(_HL)) ); } /* RES 4,(HL) */ -OP(cb,a7) { _A = RES(4,_A); } /* RES 4,A */ - -OP(cb,a8) { _B = RES(5,_B); } /* RES 5,B */ -OP(cb,a9) { _C = RES(5,_C); } /* RES 5,C */ -OP(cb,aa) { _D = RES(5,_D); } /* RES 5,D */ -OP(cb,ab) { _E = RES(5,_E); } /* RES 5,E */ -OP(cb,ac) { _H = RES(5,_H); } /* RES 5,H */ -OP(cb,ad) { _L = RES(5,_L); } /* RES 5,L */ -OP(cb,ae) { WM( _HL, RES(5,RM(_HL)) ); } /* RES 5,(HL) */ -OP(cb,af) { _A = RES(5,_A); } /* RES 5,A */ - -OP(cb,b0) { _B = RES(6,_B); } /* RES 6,B */ -OP(cb,b1) { _C = RES(6,_C); } /* RES 6,C */ -OP(cb,b2) { _D = RES(6,_D); } /* RES 6,D */ -OP(cb,b3) { _E = RES(6,_E); } /* RES 6,E */ -OP(cb,b4) { _H = RES(6,_H); } /* RES 6,H */ -OP(cb,b5) { _L = RES(6,_L); } /* RES 6,L */ -OP(cb,b6) { WM( _HL, RES(6,RM(_HL)) ); } /* RES 6,(HL) */ -OP(cb,b7) { _A = RES(6,_A); } /* RES 6,A */ - -OP(cb,b8) { _B = RES(7,_B); } /* RES 7,B */ -OP(cb,b9) { _C = RES(7,_C); } /* RES 7,C */ -OP(cb,ba) { _D = RES(7,_D); } /* RES 7,D */ -OP(cb,bb) { _E = RES(7,_E); } /* RES 7,E */ -OP(cb,bc) { _H = RES(7,_H); } /* RES 7,H */ -OP(cb,bd) { _L = RES(7,_L); } /* RES 7,L */ -OP(cb,be) { WM( _HL, RES(7,RM(_HL)) ); } /* RES 7,(HL) */ -OP(cb,bf) { _A = RES(7,_A); } /* RES 7,A */ - -OP(cb,c0) { _B = SET(0,_B); } /* SET 0,B */ -OP(cb,c1) { _C = SET(0,_C); } /* SET 0,C */ -OP(cb,c2) { _D = SET(0,_D); } /* SET 0,D */ -OP(cb,c3) { _E = SET(0,_E); } /* SET 0,E */ -OP(cb,c4) { _H = SET(0,_H); } /* SET 0,H */ -OP(cb,c5) { _L = SET(0,_L); } /* SET 0,L */ -OP(cb,c6) { WM( _HL, SET(0,RM(_HL)) ); } /* SET 0,(HL) */ -OP(cb,c7) { _A = SET(0,_A); } /* SET 0,A */ - -OP(cb,c8) { _B = SET(1,_B); } /* SET 1,B */ -OP(cb,c9) { _C = SET(1,_C); } /* SET 1,C */ -OP(cb,ca) { _D = SET(1,_D); } /* SET 1,D */ -OP(cb,cb) { _E = SET(1,_E); } /* SET 1,E */ -OP(cb,cc) { _H = SET(1,_H); } /* SET 1,H */ -OP(cb,cd) { _L = SET(1,_L); } /* SET 1,L */ -OP(cb,ce) { WM( _HL, SET(1,RM(_HL)) ); } /* SET 1,(HL) */ -OP(cb,cf) { _A = SET(1,_A); } /* SET 1,A */ - -OP(cb,d0) { _B = SET(2,_B); } /* SET 2,B */ -OP(cb,d1) { _C = SET(2,_C); } /* SET 2,C */ -OP(cb,d2) { _D = SET(2,_D); } /* SET 2,D */ -OP(cb,d3) { _E = SET(2,_E); } /* SET 2,E */ -OP(cb,d4) { _H = SET(2,_H); } /* SET 2,H */ -OP(cb,d5) { _L = SET(2,_L); } /* SET 2,L */ -OP(cb,d6) { WM( _HL, SET(2,RM(_HL)) ); }/* SET 2,(HL) */ -OP(cb,d7) { _A = SET(2,_A); } /* SET 2,A */ - -OP(cb,d8) { _B = SET(3,_B); } /* SET 3,B */ -OP(cb,d9) { _C = SET(3,_C); } /* SET 3,C */ -OP(cb,da) { _D = SET(3,_D); } /* SET 3,D */ -OP(cb,db) { _E = SET(3,_E); } /* SET 3,E */ -OP(cb,dc) { _H = SET(3,_H); } /* SET 3,H */ -OP(cb,dd) { _L = SET(3,_L); } /* SET 3,L */ -OP(cb,de) { WM( _HL, SET(3,RM(_HL)) ); } /* SET 3,(HL) */ -OP(cb,df) { _A = SET(3,_A); } /* SET 3,A */ - -OP(cb,e0) { _B = SET(4,_B); } /* SET 4,B */ -OP(cb,e1) { _C = SET(4,_C); } /* SET 4,C */ -OP(cb,e2) { _D = SET(4,_D); } /* SET 4,D */ -OP(cb,e3) { _E = SET(4,_E); } /* SET 4,E */ -OP(cb,e4) { _H = SET(4,_H); } /* SET 4,H */ -OP(cb,e5) { _L = SET(4,_L); } /* SET 4,L */ -OP(cb,e6) { WM( _HL, SET(4,RM(_HL)) ); } /* SET 4,(HL) */ -OP(cb,e7) { _A = SET(4,_A); } /* SET 4,A */ - -OP(cb,e8) { _B = SET(5,_B); } /* SET 5,B */ -OP(cb,e9) { _C = SET(5,_C); } /* SET 5,C */ -OP(cb,ea) { _D = SET(5,_D); } /* SET 5,D */ -OP(cb,eb) { _E = SET(5,_E); } /* SET 5,E */ -OP(cb,ec) { _H = SET(5,_H); } /* SET 5,H */ -OP(cb,ed) { _L = SET(5,_L); } /* SET 5,L */ -OP(cb,ee) { WM( _HL, SET(5,RM(_HL)) ); } /* SET 5,(HL) */ -OP(cb,ef) { _A = SET(5,_A); } /* SET 5,A */ - -OP(cb,f0) { _B = SET(6,_B); } /* SET 6,B */ -OP(cb,f1) { _C = SET(6,_C); } /* SET 6,C */ -OP(cb,f2) { _D = SET(6,_D); } /* SET 6,D */ -OP(cb,f3) { _E = SET(6,_E); } /* SET 6,E */ -OP(cb,f4) { _H = SET(6,_H); } /* SET 6,H */ -OP(cb,f5) { _L = SET(6,_L); } /* SET 6,L */ -OP(cb,f6) { WM( _HL, SET(6,RM(_HL)) ); } /* SET 6,(HL) */ -OP(cb,f7) { _A = SET(6,_A); } /* SET 6,A */ - -OP(cb,f8) { _B = SET(7,_B); } /* SET 7,B */ -OP(cb,f9) { _C = SET(7,_C); } /* SET 7,C */ -OP(cb,fa) { _D = SET(7,_D); } /* SET 7,D */ -OP(cb,fb) { _E = SET(7,_E); } /* SET 7,E */ -OP(cb,fc) { _H = SET(7,_H); } /* SET 7,H */ -OP(cb,fd) { _L = SET(7,_L); } /* SET 7,L */ -OP(cb,fe) { WM( _HL, SET(7,RM(_HL)) ); } /* SET 7,(HL) */ -OP(cb,ff) { _A = SET(7,_A); } /* SET 7,A */ - - -/********************************************************** -* opcodes with DD/FD CB prefix -* rotate, shift and bit operations with (IX+o) -**********************************************************/ -OP(xycb,00) { _B = RLC( RM(EA) ); WM( EA,_B ); } /* RLC B=(XY+o) */ -OP(xycb,01) { _C = RLC( RM(EA) ); WM( EA,_C ); } /* RLC C=(XY+o) */ -OP(xycb,02) { _D = RLC( RM(EA) ); WM( EA,_D ); } /* RLC D=(XY+o) */ -OP(xycb,03) { _E = RLC( RM(EA) ); WM( EA,_E ); } /* RLC E=(XY+o) */ -OP(xycb,04) { _H = RLC( RM(EA) ); WM( EA,_H ); } /* RLC H=(XY+o) */ -OP(xycb,05) { _L = RLC( RM(EA) ); WM( EA,_L ); } /* RLC L=(XY+o) */ -OP(xycb,06) { WM( EA, RLC( RM(EA) ) ); } /* RLC (XY+o) */ -OP(xycb,07) { _A = RLC( RM(EA) ); WM( EA,_A ); } /* RLC A=(XY+o) */ - -OP(xycb,08) { _B = RRC( RM(EA) ); WM( EA,_B ); } /* RRC B=(XY+o) */ -OP(xycb,09) { _C = RRC( RM(EA) ); WM( EA,_C ); } /* RRC C=(XY+o) */ -OP(xycb,0a) { _D = RRC( RM(EA) ); WM( EA,_D ); } /* RRC D=(XY+o) */ -OP(xycb,0b) { _E = RRC( RM(EA) ); WM( EA,_E ); } /* RRC E=(XY+o) */ -OP(xycb,0c) { _H = RRC( RM(EA) ); WM( EA,_H ); } /* RRC H=(XY+o) */ -OP(xycb,0d) { _L = RRC( RM(EA) ); WM( EA,_L ); } /* RRC L=(XY+o) */ -OP(xycb,0e) { WM( EA,RRC( RM(EA) ) ); } /* RRC (XY+o) */ -OP(xycb,0f) { _A = RRC( RM(EA) ); WM( EA,_A ); } /* RRC A=(XY+o) */ - -OP(xycb,10) { _B = RL( RM(EA) ); WM( EA,_B ); } /* RL B=(XY+o) */ -OP(xycb,11) { _C = RL( RM(EA) ); WM( EA,_C ); } /* RL C=(XY+o) */ -OP(xycb,12) { _D = RL( RM(EA) ); WM( EA,_D ); } /* RL D=(XY+o) */ -OP(xycb,13) { _E = RL( RM(EA) ); WM( EA,_E ); } /* RL E=(XY+o) */ -OP(xycb,14) { _H = RL( RM(EA) ); WM( EA,_H ); } /* RL H=(XY+o) */ -OP(xycb,15) { _L = RL( RM(EA) ); WM( EA,_L ); } /* RL L=(XY+o) */ -OP(xycb,16) { WM( EA,RL( RM(EA) ) ); } /* RL (XY+o) */ -OP(xycb,17) { _A = RL( RM(EA) ); WM( EA,_A ); } /* RL A=(XY+o) */ - -OP(xycb,18) { _B = RR( RM(EA) ); WM( EA,_B ); } /* RR B=(XY+o) */ -OP(xycb,19) { _C = RR( RM(EA) ); WM( EA,_C ); } /* RR C=(XY+o) */ -OP(xycb,1a) { _D = RR( RM(EA) ); WM( EA,_D ); } /* RR D=(XY+o) */ -OP(xycb,1b) { _E = RR( RM(EA) ); WM( EA,_E ); } /* RR E=(XY+o) */ -OP(xycb,1c) { _H = RR( RM(EA) ); WM( EA,_H ); } /* RR H=(XY+o) */ -OP(xycb,1d) { _L = RR( RM(EA) ); WM( EA,_L ); } /* RR L=(XY+o) */ -OP(xycb,1e) { WM( EA,RR( RM(EA) ) ); } /* RR (XY+o) */ -OP(xycb,1f) { _A = RR( RM(EA) ); WM( EA,_A ); } /* RR A=(XY+o) */ - -OP(xycb,20) { _B = SLA( RM(EA) ); WM( EA,_B ); } /* SLA B=(XY+o) */ -OP(xycb,21) { _C = SLA( RM(EA) ); WM( EA,_C ); } /* SLA C=(XY+o) */ -OP(xycb,22) { _D = SLA( RM(EA) ); WM( EA,_D ); } /* SLA D=(XY+o) */ -OP(xycb,23) { _E = SLA( RM(EA) ); WM( EA,_E ); } /* SLA E=(XY+o) */ -OP(xycb,24) { _H = SLA( RM(EA) ); WM( EA,_H ); } /* SLA H=(XY+o) */ -OP(xycb,25) { _L = SLA( RM(EA) ); WM( EA,_L ); } /* SLA L=(XY+o) */ -OP(xycb,26) { WM( EA,SLA( RM(EA) ) ); } /* SLA (XY+o) */ -OP(xycb,27) { _A = SLA( RM(EA) ); WM( EA,_A ); } /* SLA A=(XY+o) */ - -OP(xycb,28) { _B = SRA( RM(EA) ); WM( EA,_B ); } /* SRA B=(XY+o) */ -OP(xycb,29) { _C = SRA( RM(EA) ); WM( EA,_C ); } /* SRA C=(XY+o) */ -OP(xycb,2a) { _D = SRA( RM(EA) ); WM( EA,_D ); } /* SRA D=(XY+o) */ -OP(xycb,2b) { _E = SRA( RM(EA) ); WM( EA,_E ); } /* SRA E=(XY+o) */ -OP(xycb,2c) { _H = SRA( RM(EA) ); WM( EA,_H ); } /* SRA H=(XY+o) */ -OP(xycb,2d) { _L = SRA( RM(EA) ); WM( EA,_L ); } /* SRA L=(XY+o) */ -OP(xycb,2e) { WM( EA,SRA( RM(EA) ) ); } /* SRA (XY+o) */ -OP(xycb,2f) { _A = SRA( RM(EA) ); WM( EA,_A ); } /* SRA A=(XY+o) */ - -OP(xycb,30) { _B = SLL( RM(EA) ); WM( EA,_B ); } /* SLL B=(XY+o) */ -OP(xycb,31) { _C = SLL( RM(EA) ); WM( EA,_C ); } /* SLL C=(XY+o) */ -OP(xycb,32) { _D = SLL( RM(EA) ); WM( EA,_D ); } /* SLL D=(XY+o) */ -OP(xycb,33) { _E = SLL( RM(EA) ); WM( EA,_E ); } /* SLL E=(XY+o) */ -OP(xycb,34) { _H = SLL( RM(EA) ); WM( EA,_H ); } /* SLL H=(XY+o) */ -OP(xycb,35) { _L = SLL( RM(EA) ); WM( EA,_L ); } /* SLL L=(XY+o) */ -OP(xycb,36) { WM( EA,SLL( RM(EA) ) ); } /* SLL (XY+o) */ -OP(xycb,37) { _A = SLL( RM(EA) ); WM( EA,_A ); } /* SLL A=(XY+o) */ - -OP(xycb,38) { _B = SRL( RM(EA) ); WM( EA,_B ); } /* SRL B=(XY+o) */ -OP(xycb,39) { _C = SRL( RM(EA) ); WM( EA,_C ); } /* SRL C=(XY+o) */ -OP(xycb,3a) { _D = SRL( RM(EA) ); WM( EA,_D ); } /* SRL D=(XY+o) */ -OP(xycb,3b) { _E = SRL( RM(EA) ); WM( EA,_E ); } /* SRL E=(XY+o) */ -OP(xycb,3c) { _H = SRL( RM(EA) ); WM( EA,_H ); } /* SRL H=(XY+o) */ -OP(xycb,3d) { _L = SRL( RM(EA) ); WM( EA,_L ); } /* SRL L=(XY+o) */ -OP(xycb,3e) { WM( EA,SRL( RM(EA) ) ); } /* SRL (XY+o) */ -OP(xycb,3f) { _A = SRL( RM(EA) ); WM( EA,_A ); } /* SRL A=(XY+o) */ - -OP(xycb,40) { xycb_46(); } /* BIT 0,B=(XY+o) */ -OP(xycb,41) { xycb_46(); } /* BIT 0,C=(XY+o) */ -OP(xycb,42) { xycb_46(); } /* BIT 0,D=(XY+o) */ -OP(xycb,43) { xycb_46(); } /* BIT 0,E=(XY+o) */ -OP(xycb,44) { xycb_46(); } /* BIT 0,H=(XY+o) */ -OP(xycb,45) { xycb_46(); } /* BIT 0,L=(XY+o) */ -OP(xycb,46) { BIT_XY(0,RM(EA)); } /* BIT 0,(XY+o) */ -OP(xycb,47) { xycb_46(); } /* BIT 0,A=(XY+o) */ - -OP(xycb,48) { xycb_4e(); } /* BIT 1,B=(XY+o) */ -OP(xycb,49) { xycb_4e(); } /* BIT 1,C=(XY+o) */ -OP(xycb,4a) { xycb_4e(); } /* BIT 1,D=(XY+o) */ -OP(xycb,4b) { xycb_4e(); } /* BIT 1,E=(XY+o) */ -OP(xycb,4c) { xycb_4e(); } /* BIT 1,H=(XY+o) */ -OP(xycb,4d) { xycb_4e(); } /* BIT 1,L=(XY+o) */ -OP(xycb,4e) { BIT_XY(1,RM(EA)); } /* BIT 1,(XY+o) */ -OP(xycb,4f) { xycb_4e(); } /* BIT 1,A=(XY+o) */ - -OP(xycb,50) { xycb_56(); } /* BIT 2,B=(XY+o) */ -OP(xycb,51) { xycb_56(); } /* BIT 2,C=(XY+o) */ -OP(xycb,52) { xycb_56(); } /* BIT 2,D=(XY+o) */ -OP(xycb,53) { xycb_56(); } /* BIT 2,E=(XY+o) */ -OP(xycb,54) { xycb_56(); } /* BIT 2,H=(XY+o) */ -OP(xycb,55) { xycb_56(); } /* BIT 2,L=(XY+o) */ -OP(xycb,56) { BIT_XY(2,RM(EA)); } /* BIT 2,(XY+o) */ -OP(xycb,57) { xycb_56(); } /* BIT 2,A=(XY+o) */ - -OP(xycb,58) { xycb_5e(); } /* BIT 3,B=(XY+o) */ -OP(xycb,59) { xycb_5e(); } /* BIT 3,C=(XY+o) */ -OP(xycb,5a) { xycb_5e(); } /* BIT 3,D=(XY+o) */ -OP(xycb,5b) { xycb_5e(); } /* BIT 3,E=(XY+o) */ -OP(xycb,5c) { xycb_5e(); } /* BIT 3,H=(XY+o) */ -OP(xycb,5d) { xycb_5e(); } /* BIT 3,L=(XY+o) */ -OP(xycb,5e) { BIT_XY(3,RM(EA)); } /* BIT 3,(XY+o) */ -OP(xycb,5f) { xycb_5e(); } /* BIT 3,A=(XY+o) */ - -OP(xycb,60) { xycb_66(); } /* BIT 4,B=(XY+o) */ -OP(xycb,61) { xycb_66(); } /* BIT 4,C=(XY+o) */ -OP(xycb,62) { xycb_66(); } /* BIT 4,D=(XY+o) */ -OP(xycb,63) { xycb_66(); } /* BIT 4,E=(XY+o) */ -OP(xycb,64) { xycb_66(); } /* BIT 4,H=(XY+o) */ -OP(xycb,65) { xycb_66(); } /* BIT 4,L=(XY+o) */ -OP(xycb,66) { BIT_XY(4,RM(EA)); } /* BIT 4,(XY+o) */ -OP(xycb,67) { xycb_66(); } /* BIT 4,A=(XY+o) */ - -OP(xycb,68) { xycb_6e(); } /* BIT 5,B=(XY+o) */ -OP(xycb,69) { xycb_6e(); } /* BIT 5,C=(XY+o) */ -OP(xycb,6a) { xycb_6e(); } /* BIT 5,D=(XY+o) */ -OP(xycb,6b) { xycb_6e(); } /* BIT 5,E=(XY+o) */ -OP(xycb,6c) { xycb_6e(); } /* BIT 5,H=(XY+o) */ -OP(xycb,6d) { xycb_6e(); } /* BIT 5,L=(XY+o) */ -OP(xycb,6e) { BIT_XY(5,RM(EA)); } /* BIT 5,(XY+o) */ -OP(xycb,6f) { xycb_6e(); } /* BIT 5,A=(XY+o) */ - -OP(xycb,70) { xycb_76(); } /* BIT 6,B=(XY+o) */ -OP(xycb,71) { xycb_76(); } /* BIT 6,C=(XY+o) */ -OP(xycb,72) { xycb_76(); } /* BIT 6,D=(XY+o) */ -OP(xycb,73) { xycb_76(); } /* BIT 6,E=(XY+o) */ -OP(xycb,74) { xycb_76(); } /* BIT 6,H=(XY+o) */ -OP(xycb,75) { xycb_76(); } /* BIT 6,L=(XY+o) */ -OP(xycb,76) { BIT_XY(6,RM(EA)); } /* BIT 6,(XY+o) */ -OP(xycb,77) { xycb_76(); } /* BIT 6,A=(XY+o) */ - -OP(xycb,78) { xycb_7e(); } /* BIT 7,B=(XY+o) */ -OP(xycb,79) { xycb_7e(); } /* BIT 7,C=(XY+o) */ -OP(xycb,7a) { xycb_7e(); } /* BIT 7,D=(XY+o) */ -OP(xycb,7b) { xycb_7e(); } /* BIT 7,E=(XY+o) */ -OP(xycb,7c) { xycb_7e(); } /* BIT 7,H=(XY+o) */ -OP(xycb,7d) { xycb_7e(); } /* BIT 7,L=(XY+o) */ -OP(xycb,7e) { BIT_XY(7,RM(EA)); } /* BIT 7,(XY+o) */ -OP(xycb,7f) { xycb_7e(); } /* BIT 7,A=(XY+o) */ - -OP(xycb,80) { _B = RES(0, RM(EA) ); WM( EA,_B ); } /* RES 0,B=(XY+o) */ -OP(xycb,81) { _C = RES(0, RM(EA) ); WM( EA,_C ); } /* RES 0,C=(XY+o) */ -OP(xycb,82) { _D = RES(0, RM(EA) ); WM( EA,_D ); } /* RES 0,D=(XY+o) */ -OP(xycb,83) { _E = RES(0, RM(EA) ); WM( EA,_E ); } /* RES 0,E=(XY+o) */ -OP(xycb,84) { _H = RES(0, RM(EA) ); WM( EA,_H ); } /* RES 0,H=(XY+o) */ -OP(xycb,85) { _L = RES(0, RM(EA) ); WM( EA,_L ); } /* RES 0,L=(XY+o) */ -OP(xycb,86) { WM( EA, RES(0,RM(EA)) ); } /* RES 0,(XY+o) */ -OP(xycb,87) { _A = RES(0, RM(EA) ); WM( EA,_A ); } /* RES 0,A=(XY+o) */ - -OP(xycb,88) { _B = RES(1, RM(EA) ); WM( EA,_B ); } /* RES 1,B=(XY+o) */ -OP(xycb,89) { _C = RES(1, RM(EA) ); WM( EA,_C ); } /* RES 1,C=(XY+o) */ -OP(xycb,8a) { _D = RES(1, RM(EA) ); WM( EA,_D ); } /* RES 1,D=(XY+o) */ -OP(xycb,8b) { _E = RES(1, RM(EA) ); WM( EA,_E ); } /* RES 1,E=(XY+o) */ -OP(xycb,8c) { _H = RES(1, RM(EA) ); WM( EA,_H ); } /* RES 1,H=(XY+o) */ -OP(xycb,8d) { _L = RES(1, RM(EA) ); WM( EA,_L ); } /* RES 1,L=(XY+o) */ -OP(xycb,8e) { WM( EA, RES(1,RM(EA)) ); } /* RES 1,(XY+o) */ -OP(xycb,8f) { _A = RES(1, RM(EA) ); WM( EA,_A ); } /* RES 1,A=(XY+o) */ - -OP(xycb,90) { _B = RES(2, RM(EA) ); WM( EA,_B ); } /* RES 2,B=(XY+o) */ -OP(xycb,91) { _C = RES(2, RM(EA) ); WM( EA,_C ); } /* RES 2,C=(XY+o) */ -OP(xycb,92) { _D = RES(2, RM(EA) ); WM( EA,_D ); } /* RES 2,D=(XY+o) */ -OP(xycb,93) { _E = RES(2, RM(EA) ); WM( EA,_E ); } /* RES 2,E=(XY+o) */ -OP(xycb,94) { _H = RES(2, RM(EA) ); WM( EA,_H ); } /* RES 2,H=(XY+o) */ -OP(xycb,95) { _L = RES(2, RM(EA) ); WM( EA,_L ); } /* RES 2,L=(XY+o) */ -OP(xycb,96) { WM( EA, RES(2,RM(EA)) ); } /* RES 2,(XY+o) */ -OP(xycb,97) { _A = RES(2, RM(EA) ); WM( EA,_A ); } /* RES 2,A=(XY+o) */ - -OP(xycb,98) { _B = RES(3, RM(EA) ); WM( EA,_B ); } /* RES 3,B=(XY+o) */ -OP(xycb,99) { _C = RES(3, RM(EA) ); WM( EA,_C ); } /* RES 3,C=(XY+o) */ -OP(xycb,9a) { _D = RES(3, RM(EA) ); WM( EA,_D ); } /* RES 3,D=(XY+o) */ -OP(xycb,9b) { _E = RES(3, RM(EA) ); WM( EA,_E ); } /* RES 3,E=(XY+o) */ -OP(xycb,9c) { _H = RES(3, RM(EA) ); WM( EA,_H ); } /* RES 3,H=(XY+o) */ -OP(xycb,9d) { _L = RES(3, RM(EA) ); WM( EA,_L ); } /* RES 3,L=(XY+o) */ -OP(xycb,9e) { WM( EA, RES(3,RM(EA)) ); } /* RES 3,(XY+o) */ -OP(xycb,9f) { _A = RES(3, RM(EA) ); WM( EA,_A ); } /* RES 3,A=(XY+o) */ - -OP(xycb,a0) { _B = RES(4, RM(EA) ); WM( EA,_B ); } /* RES 4,B=(XY+o) */ -OP(xycb,a1) { _C = RES(4, RM(EA) ); WM( EA,_C ); } /* RES 4,C=(XY+o) */ -OP(xycb,a2) { _D = RES(4, RM(EA) ); WM( EA,_D ); } /* RES 4,D=(XY+o) */ -OP(xycb,a3) { _E = RES(4, RM(EA) ); WM( EA,_E ); } /* RES 4,E=(XY+o) */ -OP(xycb,a4) { _H = RES(4, RM(EA) ); WM( EA,_H ); } /* RES 4,H=(XY+o) */ -OP(xycb,a5) { _L = RES(4, RM(EA) ); WM( EA,_L ); } /* RES 4,L=(XY+o) */ -OP(xycb,a6) { WM( EA, RES(4,RM(EA)) ); } /* RES 4,(XY+o) */ -OP(xycb,a7) { _A = RES(4, RM(EA) ); WM( EA,_A ); } /* RES 4,A=(XY+o) */ - -OP(xycb,a8) { _B = RES(5, RM(EA) ); WM( EA,_B ); } /* RES 5,B=(XY+o) */ -OP(xycb,a9) { _C = RES(5, RM(EA) ); WM( EA,_C ); } /* RES 5,C=(XY+o) */ -OP(xycb,aa) { _D = RES(5, RM(EA) ); WM( EA,_D ); } /* RES 5,D=(XY+o) */ -OP(xycb,ab) { _E = RES(5, RM(EA) ); WM( EA,_E ); } /* RES 5,E=(XY+o) */ -OP(xycb,ac) { _H = RES(5, RM(EA) ); WM( EA,_H ); } /* RES 5,H=(XY+o) */ -OP(xycb,ad) { _L = RES(5, RM(EA) ); WM( EA,_L ); } /* RES 5,L=(XY+o) */ -OP(xycb,ae) { WM( EA, RES(5,RM(EA)) ); } /* RES 5,(XY+o) */ -OP(xycb,af) { _A = RES(5, RM(EA) ); WM( EA,_A ); } /* RES 5,A=(XY+o) */ - -OP(xycb,b0) { _B = RES(6, RM(EA) ); WM( EA,_B ); } /* RES 6,B=(XY+o) */ -OP(xycb,b1) { _C = RES(6, RM(EA) ); WM( EA,_C ); } /* RES 6,C=(XY+o) */ -OP(xycb,b2) { _D = RES(6, RM(EA) ); WM( EA,_D ); } /* RES 6,D=(XY+o) */ -OP(xycb,b3) { _E = RES(6, RM(EA) ); WM( EA,_E ); } /* RES 6,E=(XY+o) */ -OP(xycb,b4) { _H = RES(6, RM(EA) ); WM( EA,_H ); } /* RES 6,H=(XY+o) */ -OP(xycb,b5) { _L = RES(6, RM(EA) ); WM( EA,_L ); } /* RES 6,L=(XY+o) */ -OP(xycb,b6) { WM( EA, RES(6,RM(EA)) ); } /* RES 6,(XY+o) */ -OP(xycb,b7) { _A = RES(6, RM(EA) ); WM( EA,_A ); } /* RES 6,A=(XY+o) */ - -OP(xycb,b8) { _B = RES(7, RM(EA) ); WM( EA,_B ); } /* RES 7,B=(XY+o) */ -OP(xycb,b9) { _C = RES(7, RM(EA) ); WM( EA,_C ); } /* RES 7,C=(XY+o) */ -OP(xycb,ba) { _D = RES(7, RM(EA) ); WM( EA,_D ); } /* RES 7,D=(XY+o) */ -OP(xycb,bb) { _E = RES(7, RM(EA) ); WM( EA,_E ); } /* RES 7,E=(XY+o) */ -OP(xycb,bc) { _H = RES(7, RM(EA) ); WM( EA,_H ); } /* RES 7,H=(XY+o) */ -OP(xycb,bd) { _L = RES(7, RM(EA) ); WM( EA,_L ); } /* RES 7,L=(XY+o) */ -OP(xycb,be) { WM( EA, RES(7,RM(EA)) ); } /* RES 7,(XY+o) */ -OP(xycb,bf) { _A = RES(7, RM(EA) ); WM( EA,_A ); } /* RES 7,A=(XY+o) */ - -OP(xycb,c0) { _B = SET(0, RM(EA) ); WM( EA,_B ); } /* SET 0,B=(XY+o) */ -OP(xycb,c1) { _C = SET(0, RM(EA) ); WM( EA,_C ); } /* SET 0,C=(XY+o) */ -OP(xycb,c2) { _D = SET(0, RM(EA) ); WM( EA,_D ); } /* SET 0,D=(XY+o) */ -OP(xycb,c3) { _E = SET(0, RM(EA) ); WM( EA,_E ); } /* SET 0,E=(XY+o) */ -OP(xycb,c4) { _H = SET(0, RM(EA) ); WM( EA,_H ); } /* SET 0,H=(XY+o) */ -OP(xycb,c5) { _L = SET(0, RM(EA) ); WM( EA,_L ); } /* SET 0,L=(XY+o) */ -OP(xycb,c6) { WM( EA, SET(0,RM(EA)) ); } /* SET 0,(XY+o) */ -OP(xycb,c7) { _A = SET(0, RM(EA) ); WM( EA,_A ); } /* SET 0,A=(XY+o) */ - -OP(xycb,c8) { _B = SET(1, RM(EA) ); WM( EA,_B ); } /* SET 1,B=(XY+o) */ -OP(xycb,c9) { _C = SET(1, RM(EA) ); WM( EA,_C ); } /* SET 1,C=(XY+o) */ -OP(xycb,ca) { _D = SET(1, RM(EA) ); WM( EA,_D ); } /* SET 1,D=(XY+o) */ -OP(xycb,cb) { _E = SET(1, RM(EA) ); WM( EA,_E ); } /* SET 1,E=(XY+o) */ -OP(xycb,cc) { _H = SET(1, RM(EA) ); WM( EA,_H ); } /* SET 1,H=(XY+o) */ -OP(xycb,cd) { _L = SET(1, RM(EA) ); WM( EA,_L ); } /* SET 1,L=(XY+o) */ -OP(xycb,ce) { WM( EA, SET(1,RM(EA)) ); } /* SET 1,(XY+o) */ -OP(xycb,cf) { _A = SET(1, RM(EA) ); WM( EA,_A ); } /* SET 1,A=(XY+o) */ - -OP(xycb,d0) { _B = SET(2, RM(EA) ); WM( EA,_B ); } /* SET 2,B=(XY+o) */ -OP(xycb,d1) { _C = SET(2, RM(EA) ); WM( EA,_C ); } /* SET 2,C=(XY+o) */ -OP(xycb,d2) { _D = SET(2, RM(EA) ); WM( EA,_D ); } /* SET 2,D=(XY+o) */ -OP(xycb,d3) { _E = SET(2, RM(EA) ); WM( EA,_E ); } /* SET 2,E=(XY+o) */ -OP(xycb,d4) { _H = SET(2, RM(EA) ); WM( EA,_H ); } /* SET 2,H=(XY+o) */ -OP(xycb,d5) { _L = SET(2, RM(EA) ); WM( EA,_L ); } /* SET 2,L=(XY+o) */ -OP(xycb,d6) { WM( EA, SET(2,RM(EA)) ); } /* SET 2,(XY+o) */ -OP(xycb,d7) { _A = SET(2, RM(EA) ); WM( EA,_A ); } /* SET 2,A=(XY+o) */ - -OP(xycb,d8) { _B = SET(3, RM(EA) ); WM( EA,_B ); } /* SET 3,B=(XY+o) */ -OP(xycb,d9) { _C = SET(3, RM(EA) ); WM( EA,_C ); } /* SET 3,C=(XY+o) */ -OP(xycb,da) { _D = SET(3, RM(EA) ); WM( EA,_D ); } /* SET 3,D=(XY+o) */ -OP(xycb,db) { _E = SET(3, RM(EA) ); WM( EA,_E ); } /* SET 3,E=(XY+o) */ -OP(xycb,dc) { _H = SET(3, RM(EA) ); WM( EA,_H ); } /* SET 3,H=(XY+o) */ -OP(xycb,dd) { _L = SET(3, RM(EA) ); WM( EA,_L ); } /* SET 3,L=(XY+o) */ -OP(xycb,de) { WM( EA, SET(3,RM(EA)) ); } /* SET 3,(XY+o) */ -OP(xycb,df) { _A = SET(3, RM(EA) ); WM( EA,_A ); } /* SET 3,A=(XY+o) */ - -OP(xycb,e0) { _B = SET(4, RM(EA) ); WM( EA,_B ); } /* SET 4,B=(XY+o) */ -OP(xycb,e1) { _C = SET(4, RM(EA) ); WM( EA,_C ); } /* SET 4,C=(XY+o) */ -OP(xycb,e2) { _D = SET(4, RM(EA) ); WM( EA,_D ); } /* SET 4,D=(XY+o) */ -OP(xycb,e3) { _E = SET(4, RM(EA) ); WM( EA,_E ); } /* SET 4,E=(XY+o) */ -OP(xycb,e4) { _H = SET(4, RM(EA) ); WM( EA,_H ); } /* SET 4,H=(XY+o) */ -OP(xycb,e5) { _L = SET(4, RM(EA) ); WM( EA,_L ); } /* SET 4,L=(XY+o) */ -OP(xycb,e6) { WM( EA, SET(4,RM(EA)) ); } /* SET 4,(XY+o) */ -OP(xycb,e7) { _A = SET(4, RM(EA) ); WM( EA,_A ); } /* SET 4,A=(XY+o) */ - -OP(xycb,e8) { _B = SET(5, RM(EA) ); WM( EA,_B ); } /* SET 5,B=(XY+o) */ -OP(xycb,e9) { _C = SET(5, RM(EA) ); WM( EA,_C ); } /* SET 5,C=(XY+o) */ -OP(xycb,ea) { _D = SET(5, RM(EA) ); WM( EA,_D ); } /* SET 5,D=(XY+o) */ -OP(xycb,eb) { _E = SET(5, RM(EA) ); WM( EA,_E ); } /* SET 5,E=(XY+o) */ -OP(xycb,ec) { _H = SET(5, RM(EA) ); WM( EA,_H ); } /* SET 5,H=(XY+o) */ -OP(xycb,ed) { _L = SET(5, RM(EA) ); WM( EA,_L ); } /* SET 5,L=(XY+o) */ -OP(xycb,ee) { WM( EA, SET(5,RM(EA)) ); } /* SET 5,(XY+o) */ -OP(xycb,ef) { _A = SET(5, RM(EA) ); WM( EA,_A ); } /* SET 5,A=(XY+o) */ - -OP(xycb,f0) { _B = SET(6, RM(EA) ); WM( EA,_B ); } /* SET 6,B=(XY+o) */ -OP(xycb,f1) { _C = SET(6, RM(EA) ); WM( EA,_C ); } /* SET 6,C=(XY+o) */ -OP(xycb,f2) { _D = SET(6, RM(EA) ); WM( EA,_D ); } /* SET 6,D=(XY+o) */ -OP(xycb,f3) { _E = SET(6, RM(EA) ); WM( EA,_E ); } /* SET 6,E=(XY+o) */ -OP(xycb,f4) { _H = SET(6, RM(EA) ); WM( EA,_H ); } /* SET 6,H=(XY+o) */ -OP(xycb,f5) { _L = SET(6, RM(EA) ); WM( EA,_L ); } /* SET 6,L=(XY+o) */ -OP(xycb,f6) { WM( EA, SET(6,RM(EA)) ); } /* SET 6,(XY+o) */ -OP(xycb,f7) { _A = SET(6, RM(EA) ); WM( EA,_A ); } /* SET 6,A=(XY+o) */ - -OP(xycb,f8) { _B = SET(7, RM(EA) ); WM( EA,_B ); } /* SET 7,B=(XY+o) */ -OP(xycb,f9) { _C = SET(7, RM(EA) ); WM( EA,_C ); } /* SET 7,C=(XY+o) */ -OP(xycb,fa) { _D = SET(7, RM(EA) ); WM( EA,_D ); } /* SET 7,D=(XY+o) */ -OP(xycb,fb) { _E = SET(7, RM(EA) ); WM( EA,_E ); } /* SET 7,E=(XY+o) */ -OP(xycb,fc) { _H = SET(7, RM(EA) ); WM( EA,_H ); } /* SET 7,H=(XY+o) */ -OP(xycb,fd) { _L = SET(7, RM(EA) ); WM( EA,_L ); } /* SET 7,L=(XY+o) */ -OP(xycb,fe) { WM( EA, SET(7,RM(EA)) ); } /* SET 7,(XY+o) */ -OP(xycb,ff) { _A = SET(7, RM(EA) ); WM( EA,_A ); } /* SET 7,A=(XY+o) */ - -OP(illegal,1) { -} - -/********************************************************** - * IX register related opcodes (DD prefix) - **********************************************************/ -OP(dd,00) { illegal_1(); op_00(); } /* DB DD */ -OP(dd,01) { illegal_1(); op_01(); } /* DB DD */ -OP(dd,02) { illegal_1(); op_02(); } /* DB DD */ -OP(dd,03) { illegal_1(); op_03(); } /* DB DD */ -OP(dd,04) { illegal_1(); op_04(); } /* DB DD */ -OP(dd,05) { illegal_1(); op_05(); } /* DB DD */ -OP(dd,06) { illegal_1(); op_06(); } /* DB DD */ -OP(dd,07) { illegal_1(); op_07(); } /* DB DD */ - -OP(dd,08) { illegal_1(); op_08(); } /* DB DD */ -OP(dd,09) { _R++; ADD16(IX,BC); } /* ADD IX,BC */ -OP(dd,0a) { illegal_1(); op_0a(); } /* DB DD */ -OP(dd,0b) { illegal_1(); op_0b(); } /* DB DD */ -OP(dd,0c) { illegal_1(); op_0c(); } /* DB DD */ -OP(dd,0d) { illegal_1(); op_0d(); } /* DB DD */ -OP(dd,0e) { illegal_1(); op_0e(); } /* DB DD */ -OP(dd,0f) { illegal_1(); op_0f(); } /* DB DD */ - -OP(dd,10) { illegal_1(); op_10(); } /* DB DD */ -OP(dd,11) { illegal_1(); op_11(); } /* DB DD */ -OP(dd,12) { illegal_1(); op_12(); } /* DB DD */ -OP(dd,13) { illegal_1(); op_13(); } /* DB DD */ -OP(dd,14) { illegal_1(); op_14(); } /* DB DD */ -OP(dd,15) { illegal_1(); op_15(); } /* DB DD */ -OP(dd,16) { illegal_1(); op_16(); } /* DB DD */ -OP(dd,17) { illegal_1(); op_17(); } /* DB DD */ - -OP(dd,18) { illegal_1(); op_18(); } /* DB DD */ -OP(dd,19) { _R++; ADD16(IX,DE); } /* ADD IX,DE */ -OP(dd,1a) { illegal_1(); op_1a(); } /* DB DD */ -OP(dd,1b) { illegal_1(); op_1b(); } /* DB DD */ -OP(dd,1c) { illegal_1(); op_1c(); } /* DB DD */ -OP(dd,1d) { illegal_1(); op_1d(); } /* DB DD */ -OP(dd,1e) { illegal_1(); op_1e(); } /* DB DD */ -OP(dd,1f) { illegal_1(); op_1f(); } /* DB DD */ - -OP(dd,20) { illegal_1(); op_20(); } /* DB DD */ -OP(dd,21) { _R++; _IX = ARG16(); } /* LD IX,w */ -OP(dd,22) { _R++; EA = ARG16(); WM16( EA, &Z80.IX ); } /* LD (w),IX */ -OP(dd,23) { _R++; _IX++; } /* INC IX */ -OP(dd,24) { _R++; _HX = INC(_HX); } /* INC HX */ -OP(dd,25) { _R++; _HX = DEC(_HX); } /* DEC HX */ -OP(dd,26) { _R++; _HX = ARG(); } /* LD HX,n */ -OP(dd,27) { illegal_1(); op_27(); } /* DB DD */ - -OP(dd,28) { illegal_1(); op_28(); } /* DB DD */ -OP(dd,29) { _R++; ADD16(IX,IX); } /* ADD IX,IX */ -OP(dd,2a) { _R++; EA = ARG16(); RM16( EA, &Z80.IX ); } /* LD IX,(w) */ -OP(dd,2b) { _R++; _IX--; } /* DEC IX */ -OP(dd,2c) { _R++; _LX = INC(_LX); } /* INC LX */ -OP(dd,2d) { _R++; _LX = DEC(_LX); } /* DEC LX */ -OP(dd,2e) { _R++; _LX = ARG(); } /* LD LX,n */ -OP(dd,2f) { illegal_1(); op_2f(); } /* DB DD */ - -OP(dd,30) { illegal_1(); op_30(); } /* DB DD */ -OP(dd,31) { illegal_1(); op_31(); } /* DB DD */ -OP(dd,32) { illegal_1(); op_32(); } /* DB DD */ -OP(dd,33) { illegal_1(); op_33(); } /* DB DD */ -OP(dd,34) { _R++; EAX; WM( EA, INC(RM(EA)) ); } /* INC (IX+o) */ -OP(dd,35) { _R++; EAX; WM( EA, DEC(RM(EA)) ); } /* DEC (IX+o) */ -OP(dd,36) { _R++; EAX; WM( EA, ARG() ); } /* LD (IX+o),n */ -OP(dd,37) { illegal_1(); op_37(); } /* DB DD */ - -OP(dd,38) { illegal_1(); op_38(); } /* DB DD */ -OP(dd,39) { _R++; ADD16(IX,SP); } /* ADD IX,SP */ -OP(dd,3a) { illegal_1(); op_3a(); } /* DB DD */ -OP(dd,3b) { illegal_1(); op_3b(); } /* DB DD */ -OP(dd,3c) { illegal_1(); op_3c(); } /* DB DD */ -OP(dd,3d) { illegal_1(); op_3d(); } /* DB DD */ -OP(dd,3e) { illegal_1(); op_3e(); } /* DB DD */ -OP(dd,3f) { illegal_1(); op_3f(); } /* DB DD */ - -OP(dd,40) { illegal_1(); op_40(); } /* DB DD */ -OP(dd,41) { illegal_1(); op_41(); } /* DB DD */ -OP(dd,42) { illegal_1(); op_42(); } /* DB DD */ -OP(dd,43) { illegal_1(); op_43(); } /* DB DD */ -OP(dd,44) { _R++; _B = _HX; } /* LD B,HX */ -OP(dd,45) { _R++; _B = _LX; } /* LD B,LX */ -OP(dd,46) { _R++; EAX; _B = RM(EA); } /* LD B,(IX+o) */ -OP(dd,47) { illegal_1(); op_47(); } /* DB DD */ - -OP(dd,48) { illegal_1(); op_48(); } /* DB DD */ -OP(dd,49) { illegal_1(); op_49(); } /* DB DD */ -OP(dd,4a) { illegal_1(); op_4a(); } /* DB DD */ -OP(dd,4b) { illegal_1(); op_4b(); } /* DB DD */ -OP(dd,4c) { _R++; _C = _HX; } /* LD C,HX */ -OP(dd,4d) { _R++; _C = _LX; } /* LD C,LX */ -OP(dd,4e) { _R++; EAX; _C = RM(EA); } /* LD C,(IX+o) */ -OP(dd,4f) { illegal_1(); op_4f(); } /* DB DD */ - -OP(dd,50) { illegal_1(); op_50(); } /* DB DD */ -OP(dd,51) { illegal_1(); op_51(); } /* DB DD */ -OP(dd,52) { illegal_1(); op_52(); } /* DB DD */ -OP(dd,53) { illegal_1(); op_53(); } /* DB DD */ -OP(dd,54) { _R++; _D = _HX; } /* LD D,HX */ -OP(dd,55) { _R++; _D = _LX; } /* LD D,LX */ -OP(dd,56) { _R++; EAX; _D = RM(EA); } /* LD D,(IX+o) */ -OP(dd,57) { illegal_1(); op_57(); } /* DB DD */ - -OP(dd,58) { illegal_1(); op_58(); } /* DB DD */ -OP(dd,59) { illegal_1(); op_59(); } /* DB DD */ -OP(dd,5a) { illegal_1(); op_5a(); } /* DB DD */ -OP(dd,5b) { illegal_1(); op_5b(); } /* DB DD */ -OP(dd,5c) { _R++; _E = _HX; } /* LD E,HX */ -OP(dd,5d) { _R++; _E = _LX; } /* LD E,LX */ -OP(dd,5e) { _R++; EAX; _E = RM(EA); } /* LD E,(IX+o) */ -OP(dd,5f) { illegal_1(); op_5f(); } /* DB DD */ - -OP(dd,60) { _R++; _HX = _B; } /* LD HX,B */ -OP(dd,61) { _R++; _HX = _C; } /* LD HX,C */ -OP(dd,62) { _R++; _HX = _D; } /* LD HX,D */ -OP(dd,63) { _R++; _HX = _E; } /* LD HX,E */ -OP(dd,64) { } /* LD HX,HX */ -OP(dd,65) { _R++; _HX = _LX; } /* LD HX,LX */ -OP(dd,66) { _R++; EAX; _H = RM(EA); } /* LD H,(IX+o) */ -OP(dd,67) { _R++; _HX = _A; } /* LD HX,A */ - -OP(dd,68) { _R++; _LX = _B; } /* LD LX,B */ -OP(dd,69) { _R++; _LX = _C; } /* LD LX,C */ -OP(dd,6a) { _R++; _LX = _D; } /* LD LX,D */ -OP(dd,6b) { _R++; _LX = _E; } /* LD LX,E */ -OP(dd,6c) { _R++; _LX = _HX; } /* LD LX,HX */ -OP(dd,6d) { } /* LD LX,LX */ -OP(dd,6e) { _R++; EAX; _L = RM(EA); } /* LD L,(IX+o) */ -OP(dd,6f) { _R++; _LX = _A; } /* LD LX,A */ - -OP(dd,70) { _R++; EAX; WM( EA, _B ); } /* LD (IX+o),B */ -OP(dd,71) { _R++; EAX; WM( EA, _C ); } /* LD (IX+o),C */ -OP(dd,72) { _R++; EAX; WM( EA, _D ); } /* LD (IX+o),D */ -OP(dd,73) { _R++; EAX; WM( EA, _E ); } /* LD (IX+o),E */ -OP(dd,74) { _R++; EAX; WM( EA, _H ); } /* LD (IX+o),H */ -OP(dd,75) { _R++; EAX; WM( EA, _L ); } /* LD (IX+o),L */ -OP(dd,76) { illegal_1(); op_76(); } /* DB DD */ -OP(dd,77) { _R++; EAX; WM( EA, _A ); } /* LD (IX+o),A */ - -OP(dd,78) { illegal_1(); op_78(); } /* DB DD */ -OP(dd,79) { illegal_1(); op_79(); } /* DB DD */ -OP(dd,7a) { illegal_1(); op_7a(); } /* DB DD */ -OP(dd,7b) { illegal_1(); op_7b(); } /* DB DD */ -OP(dd,7c) { _R++; _A = _HX; } /* LD A,HX */ -OP(dd,7d) { _R++; _A = _LX; } /* LD A,LX */ -OP(dd,7e) { _R++; EAX; _A = RM(EA); } /* LD A,(IX+o) */ -OP(dd,7f) { illegal_1(); op_7f(); } /* DB DD */ - -OP(dd,80) { illegal_1(); op_80(); } /* DB DD */ -OP(dd,81) { illegal_1(); op_81(); } /* DB DD */ -OP(dd,82) { illegal_1(); op_82(); } /* DB DD */ -OP(dd,83) { illegal_1(); op_83(); } /* DB DD */ -OP(dd,84) { _R++; ADD(_HX); } /* ADD A,HX */ -OP(dd,85) { _R++; ADD(_LX); } /* ADD A,LX */ -OP(dd,86) { _R++; EAX; ADD(RM(EA)); } /* ADD A,(IX+o) */ -OP(dd,87) { illegal_1(); op_87(); } /* DB DD */ - -OP(dd,88) { illegal_1(); op_88(); } /* DB DD */ -OP(dd,89) { illegal_1(); op_89(); } /* DB DD */ -OP(dd,8a) { illegal_1(); op_8a(); } /* DB DD */ -OP(dd,8b) { illegal_1(); op_8b(); } /* DB DD */ -OP(dd,8c) { _R++; ADC(_HX); } /* ADC A,HX */ -OP(dd,8d) { _R++; ADC(_LX); } /* ADC A,LX */ -OP(dd,8e) { _R++; EAX; ADC(RM(EA)); } /* ADC A,(IX+o) */ -OP(dd,8f) { illegal_1(); op_8f(); } /* DB DD */ - -OP(dd,90) { illegal_1(); op_90(); } /* DB DD */ -OP(dd,91) { illegal_1(); op_91(); } /* DB DD */ -OP(dd,92) { illegal_1(); op_92(); } /* DB DD */ -OP(dd,93) { illegal_1(); op_93(); } /* DB DD */ -OP(dd,94) { _R++; SUB(_HX); } /* SUB HX */ -OP(dd,95) { _R++; SUB(_LX); } /* SUB LX */ -OP(dd,96) { _R++; EAX; SUB(RM(EA)); } /* SUB (IX+o) */ -OP(dd,97) { illegal_1(); op_97(); } /* DB DD */ - -OP(dd,98) { illegal_1(); op_98(); } /* DB DD */ -OP(dd,99) { illegal_1(); op_99(); } /* DB DD */ -OP(dd,9a) { illegal_1(); op_9a(); } /* DB DD */ -OP(dd,9b) { illegal_1(); op_9b(); } /* DB DD */ -OP(dd,9c) { _R++; SBC(_HX); } /* SBC A,HX */ -OP(dd,9d) { _R++; SBC(_LX); } /* SBC A,LX */ -OP(dd,9e) { _R++; EAX; SBC(RM(EA)); } /* SBC A,(IX+o) */ -OP(dd,9f) { illegal_1(); op_9f(); } /* DB DD */ - -OP(dd,a0) { illegal_1(); op_a0(); } /* DB DD */ -OP(dd,a1) { illegal_1(); op_a1(); } /* DB DD */ -OP(dd,a2) { illegal_1(); op_a2(); } /* DB DD */ -OP(dd,a3) { illegal_1(); op_a3(); } /* DB DD */ -OP(dd,a4) { _R++; AND(_HX); } /* AND HX */ -OP(dd,a5) { _R++; AND(_LX); } /* AND LX */ -OP(dd,a6) { _R++; EAX; AND(RM(EA)); } /* AND (IX+o) */ -OP(dd,a7) { illegal_1(); op_a7(); } /* DB DD */ - -OP(dd,a8) { illegal_1(); op_a8(); } /* DB DD */ -OP(dd,a9) { illegal_1(); op_a9(); } /* DB DD */ -OP(dd,aa) { illegal_1(); op_aa(); } /* DB DD */ -OP(dd,ab) { illegal_1(); op_ab(); } /* DB DD */ -OP(dd,ac) { _R++; XOR(_HX); } /* XOR HX */ -OP(dd,ad) { _R++; XOR(_LX); } /* XOR LX */ -OP(dd,ae) { _R++; EAX; XOR(RM(EA)); } /* XOR (IX+o) */ -OP(dd,af) { illegal_1(); op_af(); } /* DB DD */ - -OP(dd,b0) { illegal_1(); op_b0(); } /* DB DD */ -OP(dd,b1) { illegal_1(); op_b1(); } /* DB DD */ -OP(dd,b2) { illegal_1(); op_b2(); } /* DB DD */ -OP(dd,b3) { illegal_1(); op_b3(); } /* DB DD */ -OP(dd,b4) { _R++; OR(_HX); } /* OR HX */ -OP(dd,b5) { _R++; OR(_LX); } /* OR LX */ -OP(dd,b6) { _R++; EAX; OR(RM(EA)); } /* OR (IX+o) */ -OP(dd,b7) { illegal_1(); op_b7(); } /* DB DD */ - -OP(dd,b8) { illegal_1(); op_b8(); } /* DB DD */ -OP(dd,b9) { illegal_1(); op_b9(); } /* DB DD */ -OP(dd,ba) { illegal_1(); op_ba(); } /* DB DD */ -OP(dd,bb) { illegal_1(); op_bb(); } /* DB DD */ -OP(dd,bc) { _R++; CP(_HX); } /* CP HX */ -OP(dd,bd) { _R++; CP(_LX); } /* CP LX */ -OP(dd,be) { _R++; EAX; CP(RM(EA)); } /* CP (IX+o) */ -OP(dd,bf) { illegal_1(); op_bf(); } /* DB DD */ - -OP(dd,c0) { illegal_1(); op_c0(); } /* DB DD */ -OP(dd,c1) { illegal_1(); op_c1(); } /* DB DD */ -OP(dd,c2) { illegal_1(); op_c2(); } /* DB DD */ -OP(dd,c3) { illegal_1(); op_c3(); } /* DB DD */ -OP(dd,c4) { illegal_1(); op_c4(); } /* DB DD */ -OP(dd,c5) { illegal_1(); op_c5(); } /* DB DD */ -OP(dd,c6) { illegal_1(); op_c6(); } /* DB DD */ -OP(dd,c7) { illegal_1(); op_c7(); } /* DB DD */ - -OP(dd,c8) { illegal_1(); op_c8(); } /* DB DD */ -OP(dd,c9) { illegal_1(); op_c9(); } /* DB DD */ -OP(dd,ca) { illegal_1(); op_ca(); } /* DB DD */ -OP(dd,cb) { _R++; EAX; EXEC(xycb,ARG()); } /* ** DD CB xx */ -OP(dd,cc) { illegal_1(); op_cc(); } /* DB DD */ -OP(dd,cd) { illegal_1(); op_cd(); } /* DB DD */ -OP(dd,ce) { illegal_1(); op_ce(); } /* DB DD */ -OP(dd,cf) { illegal_1(); op_cf(); } /* DB DD */ - -OP(dd,d0) { illegal_1(); op_d0(); } /* DB DD */ -OP(dd,d1) { illegal_1(); op_d1(); } /* DB DD */ -OP(dd,d2) { illegal_1(); op_d2(); } /* DB DD */ -OP(dd,d3) { illegal_1(); op_d3(); } /* DB DD */ -OP(dd,d4) { illegal_1(); op_d4(); } /* DB DD */ -OP(dd,d5) { illegal_1(); op_d5(); } /* DB DD */ -OP(dd,d6) { illegal_1(); op_d6(); } /* DB DD */ -OP(dd,d7) { illegal_1(); op_d7(); } /* DB DD */ - -OP(dd,d8) { illegal_1(); op_d8(); } /* DB DD */ -OP(dd,d9) { illegal_1(); op_d9(); } /* DB DD */ -OP(dd,da) { illegal_1(); op_da(); } /* DB DD */ -OP(dd,db) { illegal_1(); op_db(); } /* DB DD */ -OP(dd,dc) { illegal_1(); op_dc(); } /* DB DD */ -OP(dd,dd) { illegal_1(); op_dd(); } /* DB DD */ -OP(dd,de) { illegal_1(); op_de(); } /* DB DD */ -OP(dd,df) { illegal_1(); op_df(); } /* DB DD */ - -OP(dd,e0) { illegal_1(); op_e0(); } /* DB DD */ -OP(dd,e1) { _R++; POP(IX); } /* POP IX */ -OP(dd,e2) { illegal_1(); op_e2(); } /* DB DD */ -OP(dd,e3) { _R++; EXSP(IX); } /* EX (SP),IX */ -OP(dd,e4) { illegal_1(); op_e4(); } /* DB DD */ -OP(dd,e5) { _R++; PUSH( IX ); } /* PUSH IX */ -OP(dd,e6) { illegal_1(); op_e6(); } /* DB DD */ -OP(dd,e7) { illegal_1(); op_e7(); } /* DB DD */ - -OP(dd,e8) { illegal_1(); op_e8(); } /* DB DD */ -OP(dd,e9) { _R++; _PC = _IX; } /* JP (IX) */ -OP(dd,ea) { illegal_1(); op_ea(); } /* DB DD */ -OP(dd,eb) { illegal_1(); op_eb(); } /* DB DD */ -OP(dd,ec) { illegal_1(); op_ec(); } /* DB DD */ -OP(dd,ed) { illegal_1(); op_ed(); } /* DB DD */ -OP(dd,ee) { illegal_1(); op_ee(); } /* DB DD */ -OP(dd,ef) { illegal_1(); op_ef(); } /* DB DD */ - -OP(dd,f0) { illegal_1(); op_f0(); } /* DB DD */ -OP(dd,f1) { illegal_1(); op_f1(); } /* DB DD */ -OP(dd,f2) { illegal_1(); op_f2(); } /* DB DD */ -OP(dd,f3) { illegal_1(); op_f3(); } /* DB DD */ -OP(dd,f4) { illegal_1(); op_f4(); } /* DB DD */ -OP(dd,f5) { illegal_1(); op_f5(); } /* DB DD */ -OP(dd,f6) { illegal_1(); op_f6(); } /* DB DD */ -OP(dd,f7) { illegal_1(); op_f7(); } /* DB DD */ - -OP(dd,f8) { illegal_1(); op_f8(); } /* DB DD */ -OP(dd,f9) { _R++; _SP = _IX; } /* LD SP,IX */ -OP(dd,fa) { illegal_1(); op_fa(); } /* DB DD */ -OP(dd,fb) { illegal_1(); op_fb(); } /* DB DD */ -OP(dd,fc) { illegal_1(); op_fc(); } /* DB DD */ -OP(dd,fd) { illegal_1(); op_fd(); } /* DB DD */ -OP(dd,fe) { illegal_1(); op_fe(); } /* DB DD */ -OP(dd,ff) { illegal_1(); op_ff(); } /* DB DD */ - -/********************************************************** - * IY register related opcodes (FD prefix) - **********************************************************/ -OP(fd,00) { illegal_1(); op_00(); } /* DB FD */ -OP(fd,01) { illegal_1(); op_01(); } /* DB FD */ -OP(fd,02) { illegal_1(); op_02(); } /* DB FD */ -OP(fd,03) { illegal_1(); op_03(); } /* DB FD */ -OP(fd,04) { illegal_1(); op_04(); } /* DB FD */ -OP(fd,05) { illegal_1(); op_05(); } /* DB FD */ -OP(fd,06) { illegal_1(); op_06(); } /* DB FD */ -OP(fd,07) { illegal_1(); op_07(); } /* DB FD */ - -OP(fd,08) { illegal_1(); op_08(); } /* DB FD */ -OP(fd,09) { _R++; ADD16(IY,BC); } /* ADD IY,BC */ -OP(fd,0a) { illegal_1(); op_0a(); } /* DB FD */ -OP(fd,0b) { illegal_1(); op_0b(); } /* DB FD */ -OP(fd,0c) { illegal_1(); op_0c(); } /* DB FD */ -OP(fd,0d) { illegal_1(); op_0d(); } /* DB FD */ -OP(fd,0e) { illegal_1(); op_0e(); } /* DB FD */ -OP(fd,0f) { illegal_1(); op_0f(); } /* DB FD */ - -OP(fd,10) { illegal_1(); op_10(); } /* DB FD */ -OP(fd,11) { illegal_1(); op_11(); } /* DB FD */ -OP(fd,12) { illegal_1(); op_12(); } /* DB FD */ -OP(fd,13) { illegal_1(); op_13(); } /* DB FD */ -OP(fd,14) { illegal_1(); op_14(); } /* DB FD */ -OP(fd,15) { illegal_1(); op_15(); } /* DB FD */ -OP(fd,16) { illegal_1(); op_16(); } /* DB FD */ -OP(fd,17) { illegal_1(); op_17(); } /* DB FD */ - -OP(fd,18) { illegal_1(); op_18(); } /* DB FD */ -OP(fd,19) { _R++; ADD16(IY,DE); } /* ADD IY,DE */ -OP(fd,1a) { illegal_1(); op_1a(); } /* DB FD */ -OP(fd,1b) { illegal_1(); op_1b(); } /* DB FD */ -OP(fd,1c) { illegal_1(); op_1c(); } /* DB FD */ -OP(fd,1d) { illegal_1(); op_1d(); } /* DB FD */ -OP(fd,1e) { illegal_1(); op_1e(); } /* DB FD */ -OP(fd,1f) { illegal_1(); op_1f(); } /* DB FD */ - -OP(fd,20) { illegal_1(); op_20(); } /* DB FD */ -OP(fd,21) { _R++; _IY = ARG16(); } /* LD IY,w */ -OP(fd,22) { _R++; EA = ARG16(); WM16( EA, &Z80.IY ); } /* LD (w),IY */ -OP(fd,23) { _R++; _IY++; } /* INC IY */ -OP(fd,24) { _R++; _HY = INC(_HY); } /* INC HY */ -OP(fd,25) { _R++; _HY = DEC(_HY); } /* DEC HY */ -OP(fd,26) { _R++; _HY = ARG(); } /* LD HY,n */ -OP(fd,27) { illegal_1(); op_27(); } /* DB FD */ - -OP(fd,28) { illegal_1(); op_28(); } /* DB FD */ -OP(fd,29) { _R++; ADD16(IY,IY); } /* ADD IY,IY */ -OP(fd,2a) { _R++; EA = ARG16(); RM16( EA, &Z80.IY ); } /* LD IY,(w) */ -OP(fd,2b) { _R++; _IY--; } /* DEC IY */ -OP(fd,2c) { _R++; _LY = INC(_LY); } /* INC LY */ -OP(fd,2d) { _R++; _LY = DEC(_LY); } /* DEC LY */ -OP(fd,2e) { _R++; _LY = ARG(); } /* LD LY,n */ -OP(fd,2f) { illegal_1(); op_2f(); } /* DB FD */ - -OP(fd,30) { illegal_1(); op_30(); } /* DB FD */ -OP(fd,31) { illegal_1(); op_31(); } /* DB FD */ -OP(fd,32) { illegal_1(); op_32(); } /* DB FD */ -OP(fd,33) { illegal_1(); op_33(); } /* DB FD */ -OP(fd,34) { _R++; EAY; WM( EA, INC(RM(EA)) ); } /* INC (IY+o) */ -OP(fd,35) { _R++; EAY; WM( EA, DEC(RM(EA)) ); } /* DEC (IY+o) */ -OP(fd,36) { _R++; EAY; WM( EA, ARG() ); } /* LD (IY+o),n */ -OP(fd,37) { illegal_1(); op_37(); } /* DB FD */ - -OP(fd,38) { illegal_1(); op_38(); } /* DB FD */ -OP(fd,39) { _R++; ADD16(IY,SP); } /* ADD IY,SP */ -OP(fd,3a) { illegal_1(); op_3a(); } /* DB FD */ -OP(fd,3b) { illegal_1(); op_3b(); } /* DB FD */ -OP(fd,3c) { illegal_1(); op_3c(); } /* DB FD */ -OP(fd,3d) { illegal_1(); op_3d(); } /* DB FD */ -OP(fd,3e) { illegal_1(); op_3e(); } /* DB FD */ -OP(fd,3f) { illegal_1(); op_3f(); } /* DB FD */ - -OP(fd,40) { illegal_1(); op_40(); } /* DB FD */ -OP(fd,41) { illegal_1(); op_41(); } /* DB FD */ -OP(fd,42) { illegal_1(); op_42(); } /* DB FD */ -OP(fd,43) { illegal_1(); op_43(); } /* DB FD */ -OP(fd,44) { _R++; _B = _HY; } /* LD B,HY */ -OP(fd,45) { _R++; _B = _LY; } /* LD B,LY */ -OP(fd,46) { _R++; EAY; _B = RM(EA); } /* LD B,(IY+o) */ -OP(fd,47) { illegal_1(); op_47(); } /* DB FD */ - -OP(fd,48) { illegal_1(); op_48(); } /* DB FD */ -OP(fd,49) { illegal_1(); op_49(); } /* DB FD */ -OP(fd,4a) { illegal_1(); op_4a(); } /* DB FD */ -OP(fd,4b) { illegal_1(); op_4b(); } /* DB FD */ -OP(fd,4c) { _R++; _C = _HY; } /* LD C,HY */ -OP(fd,4d) { _R++; _C = _LY; } /* LD C,LY */ -OP(fd,4e) { _R++; EAY; _C = RM(EA); } /* LD C,(IY+o) */ -OP(fd,4f) { illegal_1(); op_4f(); } /* DB FD */ - -OP(fd,50) { illegal_1(); op_50(); } /* DB FD */ -OP(fd,51) { illegal_1(); op_51(); } /* DB FD */ -OP(fd,52) { illegal_1(); op_52(); } /* DB FD */ -OP(fd,53) { illegal_1(); op_53(); } /* DB FD */ -OP(fd,54) { _R++; _D = _HY; } /* LD D,HY */ -OP(fd,55) { _R++; _D = _LY; } /* LD D,LY */ -OP(fd,56) { _R++; EAY; _D = RM(EA); } /* LD D,(IY+o) */ -OP(fd,57) { illegal_1(); op_57(); } /* DB FD */ - -OP(fd,58) { illegal_1(); op_58(); } /* DB FD */ -OP(fd,59) { illegal_1(); op_59(); } /* DB FD */ -OP(fd,5a) { illegal_1(); op_5a(); } /* DB FD */ -OP(fd,5b) { illegal_1(); op_5b(); } /* DB FD */ -OP(fd,5c) { _R++; _E = _HY; } /* LD E,HY */ -OP(fd,5d) { _R++; _E = _LY; } /* LD E,LY */ -OP(fd,5e) { _R++; EAY; _E = RM(EA); } /* LD E,(IY+o) */ -OP(fd,5f) { illegal_1(); op_5f(); } /* DB FD */ - -OP(fd,60) { _R++; _HY = _B; } /* LD HY,B */ -OP(fd,61) { _R++; _HY = _C; } /* LD HY,C */ -OP(fd,62) { _R++; _HY = _D; } /* LD HY,D */ -OP(fd,63) { _R++; _HY = _E; } /* LD HY,E */ -OP(fd,64) { _R++; } /* LD HY,HY */ -OP(fd,65) { _R++; _HY = _LY; } /* LD HY,LY */ -OP(fd,66) { _R++; EAY; _H = RM(EA); } /* LD H,(IY+o) */ -OP(fd,67) { _R++; _HY = _A; } /* LD HY,A */ - -OP(fd,68) { _R++; _LY = _B; } /* LD LY,B */ -OP(fd,69) { _R++; _LY = _C; } /* LD LY,C */ -OP(fd,6a) { _R++; _LY = _D; } /* LD LY,D */ -OP(fd,6b) { _R++; _LY = _E; } /* LD LY,E */ -OP(fd,6c) { _R++; _LY = _HY; } /* LD LY,HY */ -OP(fd,6d) { _R++; } /* LD LY,LY */ -OP(fd,6e) { _R++; EAY; _L = RM(EA); } /* LD L,(IY+o) */ -OP(fd,6f) { _R++; _LY = _A; } /* LD LY,A */ - -OP(fd,70) { _R++; EAY; WM( EA, _B ); } /* LD (IY+o),B */ -OP(fd,71) { _R++; EAY; WM( EA, _C ); } /* LD (IY+o),C */ -OP(fd,72) { _R++; EAY; WM( EA, _D ); } /* LD (IY+o),D */ -OP(fd,73) { _R++; EAY; WM( EA, _E ); } /* LD (IY+o),E */ -OP(fd,74) { _R++; EAY; WM( EA, _H ); } /* LD (IY+o),H */ -OP(fd,75) { _R++; EAY; WM( EA, _L ); } /* LD (IY+o),L */ -OP(fd,76) { illegal_1(); op_76(); } /* DB FD */ -OP(fd,77) { _R++; EAY; WM( EA, _A ); } /* LD (IY+o),A */ - -OP(fd,78) { illegal_1(); op_78(); } /* DB FD */ -OP(fd,79) { illegal_1(); op_79(); } /* DB FD */ -OP(fd,7a) { illegal_1(); op_7a(); } /* DB FD */ -OP(fd,7b) { illegal_1(); op_7b(); } /* DB FD */ -OP(fd,7c) { _R++; _A = _HY; } /* LD A,HY */ -OP(fd,7d) { _R++; _A = _LY; } /* LD A,LY */ -OP(fd,7e) { _R++; EAY; _A = RM(EA); } /* LD A,(IY+o) */ -OP(fd,7f) { illegal_1(); op_7f(); } /* DB FD */ - -OP(fd,80) { illegal_1(); op_80(); } /* DB FD */ -OP(fd,81) { illegal_1(); op_81(); } /* DB FD */ -OP(fd,82) { illegal_1(); op_82(); } /* DB FD */ -OP(fd,83) { illegal_1(); op_83(); } /* DB FD */ -OP(fd,84) { _R++; ADD(_HY); } /* ADD A,HY */ -OP(fd,85) { _R++; ADD(_LY); } /* ADD A,LY */ -OP(fd,86) { _R++; EAY; ADD(RM(EA)); } /* ADD A,(IY+o) */ -OP(fd,87) { illegal_1(); op_87(); } /* DB FD */ - -OP(fd,88) { illegal_1(); op_88(); } /* DB FD */ -OP(fd,89) { illegal_1(); op_89(); } /* DB FD */ -OP(fd,8a) { illegal_1(); op_8a(); } /* DB FD */ -OP(fd,8b) { illegal_1(); op_8b(); } /* DB FD */ -OP(fd,8c) { _R++; ADC(_HY); } /* ADC A,HY */ -OP(fd,8d) { _R++; ADC(_LY); } /* ADC A,LY */ -OP(fd,8e) { _R++; EAY; ADC(RM(EA)); } /* ADC A,(IY+o) */ -OP(fd,8f) { illegal_1(); op_8f(); } /* DB FD */ - -OP(fd,90) { illegal_1(); op_90(); } /* DB FD */ -OP(fd,91) { illegal_1(); op_91(); } /* DB FD */ -OP(fd,92) { illegal_1(); op_92(); } /* DB FD */ -OP(fd,93) { illegal_1(); op_93(); } /* DB FD */ -OP(fd,94) { _R++; SUB(_HY); } /* SUB HY */ -OP(fd,95) { _R++; SUB(_LY); } /* SUB LY */ -OP(fd,96) { _R++; EAY; SUB(RM(EA)); } /* SUB (IY+o) */ -OP(fd,97) { illegal_1(); op_97(); } /* DB FD */ - -OP(fd,98) { illegal_1(); op_98(); } /* DB FD */ -OP(fd,99) { illegal_1(); op_99(); } /* DB FD */ -OP(fd,9a) { illegal_1(); op_9a(); } /* DB FD */ -OP(fd,9b) { illegal_1(); op_9b(); } /* DB FD */ -OP(fd,9c) { _R++; SBC(_HY); } /* SBC A,HY */ -OP(fd,9d) { _R++; SBC(_LY); } /* SBC A,LY */ -OP(fd,9e) { _R++; EAY; SBC(RM(EA)); } /* SBC A,(IY+o) */ -OP(fd,9f) { illegal_1(); op_9f(); } /* DB FD */ - -OP(fd,a0) { illegal_1(); op_a0(); } /* DB FD */ -OP(fd,a1) { illegal_1(); op_a1(); } /* DB FD */ -OP(fd,a2) { illegal_1(); op_a2(); } /* DB FD */ -OP(fd,a3) { illegal_1(); op_a3(); } /* DB FD */ -OP(fd,a4) { _R++; AND(_HY); } /* AND HY */ -OP(fd,a5) { _R++; AND(_LY); } /* AND LY */ -OP(fd,a6) { _R++; EAY; AND(RM(EA)); } /* AND (IY+o) */ -OP(fd,a7) { illegal_1(); op_a7(); } /* DB FD */ - -OP(fd,a8) { illegal_1(); op_a8(); } /* DB FD */ -OP(fd,a9) { illegal_1(); op_a9(); } /* DB FD */ -OP(fd,aa) { illegal_1(); op_aa(); } /* DB FD */ -OP(fd,ab) { illegal_1(); op_ab(); } /* DB FD */ -OP(fd,ac) { _R++; XOR(_HY); } /* XOR HY */ -OP(fd,ad) { _R++; XOR(_LY); } /* XOR LY */ -OP(fd,ae) { _R++; EAY; XOR(RM(EA)); } /* XOR (IY+o) */ -OP(fd,af) { illegal_1(); op_af(); } /* DB FD */ - -OP(fd,b0) { illegal_1(); op_b0(); } /* DB FD */ -OP(fd,b1) { illegal_1(); op_b1(); } /* DB FD */ -OP(fd,b2) { illegal_1(); op_b2(); } /* DB FD */ -OP(fd,b3) { illegal_1(); op_b3(); } /* DB FD */ -OP(fd,b4) { _R++; OR(_HY); } /* OR HY */ -OP(fd,b5) { _R++; OR(_LY); } /* OR LY */ -OP(fd,b6) { _R++; EAY; OR(RM(EA)); } /* OR (IY+o) */ -OP(fd,b7) { illegal_1(); op_b7(); } /* DB FD */ - -OP(fd,b8) { illegal_1(); op_b8(); } /* DB FD */ -OP(fd,b9) { illegal_1(); op_b9(); } /* DB FD */ -OP(fd,ba) { illegal_1(); op_ba(); } /* DB FD */ -OP(fd,bb) { illegal_1(); op_bb(); } /* DB FD */ -OP(fd,bc) { _R++; CP(_HY); } /* CP HY */ -OP(fd,bd) { _R++; CP(_LY); } /* CP LY */ -OP(fd,be) { _R++; EAY; CP(RM(EA)); } /* CP (IY+o) */ -OP(fd,bf) { illegal_1(); op_bf(); } /* DB FD */ - -OP(fd,c0) { illegal_1(); op_c0(); } /* DB FD */ -OP(fd,c1) { illegal_1(); op_c1(); } /* DB FD */ -OP(fd,c2) { illegal_1(); op_c2(); } /* DB FD */ -OP(fd,c3) { illegal_1(); op_c3(); } /* DB FD */ -OP(fd,c4) { illegal_1(); op_c4(); } /* DB FD */ -OP(fd,c5) { illegal_1(); op_c5(); } /* DB FD */ -OP(fd,c6) { illegal_1(); op_c6(); } /* DB FD */ -OP(fd,c7) { illegal_1(); op_c7(); } /* DB FD */ - -OP(fd,c8) { illegal_1(); op_c8(); } /* DB FD */ -OP(fd,c9) { illegal_1(); op_c9(); } /* DB FD */ -OP(fd,ca) { illegal_1(); op_ca(); } /* DB FD */ -OP(fd,cb) { _R++; EAY; EXEC(xycb,ARG()); } /* ** FD CB xx */ -OP(fd,cc) { illegal_1(); op_cc(); } /* DB FD */ -OP(fd,cd) { illegal_1(); op_cd(); } /* DB FD */ -OP(fd,ce) { illegal_1(); op_ce(); } /* DB FD */ -OP(fd,cf) { illegal_1(); op_cf(); } /* DB FD */ - -OP(fd,d0) { illegal_1(); op_d0(); } /* DB FD */ -OP(fd,d1) { illegal_1(); op_d1(); } /* DB FD */ -OP(fd,d2) { illegal_1(); op_d2(); } /* DB FD */ -OP(fd,d3) { illegal_1(); op_d3(); } /* DB FD */ -OP(fd,d4) { illegal_1(); op_d4(); } /* DB FD */ -OP(fd,d5) { illegal_1(); op_d5(); } /* DB FD */ -OP(fd,d6) { illegal_1(); op_d6(); } /* DB FD */ -OP(fd,d7) { illegal_1(); op_d7(); } /* DB FD */ - -OP(fd,d8) { illegal_1(); op_d8(); } /* DB FD */ -OP(fd,d9) { illegal_1(); op_d9(); } /* DB FD */ -OP(fd,da) { illegal_1(); op_da(); } /* DB FD */ -OP(fd,db) { illegal_1(); op_db(); } /* DB FD */ -OP(fd,dc) { illegal_1(); op_dc(); } /* DB FD */ -OP(fd,dd) { illegal_1(); op_dd(); } /* DB FD */ -OP(fd,de) { illegal_1(); op_de(); } /* DB FD */ -OP(fd,df) { illegal_1(); op_df(); } /* DB FD */ - -OP(fd,e0) { illegal_1(); op_e0(); } /* DB FD */ -OP(fd,e1) { _R++; POP(IY); } /* POP IY */ -OP(fd,e2) { illegal_1(); op_e2(); } /* DB FD */ -OP(fd,e3) { _R++; EXSP(IY); } /* EX (SP),IY */ -OP(fd,e4) { illegal_1(); op_e4(); } /* DB FD */ -OP(fd,e5) { _R++; PUSH( IY ); } /* PUSH IY */ -OP(fd,e6) { illegal_1(); op_e6(); } /* DB FD */ -OP(fd,e7) { illegal_1(); op_e7(); } /* DB FD */ - -OP(fd,e8) { illegal_1(); op_e8(); } /* DB FD */ -OP(fd,e9) { _R++; _PC = _IY; } /* JP (IY) */ -OP(fd,ea) { illegal_1(); op_ea(); } /* DB FD */ -OP(fd,eb) { illegal_1(); op_eb(); } /* DB FD */ -OP(fd,ec) { illegal_1(); op_ec(); } /* DB FD */ -OP(fd,ed) { illegal_1(); op_ed(); } /* DB FD */ -OP(fd,ee) { illegal_1(); op_ee(); } /* DB FD */ -OP(fd,ef) { illegal_1(); op_ef(); } /* DB FD */ - -OP(fd,f0) { illegal_1(); op_f0(); } /* DB FD */ -OP(fd,f1) { illegal_1(); op_f1(); } /* DB FD */ -OP(fd,f2) { illegal_1(); op_f2(); } /* DB FD */ -OP(fd,f3) { illegal_1(); op_f3(); } /* DB FD */ -OP(fd,f4) { illegal_1(); op_f4(); } /* DB FD */ -OP(fd,f5) { illegal_1(); op_f5(); } /* DB FD */ -OP(fd,f6) { illegal_1(); op_f6(); } /* DB FD */ -OP(fd,f7) { illegal_1(); op_f7(); } /* DB FD */ - -OP(fd,f8) { illegal_1(); op_f8(); } /* DB FD */ -OP(fd,f9) { _R++; _SP = _IY; } /* LD SP,IY */ -OP(fd,fa) { illegal_1(); op_fa(); } /* DB FD */ -OP(fd,fb) { illegal_1(); op_fb(); } /* DB FD */ -OP(fd,fc) { illegal_1(); op_fc(); } /* DB FD */ -OP(fd,fd) { illegal_1(); op_fd(); } /* DB FD */ -OP(fd,fe) { illegal_1(); op_fe(); } /* DB FD */ -OP(fd,ff) { illegal_1(); op_ff(); } /* DB FD */ - -OP(illegal,2) -{ -} - -/********************************************************** - * special opcodes (ED prefix) - **********************************************************/ -OP(ed,00) { illegal_2(); } /* DB ED */ -OP(ed,01) { illegal_2(); } /* DB ED */ -OP(ed,02) { illegal_2(); } /* DB ED */ -OP(ed,03) { illegal_2(); } /* DB ED */ -OP(ed,04) { illegal_2(); } /* DB ED */ -OP(ed,05) { illegal_2(); } /* DB ED */ -OP(ed,06) { illegal_2(); } /* DB ED */ -OP(ed,07) { illegal_2(); } /* DB ED */ - -OP(ed,08) { illegal_2(); } /* DB ED */ -OP(ed,09) { illegal_2(); } /* DB ED */ -OP(ed,0a) { illegal_2(); } /* DB ED */ -OP(ed,0b) { illegal_2(); } /* DB ED */ -OP(ed,0c) { illegal_2(); } /* DB ED */ -OP(ed,0d) { illegal_2(); } /* DB ED */ -OP(ed,0e) { illegal_2(); } /* DB ED */ -OP(ed,0f) { illegal_2(); } /* DB ED */ - -OP(ed,10) { illegal_2(); } /* DB ED */ -OP(ed,11) { illegal_2(); } /* DB ED */ -OP(ed,12) { illegal_2(); } /* DB ED */ -OP(ed,13) { illegal_2(); } /* DB ED */ -OP(ed,14) { illegal_2(); } /* DB ED */ -OP(ed,15) { illegal_2(); } /* DB ED */ -OP(ed,16) { illegal_2(); } /* DB ED */ -OP(ed,17) { illegal_2(); } /* DB ED */ - -OP(ed,18) { illegal_2(); } /* DB ED */ -OP(ed,19) { illegal_2(); } /* DB ED */ -OP(ed,1a) { illegal_2(); } /* DB ED */ -OP(ed,1b) { illegal_2(); } /* DB ED */ -OP(ed,1c) { illegal_2(); } /* DB ED */ -OP(ed,1d) { illegal_2(); } /* DB ED */ -OP(ed,1e) { illegal_2(); } /* DB ED */ -OP(ed,1f) { illegal_2(); } /* DB ED */ - -OP(ed,20) { illegal_2(); } /* DB ED */ -OP(ed,21) { illegal_2(); } /* DB ED */ -OP(ed,22) { illegal_2(); } /* DB ED */ -OP(ed,23) { illegal_2(); } /* DB ED */ -OP(ed,24) { illegal_2(); } /* DB ED */ -OP(ed,25) { illegal_2(); } /* DB ED */ -OP(ed,26) { illegal_2(); } /* DB ED */ -OP(ed,27) { illegal_2(); } /* DB ED */ - -OP(ed,28) { illegal_2(); } /* DB ED */ -OP(ed,29) { illegal_2(); } /* DB ED */ -OP(ed,2a) { illegal_2(); } /* DB ED */ -OP(ed,2b) { illegal_2(); } /* DB ED */ -OP(ed,2c) { illegal_2(); } /* DB ED */ -OP(ed,2d) { illegal_2(); } /* DB ED */ -OP(ed,2e) { illegal_2(); } /* DB ED */ -OP(ed,2f) { illegal_2(); } /* DB ED */ - -OP(ed,30) { illegal_2(); } /* DB ED */ -OP(ed,31) { illegal_2(); } /* DB ED */ -OP(ed,32) { illegal_2(); } /* DB ED */ -OP(ed,33) { illegal_2(); } /* DB ED */ -OP(ed,34) { illegal_2(); } /* DB ED */ -OP(ed,35) { illegal_2(); } /* DB ED */ -OP(ed,36) { illegal_2(); } /* DB ED */ -OP(ed,37) { illegal_2(); } /* DB ED */ - -OP(ed,38) { illegal_2(); } /* DB ED */ -OP(ed,39) { illegal_2(); } /* DB ED */ -OP(ed,3a) { illegal_2(); } /* DB ED */ -OP(ed,3b) { illegal_2(); } /* DB ED */ -OP(ed,3c) { illegal_2(); } /* DB ED */ -OP(ed,3d) { illegal_2(); } /* DB ED */ -OP(ed,3e) { illegal_2(); } /* DB ED */ -OP(ed,3f) { illegal_2(); } /* DB ED */ - -OP(ed,40) { _B = IN(_BC); _F = (_F & CF) | SZP[_B]; } /* IN B,(C) */ -OP(ed,41) { OUT(_BC,_B); } /* OUT (C),B */ -OP(ed,42) { SBC16( BC ); } /* SBC HL,BC */ -OP(ed,43) { EA = ARG16(); WM16( EA, &Z80.BC ); } /* LD (w),BC */ -OP(ed,44) { NEG; } /* NEG */ -OP(ed,45) { RETN; } /* RETN; */ -OP(ed,46) { _IM = 0; } /* IM 0 */ -OP(ed,47) { LD_I_A; } /* LD I,A */ - -OP(ed,48) { _C = IN(_BC); _F = (_F & CF) | SZP[_C]; } /* IN C,(C) */ -OP(ed,49) { OUT(_BC,_C); } /* OUT (C),C */ -OP(ed,4a) { ADC16( BC ); } /* ADC HL,BC */ -OP(ed,4b) { EA = ARG16(); RM16( EA, &Z80.BC ); } /* LD BC,(w) */ -OP(ed,4c) { NEG; } /* NEG */ -OP(ed,4d) { RETI; } /* RETI */ -OP(ed,4e) { _IM = 0; } /* IM 0 */ -OP(ed,4f) { LD_R_A; } /* LD R,A */ - -OP(ed,50) { _D = IN(_BC); _F = (_F & CF) | SZP[_D]; } /* IN D,(C) */ -OP(ed,51) { OUT(_BC,_D); } /* OUT (C),D */ -OP(ed,52) { SBC16( DE ); } /* SBC HL,DE */ -OP(ed,53) { EA = ARG16(); WM16( EA, &Z80.DE ); } /* LD (w),DE */ -OP(ed,54) { NEG; } /* NEG */ -OP(ed,55) { RETN; } /* RETN; */ -OP(ed,56) { _IM = 1; } /* IM 1 */ -OP(ed,57) { LD_A_I; } /* LD A,I */ - -OP(ed,58) { _E = IN(_BC); _F = (_F & CF) | SZP[_E]; } /* IN E,(C) */ -OP(ed,59) { OUT(_BC,_E); } /* OUT (C),E */ -OP(ed,5a) { ADC16( DE ); } /* ADC HL,DE */ -OP(ed,5b) { EA = ARG16(); RM16( EA, &Z80.DE ); } /* LD DE,(w) */ -OP(ed,5c) { NEG; } /* NEG */ -OP(ed,5d) { RETI; } /* RETI */ -OP(ed,5e) { _IM = 2; } /* IM 2 */ -OP(ed,5f) { LD_A_R; } /* LD A,R */ - -OP(ed,60) { _H = IN(_BC); _F = (_F & CF) | SZP[_H]; } /* IN H,(C) */ -OP(ed,61) { OUT(_BC,_H); } /* OUT (C),H */ -OP(ed,62) { SBC16( HL ); } /* SBC HL,HL */ -OP(ed,63) { EA = ARG16(); WM16( EA, &Z80.HL ); } /* LD (w),HL */ -OP(ed,64) { NEG; } /* NEG */ -OP(ed,65) { RETN; } /* RETN; */ -OP(ed,66) { _IM = 0; } /* IM 0 */ -OP(ed,67) { RRD; } /* RRD (HL) */ - -OP(ed,68) { _L = IN(_BC); _F = (_F & CF) | SZP[_L]; } /* IN L,(C) */ -OP(ed,69) { OUT(_BC,_L); } /* OUT (C),L */ -OP(ed,6a) { ADC16( HL ); } /* ADC HL,HL */ -OP(ed,6b) { EA = ARG16(); RM16( EA, &Z80.HL ); } /* LD HL,(w) */ -OP(ed,6c) { NEG; } /* NEG */ -OP(ed,6d) { RETI; } /* RETI */ -OP(ed,6e) { _IM = 0; } /* IM 0 */ -OP(ed,6f) { RLD; } /* RLD (HL) */ - -OP(ed,70) { UINT8 res = IN(_BC); _F = (_F & CF) | SZP[res]; } /* IN 0,(C) */ -OP(ed,71) { OUT(_BC,0); } /* OUT (C),0 */ -OP(ed,72) { SBC16( SP ); } /* SBC HL,SP */ -OP(ed,73) { EA = ARG16(); WM16( EA, &Z80.SP ); } /* LD (w),SP */ -OP(ed,74) { NEG; } /* NEG */ -OP(ed,75) { RETN; } /* RETN; */ -OP(ed,76) { _IM = 1; } /* IM 1 */ -OP(ed,77) { illegal_2(); } /* DB ED,77 */ - -OP(ed,78) { _A = IN(_BC); _F = (_F & CF) | SZP[_A]; } /* IN E,(C) */ -OP(ed,79) { OUT(_BC,_A); } /* OUT (C),E */ -OP(ed,7a) { ADC16( SP ); } /* ADC HL,SP */ -OP(ed,7b) { EA = ARG16(); RM16( EA, &Z80.SP ); } /* LD SP,(w) */ -OP(ed,7c) { NEG; } /* NEG */ -OP(ed,7d) { RETI; } /* RETI */ -OP(ed,7e) { _IM = 2; } /* IM 2 */ -OP(ed,7f) { illegal_2(); } /* DB ED,7F */ - -OP(ed,80) { illegal_2(); } /* DB ED */ -OP(ed,81) { illegal_2(); } /* DB ED */ -OP(ed,82) { illegal_2(); } /* DB ED */ -OP(ed,83) { illegal_2(); } /* DB ED */ -OP(ed,84) { illegal_2(); } /* DB ED */ -OP(ed,85) { illegal_2(); } /* DB ED */ -OP(ed,86) { illegal_2(); } /* DB ED */ -OP(ed,87) { illegal_2(); } /* DB ED */ - -OP(ed,88) { illegal_2(); } /* DB ED */ -OP(ed,89) { illegal_2(); } /* DB ED */ -OP(ed,8a) { illegal_2(); } /* DB ED */ -OP(ed,8b) { illegal_2(); } /* DB ED */ -OP(ed,8c) { illegal_2(); } /* DB ED */ -OP(ed,8d) { illegal_2(); } /* DB ED */ -OP(ed,8e) { illegal_2(); } /* DB ED */ -OP(ed,8f) { illegal_2(); } /* DB ED */ - -OP(ed,90) { illegal_2(); } /* DB ED */ -OP(ed,91) { illegal_2(); } /* DB ED */ -OP(ed,92) { illegal_2(); } /* DB ED */ -OP(ed,93) { illegal_2(); } /* DB ED */ -OP(ed,94) { illegal_2(); } /* DB ED */ -OP(ed,95) { illegal_2(); } /* DB ED */ -OP(ed,96) { illegal_2(); } /* DB ED */ -OP(ed,97) { illegal_2(); } /* DB ED */ - -OP(ed,98) { illegal_2(); } /* DB ED */ -OP(ed,99) { illegal_2(); } /* DB ED */ -OP(ed,9a) { illegal_2(); } /* DB ED */ -OP(ed,9b) { illegal_2(); } /* DB ED */ -OP(ed,9c) { illegal_2(); } /* DB ED */ -OP(ed,9d) { illegal_2(); } /* DB ED */ -OP(ed,9e) { illegal_2(); } /* DB ED */ -OP(ed,9f) { illegal_2(); } /* DB ED */ - -OP(ed,a0) { LDI; } /* LDI */ -OP(ed,a1) { CPI; } /* CPI */ -OP(ed,a2) { INI; } /* INI */ -OP(ed,a3) { OUTI; } /* OUTI */ -OP(ed,a4) { illegal_2(); } /* DB ED */ -OP(ed,a5) { illegal_2(); } /* DB ED */ -OP(ed,a6) { illegal_2(); } /* DB ED */ -OP(ed,a7) { illegal_2(); } /* DB ED */ - -OP(ed,a8) { LDD; } /* LDD */ -OP(ed,a9) { CPD; } /* CPD */ -OP(ed,aa) { IND; } /* IND */ -OP(ed,ab) { OUTD; } /* OUTD */ -OP(ed,ac) { illegal_2(); } /* DB ED */ -OP(ed,ad) { illegal_2(); } /* DB ED */ -OP(ed,ae) { illegal_2(); } /* DB ED */ -OP(ed,af) { illegal_2(); } /* DB ED */ - -OP(ed,b0) { LDIR; } /* LDIR */ -OP(ed,b1) { CPIR; } /* CPIR */ -OP(ed,b2) { INIR; } /* INIR */ -OP(ed,b3) { OTIR; } /* OTIR */ -OP(ed,b4) { illegal_2(); } /* DB ED */ -OP(ed,b5) { illegal_2(); } /* DB ED */ -OP(ed,b6) { illegal_2(); } /* DB ED */ -OP(ed,b7) { illegal_2(); } /* DB ED */ - -OP(ed,b8) { LDDR; } /* LDDR */ -OP(ed,b9) { CPDR; } /* CPDR */ -OP(ed,ba) { INDR; } /* INDR */ -OP(ed,bb) { OTDR; } /* OTDR */ -OP(ed,bc) { illegal_2(); } /* DB ED */ -OP(ed,bd) { illegal_2(); } /* DB ED */ -OP(ed,be) { illegal_2(); } /* DB ED */ -OP(ed,bf) { illegal_2(); } /* DB ED */ - -OP(ed,c0) { illegal_2(); } /* DB ED */ -OP(ed,c1) { illegal_2(); } /* DB ED */ -OP(ed,c2) { illegal_2(); } /* DB ED */ -OP(ed,c3) { illegal_2(); } /* DB ED */ -OP(ed,c4) { illegal_2(); } /* DB ED */ -OP(ed,c5) { illegal_2(); } /* DB ED */ -OP(ed,c6) { illegal_2(); } /* DB ED */ -OP(ed,c7) { illegal_2(); } /* DB ED */ - -OP(ed,c8) { illegal_2(); } /* DB ED */ -OP(ed,c9) { illegal_2(); } /* DB ED */ -OP(ed,ca) { illegal_2(); } /* DB ED */ -OP(ed,cb) { illegal_2(); } /* DB ED */ -OP(ed,cc) { illegal_2(); } /* DB ED */ -OP(ed,cd) { illegal_2(); } /* DB ED */ -OP(ed,ce) { illegal_2(); } /* DB ED */ -OP(ed,cf) { illegal_2(); } /* DB ED */ - -OP(ed,d0) { illegal_2(); } /* DB ED */ -OP(ed,d1) { illegal_2(); } /* DB ED */ -OP(ed,d2) { illegal_2(); } /* DB ED */ -OP(ed,d3) { illegal_2(); } /* DB ED */ -OP(ed,d4) { illegal_2(); } /* DB ED */ -OP(ed,d5) { illegal_2(); } /* DB ED */ -OP(ed,d6) { illegal_2(); } /* DB ED */ -OP(ed,d7) { illegal_2(); } /* DB ED */ - -OP(ed,d8) { illegal_2(); } /* DB ED */ -OP(ed,d9) { illegal_2(); } /* DB ED */ -OP(ed,da) { illegal_2(); } /* DB ED */ -OP(ed,db) { illegal_2(); } /* DB ED */ -OP(ed,dc) { illegal_2(); } /* DB ED */ -OP(ed,dd) { illegal_2(); } /* DB ED */ -OP(ed,de) { illegal_2(); } /* DB ED */ -OP(ed,df) { illegal_2(); } /* DB ED */ - -OP(ed,e0) { illegal_2(); } /* DB ED */ -OP(ed,e1) { illegal_2(); } /* DB ED */ -OP(ed,e2) { illegal_2(); } /* DB ED */ -OP(ed,e3) { illegal_2(); } /* DB ED */ -OP(ed,e4) { illegal_2(); } /* DB ED */ -OP(ed,e5) { illegal_2(); } /* DB ED */ -OP(ed,e6) { illegal_2(); } /* DB ED */ -OP(ed,e7) { illegal_2(); } /* DB ED */ - -OP(ed,e8) { illegal_2(); } /* DB ED */ -OP(ed,e9) { illegal_2(); } /* DB ED */ -OP(ed,ea) { illegal_2(); } /* DB ED */ -OP(ed,eb) { illegal_2(); } /* DB ED */ -OP(ed,ec) { illegal_2(); } /* DB ED */ -OP(ed,ed) { illegal_2(); } /* DB ED */ -OP(ed,ee) { illegal_2(); } /* DB ED */ -OP(ed,ef) { illegal_2(); } /* DB ED */ - -OP(ed,f0) { illegal_2(); } /* DB ED */ -OP(ed,f1) { illegal_2(); } /* DB ED */ -OP(ed,f2) { illegal_2(); } /* DB ED */ -OP(ed,f3) { illegal_2(); } /* DB ED */ -OP(ed,f4) { illegal_2(); } /* DB ED */ -OP(ed,f5) { illegal_2(); } /* DB ED */ -OP(ed,f6) { illegal_2(); } /* DB ED */ -OP(ed,f7) { illegal_2(); } /* DB ED */ - -OP(ed,f8) { illegal_2(); } /* DB ED */ -OP(ed,f9) { illegal_2(); } /* DB ED */ -OP(ed,fa) { illegal_2(); } /* DB ED */ -OP(ed,fb) { illegal_2(); } /* DB ED */ -OP(ed,fc) { illegal_2(); } /* DB ED */ -OP(ed,fd) { illegal_2(); } /* DB ED */ -OP(ed,fe) { illegal_2(); } /* DB ED */ -OP(ed,ff) { illegal_2(); } /* DB ED */ - -#if TIME_LOOP_HACKS - -#define CHECK_BC_LOOP \ -if( _BC > 1 && _PCD < 0xfffc ) { \ - UINT8 op1 = cpu_readop(_PCD); \ - UINT8 op2 = cpu_readop(_PCD+1); \ - if( (op1==0x78 && op2==0xb1) || (op1==0x79 && op2==0xb0) ) \ - { \ - UINT8 op3 = cpu_readop(_PCD+2); \ - UINT8 op4 = cpu_readop(_PCD+3); \ - if( op3==0x20 && op4==0xfb ) \ - { \ - int cnt = \ - cc[Z80_TABLE_op][0x78] + \ - cc[Z80_TABLE_op][0xb1] + \ - cc[Z80_TABLE_op][0x20] + \ - cc[Z80_TABLE_ex][0x20]; \ - while( _BC > 0 && z80_ICount > cnt ) \ - { \ - BURNODD( cnt, 4, cnt ); \ - _BC--; \ - } \ - } \ - else \ - if( op3 == 0xc2 ) \ - { \ - UINT8 ad1 = cpu_readop_arg(_PCD+3); \ - UINT8 ad2 = cpu_readop_arg(_PCD+4); \ - if( (ad1 + 256 * ad2) == (_PCD - 1) ) \ - { \ - int cnt = \ - cc[Z80_TABLE_op][0x78] + \ - cc[Z80_TABLE_op][0xb1] + \ - cc[Z80_TABLE_op][0xc2] + \ - cc[Z80_TABLE_ex][0xc2]; \ - while( _BC > 0 && z80_ICount > cnt ) \ - { \ - BURNODD( cnt, 4, cnt ); \ - _BC--; \ - } \ - } \ - } \ - } \ -} - -#define CHECK_DE_LOOP \ -if( _DE > 1 && _PCD < 0xfffc ) { \ - UINT8 op1 = cpu_readop(_PCD); \ - UINT8 op2 = cpu_readop(_PCD+1); \ - if( (op1==0x7a && op2==0xb3) || (op1==0x7b && op2==0xb2) ) \ - { \ - UINT8 op3 = cpu_readop(_PCD+2); \ - UINT8 op4 = cpu_readop(_PCD+3); \ - if( op3==0x20 && op4==0xfb ) \ - { \ - int cnt = \ - cc[Z80_TABLE_op][0x7a] + \ - cc[Z80_TABLE_op][0xb3] + \ - cc[Z80_TABLE_op][0x20] + \ - cc[Z80_TABLE_ex][0x20]; \ - while( _DE > 0 && z80_ICount > cnt ) \ - { \ - BURNODD( cnt, 4, cnt ); \ - _DE--; \ - } \ - } \ - else \ - if( op3==0xc2 ) \ - { \ - UINT8 ad1 = cpu_readop_arg(_PCD+3); \ - UINT8 ad2 = cpu_readop_arg(_PCD+4); \ - if( (ad1 + 256 * ad2) == (_PCD - 1) ) \ - { \ - int cnt = \ - cc[Z80_TABLE_op][0x7a] + \ - cc[Z80_TABLE_op][0xb3] + \ - cc[Z80_TABLE_op][0xc2] + \ - cc[Z80_TABLE_ex][0xc2]; \ - while( _DE > 0 && z80_ICount > cnt ) \ - { \ - BURNODD( cnt, 4, cnt ); \ - _DE--; \ - } \ - } \ - } \ - } \ -} - -#define CHECK_HL_LOOP \ -if( _HL > 1 && _PCD < 0xfffc ) { \ - UINT8 op1 = cpu_readop(_PCD); \ - UINT8 op2 = cpu_readop(_PCD+1); \ - if( (op1==0x7c && op2==0xb5) || (op1==0x7d && op2==0xb4) ) \ - { \ - UINT8 op3 = cpu_readop(_PCD+2); \ - UINT8 op4 = cpu_readop(_PCD+3); \ - if( op3==0x20 && op4==0xfb ) \ - { \ - int cnt = \ - cc[Z80_TABLE_op][0x7c] + \ - cc[Z80_TABLE_op][0xb5] + \ - cc[Z80_TABLE_op][0x20] + \ - cc[Z80_TABLE_ex][0x20]; \ - while( _HL > 0 && z80_ICount > cnt ) \ - { \ - BURNODD( cnt, 4, cnt ); \ - _HL--; \ - } \ - } \ - else \ - if( op3==0xc2 ) \ - { \ - UINT8 ad1 = cpu_readop_arg(_PCD+3); \ - UINT8 ad2 = cpu_readop_arg(_PCD+4); \ - if( (ad1 + 256 * ad2) == (_PCD - 1) ) \ - { \ - int cnt = \ - cc[Z80_TABLE_op][0x7c] + \ - cc[Z80_TABLE_op][0xb5] + \ - cc[Z80_TABLE_op][0xc2] + \ - cc[Z80_TABLE_ex][0xc2]; \ - while( _HL > 0 && z80_ICount > cnt ) \ - { \ - BURNODD( cnt, 4, cnt ); \ - _HL--; \ - } \ - } \ - } \ - } \ -} - -#else - -#define CHECK_BC_LOOP -#define CHECK_DE_LOOP -#define CHECK_HL_LOOP - -#endif - -/********************************************************** - * main opcodes - **********************************************************/ -OP(op,00) { } /* NOP */ -OP(op,01) { _BC = ARG16(); } /* LD BC,w */ -OP(op,02) { WM( _BC, _A ); } /* LD (BC),A */ -OP(op,03) { _BC++; } /* INC BC */ -OP(op,04) { _B = INC(_B); } /* INC B */ -OP(op,05) { _B = DEC(_B); } /* DEC B */ -OP(op,06) { _B = ARG(); } /* LD B,n */ -OP(op,07) { RLCA; } /* RLCA */ - -OP(op,08) { EX_AF; } /* EX AF,AF' */ -OP(op,09) { ADD16(HL,BC); } /* ADD HL,BC */ -OP(op,0a) { _A = RM(_BC); } /* LD A,(BC) */ -OP(op,0b) { _BC--; CHECK_BC_LOOP; } /* DEC BC */ -OP(op,0c) { _C = INC(_C); } /* INC C */ -OP(op,0d) { _C = DEC(_C); } /* DEC C */ -OP(op,0e) { _C = ARG(); } /* LD C,n */ -OP(op,0f) { RRCA; } /* RRCA */ - -OP(op,10) { _B--; JR_COND( _B, 0x10 ); } /* DJNZ o */ -OP(op,11) { _DE = ARG16(); } /* LD DE,w */ -OP(op,12) { WM( _DE, _A ); } /* LD (DE),A */ -OP(op,13) { _DE++; } /* INC DE */ -OP(op,14) { _D = INC(_D); } /* INC D */ -OP(op,15) { _D = DEC(_D); } /* DEC D */ -OP(op,16) { _D = ARG(); } /* LD D,n */ -OP(op,17) { RLA; } /* RLA */ - -OP(op,18) { JR(); } /* JR o */ -OP(op,19) { ADD16(HL,DE); } /* ADD HL,DE */ -OP(op,1a) { _A = RM(_DE); } /* LD A,(DE) */ -OP(op,1b) { _DE--; CHECK_DE_LOOP; } /* DEC DE */ -OP(op,1c) { _E = INC(_E); } /* INC E */ -OP(op,1d) { _E = DEC(_E); } /* DEC E */ -OP(op,1e) { _E = ARG(); } /* LD E,n */ -OP(op,1f) { RRA; } /* RRA */ - -OP(op,20) { JR_COND( !(_F & ZF), 0x20 ); } /* JR NZ,o */ -OP(op,21) { _HL = ARG16(); } /* LD HL,w */ -OP(op,22) { EA = ARG16(); WM16( EA, &Z80.HL ); } /* LD (w),HL */ -OP(op,23) { _HL++; } /* INC HL */ -OP(op,24) { _H = INC(_H); } /* INC H */ -OP(op,25) { _H = DEC(_H); } /* DEC H */ -OP(op,26) { _H = ARG(); } /* LD H,n */ -OP(op,27) { DAA; } /* DAA */ - -OP(op,28) { JR_COND( _F & ZF, 0x28 ); } /* JR Z,o */ -OP(op,29) { ADD16(HL,HL); } /* ADD HL,HL */ -OP(op,2a) { EA = ARG16(); RM16( EA, &Z80.HL ); } /* LD HL,(w) */ -OP(op,2b) { _HL--; CHECK_HL_LOOP; } /* DEC HL */ -OP(op,2c) { _L = INC(_L); } /* INC L */ -OP(op,2d) { _L = DEC(_L); } /* DEC L */ -OP(op,2e) { _L = ARG(); } /* LD L,n */ -OP(op,2f) { _A ^= 0xff; _F = (_F&(SF|ZF|PF|CF))|HF|NF|(_A&(YF|XF)); } /* CPL */ - -OP(op,30) { JR_COND( !(_F & CF), 0x30 ); } /* JR NC,o */ -OP(op,31) { _SP = ARG16(); } /* LD SP,w */ -OP(op,32) { EA = ARG16(); WM( EA, _A ); } /* LD (w),A */ -OP(op,33) { _SP++; } /* INC SP */ -OP(op,34) { WM( _HL, INC(RM(_HL)) ); } /* INC (HL) */ -OP(op,35) { WM( _HL, DEC(RM(_HL)) ); } /* DEC (HL) */ -OP(op,36) { WM( _HL, ARG() ); } /* LD (HL),n */ -OP(op,37) { _F = (_F & (SF|ZF|PF)) | CF | (_A & (YF|XF)); } /* SCF */ - -OP(op,38) { JR_COND( _F & CF, 0x38 ); } /* JR C,o */ -OP(op,39) { ADD16(HL,SP); } /* ADD HL,SP */ -OP(op,3a) { EA = ARG16(); _A = RM( EA ); } /* LD A,(w) */ -OP(op,3b) { _SP--; } /* DEC SP */ -OP(op,3c) { _A = INC(_A); } /* INC A */ -OP(op,3d) { _A = DEC(_A); } /* DEC A */ -OP(op,3e) { _A = ARG(); } /* LD A,n */ -OP(op,3f) { _F = ((_F&(SF|ZF|PF|CF))|((_F&CF)<<4)|(_A&(YF|XF)))^CF; } /* CCF */ -//OP(op,3f) { _F = ((_F & ~(HF|NF)) | ((_F & CF)<<4)) ^ CF; } /* CCF */ - -OP(op,40) { } /* LD B,B */ -OP(op,41) { _B = _C; } /* LD B,C */ -OP(op,42) { _B = _D; } /* LD B,D */ -OP(op,43) { _B = _E; } /* LD B,E */ -OP(op,44) { _B = _H; } /* LD B,H */ -OP(op,45) { _B = _L; } /* LD B,L */ -OP(op,46) { _B = RM(_HL); } /* LD B,(HL) */ -OP(op,47) { _B = _A; } /* LD B,A */ - -OP(op,48) { _C = _B; } /* LD C,B */ -OP(op,49) { } /* LD C,C */ -OP(op,4a) { _C = _D; } /* LD C,D */ -OP(op,4b) { _C = _E; } /* LD C,E */ -OP(op,4c) { _C = _H; } /* LD C,H */ -OP(op,4d) { _C = _L; } /* LD C,L */ -OP(op,4e) { _C = RM(_HL); } /* LD C,(HL) */ -OP(op,4f) { _C = _A; } /* LD C,A */ - -OP(op,50) { _D = _B; } /* LD D,B */ -OP(op,51) { _D = _C; } /* LD D,C */ -OP(op,52) { } /* LD D,D */ -OP(op,53) { _D = _E; } /* LD D,E */ -OP(op,54) { _D = _H; } /* LD D,H */ -OP(op,55) { _D = _L; } /* LD D,L */ -OP(op,56) { _D = RM(_HL); } /* LD D,(HL) */ -OP(op,57) { _D = _A; } /* LD D,A */ - -OP(op,58) { _E = _B; } /* LD E,B */ -OP(op,59) { _E = _C; } /* LD E,C */ -OP(op,5a) { _E = _D; } /* LD E,D */ -OP(op,5b) { } /* LD E,E */ -OP(op,5c) { _E = _H; } /* LD E,H */ -OP(op,5d) { _E = _L; } /* LD E,L */ -OP(op,5e) { _E = RM(_HL); } /* LD E,(HL) */ -OP(op,5f) { _E = _A; } /* LD E,A */ - -OP(op,60) { _H = _B; } /* LD H,B */ -OP(op,61) { _H = _C; } /* LD H,C */ -OP(op,62) { _H = _D; } /* LD H,D */ -OP(op,63) { _H = _E; } /* LD H,E */ -OP(op,64) { } /* LD H,H */ -OP(op,65) { _H = _L; } /* LD H,L */ -OP(op,66) { _H = RM(_HL); } /* LD H,(HL) */ -OP(op,67) { _H = _A; } /* LD H,A */ - -OP(op,68) { _L = _B; } /* LD L,B */ -OP(op,69) { _L = _C; } /* LD L,C */ -OP(op,6a) { _L = _D; } /* LD L,D */ -OP(op,6b) { _L = _E; } /* LD L,E */ -OP(op,6c) { _L = _H; } /* LD L,H */ -OP(op,6d) { } /* LD L,L */ -OP(op,6e) { _L = RM(_HL); } /* LD L,(HL) */ -OP(op,6f) { _L = _A; } /* LD L,A */ - -OP(op,70) { WM( _HL, _B ); } /* LD (HL),B */ -OP(op,71) { WM( _HL, _C ); } /* LD (HL),C */ -OP(op,72) { WM( _HL, _D ); } /* LD (HL),D */ -OP(op,73) { WM( _HL, _E ); } /* LD (HL),E */ -OP(op,74) { WM( _HL, _H ); } /* LD (HL),H */ -OP(op,75) { WM( _HL, _L ); } /* LD (HL),L */ -OP(op,76) { ENTER_HALT; } /* HALT */ -OP(op,77) { WM( _HL, _A ); } /* LD (HL),A */ - -OP(op,78) { _A = _B; } /* LD A,B */ -OP(op,79) { _A = _C; } /* LD A,C */ -OP(op,7a) { _A = _D; } /* LD A,D */ -OP(op,7b) { _A = _E; } /* LD A,E */ -OP(op,7c) { _A = _H; } /* LD A,H */ -OP(op,7d) { _A = _L; } /* LD A,L */ -OP(op,7e) { _A = RM(_HL); } /* LD A,(HL) */ -OP(op,7f) { } /* LD A,A */ - -OP(op,80) { ADD(_B); } /* ADD A,B */ -OP(op,81) { ADD(_C); } /* ADD A,C */ -OP(op,82) { ADD(_D); } /* ADD A,D */ -OP(op,83) { ADD(_E); } /* ADD A,E */ -OP(op,84) { ADD(_H); } /* ADD A,H */ -OP(op,85) { ADD(_L); } /* ADD A,L */ -OP(op,86) { ADD(RM(_HL)); } /* ADD A,(HL) */ -OP(op,87) { ADD(_A); } /* ADD A,A */ - -OP(op,88) { ADC(_B); } /* ADC A,B */ -OP(op,89) { ADC(_C); } /* ADC A,C */ -OP(op,8a) { ADC(_D); } /* ADC A,D */ -OP(op,8b) { ADC(_E); } /* ADC A,E */ -OP(op,8c) { ADC(_H); } /* ADC A,H */ -OP(op,8d) { ADC(_L); } /* ADC A,L */ -OP(op,8e) { ADC(RM(_HL)); } /* ADC A,(HL) */ -OP(op,8f) { ADC(_A); } /* ADC A,A */ - -OP(op,90) { SUB(_B); } /* SUB B */ -OP(op,91) { SUB(_C); } /* SUB C */ -OP(op,92) { SUB(_D); } /* SUB D */ -OP(op,93) { SUB(_E); } /* SUB E */ -OP(op,94) { SUB(_H); } /* SUB H */ -OP(op,95) { SUB(_L); } /* SUB L */ -OP(op,96) { SUB(RM(_HL)); } /* SUB (HL) */ -OP(op,97) { SUB(_A); } /* SUB A */ - -OP(op,98) { SBC(_B); } /* SBC A,B */ -OP(op,99) { SBC(_C); } /* SBC A,C */ -OP(op,9a) { SBC(_D); } /* SBC A,D */ -OP(op,9b) { SBC(_E); } /* SBC A,E */ -OP(op,9c) { SBC(_H); } /* SBC A,H */ -OP(op,9d) { SBC(_L); } /* SBC A,L */ -OP(op,9e) { SBC(RM(_HL)); } /* SBC A,(HL) */ -OP(op,9f) { SBC(_A); } /* SBC A,A */ - -OP(op,a0) { AND(_B); } /* AND B */ -OP(op,a1) { AND(_C); } /* AND C */ -OP(op,a2) { AND(_D); } /* AND D */ -OP(op,a3) { AND(_E); } /* AND E */ -OP(op,a4) { AND(_H); } /* AND H */ -OP(op,a5) { AND(_L); } /* AND L */ -OP(op,a6) { AND(RM(_HL)); } /* AND (HL) */ -OP(op,a7) { AND(_A); } /* AND A */ - -OP(op,a8) { XOR(_B); } /* XOR B */ -OP(op,a9) { XOR(_C); } /* XOR C */ -OP(op,aa) { XOR(_D); } /* XOR D */ -OP(op,ab) { XOR(_E); } /* XOR E */ -OP(op,ac) { XOR(_H); } /* XOR H */ -OP(op,ad) { XOR(_L); } /* XOR L */ -OP(op,ae) { XOR(RM(_HL)); } /* XOR (HL) */ -OP(op,af) { XOR(_A); } /* XOR A */ - -OP(op,b0) { OR(_B); } /* OR B */ -OP(op,b1) { OR(_C); } /* OR C */ -OP(op,b2) { OR(_D); } /* OR D */ -OP(op,b3) { OR(_E); } /* OR E */ -OP(op,b4) { OR(_H); } /* OR H */ -OP(op,b5) { OR(_L); } /* OR L */ -OP(op,b6) { OR(RM(_HL)); } /* OR (HL) */ -OP(op,b7) { OR(_A); } /* OR A */ - -OP(op,b8) { CP(_B); } /* CP B */ -OP(op,b9) { CP(_C); } /* CP C */ -OP(op,ba) { CP(_D); } /* CP D */ -OP(op,bb) { CP(_E); } /* CP E */ -OP(op,bc) { CP(_H); } /* CP H */ -OP(op,bd) { CP(_L); } /* CP L */ -OP(op,be) { CP(RM(_HL)); } /* CP (HL) */ -OP(op,bf) { CP(_A); } /* CP A */ - -OP(op,c0) { RET_COND( !(_F & ZF), 0xc0 ); } /* RET NZ */ -OP(op,c1) { POP(BC); } /* POP BC */ -OP(op,c2) { JP_COND( !(_F & ZF) ); } /* JP NZ,a */ -OP(op,c3) { JP; } /* JP a */ -OP(op,c4) { CALL_COND( !(_F & ZF), 0xc4 ); } /* CALL NZ,a */ -OP(op,c5) { PUSH( BC ); } /* PUSH BC */ -OP(op,c6) { ADD(ARG()); } /* ADD A,n */ -OP(op,c7) { RST(0x00); } /* RST 0 */ - -OP(op,c8) { RET_COND( _F & ZF, 0xc8 ); } /* RET Z */ -OP(op,c9) { POP(PC); } /* RET */ -OP(op,ca) { JP_COND( _F & ZF ); } /* JP Z,a */ -OP(op,cb) { _R++; EXEC(cb,ROP()); } /* **** CB xx */ -OP(op,cc) { CALL_COND( _F & ZF, 0xcc ); } /* CALL Z,a */ -OP(op,cd) { CALL(); } /* CALL a */ -OP(op,ce) { ADC(ARG()); } /* ADC A,n */ -OP(op,cf) { RST(0x08); } /* RST 1 */ - -OP(op,d0) { RET_COND( !(_F & CF), 0xd0 ); } /* RET NC */ -OP(op,d1) { POP(DE); } /* POP DE */ -OP(op,d2) { JP_COND( !(_F & CF) ); } /* JP NC,a */ -OP(op,d3) { unsigned n = ARG() | (_A << 8); OUT( n, _A ); } /* OUT (n),A */ -OP(op,d4) { CALL_COND( !(_F & CF), 0xd4 ); } /* CALL NC,a */ -OP(op,d5) { PUSH( DE ); } /* PUSH DE */ -OP(op,d6) { SUB(ARG()); } /* SUB n */ -OP(op,d7) { RST(0x10); } /* RST 2 */ - -OP(op,d8) { RET_COND( _F & CF, 0xd8 ); } /* RET C */ -OP(op,d9) { EXX; } /* EXX */ -OP(op,da) { JP_COND( _F & CF ); } /* JP C,a */ -OP(op,db) { unsigned n = ARG() | (_A << 8); _A = IN( n ); } /* IN A,(n) */ -OP(op,dc) { CALL_COND( _F & CF, 0xdc ); } /* CALL C,a */ -OP(op,dd) { _R++; EXEC(dd,ROP()); } /* **** DD xx */ -OP(op,de) { SBC(ARG()); } /* SBC A,n */ -OP(op,df) { RST(0x18); } /* RST 3 */ - -OP(op,e0) { RET_COND( !(_F & PF), 0xe0 ); } /* RET PO */ -OP(op,e1) { POP(HL); } /* POP HL */ -OP(op,e2) { JP_COND( !(_F & PF) ); } /* JP PO,a */ -OP(op,e3) { EXSP(HL); } /* EX HL,(SP) */ -OP(op,e4) { CALL_COND( !(_F & PF), 0xe4 ); } /* CALL PO,a */ -OP(op,e5) { PUSH( HL ); } /* PUSH HL */ -OP(op,e6) { AND(ARG()); } /* AND n */ -OP(op,e7) { RST(0x20); } /* RST 4 */ - -OP(op,e8) { RET_COND( _F & PF, 0xe8 ); } /* RET PE */ -OP(op,e9) { _PC = _HL; } /* JP (HL) */ -OP(op,ea) { JP_COND( _F & PF ); } /* JP PE,a */ -OP(op,eb) { EX_DE_HL; } /* EX DE,HL */ -OP(op,ec) { CALL_COND( _F & PF, 0xec ); } /* CALL PE,a */ -OP(op,ed) { _R++; EXEC(ed,ROP()); } /* **** ED xx */ -OP(op,ee) { XOR(ARG()); } /* XOR n */ -OP(op,ef) { RST(0x28); } /* RST 5 */ - -OP(op,f0) { RET_COND( !(_F & SF), 0xf0 ); } /* RET P */ -OP(op,f1) { POP(AF); } /* POP AF */ -OP(op,f2) { JP_COND( !(_F & SF) ); } /* JP P,a */ -OP(op,f3) { _IFF1 = _IFF2 = 0; } /* DI */ -OP(op,f4) { CALL_COND( !(_F & SF), 0xf4 ); } /* CALL P,a */ -OP(op,f5) { PUSH( AF ); } /* PUSH AF */ -OP(op,f6) { OR(ARG()); } /* OR n */ -OP(op,f7) { RST(0x30); } /* RST 6 */ - -OP(op,f8) { RET_COND( _F & SF, 0xf8 ); } /* RET M */ -OP(op,f9) { _SP = _HL; } /* LD SP,HL */ -OP(op,fa) { JP_COND(_F & SF); } /* JP M,a */ -OP(op,fb) { EI; } /* EI */ -OP(op,fc) { CALL_COND( _F & SF, 0xfc ); } /* CALL M,a */ -OP(op,fd) { _R++; EXEC(fd,ROP()); } /* **** FD xx */ -OP(op,fe) { CP(ARG()); } /* CP n */ -OP(op,ff) { RST(0x38); } /* RST 7 */ - - -static void take_interrupt(void) -{ - if( _IFF1 ) - { - int irq_vector; - - /* there isn't a valid previous program counter */ - _PPC = -1; - - /* Check if processor was halted */ - LEAVE_HALT; - - if( Z80.irq_max ) /* daisy chain mode */ - { - if( Z80.request_irq >= 0 ) - { - /* Clear both interrupt flip flops */ - _IFF1 = _IFF2 = 0; - irq_vector = Z80.irq[Z80.request_irq].interrupt_entry(Z80.irq[Z80.request_irq].irq_param); - Z80.request_irq = -1; - } else return; - } - else - { - /* Clear both interrupt flip flops */ - _IFF1 = _IFF2 = 0; - /* call back the cpu interface to retrieve the vector */ - irq_vector = (*Z80.irq_callback)(0); - } - - /* Interrupt mode 2. Call [Z80.I:databyte] */ - if( _IM == 2 ) - { - irq_vector = (irq_vector & 0xff) | (_I << 8); - PUSH( PC ); - RM16( irq_vector, &Z80.PC ); - /* CALL opcode timing */ - Z80.extra_cycles += cc[Z80_TABLE_op][0xcd]; - } - else - /* Interrupt mode 1. RST 38h */ - if( _IM == 1 ) - { - PUSH( PC ); - _PCD = 0x0038; - /* RST $38 + 'interrupt latency' cycles */ - Z80.extra_cycles += cc[Z80_TABLE_op][0xff] + cc[Z80_TABLE_ex][0xff]; - } - else - { - /* Interrupt mode 0. We check for CALL and JP instructions, */ - /* if neither of these were found we assume a 1 byte opcode */ - /* was placed on the databus */ - switch (irq_vector & 0xff0000) - { - case 0xcd0000: /* call */ - PUSH( PC ); - _PCD = irq_vector & 0xffff; - /* CALL $xxxx + 'interrupt latency' cycles */ - Z80.extra_cycles += cc[Z80_TABLE_op][0xcd] + cc[Z80_TABLE_ex][0xff]; - break; - case 0xc30000: /* jump */ - _PCD = irq_vector & 0xffff; - /* JP $xxxx + 2 cycles */ - Z80.extra_cycles += cc[Z80_TABLE_op][0xc3] + cc[Z80_TABLE_ex][0xff]; - break; - default: /* rst (or other opcodes?) */ - PUSH( PC ); - _PCD = irq_vector & 0x0038; - /* RST $xx + 2 cycles */ - Z80.extra_cycles += cc[Z80_TABLE_op][_PCD] + cc[Z80_TABLE_ex][_PCD]; - break; - } - } - } -} - -/**************************************************************************** - * Reset registers to their initial values - ****************************************************************************/ -void z80_reset(void *param) -{ - Z80_DaisyChain *daisy_chain = (Z80_DaisyChain *)param; - int i, p; -#if BIG_FLAGS_ARRAY - if( !SZHVC_add || !SZHVC_sub ) - { - int oldval, newval, val; - UINT8 *padd, *padc, *psub, *psbc; - /* allocate big flag arrays once */ - SZHVC_add = (UINT8 *)malloc(2*256*256); - SZHVC_sub = (UINT8 *)malloc(2*256*256); - if( !SZHVC_add || !SZHVC_sub ) - { - LOG(("Z80: failed to allocate 2 * 128K flags arrays!!!\n")); - raise(SIGABRT); - } - padd = &SZHVC_add[ 0*256]; - padc = &SZHVC_add[256*256]; - psub = &SZHVC_sub[ 0*256]; - psbc = &SZHVC_sub[256*256]; - for (oldval = 0; oldval < 256; oldval++) - { - for (newval = 0; newval < 256; newval++) - { - /* add or adc w/o carry set */ - val = newval - oldval; - *padd = (newval) ? ((newval & 0x80) ? SF : 0) : ZF; -#if Z80_EXACT - *padd |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ -#endif - if( (newval & 0x0f) < (oldval & 0x0f) ) *padd |= HF; - if( newval < oldval ) *padd |= CF; - if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padd |= VF; - padd++; - - /* adc with carry set */ - val = newval - oldval - 1; - *padc = (newval) ? ((newval & 0x80) ? SF : 0) : ZF; -#if Z80_EXACT - *padc |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ -#endif - if( (newval & 0x0f) <= (oldval & 0x0f) ) *padc |= HF; - if( newval <= oldval ) *padc |= CF; - if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padc |= VF; - padc++; - - /* cp, sub or sbc w/o carry set */ - val = oldval - newval; - *psub = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF); -#if Z80_EXACT - *psub |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ -#endif - if( (newval & 0x0f) > (oldval & 0x0f) ) *psub |= HF; - if( newval > oldval ) *psub |= CF; - if( (val^oldval) & (oldval^newval) & 0x80 ) *psub |= VF; - psub++; - - /* sbc with carry set */ - val = oldval - newval - 1; - *psbc = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF); -#if Z80_EXACT - *psbc |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ -#endif - if( (newval & 0x0f) >= (oldval & 0x0f) ) *psbc |= HF; - if( newval >= oldval ) *psbc |= CF; - if( (val^oldval) & (oldval^newval) & 0x80 ) *psbc |= VF; - psbc++; - } - } - } -#endif - for (i = 0; i < 256; i++) - { - p = 0; - if( i&0x01 ) ++p; - if( i&0x02 ) ++p; - if( i&0x04 ) ++p; - if( i&0x08 ) ++p; - if( i&0x10 ) ++p; - if( i&0x20 ) ++p; - if( i&0x40 ) ++p; - if( i&0x80 ) ++p; - SZ[i] = i ? i & SF : ZF; -#if Z80_EXACT - SZ[i] |= (i & (YF | XF)); /* undocumented flag bits 5+3 */ -#endif - SZ_BIT[i] = i ? i & SF : ZF | PF; -#if Z80_EXACT - SZ_BIT[i] |= (i & (YF | XF)); /* undocumented flag bits 5+3 */ -#endif - SZP[i] = SZ[i] | ((p & 1) ? 0 : PF); - SZHV_inc[i] = SZ[i]; - if( i == 0x80 ) SZHV_inc[i] |= VF; - if( (i & 0x0f) == 0x00 ) SZHV_inc[i] |= HF; - SZHV_dec[i] = SZ[i] | NF; - if( i == 0x7f ) SZHV_dec[i] |= VF; - if( (i & 0x0f) == 0x0f ) SZHV_dec[i] |= HF; - } - - memset(&Z80, 0, sizeof(Z80)); - _IX = _IY = 0xffff; /* IX and IY are FFFF after a reset! */ - _F = ZF; /* Zero flag is set */ - Z80.request_irq = -1; - Z80.service_irq = -1; - Z80.nmi_state = CLEAR_LINE; - Z80.irq_state = CLEAR_LINE; - - if( daisy_chain ) - { - while( daisy_chain->irq_param != -1 && Z80.irq_max < Z80_MAXDAISY ) - { - /* set callbackhandler after reti */ - Z80.irq[Z80.irq_max] = *daisy_chain; - /* device reset */ - if( Z80.irq[Z80.irq_max].reset ) - Z80.irq[Z80.irq_max].reset(Z80.irq[Z80.irq_max].irq_param); - Z80.irq_max++; - daisy_chain++; - } - } - -} - -void z80_exit(void) -{ -#if BIG_FLAGS_ARRAY - if (SZHVC_add) free(SZHVC_add); - SZHVC_add = NULL; - if (SZHVC_sub) free(SZHVC_sub); - SZHVC_sub = NULL; -#endif -} - -void z80_end_timeslice(void) -{ - z80_ICount = 0; -} - -/**************************************************************************** - * Execute 'cycles' T-states. Return number of T-states really executed - ****************************************************************************/ -int z80_execute(int cycles) -{ - z80_ICount = cycles - Z80.extra_cycles; - Z80.extra_cycles = 0; - - do - { - _PPC = _PCD; - _R++; - EXEC_INLINE(op,ROP()); - } while( z80_ICount > 0 ); - - z80_ICount -= Z80.extra_cycles; - Z80.extra_cycles = 0; - - return cycles - z80_ICount; -} - -/**************************************************************************** - * Burn 'cycles' T-states. Adjust R register for the lost time - ****************************************************************************/ -void z80_burn(int cycles) -{ - if( cycles > 0 ) - { - /* NOP takes 4 cycles per instruction */ - int n = (cycles + 3) / 4; - _R += n; - z80_ICount -= 4 * n; - } -} - -/**************************************************************************** - * Get all registers in given buffer - ****************************************************************************/ -unsigned z80_get_context (void *dst) -{ - if( dst ) - *(Z80_Regs*)dst = Z80; - return sizeof(Z80_Regs); -} - -/**************************************************************************** - * Set all registers to given values - ****************************************************************************/ -void z80_set_context (void *src) -{ - if( src ) - Z80 = *(Z80_Regs*)src; -} - -/**************************************************************************** - * Get a pointer to a cycle count table - ****************************************************************************/ -void *z80_get_cycle_table (int which) -{ - if (which >= 0 && which <= Z80_TABLE_xycb) - return cc[which]; - return NULL; -} - -/**************************************************************************** - * Set a new cycle count table - ****************************************************************************/ -void z80_set_cycle_table (int which, void *new_table) -{ - if (which >= 0 && which <= Z80_TABLE_ex) - cc[which] = new_table; -} - -/**************************************************************************** - * Return program counter - ****************************************************************************/ -unsigned z80_get_pc (void) -{ - return _PCD; -} - -/**************************************************************************** - * Set program counter - ****************************************************************************/ -void z80_set_pc (unsigned val) -{ - _PC = val; -} - -/**************************************************************************** - * Return stack pointer - ****************************************************************************/ -unsigned z80_get_sp (void) -{ - return _SPD; -} - -/**************************************************************************** - * Set stack pointer - ****************************************************************************/ -void z80_set_sp (unsigned val) -{ - _SP = val; -} - -/**************************************************************************** - * Return a specific register - ****************************************************************************/ -unsigned z80_get_reg (int regnum) -{ - switch( regnum ) - { - case Z80_PC: return Z80.PC.w.l; - case Z80_SP: return Z80.SP.w.l; - case Z80_AF: return Z80.AF.w.l; - case Z80_BC: return Z80.BC.w.l; - case Z80_DE: return Z80.DE.w.l; - case Z80_HL: return Z80.HL.w.l; - case Z80_IX: return Z80.IX.w.l; - case Z80_IY: return Z80.IY.w.l; - case Z80_R: return (Z80.R & 0x7f) | (Z80.R2 & 0x80); - case Z80_I: return Z80.I; - case Z80_AF2: return Z80.AF2.w.l; - case Z80_BC2: return Z80.BC2.w.l; - case Z80_DE2: return Z80.DE2.w.l; - case Z80_HL2: return Z80.HL2.w.l; - case Z80_IM: return Z80.IM; - case Z80_IFF1: return Z80.IFF1; - case Z80_IFF2: return Z80.IFF2; - case Z80_HALT: return Z80.HALT; - case Z80_NMI_STATE: return Z80.nmi_state; - case Z80_IRQ_STATE: return Z80.irq_state; - case Z80_DC0: return Z80.int_state[0]; - case Z80_DC1: return Z80.int_state[1]; - case Z80_DC2: return Z80.int_state[2]; - case Z80_DC3: return Z80.int_state[3]; - case REG_PREVIOUSPC: return Z80.PREPC.w.l; - default: - if( regnum <= REG_SP_CONTENTS ) - { - unsigned offset = _SPD + 2 * (REG_SP_CONTENTS - regnum); - if( offset < 0xffff ) - return RM( offset ) | ( RM( offset + 1) << 8 ); - } - } - return 0; -} - -/**************************************************************************** - * Set a specific register - ****************************************************************************/ -void z80_set_reg (int regnum, unsigned val) -{ - switch( regnum ) - { - case Z80_PC: Z80.PC.w.l = val; break; - case Z80_SP: Z80.SP.w.l = val; break; - case Z80_AF: Z80.AF.w.l = val; break; - case Z80_BC: Z80.BC.w.l = val; break; - case Z80_DE: Z80.DE.w.l = val; break; - case Z80_HL: Z80.HL.w.l = val; break; - case Z80_IX: Z80.IX.w.l = val; break; - case Z80_IY: Z80.IY.w.l = val; break; - case Z80_R: Z80.R = val; Z80.R2 = val & 0x80; break; - case Z80_I: Z80.I = val; break; - case Z80_AF2: Z80.AF2.w.l = val; break; - case Z80_BC2: Z80.BC2.w.l = val; break; - case Z80_DE2: Z80.DE2.w.l = val; break; - case Z80_HL2: Z80.HL2.w.l = val; break; - case Z80_IM: Z80.IM = val; break; - case Z80_IFF1: Z80.IFF1 = val; break; - case Z80_IFF2: Z80.IFF2 = val; break; - case Z80_HALT: Z80.HALT = val; break; - case Z80_NMI_STATE: z80_set_nmi_line(val); break; - case Z80_IRQ_STATE: z80_set_irq_line(0,val); break; - case Z80_DC0: Z80.int_state[0] = val; break; - case Z80_DC1: Z80.int_state[1] = val; break; - case Z80_DC2: Z80.int_state[2] = val; break; - case Z80_DC3: Z80.int_state[3] = val; break; - default: - if( regnum <= REG_SP_CONTENTS ) - { - unsigned offset = _SPD + 2 * (REG_SP_CONTENTS - regnum); - if( offset < 0xffff ) - { - WM( offset, val & 0xff ); - WM( offset+1, (val >> 8) & 0xff ); - } - } - } -} - -/**************************************************************************** - * Set NMI line state - ****************************************************************************/ -void z80_set_nmi_line(int state) -{ - if( Z80.nmi_state == state ) return; - - Z80.nmi_state = state; - if( state == CLEAR_LINE ) return; - - _PPC = -1; /* there isn't a valid previous program counter */ - LEAVE_HALT; /* Check if processor was halted */ - - _IFF1 = 0; - PUSH( PC ); - _PCD = 0x0066; - Z80.extra_cycles += 11; -} - -/**************************************************************************** - * Set IRQ line state - ****************************************************************************/ -void z80_set_irq_line(int irqline, int state) -{ - Z80.irq_state = state; - if( state == CLEAR_LINE ) return; - - if( Z80.irq_max ) - { - int daisychain, device, int_state; - daisychain = (*Z80.irq_callback)(irqline); - daisychain = 0xFF; - device = daisychain >> 8; - int_state = daisychain & 0xff; - - if( Z80.int_state[device] != int_state ) - { - LOG((" change\n")); - /* set new interrupt status */ - Z80.int_state[device] = int_state; - /* check interrupt status */ - Z80.request_irq = Z80.service_irq = -1; - - /* search higher IRQ or IEO */ - for( device = 0 ; device < Z80.irq_max ; device ++ ) - { - /* IEO = disable ? */ - if( Z80.int_state[device] & Z80_INT_IEO ) - { - Z80.request_irq = -1; /* if IEO is disable , masking lower IRQ */ - Z80.service_irq = device; /* set highest interrupt service device */ - } - /* IRQ = request ? */ - if( Z80.int_state[device] & Z80_INT_REQ ) - Z80.request_irq = device; - } - if( Z80.request_irq < 0 ) return; - } - else - { - LOG((" no change\n")); - return; - } - } - take_interrupt(); -} - -/**************************************************************************** - * Set IRQ vector callback - ****************************************************************************/ -void z80_set_irq_callback(int (*callback)(int)) -{ - Z80.irq_callback = callback; -} - -#if 0 -/**************************************************************************** - * Save CPU state - ****************************************************************************/ -void z80_state_save(void *file) -{ - int cpu = cpu_getactivecpu(); - state_save_UINT16(file, "z80", cpu, "AF", &Z80.AF.w.l, 1); - state_save_UINT16(file, "z80", cpu, "BC", &Z80.BC.w.l, 1); - state_save_UINT16(file, "z80", cpu, "DE", &Z80.DE.w.l, 1); - state_save_UINT16(file, "z80", cpu, "HL", &Z80.HL.w.l, 1); - state_save_UINT16(file, "z80", cpu, "IX", &Z80.IX.w.l, 1); - state_save_UINT16(file, "z80", cpu, "IY", &Z80.IY.w.l, 1); - state_save_UINT16(file, "z80", cpu, "PC", &Z80.PC.w.l, 1); - state_save_UINT16(file, "z80", cpu, "SP", &Z80.SP.w.l, 1); - state_save_UINT16(file, "z80", cpu, "AF2", &Z80.AF2.w.l, 1); - state_save_UINT16(file, "z80", cpu, "BC2", &Z80.BC2.w.l, 1); - state_save_UINT16(file, "z80", cpu, "DE2", &Z80.DE2.w.l, 1); - state_save_UINT16(file, "z80", cpu, "HL2", &Z80.HL2.w.l, 1); - state_save_UINT8(file, "z80", cpu, "R", &Z80.R, 1); - state_save_UINT8(file, "z80", cpu, "R2", &Z80.R2, 1); - state_save_UINT8(file, "z80", cpu, "IFF1", &Z80.IFF1, 1); - state_save_UINT8(file, "z80", cpu, "IFF2", &Z80.IFF2, 1); - state_save_UINT8(file, "z80", cpu, "HALT", &Z80.HALT, 1); - state_save_UINT8(file, "z80", cpu, "IM", &Z80.IM, 1); - state_save_UINT8(file, "z80", cpu, "I", &Z80.I, 1); - state_save_UINT8(file, "z80", cpu, "irq_max", &Z80.irq_max, 1); - state_save_INT8(file, "z80", cpu, "request_irq", &Z80.request_irq, 1); - state_save_INT8(file, "z80", cpu, "service_irq", &Z80.service_irq, 1); - state_save_UINT8(file, "z80", cpu, "int_state", Z80.int_state, 4); - state_save_UINT8(file, "z80", cpu, "nmi_state", &Z80.nmi_state, 1); - state_save_UINT8(file, "z80", cpu, "irq_state", &Z80.irq_state, 1); - /* daisy chain needs to be saved by z80ctc.c somehow */ -} - -/**************************************************************************** - * Load CPU state - ****************************************************************************/ -void z80_state_load(void *file) -{ - int cpu = cpu_getactivecpu(); - state_load_UINT16(file, "z80", cpu, "AF", &Z80.AF.w.l, 1); - state_load_UINT16(file, "z80", cpu, "BC", &Z80.BC.w.l, 1); - state_load_UINT16(file, "z80", cpu, "DE", &Z80.DE.w.l, 1); - state_load_UINT16(file, "z80", cpu, "HL", &Z80.HL.w.l, 1); - state_load_UINT16(file, "z80", cpu, "IX", &Z80.IX.w.l, 1); - state_load_UINT16(file, "z80", cpu, "IY", &Z80.IY.w.l, 1); - state_load_UINT16(file, "z80", cpu, "PC", &Z80.PC.w.l, 1); - state_load_UINT16(file, "z80", cpu, "SP", &Z80.SP.w.l, 1); - state_load_UINT16(file, "z80", cpu, "AF2", &Z80.AF2.w.l, 1); - state_load_UINT16(file, "z80", cpu, "BC2", &Z80.BC2.w.l, 1); - state_load_UINT16(file, "z80", cpu, "DE2", &Z80.DE2.w.l, 1); - state_load_UINT16(file, "z80", cpu, "HL2", &Z80.HL2.w.l, 1); - state_load_UINT8(file, "z80", cpu, "R", &Z80.R, 1); - state_load_UINT8(file, "z80", cpu, "R2", &Z80.R2, 1); - state_load_UINT8(file, "z80", cpu, "IFF1", &Z80.IFF1, 1); - state_load_UINT8(file, "z80", cpu, "IFF2", &Z80.IFF2, 1); - state_load_UINT8(file, "z80", cpu, "HALT", &Z80.HALT, 1); - state_load_UINT8(file, "z80", cpu, "IM", &Z80.IM, 1); - state_load_UINT8(file, "z80", cpu, "I", &Z80.I, 1); - state_load_UINT8(file, "z80", cpu, "irq_max", &Z80.irq_max, 1); - state_load_INT8(file, "z80", cpu, "request_irq", &Z80.request_irq, 1); - state_load_INT8(file, "z80", cpu, "service_irq", &Z80.service_irq, 1); - state_load_UINT8(file, "z80", cpu, "int_state", Z80.int_state, 4); - state_load_UINT8(file, "z80", cpu, "nmi_state", &Z80.nmi_state, 1); - state_load_UINT8(file, "z80", cpu, "irq_state", &Z80.irq_state, 1); - /* daisy chain needs to be restored by z80ctc.c somehow */ -} - -/**************************************************************************** - * Return a formatted string for a register - ****************************************************************************/ -const char *z80_info(void *context, int regnum) -{ - static char buffer[32][47+1]; - static int which = 0; - Z80_Regs *r = context; - - which = ++which % 32; - buffer[which][0] = '\0'; - if( !context ) - r = &Z80; - - switch( regnum ) - { - case CPU_INFO_REG+Z80_PC: sprintf(buffer[which], "PC:%04X", r->PC.w.l); break; - case CPU_INFO_REG+Z80_SP: sprintf(buffer[which], "SP:%04X", r->SP.w.l); break; - case CPU_INFO_REG+Z80_AF: sprintf(buffer[which], "AF:%04X", r->AF.w.l); break; - case CPU_INFO_REG+Z80_BC: sprintf(buffer[which], "BC:%04X", r->BC.w.l); break; - case CPU_INFO_REG+Z80_DE: sprintf(buffer[which], "DE:%04X", r->DE.w.l); break; - case CPU_INFO_REG+Z80_HL: sprintf(buffer[which], "HL:%04X", r->HL.w.l); break; - case CPU_INFO_REG+Z80_IX: sprintf(buffer[which], "IX:%04X", r->IX.w.l); break; - case CPU_INFO_REG+Z80_IY: sprintf(buffer[which], "IY:%04X", r->IY.w.l); break; - case CPU_INFO_REG+Z80_R: sprintf(buffer[which], "R:%02X", (r->R & 0x7f) | (r->R2 & 0x80)); break; - case CPU_INFO_REG+Z80_I: sprintf(buffer[which], "I:%02X", r->I); break; - case CPU_INFO_REG+Z80_AF2: sprintf(buffer[which], "AF'%04X", r->AF2.w.l); break; - case CPU_INFO_REG+Z80_BC2: sprintf(buffer[which], "BC'%04X", r->BC2.w.l); break; - case CPU_INFO_REG+Z80_DE2: sprintf(buffer[which], "DE'%04X", r->DE2.w.l); break; - case CPU_INFO_REG+Z80_HL2: sprintf(buffer[which], "HL'%04X", r->HL2.w.l); break; - case CPU_INFO_REG+Z80_IM: sprintf(buffer[which], "IM:%X", r->IM); break; - case CPU_INFO_REG+Z80_IFF1: sprintf(buffer[which], "IFF1:%X", r->IFF1); break; - case CPU_INFO_REG+Z80_IFF2: sprintf(buffer[which], "IFF2:%X", r->IFF2); break; - case CPU_INFO_REG+Z80_HALT: sprintf(buffer[which], "HALT:%X", r->HALT); break; - case CPU_INFO_REG+Z80_NMI_STATE: sprintf(buffer[which], "NMI:%X", r->nmi_state); break; - case CPU_INFO_REG+Z80_IRQ_STATE: sprintf(buffer[which], "IRQ:%X", r->irq_state); break; - case CPU_INFO_REG+Z80_DC0: if(Z80.irq_max >= 1) sprintf(buffer[which], "DC0:%X", r->int_state[0]); break; - case CPU_INFO_REG+Z80_DC1: if(Z80.irq_max >= 2) sprintf(buffer[which], "DC1:%X", r->int_state[1]); break; - case CPU_INFO_REG+Z80_DC2: if(Z80.irq_max >= 3) sprintf(buffer[which], "DC2:%X", r->int_state[2]); break; - case CPU_INFO_REG+Z80_DC3: if(Z80.irq_max >= 4) sprintf(buffer[which], "DC3:%X", r->int_state[3]); break; - case CPU_INFO_FLAGS: - sprintf(buffer[which], "%c%c%c%c%c%c%c%c", - r->AF.b.l & 0x80 ? 'S':'.', - r->AF.b.l & 0x40 ? 'Z':'.', - r->AF.b.l & 0x20 ? '5':'.', - r->AF.b.l & 0x10 ? 'H':'.', - r->AF.b.l & 0x08 ? '3':'.', - r->AF.b.l & 0x04 ? 'P':'.', - r->AF.b.l & 0x02 ? 'N':'.', - r->AF.b.l & 0x01 ? 'C':'.'); - break; - case CPU_INFO_NAME: return "Z80"; - case CPU_INFO_FAMILY: return "Zilog Z80"; - case CPU_INFO_VERSION: return "3.2"; - case CPU_INFO_FILE: return __FILE__; - case CPU_INFO_CREDITS: return "Copyright (C) 1998,1999 Juergen Buchmueller, all rights reserved."; - case CPU_INFO_REG_LAYOUT: return (const char *)z80_reg_layout; - case CPU_INFO_WIN_LAYOUT: return (const char *)z80_win_layout; - } - return buffer[which]; -} - -unsigned z80_dasm( char *buffer, unsigned pc ) -{ -#ifdef MAME_DEBUG - return DasmZ80( buffer, pc ); -#else - sprintf( buffer, "$%02X", cpu_readop(pc) ); - return 1; -#endif -} -#endif +/***************************************************************************** + * + * z80.c + * Portable Z80 emulator V3.5 + * + * Copyright (C) 1998,1999,2000 Juergen Buchmueller, all rights reserved. + * + * - This source code is released as freeware for non-commercial purposes. + * - You are free to use and redistribute this code in modified or + * unmodified form, provided you list me in the credits. + * - If you modify this source code, you must add a notice to each modified + * source file that it has been changed. If you're a nice person, you + * will clearly mark each change too. :) + * - If you wish to use this for commercial purposes, please contact me at + * pullmoll@t-online.de + * - The author of this copywritten work reserves the right to change the + * terms of its usage and license at any time, including retroactively + * - This entire notice must remain in the source code. + * + * Changes in 3.7 [Aaron Giles] + * - Changed NMI handling. NMIs are now latched in set_irq_state + * but are not taken there. Instead they are taken at the start of the + * execute loop. + * - Changed IRQ handling. IRQ state is set in set_irq_state but not taken + * except during the inner execute loop. + * - Removed x86 assembly hacks and obsolete timing loop catchers. + * Changes in 3.6 + * - Got rid of the code that would inexactly emulate a Z80, i.e. removed + * all the #if Z80_EXACT #else branches. + * - Removed leading underscores from local register name shortcuts as + * this violates the C99 standard. + * - Renamed the registers inside the Z80 context to lower case to avoid + * ambiguities (shortcuts would have had the same names as the fields + * of the structure). + * Changes in 3.5 + * - Implemented OTIR, INIR, etc. without look-up table for PF flag. + * [Ramsoft, Sean Young] + * Changes in 3.4 + * - Removed Z80-MSX specific code as it's not needed any more. + * - Implemented DAA without look-up table [Ramsoft, Sean Young] + * Changes in 3.3 + * - Fixed undocumented flags XF & YF in the non-asm versions of CP, + * and all the 16 bit arithmetic instructions. [Sean Young] + * Changes in 3.2 + * - Fixed undocumented flags XF & YF of RRCA, and CF and HF of + * INI/IND/OUTI/OUTD/INIR/INDR/OTIR/OTDR [Sean Young] + * Changes in 3.1 + * - removed the REPEAT_AT_ONCE execution of LDIR/CPIR etc. opcodes + * for readabilities sake and because the implementation was buggy + * (and I was not able to find the difference) + * Changes in 3.0 + * - 'finished' switch to dynamically overrideable cycle count tables + * Changes in 2.9: + * - added methods to access and override the cycle count tables + * - fixed handling and timing of multiple DD/FD prefixed opcodes + * Changes in 2.8: + * - OUTI/OUTD/OTIR/OTDR also pre-decrement the B register now. + * This was wrong because of a bug fix on the wrong side + * (astrocade sound driver). + * Changes in 2.7: + * - removed z80_vm specific code, it's not needed (and never was). + * Changes in 2.6: + * - BUSY_LOOP_HACKS needed to call change_pc() earlier, before + * checking the opcodes at the new address, because otherwise they + * might access the old (wrong or even NULL) banked memory region. + * Thanks to Sean Young for finding this nasty bug. + * Changes in 2.5: + * - Burning cycles always adjusts the ICount by a multiple of 4. + * - In REPEAT_AT_ONCE cases the R register wasn't incremented twice + * per repetition as it should have been. Those repeated opcodes + * could also underflow the ICount. + * - Simplified TIME_LOOP_HACKS for BC and added two more for DE + HL + * timing loops. I think those hacks weren't endian safe before too. + * Changes in 2.4: + * - z80_reset zaps the entire context, sets IX and IY to 0xffff(!) and + * sets the Z flag. With these changes the Tehkan World Cup driver + * _seems_ to work again. + * Changes in 2.3: + * - External termination of the execution loop calls z80_burn() and + * z80_vm_burn() to burn an amount of cycles (R adjustment) + * - Shortcuts which burn CPU cycles (BUSY_LOOP_HACKS and TIME_LOOP_HACKS) + * now also adjust the R register depending on the skipped opcodes. + * Changes in 2.2: + * - Fixed bugs in CPL, SCF and CCF instructions flag handling. + * - Changed variable EA and ARG16() function to UINT32; this + * produces slightly more efficient code. + * - The DD/FD XY CB opcodes where XY is 40-7F and Y is not 6/E + * are changed to calls to the X6/XE opcodes to reduce object size. + * They're hardly ever used so this should not yield a speed penalty. + * New in 2.0: + * - Optional more exact Z80 emulation (#define Z80_EXACT 1) according + * to a detailed description by Sean Young which can be found at: + * http://www.msxnet.org/tech/z80-documented.pdf + *****************************************************************************/ +#include "shared.h" +#include "z80.h" + +#define VERBOSE 0 + +#if VERBOSE +#define LOG(x) logerror x +#else +#define LOG(x) +#endif + +#define cpu_readop(a) cpu_readmem16(a) +#define cpu_readop_arg(a) cpu_readmem16(a) + +/* execute main opcodes inside a big switch statement */ +#ifndef BIG_SWITCH +#define BIG_SWITCH 1 +#endif + +/* big flags array for ADD/ADC/SUB/SBC/CP results */ +#define BIG_FLAGS_ARRAY 1 + +/* on JP and JR opcodes check for tight loops */ +#define BUSY_LOOP_HACKS 1 + +#define change_pc(a) + +#define CF 0x01 +#define NF 0x02 +#define PF 0x04 +#define VF PF +#define XF 0x08 +#define HF 0x10 +#define YF 0x20 +#define ZF 0x40 +#define SF 0x80 + +#define INT_IRQ 0x01 +#define NMI_IRQ 0x02 + +#define PRVPC Z80.prvpc.d /* previous program counter */ + +#define PCD Z80.pc.d +#define PC Z80.pc.w.l + +#define SPD Z80.sp.d +#define SP Z80.sp.w.l + +#define AFD Z80.af.d +#define AF Z80.af.w.l +#define A Z80.af.b.h +#define F Z80.af.b.l + +#define BCD Z80.bc.d +#define BC Z80.bc.w.l +#define B Z80.bc.b.h +#define C Z80.bc.b.l + +#define DED Z80.de.d +#define DE Z80.de.w.l +#define D Z80.de.b.h +#define E Z80.de.b.l + +#define HLD Z80.hl.d +#define HL Z80.hl.w.l +#define H Z80.hl.b.h +#define L Z80.hl.b.l + +#define IXD Z80.ix.d +#define IX Z80.ix.w.l +#define HX Z80.ix.b.h +#define LX Z80.ix.b.l + +#define IYD Z80.iy.d +#define IY Z80.iy.w.l +#define HY Z80.iy.b.h +#define LY Z80.iy.b.l + +#define I Z80.i +#define R Z80.r +#define R2 Z80.r2 +#define IM Z80.im +#define IFF1 Z80.iff1 +#define IFF2 Z80.iff2 +#define HALT Z80.halt + +int z80_ICount; +Z80_Regs Z80; +static UINT32 EA; + +static UINT8 SZ[256]; /* zero and sign flags */ +static UINT8 SZ_BIT[256]; /* zero, sign and parity/overflow (=zero) flags for BIT opcode */ +static UINT8 SZP[256]; /* zero, sign and parity flags */ +static UINT8 SZHV_inc[256]; /* zero, sign, half carry and overflow flags INC r8 */ +static UINT8 SZHV_dec[256]; /* zero, sign, half carry and overflow flags DEC r8 */ + +#if BIG_FLAGS_ARRAY +static UINT8 *SZHVC_add = 0; +static UINT8 *SZHVC_sub = 0; +#endif + +static const UINT8 cc_op[0x100] = { + 4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4, + 8,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4, + 7,10,16, 6, 4, 4, 7, 4, 7,11,16, 6, 4, 4, 7, 4, + 7,10,13, 6,11,11,10, 4, 7,11,13, 6, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 5,10,10,10,10,11, 7,11, 5,10,10, 0,10,17, 7,11, + 5,10,10,11,10,11, 7,11, 5, 4,10,11,10, 0, 7,11, + 5,10,10,19,10,11, 7,11, 5, 4,10, 4,10, 0, 7,11, + 5,10,10, 4,10,11, 7,11, 5, 6,10, 4,10, 0, 7,11}; + +static const UINT8 cc_cb[0x100] = { + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8, + 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8, + 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8, + 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8}; + +static const UINT8 cc_ed[0x100] = { + 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, +12,12,15,20, 8,14, 8, 9,12,12,15,20, 8,14, 8, 9, +12,12,15,20, 8,14, 8, 9,12,12,15,20, 8,14, 8, 9, +12,12,15,20, 8,14, 8,18,12,12,15,20, 8,14, 8,18, +12,12,15,20, 8,14, 8, 8,12,12,15,20, 8,14, 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, +16,16,16,16, 8, 8, 8, 8,16,16,16,16, 8, 8, 8, 8, +16,16,16,16, 8, 8, 8, 8,16,16,16,16, 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}; + +static const UINT8 cc_xy[0x100] = { + 4, 4, 4, 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4, + 4,14,20,10, 9, 9, 9, 4, 4,15,20,10, 9, 9, 9, 4, + 4, 4, 4, 4,23,23,19, 4, 4,15, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4, + 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4, + 9, 9, 9, 9, 9, 9,19, 9, 9, 9, 9, 9, 9, 9,19, 9, +19,19,19,19,19,19, 4,19, 4, 4, 4, 4, 9, 9,19, 4, + 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4, + 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4, + 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4, + 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4,14, 4,23, 4,15, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4,10, 4, 4, 4, 4, 4, 4}; + +static const UINT8 cc_xycb[0x100] = { +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23}; + +/* extra cycles if jr/jp/call taken and 'interrupt latency' on rst 0-7 */ +static const UINT8 cc_ex[0x100] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* DJNZ */ + 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* JR NZ/JR Z */ + 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* JR NC/JR C */ + 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, 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, + 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, /* LDIR/CPIR/INIR/OTIR LDDR/CPDR/INDR/OTDR */ + 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2, + 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2, + 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2, + 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2}; + +static const UINT8 *cc[6]; +#define Z80_TABLE_dd Z80_TABLE_xy +#define Z80_TABLE_fd Z80_TABLE_xy + +typedef void (*funcptr)(void); + +#define PROTOTYPES(tablename,prefix) \ + INLINE void prefix##_00(void); INLINE void prefix##_01(void); INLINE void prefix##_02(void); INLINE void prefix##_03(void); \ + INLINE void prefix##_04(void); INLINE void prefix##_05(void); INLINE void prefix##_06(void); INLINE void prefix##_07(void); \ + INLINE void prefix##_08(void); INLINE void prefix##_09(void); INLINE void prefix##_0a(void); INLINE void prefix##_0b(void); \ + INLINE void prefix##_0c(void); INLINE void prefix##_0d(void); INLINE void prefix##_0e(void); INLINE void prefix##_0f(void); \ + INLINE void prefix##_10(void); INLINE void prefix##_11(void); INLINE void prefix##_12(void); INLINE void prefix##_13(void); \ + INLINE void prefix##_14(void); INLINE void prefix##_15(void); INLINE void prefix##_16(void); INLINE void prefix##_17(void); \ + INLINE void prefix##_18(void); INLINE void prefix##_19(void); INLINE void prefix##_1a(void); INLINE void prefix##_1b(void); \ + INLINE void prefix##_1c(void); INLINE void prefix##_1d(void); INLINE void prefix##_1e(void); INLINE void prefix##_1f(void); \ + INLINE void prefix##_20(void); INLINE void prefix##_21(void); INLINE void prefix##_22(void); INLINE void prefix##_23(void); \ + INLINE void prefix##_24(void); INLINE void prefix##_25(void); INLINE void prefix##_26(void); INLINE void prefix##_27(void); \ + INLINE void prefix##_28(void); INLINE void prefix##_29(void); INLINE void prefix##_2a(void); INLINE void prefix##_2b(void); \ + INLINE void prefix##_2c(void); INLINE void prefix##_2d(void); INLINE void prefix##_2e(void); INLINE void prefix##_2f(void); \ + INLINE void prefix##_30(void); INLINE void prefix##_31(void); INLINE void prefix##_32(void); INLINE void prefix##_33(void); \ + INLINE void prefix##_34(void); INLINE void prefix##_35(void); INLINE void prefix##_36(void); INLINE void prefix##_37(void); \ + INLINE void prefix##_38(void); INLINE void prefix##_39(void); INLINE void prefix##_3a(void); INLINE void prefix##_3b(void); \ + INLINE void prefix##_3c(void); INLINE void prefix##_3d(void); INLINE void prefix##_3e(void); INLINE void prefix##_3f(void); \ + INLINE void prefix##_40(void); INLINE void prefix##_41(void); INLINE void prefix##_42(void); INLINE void prefix##_43(void); \ + INLINE void prefix##_44(void); INLINE void prefix##_45(void); INLINE void prefix##_46(void); INLINE void prefix##_47(void); \ + INLINE void prefix##_48(void); INLINE void prefix##_49(void); INLINE void prefix##_4a(void); INLINE void prefix##_4b(void); \ + INLINE void prefix##_4c(void); INLINE void prefix##_4d(void); INLINE void prefix##_4e(void); INLINE void prefix##_4f(void); \ + INLINE void prefix##_50(void); INLINE void prefix##_51(void); INLINE void prefix##_52(void); INLINE void prefix##_53(void); \ + INLINE void prefix##_54(void); INLINE void prefix##_55(void); INLINE void prefix##_56(void); INLINE void prefix##_57(void); \ + INLINE void prefix##_58(void); INLINE void prefix##_59(void); INLINE void prefix##_5a(void); INLINE void prefix##_5b(void); \ + INLINE void prefix##_5c(void); INLINE void prefix##_5d(void); INLINE void prefix##_5e(void); INLINE void prefix##_5f(void); \ + INLINE void prefix##_60(void); INLINE void prefix##_61(void); INLINE void prefix##_62(void); INLINE void prefix##_63(void); \ + INLINE void prefix##_64(void); INLINE void prefix##_65(void); INLINE void prefix##_66(void); INLINE void prefix##_67(void); \ + INLINE void prefix##_68(void); INLINE void prefix##_69(void); INLINE void prefix##_6a(void); INLINE void prefix##_6b(void); \ + INLINE void prefix##_6c(void); INLINE void prefix##_6d(void); INLINE void prefix##_6e(void); INLINE void prefix##_6f(void); \ + INLINE void prefix##_70(void); INLINE void prefix##_71(void); INLINE void prefix##_72(void); INLINE void prefix##_73(void); \ + INLINE void prefix##_74(void); INLINE void prefix##_75(void); INLINE void prefix##_76(void); INLINE void prefix##_77(void); \ + INLINE void prefix##_78(void); INLINE void prefix##_79(void); INLINE void prefix##_7a(void); INLINE void prefix##_7b(void); \ + INLINE void prefix##_7c(void); INLINE void prefix##_7d(void); INLINE void prefix##_7e(void); INLINE void prefix##_7f(void); \ + INLINE void prefix##_80(void); INLINE void prefix##_81(void); INLINE void prefix##_82(void); INLINE void prefix##_83(void); \ + INLINE void prefix##_84(void); INLINE void prefix##_85(void); INLINE void prefix##_86(void); INLINE void prefix##_87(void); \ + INLINE void prefix##_88(void); INLINE void prefix##_89(void); INLINE void prefix##_8a(void); INLINE void prefix##_8b(void); \ + INLINE void prefix##_8c(void); INLINE void prefix##_8d(void); INLINE void prefix##_8e(void); INLINE void prefix##_8f(void); \ + INLINE void prefix##_90(void); INLINE void prefix##_91(void); INLINE void prefix##_92(void); INLINE void prefix##_93(void); \ + INLINE void prefix##_94(void); INLINE void prefix##_95(void); INLINE void prefix##_96(void); INLINE void prefix##_97(void); \ + INLINE void prefix##_98(void); INLINE void prefix##_99(void); INLINE void prefix##_9a(void); INLINE void prefix##_9b(void); \ + INLINE void prefix##_9c(void); INLINE void prefix##_9d(void); INLINE void prefix##_9e(void); INLINE void prefix##_9f(void); \ + INLINE void prefix##_a0(void); INLINE void prefix##_a1(void); INLINE void prefix##_a2(void); INLINE void prefix##_a3(void); \ + INLINE void prefix##_a4(void); INLINE void prefix##_a5(void); INLINE void prefix##_a6(void); INLINE void prefix##_a7(void); \ + INLINE void prefix##_a8(void); INLINE void prefix##_a9(void); INLINE void prefix##_aa(void); INLINE void prefix##_ab(void); \ + INLINE void prefix##_ac(void); INLINE void prefix##_ad(void); INLINE void prefix##_ae(void); INLINE void prefix##_af(void); \ + INLINE void prefix##_b0(void); INLINE void prefix##_b1(void); INLINE void prefix##_b2(void); INLINE void prefix##_b3(void); \ + INLINE void prefix##_b4(void); INLINE void prefix##_b5(void); INLINE void prefix##_b6(void); INLINE void prefix##_b7(void); \ + INLINE void prefix##_b8(void); INLINE void prefix##_b9(void); INLINE void prefix##_ba(void); INLINE void prefix##_bb(void); \ + INLINE void prefix##_bc(void); INLINE void prefix##_bd(void); INLINE void prefix##_be(void); INLINE void prefix##_bf(void); \ + INLINE void prefix##_c0(void); INLINE void prefix##_c1(void); INLINE void prefix##_c2(void); INLINE void prefix##_c3(void); \ + INLINE void prefix##_c4(void); INLINE void prefix##_c5(void); INLINE void prefix##_c6(void); INLINE void prefix##_c7(void); \ + INLINE void prefix##_c8(void); INLINE void prefix##_c9(void); INLINE void prefix##_ca(void); INLINE void prefix##_cb(void); \ + INLINE void prefix##_cc(void); INLINE void prefix##_cd(void); INLINE void prefix##_ce(void); INLINE void prefix##_cf(void); \ + INLINE void prefix##_d0(void); INLINE void prefix##_d1(void); INLINE void prefix##_d2(void); INLINE void prefix##_d3(void); \ + INLINE void prefix##_d4(void); INLINE void prefix##_d5(void); INLINE void prefix##_d6(void); INLINE void prefix##_d7(void); \ + INLINE void prefix##_d8(void); INLINE void prefix##_d9(void); INLINE void prefix##_da(void); INLINE void prefix##_db(void); \ + INLINE void prefix##_dc(void); INLINE void prefix##_dd(void); INLINE void prefix##_de(void); INLINE void prefix##_df(void); \ + INLINE void prefix##_e0(void); INLINE void prefix##_e1(void); INLINE void prefix##_e2(void); INLINE void prefix##_e3(void); \ + INLINE void prefix##_e4(void); INLINE void prefix##_e5(void); INLINE void prefix##_e6(void); INLINE void prefix##_e7(void); \ + INLINE void prefix##_e8(void); INLINE void prefix##_e9(void); INLINE void prefix##_ea(void); INLINE void prefix##_eb(void); \ + INLINE void prefix##_ec(void); INLINE void prefix##_ed(void); INLINE void prefix##_ee(void); INLINE void prefix##_ef(void); \ + INLINE void prefix##_f0(void); INLINE void prefix##_f1(void); INLINE void prefix##_f2(void); INLINE void prefix##_f3(void); \ + INLINE void prefix##_f4(void); INLINE void prefix##_f5(void); INLINE void prefix##_f6(void); INLINE void prefix##_f7(void); \ + INLINE void prefix##_f8(void); INLINE void prefix##_f9(void); INLINE void prefix##_fa(void); INLINE void prefix##_fb(void); \ + INLINE void prefix##_fc(void); INLINE void prefix##_fd(void); INLINE void prefix##_fe(void); INLINE void prefix##_ff(void); \ +static const funcptr tablename[0x100] = { \ + prefix##_00,prefix##_01,prefix##_02,prefix##_03,prefix##_04,prefix##_05,prefix##_06,prefix##_07, \ + prefix##_08,prefix##_09,prefix##_0a,prefix##_0b,prefix##_0c,prefix##_0d,prefix##_0e,prefix##_0f, \ + prefix##_10,prefix##_11,prefix##_12,prefix##_13,prefix##_14,prefix##_15,prefix##_16,prefix##_17, \ + prefix##_18,prefix##_19,prefix##_1a,prefix##_1b,prefix##_1c,prefix##_1d,prefix##_1e,prefix##_1f, \ + prefix##_20,prefix##_21,prefix##_22,prefix##_23,prefix##_24,prefix##_25,prefix##_26,prefix##_27, \ + prefix##_28,prefix##_29,prefix##_2a,prefix##_2b,prefix##_2c,prefix##_2d,prefix##_2e,prefix##_2f, \ + prefix##_30,prefix##_31,prefix##_32,prefix##_33,prefix##_34,prefix##_35,prefix##_36,prefix##_37, \ + prefix##_38,prefix##_39,prefix##_3a,prefix##_3b,prefix##_3c,prefix##_3d,prefix##_3e,prefix##_3f, \ + prefix##_40,prefix##_41,prefix##_42,prefix##_43,prefix##_44,prefix##_45,prefix##_46,prefix##_47, \ + prefix##_48,prefix##_49,prefix##_4a,prefix##_4b,prefix##_4c,prefix##_4d,prefix##_4e,prefix##_4f, \ + prefix##_50,prefix##_51,prefix##_52,prefix##_53,prefix##_54,prefix##_55,prefix##_56,prefix##_57, \ + prefix##_58,prefix##_59,prefix##_5a,prefix##_5b,prefix##_5c,prefix##_5d,prefix##_5e,prefix##_5f, \ + prefix##_60,prefix##_61,prefix##_62,prefix##_63,prefix##_64,prefix##_65,prefix##_66,prefix##_67, \ + prefix##_68,prefix##_69,prefix##_6a,prefix##_6b,prefix##_6c,prefix##_6d,prefix##_6e,prefix##_6f, \ + prefix##_70,prefix##_71,prefix##_72,prefix##_73,prefix##_74,prefix##_75,prefix##_76,prefix##_77, \ + prefix##_78,prefix##_79,prefix##_7a,prefix##_7b,prefix##_7c,prefix##_7d,prefix##_7e,prefix##_7f, \ + prefix##_80,prefix##_81,prefix##_82,prefix##_83,prefix##_84,prefix##_85,prefix##_86,prefix##_87, \ + prefix##_88,prefix##_89,prefix##_8a,prefix##_8b,prefix##_8c,prefix##_8d,prefix##_8e,prefix##_8f, \ + prefix##_90,prefix##_91,prefix##_92,prefix##_93,prefix##_94,prefix##_95,prefix##_96,prefix##_97, \ + prefix##_98,prefix##_99,prefix##_9a,prefix##_9b,prefix##_9c,prefix##_9d,prefix##_9e,prefix##_9f, \ + prefix##_a0,prefix##_a1,prefix##_a2,prefix##_a3,prefix##_a4,prefix##_a5,prefix##_a6,prefix##_a7, \ + prefix##_a8,prefix##_a9,prefix##_aa,prefix##_ab,prefix##_ac,prefix##_ad,prefix##_ae,prefix##_af, \ + prefix##_b0,prefix##_b1,prefix##_b2,prefix##_b3,prefix##_b4,prefix##_b5,prefix##_b6,prefix##_b7, \ + prefix##_b8,prefix##_b9,prefix##_ba,prefix##_bb,prefix##_bc,prefix##_bd,prefix##_be,prefix##_bf, \ + prefix##_c0,prefix##_c1,prefix##_c2,prefix##_c3,prefix##_c4,prefix##_c5,prefix##_c6,prefix##_c7, \ + prefix##_c8,prefix##_c9,prefix##_ca,prefix##_cb,prefix##_cc,prefix##_cd,prefix##_ce,prefix##_cf, \ + prefix##_d0,prefix##_d1,prefix##_d2,prefix##_d3,prefix##_d4,prefix##_d5,prefix##_d6,prefix##_d7, \ + prefix##_d8,prefix##_d9,prefix##_da,prefix##_db,prefix##_dc,prefix##_dd,prefix##_de,prefix##_df, \ + prefix##_e0,prefix##_e1,prefix##_e2,prefix##_e3,prefix##_e4,prefix##_e5,prefix##_e6,prefix##_e7, \ + prefix##_e8,prefix##_e9,prefix##_ea,prefix##_eb,prefix##_ec,prefix##_ed,prefix##_ee,prefix##_ef, \ + prefix##_f0,prefix##_f1,prefix##_f2,prefix##_f3,prefix##_f4,prefix##_f5,prefix##_f6,prefix##_f7, \ + prefix##_f8,prefix##_f9,prefix##_fa,prefix##_fb,prefix##_fc,prefix##_fd,prefix##_fe,prefix##_ff \ +} + +PROTOTYPES(Z80op,op); +PROTOTYPES(Z80cb,cb); +PROTOTYPES(Z80dd,dd); +PROTOTYPES(Z80ed,ed); +PROTOTYPES(Z80fd,fd); +PROTOTYPES(Z80xycb,xycb); + +/****************************************************************************/ +/* Burn an odd amount of cycles, that is instructions taking something */ +/* different from 4 T-states per opcode (and R increment) */ +/****************************************************************************/ +INLINE void BURNODD(int cycles, int opcodes, int cyclesum) +{ + if( cycles > 0 ) + { + R += (cycles / cyclesum) * opcodes; + z80_ICount -= (cycles / cyclesum) * cyclesum; + } +} + +/*************************************************************** + * define an opcode function + ***************************************************************/ +#define OP(prefix,opcode) INLINE void prefix##_##opcode(void) + +/*************************************************************** + * adjust cycle count by n T-states + ***************************************************************/ +#define CC(prefix,opcode) z80_ICount -= cc[Z80_TABLE_##prefix][opcode] + +/*************************************************************** + * execute an opcode + ***************************************************************/ +#define EXEC(prefix,opcode) \ +{ \ + unsigned op = opcode; \ + (*Z80##prefix[op])(); \ + CC(prefix,op); \ +} + +#if BIG_SWITCH +#define EXEC_INLINE(prefix,opcode) \ +{ \ + unsigned op = opcode; \ + switch(op) \ + { \ + case 0x00:prefix##_##00();break; case 0x01:prefix##_##01();break; case 0x02:prefix##_##02();break; case 0x03:prefix##_##03();break; \ + case 0x04:prefix##_##04();break; case 0x05:prefix##_##05();break; case 0x06:prefix##_##06();break; case 0x07:prefix##_##07();break; \ + case 0x08:prefix##_##08();break; case 0x09:prefix##_##09();break; case 0x0a:prefix##_##0a();break; case 0x0b:prefix##_##0b();break; \ + case 0x0c:prefix##_##0c();break; case 0x0d:prefix##_##0d();break; case 0x0e:prefix##_##0e();break; case 0x0f:prefix##_##0f();break; \ + case 0x10:prefix##_##10();break; case 0x11:prefix##_##11();break; case 0x12:prefix##_##12();break; case 0x13:prefix##_##13();break; \ + case 0x14:prefix##_##14();break; case 0x15:prefix##_##15();break; case 0x16:prefix##_##16();break; case 0x17:prefix##_##17();break; \ + case 0x18:prefix##_##18();break; case 0x19:prefix##_##19();break; case 0x1a:prefix##_##1a();break; case 0x1b:prefix##_##1b();break; \ + case 0x1c:prefix##_##1c();break; case 0x1d:prefix##_##1d();break; case 0x1e:prefix##_##1e();break; case 0x1f:prefix##_##1f();break; \ + case 0x20:prefix##_##20();break; case 0x21:prefix##_##21();break; case 0x22:prefix##_##22();break; case 0x23:prefix##_##23();break; \ + case 0x24:prefix##_##24();break; case 0x25:prefix##_##25();break; case 0x26:prefix##_##26();break; case 0x27:prefix##_##27();break; \ + case 0x28:prefix##_##28();break; case 0x29:prefix##_##29();break; case 0x2a:prefix##_##2a();break; case 0x2b:prefix##_##2b();break; \ + case 0x2c:prefix##_##2c();break; case 0x2d:prefix##_##2d();break; case 0x2e:prefix##_##2e();break; case 0x2f:prefix##_##2f();break; \ + case 0x30:prefix##_##30();break; case 0x31:prefix##_##31();break; case 0x32:prefix##_##32();break; case 0x33:prefix##_##33();break; \ + case 0x34:prefix##_##34();break; case 0x35:prefix##_##35();break; case 0x36:prefix##_##36();break; case 0x37:prefix##_##37();break; \ + case 0x38:prefix##_##38();break; case 0x39:prefix##_##39();break; case 0x3a:prefix##_##3a();break; case 0x3b:prefix##_##3b();break; \ + case 0x3c:prefix##_##3c();break; case 0x3d:prefix##_##3d();break; case 0x3e:prefix##_##3e();break; case 0x3f:prefix##_##3f();break; \ + case 0x40:prefix##_##40();break; case 0x41:prefix##_##41();break; case 0x42:prefix##_##42();break; case 0x43:prefix##_##43();break; \ + case 0x44:prefix##_##44();break; case 0x45:prefix##_##45();break; case 0x46:prefix##_##46();break; case 0x47:prefix##_##47();break; \ + case 0x48:prefix##_##48();break; case 0x49:prefix##_##49();break; case 0x4a:prefix##_##4a();break; case 0x4b:prefix##_##4b();break; \ + case 0x4c:prefix##_##4c();break; case 0x4d:prefix##_##4d();break; case 0x4e:prefix##_##4e();break; case 0x4f:prefix##_##4f();break; \ + case 0x50:prefix##_##50();break; case 0x51:prefix##_##51();break; case 0x52:prefix##_##52();break; case 0x53:prefix##_##53();break; \ + case 0x54:prefix##_##54();break; case 0x55:prefix##_##55();break; case 0x56:prefix##_##56();break; case 0x57:prefix##_##57();break; \ + case 0x58:prefix##_##58();break; case 0x59:prefix##_##59();break; case 0x5a:prefix##_##5a();break; case 0x5b:prefix##_##5b();break; \ + case 0x5c:prefix##_##5c();break; case 0x5d:prefix##_##5d();break; case 0x5e:prefix##_##5e();break; case 0x5f:prefix##_##5f();break; \ + case 0x60:prefix##_##60();break; case 0x61:prefix##_##61();break; case 0x62:prefix##_##62();break; case 0x63:prefix##_##63();break; \ + case 0x64:prefix##_##64();break; case 0x65:prefix##_##65();break; case 0x66:prefix##_##66();break; case 0x67:prefix##_##67();break; \ + case 0x68:prefix##_##68();break; case 0x69:prefix##_##69();break; case 0x6a:prefix##_##6a();break; case 0x6b:prefix##_##6b();break; \ + case 0x6c:prefix##_##6c();break; case 0x6d:prefix##_##6d();break; case 0x6e:prefix##_##6e();break; case 0x6f:prefix##_##6f();break; \ + case 0x70:prefix##_##70();break; case 0x71:prefix##_##71();break; case 0x72:prefix##_##72();break; case 0x73:prefix##_##73();break; \ + case 0x74:prefix##_##74();break; case 0x75:prefix##_##75();break; case 0x76:prefix##_##76();break; case 0x77:prefix##_##77();break; \ + case 0x78:prefix##_##78();break; case 0x79:prefix##_##79();break; case 0x7a:prefix##_##7a();break; case 0x7b:prefix##_##7b();break; \ + case 0x7c:prefix##_##7c();break; case 0x7d:prefix##_##7d();break; case 0x7e:prefix##_##7e();break; case 0x7f:prefix##_##7f();break; \ + case 0x80:prefix##_##80();break; case 0x81:prefix##_##81();break; case 0x82:prefix##_##82();break; case 0x83:prefix##_##83();break; \ + case 0x84:prefix##_##84();break; case 0x85:prefix##_##85();break; case 0x86:prefix##_##86();break; case 0x87:prefix##_##87();break; \ + case 0x88:prefix##_##88();break; case 0x89:prefix##_##89();break; case 0x8a:prefix##_##8a();break; case 0x8b:prefix##_##8b();break; \ + case 0x8c:prefix##_##8c();break; case 0x8d:prefix##_##8d();break; case 0x8e:prefix##_##8e();break; case 0x8f:prefix##_##8f();break; \ + case 0x90:prefix##_##90();break; case 0x91:prefix##_##91();break; case 0x92:prefix##_##92();break; case 0x93:prefix##_##93();break; \ + case 0x94:prefix##_##94();break; case 0x95:prefix##_##95();break; case 0x96:prefix##_##96();break; case 0x97:prefix##_##97();break; \ + case 0x98:prefix##_##98();break; case 0x99:prefix##_##99();break; case 0x9a:prefix##_##9a();break; case 0x9b:prefix##_##9b();break; \ + case 0x9c:prefix##_##9c();break; case 0x9d:prefix##_##9d();break; case 0x9e:prefix##_##9e();break; case 0x9f:prefix##_##9f();break; \ + case 0xa0:prefix##_##a0();break; case 0xa1:prefix##_##a1();break; case 0xa2:prefix##_##a2();break; case 0xa3:prefix##_##a3();break; \ + case 0xa4:prefix##_##a4();break; case 0xa5:prefix##_##a5();break; case 0xa6:prefix##_##a6();break; case 0xa7:prefix##_##a7();break; \ + case 0xa8:prefix##_##a8();break; case 0xa9:prefix##_##a9();break; case 0xaa:prefix##_##aa();break; case 0xab:prefix##_##ab();break; \ + case 0xac:prefix##_##ac();break; case 0xad:prefix##_##ad();break; case 0xae:prefix##_##ae();break; case 0xaf:prefix##_##af();break; \ + case 0xb0:prefix##_##b0();break; case 0xb1:prefix##_##b1();break; case 0xb2:prefix##_##b2();break; case 0xb3:prefix##_##b3();break; \ + case 0xb4:prefix##_##b4();break; case 0xb5:prefix##_##b5();break; case 0xb6:prefix##_##b6();break; case 0xb7:prefix##_##b7();break; \ + case 0xb8:prefix##_##b8();break; case 0xb9:prefix##_##b9();break; case 0xba:prefix##_##ba();break; case 0xbb:prefix##_##bb();break; \ + case 0xbc:prefix##_##bc();break; case 0xbd:prefix##_##bd();break; case 0xbe:prefix##_##be();break; case 0xbf:prefix##_##bf();break; \ + case 0xc0:prefix##_##c0();break; case 0xc1:prefix##_##c1();break; case 0xc2:prefix##_##c2();break; case 0xc3:prefix##_##c3();break; \ + case 0xc4:prefix##_##c4();break; case 0xc5:prefix##_##c5();break; case 0xc6:prefix##_##c6();break; case 0xc7:prefix##_##c7();break; \ + case 0xc8:prefix##_##c8();break; case 0xc9:prefix##_##c9();break; case 0xca:prefix##_##ca();break; case 0xcb:prefix##_##cb();break; \ + case 0xcc:prefix##_##cc();break; case 0xcd:prefix##_##cd();break; case 0xce:prefix##_##ce();break; case 0xcf:prefix##_##cf();break; \ + case 0xd0:prefix##_##d0();break; case 0xd1:prefix##_##d1();break; case 0xd2:prefix##_##d2();break; case 0xd3:prefix##_##d3();break; \ + case 0xd4:prefix##_##d4();break; case 0xd5:prefix##_##d5();break; case 0xd6:prefix##_##d6();break; case 0xd7:prefix##_##d7();break; \ + case 0xd8:prefix##_##d8();break; case 0xd9:prefix##_##d9();break; case 0xda:prefix##_##da();break; case 0xdb:prefix##_##db();break; \ + case 0xdc:prefix##_##dc();break; case 0xdd:prefix##_##dd();break; case 0xde:prefix##_##de();break; case 0xdf:prefix##_##df();break; \ + case 0xe0:prefix##_##e0();break; case 0xe1:prefix##_##e1();break; case 0xe2:prefix##_##e2();break; case 0xe3:prefix##_##e3();break; \ + case 0xe4:prefix##_##e4();break; case 0xe5:prefix##_##e5();break; case 0xe6:prefix##_##e6();break; case 0xe7:prefix##_##e7();break; \ + case 0xe8:prefix##_##e8();break; case 0xe9:prefix##_##e9();break; case 0xea:prefix##_##ea();break; case 0xeb:prefix##_##eb();break; \ + case 0xec:prefix##_##ec();break; case 0xed:prefix##_##ed();break; case 0xee:prefix##_##ee();break; case 0xef:prefix##_##ef();break; \ + case 0xf0:prefix##_##f0();break; case 0xf1:prefix##_##f1();break; case 0xf2:prefix##_##f2();break; case 0xf3:prefix##_##f3();break; \ + case 0xf4:prefix##_##f4();break; case 0xf5:prefix##_##f5();break; case 0xf6:prefix##_##f6();break; case 0xf7:prefix##_##f7();break; \ + case 0xf8:prefix##_##f8();break; case 0xf9:prefix##_##f9();break; case 0xfa:prefix##_##fa();break; case 0xfb:prefix##_##fb();break; \ + case 0xfc:prefix##_##fc();break; case 0xfd:prefix##_##fd();break; case 0xfe:prefix##_##fe();break; case 0xff:prefix##_##ff();break; \ + } \ + CC(prefix,op); \ +} +#else +#define EXEC_INLINE EXEC +#endif + + +/*************************************************************** + * Enter HALT state; write 1 to fake port on first execution + ***************************************************************/ +#define ENTER_HALT { \ + PC--; \ + HALT = 1; \ + if( Z80.irq_state == CLEAR_LINE ) \ + z80_burn( z80_ICount ); \ +} + +/*************************************************************** + * Leave HALT state; write 0 to fake port + ***************************************************************/ +#define LEAVE_HALT { \ + if( HALT ) \ + { \ + HALT = 0; \ + PC++; \ + } \ +} + +/*************************************************************** + * Input a byte from given I/O port + ***************************************************************/ +#define IN(port) ((UINT8)cpu_readport16(port)) + +/*************************************************************** + * Output a byte to given I/O port + ***************************************************************/ +#define OUT(port,value) cpu_writeport16(port,value) + +/*************************************************************** + * Read a byte from given memory location + ***************************************************************/ +#define RM(addr) (UINT8)cpu_readmem16(addr) + +/*************************************************************** + * Read a word from given memory location + ***************************************************************/ +INLINE void RM16( UINT32 addr, PAIR *r ) +{ + r->b.l = RM(addr); + r->b.h = RM((addr+1)&0xffff); +} + +/*************************************************************** + * Write a byte to given memory location + ***************************************************************/ +#define WM(addr,value) cpu_writemem16(addr,value) + +/*************************************************************** + * Write a word to given memory location + ***************************************************************/ +INLINE void WM16( UINT32 addr, PAIR *r ) +{ + WM(addr,r->b.l); + WM((addr+1)&0xffff,r->b.h); +} + +/*************************************************************** + * ROP() is identical to RM() except it is used for + * reading opcodes. In case of system with memory mapped I/O, + * this function can be used to greatly speed up emulation + ***************************************************************/ +INLINE UINT8 ROP(void) +{ + unsigned pc = PCD; + PC++; + return cpu_readop(pc); +} + +/**************************************************************** + * ARG() is identical to ROP() except it is used + * for reading opcode arguments. This difference can be used to + * support systems that use different encoding mechanisms for + * opcodes and opcode arguments + ***************************************************************/ +INLINE UINT8 ARG(void) +{ + unsigned pc = PCD; + PC++; + return cpu_readop_arg(pc); +} + +INLINE UINT32 ARG16(void) +{ + unsigned pc = PCD; + PC += 2; + return cpu_readop_arg(pc) | (cpu_readop_arg((pc+1)&0xffff) << 8); +} + +/*************************************************************** + * Calculate the effective address EA of an opcode using + * IX+offset resp. IY+offset addressing. + ***************************************************************/ +#define EAX EA = (UINT32)(UINT16)(IX + (INT8)ARG()) +#define EAY EA = (UINT32)(UINT16)(IY + (INT8)ARG()) + +/*************************************************************** + * POP + ***************************************************************/ +#define POP(DR) do { RM16( SPD, &Z80.DR ); SP += 2; } while (0) + +/*************************************************************** + * PUSH + ***************************************************************/ +#define PUSH(SR) do { SP -= 2; WM16( SPD, &Z80.SR ); } while (0) + +/*************************************************************** + * JP + ***************************************************************/ +#if BUSY_LOOP_HACKS +#define JP { \ + unsigned oldpc = PCD-1; \ + PCD = ARG16(); \ + change_pc(PCD); \ + /* speed up busy loop */ \ + if( PCD == oldpc ) \ + { \ + if( Z80.irq_state == CLEAR_LINE ) \ + BURNODD( z80_ICount, 1, cc[Z80_TABLE_op][0xc3] ); \ + } \ + else \ + { \ + UINT8 op = cpu_readop(PCD); \ + if( PCD == oldpc-1 ) \ + { \ + /* NOP - JP $-1 or EI - JP $-1 */ \ + if ( op == 0x00 || op == 0xfb ) \ + { \ + if( Z80.irq_state == CLEAR_LINE ) \ + BURNODD( z80_ICount-cc[Z80_TABLE_op][0x00], \ + 2, cc[Z80_TABLE_op][0x00]+cc[Z80_TABLE_op][0xc3]); \ + } \ + } \ + else \ + /* LD SP,#xxxx - JP $-3 (Galaga) */ \ + if( PCD == oldpc-3 && op == 0x31 ) \ + { \ + if( Z80.irq_state == CLEAR_LINE ) \ + BURNODD( z80_ICount-cc[Z80_TABLE_op][0x31], \ + 2, cc[Z80_TABLE_op][0x31]+cc[Z80_TABLE_op][0xc3]); \ + } \ + } \ +} +#else +#define JP { \ + PCD = ARG16(); \ + change_pc(PCD); \ +} +#endif + +/*************************************************************** + * JP_COND + ***************************************************************/ + +#define JP_COND(cond) \ + if( cond ) \ + { \ + PCD = ARG16(); \ + change_pc(PCD); \ + } \ + else \ + { \ + PC += 2; \ + } + +/*************************************************************** + * JR + ***************************************************************/ +#define JR() \ +{ \ + unsigned oldpc = PCD-1; \ + INT8 arg = (INT8)ARG(); /* ARG() also increments PC */ \ + PC += arg; /* so don't do PC += ARG() */ \ + change_pc(PCD); \ + /* speed up busy loop */ \ + if( PCD == oldpc ) \ + { \ + if( Z80.irq_state == CLEAR_LINE ) \ + BURNODD( z80_ICount, 1, cc[Z80_TABLE_op][0x18] ); \ + } \ + else \ + { \ + UINT8 op = cpu_readop(PCD); \ + if( PCD == oldpc-1 ) \ + { \ + /* NOP - JR $-1 or EI - JR $-1 */ \ + if ( op == 0x00 || op == 0xfb ) \ + { \ + if( Z80.irq_state == CLEAR_LINE ) \ + BURNODD( z80_ICount-cc[Z80_TABLE_op][0x00], \ + 2, cc[Z80_TABLE_op][0x00]+cc[Z80_TABLE_op][0x18]); \ + } \ + } \ + else \ + /* LD SP,#xxxx - JR $-3 */ \ + if( PCD == oldpc-3 && op == 0x31 ) \ + { \ + if( Z80.irq_state == CLEAR_LINE ) \ + BURNODD( z80_ICount-cc[Z80_TABLE_op][0x31], \ + 2, cc[Z80_TABLE_op][0x31]+cc[Z80_TABLE_op][0x18]); \ + } \ + } \ +} + +/*************************************************************** + * JR_COND + ***************************************************************/ +#define JR_COND(cond,opcode) \ + if( cond ) \ + { \ + INT8 arg = (INT8)ARG(); /* ARG() also increments PC */ \ + PC += arg; /* so don't do PC += ARG() */ \ + CC(ex,opcode); \ + change_pc(PCD); \ + } \ + else PC++; \ + +/*************************************************************** + * CALL + ***************************************************************/ +#define CALL() \ + EA = ARG16(); \ + PUSH( pc ); \ + PCD = EA; \ + change_pc(PCD) + +/*************************************************************** + * CALL_COND + ***************************************************************/ +#define CALL_COND(cond,opcode) \ + if( cond ) \ + { \ + EA = ARG16(); \ + PUSH( pc ); \ + PCD = EA; \ + CC(ex,opcode); \ + change_pc(PCD); \ + } \ + else \ + { \ + PC+=2; \ + } + +/*************************************************************** + * RET_COND + ***************************************************************/ +#define RET_COND(cond,opcode) \ + if( cond ) \ + { \ + POP( pc ); \ + change_pc(PCD); \ + CC(ex,opcode); \ + } + +/*************************************************************** + * RETN + ***************************************************************/ +#define RETN { \ + LOG(("Z80 #%d RETN IFF1:%d IFF2:%d\n", cpu_getactivecpu(), IFF1, IFF2)); \ + POP( pc ); \ + change_pc(PCD); \ + IFF1 = IFF2; \ +} + +/*************************************************************** + * RETI + ***************************************************************/ +#define RETI { \ + POP( pc ); \ + change_pc(PCD); \ +/* according to http://www.msxnet.org/tech/z80-documented.pdf */\ + IFF1 = IFF2; \ +} + +/*************************************************************** + * LD R,A + ***************************************************************/ +#define LD_R_A { \ + R = A; \ + R2 = A & 0x80; /* keep bit 7 of R */ \ +} + +/*************************************************************** + * LD A,R + ***************************************************************/ +#define LD_A_R { \ + A = (R & 0x7f) | R2; \ + F = (F & CF) | SZ[A] | ( IFF2 << 2 ); \ +} + +/*************************************************************** + * LD I,A + ***************************************************************/ +#define LD_I_A { \ + I = A; \ +} + +/*************************************************************** + * LD A,I + ***************************************************************/ +#define LD_A_I { \ + A = I; \ + F = (F & CF) | SZ[A] | ( IFF2 << 2 ); \ +} + +/*************************************************************** + * RST + ***************************************************************/ +#define RST(addr) \ + PUSH( pc ); \ + PCD = addr; \ + change_pc(PCD) + +/*************************************************************** + * INC r8 + ***************************************************************/ +INLINE UINT8 INC(UINT8 value) +{ + UINT8 res = value + 1; + F = (F & CF) | SZHV_inc[res]; + return (UINT8)res; +} + +/*************************************************************** + * DEC r8 + ***************************************************************/ +INLINE UINT8 DEC(UINT8 value) +{ + UINT8 res = value - 1; + F = (F & CF) | SZHV_dec[res]; + return res; +} + +/*************************************************************** + * RLCA + ***************************************************************/ +#define RLCA \ + A = (A << 1) | (A >> 7); \ + F = (F & (SF | ZF | PF)) | (A & (YF | XF | CF)) + +/*************************************************************** + * RRCA + ***************************************************************/ +#define RRCA \ + F = (F & (SF | ZF | PF)) | (A & CF); \ + A = (A >> 1) | (A << 7); \ + F |= (A & (YF | XF) ) + +/*************************************************************** + * RLA + ***************************************************************/ +#define RLA { \ + UINT8 res = (A << 1) | (F & CF); \ + UINT8 c = (A & 0x80) ? CF : 0; \ + F = (F & (SF | ZF | PF)) | c | (res & (YF | XF)); \ + A = res; \ +} + +/*************************************************************** + * RRA + ***************************************************************/ +#define RRA { \ + UINT8 res = (A >> 1) | (F << 7); \ + UINT8 c = (A & 0x01) ? CF : 0; \ + F = (F & (SF | ZF | PF)) | c | (res & (YF | XF)); \ + A = res; \ +} + +/*************************************************************** + * RRD + ***************************************************************/ +#define RRD { \ + UINT8 n = RM(HL); \ + WM( HL, (n >> 4) | (A << 4) ); \ + A = (A & 0xf0) | (n & 0x0f); \ + F = (F & CF) | SZP[A]; \ +} + +/*************************************************************** + * RLD + ***************************************************************/ +#define RLD { \ + UINT8 n = RM(HL); \ + WM( HL, (n << 4) | (A & 0x0f) ); \ + A = (A & 0xf0) | (n >> 4); \ + F = (F & CF) | SZP[A]; \ +} + +/*************************************************************** + * ADD A,n + ***************************************************************/ +#if BIG_FLAGS_ARRAY +#define ADD(value) \ +{ \ + UINT32 ah = AFD & 0xff00; \ + UINT32 res = (UINT8)((ah >> 8) + value); \ + F = SZHVC_add[ah | res]; \ + A = res; \ +} +#else +#define ADD(value) \ +{ \ + unsigned val = value; \ + unsigned res = A + val; \ + F = SZ[(UINT8)res] | ((res >> 8) & CF) | \ + ((A ^ res ^ val) & HF) | \ + (((val ^ A ^ 0x80) & (val ^ res) & 0x80) >> 5); \ + A = (UINT8)res; \ +} +#endif + +/*************************************************************** + * ADC A,n + ***************************************************************/ +#if BIG_FLAGS_ARRAY +#define ADC(value) \ +{ \ + UINT32 ah = AFD & 0xff00, c = AFD & 1; \ + UINT32 res = (UINT8)((ah >> 8) + value + c); \ + F = SZHVC_add[(c << 16) | ah | res]; \ + A = res; \ +} +#else +#define ADC(value) \ +{ \ + unsigned val = value; \ + unsigned res = A + val + (F & CF); \ + F = SZ[res & 0xff] | ((res >> 8) & CF) | \ + ((A ^ res ^ val) & HF) | \ + (((val ^ A ^ 0x80) & (val ^ res) & 0x80) >> 5); \ + A = res; \ +} +#endif + +/*************************************************************** + * SUB n + ***************************************************************/ +#if BIG_FLAGS_ARRAY +#define SUB(value) \ +{ \ + UINT32 ah = AFD & 0xff00; \ + UINT32 res = (UINT8)((ah >> 8) - value); \ + F = SZHVC_sub[ah | res]; \ + A = res; \ +} +#else +#define SUB(value) \ +{ \ + unsigned val = value; \ + unsigned res = A - val; \ + F = SZ[res & 0xff] | ((res >> 8) & CF) | NF | \ + ((A ^ res ^ val) & HF) | \ + (((val ^ A) & (A ^ res) & 0x80) >> 5); \ + A = res; \ +} +#endif + +/*************************************************************** + * SBC A,n + ***************************************************************/ +#if BIG_FLAGS_ARRAY +#define SBC(value) \ +{ \ + UINT32 ah = AFD & 0xff00, c = AFD & 1; \ + UINT32 res = (UINT8)((ah >> 8) - value - c); \ + F = SZHVC_sub[(c<<16) | ah | res]; \ + A = res; \ +} +#else +#define SBC(value) \ +{ \ + unsigned val = value; \ + unsigned res = A - val - (F & CF); \ + F = SZ[res & 0xff] | ((res >> 8) & CF) | NF | \ + ((A ^ res ^ val) & HF) | \ + (((val ^ A) & (A ^ res) & 0x80) >> 5); \ + A = res; \ +} +#endif + +/*************************************************************** + * NEG + ***************************************************************/ +#define NEG { \ + UINT8 value = A; \ + A = 0; \ + SUB(value); \ +} + +/*************************************************************** + * DAA + ***************************************************************/ +#define DAA { \ + UINT8 cf, nf, hf, lo, hi, diff; \ + cf = F & CF; \ + nf = F & NF; \ + hf = F & HF; \ + lo = A & 15; \ + hi = A / 16; \ + \ + if (cf) \ + { \ + diff = (lo <= 9 && !hf) ? 0x60 : 0x66; \ + } \ + else \ + { \ + if (lo >= 10) \ + { \ + diff = hi <= 8 ? 0x06 : 0x66; \ + } \ + else \ + { \ + if (hi >= 10) \ + { \ + diff = hf ? 0x66 : 0x60; \ + } \ + else \ + { \ + diff = hf ? 0x06 : 0x00; \ + } \ + } \ + } \ + if (nf) A -= diff; \ + else A += diff; \ + \ + F = SZP[A] | (F & NF); \ + if (cf || (lo <= 9 ? hi >= 10 : hi >= 9)) F |= CF; \ + if (nf ? hf && lo <= 5 : lo >= 10) F |= HF; \ +} + +/*************************************************************** + * AND n + ***************************************************************/ +#define AND(value) \ + A &= value; \ + F = SZP[A] | HF + +/*************************************************************** + * OR n + ***************************************************************/ +#define OR(value) \ + A |= value; \ + F = SZP[A] + +/*************************************************************** + * XOR n + ***************************************************************/ +#define XOR(value) \ + A ^= value; \ + F = SZP[A] + +/*************************************************************** + * CP n + ***************************************************************/ +#if BIG_FLAGS_ARRAY +#define CP(value) \ +{ \ + unsigned val = value; \ + UINT32 ah = AFD & 0xff00; \ + UINT32 res = (UINT8)((ah >> 8) - val); \ + F = (SZHVC_sub[ah | res] & ~(YF | XF)) | \ + (val & (YF | XF)); \ +} +#else +#define CP(value) \ +{ \ + unsigned val = value; \ + unsigned res = A - val; \ + F = (SZ[res & 0xff] & (SF | ZF)) | \ + (val & (YF | XF)) | ((res >> 8) & CF) | NF | \ + ((A ^ res ^ val) & HF) | \ + ((((val ^ A) & (A ^ res)) >> 5) & VF); \ +} +#endif + +/*************************************************************** + * EX AF,AF' + ***************************************************************/ +#define EX_AF { \ + PAIR tmp; \ + tmp = Z80.af; Z80.af = Z80.af2; Z80.af2 = tmp; \ +} + +/*************************************************************** + * EX DE,HL + ***************************************************************/ +#define EX_DE_HL { \ + PAIR tmp; \ + tmp = Z80.de; Z80.de = Z80.hl; Z80.hl = tmp; \ +} + +/*************************************************************** + * EXX + ***************************************************************/ +#define EXX { \ + PAIR tmp; \ + tmp = Z80.bc; Z80.bc = Z80.bc2; Z80.bc2 = tmp; \ + tmp = Z80.de; Z80.de = Z80.de2; Z80.de2 = tmp; \ + tmp = Z80.hl; Z80.hl = Z80.hl2; Z80.hl2 = tmp; \ +} + +/*************************************************************** + * EX (SP),r16 + ***************************************************************/ +#define EXSP(DR) \ +{ \ + PAIR tmp = { { 0, 0, 0, 0 } }; \ + RM16( SPD, &tmp ); \ + WM16( SPD, &Z80.DR ); \ + Z80.DR = tmp; \ +} + + +/*************************************************************** + * ADD16 + ***************************************************************/ +#define ADD16(DR,SR) \ +{ \ + UINT32 res = Z80.DR.d + Z80.SR.d; \ + F = (F & (SF | ZF | VF)) | \ + (((Z80.DR.d ^ res ^ Z80.SR.d) >> 8) & HF) | \ + ((res >> 16) & CF) | ((res >> 8) & (YF | XF)); \ + Z80.DR.w.l = (UINT16)res; \ +} + +/*************************************************************** + * ADC r16,r16 + ***************************************************************/ +#define ADC16(Reg) \ +{ \ + UINT32 res = HLD + Z80.Reg.d + (F & CF); \ + F = (((HLD ^ res ^ Z80.Reg.d) >> 8) & HF) | \ + ((res >> 16) & CF) | \ + ((res >> 8) & (SF | YF | XF)) | \ + ((res & 0xffff) ? 0 : ZF) | \ + (((Z80.Reg.d ^ HLD ^ 0x8000) & (Z80.Reg.d ^ res) & 0x8000) >> 13); \ + HL = (UINT16)res; \ +} + +/*************************************************************** + * SBC r16,r16 + ***************************************************************/ +#define SBC16(Reg) \ +{ \ + UINT32 res = HLD - Z80.Reg.d - (F & CF); \ + F = (((HLD ^ res ^ Z80.Reg.d) >> 8) & HF) | NF | \ + ((res >> 16) & CF) | \ + ((res >> 8) & (SF | YF | XF)) | \ + ((res & 0xffff) ? 0 : ZF) | \ + (((Z80.Reg.d ^ HLD) & (HLD ^ res) &0x8000) >> 13); \ + HL = (UINT16)res; \ +} + +/*************************************************************** + * RLC r8 + ***************************************************************/ +INLINE UINT8 RLC(UINT8 value) +{ + unsigned res = value; + unsigned c = (res & 0x80) ? CF : 0; + res = ((res << 1) | (res >> 7)) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * RRC r8 + ***************************************************************/ +INLINE UINT8 RRC(UINT8 value) +{ + unsigned res = value; + unsigned c = (res & 0x01) ? CF : 0; + res = ((res >> 1) | (res << 7)) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * RL r8 + ***************************************************************/ +INLINE UINT8 RL(UINT8 value) +{ + unsigned res = value; + unsigned c = (res & 0x80) ? CF : 0; + res = ((res << 1) | (F & CF)) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * RR r8 + ***************************************************************/ +INLINE UINT8 RR(UINT8 value) +{ + unsigned res = value; + unsigned c = (res & 0x01) ? CF : 0; + res = ((res >> 1) | (F << 7)) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * SLA r8 + ***************************************************************/ +INLINE UINT8 SLA(UINT8 value) +{ + unsigned res = value; + unsigned c = (res & 0x80) ? CF : 0; + res = (res << 1) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * SRA r8 + ***************************************************************/ +INLINE UINT8 SRA(UINT8 value) +{ + unsigned res = value; + unsigned c = (res & 0x01) ? CF : 0; + res = ((res >> 1) | (res & 0x80)) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * SLL r8 + ***************************************************************/ +INLINE UINT8 SLL(UINT8 value) +{ + unsigned res = value; + unsigned c = (res & 0x80) ? CF : 0; + res = ((res << 1) | 0x01) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * SRL r8 + ***************************************************************/ +INLINE UINT8 SRL(UINT8 value) +{ + unsigned res = value; + unsigned c = (res & 0x01) ? CF : 0; + res = (res >> 1) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * BIT bit,r8 + ***************************************************************/ +#undef BIT +#define BIT(bit,reg) \ + F = (F & CF) | HF | SZ_BIT[reg & (1<>8) & (YF|XF)) + +/*************************************************************** + * RES bit,r8 + ***************************************************************/ +INLINE UINT8 RES(UINT8 bit, UINT8 value) +{ + return value & ~(1< flag 5 */ \ + if( (A + io) & 0x08 ) F |= XF; /* bit 3 -> flag 3 */ \ + HL++; DE++; BC--; \ + if( BC ) F |= VF; \ +} + +/*************************************************************** + * CPI + ***************************************************************/ +#define CPI { \ + UINT8 val = RM(HL); \ + UINT8 res = A - val; \ + HL++; BC--; \ + F = (F & CF) | (SZ[res]&~(YF|XF)) | ((A^val^res)&HF) | NF; \ + if( F & HF ) res -= 1; \ + if( res & 0x02 ) F |= YF; /* bit 1 -> flag 5 */ \ + if( res & 0x08 ) F |= XF; /* bit 3 -> flag 3 */ \ + if( BC ) F |= VF; \ +} + +/*************************************************************** + * INI + ***************************************************************/ +#define INI { \ + unsigned t; \ + UINT8 io = IN(BC); \ + B--; \ + WM( HL, io ); \ + HL++; \ + F = SZ[B]; \ + t = (unsigned)((C + 1) & 0xff) + (unsigned)io; \ + if( io & SF ) F |= NF; \ + if( t & 0x100 ) F |= HF | CF; \ + F |= SZP[(UINT8)(t & 0x07) ^ B] & PF; \ +} + +/*************************************************************** + * OUTI + ***************************************************************/ +#define OUTI { \ + unsigned t; \ + UINT8 io = RM(HL); \ + B--; \ + OUT( BC, io ); \ + HL++; \ + F = SZ[B]; \ + t = (unsigned)L + (unsigned)io; \ + if( io & SF ) F |= NF; \ + if( t & 0x100 ) F |= HF | CF; \ + F |= SZP[(UINT8)(t & 0x07) ^ B] & PF; \ +} + +/*************************************************************** + * LDD + ***************************************************************/ +#define LDD { \ + UINT8 io = RM(HL); \ + WM( DE, io ); \ + F &= SF | ZF | CF; \ + if( (A + io) & 0x02 ) F |= YF; /* bit 1 -> flag 5 */ \ + if( (A + io) & 0x08 ) F |= XF; /* bit 3 -> flag 3 */ \ + HL--; DE--; BC--; \ + if( BC ) F |= VF; \ +} + +/*************************************************************** + * CPD + ***************************************************************/ +#define CPD { \ + UINT8 val = RM(HL); \ + UINT8 res = A - val; \ + HL--; BC--; \ + F = (F & CF) | (SZ[res]&~(YF|XF)) | ((A^val^res)&HF) | NF; \ + if( F & HF ) res -= 1; \ + if( res & 0x02 ) F |= YF; /* bit 1 -> flag 5 */ \ + if( res & 0x08 ) F |= XF; /* bit 3 -> flag 3 */ \ + if( BC ) F |= VF; \ +} + +/*************************************************************** + * IND + ***************************************************************/ +#define IND { \ + unsigned t; \ + UINT8 io = IN(BC); \ + B--; \ + WM( HL, io ); \ + HL--; \ + F = SZ[B]; \ + t = ((unsigned)(C - 1) & 0xff) + (unsigned)io; \ + if( io & SF ) F |= NF; \ + if( t & 0x100 ) F |= HF | CF; \ + F |= SZP[(UINT8)(t & 0x07) ^ B] & PF; \ +} + +/*************************************************************** + * OUTD + ***************************************************************/ +#define OUTD { \ + unsigned t; \ + UINT8 io = RM(HL); \ + B--; \ + OUT( BC, io ); \ + HL--; \ + F = SZ[B]; \ + t = (unsigned)L + (unsigned)io; \ + if( io & SF ) F |= NF; \ + if( t & 0x100 ) F |= HF | CF; \ + F |= SZP[(UINT8)(t & 0x07) ^ B] & PF; \ +} + +/*************************************************************** + * LDIR + ***************************************************************/ +#define LDIR \ + LDI; \ + if( BC ) \ + { \ + PC -= 2; \ + CC(ex,0xb0); \ + } + +/*************************************************************** + * CPIR + ***************************************************************/ +#define CPIR \ + CPI; \ + if( BC && !(F & ZF) ) \ + { \ + PC -= 2; \ + CC(ex,0xb1); \ + } + +/*************************************************************** + * INIR + ***************************************************************/ +#define INIR \ + INI; \ + if( B ) \ + { \ + PC -= 2; \ + CC(ex,0xb2); \ + } + +/*************************************************************** + * OTIR + ***************************************************************/ +#define OTIR \ + OUTI; \ + if( B ) \ + { \ + PC -= 2; \ + CC(ex,0xb3); \ + } + +/*************************************************************** + * LDDR + ***************************************************************/ +#define LDDR \ + LDD; \ + if( BC ) \ + { \ + PC -= 2; \ + CC(ex,0xb8); \ + } + +/*************************************************************** + * CPDR + ***************************************************************/ +#define CPDR \ + CPD; \ + if( BC && !(F & ZF) ) \ + { \ + PC -= 2; \ + CC(ex,0xb9); \ + } + +/*************************************************************** + * INDR + ***************************************************************/ +#define INDR \ + IND; \ + if( B ) \ + { \ + PC -= 2; \ + CC(ex,0xba); \ + } + +/*************************************************************** + * OTDR + ***************************************************************/ +#define OTDR \ + OUTD; \ + if( B ) \ + { \ + PC -= 2; \ + CC(ex,0xbb); \ + } + +/*************************************************************** + * EI + ***************************************************************/ +#define EI { \ + IFF1 = IFF2 = 1; \ + Z80.after_ei = TRUE; \ +} + +/********************************************************** + * opcodes with CB prefix + * rotate, shift and bit operations + **********************************************************/ +OP(cb,00) { B = RLC(B); } /* RLC B */ +OP(cb,01) { C = RLC(C); } /* RLC C */ +OP(cb,02) { D = RLC(D); } /* RLC D */ +OP(cb,03) { E = RLC(E); } /* RLC E */ +OP(cb,04) { H = RLC(H); } /* RLC H */ +OP(cb,05) { L = RLC(L); } /* RLC L */ +OP(cb,06) { WM( HL, RLC(RM(HL)) ); } /* RLC (HL) */ +OP(cb,07) { A = RLC(A); } /* RLC A */ + +OP(cb,08) { B = RRC(B); } /* RRC B */ +OP(cb,09) { C = RRC(C); } /* RRC C */ +OP(cb,0a) { D = RRC(D); } /* RRC D */ +OP(cb,0b) { E = RRC(E); } /* RRC E */ +OP(cb,0c) { H = RRC(H); } /* RRC H */ +OP(cb,0d) { L = RRC(L); } /* RRC L */ +OP(cb,0e) { WM( HL, RRC(RM(HL)) ); } /* RRC (HL) */ +OP(cb,0f) { A = RRC(A); } /* RRC A */ + +OP(cb,10) { B = RL(B); } /* RL B */ +OP(cb,11) { C = RL(C); } /* RL C */ +OP(cb,12) { D = RL(D); } /* RL D */ +OP(cb,13) { E = RL(E); } /* RL E */ +OP(cb,14) { H = RL(H); } /* RL H */ +OP(cb,15) { L = RL(L); } /* RL L */ +OP(cb,16) { WM( HL, RL(RM(HL)) ); } /* RL (HL) */ +OP(cb,17) { A = RL(A); } /* RL A */ + +OP(cb,18) { B = RR(B); } /* RR B */ +OP(cb,19) { C = RR(C); } /* RR C */ +OP(cb,1a) { D = RR(D); } /* RR D */ +OP(cb,1b) { E = RR(E); } /* RR E */ +OP(cb,1c) { H = RR(H); } /* RR H */ +OP(cb,1d) { L = RR(L); } /* RR L */ +OP(cb,1e) { WM( HL, RR(RM(HL)) ); } /* RR (HL) */ +OP(cb,1f) { A = RR(A); } /* RR A */ + +OP(cb,20) { B = SLA(B); } /* SLA B */ +OP(cb,21) { C = SLA(C); } /* SLA C */ +OP(cb,22) { D = SLA(D); } /* SLA D */ +OP(cb,23) { E = SLA(E); } /* SLA E */ +OP(cb,24) { H = SLA(H); } /* SLA H */ +OP(cb,25) { L = SLA(L); } /* SLA L */ +OP(cb,26) { WM( HL, SLA(RM(HL)) ); } /* SLA (HL) */ +OP(cb,27) { A = SLA(A); } /* SLA A */ + +OP(cb,28) { B = SRA(B); } /* SRA B */ +OP(cb,29) { C = SRA(C); } /* SRA C */ +OP(cb,2a) { D = SRA(D); } /* SRA D */ +OP(cb,2b) { E = SRA(E); } /* SRA E */ +OP(cb,2c) { H = SRA(H); } /* SRA H */ +OP(cb,2d) { L = SRA(L); } /* SRA L */ +OP(cb,2e) { WM( HL, SRA(RM(HL)) ); } /* SRA (HL) */ +OP(cb,2f) { A = SRA(A); } /* SRA A */ + +OP(cb,30) { B = SLL(B); } /* SLL B */ +OP(cb,31) { C = SLL(C); } /* SLL C */ +OP(cb,32) { D = SLL(D); } /* SLL D */ +OP(cb,33) { E = SLL(E); } /* SLL E */ +OP(cb,34) { H = SLL(H); } /* SLL H */ +OP(cb,35) { L = SLL(L); } /* SLL L */ +OP(cb,36) { WM( HL, SLL(RM(HL)) ); } /* SLL (HL) */ +OP(cb,37) { A = SLL(A); } /* SLL A */ + +OP(cb,38) { B = SRL(B); } /* SRL B */ +OP(cb,39) { C = SRL(C); } /* SRL C */ +OP(cb,3a) { D = SRL(D); } /* SRL D */ +OP(cb,3b) { E = SRL(E); } /* SRL E */ +OP(cb,3c) { H = SRL(H); } /* SRL H */ +OP(cb,3d) { L = SRL(L); } /* SRL L */ +OP(cb,3e) { WM( HL, SRL(RM(HL)) ); } /* SRL (HL) */ +OP(cb,3f) { A = SRL(A); } /* SRL A */ + +OP(cb,40) { BIT(0,B); } /* BIT 0,B */ +OP(cb,41) { BIT(0,C); } /* BIT 0,C */ +OP(cb,42) { BIT(0,D); } /* BIT 0,D */ +OP(cb,43) { BIT(0,E); } /* BIT 0,E */ +OP(cb,44) { BIT(0,H); } /* BIT 0,H */ +OP(cb,45) { BIT(0,L); } /* BIT 0,L */ +OP(cb,46) { BIT(0,RM(HL)); } /* BIT 0,(HL) */ +OP(cb,47) { BIT(0,A); } /* BIT 0,A */ + +OP(cb,48) { BIT(1,B); } /* BIT 1,B */ +OP(cb,49) { BIT(1,C); } /* BIT 1,C */ +OP(cb,4a) { BIT(1,D); } /* BIT 1,D */ +OP(cb,4b) { BIT(1,E); } /* BIT 1,E */ +OP(cb,4c) { BIT(1,H); } /* BIT 1,H */ +OP(cb,4d) { BIT(1,L); } /* BIT 1,L */ +OP(cb,4e) { BIT(1,RM(HL)); } /* BIT 1,(HL) */ +OP(cb,4f) { BIT(1,A); } /* BIT 1,A */ + +OP(cb,50) { BIT(2,B); } /* BIT 2,B */ +OP(cb,51) { BIT(2,C); } /* BIT 2,C */ +OP(cb,52) { BIT(2,D); } /* BIT 2,D */ +OP(cb,53) { BIT(2,E); } /* BIT 2,E */ +OP(cb,54) { BIT(2,H); } /* BIT 2,H */ +OP(cb,55) { BIT(2,L); } /* BIT 2,L */ +OP(cb,56) { BIT(2,RM(HL)); } /* BIT 2,(HL) */ +OP(cb,57) { BIT(2,A); } /* BIT 2,A */ + +OP(cb,58) { BIT(3,B); } /* BIT 3,B */ +OP(cb,59) { BIT(3,C); } /* BIT 3,C */ +OP(cb,5a) { BIT(3,D); } /* BIT 3,D */ +OP(cb,5b) { BIT(3,E); } /* BIT 3,E */ +OP(cb,5c) { BIT(3,H); } /* BIT 3,H */ +OP(cb,5d) { BIT(3,L); } /* BIT 3,L */ +OP(cb,5e) { BIT(3,RM(HL)); } /* BIT 3,(HL) */ +OP(cb,5f) { BIT(3,A); } /* BIT 3,A */ + +OP(cb,60) { BIT(4,B); } /* BIT 4,B */ +OP(cb,61) { BIT(4,C); } /* BIT 4,C */ +OP(cb,62) { BIT(4,D); } /* BIT 4,D */ +OP(cb,63) { BIT(4,E); } /* BIT 4,E */ +OP(cb,64) { BIT(4,H); } /* BIT 4,H */ +OP(cb,65) { BIT(4,L); } /* BIT 4,L */ +OP(cb,66) { BIT(4,RM(HL)); } /* BIT 4,(HL) */ +OP(cb,67) { BIT(4,A); } /* BIT 4,A */ + +OP(cb,68) { BIT(5,B); } /* BIT 5,B */ +OP(cb,69) { BIT(5,C); } /* BIT 5,C */ +OP(cb,6a) { BIT(5,D); } /* BIT 5,D */ +OP(cb,6b) { BIT(5,E); } /* BIT 5,E */ +OP(cb,6c) { BIT(5,H); } /* BIT 5,H */ +OP(cb,6d) { BIT(5,L); } /* BIT 5,L */ +OP(cb,6e) { BIT(5,RM(HL)); } /* BIT 5,(HL) */ +OP(cb,6f) { BIT(5,A); } /* BIT 5,A */ + +OP(cb,70) { BIT(6,B); } /* BIT 6,B */ +OP(cb,71) { BIT(6,C); } /* BIT 6,C */ +OP(cb,72) { BIT(6,D); } /* BIT 6,D */ +OP(cb,73) { BIT(6,E); } /* BIT 6,E */ +OP(cb,74) { BIT(6,H); } /* BIT 6,H */ +OP(cb,75) { BIT(6,L); } /* BIT 6,L */ +OP(cb,76) { BIT(6,RM(HL)); } /* BIT 6,(HL) */ +OP(cb,77) { BIT(6,A); } /* BIT 6,A */ + +OP(cb,78) { BIT(7,B); } /* BIT 7,B */ +OP(cb,79) { BIT(7,C); } /* BIT 7,C */ +OP(cb,7a) { BIT(7,D); } /* BIT 7,D */ +OP(cb,7b) { BIT(7,E); } /* BIT 7,E */ +OP(cb,7c) { BIT(7,H); } /* BIT 7,H */ +OP(cb,7d) { BIT(7,L); } /* BIT 7,L */ +OP(cb,7e) { BIT(7,RM(HL)); } /* BIT 7,(HL) */ +OP(cb,7f) { BIT(7,A); } /* BIT 7,A */ + +OP(cb,80) { B = RES(0,B); } /* RES 0,B */ +OP(cb,81) { C = RES(0,C); } /* RES 0,C */ +OP(cb,82) { D = RES(0,D); } /* RES 0,D */ +OP(cb,83) { E = RES(0,E); } /* RES 0,E */ +OP(cb,84) { H = RES(0,H); } /* RES 0,H */ +OP(cb,85) { L = RES(0,L); } /* RES 0,L */ +OP(cb,86) { WM( HL, RES(0,RM(HL)) ); } /* RES 0,(HL) */ +OP(cb,87) { A = RES(0,A); } /* RES 0,A */ + +OP(cb,88) { B = RES(1,B); } /* RES 1,B */ +OP(cb,89) { C = RES(1,C); } /* RES 1,C */ +OP(cb,8a) { D = RES(1,D); } /* RES 1,D */ +OP(cb,8b) { E = RES(1,E); } /* RES 1,E */ +OP(cb,8c) { H = RES(1,H); } /* RES 1,H */ +OP(cb,8d) { L = RES(1,L); } /* RES 1,L */ +OP(cb,8e) { WM( HL, RES(1,RM(HL)) ); } /* RES 1,(HL) */ +OP(cb,8f) { A = RES(1,A); } /* RES 1,A */ + +OP(cb,90) { B = RES(2,B); } /* RES 2,B */ +OP(cb,91) { C = RES(2,C); } /* RES 2,C */ +OP(cb,92) { D = RES(2,D); } /* RES 2,D */ +OP(cb,93) { E = RES(2,E); } /* RES 2,E */ +OP(cb,94) { H = RES(2,H); } /* RES 2,H */ +OP(cb,95) { L = RES(2,L); } /* RES 2,L */ +OP(cb,96) { WM( HL, RES(2,RM(HL)) ); } /* RES 2,(HL) */ +OP(cb,97) { A = RES(2,A); } /* RES 2,A */ + +OP(cb,98) { B = RES(3,B); } /* RES 3,B */ +OP(cb,99) { C = RES(3,C); } /* RES 3,C */ +OP(cb,9a) { D = RES(3,D); } /* RES 3,D */ +OP(cb,9b) { E = RES(3,E); } /* RES 3,E */ +OP(cb,9c) { H = RES(3,H); } /* RES 3,H */ +OP(cb,9d) { L = RES(3,L); } /* RES 3,L */ +OP(cb,9e) { WM( HL, RES(3,RM(HL)) ); } /* RES 3,(HL) */ +OP(cb,9f) { A = RES(3,A); } /* RES 3,A */ + +OP(cb,a0) { B = RES(4,B); } /* RES 4,B */ +OP(cb,a1) { C = RES(4,C); } /* RES 4,C */ +OP(cb,a2) { D = RES(4,D); } /* RES 4,D */ +OP(cb,a3) { E = RES(4,E); } /* RES 4,E */ +OP(cb,a4) { H = RES(4,H); } /* RES 4,H */ +OP(cb,a5) { L = RES(4,L); } /* RES 4,L */ +OP(cb,a6) { WM( HL, RES(4,RM(HL)) ); } /* RES 4,(HL) */ +OP(cb,a7) { A = RES(4,A); } /* RES 4,A */ + +OP(cb,a8) { B = RES(5,B); } /* RES 5,B */ +OP(cb,a9) { C = RES(5,C); } /* RES 5,C */ +OP(cb,aa) { D = RES(5,D); } /* RES 5,D */ +OP(cb,ab) { E = RES(5,E); } /* RES 5,E */ +OP(cb,ac) { H = RES(5,H); } /* RES 5,H */ +OP(cb,ad) { L = RES(5,L); } /* RES 5,L */ +OP(cb,ae) { WM( HL, RES(5,RM(HL)) ); } /* RES 5,(HL) */ +OP(cb,af) { A = RES(5,A); } /* RES 5,A */ + +OP(cb,b0) { B = RES(6,B); } /* RES 6,B */ +OP(cb,b1) { C = RES(6,C); } /* RES 6,C */ +OP(cb,b2) { D = RES(6,D); } /* RES 6,D */ +OP(cb,b3) { E = RES(6,E); } /* RES 6,E */ +OP(cb,b4) { H = RES(6,H); } /* RES 6,H */ +OP(cb,b5) { L = RES(6,L); } /* RES 6,L */ +OP(cb,b6) { WM( HL, RES(6,RM(HL)) ); } /* RES 6,(HL) */ +OP(cb,b7) { A = RES(6,A); } /* RES 6,A */ + +OP(cb,b8) { B = RES(7,B); } /* RES 7,B */ +OP(cb,b9) { C = RES(7,C); } /* RES 7,C */ +OP(cb,ba) { D = RES(7,D); } /* RES 7,D */ +OP(cb,bb) { E = RES(7,E); } /* RES 7,E */ +OP(cb,bc) { H = RES(7,H); } /* RES 7,H */ +OP(cb,bd) { L = RES(7,L); } /* RES 7,L */ +OP(cb,be) { WM( HL, RES(7,RM(HL)) ); } /* RES 7,(HL) */ +OP(cb,bf) { A = RES(7,A); } /* RES 7,A */ + +OP(cb,c0) { B = SET(0,B); } /* SET 0,B */ +OP(cb,c1) { C = SET(0,C); } /* SET 0,C */ +OP(cb,c2) { D = SET(0,D); } /* SET 0,D */ +OP(cb,c3) { E = SET(0,E); } /* SET 0,E */ +OP(cb,c4) { H = SET(0,H); } /* SET 0,H */ +OP(cb,c5) { L = SET(0,L); } /* SET 0,L */ +OP(cb,c6) { WM( HL, SET(0,RM(HL)) ); } /* SET 0,(HL) */ +OP(cb,c7) { A = SET(0,A); } /* SET 0,A */ + +OP(cb,c8) { B = SET(1,B); } /* SET 1,B */ +OP(cb,c9) { C = SET(1,C); } /* SET 1,C */ +OP(cb,ca) { D = SET(1,D); } /* SET 1,D */ +OP(cb,cb) { E = SET(1,E); } /* SET 1,E */ +OP(cb,cc) { H = SET(1,H); } /* SET 1,H */ +OP(cb,cd) { L = SET(1,L); } /* SET 1,L */ +OP(cb,ce) { WM( HL, SET(1,RM(HL)) ); } /* SET 1,(HL) */ +OP(cb,cf) { A = SET(1,A); } /* SET 1,A */ + +OP(cb,d0) { B = SET(2,B); } /* SET 2,B */ +OP(cb,d1) { C = SET(2,C); } /* SET 2,C */ +OP(cb,d2) { D = SET(2,D); } /* SET 2,D */ +OP(cb,d3) { E = SET(2,E); } /* SET 2,E */ +OP(cb,d4) { H = SET(2,H); } /* SET 2,H */ +OP(cb,d5) { L = SET(2,L); } /* SET 2,L */ +OP(cb,d6) { WM( HL, SET(2,RM(HL)) ); } /* SET 2,(HL) */ +OP(cb,d7) { A = SET(2,A); } /* SET 2,A */ + +OP(cb,d8) { B = SET(3,B); } /* SET 3,B */ +OP(cb,d9) { C = SET(3,C); } /* SET 3,C */ +OP(cb,da) { D = SET(3,D); } /* SET 3,D */ +OP(cb,db) { E = SET(3,E); } /* SET 3,E */ +OP(cb,dc) { H = SET(3,H); } /* SET 3,H */ +OP(cb,dd) { L = SET(3,L); } /* SET 3,L */ +OP(cb,de) { WM( HL, SET(3,RM(HL)) ); } /* SET 3,(HL) */ +OP(cb,df) { A = SET(3,A); } /* SET 3,A */ + +OP(cb,e0) { B = SET(4,B); } /* SET 4,B */ +OP(cb,e1) { C = SET(4,C); } /* SET 4,C */ +OP(cb,e2) { D = SET(4,D); } /* SET 4,D */ +OP(cb,e3) { E = SET(4,E); } /* SET 4,E */ +OP(cb,e4) { H = SET(4,H); } /* SET 4,H */ +OP(cb,e5) { L = SET(4,L); } /* SET 4,L */ +OP(cb,e6) { WM( HL, SET(4,RM(HL)) ); } /* SET 4,(HL) */ +OP(cb,e7) { A = SET(4,A); } /* SET 4,A */ + +OP(cb,e8) { B = SET(5,B); } /* SET 5,B */ +OP(cb,e9) { C = SET(5,C); } /* SET 5,C */ +OP(cb,ea) { D = SET(5,D); } /* SET 5,D */ +OP(cb,eb) { E = SET(5,E); } /* SET 5,E */ +OP(cb,ec) { H = SET(5,H); } /* SET 5,H */ +OP(cb,ed) { L = SET(5,L); } /* SET 5,L */ +OP(cb,ee) { WM( HL, SET(5,RM(HL)) ); } /* SET 5,(HL) */ +OP(cb,ef) { A = SET(5,A); } /* SET 5,A */ + +OP(cb,f0) { B = SET(6,B); } /* SET 6,B */ +OP(cb,f1) { C = SET(6,C); } /* SET 6,C */ +OP(cb,f2) { D = SET(6,D); } /* SET 6,D */ +OP(cb,f3) { E = SET(6,E); } /* SET 6,E */ +OP(cb,f4) { H = SET(6,H); } /* SET 6,H */ +OP(cb,f5) { L = SET(6,L); } /* SET 6,L */ +OP(cb,f6) { WM( HL, SET(6,RM(HL)) ); } /* SET 6,(HL) */ +OP(cb,f7) { A = SET(6,A); } /* SET 6,A */ + +OP(cb,f8) { B = SET(7,B); } /* SET 7,B */ +OP(cb,f9) { C = SET(7,C); } /* SET 7,C */ +OP(cb,fa) { D = SET(7,D); } /* SET 7,D */ +OP(cb,fb) { E = SET(7,E); } /* SET 7,E */ +OP(cb,fc) { H = SET(7,H); } /* SET 7,H */ +OP(cb,fd) { L = SET(7,L); } /* SET 7,L */ +OP(cb,fe) { WM( HL, SET(7,RM(HL)) ); } /* SET 7,(HL) */ +OP(cb,ff) { A = SET(7,A); } /* SET 7,A */ + + +/********************************************************** +* opcodes with DD/FD CB prefix +* rotate, shift and bit operations with (IX+o) +**********************************************************/ +OP(xycb,00) { B = RLC( RM(EA) ); WM( EA,B ); } /* RLC B=(XY+o) */ +OP(xycb,01) { C = RLC( RM(EA) ); WM( EA,C ); } /* RLC C=(XY+o) */ +OP(xycb,02) { D = RLC( RM(EA) ); WM( EA,D ); } /* RLC D=(XY+o) */ +OP(xycb,03) { E = RLC( RM(EA) ); WM( EA,E ); } /* RLC E=(XY+o) */ +OP(xycb,04) { H = RLC( RM(EA) ); WM( EA,H ); } /* RLC H=(XY+o) */ +OP(xycb,05) { L = RLC( RM(EA) ); WM( EA,L ); } /* RLC L=(XY+o) */ +OP(xycb,06) { WM( EA, RLC( RM(EA) ) ); } /* RLC (XY+o) */ +OP(xycb,07) { A = RLC( RM(EA) ); WM( EA,A ); } /* RLC A=(XY+o) */ + +OP(xycb,08) { B = RRC( RM(EA) ); WM( EA,B ); } /* RRC B=(XY+o) */ +OP(xycb,09) { C = RRC( RM(EA) ); WM( EA,C ); } /* RRC C=(XY+o) */ +OP(xycb,0a) { D = RRC( RM(EA) ); WM( EA,D ); } /* RRC D=(XY+o) */ +OP(xycb,0b) { E = RRC( RM(EA) ); WM( EA,E ); } /* RRC E=(XY+o) */ +OP(xycb,0c) { H = RRC( RM(EA) ); WM( EA,H ); } /* RRC H=(XY+o) */ +OP(xycb,0d) { L = RRC( RM(EA) ); WM( EA,L ); } /* RRC L=(XY+o) */ +OP(xycb,0e) { WM( EA,RRC( RM(EA) ) ); } /* RRC (XY+o) */ +OP(xycb,0f) { A = RRC( RM(EA) ); WM( EA,A ); } /* RRC A=(XY+o) */ + +OP(xycb,10) { B = RL( RM(EA) ); WM( EA,B ); } /* RL B=(XY+o) */ +OP(xycb,11) { C = RL( RM(EA) ); WM( EA,C ); } /* RL C=(XY+o) */ +OP(xycb,12) { D = RL( RM(EA) ); WM( EA,D ); } /* RL D=(XY+o) */ +OP(xycb,13) { E = RL( RM(EA) ); WM( EA,E ); } /* RL E=(XY+o) */ +OP(xycb,14) { H = RL( RM(EA) ); WM( EA,H ); } /* RL H=(XY+o) */ +OP(xycb,15) { L = RL( RM(EA) ); WM( EA,L ); } /* RL L=(XY+o) */ +OP(xycb,16) { WM( EA,RL( RM(EA) ) ); } /* RL (XY+o) */ +OP(xycb,17) { A = RL( RM(EA) ); WM( EA,A ); } /* RL A=(XY+o) */ + +OP(xycb,18) { B = RR( RM(EA) ); WM( EA,B ); } /* RR B=(XY+o) */ +OP(xycb,19) { C = RR( RM(EA) ); WM( EA,C ); } /* RR C=(XY+o) */ +OP(xycb,1a) { D = RR( RM(EA) ); WM( EA,D ); } /* RR D=(XY+o) */ +OP(xycb,1b) { E = RR( RM(EA) ); WM( EA,E ); } /* RR E=(XY+o) */ +OP(xycb,1c) { H = RR( RM(EA) ); WM( EA,H ); } /* RR H=(XY+o) */ +OP(xycb,1d) { L = RR( RM(EA) ); WM( EA,L ); } /* RR L=(XY+o) */ +OP(xycb,1e) { WM( EA,RR( RM(EA) ) ); } /* RR (XY+o) */ +OP(xycb,1f) { A = RR( RM(EA) ); WM( EA,A ); } /* RR A=(XY+o) */ + +OP(xycb,20) { B = SLA( RM(EA) ); WM( EA,B ); } /* SLA B=(XY+o) */ +OP(xycb,21) { C = SLA( RM(EA) ); WM( EA,C ); } /* SLA C=(XY+o) */ +OP(xycb,22) { D = SLA( RM(EA) ); WM( EA,D ); } /* SLA D=(XY+o) */ +OP(xycb,23) { E = SLA( RM(EA) ); WM( EA,E ); } /* SLA E=(XY+o) */ +OP(xycb,24) { H = SLA( RM(EA) ); WM( EA,H ); } /* SLA H=(XY+o) */ +OP(xycb,25) { L = SLA( RM(EA) ); WM( EA,L ); } /* SLA L=(XY+o) */ +OP(xycb,26) { WM( EA,SLA( RM(EA) ) ); } /* SLA (XY+o) */ +OP(xycb,27) { A = SLA( RM(EA) ); WM( EA,A ); } /* SLA A=(XY+o) */ + +OP(xycb,28) { B = SRA( RM(EA) ); WM( EA,B ); } /* SRA B=(XY+o) */ +OP(xycb,29) { C = SRA( RM(EA) ); WM( EA,C ); } /* SRA C=(XY+o) */ +OP(xycb,2a) { D = SRA( RM(EA) ); WM( EA,D ); } /* SRA D=(XY+o) */ +OP(xycb,2b) { E = SRA( RM(EA) ); WM( EA,E ); } /* SRA E=(XY+o) */ +OP(xycb,2c) { H = SRA( RM(EA) ); WM( EA,H ); } /* SRA H=(XY+o) */ +OP(xycb,2d) { L = SRA( RM(EA) ); WM( EA,L ); } /* SRA L=(XY+o) */ +OP(xycb,2e) { WM( EA,SRA( RM(EA) ) ); } /* SRA (XY+o) */ +OP(xycb,2f) { A = SRA( RM(EA) ); WM( EA,A ); } /* SRA A=(XY+o) */ + +OP(xycb,30) { B = SLL( RM(EA) ); WM( EA,B ); } /* SLL B=(XY+o) */ +OP(xycb,31) { C = SLL( RM(EA) ); WM( EA,C ); } /* SLL C=(XY+o) */ +OP(xycb,32) { D = SLL( RM(EA) ); WM( EA,D ); } /* SLL D=(XY+o) */ +OP(xycb,33) { E = SLL( RM(EA) ); WM( EA,E ); } /* SLL E=(XY+o) */ +OP(xycb,34) { H = SLL( RM(EA) ); WM( EA,H ); } /* SLL H=(XY+o) */ +OP(xycb,35) { L = SLL( RM(EA) ); WM( EA,L ); } /* SLL L=(XY+o) */ +OP(xycb,36) { WM( EA,SLL( RM(EA) ) ); } /* SLL (XY+o) */ +OP(xycb,37) { A = SLL( RM(EA) ); WM( EA,A ); } /* SLL A=(XY+o) */ + +OP(xycb,38) { B = SRL( RM(EA) ); WM( EA,B ); } /* SRL B=(XY+o) */ +OP(xycb,39) { C = SRL( RM(EA) ); WM( EA,C ); } /* SRL C=(XY+o) */ +OP(xycb,3a) { D = SRL( RM(EA) ); WM( EA,D ); } /* SRL D=(XY+o) */ +OP(xycb,3b) { E = SRL( RM(EA) ); WM( EA,E ); } /* SRL E=(XY+o) */ +OP(xycb,3c) { H = SRL( RM(EA) ); WM( EA,H ); } /* SRL H=(XY+o) */ +OP(xycb,3d) { L = SRL( RM(EA) ); WM( EA,L ); } /* SRL L=(XY+o) */ +OP(xycb,3e) { WM( EA,SRL( RM(EA) ) ); } /* SRL (XY+o) */ +OP(xycb,3f) { A = SRL( RM(EA) ); WM( EA,A ); } /* SRL A=(XY+o) */ + +OP(xycb,40) { xycb_46(); } /* BIT 0,(XY+o) */ +OP(xycb,41) { xycb_46(); } /* BIT 0,(XY+o) */ +OP(xycb,42) { xycb_46(); } /* BIT 0,(XY+o) */ +OP(xycb,43) { xycb_46(); } /* BIT 0,(XY+o) */ +OP(xycb,44) { xycb_46(); } /* BIT 0,(XY+o) */ +OP(xycb,45) { xycb_46(); } /* BIT 0,(XY+o) */ +OP(xycb,46) { BIT_XY(0,RM(EA)); } /* BIT 0,(XY+o) */ +OP(xycb,47) { xycb_46(); } /* BIT 0,(XY+o) */ + +OP(xycb,48) { xycb_4e(); } /* BIT 1,(XY+o) */ +OP(xycb,49) { xycb_4e(); } /* BIT 1,(XY+o) */ +OP(xycb,4a) { xycb_4e(); } /* BIT 1,(XY+o) */ +OP(xycb,4b) { xycb_4e(); } /* BIT 1,(XY+o) */ +OP(xycb,4c) { xycb_4e(); } /* BIT 1,(XY+o) */ +OP(xycb,4d) { xycb_4e(); } /* BIT 1,(XY+o) */ +OP(xycb,4e) { BIT_XY(1,RM(EA)); } /* BIT 1,(XY+o) */ +OP(xycb,4f) { xycb_4e(); } /* BIT 1,(XY+o) */ + +OP(xycb,50) { xycb_56(); } /* BIT 2,(XY+o) */ +OP(xycb,51) { xycb_56(); } /* BIT 2,(XY+o) */ +OP(xycb,52) { xycb_56(); } /* BIT 2,(XY+o) */ +OP(xycb,53) { xycb_56(); } /* BIT 2,(XY+o) */ +OP(xycb,54) { xycb_56(); } /* BIT 2,(XY+o) */ +OP(xycb,55) { xycb_56(); } /* BIT 2,(XY+o) */ +OP(xycb,56) { BIT_XY(2,RM(EA)); } /* BIT 2,(XY+o) */ +OP(xycb,57) { xycb_56(); } /* BIT 2,(XY+o) */ + +OP(xycb,58) { xycb_5e(); } /* BIT 3,(XY+o) */ +OP(xycb,59) { xycb_5e(); } /* BIT 3,(XY+o) */ +OP(xycb,5a) { xycb_5e(); } /* BIT 3,(XY+o) */ +OP(xycb,5b) { xycb_5e(); } /* BIT 3,(XY+o) */ +OP(xycb,5c) { xycb_5e(); } /* BIT 3,(XY+o) */ +OP(xycb,5d) { xycb_5e(); } /* BIT 3,(XY+o) */ +OP(xycb,5e) { BIT_XY(3,RM(EA)); } /* BIT 3,(XY+o) */ +OP(xycb,5f) { xycb_5e(); } /* BIT 3,(XY+o) */ + +OP(xycb,60) { xycb_66(); } /* BIT 4,(XY+o) */ +OP(xycb,61) { xycb_66(); } /* BIT 4,(XY+o) */ +OP(xycb,62) { xycb_66(); } /* BIT 4,(XY+o) */ +OP(xycb,63) { xycb_66(); } /* BIT 4,(XY+o) */ +OP(xycb,64) { xycb_66(); } /* BIT 4,(XY+o) */ +OP(xycb,65) { xycb_66(); } /* BIT 4,(XY+o) */ +OP(xycb,66) { BIT_XY(4,RM(EA)); } /* BIT 4,(XY+o) */ +OP(xycb,67) { xycb_66(); } /* BIT 4,(XY+o) */ + +OP(xycb,68) { xycb_6e(); } /* BIT 5,(XY+o) */ +OP(xycb,69) { xycb_6e(); } /* BIT 5,(XY+o) */ +OP(xycb,6a) { xycb_6e(); } /* BIT 5,(XY+o) */ +OP(xycb,6b) { xycb_6e(); } /* BIT 5,(XY+o) */ +OP(xycb,6c) { xycb_6e(); } /* BIT 5,(XY+o) */ +OP(xycb,6d) { xycb_6e(); } /* BIT 5,(XY+o) */ +OP(xycb,6e) { BIT_XY(5,RM(EA)); } /* BIT 5,(XY+o) */ +OP(xycb,6f) { xycb_6e(); } /* BIT 5,(XY+o) */ + +OP(xycb,70) { xycb_66(); } /* BIT 6,(XY+o) */ +OP(xycb,71) { xycb_66(); } /* BIT 6,(XY+o) */ +OP(xycb,72) { xycb_66(); } /* BIT 6,(XY+o) */ +OP(xycb,73) { xycb_66(); } /* BIT 6,(XY+o) */ +OP(xycb,74) { xycb_66(); } /* BIT 6,(XY+o) */ +OP(xycb,75) { xycb_66(); } /* BIT 6,(XY+o) */ +OP(xycb,76) { BIT_XY(6,RM(EA)); } /* BIT 6,(XY+o) */ +OP(xycb,77) { xycb_66(); } /* BIT 6,(XY+o) */ + +OP(xycb,78) { xycb_7e(); } /* BIT 7,(XY+o) */ +OP(xycb,79) { xycb_7e(); } /* BIT 7,(XY+o) */ +OP(xycb,7a) { xycb_7e(); } /* BIT 7,(XY+o) */ +OP(xycb,7b) { xycb_7e(); } /* BIT 7,(XY+o) */ +OP(xycb,7c) { xycb_7e(); } /* BIT 7,(XY+o) */ +OP(xycb,7d) { xycb_7e(); } /* BIT 7,(XY+o) */ +OP(xycb,7e) { BIT_XY(7,RM(EA)); } /* BIT 7,(XY+o) */ +OP(xycb,7f) { xycb_7e(); } /* BIT 7,(XY+o) */ + +OP(xycb,80) { B = RES(0, RM(EA) ); WM( EA,B ); } /* RES 0,B=(XY+o) */ +OP(xycb,81) { C = RES(0, RM(EA) ); WM( EA,C ); } /* RES 0,C=(XY+o) */ +OP(xycb,82) { D = RES(0, RM(EA) ); WM( EA,D ); } /* RES 0,D=(XY+o) */ +OP(xycb,83) { E = RES(0, RM(EA) ); WM( EA,E ); } /* RES 0,E=(XY+o) */ +OP(xycb,84) { H = RES(0, RM(EA) ); WM( EA,H ); } /* RES 0,H=(XY+o) */ +OP(xycb,85) { L = RES(0, RM(EA) ); WM( EA,L ); } /* RES 0,L=(XY+o) */ +OP(xycb,86) { WM( EA, RES(0,RM(EA)) ); } /* RES 0,(XY+o) */ +OP(xycb,87) { A = RES(0, RM(EA) ); WM( EA,A ); } /* RES 0,A=(XY+o) */ + +OP(xycb,88) { B = RES(1, RM(EA) ); WM( EA,B ); } /* RES 1,B=(XY+o) */ +OP(xycb,89) { C = RES(1, RM(EA) ); WM( EA,C ); } /* RES 1,C=(XY+o) */ +OP(xycb,8a) { D = RES(1, RM(EA) ); WM( EA,D ); } /* RES 1,D=(XY+o) */ +OP(xycb,8b) { E = RES(1, RM(EA) ); WM( EA,E ); } /* RES 1,E=(XY+o) */ +OP(xycb,8c) { H = RES(1, RM(EA) ); WM( EA,H ); } /* RES 1,H=(XY+o) */ +OP(xycb,8d) { L = RES(1, RM(EA) ); WM( EA,L ); } /* RES 1,L=(XY+o) */ +OP(xycb,8e) { WM( EA, RES(1,RM(EA)) ); } /* RES 1,(XY+o) */ +OP(xycb,8f) { A = RES(1, RM(EA) ); WM( EA,A ); } /* RES 1,A=(XY+o) */ + +OP(xycb,90) { B = RES(2, RM(EA) ); WM( EA,B ); } /* RES 2,B=(XY+o) */ +OP(xycb,91) { C = RES(2, RM(EA) ); WM( EA,C ); } /* RES 2,C=(XY+o) */ +OP(xycb,92) { D = RES(2, RM(EA) ); WM( EA,D ); } /* RES 2,D=(XY+o) */ +OP(xycb,93) { E = RES(2, RM(EA) ); WM( EA,E ); } /* RES 2,E=(XY+o) */ +OP(xycb,94) { H = RES(2, RM(EA) ); WM( EA,H ); } /* RES 2,H=(XY+o) */ +OP(xycb,95) { L = RES(2, RM(EA) ); WM( EA,L ); } /* RES 2,L=(XY+o) */ +OP(xycb,96) { WM( EA, RES(2,RM(EA)) ); } /* RES 2,(XY+o) */ +OP(xycb,97) { A = RES(2, RM(EA) ); WM( EA,A ); } /* RES 2,A=(XY+o) */ + +OP(xycb,98) { B = RES(3, RM(EA) ); WM( EA,B ); } /* RES 3,B=(XY+o) */ +OP(xycb,99) { C = RES(3, RM(EA) ); WM( EA,C ); } /* RES 3,C=(XY+o) */ +OP(xycb,9a) { D = RES(3, RM(EA) ); WM( EA,D ); } /* RES 3,D=(XY+o) */ +OP(xycb,9b) { E = RES(3, RM(EA) ); WM( EA,E ); } /* RES 3,E=(XY+o) */ +OP(xycb,9c) { H = RES(3, RM(EA) ); WM( EA,H ); } /* RES 3,H=(XY+o) */ +OP(xycb,9d) { L = RES(3, RM(EA) ); WM( EA,L ); } /* RES 3,L=(XY+o) */ +OP(xycb,9e) { WM( EA, RES(3,RM(EA)) ); } /* RES 3,(XY+o) */ +OP(xycb,9f) { A = RES(3, RM(EA) ); WM( EA,A ); } /* RES 3,A=(XY+o) */ + +OP(xycb,a0) { B = RES(4, RM(EA) ); WM( EA,B ); } /* RES 4,B=(XY+o) */ +OP(xycb,a1) { C = RES(4, RM(EA) ); WM( EA,C ); } /* RES 4,C=(XY+o) */ +OP(xycb,a2) { D = RES(4, RM(EA) ); WM( EA,D ); } /* RES 4,D=(XY+o) */ +OP(xycb,a3) { E = RES(4, RM(EA) ); WM( EA,E ); } /* RES 4,E=(XY+o) */ +OP(xycb,a4) { H = RES(4, RM(EA) ); WM( EA,H ); } /* RES 4,H=(XY+o) */ +OP(xycb,a5) { L = RES(4, RM(EA) ); WM( EA,L ); } /* RES 4,L=(XY+o) */ +OP(xycb,a6) { WM( EA, RES(4,RM(EA)) ); } /* RES 4,(XY+o) */ +OP(xycb,a7) { A = RES(4, RM(EA) ); WM( EA,A ); } /* RES 4,A=(XY+o) */ + +OP(xycb,a8) { B = RES(5, RM(EA) ); WM( EA,B ); } /* RES 5,B=(XY+o) */ +OP(xycb,a9) { C = RES(5, RM(EA) ); WM( EA,C ); } /* RES 5,C=(XY+o) */ +OP(xycb,aa) { D = RES(5, RM(EA) ); WM( EA,D ); } /* RES 5,D=(XY+o) */ +OP(xycb,ab) { E = RES(5, RM(EA) ); WM( EA,E ); } /* RES 5,E=(XY+o) */ +OP(xycb,ac) { H = RES(5, RM(EA) ); WM( EA,H ); } /* RES 5,H=(XY+o) */ +OP(xycb,ad) { L = RES(5, RM(EA) ); WM( EA,L ); } /* RES 5,L=(XY+o) */ +OP(xycb,ae) { WM( EA, RES(5,RM(EA)) ); } /* RES 5,(XY+o) */ +OP(xycb,af) { A = RES(5, RM(EA) ); WM( EA,A ); } /* RES 5,A=(XY+o) */ + +OP(xycb,b0) { B = RES(6, RM(EA) ); WM( EA,B ); } /* RES 6,B=(XY+o) */ +OP(xycb,b1) { C = RES(6, RM(EA) ); WM( EA,C ); } /* RES 6,C=(XY+o) */ +OP(xycb,b2) { D = RES(6, RM(EA) ); WM( EA,D ); } /* RES 6,D=(XY+o) */ +OP(xycb,b3) { E = RES(6, RM(EA) ); WM( EA,E ); } /* RES 6,E=(XY+o) */ +OP(xycb,b4) { H = RES(6, RM(EA) ); WM( EA,H ); } /* RES 6,H=(XY+o) */ +OP(xycb,b5) { L = RES(6, RM(EA) ); WM( EA,L ); } /* RES 6,L=(XY+o) */ +OP(xycb,b6) { WM( EA, RES(6,RM(EA)) ); } /* RES 6,(XY+o) */ +OP(xycb,b7) { A = RES(6, RM(EA) ); WM( EA,A ); } /* RES 6,A=(XY+o) */ + +OP(xycb,b8) { B = RES(7, RM(EA) ); WM( EA,B ); } /* RES 7,B=(XY+o) */ +OP(xycb,b9) { C = RES(7, RM(EA) ); WM( EA,C ); } /* RES 7,C=(XY+o) */ +OP(xycb,ba) { D = RES(7, RM(EA) ); WM( EA,D ); } /* RES 7,D=(XY+o) */ +OP(xycb,bb) { E = RES(7, RM(EA) ); WM( EA,E ); } /* RES 7,E=(XY+o) */ +OP(xycb,bc) { H = RES(7, RM(EA) ); WM( EA,H ); } /* RES 7,H=(XY+o) */ +OP(xycb,bd) { L = RES(7, RM(EA) ); WM( EA,L ); } /* RES 7,L=(XY+o) */ +OP(xycb,be) { WM( EA, RES(7,RM(EA)) ); } /* RES 7,(XY+o) */ +OP(xycb,bf) { A = RES(7, RM(EA) ); WM( EA,A ); } /* RES 7,A=(XY+o) */ + +OP(xycb,c0) { B = SET(0, RM(EA) ); WM( EA,B ); } /* SET 0,B=(XY+o) */ +OP(xycb,c1) { C = SET(0, RM(EA) ); WM( EA,C ); } /* SET 0,C=(XY+o) */ +OP(xycb,c2) { D = SET(0, RM(EA) ); WM( EA,D ); } /* SET 0,D=(XY+o) */ +OP(xycb,c3) { E = SET(0, RM(EA) ); WM( EA,E ); } /* SET 0,E=(XY+o) */ +OP(xycb,c4) { H = SET(0, RM(EA) ); WM( EA,H ); } /* SET 0,H=(XY+o) */ +OP(xycb,c5) { L = SET(0, RM(EA) ); WM( EA,L ); } /* SET 0,L=(XY+o) */ +OP(xycb,c6) { WM( EA, SET(0,RM(EA)) ); } /* SET 0,(XY+o) */ +OP(xycb,c7) { A = SET(0, RM(EA) ); WM( EA,A ); } /* SET 0,A=(XY+o) */ + +OP(xycb,c8) { B = SET(1, RM(EA) ); WM( EA,B ); } /* SET 1,B=(XY+o) */ +OP(xycb,c9) { C = SET(1, RM(EA) ); WM( EA,C ); } /* SET 1,C=(XY+o) */ +OP(xycb,ca) { D = SET(1, RM(EA) ); WM( EA,D ); } /* SET 1,D=(XY+o) */ +OP(xycb,cb) { E = SET(1, RM(EA) ); WM( EA,E ); } /* SET 1,E=(XY+o) */ +OP(xycb,cc) { H = SET(1, RM(EA) ); WM( EA,H ); } /* SET 1,H=(XY+o) */ +OP(xycb,cd) { L = SET(1, RM(EA) ); WM( EA,L ); } /* SET 1,L=(XY+o) */ +OP(xycb,ce) { WM( EA, SET(1,RM(EA)) ); } /* SET 1,(XY+o) */ +OP(xycb,cf) { A = SET(1, RM(EA) ); WM( EA,A ); } /* SET 1,A=(XY+o) */ + +OP(xycb,d0) { B = SET(2, RM(EA) ); WM( EA,B ); } /* SET 2,B=(XY+o) */ +OP(xycb,d1) { C = SET(2, RM(EA) ); WM( EA,C ); } /* SET 2,C=(XY+o) */ +OP(xycb,d2) { D = SET(2, RM(EA) ); WM( EA,D ); } /* SET 2,D=(XY+o) */ +OP(xycb,d3) { E = SET(2, RM(EA) ); WM( EA,E ); } /* SET 2,E=(XY+o) */ +OP(xycb,d4) { H = SET(2, RM(EA) ); WM( EA,H ); } /* SET 2,H=(XY+o) */ +OP(xycb,d5) { L = SET(2, RM(EA) ); WM( EA,L ); } /* SET 2,L=(XY+o) */ +OP(xycb,d6) { WM( EA, SET(2,RM(EA)) ); } /* SET 2,(XY+o) */ +OP(xycb,d7) { A = SET(2, RM(EA) ); WM( EA,A ); } /* SET 2,A=(XY+o) */ + +OP(xycb,d8) { B = SET(3, RM(EA) ); WM( EA,B ); } /* SET 3,B=(XY+o) */ +OP(xycb,d9) { C = SET(3, RM(EA) ); WM( EA,C ); } /* SET 3,C=(XY+o) */ +OP(xycb,da) { D = SET(3, RM(EA) ); WM( EA,D ); } /* SET 3,D=(XY+o) */ +OP(xycb,db) { E = SET(3, RM(EA) ); WM( EA,E ); } /* SET 3,E=(XY+o) */ +OP(xycb,dc) { H = SET(3, RM(EA) ); WM( EA,H ); } /* SET 3,H=(XY+o) */ +OP(xycb,dd) { L = SET(3, RM(EA) ); WM( EA,L ); } /* SET 3,L=(XY+o) */ +OP(xycb,de) { WM( EA, SET(3,RM(EA)) ); } /* SET 3,(XY+o) */ +OP(xycb,df) { A = SET(3, RM(EA) ); WM( EA,A ); } /* SET 3,A=(XY+o) */ + +OP(xycb,e0) { B = SET(4, RM(EA) ); WM( EA,B ); } /* SET 4,B=(XY+o) */ +OP(xycb,e1) { C = SET(4, RM(EA) ); WM( EA,C ); } /* SET 4,C=(XY+o) */ +OP(xycb,e2) { D = SET(4, RM(EA) ); WM( EA,D ); } /* SET 4,D=(XY+o) */ +OP(xycb,e3) { E = SET(4, RM(EA) ); WM( EA,E ); } /* SET 4,E=(XY+o) */ +OP(xycb,e4) { H = SET(4, RM(EA) ); WM( EA,H ); } /* SET 4,H=(XY+o) */ +OP(xycb,e5) { L = SET(4, RM(EA) ); WM( EA,L ); } /* SET 4,L=(XY+o) */ +OP(xycb,e6) { WM( EA, SET(4,RM(EA)) ); } /* SET 4,(XY+o) */ +OP(xycb,e7) { A = SET(4, RM(EA) ); WM( EA,A ); } /* SET 4,A=(XY+o) */ + +OP(xycb,e8) { B = SET(5, RM(EA) ); WM( EA,B ); } /* SET 5,B=(XY+o) */ +OP(xycb,e9) { C = SET(5, RM(EA) ); WM( EA,C ); } /* SET 5,C=(XY+o) */ +OP(xycb,ea) { D = SET(5, RM(EA) ); WM( EA,D ); } /* SET 5,D=(XY+o) */ +OP(xycb,eb) { E = SET(5, RM(EA) ); WM( EA,E ); } /* SET 5,E=(XY+o) */ +OP(xycb,ec) { H = SET(5, RM(EA) ); WM( EA,H ); } /* SET 5,H=(XY+o) */ +OP(xycb,ed) { L = SET(5, RM(EA) ); WM( EA,L ); } /* SET 5,L=(XY+o) */ +OP(xycb,ee) { WM( EA, SET(5,RM(EA)) ); } /* SET 5,(XY+o) */ +OP(xycb,ef) { A = SET(5, RM(EA) ); WM( EA,A ); } /* SET 5,A=(XY+o) */ + +OP(xycb,f0) { B = SET(6, RM(EA) ); WM( EA,B ); } /* SET 6,B=(XY+o) */ +OP(xycb,f1) { C = SET(6, RM(EA) ); WM( EA,C ); } /* SET 6,C=(XY+o) */ +OP(xycb,f2) { D = SET(6, RM(EA) ); WM( EA,D ); } /* SET 6,D=(XY+o) */ +OP(xycb,f3) { E = SET(6, RM(EA) ); WM( EA,E ); } /* SET 6,E=(XY+o) */ +OP(xycb,f4) { H = SET(6, RM(EA) ); WM( EA,H ); } /* SET 6,H=(XY+o) */ +OP(xycb,f5) { L = SET(6, RM(EA) ); WM( EA,L ); } /* SET 6,L=(XY+o) */ +OP(xycb,f6) { WM( EA, SET(6,RM(EA)) ); } /* SET 6,(XY+o) */ +OP(xycb,f7) { A = SET(6, RM(EA) ); WM( EA,A ); } /* SET 6,A=(XY+o) */ + +OP(xycb,f8) { B = SET(7, RM(EA) ); WM( EA,B ); } /* SET 7,B=(XY+o) */ +OP(xycb,f9) { C = SET(7, RM(EA) ); WM( EA,C ); } /* SET 7,C=(XY+o) */ +OP(xycb,fa) { D = SET(7, RM(EA) ); WM( EA,D ); } /* SET 7,D=(XY+o) */ +OP(xycb,fb) { E = SET(7, RM(EA) ); WM( EA,E ); } /* SET 7,E=(XY+o) */ +OP(xycb,fc) { H = SET(7, RM(EA) ); WM( EA,H ); } /* SET 7,H=(XY+o) */ +OP(xycb,fd) { L = SET(7, RM(EA) ); WM( EA,L ); } /* SET 7,L=(XY+o) */ +OP(xycb,fe) { WM( EA, SET(7,RM(EA)) ); } /* SET 7,(XY+o) */ +OP(xycb,ff) { A = SET(7, RM(EA) ); WM( EA,A ); } /* SET 7,A=(XY+o) */ + +OP(illegal,1) { +#if VERBOSE + logerror("Z80 #%d ill. opcode $%02x $%02x\n", + cpu_getactivecpu(), cpu_readop((PCD-1)&0xffff), cpu_readop(PCD)); +#endif +} +/********************************************************** + * IX register related opcodes (DD prefix) + **********************************************************/ +OP(dd,00) { illegal_1(); op_00(); } /* DB DD */ +OP(dd,01) { illegal_1(); op_01(); } /* DB DD */ +OP(dd,02) { illegal_1(); op_02(); } /* DB DD */ +OP(dd,03) { illegal_1(); op_03(); } /* DB DD */ +OP(dd,04) { illegal_1(); op_04(); } /* DB DD */ +OP(dd,05) { illegal_1(); op_05(); } /* DB DD */ +OP(dd,06) { illegal_1(); op_06(); } /* DB DD */ +OP(dd,07) { illegal_1(); op_07(); } /* DB DD */ + +OP(dd,08) { illegal_1(); op_08(); } /* DB DD */ +OP(dd,09) { R++; ADD16(ix,bc); } /* ADD IX,BC */ +OP(dd,0a) { illegal_1(); op_0a(); } /* DB DD */ +OP(dd,0b) { illegal_1(); op_0b(); } /* DB DD */ +OP(dd,0c) { illegal_1(); op_0c(); } /* DB DD */ +OP(dd,0d) { illegal_1(); op_0d(); } /* DB DD */ +OP(dd,0e) { illegal_1(); op_0e(); } /* DB DD */ +OP(dd,0f) { illegal_1(); op_0f(); } /* DB DD */ + +OP(dd,10) { illegal_1(); op_10(); } /* DB DD */ +OP(dd,11) { illegal_1(); op_11(); } /* DB DD */ +OP(dd,12) { illegal_1(); op_12(); } /* DB DD */ +OP(dd,13) { illegal_1(); op_13(); } /* DB DD */ +OP(dd,14) { illegal_1(); op_14(); } /* DB DD */ +OP(dd,15) { illegal_1(); op_15(); } /* DB DD */ +OP(dd,16) { illegal_1(); op_16(); } /* DB DD */ +OP(dd,17) { illegal_1(); op_17(); } /* DB DD */ + +OP(dd,18) { illegal_1(); op_18(); } /* DB DD */ +OP(dd,19) { R++; ADD16(ix,de); } /* ADD IX,DE */ +OP(dd,1a) { illegal_1(); op_1a(); } /* DB DD */ +OP(dd,1b) { illegal_1(); op_1b(); } /* DB DD */ +OP(dd,1c) { illegal_1(); op_1c(); } /* DB DD */ +OP(dd,1d) { illegal_1(); op_1d(); } /* DB DD */ +OP(dd,1e) { illegal_1(); op_1e(); } /* DB DD */ +OP(dd,1f) { illegal_1(); op_1f(); } /* DB DD */ + +OP(dd,20) { illegal_1(); op_20(); } /* DB DD */ +OP(dd,21) { R++; IX = ARG16(); } /* LD IX,w */ +OP(dd,22) { R++; EA = ARG16(); WM16( EA, &Z80.ix ); } /* LD (w),IX */ +OP(dd,23) { R++; IX++; } /* INC IX */ +OP(dd,24) { R++; HX = INC(HX); } /* INC HX */ +OP(dd,25) { R++; HX = DEC(HX); } /* DEC HX */ +OP(dd,26) { R++; HX = ARG(); } /* LD HX,n */ +OP(dd,27) { illegal_1(); op_27(); } /* DB DD */ + +OP(dd,28) { illegal_1(); op_28(); } /* DB DD */ +OP(dd,29) { R++; ADD16(ix,ix); } /* ADD IX,IX */ +OP(dd,2a) { R++; EA = ARG16(); RM16( EA, &Z80.ix ); } /* LD IX,(w) */ +OP(dd,2b) { R++; IX--; } /* DEC IX */ +OP(dd,2c) { R++; LX = INC(LX); } /* INC LX */ +OP(dd,2d) { R++; LX = DEC(LX); } /* DEC LX */ +OP(dd,2e) { R++; LX = ARG(); } /* LD LX,n */ +OP(dd,2f) { illegal_1(); op_2f(); } /* DB DD */ + +OP(dd,30) { illegal_1(); op_30(); } /* DB DD */ +OP(dd,31) { illegal_1(); op_31(); } /* DB DD */ +OP(dd,32) { illegal_1(); op_32(); } /* DB DD */ +OP(dd,33) { illegal_1(); op_33(); } /* DB DD */ +OP(dd,34) { R++; EAX; WM( EA, INC(RM(EA)) ); } /* INC (IX+o) */ +OP(dd,35) { R++; EAX; WM( EA, DEC(RM(EA)) ); } /* DEC (IX+o) */ +OP(dd,36) { R++; EAX; WM( EA, ARG() ); } /* LD (IX+o),n */ +OP(dd,37) { illegal_1(); op_37(); } /* DB DD */ + +OP(dd,38) { illegal_1(); op_38(); } /* DB DD */ +OP(dd,39) { R++; ADD16(ix,sp); } /* ADD IX,SP */ +OP(dd,3a) { illegal_1(); op_3a(); } /* DB DD */ +OP(dd,3b) { illegal_1(); op_3b(); } /* DB DD */ +OP(dd,3c) { illegal_1(); op_3c(); } /* DB DD */ +OP(dd,3d) { illegal_1(); op_3d(); } /* DB DD */ +OP(dd,3e) { illegal_1(); op_3e(); } /* DB DD */ +OP(dd,3f) { illegal_1(); op_3f(); } /* DB DD */ + +OP(dd,40) { illegal_1(); op_40(); } /* DB DD */ +OP(dd,41) { illegal_1(); op_41(); } /* DB DD */ +OP(dd,42) { illegal_1(); op_42(); } /* DB DD */ +OP(dd,43) { illegal_1(); op_43(); } /* DB DD */ +OP(dd,44) { R++; B = HX; } /* LD B,HX */ +OP(dd,45) { R++; B = LX; } /* LD B,LX */ +OP(dd,46) { R++; EAX; B = RM(EA); } /* LD B,(IX+o) */ +OP(dd,47) { illegal_1(); op_47(); } /* DB DD */ + +OP(dd,48) { illegal_1(); op_48(); } /* DB DD */ +OP(dd,49) { illegal_1(); op_49(); } /* DB DD */ +OP(dd,4a) { illegal_1(); op_4a(); } /* DB DD */ +OP(dd,4b) { illegal_1(); op_4b(); } /* DB DD */ +OP(dd,4c) { R++; C = HX; } /* LD C,HX */ +OP(dd,4d) { R++; C = LX; } /* LD C,LX */ +OP(dd,4e) { R++; EAX; C = RM(EA); } /* LD C,(IX+o) */ +OP(dd,4f) { illegal_1(); op_4f(); } /* DB DD */ + +OP(dd,50) { illegal_1(); op_50(); } /* DB DD */ +OP(dd,51) { illegal_1(); op_51(); } /* DB DD */ +OP(dd,52) { illegal_1(); op_52(); } /* DB DD */ +OP(dd,53) { illegal_1(); op_53(); } /* DB DD */ +OP(dd,54) { R++; D = HX; } /* LD D,HX */ +OP(dd,55) { R++; D = LX; } /* LD D,LX */ +OP(dd,56) { R++; EAX; D = RM(EA); } /* LD D,(IX+o) */ +OP(dd,57) { illegal_1(); op_57(); } /* DB DD */ + +OP(dd,58) { illegal_1(); op_58(); } /* DB DD */ +OP(dd,59) { illegal_1(); op_59(); } /* DB DD */ +OP(dd,5a) { illegal_1(); op_5a(); } /* DB DD */ +OP(dd,5b) { illegal_1(); op_5b(); } /* DB DD */ +OP(dd,5c) { R++; E = HX; } /* LD E,HX */ +OP(dd,5d) { R++; E = LX; } /* LD E,LX */ +OP(dd,5e) { R++; EAX; E = RM(EA); } /* LD E,(IX+o) */ +OP(dd,5f) { illegal_1(); op_5f(); } /* DB DD */ + +OP(dd,60) { R++; HX = B; } /* LD HX,B */ +OP(dd,61) { R++; HX = C; } /* LD HX,C */ +OP(dd,62) { R++; HX = D; } /* LD HX,D */ +OP(dd,63) { R++; HX = E; } /* LD HX,E */ +OP(dd,64) { } /* LD HX,HX */ +OP(dd,65) { R++; HX = LX; } /* LD HX,LX */ +OP(dd,66) { R++; EAX; H = RM(EA); } /* LD H,(IX+o) */ +OP(dd,67) { R++; HX = A; } /* LD HX,A */ + +OP(dd,68) { R++; LX = B; } /* LD LX,B */ +OP(dd,69) { R++; LX = C; } /* LD LX,C */ +OP(dd,6a) { R++; LX = D; } /* LD LX,D */ +OP(dd,6b) { R++; LX = E; } /* LD LX,E */ +OP(dd,6c) { R++; LX = HX; } /* LD LX,HX */ +OP(dd,6d) { } /* LD LX,LX */ +OP(dd,6e) { R++; EAX; L = RM(EA); } /* LD L,(IX+o) */ +OP(dd,6f) { R++; LX = A; } /* LD LX,A */ + +OP(dd,70) { R++; EAX; WM( EA, B ); } /* LD (IX+o),B */ +OP(dd,71) { R++; EAX; WM( EA, C ); } /* LD (IX+o),C */ +OP(dd,72) { R++; EAX; WM( EA, D ); } /* LD (IX+o),D */ +OP(dd,73) { R++; EAX; WM( EA, E ); } /* LD (IX+o),E */ +OP(dd,74) { R++; EAX; WM( EA, H ); } /* LD (IX+o),H */ +OP(dd,75) { R++; EAX; WM( EA, L ); } /* LD (IX+o),L */ +OP(dd,76) { illegal_1(); op_76(); } /* DB DD */ +OP(dd,77) { R++; EAX; WM( EA, A ); } /* LD (IX+o),A */ + +OP(dd,78) { illegal_1(); op_78(); } /* DB DD */ +OP(dd,79) { illegal_1(); op_79(); } /* DB DD */ +OP(dd,7a) { illegal_1(); op_7a(); } /* DB DD */ +OP(dd,7b) { illegal_1(); op_7b(); } /* DB DD */ +OP(dd,7c) { R++; A = HX; } /* LD A,HX */ +OP(dd,7d) { R++; A = LX; } /* LD A,LX */ +OP(dd,7e) { R++; EAX; A = RM(EA); } /* LD A,(IX+o) */ +OP(dd,7f) { illegal_1(); op_7f(); } /* DB DD */ + +OP(dd,80) { illegal_1(); op_80(); } /* DB DD */ +OP(dd,81) { illegal_1(); op_81(); } /* DB DD */ +OP(dd,82) { illegal_1(); op_82(); } /* DB DD */ +OP(dd,83) { illegal_1(); op_83(); } /* DB DD */ +OP(dd,84) { R++; ADD(HX); } /* ADD A,HX */ +OP(dd,85) { R++; ADD(LX); } /* ADD A,LX */ +OP(dd,86) { R++; EAX; ADD(RM(EA)); } /* ADD A,(IX+o) */ +OP(dd,87) { illegal_1(); op_87(); } /* DB DD */ + +OP(dd,88) { illegal_1(); op_88(); } /* DB DD */ +OP(dd,89) { illegal_1(); op_89(); } /* DB DD */ +OP(dd,8a) { illegal_1(); op_8a(); } /* DB DD */ +OP(dd,8b) { illegal_1(); op_8b(); } /* DB DD */ +OP(dd,8c) { R++; ADC(HX); } /* ADC A,HX */ +OP(dd,8d) { R++; ADC(LX); } /* ADC A,LX */ +OP(dd,8e) { R++; EAX; ADC(RM(EA)); } /* ADC A,(IX+o) */ +OP(dd,8f) { illegal_1(); op_8f(); } /* DB DD */ + +OP(dd,90) { illegal_1(); op_90(); } /* DB DD */ +OP(dd,91) { illegal_1(); op_91(); } /* DB DD */ +OP(dd,92) { illegal_1(); op_92(); } /* DB DD */ +OP(dd,93) { illegal_1(); op_93(); } /* DB DD */ +OP(dd,94) { R++; SUB(HX); } /* SUB HX */ +OP(dd,95) { R++; SUB(LX); } /* SUB LX */ +OP(dd,96) { R++; EAX; SUB(RM(EA)); } /* SUB (IX+o) */ +OP(dd,97) { illegal_1(); op_97(); } /* DB DD */ + +OP(dd,98) { illegal_1(); op_98(); } /* DB DD */ +OP(dd,99) { illegal_1(); op_99(); } /* DB DD */ +OP(dd,9a) { illegal_1(); op_9a(); } /* DB DD */ +OP(dd,9b) { illegal_1(); op_9b(); } /* DB DD */ +OP(dd,9c) { R++; SBC(HX); } /* SBC A,HX */ +OP(dd,9d) { R++; SBC(LX); } /* SBC A,LX */ +OP(dd,9e) { R++; EAX; SBC(RM(EA)); } /* SBC A,(IX+o) */ +OP(dd,9f) { illegal_1(); op_9f(); } /* DB DD */ + +OP(dd,a0) { illegal_1(); op_a0(); } /* DB DD */ +OP(dd,a1) { illegal_1(); op_a1(); } /* DB DD */ +OP(dd,a2) { illegal_1(); op_a2(); } /* DB DD */ +OP(dd,a3) { illegal_1(); op_a3(); } /* DB DD */ +OP(dd,a4) { R++; AND(HX); } /* AND HX */ +OP(dd,a5) { R++; AND(LX); } /* AND LX */ +OP(dd,a6) { R++; EAX; AND(RM(EA)); } /* AND (IX+o) */ +OP(dd,a7) { illegal_1(); op_a7(); } /* DB DD */ + +OP(dd,a8) { illegal_1(); op_a8(); } /* DB DD */ +OP(dd,a9) { illegal_1(); op_a9(); } /* DB DD */ +OP(dd,aa) { illegal_1(); op_aa(); } /* DB DD */ +OP(dd,ab) { illegal_1(); op_ab(); } /* DB DD */ +OP(dd,ac) { R++; XOR(HX); } /* XOR HX */ +OP(dd,ad) { R++; XOR(LX); } /* XOR LX */ +OP(dd,ae) { R++; EAX; XOR(RM(EA)); } /* XOR (IX+o) */ +OP(dd,af) { illegal_1(); op_af(); } /* DB DD */ + +OP(dd,b0) { illegal_1(); op_b0(); } /* DB DD */ +OP(dd,b1) { illegal_1(); op_b1(); } /* DB DD */ +OP(dd,b2) { illegal_1(); op_b2(); } /* DB DD */ +OP(dd,b3) { illegal_1(); op_b3(); } /* DB DD */ +OP(dd,b4) { R++; OR(HX); } /* OR HX */ +OP(dd,b5) { R++; OR(LX); } /* OR LX */ +OP(dd,b6) { R++; EAX; OR(RM(EA)); } /* OR (IX+o) */ +OP(dd,b7) { illegal_1(); op_b7(); } /* DB DD */ + +OP(dd,b8) { illegal_1(); op_b8(); } /* DB DD */ +OP(dd,b9) { illegal_1(); op_b9(); } /* DB DD */ +OP(dd,ba) { illegal_1(); op_ba(); } /* DB DD */ +OP(dd,bb) { illegal_1(); op_bb(); } /* DB DD */ +OP(dd,bc) { R++; CP(HX); } /* CP HX */ +OP(dd,bd) { R++; CP(LX); } /* CP LX */ +OP(dd,be) { R++; EAX; CP(RM(EA)); } /* CP (IX+o) */ +OP(dd,bf) { illegal_1(); op_bf(); } /* DB DD */ + +OP(dd,c0) { illegal_1(); op_c0(); } /* DB DD */ +OP(dd,c1) { illegal_1(); op_c1(); } /* DB DD */ +OP(dd,c2) { illegal_1(); op_c2(); } /* DB DD */ +OP(dd,c3) { illegal_1(); op_c3(); } /* DB DD */ +OP(dd,c4) { illegal_1(); op_c4(); } /* DB DD */ +OP(dd,c5) { illegal_1(); op_c5(); } /* DB DD */ +OP(dd,c6) { illegal_1(); op_c6(); } /* DB DD */ +OP(dd,c7) { illegal_1(); op_c7(); } /* DB DD */ + +OP(dd,c8) { illegal_1(); op_c8(); } /* DB DD */ +OP(dd,c9) { illegal_1(); op_c9(); } /* DB DD */ +OP(dd,ca) { illegal_1(); op_ca(); } /* DB DD */ +OP(dd,cb) { R++; EAX; EXEC(xycb,ARG()); } /* ** DD CB xx */ +OP(dd,cc) { illegal_1(); op_cc(); } /* DB DD */ +OP(dd,cd) { illegal_1(); op_cd(); } /* DB DD */ +OP(dd,ce) { illegal_1(); op_ce(); } /* DB DD */ +OP(dd,cf) { illegal_1(); op_cf(); } /* DB DD */ + +OP(dd,d0) { illegal_1(); op_d0(); } /* DB DD */ +OP(dd,d1) { illegal_1(); op_d1(); } /* DB DD */ +OP(dd,d2) { illegal_1(); op_d2(); } /* DB DD */ +OP(dd,d3) { illegal_1(); op_d3(); } /* DB DD */ +OP(dd,d4) { illegal_1(); op_d4(); } /* DB DD */ +OP(dd,d5) { illegal_1(); op_d5(); } /* DB DD */ +OP(dd,d6) { illegal_1(); op_d6(); } /* DB DD */ +OP(dd,d7) { illegal_1(); op_d7(); } /* DB DD */ + +OP(dd,d8) { illegal_1(); op_d8(); } /* DB DD */ +OP(dd,d9) { illegal_1(); op_d9(); } /* DB DD */ +OP(dd,da) { illegal_1(); op_da(); } /* DB DD */ +OP(dd,db) { illegal_1(); op_db(); } /* DB DD */ +OP(dd,dc) { illegal_1(); op_dc(); } /* DB DD */ +OP(dd,dd) { illegal_1(); op_dd(); } /* DB DD */ +OP(dd,de) { illegal_1(); op_de(); } /* DB DD */ +OP(dd,df) { illegal_1(); op_df(); } /* DB DD */ + +OP(dd,e0) { illegal_1(); op_e0(); } /* DB DD */ +OP(dd,e1) { R++; POP( ix ); } /* POP IX */ +OP(dd,e2) { illegal_1(); op_e2(); } /* DB DD */ +OP(dd,e3) { R++; EXSP( ix ); } /* EX (SP),IX */ +OP(dd,e4) { illegal_1(); op_e4(); } /* DB DD */ +OP(dd,e5) { R++; PUSH( ix ); } /* PUSH IX */ +OP(dd,e6) { illegal_1(); op_e6(); } /* DB DD */ +OP(dd,e7) { illegal_1(); op_e7(); } /* DB DD */ + +OP(dd,e8) { illegal_1(); op_e8(); } /* DB DD */ +OP(dd,e9) { R++; PC = IX; change_pc(PCD); } /* JP (IX) */ +OP(dd,ea) { illegal_1(); op_ea(); } /* DB DD */ +OP(dd,eb) { illegal_1(); op_eb(); } /* DB DD */ +OP(dd,ec) { illegal_1(); op_ec(); } /* DB DD */ +OP(dd,ed) { illegal_1(); op_ed(); } /* DB DD */ +OP(dd,ee) { illegal_1(); op_ee(); } /* DB DD */ +OP(dd,ef) { illegal_1(); op_ef(); } /* DB DD */ + +OP(dd,f0) { illegal_1(); op_f0(); } /* DB DD */ +OP(dd,f1) { illegal_1(); op_f1(); } /* DB DD */ +OP(dd,f2) { illegal_1(); op_f2(); } /* DB DD */ +OP(dd,f3) { illegal_1(); op_f3(); } /* DB DD */ +OP(dd,f4) { illegal_1(); op_f4(); } /* DB DD */ +OP(dd,f5) { illegal_1(); op_f5(); } /* DB DD */ +OP(dd,f6) { illegal_1(); op_f6(); } /* DB DD */ +OP(dd,f7) { illegal_1(); op_f7(); } /* DB DD */ + +OP(dd,f8) { illegal_1(); op_f8(); } /* DB DD */ +OP(dd,f9) { R++; SP = IX; } /* LD SP,IX */ +OP(dd,fa) { illegal_1(); op_fa(); } /* DB DD */ +OP(dd,fb) { illegal_1(); op_fb(); } /* DB DD */ +OP(dd,fc) { illegal_1(); op_fc(); } /* DB DD */ +OP(dd,fd) { illegal_1(); op_fd(); } /* DB DD */ +OP(dd,fe) { illegal_1(); op_fe(); } /* DB DD */ +OP(dd,ff) { illegal_1(); op_ff(); } /* DB DD */ + +/********************************************************** + * IY register related opcodes (FD prefix) + **********************************************************/ +OP(fd,00) { illegal_1(); op_00(); } /* DB FD */ +OP(fd,01) { illegal_1(); op_01(); } /* DB FD */ +OP(fd,02) { illegal_1(); op_02(); } /* DB FD */ +OP(fd,03) { illegal_1(); op_03(); } /* DB FD */ +OP(fd,04) { illegal_1(); op_04(); } /* DB FD */ +OP(fd,05) { illegal_1(); op_05(); } /* DB FD */ +OP(fd,06) { illegal_1(); op_06(); } /* DB FD */ +OP(fd,07) { illegal_1(); op_07(); } /* DB FD */ + +OP(fd,08) { illegal_1(); op_08(); } /* DB FD */ +OP(fd,09) { R++; ADD16(iy,bc); } /* ADD IY,BC */ +OP(fd,0a) { illegal_1(); op_0a(); } /* DB FD */ +OP(fd,0b) { illegal_1(); op_0b(); } /* DB FD */ +OP(fd,0c) { illegal_1(); op_0c(); } /* DB FD */ +OP(fd,0d) { illegal_1(); op_0d(); } /* DB FD */ +OP(fd,0e) { illegal_1(); op_0e(); } /* DB FD */ +OP(fd,0f) { illegal_1(); op_0f(); } /* DB FD */ + +OP(fd,10) { illegal_1(); op_10(); } /* DB FD */ +OP(fd,11) { illegal_1(); op_11(); } /* DB FD */ +OP(fd,12) { illegal_1(); op_12(); } /* DB FD */ +OP(fd,13) { illegal_1(); op_13(); } /* DB FD */ +OP(fd,14) { illegal_1(); op_14(); } /* DB FD */ +OP(fd,15) { illegal_1(); op_15(); } /* DB FD */ +OP(fd,16) { illegal_1(); op_16(); } /* DB FD */ +OP(fd,17) { illegal_1(); op_17(); } /* DB FD */ + +OP(fd,18) { illegal_1(); op_18(); } /* DB FD */ +OP(fd,19) { R++; ADD16(iy,de); } /* ADD IY,DE */ +OP(fd,1a) { illegal_1(); op_1a(); } /* DB FD */ +OP(fd,1b) { illegal_1(); op_1b(); } /* DB FD */ +OP(fd,1c) { illegal_1(); op_1c(); } /* DB FD */ +OP(fd,1d) { illegal_1(); op_1d(); } /* DB FD */ +OP(fd,1e) { illegal_1(); op_1e(); } /* DB FD */ +OP(fd,1f) { illegal_1(); op_1f(); } /* DB FD */ + +OP(fd,20) { illegal_1(); op_20(); } /* DB FD */ +OP(fd,21) { R++; IY = ARG16(); } /* LD IY,w */ +OP(fd,22) { R++; EA = ARG16(); WM16( EA, &Z80.iy ); } /* LD (w),IY */ +OP(fd,23) { R++; IY++; } /* INC IY */ +OP(fd,24) { R++; HY = INC(HY); } /* INC HY */ +OP(fd,25) { R++; HY = DEC(HY); } /* DEC HY */ +OP(fd,26) { R++; HY = ARG(); } /* LD HY,n */ +OP(fd,27) { illegal_1(); op_27(); } /* DB FD */ + +OP(fd,28) { illegal_1(); op_28(); } /* DB FD */ +OP(fd,29) { R++; ADD16(iy,iy); } /* ADD IY,IY */ +OP(fd,2a) { R++; EA = ARG16(); RM16( EA, &Z80.iy ); } /* LD IY,(w) */ +OP(fd,2b) { R++; IY--; } /* DEC IY */ +OP(fd,2c) { R++; LY = INC(LY); } /* INC LY */ +OP(fd,2d) { R++; LY = DEC(LY); } /* DEC LY */ +OP(fd,2e) { R++; LY = ARG(); } /* LD LY,n */ +OP(fd,2f) { illegal_1(); op_2f(); } /* DB FD */ + +OP(fd,30) { illegal_1(); op_30(); } /* DB FD */ +OP(fd,31) { illegal_1(); op_31(); } /* DB FD */ +OP(fd,32) { illegal_1(); op_32(); } /* DB FD */ +OP(fd,33) { illegal_1(); op_33(); } /* DB FD */ +OP(fd,34) { R++; EAY; WM( EA, INC(RM(EA)) ); } /* INC (IY+o) */ +OP(fd,35) { R++; EAY; WM( EA, DEC(RM(EA)) ); } /* DEC (IY+o) */ +OP(fd,36) { R++; EAY; WM( EA, ARG() ); } /* LD (IY+o),n */ +OP(fd,37) { illegal_1(); op_37(); } /* DB FD */ + +OP(fd,38) { illegal_1(); op_38(); } /* DB FD */ +OP(fd,39) { R++; ADD16(iy,sp); } /* ADD IY,SP */ +OP(fd,3a) { illegal_1(); op_3a(); } /* DB FD */ +OP(fd,3b) { illegal_1(); op_3b(); } /* DB FD */ +OP(fd,3c) { illegal_1(); op_3c(); } /* DB FD */ +OP(fd,3d) { illegal_1(); op_3d(); } /* DB FD */ +OP(fd,3e) { illegal_1(); op_3e(); } /* DB FD */ +OP(fd,3f) { illegal_1(); op_3f(); } /* DB FD */ + +OP(fd,40) { illegal_1(); op_40(); } /* DB FD */ +OP(fd,41) { illegal_1(); op_41(); } /* DB FD */ +OP(fd,42) { illegal_1(); op_42(); } /* DB FD */ +OP(fd,43) { illegal_1(); op_43(); } /* DB FD */ +OP(fd,44) { R++; B = HY; } /* LD B,HY */ +OP(fd,45) { R++; B = LY; } /* LD B,LY */ +OP(fd,46) { R++; EAY; B = RM(EA); } /* LD B,(IY+o) */ +OP(fd,47) { illegal_1(); op_47(); } /* DB FD */ + +OP(fd,48) { illegal_1(); op_48(); } /* DB FD */ +OP(fd,49) { illegal_1(); op_49(); } /* DB FD */ +OP(fd,4a) { illegal_1(); op_4a(); } /* DB FD */ +OP(fd,4b) { illegal_1(); op_4b(); } /* DB FD */ +OP(fd,4c) { R++; C = HY; } /* LD C,HY */ +OP(fd,4d) { R++; C = LY; } /* LD C,LY */ +OP(fd,4e) { R++; EAY; C = RM(EA); } /* LD C,(IY+o) */ +OP(fd,4f) { illegal_1(); op_4f(); } /* DB FD */ + +OP(fd,50) { illegal_1(); op_50(); } /* DB FD */ +OP(fd,51) { illegal_1(); op_51(); } /* DB FD */ +OP(fd,52) { illegal_1(); op_52(); } /* DB FD */ +OP(fd,53) { illegal_1(); op_53(); } /* DB FD */ +OP(fd,54) { R++; D = HY; } /* LD D,HY */ +OP(fd,55) { R++; D = LY; } /* LD D,LY */ +OP(fd,56) { R++; EAY; D = RM(EA); } /* LD D,(IY+o) */ +OP(fd,57) { illegal_1(); op_57(); } /* DB FD */ + +OP(fd,58) { illegal_1(); op_58(); } /* DB FD */ +OP(fd,59) { illegal_1(); op_59(); } /* DB FD */ +OP(fd,5a) { illegal_1(); op_5a(); } /* DB FD */ +OP(fd,5b) { illegal_1(); op_5b(); } /* DB FD */ +OP(fd,5c) { R++; E = HY; } /* LD E,HY */ +OP(fd,5d) { R++; E = LY; } /* LD E,LY */ +OP(fd,5e) { R++; EAY; E = RM(EA); } /* LD E,(IY+o) */ +OP(fd,5f) { illegal_1(); op_5f(); } /* DB FD */ + +OP(fd,60) { R++; HY = B; } /* LD HY,B */ +OP(fd,61) { R++; HY = C; } /* LD HY,C */ +OP(fd,62) { R++; HY = D; } /* LD HY,D */ +OP(fd,63) { R++; HY = E; } /* LD HY,E */ +OP(fd,64) { R++; } /* LD HY,HY */ +OP(fd,65) { R++; HY = LY; } /* LD HY,LY */ +OP(fd,66) { R++; EAY; H = RM(EA); } /* LD H,(IY+o) */ +OP(fd,67) { R++; HY = A; } /* LD HY,A */ + +OP(fd,68) { R++; LY = B; } /* LD LY,B */ +OP(fd,69) { R++; LY = C; } /* LD LY,C */ +OP(fd,6a) { R++; LY = D; } /* LD LY,D */ +OP(fd,6b) { R++; LY = E; } /* LD LY,E */ +OP(fd,6c) { R++; LY = HY; } /* LD LY,HY */ +OP(fd,6d) { R++; } /* LD LY,LY */ +OP(fd,6e) { R++; EAY; L = RM(EA); } /* LD L,(IY+o) */ +OP(fd,6f) { R++; LY = A; } /* LD LY,A */ + +OP(fd,70) { R++; EAY; WM( EA, B ); } /* LD (IY+o),B */ +OP(fd,71) { R++; EAY; WM( EA, C ); } /* LD (IY+o),C */ +OP(fd,72) { R++; EAY; WM( EA, D ); } /* LD (IY+o),D */ +OP(fd,73) { R++; EAY; WM( EA, E ); } /* LD (IY+o),E */ +OP(fd,74) { R++; EAY; WM( EA, H ); } /* LD (IY+o),H */ +OP(fd,75) { R++; EAY; WM( EA, L ); } /* LD (IY+o),L */ +OP(fd,76) { illegal_1(); op_76(); } /* DB FD */ +OP(fd,77) { R++; EAY; WM( EA, A ); } /* LD (IY+o),A */ + +OP(fd,78) { illegal_1(); op_78(); } /* DB FD */ +OP(fd,79) { illegal_1(); op_79(); } /* DB FD */ +OP(fd,7a) { illegal_1(); op_7a(); } /* DB FD */ +OP(fd,7b) { illegal_1(); op_7b(); } /* DB FD */ +OP(fd,7c) { R++; A = HY; } /* LD A,HY */ +OP(fd,7d) { R++; A = LY; } /* LD A,LY */ +OP(fd,7e) { R++; EAY; A = RM(EA); } /* LD A,(IY+o) */ +OP(fd,7f) { illegal_1(); op_7f(); } /* DB FD */ + +OP(fd,80) { illegal_1(); op_80(); } /* DB FD */ +OP(fd,81) { illegal_1(); op_81(); } /* DB FD */ +OP(fd,82) { illegal_1(); op_82(); } /* DB FD */ +OP(fd,83) { illegal_1(); op_83(); } /* DB FD */ +OP(fd,84) { R++; ADD(HY); } /* ADD A,HY */ +OP(fd,85) { R++; ADD(LY); } /* ADD A,LY */ +OP(fd,86) { R++; EAY; ADD(RM(EA)); } /* ADD A,(IY+o) */ +OP(fd,87) { illegal_1(); op_87(); } /* DB FD */ + +OP(fd,88) { illegal_1(); op_88(); } /* DB FD */ +OP(fd,89) { illegal_1(); op_89(); } /* DB FD */ +OP(fd,8a) { illegal_1(); op_8a(); } /* DB FD */ +OP(fd,8b) { illegal_1(); op_8b(); } /* DB FD */ +OP(fd,8c) { R++; ADC(HY); } /* ADC A,HY */ +OP(fd,8d) { R++; ADC(LY); } /* ADC A,LY */ +OP(fd,8e) { R++; EAY; ADC(RM(EA)); } /* ADC A,(IY+o) */ +OP(fd,8f) { illegal_1(); op_8f(); } /* DB FD */ + +OP(fd,90) { illegal_1(); op_90(); } /* DB FD */ +OP(fd,91) { illegal_1(); op_91(); } /* DB FD */ +OP(fd,92) { illegal_1(); op_92(); } /* DB FD */ +OP(fd,93) { illegal_1(); op_93(); } /* DB FD */ +OP(fd,94) { R++; SUB(HY); } /* SUB HY */ +OP(fd,95) { R++; SUB(LY); } /* SUB LY */ +OP(fd,96) { R++; EAY; SUB(RM(EA)); } /* SUB (IY+o) */ +OP(fd,97) { illegal_1(); op_97(); } /* DB FD */ + +OP(fd,98) { illegal_1(); op_98(); } /* DB FD */ +OP(fd,99) { illegal_1(); op_99(); } /* DB FD */ +OP(fd,9a) { illegal_1(); op_9a(); } /* DB FD */ +OP(fd,9b) { illegal_1(); op_9b(); } /* DB FD */ +OP(fd,9c) { R++; SBC(HY); } /* SBC A,HY */ +OP(fd,9d) { R++; SBC(LY); } /* SBC A,LY */ +OP(fd,9e) { R++; EAY; SBC(RM(EA)); } /* SBC A,(IY+o) */ +OP(fd,9f) { illegal_1(); op_9f(); } /* DB FD */ + +OP(fd,a0) { illegal_1(); op_a0(); } /* DB FD */ +OP(fd,a1) { illegal_1(); op_a1(); } /* DB FD */ +OP(fd,a2) { illegal_1(); op_a2(); } /* DB FD */ +OP(fd,a3) { illegal_1(); op_a3(); } /* DB FD */ +OP(fd,a4) { R++; AND(HY); } /* AND HY */ +OP(fd,a5) { R++; AND(LY); } /* AND LY */ +OP(fd,a6) { R++; EAY; AND(RM(EA)); } /* AND (IY+o) */ +OP(fd,a7) { illegal_1(); op_a7(); } /* DB FD */ + +OP(fd,a8) { illegal_1(); op_a8(); } /* DB FD */ +OP(fd,a9) { illegal_1(); op_a9(); } /* DB FD */ +OP(fd,aa) { illegal_1(); op_aa(); } /* DB FD */ +OP(fd,ab) { illegal_1(); op_ab(); } /* DB FD */ +OP(fd,ac) { R++; XOR(HY); } /* XOR HY */ +OP(fd,ad) { R++; XOR(LY); } /* XOR LY */ +OP(fd,ae) { R++; EAY; XOR(RM(EA)); } /* XOR (IY+o) */ +OP(fd,af) { illegal_1(); op_af(); } /* DB FD */ + +OP(fd,b0) { illegal_1(); op_b0(); } /* DB FD */ +OP(fd,b1) { illegal_1(); op_b1(); } /* DB FD */ +OP(fd,b2) { illegal_1(); op_b2(); } /* DB FD */ +OP(fd,b3) { illegal_1(); op_b3(); } /* DB FD */ +OP(fd,b4) { R++; OR(HY); } /* OR HY */ +OP(fd,b5) { R++; OR(LY); } /* OR LY */ +OP(fd,b6) { R++; EAY; OR(RM(EA)); } /* OR (IY+o) */ +OP(fd,b7) { illegal_1(); op_b7(); } /* DB FD */ + +OP(fd,b8) { illegal_1(); op_b8(); } /* DB FD */ +OP(fd,b9) { illegal_1(); op_b9(); } /* DB FD */ +OP(fd,ba) { illegal_1(); op_ba(); } /* DB FD */ +OP(fd,bb) { illegal_1(); op_bb(); } /* DB FD */ +OP(fd,bc) { R++; CP(HY); } /* CP HY */ +OP(fd,bd) { R++; CP(LY); } /* CP LY */ +OP(fd,be) { R++; EAY; CP(RM(EA)); } /* CP (IY+o) */ +OP(fd,bf) { illegal_1(); op_bf(); } /* DB FD */ + +OP(fd,c0) { illegal_1(); op_c0(); } /* DB FD */ +OP(fd,c1) { illegal_1(); op_c1(); } /* DB FD */ +OP(fd,c2) { illegal_1(); op_c2(); } /* DB FD */ +OP(fd,c3) { illegal_1(); op_c3(); } /* DB FD */ +OP(fd,c4) { illegal_1(); op_c4(); } /* DB FD */ +OP(fd,c5) { illegal_1(); op_c5(); } /* DB FD */ +OP(fd,c6) { illegal_1(); op_c6(); } /* DB FD */ +OP(fd,c7) { illegal_1(); op_c7(); } /* DB FD */ + +OP(fd,c8) { illegal_1(); op_c8(); } /* DB FD */ +OP(fd,c9) { illegal_1(); op_c9(); } /* DB FD */ +OP(fd,ca) { illegal_1(); op_ca(); } /* DB FD */ +OP(fd,cb) { R++; EAY; EXEC(xycb,ARG()); } /* ** FD CB xx */ +OP(fd,cc) { illegal_1(); op_cc(); } /* DB FD */ +OP(fd,cd) { illegal_1(); op_cd(); } /* DB FD */ +OP(fd,ce) { illegal_1(); op_ce(); } /* DB FD */ +OP(fd,cf) { illegal_1(); op_cf(); } /* DB FD */ + +OP(fd,d0) { illegal_1(); op_d0(); } /* DB FD */ +OP(fd,d1) { illegal_1(); op_d1(); } /* DB FD */ +OP(fd,d2) { illegal_1(); op_d2(); } /* DB FD */ +OP(fd,d3) { illegal_1(); op_d3(); } /* DB FD */ +OP(fd,d4) { illegal_1(); op_d4(); } /* DB FD */ +OP(fd,d5) { illegal_1(); op_d5(); } /* DB FD */ +OP(fd,d6) { illegal_1(); op_d6(); } /* DB FD */ +OP(fd,d7) { illegal_1(); op_d7(); } /* DB FD */ + +OP(fd,d8) { illegal_1(); op_d8(); } /* DB FD */ +OP(fd,d9) { illegal_1(); op_d9(); } /* DB FD */ +OP(fd,da) { illegal_1(); op_da(); } /* DB FD */ +OP(fd,db) { illegal_1(); op_db(); } /* DB FD */ +OP(fd,dc) { illegal_1(); op_dc(); } /* DB FD */ +OP(fd,dd) { illegal_1(); op_dd(); } /* DB FD */ +OP(fd,de) { illegal_1(); op_de(); } /* DB FD */ +OP(fd,df) { illegal_1(); op_df(); } /* DB FD */ + +OP(fd,e0) { illegal_1(); op_e0(); } /* DB FD */ +OP(fd,e1) { R++; POP( iy ); } /* POP IY */ +OP(fd,e2) { illegal_1(); op_e2(); } /* DB FD */ +OP(fd,e3) { R++; EXSP( iy ); } /* EX (SP),IY */ +OP(fd,e4) { illegal_1(); op_e4(); } /* DB FD */ +OP(fd,e5) { R++; PUSH( iy ); } /* PUSH IY */ +OP(fd,e6) { illegal_1(); op_e6(); } /* DB FD */ +OP(fd,e7) { illegal_1(); op_e7(); } /* DB FD */ + +OP(fd,e8) { illegal_1(); op_e8(); } /* DB FD */ +OP(fd,e9) { R++; PC = IY; change_pc(PCD); } /* JP (IY) */ +OP(fd,ea) { illegal_1(); op_ea(); } /* DB FD */ +OP(fd,eb) { illegal_1(); op_eb(); } /* DB FD */ +OP(fd,ec) { illegal_1(); op_ec(); } /* DB FD */ +OP(fd,ed) { illegal_1(); op_ed(); } /* DB FD */ +OP(fd,ee) { illegal_1(); op_ee(); } /* DB FD */ +OP(fd,ef) { illegal_1(); op_ef(); } /* DB FD */ + +OP(fd,f0) { illegal_1(); op_f0(); } /* DB FD */ +OP(fd,f1) { illegal_1(); op_f1(); } /* DB FD */ +OP(fd,f2) { illegal_1(); op_f2(); } /* DB FD */ +OP(fd,f3) { illegal_1(); op_f3(); } /* DB FD */ +OP(fd,f4) { illegal_1(); op_f4(); } /* DB FD */ +OP(fd,f5) { illegal_1(); op_f5(); } /* DB FD */ +OP(fd,f6) { illegal_1(); op_f6(); } /* DB FD */ +OP(fd,f7) { illegal_1(); op_f7(); } /* DB FD */ + +OP(fd,f8) { illegal_1(); op_f8(); } /* DB FD */ +OP(fd,f9) { R++; SP = IY; } /* LD SP,IY */ +OP(fd,fa) { illegal_1(); op_fa(); } /* DB FD */ +OP(fd,fb) { illegal_1(); op_fb(); } /* DB FD */ +OP(fd,fc) { illegal_1(); op_fc(); } /* DB FD */ +OP(fd,fd) { illegal_1(); op_fd(); } /* DB FD */ +OP(fd,fe) { illegal_1(); op_fe(); } /* DB FD */ +OP(fd,ff) { illegal_1(); op_ff(); } /* DB FD */ + +OP(illegal,2) +{ +#if VERBOSE +logerror("Z80 #%d ill. opcode $ed $%02x\n", + cpu_getactivecpu(), cpu_readop((PCD-1)&0xffff)); +#endif +} + +/********************************************************** + * special opcodes (ED prefix) + **********************************************************/ +OP(ed,00) { illegal_2(); } /* DB ED */ +OP(ed,01) { illegal_2(); } /* DB ED */ +OP(ed,02) { illegal_2(); } /* DB ED */ +OP(ed,03) { illegal_2(); } /* DB ED */ +OP(ed,04) { illegal_2(); } /* DB ED */ +OP(ed,05) { illegal_2(); } /* DB ED */ +OP(ed,06) { illegal_2(); } /* DB ED */ +OP(ed,07) { illegal_2(); } /* DB ED */ + +OP(ed,08) { illegal_2(); } /* DB ED */ +OP(ed,09) { illegal_2(); } /* DB ED */ +OP(ed,0a) { illegal_2(); } /* DB ED */ +OP(ed,0b) { illegal_2(); } /* DB ED */ +OP(ed,0c) { illegal_2(); } /* DB ED */ +OP(ed,0d) { illegal_2(); } /* DB ED */ +OP(ed,0e) { illegal_2(); } /* DB ED */ +OP(ed,0f) { illegal_2(); } /* DB ED */ + +OP(ed,10) { illegal_2(); } /* DB ED */ +OP(ed,11) { illegal_2(); } /* DB ED */ +OP(ed,12) { illegal_2(); } /* DB ED */ +OP(ed,13) { illegal_2(); } /* DB ED */ +OP(ed,14) { illegal_2(); } /* DB ED */ +OP(ed,15) { illegal_2(); } /* DB ED */ +OP(ed,16) { illegal_2(); } /* DB ED */ +OP(ed,17) { illegal_2(); } /* DB ED */ + +OP(ed,18) { illegal_2(); } /* DB ED */ +OP(ed,19) { illegal_2(); } /* DB ED */ +OP(ed,1a) { illegal_2(); } /* DB ED */ +OP(ed,1b) { illegal_2(); } /* DB ED */ +OP(ed,1c) { illegal_2(); } /* DB ED */ +OP(ed,1d) { illegal_2(); } /* DB ED */ +OP(ed,1e) { illegal_2(); } /* DB ED */ +OP(ed,1f) { illegal_2(); } /* DB ED */ + +OP(ed,20) { illegal_2(); } /* DB ED */ +OP(ed,21) { illegal_2(); } /* DB ED */ +OP(ed,22) { illegal_2(); } /* DB ED */ +OP(ed,23) { illegal_2(); } /* DB ED */ +OP(ed,24) { illegal_2(); } /* DB ED */ +OP(ed,25) { illegal_2(); } /* DB ED */ +OP(ed,26) { illegal_2(); } /* DB ED */ +OP(ed,27) { illegal_2(); } /* DB ED */ + +OP(ed,28) { illegal_2(); } /* DB ED */ +OP(ed,29) { illegal_2(); } /* DB ED */ +OP(ed,2a) { illegal_2(); } /* DB ED */ +OP(ed,2b) { illegal_2(); } /* DB ED */ +OP(ed,2c) { illegal_2(); } /* DB ED */ +OP(ed,2d) { illegal_2(); } /* DB ED */ +OP(ed,2e) { illegal_2(); } /* DB ED */ +OP(ed,2f) { illegal_2(); } /* DB ED */ + +OP(ed,30) { illegal_2(); } /* DB ED */ +OP(ed,31) { illegal_2(); } /* DB ED */ +OP(ed,32) { illegal_2(); } /* DB ED */ +OP(ed,33) { illegal_2(); } /* DB ED */ +OP(ed,34) { illegal_2(); } /* DB ED */ +OP(ed,35) { illegal_2(); } /* DB ED */ +OP(ed,36) { illegal_2(); } /* DB ED */ +OP(ed,37) { illegal_2(); } /* DB ED */ + +OP(ed,38) { illegal_2(); } /* DB ED */ +OP(ed,39) { illegal_2(); } /* DB ED */ +OP(ed,3a) { illegal_2(); } /* DB ED */ +OP(ed,3b) { illegal_2(); } /* DB ED */ +OP(ed,3c) { illegal_2(); } /* DB ED */ +OP(ed,3d) { illegal_2(); } /* DB ED */ +OP(ed,3e) { illegal_2(); } /* DB ED */ +OP(ed,3f) { illegal_2(); } /* DB ED */ + +OP(ed,40) { B = IN(BC); F = (F & CF) | SZP[B]; } /* IN B,(C) */ +OP(ed,41) { OUT(BC, B); } /* OUT (C),B */ +OP(ed,42) { SBC16( bc ); } /* SBC HL,BC */ +OP(ed,43) { EA = ARG16(); WM16( EA, &Z80.bc ); } /* LD (w),BC */ +OP(ed,44) { NEG; } /* NEG */ +OP(ed,45) { RETN; } /* RETN; */ +OP(ed,46) { IM = 0; } /* IM 0 */ +OP(ed,47) { LD_I_A; } /* LD I,A */ + +OP(ed,48) { C = IN(BC); F = (F & CF) | SZP[C]; } /* IN C,(C) */ +OP(ed,49) { OUT(BC, C); } /* OUT (C),C */ +OP(ed,4a) { ADC16( bc ); } /* ADC HL,BC */ +OP(ed,4b) { EA = ARG16(); RM16( EA, &Z80.bc ); } /* LD BC,(w) */ +OP(ed,4c) { NEG; } /* NEG */ +OP(ed,4d) { RETI; } /* RETI */ +OP(ed,4e) { IM = 0; } /* IM 0 */ +OP(ed,4f) { LD_R_A; } /* LD R,A */ + +OP(ed,50) { D = IN(BC); F = (F & CF) | SZP[D]; } /* IN D,(C) */ +OP(ed,51) { OUT(BC, D); } /* OUT (C),D */ +OP(ed,52) { SBC16( de ); } /* SBC HL,DE */ +OP(ed,53) { EA = ARG16(); WM16( EA, &Z80.de ); } /* LD (w),DE */ +OP(ed,54) { NEG; } /* NEG */ +OP(ed,55) { RETN; } /* RETN; */ +OP(ed,56) { IM = 1; } /* IM 1 */ +OP(ed,57) { LD_A_I; } /* LD A,I */ + +OP(ed,58) { E = IN(BC); F = (F & CF) | SZP[E]; } /* IN E,(C) */ +OP(ed,59) { OUT(BC, E); } /* OUT (C),E */ +OP(ed,5a) { ADC16( de ); } /* ADC HL,DE */ +OP(ed,5b) { EA = ARG16(); RM16( EA, &Z80.de ); } /* LD DE,(w) */ +OP(ed,5c) { NEG; } /* NEG */ +OP(ed,5d) { RETI; } /* RETI */ +OP(ed,5e) { IM = 2; } /* IM 2 */ +OP(ed,5f) { LD_A_R; } /* LD A,R */ + +OP(ed,60) { H = IN(BC); F = (F & CF) | SZP[H]; } /* IN H,(C) */ +OP(ed,61) { OUT(BC, H); } /* OUT (C),H */ +OP(ed,62) { SBC16( hl ); } /* SBC HL,HL */ +OP(ed,63) { EA = ARG16(); WM16( EA, &Z80.hl ); } /* LD (w),HL */ +OP(ed,64) { NEG; } /* NEG */ +OP(ed,65) { RETN; } /* RETN; */ +OP(ed,66) { IM = 0; } /* IM 0 */ +OP(ed,67) { RRD; } /* RRD (HL) */ + +OP(ed,68) { L = IN(BC); F = (F & CF) | SZP[L]; } /* IN L,(C) */ +OP(ed,69) { OUT(BC, L); } /* OUT (C),L */ +OP(ed,6a) { ADC16( hl ); } /* ADC HL,HL */ +OP(ed,6b) { EA = ARG16(); RM16( EA, &Z80.hl ); } /* LD HL,(w) */ +OP(ed,6c) { NEG; } /* NEG */ +OP(ed,6d) { RETI; } /* RETI */ +OP(ed,6e) { IM = 0; } /* IM 0 */ +OP(ed,6f) { RLD; } /* RLD (HL) */ + +OP(ed,70) { UINT8 res = IN(BC); F = (F & CF) | SZP[res]; } /* IN 0,(C) */ +OP(ed,71) { OUT(BC, 0); } /* OUT (C),0 */ +OP(ed,72) { SBC16( sp ); } /* SBC HL,SP */ +OP(ed,73) { EA = ARG16(); WM16( EA, &Z80.sp ); } /* LD (w),SP */ +OP(ed,74) { NEG; } /* NEG */ +OP(ed,75) { RETN; } /* RETN; */ +OP(ed,76) { IM = 1; } /* IM 1 */ +OP(ed,77) { illegal_2(); } /* DB ED,77 */ + +OP(ed,78) { A = IN(BC); F = (F & CF) | SZP[A]; } /* IN E,(C) */ +OP(ed,79) { OUT(BC, A); } /* OUT (C),A */ +OP(ed,7a) { ADC16( sp ); } /* ADC HL,SP */ +OP(ed,7b) { EA = ARG16(); RM16( EA, &Z80.sp ); } /* LD SP,(w) */ +OP(ed,7c) { NEG; } /* NEG */ +OP(ed,7d) { RETI; } /* RETI */ +OP(ed,7e) { IM = 2; } /* IM 2 */ +OP(ed,7f) { illegal_2(); } /* DB ED,7F */ + +OP(ed,80) { illegal_2(); } /* DB ED */ +OP(ed,81) { illegal_2(); } /* DB ED */ +OP(ed,82) { illegal_2(); } /* DB ED */ +OP(ed,83) { illegal_2(); } /* DB ED */ +OP(ed,84) { illegal_2(); } /* DB ED */ +OP(ed,85) { illegal_2(); } /* DB ED */ +OP(ed,86) { illegal_2(); } /* DB ED */ +OP(ed,87) { illegal_2(); } /* DB ED */ + +OP(ed,88) { illegal_2(); } /* DB ED */ +OP(ed,89) { illegal_2(); } /* DB ED */ +OP(ed,8a) { illegal_2(); } /* DB ED */ +OP(ed,8b) { illegal_2(); } /* DB ED */ +OP(ed,8c) { illegal_2(); } /* DB ED */ +OP(ed,8d) { illegal_2(); } /* DB ED */ +OP(ed,8e) { illegal_2(); } /* DB ED */ +OP(ed,8f) { illegal_2(); } /* DB ED */ + +OP(ed,90) { illegal_2(); } /* DB ED */ +OP(ed,91) { illegal_2(); } /* DB ED */ +OP(ed,92) { illegal_2(); } /* DB ED */ +OP(ed,93) { illegal_2(); } /* DB ED */ +OP(ed,94) { illegal_2(); } /* DB ED */ +OP(ed,95) { illegal_2(); } /* DB ED */ +OP(ed,96) { illegal_2(); } /* DB ED */ +OP(ed,97) { illegal_2(); } /* DB ED */ + +OP(ed,98) { illegal_2(); } /* DB ED */ +OP(ed,99) { illegal_2(); } /* DB ED */ +OP(ed,9a) { illegal_2(); } /* DB ED */ +OP(ed,9b) { illegal_2(); } /* DB ED */ +OP(ed,9c) { illegal_2(); } /* DB ED */ +OP(ed,9d) { illegal_2(); } /* DB ED */ +OP(ed,9e) { illegal_2(); } /* DB ED */ +OP(ed,9f) { illegal_2(); } /* DB ED */ + +OP(ed,a0) { LDI; } /* LDI */ +OP(ed,a1) { CPI; } /* CPI */ +OP(ed,a2) { INI; } /* INI */ +OP(ed,a3) { OUTI; } /* OUTI */ +OP(ed,a4) { illegal_2(); } /* DB ED */ +OP(ed,a5) { illegal_2(); } /* DB ED */ +OP(ed,a6) { illegal_2(); } /* DB ED */ +OP(ed,a7) { illegal_2(); } /* DB ED */ + +OP(ed,a8) { LDD; } /* LDD */ +OP(ed,a9) { CPD; } /* CPD */ +OP(ed,aa) { IND; } /* IND */ +OP(ed,ab) { OUTD; } /* OUTD */ +OP(ed,ac) { illegal_2(); } /* DB ED */ +OP(ed,ad) { illegal_2(); } /* DB ED */ +OP(ed,ae) { illegal_2(); } /* DB ED */ +OP(ed,af) { illegal_2(); } /* DB ED */ + +OP(ed,b0) { LDIR; } /* LDIR */ +OP(ed,b1) { CPIR; } /* CPIR */ +OP(ed,b2) { INIR; } /* INIR */ +OP(ed,b3) { OTIR; } /* OTIR */ +OP(ed,b4) { illegal_2(); } /* DB ED */ +OP(ed,b5) { illegal_2(); } /* DB ED */ +OP(ed,b6) { illegal_2(); } /* DB ED */ +OP(ed,b7) { illegal_2(); } /* DB ED */ + +OP(ed,b8) { LDDR; } /* LDDR */ +OP(ed,b9) { CPDR; } /* CPDR */ +OP(ed,ba) { INDR; } /* INDR */ +OP(ed,bb) { OTDR; } /* OTDR */ +OP(ed,bc) { illegal_2(); } /* DB ED */ +OP(ed,bd) { illegal_2(); } /* DB ED */ +OP(ed,be) { illegal_2(); } /* DB ED */ +OP(ed,bf) { illegal_2(); } /* DB ED */ + +OP(ed,c0) { illegal_2(); } /* DB ED */ +OP(ed,c1) { illegal_2(); } /* DB ED */ +OP(ed,c2) { illegal_2(); } /* DB ED */ +OP(ed,c3) { illegal_2(); } /* DB ED */ +OP(ed,c4) { illegal_2(); } /* DB ED */ +OP(ed,c5) { illegal_2(); } /* DB ED */ +OP(ed,c6) { illegal_2(); } /* DB ED */ +OP(ed,c7) { illegal_2(); } /* DB ED */ + +OP(ed,c8) { illegal_2(); } /* DB ED */ +OP(ed,c9) { illegal_2(); } /* DB ED */ +OP(ed,ca) { illegal_2(); } /* DB ED */ +OP(ed,cb) { illegal_2(); } /* DB ED */ +OP(ed,cc) { illegal_2(); } /* DB ED */ +OP(ed,cd) { illegal_2(); } /* DB ED */ +OP(ed,ce) { illegal_2(); } /* DB ED */ +OP(ed,cf) { illegal_2(); } /* DB ED */ + +OP(ed,d0) { illegal_2(); } /* DB ED */ +OP(ed,d1) { illegal_2(); } /* DB ED */ +OP(ed,d2) { illegal_2(); } /* DB ED */ +OP(ed,d3) { illegal_2(); } /* DB ED */ +OP(ed,d4) { illegal_2(); } /* DB ED */ +OP(ed,d5) { illegal_2(); } /* DB ED */ +OP(ed,d6) { illegal_2(); } /* DB ED */ +OP(ed,d7) { illegal_2(); } /* DB ED */ + +OP(ed,d8) { illegal_2(); } /* DB ED */ +OP(ed,d9) { illegal_2(); } /* DB ED */ +OP(ed,da) { illegal_2(); } /* DB ED */ +OP(ed,db) { illegal_2(); } /* DB ED */ +OP(ed,dc) { illegal_2(); } /* DB ED */ +OP(ed,dd) { illegal_2(); } /* DB ED */ +OP(ed,de) { illegal_2(); } /* DB ED */ +OP(ed,df) { illegal_2(); } /* DB ED */ + +OP(ed,e0) { illegal_2(); } /* DB ED */ +OP(ed,e1) { illegal_2(); } /* DB ED */ +OP(ed,e2) { illegal_2(); } /* DB ED */ +OP(ed,e3) { illegal_2(); } /* DB ED */ +OP(ed,e4) { illegal_2(); } /* DB ED */ +OP(ed,e5) { illegal_2(); } /* DB ED */ +OP(ed,e6) { illegal_2(); } /* DB ED */ +OP(ed,e7) { illegal_2(); } /* DB ED */ + +OP(ed,e8) { illegal_2(); } /* DB ED */ +OP(ed,e9) { illegal_2(); } /* DB ED */ +OP(ed,ea) { illegal_2(); } /* DB ED */ +OP(ed,eb) { illegal_2(); } /* DB ED */ +OP(ed,ec) { illegal_2(); } /* DB ED */ +OP(ed,ed) { illegal_2(); } /* DB ED */ +OP(ed,ee) { illegal_2(); } /* DB ED */ +OP(ed,ef) { illegal_2(); } /* DB ED */ + +OP(ed,f0) { illegal_2(); } /* DB ED */ +OP(ed,f1) { illegal_2(); } /* DB ED */ +OP(ed,f2) { illegal_2(); } /* DB ED */ +OP(ed,f3) { illegal_2(); } /* DB ED */ +OP(ed,f4) { illegal_2(); } /* DB ED */ +OP(ed,f5) { illegal_2(); } /* DB ED */ +OP(ed,f6) { illegal_2(); } /* DB ED */ +OP(ed,f7) { illegal_2(); } /* DB ED */ + +OP(ed,f8) { illegal_2(); } /* DB ED */ +OP(ed,f9) { illegal_2(); } /* DB ED */ +OP(ed,fa) { illegal_2(); } /* DB ED */ +OP(ed,fb) { illegal_2(); } /* DB ED */ +OP(ed,fc) { illegal_2(); } /* DB ED */ +OP(ed,fd) { illegal_2(); } /* DB ED */ +OP(ed,fe) { illegal_2(); } /* DB ED */ +OP(ed,ff) { illegal_2(); } /* DB ED */ + + +/********************************************************** + * main opcodes + **********************************************************/ +OP(op,00) { } /* NOP */ +OP(op,01) { BC = ARG16(); } /* LD BC,w */ +OP(op,02) { WM( BC, A ); } /* LD (BC),A */ +OP(op,03) { BC++; } /* INC BC */ +OP(op,04) { B = INC(B); } /* INC B */ +OP(op,05) { B = DEC(B); } /* DEC B */ +OP(op,06) { B = ARG(); } /* LD B,n */ +OP(op,07) { RLCA; } /* RLCA */ + +OP(op,08) { EX_AF; } /* EX AF,AF' */ +OP(op,09) { ADD16(hl, bc); } /* ADD HL,BC */ +OP(op,0a) { A = RM( BC ); } /* LD A,(BC) */ +OP(op,0b) { BC--; } /* DEC BC */ +OP(op,0c) { C = INC(C); } /* INC C */ +OP(op,0d) { C = DEC(C); } /* DEC C */ +OP(op,0e) { C = ARG(); } /* LD C,n */ +OP(op,0f) { RRCA; } /* RRCA */ + +OP(op,10) { B--; JR_COND( B, 0x10 ); } /* DJNZ o */ +OP(op,11) { DE = ARG16(); } /* LD DE,w */ +OP(op,12) { WM( DE, A ); } /* LD (DE),A */ +OP(op,13) { DE++; } /* INC DE */ +OP(op,14) { D = INC(D); } /* INC D */ +OP(op,15) { D = DEC(D); } /* DEC D */ +OP(op,16) { D = ARG(); } /* LD D,n */ +OP(op,17) { RLA; } /* RLA */ + +OP(op,18) { JR(); } /* JR o */ +OP(op,19) { ADD16(hl, de); } /* ADD HL,DE */ +OP(op,1a) { A = RM( DE ); } /* LD A,(DE) */ +OP(op,1b) { DE--; } /* DEC DE */ +OP(op,1c) { E = INC(E); } /* INC E */ +OP(op,1d) { E = DEC(E); } /* DEC E */ +OP(op,1e) { E = ARG(); } /* LD E,n */ +OP(op,1f) { RRA; } /* RRA */ + +OP(op,20) { JR_COND( !(F & ZF), 0x20 ); } /* JR NZ,o */ +OP(op,21) { HL = ARG16(); } /* LD HL,w */ +OP(op,22) { EA = ARG16(); WM16( EA, &Z80.hl ); } /* LD (w),HL */ +OP(op,23) { HL++; } /* INC HL */ +OP(op,24) { H = INC(H); } /* INC H */ +OP(op,25) { H = DEC(H); } /* DEC H */ +OP(op,26) { H = ARG(); } /* LD H,n */ +OP(op,27) { DAA; } /* DAA */ + +OP(op,28) { JR_COND( F & ZF, 0x28 ); } /* JR Z,o */ +OP(op,29) { ADD16(hl, hl); } /* ADD HL,HL */ +OP(op,2a) { EA = ARG16(); RM16( EA, &Z80.hl ); } /* LD HL,(w) */ +OP(op,2b) { HL--; } /* DEC HL */ +OP(op,2c) { L = INC(L); } /* INC L */ +OP(op,2d) { L = DEC(L); } /* DEC L */ +OP(op,2e) { L = ARG(); } /* LD L,n */ +OP(op,2f) { A ^= 0xff; F = (F&(SF|ZF|PF|CF))|HF|NF|(A&(YF|XF)); } /* CPL */ + +OP(op,30) { JR_COND( !(F & CF), 0x30 ); } /* JR NC,o */ +OP(op,31) { SP = ARG16(); } /* LD SP,w */ +OP(op,32) { EA = ARG16(); WM( EA, A ); } /* LD (w),A */ +OP(op,33) { SP++; } /* INC SP */ +OP(op,34) { WM( HL, INC(RM(HL)) ); } /* INC (HL) */ +OP(op,35) { WM( HL, DEC(RM(HL)) ); } /* DEC (HL) */ +OP(op,36) { WM( HL, ARG() ); } /* LD (HL),n */ +OP(op,37) { F = (F & (SF|ZF|PF)) | CF | (A & (YF|XF)); } /* SCF */ + +OP(op,38) { JR_COND( F & CF, 0x38 ); } /* JR C,o */ +OP(op,39) { ADD16(hl, sp); } /* ADD HL,SP */ +OP(op,3a) { EA = ARG16(); A = RM( EA ); } /* LD A,(w) */ +OP(op,3b) { SP--; } /* DEC SP */ +OP(op,3c) { A = INC(A); } /* INC A */ +OP(op,3d) { A = DEC(A); } /* DEC A */ +OP(op,3e) { A = ARG(); } /* LD A,n */ +OP(op,3f) { F = ((F&(SF|ZF|PF|CF))|((F&CF)<<4)|(A&(YF|XF)))^CF; } /* CCF */ + +OP(op,40) { } /* LD B,B */ +OP(op,41) { B = C; } /* LD B,C */ +OP(op,42) { B = D; } /* LD B,D */ +OP(op,43) { B = E; } /* LD B,E */ +OP(op,44) { B = H; } /* LD B,H */ +OP(op,45) { B = L; } /* LD B,L */ +OP(op,46) { B = RM(HL); } /* LD B,(HL) */ +OP(op,47) { B = A; } /* LD B,A */ + +OP(op,48) { C = B; } /* LD C,B */ +OP(op,49) { } /* LD C,C */ +OP(op,4a) { C = D; } /* LD C,D */ +OP(op,4b) { C = E; } /* LD C,E */ +OP(op,4c) { C = H; } /* LD C,H */ +OP(op,4d) { C = L; } /* LD C,L */ +OP(op,4e) { C = RM(HL); } /* LD C,(HL) */ +OP(op,4f) { C = A; } /* LD C,A */ + +OP(op,50) { D = B; } /* LD D,B */ +OP(op,51) { D = C; } /* LD D,C */ +OP(op,52) { } /* LD D,D */ +OP(op,53) { D = E; } /* LD D,E */ +OP(op,54) { D = H; } /* LD D,H */ +OP(op,55) { D = L; } /* LD D,L */ +OP(op,56) { D = RM(HL); } /* LD D,(HL) */ +OP(op,57) { D = A; } /* LD D,A */ + +OP(op,58) { E = B; } /* LD E,B */ +OP(op,59) { E = C; } /* LD E,C */ +OP(op,5a) { E = D; } /* LD E,D */ +OP(op,5b) { } /* LD E,E */ +OP(op,5c) { E = H; } /* LD E,H */ +OP(op,5d) { E = L; } /* LD E,L */ +OP(op,5e) { E = RM(HL); } /* LD E,(HL) */ +OP(op,5f) { E = A; } /* LD E,A */ + +OP(op,60) { H = B; } /* LD H,B */ +OP(op,61) { H = C; } /* LD H,C */ +OP(op,62) { H = D; } /* LD H,D */ +OP(op,63) { H = E; } /* LD H,E */ +OP(op,64) { } /* LD H,H */ +OP(op,65) { H = L; } /* LD H,L */ +OP(op,66) { H = RM(HL); } /* LD H,(HL) */ +OP(op,67) { H = A; } /* LD H,A */ + +OP(op,68) { L = B; } /* LD L,B */ +OP(op,69) { L = C; } /* LD L,C */ +OP(op,6a) { L = D; } /* LD L,D */ +OP(op,6b) { L = E; } /* LD L,E */ +OP(op,6c) { L = H; } /* LD L,H */ +OP(op,6d) { } /* LD L,L */ +OP(op,6e) { L = RM(HL); } /* LD L,(HL) */ +OP(op,6f) { L = A; } /* LD L,A */ + +OP(op,70) { WM( HL, B ); } /* LD (HL),B */ +OP(op,71) { WM( HL, C ); } /* LD (HL),C */ +OP(op,72) { WM( HL, D ); } /* LD (HL),D */ +OP(op,73) { WM( HL, E ); } /* LD (HL),E */ +OP(op,74) { WM( HL, H ); } /* LD (HL),H */ +OP(op,75) { WM( HL, L ); } /* LD (HL),L */ +OP(op,76) { ENTER_HALT; } /* HALT */ +OP(op,77) { WM( HL, A ); } /* LD (HL),A */ + +OP(op,78) { A = B; } /* LD A,B */ +OP(op,79) { A = C; } /* LD A,C */ +OP(op,7a) { A = D; } /* LD A,D */ +OP(op,7b) { A = E; } /* LD A,E */ +OP(op,7c) { A = H; } /* LD A,H */ +OP(op,7d) { A = L; } /* LD A,L */ +OP(op,7e) { A = RM(HL); } /* LD A,(HL) */ +OP(op,7f) { } /* LD A,A */ + +OP(op,80) { ADD(B); } /* ADD A,B */ +OP(op,81) { ADD(C); } /* ADD A,C */ +OP(op,82) { ADD(D); } /* ADD A,D */ +OP(op,83) { ADD(E); } /* ADD A,E */ +OP(op,84) { ADD(H); } /* ADD A,H */ +OP(op,85) { ADD(L); } /* ADD A,L */ +OP(op,86) { ADD(RM(HL)); } /* ADD A,(HL) */ +OP(op,87) { ADD(A); } /* ADD A,A */ + +OP(op,88) { ADC(B); } /* ADC A,B */ +OP(op,89) { ADC(C); } /* ADC A,C */ +OP(op,8a) { ADC(D); } /* ADC A,D */ +OP(op,8b) { ADC(E); } /* ADC A,E */ +OP(op,8c) { ADC(H); } /* ADC A,H */ +OP(op,8d) { ADC(L); } /* ADC A,L */ +OP(op,8e) { ADC(RM(HL)); } /* ADC A,(HL) */ +OP(op,8f) { ADC(A); } /* ADC A,A */ + +OP(op,90) { SUB(B); } /* SUB B */ +OP(op,91) { SUB(C); } /* SUB C */ +OP(op,92) { SUB(D); } /* SUB D */ +OP(op,93) { SUB(E); } /* SUB E */ +OP(op,94) { SUB(H); } /* SUB H */ +OP(op,95) { SUB(L); } /* SUB L */ +OP(op,96) { SUB(RM(HL)); } /* SUB (HL) */ +OP(op,97) { SUB(A); } /* SUB A */ + +OP(op,98) { SBC(B); } /* SBC A,B */ +OP(op,99) { SBC(C); } /* SBC A,C */ +OP(op,9a) { SBC(D); } /* SBC A,D */ +OP(op,9b) { SBC(E); } /* SBC A,E */ +OP(op,9c) { SBC(H); } /* SBC A,H */ +OP(op,9d) { SBC(L); } /* SBC A,L */ +OP(op,9e) { SBC(RM(HL)); } /* SBC A,(HL) */ +OP(op,9f) { SBC(A); } /* SBC A,A */ + +OP(op,a0) { AND(B); } /* AND B */ +OP(op,a1) { AND(C); } /* AND C */ +OP(op,a2) { AND(D); } /* AND D */ +OP(op,a3) { AND(E); } /* AND E */ +OP(op,a4) { AND(H); } /* AND H */ +OP(op,a5) { AND(L); } /* AND L */ +OP(op,a6) { AND(RM(HL)); } /* AND (HL) */ +OP(op,a7) { AND(A); } /* AND A */ + +OP(op,a8) { XOR(B); } /* XOR B */ +OP(op,a9) { XOR(C); } /* XOR C */ +OP(op,aa) { XOR(D); } /* XOR D */ +OP(op,ab) { XOR(E); } /* XOR E */ +OP(op,ac) { XOR(H); } /* XOR H */ +OP(op,ad) { XOR(L); } /* XOR L */ +OP(op,ae) { XOR(RM(HL)); } /* XOR (HL) */ +OP(op,af) { XOR(A); } /* XOR A */ + +OP(op,b0) { OR(B); } /* OR B */ +OP(op,b1) { OR(C); } /* OR C */ +OP(op,b2) { OR(D); } /* OR D */ +OP(op,b3) { OR(E); } /* OR E */ +OP(op,b4) { OR(H); } /* OR H */ +OP(op,b5) { OR(L); } /* OR L */ +OP(op,b6) { OR(RM(HL)); } /* OR (HL) */ +OP(op,b7) { OR(A); } /* OR A */ + +OP(op,b8) { CP(B); } /* CP B */ +OP(op,b9) { CP(C); } /* CP C */ +OP(op,ba) { CP(D); } /* CP D */ +OP(op,bb) { CP(E); } /* CP E */ +OP(op,bc) { CP(H); } /* CP H */ +OP(op,bd) { CP(L); } /* CP L */ +OP(op,be) { CP(RM(HL)); } /* CP (HL) */ +OP(op,bf) { CP(A); } /* CP A */ + +OP(op,c0) { RET_COND( !(F & ZF), 0xc0 ); } /* RET NZ */ +OP(op,c1) { POP( bc ); } /* POP BC */ +OP(op,c2) { JP_COND( !(F & ZF) ); } /* JP NZ,a */ +OP(op,c3) { JP; } /* JP a */ +OP(op,c4) { CALL_COND( !(F & ZF), 0xc4 ); } /* CALL NZ,a */ +OP(op,c5) { PUSH( bc ); } /* PUSH BC */ +OP(op,c6) { ADD(ARG()); } /* ADD A,n */ +OP(op,c7) { RST(0x00); } /* RST 0 */ + +OP(op,c8) { RET_COND( F & ZF, 0xc8 ); } /* RET Z */ +OP(op,c9) { POP( pc ); change_pc(PCD); } /* RET */ +OP(op,ca) { JP_COND( F & ZF ); } /* JP Z,a */ +OP(op,cb) { R++; EXEC(cb,ROP()); } /* **** CB xx */ +OP(op,cc) { CALL_COND( F & ZF, 0xcc ); } /* CALL Z,a */ +OP(op,cd) { CALL(); } /* CALL a */ +OP(op,ce) { ADC(ARG()); } /* ADC A,n */ +OP(op,cf) { RST(0x08); } /* RST 1 */ + +OP(op,d0) { RET_COND( !(F & CF), 0xd0 ); } /* RET NC */ +OP(op,d1) { POP( de ); } /* POP DE */ +OP(op,d2) { JP_COND( !(F & CF) ); } /* JP NC,a */ +OP(op,d3) { unsigned n = ARG() | (A << 8); OUT( n, A ); } /* OUT (n),A */ +OP(op,d4) { CALL_COND( !(F & CF), 0xd4 ); } /* CALL NC,a */ +OP(op,d5) { PUSH( de ); } /* PUSH DE */ +OP(op,d6) { SUB(ARG()); } /* SUB n */ +OP(op,d7) { RST(0x10); } /* RST 2 */ + +OP(op,d8) { RET_COND( F & CF, 0xd8 ); } /* RET C */ +OP(op,d9) { EXX; } /* EXX */ +OP(op,da) { JP_COND( F & CF ); } /* JP C,a */ +OP(op,db) { unsigned n = ARG() | (A << 8); A = IN( n ); } /* IN A,(n) */ +OP(op,dc) { CALL_COND( F & CF, 0xdc ); } /* CALL C,a */ +OP(op,dd) { R++; EXEC(dd,ROP()); } /* **** DD xx */ +OP(op,de) { SBC(ARG()); } /* SBC A,n */ +OP(op,df) { RST(0x18); } /* RST 3 */ + +OP(op,e0) { RET_COND( !(F & PF), 0xe0 ); } /* RET PO */ +OP(op,e1) { POP( hl ); } /* POP HL */ +OP(op,e2) { JP_COND( !(F & PF) ); } /* JP PO,a */ +OP(op,e3) { EXSP( hl ); } /* EX HL,(SP) */ +OP(op,e4) { CALL_COND( !(F & PF), 0xe4 ); } /* CALL PO,a */ +OP(op,e5) { PUSH( hl ); } /* PUSH HL */ +OP(op,e6) { AND(ARG()); } /* AND n */ +OP(op,e7) { RST(0x20); } /* RST 4 */ + +OP(op,e8) { RET_COND( F & PF, 0xe8 ); } /* RET PE */ +OP(op,e9) { PC = HL; change_pc(PCD); } /* JP (HL) */ +OP(op,ea) { JP_COND( F & PF ); } /* JP PE,a */ +OP(op,eb) { EX_DE_HL; } /* EX DE,HL */ +OP(op,ec) { CALL_COND( F & PF, 0xec ); } /* CALL PE,a */ +OP(op,ed) { R++; EXEC(ed,ROP()); } /* **** ED xx */ +OP(op,ee) { XOR(ARG()); } /* XOR n */ +OP(op,ef) { RST(0x28); } /* RST 5 */ + +OP(op,f0) { RET_COND( !(F & SF), 0xf0 ); } /* RET P */ +OP(op,f1) { POP( af ); } /* POP AF */ +OP(op,f2) { JP_COND( !(F & SF) ); } /* JP P,a */ +OP(op,f3) { IFF1 = IFF2 = 0; } /* DI */ +OP(op,f4) { CALL_COND( !(F & SF), 0xf4 ); } /* CALL P,a */ +OP(op,f5) { PUSH( af ); } /* PUSH AF */ +OP(op,f6) { OR(ARG()); } /* OR n */ +OP(op,f7) { RST(0x30); } /* RST 6 */ + +OP(op,f8) { RET_COND( F & SF, 0xf8 ); } /* RET M */ +OP(op,f9) { SP = HL; } /* LD SP,HL */ +OP(op,fa) { JP_COND(F & SF); } /* JP M,a */ +OP(op,fb) { EI; } /* EI */ +OP(op,fc) { CALL_COND( F & SF, 0xfc ); } /* CALL M,a */ +OP(op,fd) { R++; EXEC(fd,ROP()); } /* **** FD xx */ +OP(op,fe) { CP(ARG()); } /* CP n */ +OP(op,ff) { RST(0x38); } /* RST 7 */ + + +static void take_interrupt(void) +{ + int irq_vector; + + /* there isn't a valid previous program counter */ + PRVPC = -1; + + /* Check if processor was halted */ + LEAVE_HALT; + + /* Clear both interrupt flip flops */ + IFF1 = IFF2 = 0; + + /* call back the cpu interface to retrieve the vector */ + irq_vector = (*Z80.irq_callback)(0); + + LOG(("Z80 #%d single int. irq_vector $%02x\n", cpu_getactivecpu(), irq_vector)); + + /* Interrupt mode 2. Call [Z80.i:databyte] */ + if( IM == 2 ) + { + irq_vector = (irq_vector & 0xff) | (I << 8); + PUSH( pc ); + RM16( irq_vector, &Z80.pc ); + LOG(("Z80 #%d IM2 [$%04x] = $%04x\n",cpu_getactivecpu() , irq_vector, PCD)); + /* CALL opcode timing */ + z80_ICount -= cc[Z80_TABLE_op][0xcd]; + } + else + /* Interrupt mode 1. RST 38h */ + if( IM == 1 ) + { + LOG(("Z80 #%d IM1 $0038\n",cpu_getactivecpu() )); + PUSH( pc ); + PCD = 0x0038; + /* RST $38 + 'interrupt latency' cycles */ + z80_ICount -= cc[Z80_TABLE_op][0xff] + cc[Z80_TABLE_ex][0xff]; + } + else + { + /* Interrupt mode 0. We check for CALL and JP instructions, */ + /* if neither of these were found we assume a 1 byte opcode */ + /* was placed on the databus */ + LOG(("Z80 #%d IM0 $%04x\n",cpu_getactivecpu() , irq_vector)); + switch (irq_vector & 0xff0000) + { + case 0xcd0000: /* call */ + PUSH( pc ); + PCD = irq_vector & 0xffff; + /* CALL $xxxx + 'interrupt latency' cycles */ + z80_ICount -= cc[Z80_TABLE_op][0xcd] + cc[Z80_TABLE_ex][0xff]; + break; + case 0xc30000: /* jump */ + PCD = irq_vector & 0xffff; + /* JP $xxxx + 2 cycles */ + z80_ICount -= cc[Z80_TABLE_op][0xc3] + cc[Z80_TABLE_ex][0xff]; + break; + default: /* rst (or other opcodes?) */ + PUSH( pc ); + PCD = irq_vector & 0x0038; + /* RST $xx + 2 cycles */ + z80_ICount -= cc[Z80_TABLE_op][PCD] + cc[Z80_TABLE_ex][PCD]; + break; + } + } + change_pc(PCD); +} + +/**************************************************************************** + * Processor initialization + ****************************************************************************/ +void z80_init(int index, int clock, const void *config, int (*irqcallback)(int)) +{ + int i, p; + + /* setup cycle tables */ + cc[Z80_TABLE_op] = cc_op; + cc[Z80_TABLE_cb] = cc_cb; + cc[Z80_TABLE_ed] = cc_ed; + cc[Z80_TABLE_xy] = cc_xy; + cc[Z80_TABLE_xycb] = cc_xycb; + cc[Z80_TABLE_ex] = cc_ex; + +#if BIG_FLAGS_ARRAY + if( !SZHVC_add || !SZHVC_sub ) + { + int oldval, newval, val; + UINT8 *padd, *padc, *psub, *psbc; + /* allocate big flag arrays once */ + SZHVC_add = (UINT8 *)malloc(2*256*256); + SZHVC_sub = (UINT8 *)malloc(2*256*256); + if( !SZHVC_add || !SZHVC_sub ) + { + return; + } + padd = &SZHVC_add[ 0*256]; + padc = &SZHVC_add[256*256]; + psub = &SZHVC_sub[ 0*256]; + psbc = &SZHVC_sub[256*256]; + for (oldval = 0; oldval < 256; oldval++) + { + for (newval = 0; newval < 256; newval++) + { + /* add or adc w/o carry set */ + val = newval - oldval; + *padd = (newval) ? ((newval & 0x80) ? SF : 0) : ZF; + *padd |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ + if( (newval & 0x0f) < (oldval & 0x0f) ) *padd |= HF; + if( newval < oldval ) *padd |= CF; + if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padd |= VF; + padd++; + + /* adc with carry set */ + val = newval - oldval - 1; + *padc = (newval) ? ((newval & 0x80) ? SF : 0) : ZF; + *padc |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ + if( (newval & 0x0f) <= (oldval & 0x0f) ) *padc |= HF; + if( newval <= oldval ) *padc |= CF; + if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padc |= VF; + padc++; + + /* cp, sub or sbc w/o carry set */ + val = oldval - newval; + *psub = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF); + *psub |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ + if( (newval & 0x0f) > (oldval & 0x0f) ) *psub |= HF; + if( newval > oldval ) *psub |= CF; + if( (val^oldval) & (oldval^newval) & 0x80 ) *psub |= VF; + psub++; + + /* sbc with carry set */ + val = oldval - newval - 1; + *psbc = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF); + *psbc |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ + if( (newval & 0x0f) >= (oldval & 0x0f) ) *psbc |= HF; + if( newval >= oldval ) *psbc |= CF; + if( (val^oldval) & (oldval^newval) & 0x80 ) *psbc |= VF; + psbc++; + } + } + } +#endif + for (i = 0; i < 256; i++) + { + p = 0; + if( i&0x01 ) ++p; + if( i&0x02 ) ++p; + if( i&0x04 ) ++p; + if( i&0x08 ) ++p; + if( i&0x10 ) ++p; + if( i&0x20 ) ++p; + if( i&0x40 ) ++p; + if( i&0x80 ) ++p; + SZ[i] = i ? i & SF : ZF; + SZ[i] |= (i & (YF | XF)); /* undocumented flag bits 5+3 */ + SZ_BIT[i] = i ? i & SF : ZF | PF; + SZ_BIT[i] |= (i & (YF | XF)); /* undocumented flag bits 5+3 */ + SZP[i] = SZ[i] | ((p & 1) ? 0 : PF); + SZHV_inc[i] = SZ[i]; + if( i == 0x80 ) SZHV_inc[i] |= VF; + if( (i & 0x0f) == 0x00 ) SZHV_inc[i] |= HF; + SZHV_dec[i] = SZ[i] | NF; + if( i == 0x7f ) SZHV_dec[i] |= VF; + if( (i & 0x0f) == 0x0f ) SZHV_dec[i] |= HF; + } + + /* Reset registers to their initial values */ + Z80.daisy = config; + Z80.irq_callback = irqcallback; +} + +/**************************************************************************** + * Do a reset + ****************************************************************************/ +void z80_reset(void) +{ + /* save previous values */ + void *config = (void *) Z80.daisy; + int (*irqcallback)(int) = Z80.irq_callback; + + /* Reset registers to their initial values */ + memset(&Z80, 0, sizeof(Z80)); + Z80.daisy = config; + Z80.irq_callback = irqcallback; + IX = IY = 0xffff; /* IX and IY are FFFF after a reset! */ + F = ZF; /* Zero flag is set */ + + PC = 0x0000; + I = 0; + R = 0; + R2 = 0; + Z80.nmi_state = CLEAR_LINE; + Z80.nmi_pending = FALSE; + Z80.irq_state = CLEAR_LINE; + Z80.after_ei = FALSE; + change_pc(PCD); +} + +void z80_exit(void) +{ +#if BIG_FLAGS_ARRAY + if (SZHVC_add) free(SZHVC_add); + SZHVC_add = NULL; + if (SZHVC_sub) free(SZHVC_sub); + SZHVC_sub = NULL; +#endif +} + +/**************************************************************************** + * Execute 'cycles' T-states. Return number of T-states really executed + ****************************************************************************/ +int z80_execute(int cycles) +{ + z80_ICount = cycles; + + /* check for NMIs on the way in; they can only be set externally */ + /* via timers, and can't be dynamically enabled, so it is safe */ + /* to just check here */ + if (Z80.nmi_pending) +{ + LOG(("Z80 #%d take NMI\n", cpu_getactivecpu())); + PRVPC = -1; /* there isn't a valid previous program counter */ + LEAVE_HALT; /* Check if processor was halted */ + + IFF1 = 0; + PUSH( pc ); + PCD = 0x0066; + change_pc(PCD); + z80_ICount -= 11; + Z80.nmi_pending = FALSE; + } + + do + { + /* check for IRQs before each instruction */ + if (Z80.irq_state != CLEAR_LINE && IFF1 && !Z80.after_ei) + take_interrupt(); + Z80.after_ei = FALSE; + + PRVPC = PCD; + R++; + EXEC_INLINE(op,ROP()); + } while( z80_ICount > 0 ); + + return cycles - z80_ICount; +} + +/**************************************************************************** + * Burn 'cycles' T-states. Adjust R register for the lost time + ****************************************************************************/ +void z80_burn(int cycles) +{ + if( cycles > 0 ) + { + /* NOP takes 4 cycles per instruction */ + int n = (cycles + 3) / 4; + R += n; + z80_ICount -= 4 * n; + } +} + +/**************************************************************************** + * Get all registers in given buffer + ****************************************************************************/ +void z80_get_context (void *dst) +{ + if( dst ) + *(Z80_Regs*)dst = Z80; +} + +/**************************************************************************** + * Set all registers to given values + ****************************************************************************/ +void z80_set_context (void *src) +{ + if( src ) + Z80 = *(Z80_Regs*)src; + change_pc(PCD); +} + +/**************************************************************************** + * Set IRQ line state + ****************************************************************************/ +void z80_set_irq_line(int irqline, int state) +{ + if (irqline == INPUT_LINE_NMI) + { + /* mark an NMI pending on the rising edge */ + if (Z80.nmi_state == CLEAR_LINE && state != CLEAR_LINE) + Z80.nmi_pending = TRUE; + Z80.nmi_state = state; + } + else + { + /* update the IRQ state via the daisy chain */ + Z80.irq_state = state; + + /* the main execute loop will take the interrupt */ + } +} + diff --git a/source/cpu/z80.h b/source/cpu/z80.h index c921dcf..58eabaa 100644 --- a/source/cpu/z80.h +++ b/source/cpu/z80.h @@ -1,62 +1,60 @@ -#ifndef Z80_H -#define Z80_H - -#include "cpuintrf.h" -#include "osd_cpu.h" - -enum { - Z80_PC=1, Z80_SP, Z80_AF, Z80_BC, Z80_DE, Z80_HL, - Z80_IX, Z80_IY, Z80_AF2, Z80_BC2, Z80_DE2, Z80_HL2, - Z80_R, Z80_I, Z80_IM, Z80_IFF1, Z80_IFF2, Z80_HALT, - Z80_NMI_STATE, Z80_IRQ_STATE, Z80_DC0, Z80_DC1, Z80_DC2, Z80_DC3 -}; - -enum { - Z80_TABLE_op, - Z80_TABLE_cb, - Z80_TABLE_ed, - Z80_TABLE_xy, - Z80_TABLE_xycb, - Z80_TABLE_ex /* cycles counts for taken jr/jp/call and interrupt latency (rst opcodes) */ -}; - -extern int z80_ICount; /* T-state count */ - -#define Z80_IGNORE_INT -1 /* Ignore interrupt */ -#define Z80_NMI_INT -2 /* Execute NMI */ -#define Z80_IRQ_INT -1000 /* Execute IRQ */ - -extern void z80_reset (void *param); -extern void z80_exit (void); -extern void z80_end_timeslice(void); -extern int z80_execute(int cycles); -extern void z80_burn(int cycles); -extern unsigned z80_get_context (void *dst); -extern void z80_set_context (void *src); -extern void *z80_get_cycle_table (int which); -extern void z80_set_cycle_table (int which, void *new_tbl); -extern unsigned z80_get_pc (void); -extern void z80_set_pc (unsigned val); -extern unsigned z80_get_sp (void); -extern void z80_set_sp (unsigned val); -extern unsigned z80_get_reg (int regnum); -extern void z80_set_reg (int regnum, unsigned val); -extern void z80_set_nmi_line(int state); -extern void z80_set_irq_line(int irqline, int state); -extern void z80_set_irq_callback(int (*irq_callback)(int)); -extern void z80_state_save(void *file); -extern void z80_state_load(void *file); -extern const char *z80_info(void *context, int regnum); -extern unsigned z80_dasm(char *buffer, unsigned pc); - -#ifdef MAME_DEBUG -extern unsigned DasmZ80(char *buffer, unsigned pc); -#endif - -unsigned int cpu_readport16(unsigned int port); -void cpu_writeport16(unsigned int port, unsigned int data); -unsigned int cpu_readmem16(unsigned int address); -void cpu_writemem16(unsigned int address, unsigned int data); - -#endif - +#ifndef Z80_H_ +#define Z80_H_ + +#include "cpuintrf.h" + +enum { + Z80_PC=1, Z80_SP, Z80_A, Z80_B, + Z80_C, Z80_D, Z80_E, Z80_H, Z80_L, + Z80_AF, Z80_BC, Z80_DE, Z80_HL, + Z80_IX, Z80_IY, Z80_AF2, Z80_BC2, Z80_DE2, Z80_HL2, + Z80_R, Z80_I, Z80_IM, Z80_IFF1, Z80_IFF2, Z80_HALT, + Z80_DC0, Z80_DC1, Z80_DC2, Z80_DC3 +}; + +enum { + Z80_TABLE_op, + Z80_TABLE_cb, + Z80_TABLE_ed, + Z80_TABLE_xy, + Z80_TABLE_xycb, + Z80_TABLE_ex /* cycles counts for taken jr/jp/call and interrupt latency (rst opcodes) */ +}; + +/****************************************************************************/ +/* The Z80 registers. HALT is set to 1 when the CPU is halted, the refresh */ +/* register is calculated as follows: refresh=(Z80.r&127)|(Z80.r2&128) */ +/****************************************************************************/ +typedef struct +{ + PAIR prvpc,pc,sp,af,bc,de,hl,ix,iy; + PAIR af2,bc2,de2,hl2; + UINT8 r,r2,iff1,iff2,halt,im,i; + UINT8 nmi_state; /* nmi line state */ + UINT8 nmi_pending; /* nmi pending */ + UINT8 irq_state; /* irq line state */ + UINT8 after_ei; /* are we in the EI shadow? */ + const struct z80_irq_daisy_chain *daisy; + int (*irq_callback)(int irqline); +} Z80_Regs; + + +extern int z80_ICount; +extern Z80_Regs Z80; + +void z80_init(int index, int clock, const void *config, int (*irqcallback)(int)); +void z80_reset (void); +void z80_exit (void); +int z80_execute(int cycles); +void z80_burn(int cycles); +void z80_get_context (void *dst); +void z80_set_context (void *src); +void z80_set_irq_line(int irqline, int state); + +unsigned int cpu_readport16(unsigned int port); +void cpu_writeport16(unsigned int port, unsigned int data); +unsigned int cpu_readmem16(unsigned int address); +void cpu_writemem16(unsigned int address, unsigned int data); + +#endif + diff --git a/source/cpu/z80daa.h b/source/cpu/z80daa.h deleted file mode 100644 index 44dbbd3..0000000 --- a/source/cpu/z80daa.h +++ /dev/null @@ -1,2051 +0,0 @@ -static UINT16 DAATable[0x800] = { - (0x00<<8) +ZF +VF , - (0x01<<8) , - (0x02<<8) , - (0x03<<8) +VF , - (0x04<<8) , - (0x05<<8) +VF , - (0x06<<8) +VF , - (0x07<<8) , - (0x08<<8) +XF , - (0x09<<8) +XF+VF , - (0x10<<8) +HF , - (0x11<<8) +HF +VF , - (0x12<<8) +HF +VF , - (0x13<<8) +HF , - (0x14<<8) +HF +VF , - (0x15<<8) +HF , - (0x10<<8) , - (0x11<<8) +VF , - (0x12<<8) +VF , - (0x13<<8) , - (0x14<<8) +VF , - (0x15<<8) , - (0x16<<8) , - (0x17<<8) +VF , - (0x18<<8) +XF+VF , - (0x19<<8) +XF , - (0x20<<8) +YF+HF , - (0x21<<8) +YF+HF +VF , - (0x22<<8) +YF+HF +VF , - (0x23<<8) +YF+HF , - (0x24<<8) +YF+HF +VF , - (0x25<<8) +YF+HF , - (0x20<<8) +YF , - (0x21<<8) +YF +VF , - (0x22<<8) +YF +VF , - (0x23<<8) +YF , - (0x24<<8) +YF +VF , - (0x25<<8) +YF , - (0x26<<8) +YF , - (0x27<<8) +YF +VF , - (0x28<<8) +YF +XF+VF , - (0x29<<8) +YF +XF , - (0x30<<8) +YF+HF +VF , - (0x31<<8) +YF+HF , - (0x32<<8) +YF+HF , - (0x33<<8) +YF+HF +VF , - (0x34<<8) +YF+HF , - (0x35<<8) +YF+HF +VF , - (0x30<<8) +YF +VF , - (0x31<<8) +YF , - (0x32<<8) +YF , - (0x33<<8) +YF +VF , - (0x34<<8) +YF , - (0x35<<8) +YF +VF , - (0x36<<8) +YF +VF , - (0x37<<8) +YF , - (0x38<<8) +YF +XF , - (0x39<<8) +YF +XF+VF , - (0x40<<8) +HF , - (0x41<<8) +HF +VF , - (0x42<<8) +HF +VF , - (0x43<<8) +HF , - (0x44<<8) +HF +VF , - (0x45<<8) +HF , - (0x40<<8) , - (0x41<<8) +VF , - (0x42<<8) +VF , - (0x43<<8) , - (0x44<<8) +VF , - (0x45<<8) , - (0x46<<8) , - (0x47<<8) +VF , - (0x48<<8) +XF+VF , - (0x49<<8) +XF , - (0x50<<8) +HF +VF , - (0x51<<8) +HF , - (0x52<<8) +HF , - (0x53<<8) +HF +VF , - (0x54<<8) +HF , - (0x55<<8) +HF +VF , - (0x50<<8) +VF , - (0x51<<8) , - (0x52<<8) , - (0x53<<8) +VF , - (0x54<<8) , - (0x55<<8) +VF , - (0x56<<8) +VF , - (0x57<<8) , - (0x58<<8) +XF , - (0x59<<8) +XF+VF , - (0x60<<8) +YF+HF +VF , - (0x61<<8) +YF+HF , - (0x62<<8) +YF+HF , - (0x63<<8) +YF+HF +VF , - (0x64<<8) +YF+HF , - (0x65<<8) +YF+HF +VF , - (0x60<<8) +YF +VF , - (0x61<<8) +YF , - (0x62<<8) +YF , - (0x63<<8) +YF +VF , - (0x64<<8) +YF , - (0x65<<8) +YF +VF , - (0x66<<8) +YF +VF , - (0x67<<8) +YF , - (0x68<<8) +YF +XF , - (0x69<<8) +YF +XF+VF , - (0x70<<8) +YF+HF , - (0x71<<8) +YF+HF +VF , - (0x72<<8) +YF+HF +VF , - (0x73<<8) +YF+HF , - (0x74<<8) +YF+HF +VF , - (0x75<<8) +YF+HF , - (0x70<<8) +YF , - (0x71<<8) +YF +VF , - (0x72<<8) +YF +VF , - (0x73<<8) +YF , - (0x74<<8) +YF +VF , - (0x75<<8) +YF , - (0x76<<8) +YF , - (0x77<<8) +YF +VF , - (0x78<<8) +YF +XF+VF , - (0x79<<8) +YF +XF , - (0x80<<8)+SF +HF , - (0x81<<8)+SF +HF +VF , - (0x82<<8)+SF +HF +VF , - (0x83<<8)+SF +HF , - (0x84<<8)+SF +HF +VF , - (0x85<<8)+SF +HF , - (0x80<<8)+SF , - (0x81<<8)+SF +VF , - (0x82<<8)+SF +VF , - (0x83<<8)+SF , - (0x84<<8)+SF +VF , - (0x85<<8)+SF , - (0x86<<8)+SF , - (0x87<<8)+SF +VF , - (0x88<<8)+SF +XF+VF , - (0x89<<8)+SF +XF , - (0x90<<8)+SF +HF +VF , - (0x91<<8)+SF +HF , - (0x92<<8)+SF +HF , - (0x93<<8)+SF +HF +VF , - (0x94<<8)+SF +HF , - (0x95<<8)+SF +HF +VF , - (0x90<<8)+SF +VF , - (0x91<<8)+SF , - (0x92<<8)+SF , - (0x93<<8)+SF +VF , - (0x94<<8)+SF , - (0x95<<8)+SF +VF , - (0x96<<8)+SF +VF , - (0x97<<8)+SF , - (0x98<<8)+SF +XF , - (0x99<<8)+SF +XF+VF , - (0x00<<8) +ZF +HF +VF +CF, - (0x01<<8) +HF +CF, - (0x02<<8) +HF +CF, - (0x03<<8) +HF +VF +CF, - (0x04<<8) +HF +CF, - (0x05<<8) +HF +VF +CF, - (0x00<<8) +ZF +VF +CF, - (0x01<<8) +CF, - (0x02<<8) +CF, - (0x03<<8) +VF +CF, - (0x04<<8) +CF, - (0x05<<8) +VF +CF, - (0x06<<8) +VF +CF, - (0x07<<8) +CF, - (0x08<<8) +XF +CF, - (0x09<<8) +XF+VF +CF, - (0x10<<8) +HF +CF, - (0x11<<8) +HF +VF +CF, - (0x12<<8) +HF +VF +CF, - (0x13<<8) +HF +CF, - (0x14<<8) +HF +VF +CF, - (0x15<<8) +HF +CF, - (0x10<<8) +CF, - (0x11<<8) +VF +CF, - (0x12<<8) +VF +CF, - (0x13<<8) +CF, - (0x14<<8) +VF +CF, - (0x15<<8) +CF, - (0x16<<8) +CF, - (0x17<<8) +VF +CF, - (0x18<<8) +XF+VF +CF, - (0x19<<8) +XF +CF, - (0x20<<8) +YF+HF +CF, - (0x21<<8) +YF+HF +VF +CF, - (0x22<<8) +YF+HF +VF +CF, - (0x23<<8) +YF+HF +CF, - (0x24<<8) +YF+HF +VF +CF, - (0x25<<8) +YF+HF +CF, - (0x20<<8) +YF +CF, - (0x21<<8) +YF +VF +CF, - (0x22<<8) +YF +VF +CF, - (0x23<<8) +YF +CF, - (0x24<<8) +YF +VF +CF, - (0x25<<8) +YF +CF, - (0x26<<8) +YF +CF, - (0x27<<8) +YF +VF +CF, - (0x28<<8) +YF +XF+VF +CF, - (0x29<<8) +YF +XF +CF, - (0x30<<8) +YF+HF +VF +CF, - (0x31<<8) +YF+HF +CF, - (0x32<<8) +YF+HF +CF, - (0x33<<8) +YF+HF +VF +CF, - (0x34<<8) +YF+HF +CF, - (0x35<<8) +YF+HF +VF +CF, - (0x30<<8) +YF +VF +CF, - (0x31<<8) +YF +CF, - (0x32<<8) +YF +CF, - (0x33<<8) +YF +VF +CF, - (0x34<<8) +YF +CF, - (0x35<<8) +YF +VF +CF, - (0x36<<8) +YF +VF +CF, - (0x37<<8) +YF +CF, - (0x38<<8) +YF +XF +CF, - (0x39<<8) +YF +XF+VF +CF, - (0x40<<8) +HF +CF, - (0x41<<8) +HF +VF +CF, - (0x42<<8) +HF +VF +CF, - (0x43<<8) +HF +CF, - (0x44<<8) +HF +VF +CF, - (0x45<<8) +HF +CF, - (0x40<<8) +CF, - (0x41<<8) +VF +CF, - (0x42<<8) +VF +CF, - (0x43<<8) +CF, - (0x44<<8) +VF +CF, - (0x45<<8) +CF, - (0x46<<8) +CF, - (0x47<<8) +VF +CF, - (0x48<<8) +XF+VF +CF, - (0x49<<8) +XF +CF, - (0x50<<8) +HF +VF +CF, - (0x51<<8) +HF +CF, - (0x52<<8) +HF +CF, - (0x53<<8) +HF +VF +CF, - (0x54<<8) +HF +CF, - (0x55<<8) +HF +VF +CF, - (0x50<<8) +VF +CF, - (0x51<<8) +CF, - (0x52<<8) +CF, - (0x53<<8) +VF +CF, - (0x54<<8) +CF, - (0x55<<8) +VF +CF, - (0x56<<8) +VF +CF, - (0x57<<8) +CF, - (0x58<<8) +XF +CF, - (0x59<<8) +XF+VF +CF, - (0x60<<8) +YF+HF +VF +CF, - (0x61<<8) +YF+HF +CF, - (0x62<<8) +YF+HF +CF, - (0x63<<8) +YF+HF +VF +CF, - (0x64<<8) +YF+HF +CF, - (0x65<<8) +YF+HF +VF +CF, - (0x60<<8) +YF +VF +CF, - (0x61<<8) +YF +CF, - (0x62<<8) +YF +CF, - (0x63<<8) +YF +VF +CF, - (0x64<<8) +YF +CF, - (0x65<<8) +YF +VF +CF, - (0x66<<8) +YF +VF +CF, - (0x67<<8) +YF +CF, - (0x68<<8) +YF +XF +CF, - (0x69<<8) +YF +XF+VF +CF, - (0x70<<8) +YF+HF +CF, - (0x71<<8) +YF+HF +VF +CF, - (0x72<<8) +YF+HF +VF +CF, - (0x73<<8) +YF+HF +CF, - (0x74<<8) +YF+HF +VF +CF, - (0x75<<8) +YF+HF +CF, - (0x70<<8) +YF +CF, - (0x71<<8) +YF +VF +CF, - (0x72<<8) +YF +VF +CF, - (0x73<<8) +YF +CF, - (0x74<<8) +YF +VF +CF, - (0x75<<8) +YF +CF, - (0x76<<8) +YF +CF, - (0x77<<8) +YF +VF +CF, - (0x78<<8) +YF +XF+VF +CF, - (0x79<<8) +YF +XF +CF, - (0x80<<8)+SF +HF +CF, - (0x81<<8)+SF +HF +VF +CF, - (0x82<<8)+SF +HF +VF +CF, - (0x83<<8)+SF +HF +CF, - (0x84<<8)+SF +HF +VF +CF, - (0x85<<8)+SF +HF +CF, - (0x80<<8)+SF +CF, - (0x81<<8)+SF +VF +CF, - (0x82<<8)+SF +VF +CF, - (0x83<<8)+SF +CF, - (0x84<<8)+SF +VF +CF, - (0x85<<8)+SF +CF, - (0x86<<8)+SF +CF, - (0x87<<8)+SF +VF +CF, - (0x88<<8)+SF +XF+VF +CF, - (0x89<<8)+SF +XF +CF, - (0x90<<8)+SF +HF +VF +CF, - (0x91<<8)+SF +HF +CF, - (0x92<<8)+SF +HF +CF, - (0x93<<8)+SF +HF +VF +CF, - (0x94<<8)+SF +HF +CF, - (0x95<<8)+SF +HF +VF +CF, - (0x90<<8)+SF +VF +CF, - (0x91<<8)+SF +CF, - (0x92<<8)+SF +CF, - (0x93<<8)+SF +VF +CF, - (0x94<<8)+SF +CF, - (0x95<<8)+SF +VF +CF, - (0x96<<8)+SF +VF +CF, - (0x97<<8)+SF +CF, - (0x98<<8)+SF +XF +CF, - (0x99<<8)+SF +XF+VF +CF, - (0xA0<<8)+SF +YF+HF +VF +CF, - (0xA1<<8)+SF +YF+HF +CF, - (0xA2<<8)+SF +YF+HF +CF, - (0xA3<<8)+SF +YF+HF +VF +CF, - (0xA4<<8)+SF +YF+HF +CF, - (0xA5<<8)+SF +YF+HF +VF +CF, - (0xA0<<8)+SF +YF +VF +CF, - (0xA1<<8)+SF +YF +CF, - (0xA2<<8)+SF +YF +CF, - (0xA3<<8)+SF +YF +VF +CF, - (0xA4<<8)+SF +YF +CF, - (0xA5<<8)+SF +YF +VF +CF, - (0xA6<<8)+SF +YF +VF +CF, - (0xA7<<8)+SF +YF +CF, - (0xA8<<8)+SF +YF +XF +CF, - (0xA9<<8)+SF +YF +XF+VF +CF, - (0xB0<<8)+SF +YF+HF +CF, - (0xB1<<8)+SF +YF+HF +VF +CF, - (0xB2<<8)+SF +YF+HF +VF +CF, - (0xB3<<8)+SF +YF+HF +CF, - (0xB4<<8)+SF +YF+HF +VF +CF, - (0xB5<<8)+SF +YF+HF +CF, - (0xB0<<8)+SF +YF +CF, - (0xB1<<8)+SF +YF +VF +CF, - (0xB2<<8)+SF +YF +VF +CF, - (0xB3<<8)+SF +YF +CF, - (0xB4<<8)+SF +YF +VF +CF, - (0xB5<<8)+SF +YF +CF, - (0xB6<<8)+SF +YF +CF, - (0xB7<<8)+SF +YF +VF +CF, - (0xB8<<8)+SF +YF +XF+VF +CF, - (0xB9<<8)+SF +YF +XF +CF, - (0xC0<<8)+SF +HF +VF +CF, - (0xC1<<8)+SF +HF +CF, - (0xC2<<8)+SF +HF +CF, - (0xC3<<8)+SF +HF +VF +CF, - (0xC4<<8)+SF +HF +CF, - (0xC5<<8)+SF +HF +VF +CF, - (0xC0<<8)+SF +VF +CF, - (0xC1<<8)+SF +CF, - (0xC2<<8)+SF +CF, - (0xC3<<8)+SF +VF +CF, - (0xC4<<8)+SF +CF, - (0xC5<<8)+SF +VF +CF, - (0xC6<<8)+SF +VF +CF, - (0xC7<<8)+SF +CF, - (0xC8<<8)+SF +XF +CF, - (0xC9<<8)+SF +XF+VF +CF, - (0xD0<<8)+SF +HF +CF, - (0xD1<<8)+SF +HF +VF +CF, - (0xD2<<8)+SF +HF +VF +CF, - (0xD3<<8)+SF +HF +CF, - (0xD4<<8)+SF +HF +VF +CF, - (0xD5<<8)+SF +HF +CF, - (0xD0<<8)+SF +CF, - (0xD1<<8)+SF +VF +CF, - (0xD2<<8)+SF +VF +CF, - (0xD3<<8)+SF +CF, - (0xD4<<8)+SF +VF +CF, - (0xD5<<8)+SF +CF, - (0xD6<<8)+SF +CF, - (0xD7<<8)+SF +VF +CF, - (0xD8<<8)+SF +XF+VF +CF, - (0xD9<<8)+SF +XF +CF, - (0xE0<<8)+SF +YF+HF +CF, - (0xE1<<8)+SF +YF+HF +VF +CF, - (0xE2<<8)+SF +YF+HF +VF +CF, - (0xE3<<8)+SF +YF+HF +CF, - (0xE4<<8)+SF +YF+HF +VF +CF, - (0xE5<<8)+SF +YF+HF +CF, - (0xE0<<8)+SF +YF +CF, - (0xE1<<8)+SF +YF +VF +CF, - (0xE2<<8)+SF +YF +VF +CF, - (0xE3<<8)+SF +YF +CF, - (0xE4<<8)+SF +YF +VF +CF, - (0xE5<<8)+SF +YF +CF, - (0xE6<<8)+SF +YF +CF, - (0xE7<<8)+SF +YF +VF +CF, - (0xE8<<8)+SF +YF +XF+VF +CF, - (0xE9<<8)+SF +YF +XF +CF, - (0xF0<<8)+SF +YF+HF +VF +CF, - (0xF1<<8)+SF +YF+HF +CF, - (0xF2<<8)+SF +YF+HF +CF, - (0xF3<<8)+SF +YF+HF +VF +CF, - (0xF4<<8)+SF +YF+HF +CF, - (0xF5<<8)+SF +YF+HF +VF +CF, - (0xF0<<8)+SF +YF +VF +CF, - (0xF1<<8)+SF +YF +CF, - (0xF2<<8)+SF +YF +CF, - (0xF3<<8)+SF +YF +VF +CF, - (0xF4<<8)+SF +YF +CF, - (0xF5<<8)+SF +YF +VF +CF, - (0xF6<<8)+SF +YF +VF +CF, - (0xF7<<8)+SF +YF +CF, - (0xF8<<8)+SF +YF +XF +CF, - (0xF9<<8)+SF +YF +XF+VF +CF, - (0x00<<8) +ZF +HF +VF +CF, - (0x01<<8) +HF +CF, - (0x02<<8) +HF +CF, - (0x03<<8) +HF +VF +CF, - (0x04<<8) +HF +CF, - (0x05<<8) +HF +VF +CF, - (0x00<<8) +ZF +VF +CF, - (0x01<<8) +CF, - (0x02<<8) +CF, - (0x03<<8) +VF +CF, - (0x04<<8) +CF, - (0x05<<8) +VF +CF, - (0x06<<8) +VF +CF, - (0x07<<8) +CF, - (0x08<<8) +XF +CF, - (0x09<<8) +XF+VF +CF, - (0x10<<8) +HF +CF, - (0x11<<8) +HF +VF +CF, - (0x12<<8) +HF +VF +CF, - (0x13<<8) +HF +CF, - (0x14<<8) +HF +VF +CF, - (0x15<<8) +HF +CF, - (0x10<<8) +CF, - (0x11<<8) +VF +CF, - (0x12<<8) +VF +CF, - (0x13<<8) +CF, - (0x14<<8) +VF +CF, - (0x15<<8) +CF, - (0x16<<8) +CF, - (0x17<<8) +VF +CF, - (0x18<<8) +XF+VF +CF, - (0x19<<8) +XF +CF, - (0x20<<8) +YF+HF +CF, - (0x21<<8) +YF+HF +VF +CF, - (0x22<<8) +YF+HF +VF +CF, - (0x23<<8) +YF+HF +CF, - (0x24<<8) +YF+HF +VF +CF, - (0x25<<8) +YF+HF +CF, - (0x20<<8) +YF +CF, - (0x21<<8) +YF +VF +CF, - (0x22<<8) +YF +VF +CF, - (0x23<<8) +YF +CF, - (0x24<<8) +YF +VF +CF, - (0x25<<8) +YF +CF, - (0x26<<8) +YF +CF, - (0x27<<8) +YF +VF +CF, - (0x28<<8) +YF +XF+VF +CF, - (0x29<<8) +YF +XF +CF, - (0x30<<8) +YF+HF +VF +CF, - (0x31<<8) +YF+HF +CF, - (0x32<<8) +YF+HF +CF, - (0x33<<8) +YF+HF +VF +CF, - (0x34<<8) +YF+HF +CF, - (0x35<<8) +YF+HF +VF +CF, - (0x30<<8) +YF +VF +CF, - (0x31<<8) +YF +CF, - (0x32<<8) +YF +CF, - (0x33<<8) +YF +VF +CF, - (0x34<<8) +YF +CF, - (0x35<<8) +YF +VF +CF, - (0x36<<8) +YF +VF +CF, - (0x37<<8) +YF +CF, - (0x38<<8) +YF +XF +CF, - (0x39<<8) +YF +XF+VF +CF, - (0x40<<8) +HF +CF, - (0x41<<8) +HF +VF +CF, - (0x42<<8) +HF +VF +CF, - (0x43<<8) +HF +CF, - (0x44<<8) +HF +VF +CF, - (0x45<<8) +HF +CF, - (0x40<<8) +CF, - (0x41<<8) +VF +CF, - (0x42<<8) +VF +CF, - (0x43<<8) +CF, - (0x44<<8) +VF +CF, - (0x45<<8) +CF, - (0x46<<8) +CF, - (0x47<<8) +VF +CF, - (0x48<<8) +XF+VF +CF, - (0x49<<8) +XF +CF, - (0x50<<8) +HF +VF +CF, - (0x51<<8) +HF +CF, - (0x52<<8) +HF +CF, - (0x53<<8) +HF +VF +CF, - (0x54<<8) +HF +CF, - (0x55<<8) +HF +VF +CF, - (0x50<<8) +VF +CF, - (0x51<<8) +CF, - (0x52<<8) +CF, - (0x53<<8) +VF +CF, - (0x54<<8) +CF, - (0x55<<8) +VF +CF, - (0x56<<8) +VF +CF, - (0x57<<8) +CF, - (0x58<<8) +XF +CF, - (0x59<<8) +XF+VF +CF, - (0x60<<8) +YF+HF +VF +CF, - (0x61<<8) +YF+HF +CF, - (0x62<<8) +YF+HF +CF, - (0x63<<8) +YF+HF +VF +CF, - (0x64<<8) +YF+HF +CF, - (0x65<<8) +YF+HF +VF +CF, - (0x06<<8) +VF , - (0x07<<8) , - (0x08<<8) +XF , - (0x09<<8) +XF+VF , - (0x0A<<8) +XF+VF , - (0x0B<<8) +XF , - (0x0C<<8) +XF+VF , - (0x0D<<8) +XF , - (0x0E<<8) +XF , - (0x0F<<8) +XF+VF , - (0x10<<8) +HF , - (0x11<<8) +HF +VF , - (0x12<<8) +HF +VF , - (0x13<<8) +HF , - (0x14<<8) +HF +VF , - (0x15<<8) +HF , - (0x16<<8) , - (0x17<<8) +VF , - (0x18<<8) +XF+VF , - (0x19<<8) +XF , - (0x1A<<8) +XF , - (0x1B<<8) +XF+VF , - (0x1C<<8) +XF , - (0x1D<<8) +XF+VF , - (0x1E<<8) +XF+VF , - (0x1F<<8) +XF , - (0x20<<8) +YF+HF , - (0x21<<8) +YF+HF +VF , - (0x22<<8) +YF+HF +VF , - (0x23<<8) +YF+HF , - (0x24<<8) +YF+HF +VF , - (0x25<<8) +YF+HF , - (0x26<<8) +YF , - (0x27<<8) +YF +VF , - (0x28<<8) +YF +XF+VF , - (0x29<<8) +YF +XF , - (0x2A<<8) +YF +XF , - (0x2B<<8) +YF +XF+VF , - (0x2C<<8) +YF +XF , - (0x2D<<8) +YF +XF+VF , - (0x2E<<8) +YF +XF+VF , - (0x2F<<8) +YF +XF , - (0x30<<8) +YF+HF +VF , - (0x31<<8) +YF+HF , - (0x32<<8) +YF+HF , - (0x33<<8) +YF+HF +VF , - (0x34<<8) +YF+HF , - (0x35<<8) +YF+HF +VF , - (0x36<<8) +YF +VF , - (0x37<<8) +YF , - (0x38<<8) +YF +XF , - (0x39<<8) +YF +XF+VF , - (0x3A<<8) +YF +XF+VF , - (0x3B<<8) +YF +XF , - (0x3C<<8) +YF +XF+VF , - (0x3D<<8) +YF +XF , - (0x3E<<8) +YF +XF , - (0x3F<<8) +YF +XF+VF , - (0x40<<8) +HF , - (0x41<<8) +HF +VF , - (0x42<<8) +HF +VF , - (0x43<<8) +HF , - (0x44<<8) +HF +VF , - (0x45<<8) +HF , - (0x46<<8) , - (0x47<<8) +VF , - (0x48<<8) +XF+VF , - (0x49<<8) +XF , - (0x4A<<8) +XF , - (0x4B<<8) +XF+VF , - (0x4C<<8) +XF , - (0x4D<<8) +XF+VF , - (0x4E<<8) +XF+VF , - (0x4F<<8) +XF , - (0x50<<8) +HF +VF , - (0x51<<8) +HF , - (0x52<<8) +HF , - (0x53<<8) +HF +VF , - (0x54<<8) +HF , - (0x55<<8) +HF +VF , - (0x56<<8) +VF , - (0x57<<8) , - (0x58<<8) +XF , - (0x59<<8) +XF+VF , - (0x5A<<8) +XF+VF , - (0x5B<<8) +XF , - (0x5C<<8) +XF+VF , - (0x5D<<8) +XF , - (0x5E<<8) +XF , - (0x5F<<8) +XF+VF , - (0x60<<8) +YF+HF +VF , - (0x61<<8) +YF+HF , - (0x62<<8) +YF+HF , - (0x63<<8) +YF+HF +VF , - (0x64<<8) +YF+HF , - (0x65<<8) +YF+HF +VF , - (0x66<<8) +YF +VF , - (0x67<<8) +YF , - (0x68<<8) +YF +XF , - (0x69<<8) +YF +XF+VF , - (0x6A<<8) +YF +XF+VF , - (0x6B<<8) +YF +XF , - (0x6C<<8) +YF +XF+VF , - (0x6D<<8) +YF +XF , - (0x6E<<8) +YF +XF , - (0x6F<<8) +YF +XF+VF , - (0x70<<8) +YF+HF , - (0x71<<8) +YF+HF +VF , - (0x72<<8) +YF+HF +VF , - (0x73<<8) +YF+HF , - (0x74<<8) +YF+HF +VF , - (0x75<<8) +YF+HF , - (0x76<<8) +YF , - (0x77<<8) +YF +VF , - (0x78<<8) +YF +XF+VF , - (0x79<<8) +YF +XF , - (0x7A<<8) +YF +XF , - (0x7B<<8) +YF +XF+VF , - (0x7C<<8) +YF +XF , - (0x7D<<8) +YF +XF+VF , - (0x7E<<8) +YF +XF+VF , - (0x7F<<8) +YF +XF , - (0x80<<8)+SF +HF , - (0x81<<8)+SF +HF +VF , - (0x82<<8)+SF +HF +VF , - (0x83<<8)+SF +HF , - (0x84<<8)+SF +HF +VF , - (0x85<<8)+SF +HF , - (0x86<<8)+SF , - (0x87<<8)+SF +VF , - (0x88<<8)+SF +XF+VF , - (0x89<<8)+SF +XF , - (0x8A<<8)+SF +XF , - (0x8B<<8)+SF +XF+VF , - (0x8C<<8)+SF +XF , - (0x8D<<8)+SF +XF+VF , - (0x8E<<8)+SF +XF+VF , - (0x8F<<8)+SF +XF , - (0x90<<8)+SF +HF +VF , - (0x91<<8)+SF +HF , - (0x92<<8)+SF +HF , - (0x93<<8)+SF +HF +VF , - (0x94<<8)+SF +HF , - (0x95<<8)+SF +HF +VF , - (0x96<<8)+SF +VF , - (0x97<<8)+SF , - (0x98<<8)+SF +XF , - (0x99<<8)+SF +XF+VF , - (0x9A<<8)+SF +XF+VF , - (0x9B<<8)+SF +XF , - (0x9C<<8)+SF +XF+VF , - (0x9D<<8)+SF +XF , - (0x9E<<8)+SF +XF , - (0x9F<<8)+SF +XF+VF , - (0x00<<8) +ZF +HF +VF +CF, - (0x01<<8) +HF +CF, - (0x02<<8) +HF +CF, - (0x03<<8) +HF +VF +CF, - (0x04<<8) +HF +CF, - (0x05<<8) +HF +VF +CF, - (0x06<<8) +VF +CF, - (0x07<<8) +CF, - (0x08<<8) +XF +CF, - (0x09<<8) +XF+VF +CF, - (0x0A<<8) +XF+VF +CF, - (0x0B<<8) +XF +CF, - (0x0C<<8) +XF+VF +CF, - (0x0D<<8) +XF +CF, - (0x0E<<8) +XF +CF, - (0x0F<<8) +XF+VF +CF, - (0x10<<8) +HF +CF, - (0x11<<8) +HF +VF +CF, - (0x12<<8) +HF +VF +CF, - (0x13<<8) +HF +CF, - (0x14<<8) +HF +VF +CF, - (0x15<<8) +HF +CF, - (0x16<<8) +CF, - (0x17<<8) +VF +CF, - (0x18<<8) +XF+VF +CF, - (0x19<<8) +XF +CF, - (0x1A<<8) +XF +CF, - (0x1B<<8) +XF+VF +CF, - (0x1C<<8) +XF +CF, - (0x1D<<8) +XF+VF +CF, - (0x1E<<8) +XF+VF +CF, - (0x1F<<8) +XF +CF, - (0x20<<8) +YF+HF +CF, - (0x21<<8) +YF+HF +VF +CF, - (0x22<<8) +YF+HF +VF +CF, - (0x23<<8) +YF+HF +CF, - (0x24<<8) +YF+HF +VF +CF, - (0x25<<8) +YF+HF +CF, - (0x26<<8) +YF +CF, - (0x27<<8) +YF +VF +CF, - (0x28<<8) +YF +XF+VF +CF, - (0x29<<8) +YF +XF +CF, - (0x2A<<8) +YF +XF +CF, - (0x2B<<8) +YF +XF+VF +CF, - (0x2C<<8) +YF +XF +CF, - (0x2D<<8) +YF +XF+VF +CF, - (0x2E<<8) +YF +XF+VF +CF, - (0x2F<<8) +YF +XF +CF, - (0x30<<8) +YF+HF +VF +CF, - (0x31<<8) +YF+HF +CF, - (0x32<<8) +YF+HF +CF, - (0x33<<8) +YF+HF +VF +CF, - (0x34<<8) +YF+HF +CF, - (0x35<<8) +YF+HF +VF +CF, - (0x36<<8) +YF +VF +CF, - (0x37<<8) +YF +CF, - (0x38<<8) +YF +XF +CF, - (0x39<<8) +YF +XF+VF +CF, - (0x3A<<8) +YF +XF+VF +CF, - (0x3B<<8) +YF +XF +CF, - (0x3C<<8) +YF +XF+VF +CF, - (0x3D<<8) +YF +XF +CF, - (0x3E<<8) +YF +XF +CF, - (0x3F<<8) +YF +XF+VF +CF, - (0x40<<8) +HF +CF, - (0x41<<8) +HF +VF +CF, - (0x42<<8) +HF +VF +CF, - (0x43<<8) +HF +CF, - (0x44<<8) +HF +VF +CF, - (0x45<<8) +HF +CF, - (0x46<<8) +CF, - (0x47<<8) +VF +CF, - (0x48<<8) +XF+VF +CF, - (0x49<<8) +XF +CF, - (0x4A<<8) +XF +CF, - (0x4B<<8) +XF+VF +CF, - (0x4C<<8) +XF +CF, - (0x4D<<8) +XF+VF +CF, - (0x4E<<8) +XF+VF +CF, - (0x4F<<8) +XF +CF, - (0x50<<8) +HF +VF +CF, - (0x51<<8) +HF +CF, - (0x52<<8) +HF +CF, - (0x53<<8) +HF +VF +CF, - (0x54<<8) +HF +CF, - (0x55<<8) +HF +VF +CF, - (0x56<<8) +VF +CF, - (0x57<<8) +CF, - (0x58<<8) +XF +CF, - (0x59<<8) +XF+VF +CF, - (0x5A<<8) +XF+VF +CF, - (0x5B<<8) +XF +CF, - (0x5C<<8) +XF+VF +CF, - (0x5D<<8) +XF +CF, - (0x5E<<8) +XF +CF, - (0x5F<<8) +XF+VF +CF, - (0x60<<8) +YF+HF +VF +CF, - (0x61<<8) +YF+HF +CF, - (0x62<<8) +YF+HF +CF, - (0x63<<8) +YF+HF +VF +CF, - (0x64<<8) +YF+HF +CF, - (0x65<<8) +YF+HF +VF +CF, - (0x66<<8) +YF +VF +CF, - (0x67<<8) +YF +CF, - (0x68<<8) +YF +XF +CF, - (0x69<<8) +YF +XF+VF +CF, - (0x6A<<8) +YF +XF+VF +CF, - (0x6B<<8) +YF +XF +CF, - (0x6C<<8) +YF +XF+VF +CF, - (0x6D<<8) +YF +XF +CF, - (0x6E<<8) +YF +XF +CF, - (0x6F<<8) +YF +XF+VF +CF, - (0x70<<8) +YF+HF +CF, - (0x71<<8) +YF+HF +VF +CF, - (0x72<<8) +YF+HF +VF +CF, - (0x73<<8) +YF+HF +CF, - (0x74<<8) +YF+HF +VF +CF, - (0x75<<8) +YF+HF +CF, - (0x76<<8) +YF +CF, - (0x77<<8) +YF +VF +CF, - (0x78<<8) +YF +XF+VF +CF, - (0x79<<8) +YF +XF +CF, - (0x7A<<8) +YF +XF +CF, - (0x7B<<8) +YF +XF+VF +CF, - (0x7C<<8) +YF +XF +CF, - (0x7D<<8) +YF +XF+VF +CF, - (0x7E<<8) +YF +XF+VF +CF, - (0x7F<<8) +YF +XF +CF, - (0x80<<8)+SF +HF +CF, - (0x81<<8)+SF +HF +VF +CF, - (0x82<<8)+SF +HF +VF +CF, - (0x83<<8)+SF +HF +CF, - (0x84<<8)+SF +HF +VF +CF, - (0x85<<8)+SF +HF +CF, - (0x86<<8)+SF +CF, - (0x87<<8)+SF +VF +CF, - (0x88<<8)+SF +XF+VF +CF, - (0x89<<8)+SF +XF +CF, - (0x8A<<8)+SF +XF +CF, - (0x8B<<8)+SF +XF+VF +CF, - (0x8C<<8)+SF +XF +CF, - (0x8D<<8)+SF +XF+VF +CF, - (0x8E<<8)+SF +XF+VF +CF, - (0x8F<<8)+SF +XF +CF, - (0x90<<8)+SF +HF +VF +CF, - (0x91<<8)+SF +HF +CF, - (0x92<<8)+SF +HF +CF, - (0x93<<8)+SF +HF +VF +CF, - (0x94<<8)+SF +HF +CF, - (0x95<<8)+SF +HF +VF +CF, - (0x96<<8)+SF +VF +CF, - (0x97<<8)+SF +CF, - (0x98<<8)+SF +XF +CF, - (0x99<<8)+SF +XF+VF +CF, - (0x9A<<8)+SF +XF+VF +CF, - (0x9B<<8)+SF +XF +CF, - (0x9C<<8)+SF +XF+VF +CF, - (0x9D<<8)+SF +XF +CF, - (0x9E<<8)+SF +XF +CF, - (0x9F<<8)+SF +XF+VF +CF, - (0xA0<<8)+SF +YF+HF +VF +CF, - (0xA1<<8)+SF +YF+HF +CF, - (0xA2<<8)+SF +YF+HF +CF, - (0xA3<<8)+SF +YF+HF +VF +CF, - (0xA4<<8)+SF +YF+HF +CF, - (0xA5<<8)+SF +YF+HF +VF +CF, - (0xA6<<8)+SF +YF +VF +CF, - (0xA7<<8)+SF +YF +CF, - (0xA8<<8)+SF +YF +XF +CF, - (0xA9<<8)+SF +YF +XF+VF +CF, - (0xAA<<8)+SF +YF +XF+VF +CF, - (0xAB<<8)+SF +YF +XF +CF, - (0xAC<<8)+SF +YF +XF+VF +CF, - (0xAD<<8)+SF +YF +XF +CF, - (0xAE<<8)+SF +YF +XF +CF, - (0xAF<<8)+SF +YF +XF+VF +CF, - (0xB0<<8)+SF +YF+HF +CF, - (0xB1<<8)+SF +YF+HF +VF +CF, - (0xB2<<8)+SF +YF+HF +VF +CF, - (0xB3<<8)+SF +YF+HF +CF, - (0xB4<<8)+SF +YF+HF +VF +CF, - (0xB5<<8)+SF +YF+HF +CF, - (0xB6<<8)+SF +YF +CF, - (0xB7<<8)+SF +YF +VF +CF, - (0xB8<<8)+SF +YF +XF+VF +CF, - (0xB9<<8)+SF +YF +XF +CF, - (0xBA<<8)+SF +YF +XF +CF, - (0xBB<<8)+SF +YF +XF+VF +CF, - (0xBC<<8)+SF +YF +XF +CF, - (0xBD<<8)+SF +YF +XF+VF +CF, - (0xBE<<8)+SF +YF +XF+VF +CF, - (0xBF<<8)+SF +YF +XF +CF, - (0xC0<<8)+SF +HF +VF +CF, - (0xC1<<8)+SF +HF +CF, - (0xC2<<8)+SF +HF +CF, - (0xC3<<8)+SF +HF +VF +CF, - (0xC4<<8)+SF +HF +CF, - (0xC5<<8)+SF +HF +VF +CF, - (0xC6<<8)+SF +VF +CF, - (0xC7<<8)+SF +CF, - (0xC8<<8)+SF +XF +CF, - (0xC9<<8)+SF +XF+VF +CF, - (0xCA<<8)+SF +XF+VF +CF, - (0xCB<<8)+SF +XF +CF, - (0xCC<<8)+SF +XF+VF +CF, - (0xCD<<8)+SF +XF +CF, - (0xCE<<8)+SF +XF +CF, - (0xCF<<8)+SF +XF+VF +CF, - (0xD0<<8)+SF +HF +CF, - (0xD1<<8)+SF +HF +VF +CF, - (0xD2<<8)+SF +HF +VF +CF, - (0xD3<<8)+SF +HF +CF, - (0xD4<<8)+SF +HF +VF +CF, - (0xD5<<8)+SF +HF +CF, - (0xD6<<8)+SF +CF, - (0xD7<<8)+SF +VF +CF, - (0xD8<<8)+SF +XF+VF +CF, - (0xD9<<8)+SF +XF +CF, - (0xDA<<8)+SF +XF +CF, - (0xDB<<8)+SF +XF+VF +CF, - (0xDC<<8)+SF +XF +CF, - (0xDD<<8)+SF +XF+VF +CF, - (0xDE<<8)+SF +XF+VF +CF, - (0xDF<<8)+SF +XF +CF, - (0xE0<<8)+SF +YF+HF +CF, - (0xE1<<8)+SF +YF+HF +VF +CF, - (0xE2<<8)+SF +YF+HF +VF +CF, - (0xE3<<8)+SF +YF+HF +CF, - (0xE4<<8)+SF +YF+HF +VF +CF, - (0xE5<<8)+SF +YF+HF +CF, - (0xE6<<8)+SF +YF +CF, - (0xE7<<8)+SF +YF +VF +CF, - (0xE8<<8)+SF +YF +XF+VF +CF, - (0xE9<<8)+SF +YF +XF +CF, - (0xEA<<8)+SF +YF +XF +CF, - (0xEB<<8)+SF +YF +XF+VF +CF, - (0xEC<<8)+SF +YF +XF +CF, - (0xED<<8)+SF +YF +XF+VF +CF, - (0xEE<<8)+SF +YF +XF+VF +CF, - (0xEF<<8)+SF +YF +XF +CF, - (0xF0<<8)+SF +YF+HF +VF +CF, - (0xF1<<8)+SF +YF+HF +CF, - (0xF2<<8)+SF +YF+HF +CF, - (0xF3<<8)+SF +YF+HF +VF +CF, - (0xF4<<8)+SF +YF+HF +CF, - (0xF5<<8)+SF +YF+HF +VF +CF, - (0xF6<<8)+SF +YF +VF +CF, - (0xF7<<8)+SF +YF +CF, - (0xF8<<8)+SF +YF +XF +CF, - (0xF9<<8)+SF +YF +XF+VF +CF, - (0xFA<<8)+SF +YF +XF+VF +CF, - (0xFB<<8)+SF +YF +XF +CF, - (0xFC<<8)+SF +YF +XF+VF +CF, - (0xFD<<8)+SF +YF +XF +CF, - (0xFE<<8)+SF +YF +XF +CF, - (0xFF<<8)+SF +YF +XF+VF +CF, - (0x00<<8) +ZF +HF +VF +CF, - (0x01<<8) +HF +CF, - (0x02<<8) +HF +CF, - (0x03<<8) +HF +VF +CF, - (0x04<<8) +HF +CF, - (0x05<<8) +HF +VF +CF, - (0x06<<8) +VF +CF, - (0x07<<8) +CF, - (0x08<<8) +XF +CF, - (0x09<<8) +XF+VF +CF, - (0x0A<<8) +XF+VF +CF, - (0x0B<<8) +XF +CF, - (0x0C<<8) +XF+VF +CF, - (0x0D<<8) +XF +CF, - (0x0E<<8) +XF +CF, - (0x0F<<8) +XF+VF +CF, - (0x10<<8) +HF +CF, - (0x11<<8) +HF +VF +CF, - (0x12<<8) +HF +VF +CF, - (0x13<<8) +HF +CF, - (0x14<<8) +HF +VF +CF, - (0x15<<8) +HF +CF, - (0x16<<8) +CF, - (0x17<<8) +VF +CF, - (0x18<<8) +XF+VF +CF, - (0x19<<8) +XF +CF, - (0x1A<<8) +XF +CF, - (0x1B<<8) +XF+VF +CF, - (0x1C<<8) +XF +CF, - (0x1D<<8) +XF+VF +CF, - (0x1E<<8) +XF+VF +CF, - (0x1F<<8) +XF +CF, - (0x20<<8) +YF+HF +CF, - (0x21<<8) +YF+HF +VF +CF, - (0x22<<8) +YF+HF +VF +CF, - (0x23<<8) +YF+HF +CF, - (0x24<<8) +YF+HF +VF +CF, - (0x25<<8) +YF+HF +CF, - (0x26<<8) +YF +CF, - (0x27<<8) +YF +VF +CF, - (0x28<<8) +YF +XF+VF +CF, - (0x29<<8) +YF +XF +CF, - (0x2A<<8) +YF +XF +CF, - (0x2B<<8) +YF +XF+VF +CF, - (0x2C<<8) +YF +XF +CF, - (0x2D<<8) +YF +XF+VF +CF, - (0x2E<<8) +YF +XF+VF +CF, - (0x2F<<8) +YF +XF +CF, - (0x30<<8) +YF+HF +VF +CF, - (0x31<<8) +YF+HF +CF, - (0x32<<8) +YF+HF +CF, - (0x33<<8) +YF+HF +VF +CF, - (0x34<<8) +YF+HF +CF, - (0x35<<8) +YF+HF +VF +CF, - (0x36<<8) +YF +VF +CF, - (0x37<<8) +YF +CF, - (0x38<<8) +YF +XF +CF, - (0x39<<8) +YF +XF+VF +CF, - (0x3A<<8) +YF +XF+VF +CF, - (0x3B<<8) +YF +XF +CF, - (0x3C<<8) +YF +XF+VF +CF, - (0x3D<<8) +YF +XF +CF, - (0x3E<<8) +YF +XF +CF, - (0x3F<<8) +YF +XF+VF +CF, - (0x40<<8) +HF +CF, - (0x41<<8) +HF +VF +CF, - (0x42<<8) +HF +VF +CF, - (0x43<<8) +HF +CF, - (0x44<<8) +HF +VF +CF, - (0x45<<8) +HF +CF, - (0x46<<8) +CF, - (0x47<<8) +VF +CF, - (0x48<<8) +XF+VF +CF, - (0x49<<8) +XF +CF, - (0x4A<<8) +XF +CF, - (0x4B<<8) +XF+VF +CF, - (0x4C<<8) +XF +CF, - (0x4D<<8) +XF+VF +CF, - (0x4E<<8) +XF+VF +CF, - (0x4F<<8) +XF +CF, - (0x50<<8) +HF +VF +CF, - (0x51<<8) +HF +CF, - (0x52<<8) +HF +CF, - (0x53<<8) +HF +VF +CF, - (0x54<<8) +HF +CF, - (0x55<<8) +HF +VF +CF, - (0x56<<8) +VF +CF, - (0x57<<8) +CF, - (0x58<<8) +XF +CF, - (0x59<<8) +XF+VF +CF, - (0x5A<<8) +XF+VF +CF, - (0x5B<<8) +XF +CF, - (0x5C<<8) +XF+VF +CF, - (0x5D<<8) +XF +CF, - (0x5E<<8) +XF +CF, - (0x5F<<8) +XF+VF +CF, - (0x60<<8) +YF+HF +VF +CF, - (0x61<<8) +YF+HF +CF, - (0x62<<8) +YF+HF +CF, - (0x63<<8) +YF+HF +VF +CF, - (0x64<<8) +YF+HF +CF, - (0x65<<8) +YF+HF +VF +CF, - (0x00<<8) +ZF +VF+NF , - (0x01<<8) +NF , - (0x02<<8) +NF , - (0x03<<8) +VF+NF , - (0x04<<8) +NF , - (0x05<<8) +VF+NF , - (0x06<<8) +VF+NF , - (0x07<<8) +NF , - (0x08<<8) +XF +NF , - (0x09<<8) +XF+VF+NF , - (0x04<<8) +NF , - (0x05<<8) +VF+NF , - (0x06<<8) +VF+NF , - (0x07<<8) +NF , - (0x08<<8) +XF +NF , - (0x09<<8) +XF+VF+NF , - (0x10<<8) +NF , - (0x11<<8) +VF+NF , - (0x12<<8) +VF+NF , - (0x13<<8) +NF , - (0x14<<8) +VF+NF , - (0x15<<8) +NF , - (0x16<<8) +NF , - (0x17<<8) +VF+NF , - (0x18<<8) +XF+VF+NF , - (0x19<<8) +XF +NF , - (0x14<<8) +VF+NF , - (0x15<<8) +NF , - (0x16<<8) +NF , - (0x17<<8) +VF+NF , - (0x18<<8) +XF+VF+NF , - (0x19<<8) +XF +NF , - (0x20<<8) +YF +NF , - (0x21<<8) +YF +VF+NF , - (0x22<<8) +YF +VF+NF , - (0x23<<8) +YF +NF , - (0x24<<8) +YF +VF+NF , - (0x25<<8) +YF +NF , - (0x26<<8) +YF +NF , - (0x27<<8) +YF +VF+NF , - (0x28<<8) +YF +XF+VF+NF , - (0x29<<8) +YF +XF +NF , - (0x24<<8) +YF +VF+NF , - (0x25<<8) +YF +NF , - (0x26<<8) +YF +NF , - (0x27<<8) +YF +VF+NF , - (0x28<<8) +YF +XF+VF+NF , - (0x29<<8) +YF +XF +NF , - (0x30<<8) +YF +VF+NF , - (0x31<<8) +YF +NF , - (0x32<<8) +YF +NF , - (0x33<<8) +YF +VF+NF , - (0x34<<8) +YF +NF , - (0x35<<8) +YF +VF+NF , - (0x36<<8) +YF +VF+NF , - (0x37<<8) +YF +NF , - (0x38<<8) +YF +XF +NF , - (0x39<<8) +YF +XF+VF+NF , - (0x34<<8) +YF +NF , - (0x35<<8) +YF +VF+NF , - (0x36<<8) +YF +VF+NF , - (0x37<<8) +YF +NF , - (0x38<<8) +YF +XF +NF , - (0x39<<8) +YF +XF+VF+NF , - (0x40<<8) +NF , - (0x41<<8) +VF+NF , - (0x42<<8) +VF+NF , - (0x43<<8) +NF , - (0x44<<8) +VF+NF , - (0x45<<8) +NF , - (0x46<<8) +NF , - (0x47<<8) +VF+NF , - (0x48<<8) +XF+VF+NF , - (0x49<<8) +XF +NF , - (0x44<<8) +VF+NF , - (0x45<<8) +NF , - (0x46<<8) +NF , - (0x47<<8) +VF+NF , - (0x48<<8) +XF+VF+NF , - (0x49<<8) +XF +NF , - (0x50<<8) +VF+NF , - (0x51<<8) +NF , - (0x52<<8) +NF , - (0x53<<8) +VF+NF , - (0x54<<8) +NF , - (0x55<<8) +VF+NF , - (0x56<<8) +VF+NF , - (0x57<<8) +NF , - (0x58<<8) +XF +NF , - (0x59<<8) +XF+VF+NF , - (0x54<<8) +NF , - (0x55<<8) +VF+NF , - (0x56<<8) +VF+NF , - (0x57<<8) +NF , - (0x58<<8) +XF +NF , - (0x59<<8) +XF+VF+NF , - (0x60<<8) +YF +VF+NF , - (0x61<<8) +YF +NF , - (0x62<<8) +YF +NF , - (0x63<<8) +YF +VF+NF , - (0x64<<8) +YF +NF , - (0x65<<8) +YF +VF+NF , - (0x66<<8) +YF +VF+NF , - (0x67<<8) +YF +NF , - (0x68<<8) +YF +XF +NF , - (0x69<<8) +YF +XF+VF+NF , - (0x64<<8) +YF +NF , - (0x65<<8) +YF +VF+NF , - (0x66<<8) +YF +VF+NF , - (0x67<<8) +YF +NF , - (0x68<<8) +YF +XF +NF , - (0x69<<8) +YF +XF+VF+NF , - (0x70<<8) +YF +NF , - (0x71<<8) +YF +VF+NF , - (0x72<<8) +YF +VF+NF , - (0x73<<8) +YF +NF , - (0x74<<8) +YF +VF+NF , - (0x75<<8) +YF +NF , - (0x76<<8) +YF +NF , - (0x77<<8) +YF +VF+NF , - (0x78<<8) +YF +XF+VF+NF , - (0x79<<8) +YF +XF +NF , - (0x74<<8) +YF +VF+NF , - (0x75<<8) +YF +NF , - (0x76<<8) +YF +NF , - (0x77<<8) +YF +VF+NF , - (0x78<<8) +YF +XF+VF+NF , - (0x79<<8) +YF +XF +NF , - (0x80<<8)+SF +NF , - (0x81<<8)+SF +VF+NF , - (0x82<<8)+SF +VF+NF , - (0x83<<8)+SF +NF , - (0x84<<8)+SF +VF+NF , - (0x85<<8)+SF +NF , - (0x86<<8)+SF +NF , - (0x87<<8)+SF +VF+NF , - (0x88<<8)+SF +XF+VF+NF , - (0x89<<8)+SF +XF +NF , - (0x84<<8)+SF +VF+NF , - (0x85<<8)+SF +NF , - (0x86<<8)+SF +NF , - (0x87<<8)+SF +VF+NF , - (0x88<<8)+SF +XF+VF+NF , - (0x89<<8)+SF +XF +NF , - (0x90<<8)+SF +VF+NF , - (0x91<<8)+SF +NF , - (0x92<<8)+SF +NF , - (0x93<<8)+SF +VF+NF , - (0x94<<8)+SF +NF , - (0x95<<8)+SF +VF+NF , - (0x96<<8)+SF +VF+NF , - (0x97<<8)+SF +NF , - (0x98<<8)+SF +XF +NF , - (0x99<<8)+SF +XF+VF+NF , - (0x34<<8) +YF +NF+CF, - (0x35<<8) +YF +VF+NF+CF, - (0x36<<8) +YF +VF+NF+CF, - (0x37<<8) +YF +NF+CF, - (0x38<<8) +YF +XF +NF+CF, - (0x39<<8) +YF +XF+VF+NF+CF, - (0x40<<8) +NF+CF, - (0x41<<8) +VF+NF+CF, - (0x42<<8) +VF+NF+CF, - (0x43<<8) +NF+CF, - (0x44<<8) +VF+NF+CF, - (0x45<<8) +NF+CF, - (0x46<<8) +NF+CF, - (0x47<<8) +VF+NF+CF, - (0x48<<8) +XF+VF+NF+CF, - (0x49<<8) +XF +NF+CF, - (0x44<<8) +VF+NF+CF, - (0x45<<8) +NF+CF, - (0x46<<8) +NF+CF, - (0x47<<8) +VF+NF+CF, - (0x48<<8) +XF+VF+NF+CF, - (0x49<<8) +XF +NF+CF, - (0x50<<8) +VF+NF+CF, - (0x51<<8) +NF+CF, - (0x52<<8) +NF+CF, - (0x53<<8) +VF+NF+CF, - (0x54<<8) +NF+CF, - (0x55<<8) +VF+NF+CF, - (0x56<<8) +VF+NF+CF, - (0x57<<8) +NF+CF, - (0x58<<8) +XF +NF+CF, - (0x59<<8) +XF+VF+NF+CF, - (0x54<<8) +NF+CF, - (0x55<<8) +VF+NF+CF, - (0x56<<8) +VF+NF+CF, - (0x57<<8) +NF+CF, - (0x58<<8) +XF +NF+CF, - (0x59<<8) +XF+VF+NF+CF, - (0x60<<8) +YF +VF+NF+CF, - (0x61<<8) +YF +NF+CF, - (0x62<<8) +YF +NF+CF, - (0x63<<8) +YF +VF+NF+CF, - (0x64<<8) +YF +NF+CF, - (0x65<<8) +YF +VF+NF+CF, - (0x66<<8) +YF +VF+NF+CF, - (0x67<<8) +YF +NF+CF, - (0x68<<8) +YF +XF +NF+CF, - (0x69<<8) +YF +XF+VF+NF+CF, - (0x64<<8) +YF +NF+CF, - (0x65<<8) +YF +VF+NF+CF, - (0x66<<8) +YF +VF+NF+CF, - (0x67<<8) +YF +NF+CF, - (0x68<<8) +YF +XF +NF+CF, - (0x69<<8) +YF +XF+VF+NF+CF, - (0x70<<8) +YF +NF+CF, - (0x71<<8) +YF +VF+NF+CF, - (0x72<<8) +YF +VF+NF+CF, - (0x73<<8) +YF +NF+CF, - (0x74<<8) +YF +VF+NF+CF, - (0x75<<8) +YF +NF+CF, - (0x76<<8) +YF +NF+CF, - (0x77<<8) +YF +VF+NF+CF, - (0x78<<8) +YF +XF+VF+NF+CF, - (0x79<<8) +YF +XF +NF+CF, - (0x74<<8) +YF +VF+NF+CF, - (0x75<<8) +YF +NF+CF, - (0x76<<8) +YF +NF+CF, - (0x77<<8) +YF +VF+NF+CF, - (0x78<<8) +YF +XF+VF+NF+CF, - (0x79<<8) +YF +XF +NF+CF, - (0x80<<8)+SF +NF+CF, - (0x81<<8)+SF +VF+NF+CF, - (0x82<<8)+SF +VF+NF+CF, - (0x83<<8)+SF +NF+CF, - (0x84<<8)+SF +VF+NF+CF, - (0x85<<8)+SF +NF+CF, - (0x86<<8)+SF +NF+CF, - (0x87<<8)+SF +VF+NF+CF, - (0x88<<8)+SF +XF+VF+NF+CF, - (0x89<<8)+SF +XF +NF+CF, - (0x84<<8)+SF +VF+NF+CF, - (0x85<<8)+SF +NF+CF, - (0x86<<8)+SF +NF+CF, - (0x87<<8)+SF +VF+NF+CF, - (0x88<<8)+SF +XF+VF+NF+CF, - (0x89<<8)+SF +XF +NF+CF, - (0x90<<8)+SF +VF+NF+CF, - (0x91<<8)+SF +NF+CF, - (0x92<<8)+SF +NF+CF, - (0x93<<8)+SF +VF+NF+CF, - (0x94<<8)+SF +NF+CF, - (0x95<<8)+SF +VF+NF+CF, - (0x96<<8)+SF +VF+NF+CF, - (0x97<<8)+SF +NF+CF, - (0x98<<8)+SF +XF +NF+CF, - (0x99<<8)+SF +XF+VF+NF+CF, - (0x94<<8)+SF +NF+CF, - (0x95<<8)+SF +VF+NF+CF, - (0x96<<8)+SF +VF+NF+CF, - (0x97<<8)+SF +NF+CF, - (0x98<<8)+SF +XF +NF+CF, - (0x99<<8)+SF +XF+VF+NF+CF, - (0xA0<<8)+SF +YF +VF+NF+CF, - (0xA1<<8)+SF +YF +NF+CF, - (0xA2<<8)+SF +YF +NF+CF, - (0xA3<<8)+SF +YF +VF+NF+CF, - (0xA4<<8)+SF +YF +NF+CF, - (0xA5<<8)+SF +YF +VF+NF+CF, - (0xA6<<8)+SF +YF +VF+NF+CF, - (0xA7<<8)+SF +YF +NF+CF, - (0xA8<<8)+SF +YF +XF +NF+CF, - (0xA9<<8)+SF +YF +XF+VF+NF+CF, - (0xA4<<8)+SF +YF +NF+CF, - (0xA5<<8)+SF +YF +VF+NF+CF, - (0xA6<<8)+SF +YF +VF+NF+CF, - (0xA7<<8)+SF +YF +NF+CF, - (0xA8<<8)+SF +YF +XF +NF+CF, - (0xA9<<8)+SF +YF +XF+VF+NF+CF, - (0xB0<<8)+SF +YF +NF+CF, - (0xB1<<8)+SF +YF +VF+NF+CF, - (0xB2<<8)+SF +YF +VF+NF+CF, - (0xB3<<8)+SF +YF +NF+CF, - (0xB4<<8)+SF +YF +VF+NF+CF, - (0xB5<<8)+SF +YF +NF+CF, - (0xB6<<8)+SF +YF +NF+CF, - (0xB7<<8)+SF +YF +VF+NF+CF, - (0xB8<<8)+SF +YF +XF+VF+NF+CF, - (0xB9<<8)+SF +YF +XF +NF+CF, - (0xB4<<8)+SF +YF +VF+NF+CF, - (0xB5<<8)+SF +YF +NF+CF, - (0xB6<<8)+SF +YF +NF+CF, - (0xB7<<8)+SF +YF +VF+NF+CF, - (0xB8<<8)+SF +YF +XF+VF+NF+CF, - (0xB9<<8)+SF +YF +XF +NF+CF, - (0xC0<<8)+SF +VF+NF+CF, - (0xC1<<8)+SF +NF+CF, - (0xC2<<8)+SF +NF+CF, - (0xC3<<8)+SF +VF+NF+CF, - (0xC4<<8)+SF +NF+CF, - (0xC5<<8)+SF +VF+NF+CF, - (0xC6<<8)+SF +VF+NF+CF, - (0xC7<<8)+SF +NF+CF, - (0xC8<<8)+SF +XF +NF+CF, - (0xC9<<8)+SF +XF+VF+NF+CF, - (0xC4<<8)+SF +NF+CF, - (0xC5<<8)+SF +VF+NF+CF, - (0xC6<<8)+SF +VF+NF+CF, - (0xC7<<8)+SF +NF+CF, - (0xC8<<8)+SF +XF +NF+CF, - (0xC9<<8)+SF +XF+VF+NF+CF, - (0xD0<<8)+SF +NF+CF, - (0xD1<<8)+SF +VF+NF+CF, - (0xD2<<8)+SF +VF+NF+CF, - (0xD3<<8)+SF +NF+CF, - (0xD4<<8)+SF +VF+NF+CF, - (0xD5<<8)+SF +NF+CF, - (0xD6<<8)+SF +NF+CF, - (0xD7<<8)+SF +VF+NF+CF, - (0xD8<<8)+SF +XF+VF+NF+CF, - (0xD9<<8)+SF +XF +NF+CF, - (0xD4<<8)+SF +VF+NF+CF, - (0xD5<<8)+SF +NF+CF, - (0xD6<<8)+SF +NF+CF, - (0xD7<<8)+SF +VF+NF+CF, - (0xD8<<8)+SF +XF+VF+NF+CF, - (0xD9<<8)+SF +XF +NF+CF, - (0xE0<<8)+SF +YF +NF+CF, - (0xE1<<8)+SF +YF +VF+NF+CF, - (0xE2<<8)+SF +YF +VF+NF+CF, - (0xE3<<8)+SF +YF +NF+CF, - (0xE4<<8)+SF +YF +VF+NF+CF, - (0xE5<<8)+SF +YF +NF+CF, - (0xE6<<8)+SF +YF +NF+CF, - (0xE7<<8)+SF +YF +VF+NF+CF, - (0xE8<<8)+SF +YF +XF+VF+NF+CF, - (0xE9<<8)+SF +YF +XF +NF+CF, - (0xE4<<8)+SF +YF +VF+NF+CF, - (0xE5<<8)+SF +YF +NF+CF, - (0xE6<<8)+SF +YF +NF+CF, - (0xE7<<8)+SF +YF +VF+NF+CF, - (0xE8<<8)+SF +YF +XF+VF+NF+CF, - (0xE9<<8)+SF +YF +XF +NF+CF, - (0xF0<<8)+SF +YF +VF+NF+CF, - (0xF1<<8)+SF +YF +NF+CF, - (0xF2<<8)+SF +YF +NF+CF, - (0xF3<<8)+SF +YF +VF+NF+CF, - (0xF4<<8)+SF +YF +NF+CF, - (0xF5<<8)+SF +YF +VF+NF+CF, - (0xF6<<8)+SF +YF +VF+NF+CF, - (0xF7<<8)+SF +YF +NF+CF, - (0xF8<<8)+SF +YF +XF +NF+CF, - (0xF9<<8)+SF +YF +XF+VF+NF+CF, - (0xF4<<8)+SF +YF +NF+CF, - (0xF5<<8)+SF +YF +VF+NF+CF, - (0xF6<<8)+SF +YF +VF+NF+CF, - (0xF7<<8)+SF +YF +NF+CF, - (0xF8<<8)+SF +YF +XF +NF+CF, - (0xF9<<8)+SF +YF +XF+VF+NF+CF, - (0x00<<8) +ZF +VF+NF+CF, - (0x01<<8) +NF+CF, - (0x02<<8) +NF+CF, - (0x03<<8) +VF+NF+CF, - (0x04<<8) +NF+CF, - (0x05<<8) +VF+NF+CF, - (0x06<<8) +VF+NF+CF, - (0x07<<8) +NF+CF, - (0x08<<8) +XF +NF+CF, - (0x09<<8) +XF+VF+NF+CF, - (0x04<<8) +NF+CF, - (0x05<<8) +VF+NF+CF, - (0x06<<8) +VF+NF+CF, - (0x07<<8) +NF+CF, - (0x08<<8) +XF +NF+CF, - (0x09<<8) +XF+VF+NF+CF, - (0x10<<8) +NF+CF, - (0x11<<8) +VF+NF+CF, - (0x12<<8) +VF+NF+CF, - (0x13<<8) +NF+CF, - (0x14<<8) +VF+NF+CF, - (0x15<<8) +NF+CF, - (0x16<<8) +NF+CF, - (0x17<<8) +VF+NF+CF, - (0x18<<8) +XF+VF+NF+CF, - (0x19<<8) +XF +NF+CF, - (0x14<<8) +VF+NF+CF, - (0x15<<8) +NF+CF, - (0x16<<8) +NF+CF, - (0x17<<8) +VF+NF+CF, - (0x18<<8) +XF+VF+NF+CF, - (0x19<<8) +XF +NF+CF, - (0x20<<8) +YF +NF+CF, - (0x21<<8) +YF +VF+NF+CF, - (0x22<<8) +YF +VF+NF+CF, - (0x23<<8) +YF +NF+CF, - (0x24<<8) +YF +VF+NF+CF, - (0x25<<8) +YF +NF+CF, - (0x26<<8) +YF +NF+CF, - (0x27<<8) +YF +VF+NF+CF, - (0x28<<8) +YF +XF+VF+NF+CF, - (0x29<<8) +YF +XF +NF+CF, - (0x24<<8) +YF +VF+NF+CF, - (0x25<<8) +YF +NF+CF, - (0x26<<8) +YF +NF+CF, - (0x27<<8) +YF +VF+NF+CF, - (0x28<<8) +YF +XF+VF+NF+CF, - (0x29<<8) +YF +XF +NF+CF, - (0x30<<8) +YF +VF+NF+CF, - (0x31<<8) +YF +NF+CF, - (0x32<<8) +YF +NF+CF, - (0x33<<8) +YF +VF+NF+CF, - (0x34<<8) +YF +NF+CF, - (0x35<<8) +YF +VF+NF+CF, - (0x36<<8) +YF +VF+NF+CF, - (0x37<<8) +YF +NF+CF, - (0x38<<8) +YF +XF +NF+CF, - (0x39<<8) +YF +XF+VF+NF+CF, - (0x34<<8) +YF +NF+CF, - (0x35<<8) +YF +VF+NF+CF, - (0x36<<8) +YF +VF+NF+CF, - (0x37<<8) +YF +NF+CF, - (0x38<<8) +YF +XF +NF+CF, - (0x39<<8) +YF +XF+VF+NF+CF, - (0x40<<8) +NF+CF, - (0x41<<8) +VF+NF+CF, - (0x42<<8) +VF+NF+CF, - (0x43<<8) +NF+CF, - (0x44<<8) +VF+NF+CF, - (0x45<<8) +NF+CF, - (0x46<<8) +NF+CF, - (0x47<<8) +VF+NF+CF, - (0x48<<8) +XF+VF+NF+CF, - (0x49<<8) +XF +NF+CF, - (0x44<<8) +VF+NF+CF, - (0x45<<8) +NF+CF, - (0x46<<8) +NF+CF, - (0x47<<8) +VF+NF+CF, - (0x48<<8) +XF+VF+NF+CF, - (0x49<<8) +XF +NF+CF, - (0x50<<8) +VF+NF+CF, - (0x51<<8) +NF+CF, - (0x52<<8) +NF+CF, - (0x53<<8) +VF+NF+CF, - (0x54<<8) +NF+CF, - (0x55<<8) +VF+NF+CF, - (0x56<<8) +VF+NF+CF, - (0x57<<8) +NF+CF, - (0x58<<8) +XF +NF+CF, - (0x59<<8) +XF+VF+NF+CF, - (0x54<<8) +NF+CF, - (0x55<<8) +VF+NF+CF, - (0x56<<8) +VF+NF+CF, - (0x57<<8) +NF+CF, - (0x58<<8) +XF +NF+CF, - (0x59<<8) +XF+VF+NF+CF, - (0x60<<8) +YF +VF+NF+CF, - (0x61<<8) +YF +NF+CF, - (0x62<<8) +YF +NF+CF, - (0x63<<8) +YF +VF+NF+CF, - (0x64<<8) +YF +NF+CF, - (0x65<<8) +YF +VF+NF+CF, - (0x66<<8) +YF +VF+NF+CF, - (0x67<<8) +YF +NF+CF, - (0x68<<8) +YF +XF +NF+CF, - (0x69<<8) +YF +XF+VF+NF+CF, - (0x64<<8) +YF +NF+CF, - (0x65<<8) +YF +VF+NF+CF, - (0x66<<8) +YF +VF+NF+CF, - (0x67<<8) +YF +NF+CF, - (0x68<<8) +YF +XF +NF+CF, - (0x69<<8) +YF +XF+VF+NF+CF, - (0x70<<8) +YF +NF+CF, - (0x71<<8) +YF +VF+NF+CF, - (0x72<<8) +YF +VF+NF+CF, - (0x73<<8) +YF +NF+CF, - (0x74<<8) +YF +VF+NF+CF, - (0x75<<8) +YF +NF+CF, - (0x76<<8) +YF +NF+CF, - (0x77<<8) +YF +VF+NF+CF, - (0x78<<8) +YF +XF+VF+NF+CF, - (0x79<<8) +YF +XF +NF+CF, - (0x74<<8) +YF +VF+NF+CF, - (0x75<<8) +YF +NF+CF, - (0x76<<8) +YF +NF+CF, - (0x77<<8) +YF +VF+NF+CF, - (0x78<<8) +YF +XF+VF+NF+CF, - (0x79<<8) +YF +XF +NF+CF, - (0x80<<8)+SF +NF+CF, - (0x81<<8)+SF +VF+NF+CF, - (0x82<<8)+SF +VF+NF+CF, - (0x83<<8)+SF +NF+CF, - (0x84<<8)+SF +VF+NF+CF, - (0x85<<8)+SF +NF+CF, - (0x86<<8)+SF +NF+CF, - (0x87<<8)+SF +VF+NF+CF, - (0x88<<8)+SF +XF+VF+NF+CF, - (0x89<<8)+SF +XF +NF+CF, - (0x84<<8)+SF +VF+NF+CF, - (0x85<<8)+SF +NF+CF, - (0x86<<8)+SF +NF+CF, - (0x87<<8)+SF +VF+NF+CF, - (0x88<<8)+SF +XF+VF+NF+CF, - (0x89<<8)+SF +XF +NF+CF, - (0x90<<8)+SF +VF+NF+CF, - (0x91<<8)+SF +NF+CF, - (0x92<<8)+SF +NF+CF, - (0x93<<8)+SF +VF+NF+CF, - (0x94<<8)+SF +NF+CF, - (0x95<<8)+SF +VF+NF+CF, - (0x96<<8)+SF +VF+NF+CF, - (0x97<<8)+SF +NF+CF, - (0x98<<8)+SF +XF +NF+CF, - (0x99<<8)+SF +XF+VF+NF+CF, - (0x94<<8)+SF +NF+CF, - (0x95<<8)+SF +VF+NF+CF, - (0x96<<8)+SF +VF+NF+CF, - (0x97<<8)+SF +NF+CF, - (0x98<<8)+SF +XF +NF+CF, - (0x99<<8)+SF +XF+VF+NF+CF, - (0xFA<<8)+SF +YF+HF+XF+VF+NF , - (0xFB<<8)+SF +YF+HF+XF +NF , - (0xFC<<8)+SF +YF+HF+XF+VF+NF , - (0xFD<<8)+SF +YF+HF+XF +NF , - (0xFE<<8)+SF +YF+HF+XF +NF , - (0xFF<<8)+SF +YF+HF+XF+VF+NF , - (0x00<<8) +ZF +VF+NF , - (0x01<<8) +NF , - (0x02<<8) +NF , - (0x03<<8) +VF+NF , - (0x04<<8) +NF , - (0x05<<8) +VF+NF , - (0x06<<8) +VF+NF , - (0x07<<8) +NF , - (0x08<<8) +XF +NF , - (0x09<<8) +XF+VF+NF , - (0x0A<<8) +HF+XF+VF+NF , - (0x0B<<8) +HF+XF +NF , - (0x0C<<8) +HF+XF+VF+NF , - (0x0D<<8) +HF+XF +NF , - (0x0E<<8) +HF+XF +NF , - (0x0F<<8) +HF+XF+VF+NF , - (0x10<<8) +NF , - (0x11<<8) +VF+NF , - (0x12<<8) +VF+NF , - (0x13<<8) +NF , - (0x14<<8) +VF+NF , - (0x15<<8) +NF , - (0x16<<8) +NF , - (0x17<<8) +VF+NF , - (0x18<<8) +XF+VF+NF , - (0x19<<8) +XF +NF , - (0x1A<<8) +HF+XF +NF , - (0x1B<<8) +HF+XF+VF+NF , - (0x1C<<8) +HF+XF +NF , - (0x1D<<8) +HF+XF+VF+NF , - (0x1E<<8) +HF+XF+VF+NF , - (0x1F<<8) +HF+XF +NF , - (0x20<<8) +YF +NF , - (0x21<<8) +YF +VF+NF , - (0x22<<8) +YF +VF+NF , - (0x23<<8) +YF +NF , - (0x24<<8) +YF +VF+NF , - (0x25<<8) +YF +NF , - (0x26<<8) +YF +NF , - (0x27<<8) +YF +VF+NF , - (0x28<<8) +YF +XF+VF+NF , - (0x29<<8) +YF +XF +NF , - (0x2A<<8) +YF+HF+XF +NF , - (0x2B<<8) +YF+HF+XF+VF+NF , - (0x2C<<8) +YF+HF+XF +NF , - (0x2D<<8) +YF+HF+XF+VF+NF , - (0x2E<<8) +YF+HF+XF+VF+NF , - (0x2F<<8) +YF+HF+XF +NF , - (0x30<<8) +YF +VF+NF , - (0x31<<8) +YF +NF , - (0x32<<8) +YF +NF , - (0x33<<8) +YF +VF+NF , - (0x34<<8) +YF +NF , - (0x35<<8) +YF +VF+NF , - (0x36<<8) +YF +VF+NF , - (0x37<<8) +YF +NF , - (0x38<<8) +YF +XF +NF , - (0x39<<8) +YF +XF+VF+NF , - (0x3A<<8) +YF+HF+XF+VF+NF , - (0x3B<<8) +YF+HF+XF +NF , - (0x3C<<8) +YF+HF+XF+VF+NF , - (0x3D<<8) +YF+HF+XF +NF , - (0x3E<<8) +YF+HF+XF +NF , - (0x3F<<8) +YF+HF+XF+VF+NF , - (0x40<<8) +NF , - (0x41<<8) +VF+NF , - (0x42<<8) +VF+NF , - (0x43<<8) +NF , - (0x44<<8) +VF+NF , - (0x45<<8) +NF , - (0x46<<8) +NF , - (0x47<<8) +VF+NF , - (0x48<<8) +XF+VF+NF , - (0x49<<8) +XF +NF , - (0x4A<<8) +HF+XF +NF , - (0x4B<<8) +HF+XF+VF+NF , - (0x4C<<8) +HF+XF +NF , - (0x4D<<8) +HF+XF+VF+NF , - (0x4E<<8) +HF+XF+VF+NF , - (0x4F<<8) +HF+XF +NF , - (0x50<<8) +VF+NF , - (0x51<<8) +NF , - (0x52<<8) +NF , - (0x53<<8) +VF+NF , - (0x54<<8) +NF , - (0x55<<8) +VF+NF , - (0x56<<8) +VF+NF , - (0x57<<8) +NF , - (0x58<<8) +XF +NF , - (0x59<<8) +XF+VF+NF , - (0x5A<<8) +HF+XF+VF+NF , - (0x5B<<8) +HF+XF +NF , - (0x5C<<8) +HF+XF+VF+NF , - (0x5D<<8) +HF+XF +NF , - (0x5E<<8) +HF+XF +NF , - (0x5F<<8) +HF+XF+VF+NF , - (0x60<<8) +YF +VF+NF , - (0x61<<8) +YF +NF , - (0x62<<8) +YF +NF , - (0x63<<8) +YF +VF+NF , - (0x64<<8) +YF +NF , - (0x65<<8) +YF +VF+NF , - (0x66<<8) +YF +VF+NF , - (0x67<<8) +YF +NF , - (0x68<<8) +YF +XF +NF , - (0x69<<8) +YF +XF+VF+NF , - (0x6A<<8) +YF+HF+XF+VF+NF , - (0x6B<<8) +YF+HF+XF +NF , - (0x6C<<8) +YF+HF+XF+VF+NF , - (0x6D<<8) +YF+HF+XF +NF , - (0x6E<<8) +YF+HF+XF +NF , - (0x6F<<8) +YF+HF+XF+VF+NF , - (0x70<<8) +YF +NF , - (0x71<<8) +YF +VF+NF , - (0x72<<8) +YF +VF+NF , - (0x73<<8) +YF +NF , - (0x74<<8) +YF +VF+NF , - (0x75<<8) +YF +NF , - (0x76<<8) +YF +NF , - (0x77<<8) +YF +VF+NF , - (0x78<<8) +YF +XF+VF+NF , - (0x79<<8) +YF +XF +NF , - (0x7A<<8) +YF+HF+XF +NF , - (0x7B<<8) +YF+HF+XF+VF+NF , - (0x7C<<8) +YF+HF+XF +NF , - (0x7D<<8) +YF+HF+XF+VF+NF , - (0x7E<<8) +YF+HF+XF+VF+NF , - (0x7F<<8) +YF+HF+XF +NF , - (0x80<<8)+SF +NF , - (0x81<<8)+SF +VF+NF , - (0x82<<8)+SF +VF+NF , - (0x83<<8)+SF +NF , - (0x84<<8)+SF +VF+NF , - (0x85<<8)+SF +NF , - (0x86<<8)+SF +NF , - (0x87<<8)+SF +VF+NF , - (0x88<<8)+SF +XF+VF+NF , - (0x89<<8)+SF +XF +NF , - (0x8A<<8)+SF +HF+XF +NF , - (0x8B<<8)+SF +HF+XF+VF+NF , - (0x8C<<8)+SF +HF+XF +NF , - (0x8D<<8)+SF +HF+XF+VF+NF , - (0x8E<<8)+SF +HF+XF+VF+NF , - (0x8F<<8)+SF +HF+XF +NF , - (0x90<<8)+SF +VF+NF , - (0x91<<8)+SF +NF , - (0x92<<8)+SF +NF , - (0x93<<8)+SF +VF+NF , - (0x34<<8) +YF +NF+CF, - (0x35<<8) +YF +VF+NF+CF, - (0x36<<8) +YF +VF+NF+CF, - (0x37<<8) +YF +NF+CF, - (0x38<<8) +YF +XF +NF+CF, - (0x39<<8) +YF +XF+VF+NF+CF, - (0x3A<<8) +YF+HF+XF+VF+NF+CF, - (0x3B<<8) +YF+HF+XF +NF+CF, - (0x3C<<8) +YF+HF+XF+VF+NF+CF, - (0x3D<<8) +YF+HF+XF +NF+CF, - (0x3E<<8) +YF+HF+XF +NF+CF, - (0x3F<<8) +YF+HF+XF+VF+NF+CF, - (0x40<<8) +NF+CF, - (0x41<<8) +VF+NF+CF, - (0x42<<8) +VF+NF+CF, - (0x43<<8) +NF+CF, - (0x44<<8) +VF+NF+CF, - (0x45<<8) +NF+CF, - (0x46<<8) +NF+CF, - (0x47<<8) +VF+NF+CF, - (0x48<<8) +XF+VF+NF+CF, - (0x49<<8) +XF +NF+CF, - (0x4A<<8) +HF+XF +NF+CF, - (0x4B<<8) +HF+XF+VF+NF+CF, - (0x4C<<8) +HF+XF +NF+CF, - (0x4D<<8) +HF+XF+VF+NF+CF, - (0x4E<<8) +HF+XF+VF+NF+CF, - (0x4F<<8) +HF+XF +NF+CF, - (0x50<<8) +VF+NF+CF, - (0x51<<8) +NF+CF, - (0x52<<8) +NF+CF, - (0x53<<8) +VF+NF+CF, - (0x54<<8) +NF+CF, - (0x55<<8) +VF+NF+CF, - (0x56<<8) +VF+NF+CF, - (0x57<<8) +NF+CF, - (0x58<<8) +XF +NF+CF, - (0x59<<8) +XF+VF+NF+CF, - (0x5A<<8) +HF+XF+VF+NF+CF, - (0x5B<<8) +HF+XF +NF+CF, - (0x5C<<8) +HF+XF+VF+NF+CF, - (0x5D<<8) +HF+XF +NF+CF, - (0x5E<<8) +HF+XF +NF+CF, - (0x5F<<8) +HF+XF+VF+NF+CF, - (0x60<<8) +YF +VF+NF+CF, - (0x61<<8) +YF +NF+CF, - (0x62<<8) +YF +NF+CF, - (0x63<<8) +YF +VF+NF+CF, - (0x64<<8) +YF +NF+CF, - (0x65<<8) +YF +VF+NF+CF, - (0x66<<8) +YF +VF+NF+CF, - (0x67<<8) +YF +NF+CF, - (0x68<<8) +YF +XF +NF+CF, - (0x69<<8) +YF +XF+VF+NF+CF, - (0x6A<<8) +YF+HF+XF+VF+NF+CF, - (0x6B<<8) +YF+HF+XF +NF+CF, - (0x6C<<8) +YF+HF+XF+VF+NF+CF, - (0x6D<<8) +YF+HF+XF +NF+CF, - (0x6E<<8) +YF+HF+XF +NF+CF, - (0x6F<<8) +YF+HF+XF+VF+NF+CF, - (0x70<<8) +YF +NF+CF, - (0x71<<8) +YF +VF+NF+CF, - (0x72<<8) +YF +VF+NF+CF, - (0x73<<8) +YF +NF+CF, - (0x74<<8) +YF +VF+NF+CF, - (0x75<<8) +YF +NF+CF, - (0x76<<8) +YF +NF+CF, - (0x77<<8) +YF +VF+NF+CF, - (0x78<<8) +YF +XF+VF+NF+CF, - (0x79<<8) +YF +XF +NF+CF, - (0x7A<<8) +YF+HF+XF +NF+CF, - (0x7B<<8) +YF+HF+XF+VF+NF+CF, - (0x7C<<8) +YF+HF+XF +NF+CF, - (0x7D<<8) +YF+HF+XF+VF+NF+CF, - (0x7E<<8) +YF+HF+XF+VF+NF+CF, - (0x7F<<8) +YF+HF+XF +NF+CF, - (0x80<<8)+SF +NF+CF, - (0x81<<8)+SF +VF+NF+CF, - (0x82<<8)+SF +VF+NF+CF, - (0x83<<8)+SF +NF+CF, - (0x84<<8)+SF +VF+NF+CF, - (0x85<<8)+SF +NF+CF, - (0x86<<8)+SF +NF+CF, - (0x87<<8)+SF +VF+NF+CF, - (0x88<<8)+SF +XF+VF+NF+CF, - (0x89<<8)+SF +XF +NF+CF, - (0x8A<<8)+SF +HF+XF +NF+CF, - (0x8B<<8)+SF +HF+XF+VF+NF+CF, - (0x8C<<8)+SF +HF+XF +NF+CF, - (0x8D<<8)+SF +HF+XF+VF+NF+CF, - (0x8E<<8)+SF +HF+XF+VF+NF+CF, - (0x8F<<8)+SF +HF+XF +NF+CF, - (0x90<<8)+SF +VF+NF+CF, - (0x91<<8)+SF +NF+CF, - (0x92<<8)+SF +NF+CF, - (0x93<<8)+SF +VF+NF+CF, - (0x94<<8)+SF +NF+CF, - (0x95<<8)+SF +VF+NF+CF, - (0x96<<8)+SF +VF+NF+CF, - (0x97<<8)+SF +NF+CF, - (0x98<<8)+SF +XF +NF+CF, - (0x99<<8)+SF +XF+VF+NF+CF, - (0x9A<<8)+SF +HF+XF+VF+NF+CF, - (0x9B<<8)+SF +HF+XF +NF+CF, - (0x9C<<8)+SF +HF+XF+VF+NF+CF, - (0x9D<<8)+SF +HF+XF +NF+CF, - (0x9E<<8)+SF +HF+XF +NF+CF, - (0x9F<<8)+SF +HF+XF+VF+NF+CF, - (0xA0<<8)+SF +YF +VF+NF+CF, - (0xA1<<8)+SF +YF +NF+CF, - (0xA2<<8)+SF +YF +NF+CF, - (0xA3<<8)+SF +YF +VF+NF+CF, - (0xA4<<8)+SF +YF +NF+CF, - (0xA5<<8)+SF +YF +VF+NF+CF, - (0xA6<<8)+SF +YF +VF+NF+CF, - (0xA7<<8)+SF +YF +NF+CF, - (0xA8<<8)+SF +YF +XF +NF+CF, - (0xA9<<8)+SF +YF +XF+VF+NF+CF, - (0xAA<<8)+SF +YF+HF+XF+VF+NF+CF, - (0xAB<<8)+SF +YF+HF+XF +NF+CF, - (0xAC<<8)+SF +YF+HF+XF+VF+NF+CF, - (0xAD<<8)+SF +YF+HF+XF +NF+CF, - (0xAE<<8)+SF +YF+HF+XF +NF+CF, - (0xAF<<8)+SF +YF+HF+XF+VF+NF+CF, - (0xB0<<8)+SF +YF +NF+CF, - (0xB1<<8)+SF +YF +VF+NF+CF, - (0xB2<<8)+SF +YF +VF+NF+CF, - (0xB3<<8)+SF +YF +NF+CF, - (0xB4<<8)+SF +YF +VF+NF+CF, - (0xB5<<8)+SF +YF +NF+CF, - (0xB6<<8)+SF +YF +NF+CF, - (0xB7<<8)+SF +YF +VF+NF+CF, - (0xB8<<8)+SF +YF +XF+VF+NF+CF, - (0xB9<<8)+SF +YF +XF +NF+CF, - (0xBA<<8)+SF +YF+HF+XF +NF+CF, - (0xBB<<8)+SF +YF+HF+XF+VF+NF+CF, - (0xBC<<8)+SF +YF+HF+XF +NF+CF, - (0xBD<<8)+SF +YF+HF+XF+VF+NF+CF, - (0xBE<<8)+SF +YF+HF+XF+VF+NF+CF, - (0xBF<<8)+SF +YF+HF+XF +NF+CF, - (0xC0<<8)+SF +VF+NF+CF, - (0xC1<<8)+SF +NF+CF, - (0xC2<<8)+SF +NF+CF, - (0xC3<<8)+SF +VF+NF+CF, - (0xC4<<8)+SF +NF+CF, - (0xC5<<8)+SF +VF+NF+CF, - (0xC6<<8)+SF +VF+NF+CF, - (0xC7<<8)+SF +NF+CF, - (0xC8<<8)+SF +XF +NF+CF, - (0xC9<<8)+SF +XF+VF+NF+CF, - (0xCA<<8)+SF +HF+XF+VF+NF+CF, - (0xCB<<8)+SF +HF+XF +NF+CF, - (0xCC<<8)+SF +HF+XF+VF+NF+CF, - (0xCD<<8)+SF +HF+XF +NF+CF, - (0xCE<<8)+SF +HF+XF +NF+CF, - (0xCF<<8)+SF +HF+XF+VF+NF+CF, - (0xD0<<8)+SF +NF+CF, - (0xD1<<8)+SF +VF+NF+CF, - (0xD2<<8)+SF +VF+NF+CF, - (0xD3<<8)+SF +NF+CF, - (0xD4<<8)+SF +VF+NF+CF, - (0xD5<<8)+SF +NF+CF, - (0xD6<<8)+SF +NF+CF, - (0xD7<<8)+SF +VF+NF+CF, - (0xD8<<8)+SF +XF+VF+NF+CF, - (0xD9<<8)+SF +XF +NF+CF, - (0xDA<<8)+SF +HF+XF +NF+CF, - (0xDB<<8)+SF +HF+XF+VF+NF+CF, - (0xDC<<8)+SF +HF+XF +NF+CF, - (0xDD<<8)+SF +HF+XF+VF+NF+CF, - (0xDE<<8)+SF +HF+XF+VF+NF+CF, - (0xDF<<8)+SF +HF+XF +NF+CF, - (0xE0<<8)+SF +YF +NF+CF, - (0xE1<<8)+SF +YF +VF+NF+CF, - (0xE2<<8)+SF +YF +VF+NF+CF, - (0xE3<<8)+SF +YF +NF+CF, - (0xE4<<8)+SF +YF +VF+NF+CF, - (0xE5<<8)+SF +YF +NF+CF, - (0xE6<<8)+SF +YF +NF+CF, - (0xE7<<8)+SF +YF +VF+NF+CF, - (0xE8<<8)+SF +YF +XF+VF+NF+CF, - (0xE9<<8)+SF +YF +XF +NF+CF, - (0xEA<<8)+SF +YF+HF+XF +NF+CF, - (0xEB<<8)+SF +YF+HF+XF+VF+NF+CF, - (0xEC<<8)+SF +YF+HF+XF +NF+CF, - (0xED<<8)+SF +YF+HF+XF+VF+NF+CF, - (0xEE<<8)+SF +YF+HF+XF+VF+NF+CF, - (0xEF<<8)+SF +YF+HF+XF +NF+CF, - (0xF0<<8)+SF +YF +VF+NF+CF, - (0xF1<<8)+SF +YF +NF+CF, - (0xF2<<8)+SF +YF +NF+CF, - (0xF3<<8)+SF +YF +VF+NF+CF, - (0xF4<<8)+SF +YF +NF+CF, - (0xF5<<8)+SF +YF +VF+NF+CF, - (0xF6<<8)+SF +YF +VF+NF+CF, - (0xF7<<8)+SF +YF +NF+CF, - (0xF8<<8)+SF +YF +XF +NF+CF, - (0xF9<<8)+SF +YF +XF+VF+NF+CF, - (0xFA<<8)+SF +YF+HF+XF+VF+NF+CF, - (0xFB<<8)+SF +YF+HF+XF +NF+CF, - (0xFC<<8)+SF +YF+HF+XF+VF+NF+CF, - (0xFD<<8)+SF +YF+HF+XF +NF+CF, - (0xFE<<8)+SF +YF+HF+XF +NF+CF, - (0xFF<<8)+SF +YF+HF+XF+VF+NF+CF, - (0x00<<8) +ZF +VF+NF+CF, - (0x01<<8) +NF+CF, - (0x02<<8) +NF+CF, - (0x03<<8) +VF+NF+CF, - (0x04<<8) +NF+CF, - (0x05<<8) +VF+NF+CF, - (0x06<<8) +VF+NF+CF, - (0x07<<8) +NF+CF, - (0x08<<8) +XF +NF+CF, - (0x09<<8) +XF+VF+NF+CF, - (0x0A<<8) +HF+XF+VF+NF+CF, - (0x0B<<8) +HF+XF +NF+CF, - (0x0C<<8) +HF+XF+VF+NF+CF, - (0x0D<<8) +HF+XF +NF+CF, - (0x0E<<8) +HF+XF +NF+CF, - (0x0F<<8) +HF+XF+VF+NF+CF, - (0x10<<8) +NF+CF, - (0x11<<8) +VF+NF+CF, - (0x12<<8) +VF+NF+CF, - (0x13<<8) +NF+CF, - (0x14<<8) +VF+NF+CF, - (0x15<<8) +NF+CF, - (0x16<<8) +NF+CF, - (0x17<<8) +VF+NF+CF, - (0x18<<8) +XF+VF+NF+CF, - (0x19<<8) +XF +NF+CF, - (0x1A<<8) +HF+XF +NF+CF, - (0x1B<<8) +HF+XF+VF+NF+CF, - (0x1C<<8) +HF+XF +NF+CF, - (0x1D<<8) +HF+XF+VF+NF+CF, - (0x1E<<8) +HF+XF+VF+NF+CF, - (0x1F<<8) +HF+XF +NF+CF, - (0x20<<8) +YF +NF+CF, - (0x21<<8) +YF +VF+NF+CF, - (0x22<<8) +YF +VF+NF+CF, - (0x23<<8) +YF +NF+CF, - (0x24<<8) +YF +VF+NF+CF, - (0x25<<8) +YF +NF+CF, - (0x26<<8) +YF +NF+CF, - (0x27<<8) +YF +VF+NF+CF, - (0x28<<8) +YF +XF+VF+NF+CF, - (0x29<<8) +YF +XF +NF+CF, - (0x2A<<8) +YF+HF+XF +NF+CF, - (0x2B<<8) +YF+HF+XF+VF+NF+CF, - (0x2C<<8) +YF+HF+XF +NF+CF, - (0x2D<<8) +YF+HF+XF+VF+NF+CF, - (0x2E<<8) +YF+HF+XF+VF+NF+CF, - (0x2F<<8) +YF+HF+XF +NF+CF, - (0x30<<8) +YF +VF+NF+CF, - (0x31<<8) +YF +NF+CF, - (0x32<<8) +YF +NF+CF, - (0x33<<8) +YF +VF+NF+CF, - (0x34<<8) +YF +NF+CF, - (0x35<<8) +YF +VF+NF+CF, - (0x36<<8) +YF +VF+NF+CF, - (0x37<<8) +YF +NF+CF, - (0x38<<8) +YF +XF +NF+CF, - (0x39<<8) +YF +XF+VF+NF+CF, - (0x3A<<8) +YF+HF+XF+VF+NF+CF, - (0x3B<<8) +YF+HF+XF +NF+CF, - (0x3C<<8) +YF+HF+XF+VF+NF+CF, - (0x3D<<8) +YF+HF+XF +NF+CF, - (0x3E<<8) +YF+HF+XF +NF+CF, - (0x3F<<8) +YF+HF+XF+VF+NF+CF, - (0x40<<8) +NF+CF, - (0x41<<8) +VF+NF+CF, - (0x42<<8) +VF+NF+CF, - (0x43<<8) +NF+CF, - (0x44<<8) +VF+NF+CF, - (0x45<<8) +NF+CF, - (0x46<<8) +NF+CF, - (0x47<<8) +VF+NF+CF, - (0x48<<8) +XF+VF+NF+CF, - (0x49<<8) +XF +NF+CF, - (0x4A<<8) +HF+XF +NF+CF, - (0x4B<<8) +HF+XF+VF+NF+CF, - (0x4C<<8) +HF+XF +NF+CF, - (0x4D<<8) +HF+XF+VF+NF+CF, - (0x4E<<8) +HF+XF+VF+NF+CF, - (0x4F<<8) +HF+XF +NF+CF, - (0x50<<8) +VF+NF+CF, - (0x51<<8) +NF+CF, - (0x52<<8) +NF+CF, - (0x53<<8) +VF+NF+CF, - (0x54<<8) +NF+CF, - (0x55<<8) +VF+NF+CF, - (0x56<<8) +VF+NF+CF, - (0x57<<8) +NF+CF, - (0x58<<8) +XF +NF+CF, - (0x59<<8) +XF+VF+NF+CF, - (0x5A<<8) +HF+XF+VF+NF+CF, - (0x5B<<8) +HF+XF +NF+CF, - (0x5C<<8) +HF+XF+VF+NF+CF, - (0x5D<<8) +HF+XF +NF+CF, - (0x5E<<8) +HF+XF +NF+CF, - (0x5F<<8) +HF+XF+VF+NF+CF, - (0x60<<8) +YF +VF+NF+CF, - (0x61<<8) +YF +NF+CF, - (0x62<<8) +YF +NF+CF, - (0x63<<8) +YF +VF+NF+CF, - (0x64<<8) +YF +NF+CF, - (0x65<<8) +YF +VF+NF+CF, - (0x66<<8) +YF +VF+NF+CF, - (0x67<<8) +YF +NF+CF, - (0x68<<8) +YF +XF +NF+CF, - (0x69<<8) +YF +XF+VF+NF+CF, - (0x6A<<8) +YF+HF+XF+VF+NF+CF, - (0x6B<<8) +YF+HF+XF +NF+CF, - (0x6C<<8) +YF+HF+XF+VF+NF+CF, - (0x6D<<8) +YF+HF+XF +NF+CF, - (0x6E<<8) +YF+HF+XF +NF+CF, - (0x6F<<8) +YF+HF+XF+VF+NF+CF, - (0x70<<8) +YF +NF+CF, - (0x71<<8) +YF +VF+NF+CF, - (0x72<<8) +YF +VF+NF+CF, - (0x73<<8) +YF +NF+CF, - (0x74<<8) +YF +VF+NF+CF, - (0x75<<8) +YF +NF+CF, - (0x76<<8) +YF +NF+CF, - (0x77<<8) +YF +VF+NF+CF, - (0x78<<8) +YF +XF+VF+NF+CF, - (0x79<<8) +YF +XF +NF+CF, - (0x7A<<8) +YF+HF+XF +NF+CF, - (0x7B<<8) +YF+HF+XF+VF+NF+CF, - (0x7C<<8) +YF+HF+XF +NF+CF, - (0x7D<<8) +YF+HF+XF+VF+NF+CF, - (0x7E<<8) +YF+HF+XF+VF+NF+CF, - (0x7F<<8) +YF+HF+XF +NF+CF, - (0x80<<8)+SF +NF+CF, - (0x81<<8)+SF +VF+NF+CF, - (0x82<<8)+SF +VF+NF+CF, - (0x83<<8)+SF +NF+CF, - (0x84<<8)+SF +VF+NF+CF, - (0x85<<8)+SF +NF+CF, - (0x86<<8)+SF +NF+CF, - (0x87<<8)+SF +VF+NF+CF, - (0x88<<8)+SF +XF+VF+NF+CF, - (0x89<<8)+SF +XF +NF+CF, - (0x8A<<8)+SF +HF+XF +NF+CF, - (0x8B<<8)+SF +HF+XF+VF+NF+CF, - (0x8C<<8)+SF +HF+XF +NF+CF, - (0x8D<<8)+SF +HF+XF+VF+NF+CF, - (0x8E<<8)+SF +HF+XF+VF+NF+CF, - (0x8F<<8)+SF +HF+XF +NF+CF, - (0x90<<8)+SF +VF+NF+CF, - (0x91<<8)+SF +NF+CF, - (0x92<<8)+SF +NF+CF, - (0x93<<8)+SF +VF+NF+CF, - (0x94<<8)+SF +NF+CF, - (0x95<<8)+SF +VF+NF+CF, - (0x96<<8)+SF +VF+NF+CF, - (0x97<<8)+SF +NF+CF, - (0x98<<8)+SF +XF +NF+CF, - (0x99<<8)+SF +XF+VF+NF+CF -}; - diff --git a/source/doc/license b/source/doc/license index 60549be..f89b4fa 100644 --- a/source/doc/license +++ b/source/doc/license @@ -1,340 +1,340 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/source/genesis.c b/source/genesis.c index 72d20d1..761b8a3 100644 --- a/source/genesis.c +++ b/source/genesis.c @@ -1,90 +1,151 @@ -/* - Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - - 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ +/*************************************************************************************** + * Genesis Plus 1.2a + * Genesis internals & Bus arbitration + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ #include "shared.h" uint8 *cart_rom; /* cart_rom NEED to be previously dynamically allocated */ -uint8 work_ram[0x10000]; /* 68K work RAM */ -uint8 zram[0x2000]; /* Z80 work RAM */ -uint8 zbusreq; /* /BUSREQ from Z80 */ -uint8 zreset; /* /RESET to Z80 */ -uint8 zbusack; /* /BUSACK to Z80 */ -uint8 zirq; /* /IRQ to Z80 */ -uint32 zbank; /* Address of Z80 bank window */ +uint8 bios_rom[0x800]; +uint8 work_ram[0x10000]; /* 68K work RAM */ +uint8 zram[0x2000]; /* Z80 work RAM */ +uint8 zbusreq; /* /BUSREQ from Z80 */ +uint8 zreset; /* /RESET to Z80 */ +uint8 zbusack; /* /BUSACK to Z80 */ +uint8 zirq; /* /IRQ to Z80 */ +uint32 zbank; /* Address of Z80 bank window */ uint8 gen_running; -uint32 lastbusreqcnt; -uint8 lastbusack; uint32 genromsize; - -static int cpu_sync[512]; /* Z80-68K cycles synchronization table */ - -#ifdef LSB_FIRST -void bswap(uint8 *mem, int length) -{ - int i; - for(i = 0; i < length; i += 2) - { - uint8 temp = mem[i+0]; - mem[i+0] = mem[i+1]; - mem[i+1] = temp; - } -} -#endif +uint32 rom_size; +int32 resetline; +uint8 *rom_readmap[8]; /*--------------------------------------------------------------------------*/ /* Init, reset, shutdown functions */ /*--------------------------------------------------------------------------*/ +void set_softreset(void) +{ + resetline = (int) ((double) (lines_per_frame - 1) * rand() / (RAND_MAX + 1.0)); +} void gen_init (void) { int i; -#ifdef LSB_FIRST - bswap(cart_rom, genromsize); -#endif -#ifdef NGC - ShadowROM (); -#else - memcpy(shadow_rom,cart_rom,genromsize); -#endif + + /* initialize CPUs */ m68k_set_cpu_type (M68K_CPU_TYPE_68000); - m68k_pulse_reset (); - gen_running = 1; - for (i=0; i<512; i++) cpu_sync[i] = (int)(((double)i * 7.0) / 15.0); + m68k_init(); + z80_init(0,0,0,z80_irq_callback); + + /* default 68000 mapping */ + for (i=16; i<24; i++) + { + m68k_readmap_8[i] = ILLEGAL; + m68k_readmap_16[i] = ILLEGAL; + m68k_writemap_8[i] = ILLEGAL; + m68k_writemap_16[i] = ILLEGAL; + } + + /* Z80, I/O, CONTROL */ + m68k_readmap_8[20] = SYSTEM_IO; + m68k_readmap_16[20] = SYSTEM_IO; + m68k_writemap_8[20] = SYSTEM_IO; + m68k_writemap_16[20] = SYSTEM_IO; + + /* SEGA PICO */ + if (system_hw == SYSTEM_PICO) + { + m68k_readmap_8[16] = PICO_HW; + m68k_readmap_16[16] = PICO_HW; + m68k_writemap_8[16] = PICO_HW; + m68k_writemap_16[16] = PICO_HW; + + /* Notaz: there is no IO CONTROL area (Z80/YM2612/IO) */ + m68k_readmap_8[20] = UNUSED; + m68k_readmap_16[20] = UNUSED; + m68k_writemap_8[20] = UNUSED; + m68k_writemap_16[20] = UNUSED; + } + + /* VDP */ + for (i=24; i<28; i++) + { + m68k_readmap_8[i] = VDP; + m68k_readmap_16[i] = VDP; + m68k_writemap_8[i] = VDP; + m68k_writemap_16[i] = VDP; + } + + /* WRAM */ + for (i=28; i<32; i++) + { + m68k_readmap_8[i] = WRAM; + m68k_readmap_16[i] = WRAM; + m68k_writemap_8[i] = WRAM; + m68k_writemap_16[i] = WRAM; + } } -void gen_reset (void) +void gen_reset (unsigned int hard_reset) { - /* Clear RAM */ - memset (work_ram, 0, sizeof (work_ram)); - memset (zram, 0, sizeof (zram)); - gen_running = 1; - zreset = 0; /* Z80 is reset */ - zbusreq = 0; /* Z80 has control of the Z bus */ - zbusack = 1; /* Z80 is busy using the Z bus */ - zbank = 0; /* Assume default bank is 000000-007FFF */ - zirq = 0; /* No interrupts occuring */ - lastbusreqcnt = 0; - lastbusack = 1; + if (hard_reset) + { + /* Clear RAM */ + memset (work_ram, 0, sizeof (work_ram)); + memset (zram, 0, sizeof (zram)); - /* Reset the 68000 emulator */ + /* Reset ROM mapping */ + if (config.bios_enabled == 3) + { + rom_readmap[0] = &bios_rom[0]; + rom_size = 0x800; + } + else + { + rom_readmap[0] = &cart_rom[0]; + rom_size = genromsize; + } + + uint8 i; + for (i=1; i<8; i++) rom_readmap[i] = &cart_rom[i << 19]; + } + + gen_running = 1; + zreset = 0; /* Z80 is reset */ + zbusreq = 0; /* Z80 has control of the Z bus */ + zbusack = 1; /* Z80 is busy using the Z bus */ + zbank = 0; /* Assume default bank is 000000-007FFF */ + zirq = 0; /* No interrupts occuring */ + resetline = -1; + + /* Reset CPUs */ m68k_pulse_reset (); - z80_reset (0); - z80_set_irq_callback (z80_irq_callback); + z80_reset (); + _YM2612_Reset(); + +#ifdef NGC + /* register SOFTRESET */ + SYS_SetResetCallback(set_softreset); +#endif + } void gen_shutdown (void) @@ -94,69 +155,84 @@ void gen_shutdown (void) /*----------------------------------------------------------------------- Bus controller chip functions -----------------------------------------------------------------------*/ -int gen_busack_r (void) +unsigned int gen_busack_r (void) { - if (zbusack == 0) - { - if ((count_m68k + m68k_cycles_run() - lastbusreqcnt) > 16) - return 0; /* bus taken */ - else return (lastbusack&1); - } - else return 1; + return zbusack; } -void gen_busreq_w (int state) +void gen_busreq_w (unsigned int state) { int z80_cycles_to_run; - input_raz (); + input_raz (); /* from Gens */ - if (state == 1) + if (state) { /* Bus Request */ - lastbusreqcnt = count_m68k + m68k_cycles_run(); - lastbusack = zbusack; - if (zbusreq == 0) + if (!zbusreq && zreset) { /* Z80 stopped */ /* z80 was ON during the last 68k cycles */ /* we execute the appropriate number of z80 cycles */ - z80_cycles_to_run = aim_z80 - cpu_sync[aim_m68k - count_m68k - m68k_cycles_run()]; - if (z80_cycles_to_run > 0) z80_run(z80_cycles_to_run); + z80_cycles_to_run = line_z80 + ((count_m68k - line_m68k)*7)/15; + z80_run(z80_cycles_to_run); } } else { /* Bus released */ - if (zbusreq == 1) + if (zbusreq && zreset) { /* Z80 started */ /* z80 was OFF during the last 68k cycles */ /* we burn the appropriate number of z80 cycles */ - z80_cycles_to_run = aim_z80 - cpu_sync[aim_m68k - count_m68k - m68k_cycles_run()]; - if (z80_cycles_to_run > 0) count_z80 = z80_cycles_to_run; + z80_cycles_to_run = line_z80 + ((count_m68k - line_m68k)*7)/15; + count_z80 = z80_cycles_to_run; } } - zbusreq = (state & 1); + + zbusreq = state; zbusack = 1 ^ (zbusreq & zreset); } -void gen_reset_w (int state) +void gen_reset_w (unsigned int state) { - zreset = (state & 1); - zbusack = 1 ^ (zbusreq & zreset); + int z80_cycles_to_run; - if (zreset == 0) + if (state) { - lastbusreqcnt = 0; - lastbusack = 1; - fm_reset(); - z80_reset (0); - z80_set_irq_callback (z80_irq_callback); + /* stop RESET process */ + if (!zbusreq && !zreset) + { + /* Z80 started */ + /* z80 was OFF during the last 68k cycles */ + /* we burn the appropriate number of z80 cycles */ + z80_cycles_to_run = line_z80 + ((count_m68k - line_m68k)*7)/15; + count_z80 = z80_cycles_to_run; + } } + else + { + /* start RESET process */ + if (!zbusreq && zreset) + { + /* Z80 stopped */ + /* z80 was ON during the last 68k cycles */ + /* we execute the appropriate number of z80 cycles */ + z80_cycles_to_run = line_z80 + ((count_m68k - line_m68k)*7)/15; + z80_run(z80_cycles_to_run); + } + + /* Reset Z80 & YM2612 */ + _YM2612_Reset(); + z80_reset (); + } + + zreset = state; + zbusack = 1 ^ (zbusreq & zreset); } -void gen_bank_w (int state) +void gen_bank_w (unsigned int state) { zbank = ((zbank >> 1) | ((state & 1) << 23)) & 0xFF8000; } diff --git a/source/genesis.h b/source/genesis.h index f425dc4..2212c4a 100644 --- a/source/genesis.h +++ b/source/genesis.h @@ -1,32 +1,55 @@ - -#ifndef _GENESIS_H_ -#define _GENESIS_H_ - -/* Global variables */ -extern uint8 *cart_rom; -extern uint8 work_ram[0x10000]; -extern uint8 zram[0x2000]; -extern uint8 zbusreq; -extern uint8 zbusack; -extern uint8 zreset; -extern uint8 zirq; -extern uint32 zbank; -extern uint8 gen_running; -extern uint32 lastbusreqcnt; -extern uint8 lastbusack; -extern uint32 genromsize; - -/* Function prototypes */ -void gen_init(void); -void gen_reset(void); -void gen_shutdown(void); -int gen_busack_r(void); -void gen_busreq_w(int state); -void gen_reset_w(int state); -void gen_bank_w(int state); -void bswap(uint8 *mem, int length); -int z80_irq_callback(int param); -void m68k_irq_ack_callback(int int_level); - -#endif /* _GEN_H_ */ - +/*************************************************************************************** + * Genesis Plus 1.2a + * Genesis internals & Bus arbitration + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#ifndef _GENESIS_H_ +#define _GENESIS_H_ + +/* Global variables */ +extern uint8 *cart_rom; +extern uint8 bios_rom[0x800]; +extern uint8 work_ram[0x10000]; +extern uint8 zram[0x2000]; +extern uint8 zbusreq; +extern uint8 zbusack; +extern uint8 zreset; +extern uint8 zirq; +extern uint32 zbank; +extern uint8 gen_running; +extern uint32 genromsize; +extern uint32 rom_size; +extern int32 resetline; +extern uint8 *rom_readmap[8]; + +/* Function prototypes */ +extern void gen_init(void); +extern void gen_reset(unsigned int hard_reset); +extern void gen_shutdown(void); +extern unsigned int gen_busack_r(void); +extern void gen_busreq_w(unsigned int state); +extern void gen_reset_w(unsigned int state); +extern void gen_bank_w(unsigned int state); +extern int z80_irq_callback(int param); +extern void set_softreset(void); + +#endif /* _GEN_H_ */ + diff --git a/source/hvc.h b/source/hvc.h index a49bdfd..a409b51 100644 --- a/source/hvc.h +++ b/source/hvc.h @@ -1,441 +1,414 @@ - -#ifndef _HVC_H_ -#define _HVC_H_ - -/* V counter values for NTSC 192-line display */ -uint8 vc_ntsc_192[262] = { - 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, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, - 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, - 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, - 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, - 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF -}; - -/* V counter values for NTSC 224-line display */ -uint16 vc_ntsc_224[262] = { - 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, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, - 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, - 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, - 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, - 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF -}; - -/* V counter values for NTSC 240-line display */ -uint8 vc_ntsc_240[262] = { - 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, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, - 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, - 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, - 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 -}; - -/* V counter values for PAL 192-line display */ -uint8 vc_pal_192[313] = { - 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, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, - 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, - 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, - 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, - 0xF0, 0xF1, 0xF2, - 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, - 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, - 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF -}; - -/* V counter values for PAL 224-line display */ -uint16 vc_pal_224[313] = { - 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, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, - 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, - 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, - 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, - 0x100, 0x101, 0x102, - 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, - 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, - 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF -}; - -/* V counter values for PAL 240-line display */ -uint16 vc_pal_240[313] = { - 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, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, - 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, - 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, - 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, - 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109, 0x10A, - 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, - 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, -}; - -/* - VDP timing for an NTSC Genesis in display mode 5. - Version 0.4 (11/29/00) - - by Charles MacDonald - WWW: http://cgfm2.emuviews.com - - Unpublished work Copyright 2000 Charles MacDonald - - Description 32-cell 40-cell - ---------------------------------------------------------------------------- - Range 00-93, E9-FF 00-B6, E4-FF - Display area 00-7F 00-9F - V counter increment 84, 85 A4, A5 - V-blanking in 86, 87 A7, A8 - V-blanking out 86, 87 A7, A8 - H-blanking in 93, E9 B2, E4 - H-blanking out 06, 07 06, 07 - - Comma seperated values show the H counter value before an event occurs, - and then the H counter value immediately after. - - These values shouldn't be considered 100% accurate, they are probably - off by one or two. - - Each H counter unit is equivalent to two pixels. - - The gaps at 93-E9 and B6-E4 are where the H counter 'jumps' ahead. - The H counter will never actually be set to the values 94-E8 or B7-E3. - Perhaps this is the horizontal retrace period. - - Interestingly enough, the timing values for the 32-cell display mode - are identical to that of the SMS. - - It would appear that in 40-cell mode, the horizontal blanking period - is shorter as the active display period takes more time. - - The V-blanking flag can also be forcibly set by disabling the display - through bit 6 of register #1. - -*/ - - -uint8 cycle2hc32[488] = { - 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, - 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0A, 0x0A, 0x0A, - 0x0B, 0x0B, 0x0B, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x10, 0x10, - 0x10, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x14, 0x14, 0x15, 0x15, 0x15, 0x16, - 0x16, 0x16, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, - 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, - 0x21, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, - 0x27, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x29, 0x2A, 0x2A, 0x2A, 0x2B, 0x2B, 0x2B, 0x2C, 0x2C, - 0x2C, 0x2D, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x2F, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x32, - 0x32, 0x32, 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x35, 0x35, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, - 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x3A, 0x3A, 0x3A, 0x3B, 0x3B, 0x3B, 0x3C, 0x3C, 0x3D, 0x3D, - 0x3D, 0x3E, 0x3E, 0x3E, 0x3F, 0x3F, 0x3F, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, - 0x43, 0x43, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x46, 0x46, 0x46, 0x47, 0x47, 0x47, 0x48, 0x48, - 0x48, 0x49, 0x49, 0x4A, 0x4A, 0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x4C, 0x4C, 0x4D, 0x4D, 0x4D, 0x4E, - 0x4E, 0x4E, 0x4F, 0x4F, 0x4F, 0x50, 0x50, 0x51, 0x51, 0x51, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, - 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, 0x57, 0x58, 0x58, 0x58, 0x59, 0x59, - 0x59, 0x5A, 0x5A, 0x5A, 0x5B, 0x5B, 0x5B, 0x5C, 0x5C, 0x5C, 0x5D, 0x5D, 0x5E, 0x5E, 0x5E, 0x5F, - 0x5F, 0x5F, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, 0x63, 0x64, 0x64, - 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x6A, - 0x6A, 0x6A, 0x6B, 0x6B, 0x6C, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D, 0x6E, 0x6E, 0x6E, 0x6F, 0x6F, 0x6F, - 0x70, 0x70, 0x70, 0x71, 0x71, 0x72, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, 0x74, 0x75, 0x75, - 0x75, 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x78, 0x78, 0x79, 0x79, 0x79, 0x7A, 0x7A, 0x7A, 0x7B, - 0x7B, 0x7B, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x80, - 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x85, 0x85, 0x85, 0x86, - 0x86, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x8A, 0x8A, 0x8A, 0x8B, 0x8B, 0x8B, - 0x8C, 0x8C, 0x8D, 0x8D, 0x8D, 0x8E, 0x8E, 0x8E, 0x8F, 0x8F, 0x8F, 0x90, 0x90, 0x90, 0x91, 0x91, - 0x91, 0x92, 0x92, 0x92, 0x93, 0x93, - 0xE9, 0xE9, 0xE9, 0xEA, 0xEA, 0xEA, 0xEB, 0xEB, 0xEB, 0xEC, - 0xEC, 0xEC, 0xED, 0xED, 0xED, 0xEE, 0xEE, 0xEE, 0xEF, 0xEF, 0xF0, 0xF0, 0xF0, 0xF1, 0xF1, 0xF1, - 0xF2, 0xF2, 0xF2, 0xF3, 0xF3, 0xF3, 0xF4, 0xF4, 0xF4, 0xF5, 0xF5, 0xF6, 0xF6, 0xF6, 0xF7, 0xF7, - 0xF7, 0xF8, 0xF8, 0xF8, 0xF9, 0xF9, 0xF9, 0xFA, 0xFA, 0xFA, 0xFB, 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, - 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF -}; - - -/*uint8 cycle2hc32[489] = { - 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xed, - 0xed, 0xed, 0xee, 0xee, 0xee, 0xef, 0xef, 0xf0, 0xf0, 0xf0, 0xf1, 0xf1, 0xf1, 0xf2, 0xf2, 0xf2, - 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf7, 0xf7, 0xf8, 0xf8, - 0xf8, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, - 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, - 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, - 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, - 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x14, - 0x14, 0x14, 0x15, 0x15, 0x15, 0x16, 0x16, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, - 0x1a, 0x1a, 0x1a, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1f, 0x1f, - 0x1f, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, - 0x25, 0x25, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x2a, 0x2a, - 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, - 0x30, 0x30, 0x31, 0x31, 0x31, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x35, 0x35, - 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3b, - 0x3b, 0x3b, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, - 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x43, 0x43, 0x43, 0x44, 0x44, 0x45, 0x45, 0x45, 0x46, 0x46, - 0x46, 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4b, 0x4b, 0x4b, - 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, 0x4f, 0x50, 0x50, 0x50, 0x51, 0x51, - 0x51, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, 0x54, 0x54, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, - 0x57, 0x57, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, - 0x5d, 0x5d, 0x5d, 0x5e, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x62, - 0x62, 0x62, 0x63, 0x63, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, 0x67, 0x67, 0x67, - 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, - 0x6d, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, - 0x73, 0x73, 0x74, 0x74, 0x74, 0x75, 0x75, 0x75, 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x78, 0x78, - 0x78, 0x79, 0x79, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7e, - 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, - 0x84, 0x84, 0x84, 0x85, 0x85, 0x85, 0x86, 0x86, 0x86, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x89, - 0x89, 0x89, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0x8e, 0x8e, 0x8e, - 0x8f, 0x8f, 0x8f, 0x90, 0x90, 0x90, 0x91, 0x91, 0x92 -}; - -*/ -/* -uint8 cycle2hc32[489] = { - 0xe9, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xee, - 0xee, 0xee, 0xef, 0xef, 0xef, 0xf0, 0xf0, 0xf1, 0xf1, 0xf1, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3, - 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf9, 0xf9, - 0xf9, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, - 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, - 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, - 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x15, - 0x15, 0x15, 0x16, 0x16, 0x16, 0x17, 0x17, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x1a, 0x1a, 0x1a, - 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x20, 0x20, - 0x20, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, - 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, - 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x30, 0x31, - 0x31, 0x31, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x36, 0x36, - 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3c, - 0x3c, 0x3c, 0x3d, 0x3d, 0x3e, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, - 0x42, 0x42, 0x42, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x45, 0x45, 0x46, 0x46, 0x46, 0x47, 0x47, - 0x47, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, - 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, 0x4f, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51, 0x52, 0x52, - 0x52, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, 0x58, - 0x58, 0x58, 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, - 0x5e, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, - 0x63, 0x63, 0x64, 0x64, 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, - 0x69, 0x69, 0x69, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, 0x6c, 0x6c, 0x6d, 0x6d, 0x6d, 0x6e, 0x6e, - 0x6e, 0x6f, 0x6f, 0x6f, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x73, 0x73, 0x73, - 0x74, 0x74, 0x75, 0x75, 0x75, 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x79, 0x79, - 0x79, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, - 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, - 0x85, 0x85, 0x85, 0x86, 0x86, 0x86, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x8a, - 0x8a, 0x8a, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, - 0x90, 0x90, 0x90, 0x91, 0x91, 0x91, 0x92, 0x92, 0x93 -};*/ - - - -uint8 cycle2hc40[488] = { - 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, - 0x06, 0x07, 0x07, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0A, 0x0A, 0x0B, 0x0B, 0x0C, 0x0C, 0x0C, 0x0D, - 0x0D, 0x0E, 0x0E, 0x0F, 0x0F, 0x10, 0x10, 0x10, 0x11, 0x11, 0x12, 0x12, 0x13, 0x13, 0x13, 0x14, - 0x14, 0x15, 0x15, 0x16, 0x16, 0x16, 0x17, 0x17, 0x18, 0x18, 0x19, 0x19, 0x19, 0x1A, 0x1A, 0x1B, - 0x1B, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, - 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, - 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, - 0x30, 0x30, 0x31, 0x31, 0x32, 0x32, 0x33, 0x33, 0x33, 0x34, 0x34, 0x35, 0x35, 0x36, 0x36, 0x36, - 0x37, 0x37, 0x38, 0x38, 0x39, 0x39, 0x39, 0x3A, 0x3A, 0x3B, 0x3B, 0x3C, 0x3C, 0x3D, 0x3D, 0x3D, - 0x3E, 0x3E, 0x3F, 0x3F, 0x40, 0x40, 0x40, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43, 0x43, 0x44, 0x44, - 0x45, 0x45, 0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x49, 0x49, 0x4A, 0x4A, 0x4A, 0x4B, 0x4B, - 0x4C, 0x4C, 0x4D, 0x4D, 0x4D, 0x4E, 0x4E, 0x4F, 0x4F, 0x50, 0x50, 0x50, 0x51, 0x51, 0x52, 0x52, - 0x53, 0x53, 0x53, 0x54, 0x54, 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, 0x57, 0x58, 0x58, 0x59, 0x59, - 0x5A, 0x5A, 0x5A, 0x5B, 0x5B, 0x5C, 0x5C, 0x5D, 0x5D, 0x5D, 0x5E, 0x5E, 0x5F, 0x5F, 0x60, 0x60, - 0x60, 0x61, 0x61, 0x62, 0x62, 0x63, 0x63, 0x63, 0x64, 0x64, 0x65, 0x65, 0x66, 0x66, 0x67, 0x67, - 0x67, 0x68, 0x68, 0x69, 0x69, 0x6A, 0x6A, 0x6A, 0x6B, 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D, 0x6E, - 0x6E, 0x6F, 0x6F, 0x70, 0x70, 0x70, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, 0x75, - 0x75, 0x76, 0x76, 0x77, 0x77, 0x77, 0x78, 0x78, 0x79, 0x79, 0x7A, 0x7A, 0x7A, 0x7B, 0x7B, 0x7C, - 0x7C, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, 0x83, - 0x83, 0x84, 0x84, 0x84, 0x85, 0x85, 0x86, 0x86, 0x87, 0x87, 0x87, 0x88, 0x88, 0x89, 0x89, 0x8A, - 0x8A, 0x8A, 0x8B, 0x8B, 0x8C, 0x8C, 0x8D, 0x8D, 0x8D, 0x8E, 0x8E, 0x8F, 0x8F, 0x90, 0x90, 0x90, - 0x91, 0x91, 0x92, 0x92, 0x93, 0x93, 0x94, 0x94, 0x94, 0x95, 0x95, 0x96, 0x96, 0x97, 0x97, 0x97, - 0x98, 0x98, 0x99, 0x99, 0x9A, 0x9A, 0x9A, 0x9B, 0x9B, 0x9C, 0x9C, 0x9D, 0x9D, 0x9D, 0x9E, 0x9E, - 0x9F, 0x9F, 0xA0, 0xA0, 0xA1, 0xA1, 0xA1, 0xA2, 0xA2, 0xA3, 0xA3, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, - 0xA6, 0xA6, 0xA7, 0xA7, 0xA7, 0xA8, 0xA8, 0xA9, 0xA9, 0xAA, 0xAA, 0xAA, 0xAB, 0xAB, 0xAC, 0xAC, - 0xAD, 0xAD, 0xAD, 0xAE, 0xAE, 0xAF, 0xAF, 0xB0, 0xB0, 0xB1, 0xB1, 0xB1, 0xB2, 0xB2, 0xB3, 0xB3, - 0xB4, 0xB4, 0xB4, 0xB5, 0xB5, 0xB6, 0xB6, - 0xE4, 0xE4, 0xE4, 0xE5, 0xE5, 0xE6, 0xE6, 0xE7, 0xE7, - 0xE7, 0xE8, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, 0xEB, 0xEB, 0xEB, 0xEC, 0xEC, 0xED, 0xED, 0xEE, 0xEE, - 0xEE, 0xEF, 0xEF, 0xF0, 0xF0, 0xF1, 0xF1, 0xF1, 0xF2, 0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF4, 0xF5, - 0xF5, 0xF6, 0xF6, 0xF7, 0xF7, 0xF7, 0xF8, 0xF8, 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFB, 0xFC, - 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF -}; - -/* -uint8 cycle2hc40[489] = { - 0xe4, 0xe4, 0xe4, 0xe5, 0xe5, 0xe6, 0xe6, 0xe7, 0xe7, 0xe7, 0xe8, 0xe8, 0xe9, 0xe9, 0xea, 0xea, - 0xea, 0xeb, 0xeb, 0xec, 0xec, 0xed, 0xed, 0xed, 0xee, 0xee, 0xef, 0xef, 0xf0, 0xf0, 0xf0, 0xf1, - 0xf1, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf7, 0xf7, 0xf8, - 0xf8, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfe, 0xfe, 0xff, - 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, - 0x0d, 0x0d, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x11, 0x11, 0x12, 0x12, 0x12, 0x13, 0x13, - 0x14, 0x14, 0x15, 0x15, 0x15, 0x16, 0x16, 0x17, 0x17, 0x18, 0x18, 0x18, 0x19, 0x19, 0x1a, 0x1a, - 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x20, 0x20, 0x21, 0x21, - 0x21, 0x22, 0x22, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, - 0x28, 0x29, 0x29, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2f, - 0x2f, 0x30, 0x30, 0x31, 0x31, 0x31, 0x32, 0x32, 0x33, 0x33, 0x34, 0x34, 0x34, 0x35, 0x35, 0x36, - 0x36, 0x37, 0x37, 0x37, 0x38, 0x38, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3c, 0x3c, 0x3d, - 0x3d, 0x3d, 0x3e, 0x3e, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43, 0x43, - 0x44, 0x44, 0x45, 0x45, 0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x49, 0x49, 0x49, 0x4a, 0x4a, - 0x4b, 0x4b, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4f, 0x4f, 0x50, 0x50, 0x50, 0x51, 0x51, - 0x52, 0x52, 0x53, 0x53, 0x53, 0x54, 0x54, 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, 0x57, 0x58, 0x58, - 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5e, 0x5e, 0x5f, 0x5f, - 0x5f, 0x60, 0x60, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, 0x64, 0x64, 0x65, 0x65, 0x65, 0x66, - 0x66, 0x67, 0x67, 0x68, 0x68, 0x68, 0x69, 0x69, 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, 0x6c, 0x6c, 0x6d, - 0x6d, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x70, 0x70, 0x71, 0x71, 0x72, 0x72, 0x72, 0x73, 0x73, 0x74, - 0x74, 0x75, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77, 0x78, 0x78, 0x78, 0x79, 0x79, 0x7a, 0x7a, 0x7b, - 0x7b, 0x7b, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x81, - 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, 0x85, 0x85, 0x86, 0x86, 0x87, 0x87, 0x87, 0x88, 0x88, - 0x89, 0x89, 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0x8e, 0x8e, 0x8f, 0x8f, - 0x90, 0x90, 0x90, 0x91, 0x91, 0x92, 0x92, 0x93, 0x93, 0x94, 0x94, 0x94, 0x95, 0x95, 0x96, 0x96, - 0x97, 0x97, 0x97, 0x98, 0x98, 0x99, 0x99, 0x9a, 0x9a, 0x9a, 0x9b, 0x9b, 0x9c, 0x9c, 0x9d, 0x9d, - 0x9d, 0x9e, 0x9e, 0x9f, 0x9f, 0xa0, 0xa0, 0xa0, 0xa1, 0xa1, 0xa2, 0xa2, 0xa3, 0xa3, 0xa3, 0xa4, - 0xa4, 0xa5, 0xa5, 0xa6, 0xa6, 0xa6, 0xa7, 0xa7, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xaa, 0xaa, 0xab, - 0xab, 0xac, 0xac, 0xac, 0xad, 0xad, 0xae, 0xae, 0xaf, 0xaf, 0xaf, 0xb0, 0xb0, 0xb1, 0xb1, 0xb2, - 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb5, 0xb5, 0xb6 -}; -*/ -/* -uint8 cycle2hc40[489] = { - 0xe4, 0xe4, 0xe4, 0xe5, 0xe5, 0xe6, 0xe6, 0xe6, 0xe7, 0xe7, 0xe8, 0xe8, 0xe9, 0xe9, 0xe9, 0xea, - 0xea, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xed, 0xed, 0xee, 0xee, 0xee, 0xef, 0xef, 0xf0, 0xf0, 0xf1, - 0xf1, 0xf1, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf7, 0xf7, - 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfd, 0xfd, 0xfe, 0xfe, - 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x05, - 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, - 0x0c, 0x0c, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x11, 0x11, 0x12, 0x12, - 0x13, 0x13, 0x13, 0x14, 0x14, 0x15, 0x15, 0x15, 0x16, 0x16, 0x17, 0x17, 0x18, 0x18, 0x18, 0x19, - 0x19, 0x1a, 0x1a, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1f, 0x1f, 0x20, - 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25, 0x25, 0x26, 0x26, - 0x27, 0x27, 0x28, 0x28, 0x28, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2c, 0x2c, 0x2d, 0x2d, - 0x2d, 0x2e, 0x2e, 0x2f, 0x2f, 0x30, 0x30, 0x30, 0x31, 0x31, 0x32, 0x32, 0x32, 0x33, 0x33, 0x34, - 0x34, 0x35, 0x35, 0x35, 0x36, 0x36, 0x37, 0x37, 0x38, 0x38, 0x38, 0x39, 0x39, 0x3a, 0x3a, 0x3a, - 0x3b, 0x3b, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x41, 0x41, - 0x42, 0x42, 0x42, 0x43, 0x43, 0x44, 0x44, 0x45, 0x45, 0x45, 0x46, 0x46, 0x47, 0x47, 0x47, 0x48, - 0x48, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4b, 0x4b, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4f, - 0x4f, 0x4f, 0x50, 0x50, 0x51, 0x51, 0x52, 0x52, 0x52, 0x53, 0x53, 0x54, 0x54, 0x55, 0x55, 0x55, - 0x56, 0x56, 0x57, 0x57, 0x57, 0x58, 0x58, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5c, 0x5c, - 0x5c, 0x5d, 0x5d, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x60, 0x60, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, - 0x63, 0x64, 0x64, 0x64, 0x65, 0x65, 0x66, 0x66, 0x67, 0x67, 0x67, 0x68, 0x68, 0x69, 0x69, 0x6a, - 0x6a, 0x6a, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x70, 0x70, - 0x71, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x74, 0x74, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77, - 0x77, 0x78, 0x78, 0x79, 0x79, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, - 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, - 0x85, 0x85, 0x86, 0x86, 0x86, 0x87, 0x87, 0x88, 0x88, 0x89, 0x89, 0x89, 0x8a, 0x8a, 0x8b, 0x8b, - 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x90, 0x90, 0x91, 0x91, 0x91, 0x92, - 0x92, 0x93, 0x93, 0x94, 0x94, 0x94, 0x95, 0x95, 0x96, 0x96, 0x96, 0x97, 0x97, 0x98, 0x98, 0x99, - 0x99, 0x99, 0x9a, 0x9a, 0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0x9d, 0x9d, 0x9e, 0x9e, 0x9e, 0x9f, 0x9f, - 0xa0, 0xa0, 0xa1, 0xa1, 0xa1, 0xa2, 0xa2, 0xa3, 0xa3, 0xa3, 0xa4, 0xa4, 0xa5, 0xa5, 0xa6, 0xa6, - 0xa6, 0xa7, 0xa7, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xaa, 0xaa, 0xab, 0xab, 0xab, 0xac, 0xac, 0xad, - 0xad, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xb0, 0xb0, 0xb1 -}; -*/ - - - -/* H counter values for a 256-pixel wide display (342 pixel max.) */ -/*uint8 hc_256[171] = { - 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, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, - 0x90, 0x91, 0x92, 0x93, - 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF -};*/ - -/* H counter values for a 320-pixel wide display (422 pixels max.) */ -/*uint8 hc_320[211] = { - 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, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, - 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, - 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF -};*/ - -/*uint8 *hc_table[2] = { - hc_256, - hc_320, -};*/ - -#endif /* _HVC_H_ */ - +/*************************************************************************************** + * Genesis Plus 1.2a + * HV Counters + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +/* + NTSC, 256x192 + ------------- + + Lines Description + + 192 Active display + 24 Bottom border + 3 Bottom blanking + 3 Vertical blanking + 13 Top blanking + 27 Top border + + V counter values + 00-DA, D5-FF + + NTSC, 256x224 + ------------- + + Lines Description + + 224 Active display + 8 Bottom border + 3 Bottom blanking + 3 Vertical blanking + 13 Top blanking + 11 Top border + + V counter values + 00-EA, E5-FF + + NTSC, 256x240 + ------------- + + This mode does not work on NTSC machines. All 30 rows of the name table are + displayed, there is no border, blanking, or retrace period, and the next + frame starts after the 30th row. The display rolls continuously though it + can be stabilized by adjusting the vertical hold. + + V counter values + 00-FF, 00-06 + + PAL, 256x192 + ------------ + + Lines Description + + 192 Active display + 48 Bottom border + 3 Bottom blanking + 3 Vertical blanking + 13 Top blanking + 54 Top border + + V counter values + 00-F2, BA-FF + + PAL, 256x224 + ------------ + + Lines Description + + 224 Active display + 32 Bottom border + 3 Bottom blanking + 3 Vertical blanking + 13 Top blanking + 38 Top border + + V counter values + 00-FF, 00-02, CA-FF + + PAL, 256x240 + ------------ + + Lines Description + + 240 Active display + 24 Bottom border + 3 Bottom blanking + 3 Vertical blanking + 13 Top blanking + 30 Top border + + V counter values + 00-FF, 00-0A, D2-FF + + Here are some details about what the different screen areas look like, + useful if you are emulating overscan or if you want to have a 'virtual' + vertical hold control in your emulator. + + Active display - Where the display generated by the VDP goes. + Bottom border - Filled with border color from VDP register #7. + Bottom blanking - Filled with a light black color. (like display was blanked) + Vertical sync - Filled with a pure black color. (like display was turned off) + Top blanking - Filled with a light black color. (like display was blanked) + Top border - Filled with the border color from VDP register #7. + +*/ +#ifndef _HVC_H_ +#define _HVC_H_ + +/* V counter values for NTSC 192-line display */ +uint8 vc_ntsc_192[262] = { + 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, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, + 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +/* V counter values for NTSC 224-line display */ +uint8 vc_ntsc_224[262] = { + 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, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, + 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +/* V counter values for NTSC 240-line display (invalid mode) */ +uint8 vc_ntsc_240[262] = { + 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, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 +}; + +/* V counter values for PAL 192-line display */ +uint8 vc_pal_192[313] = { + 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, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, + 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, + 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, + 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, + 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, + 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +/* V counter values for PAL 224-line display */ +uint8 vc_pal_224[313] = { + 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, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, + 0x00, 0x01, 0x02, + 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, + 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, + 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, + 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +/* V counter values for PAL 240-line display */ +uint8 vc_pal_240[313] = { + 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, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, + 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, + 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, + 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, + 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +/* + VDP timing for an NTSC Genesis in display mode 5. + Version 0.4 (11/29/00) + + by Charles MacDonald + WWW: http://cgfm2.emuviews.com + + Unpublished work Copyright 2000 Charles MacDonald + + Description 32-cell 40-cell + ---------------------------------------------------------------------------- + Range 00-93, E9-FF 00-B6, E4-FF + Display area 00-7F 00-9F + V counter increment 84, 85 A4, A5 + V-blanking in 86, 87 A7, A8 + V-blanking out 86, 87 A7, A8 + H-blanking in 93, E9 B2, E4 + H-blanking out 06, 07 06, 07 + + Comma seperated values show the H counter value before an event occurs, + and then the H counter value immediately after. + + These values shouldn't be considered 100% accurate, they are probably + off by one or two. + + Each H counter unit is equivalent to two pixels. + + The gaps at 93-E9 and B6-E4 are where the H counter 'jumps' ahead. + The H counter will never actually be set to the values 94-E8 or B7-E3. + Perhaps this is the horizontal retrace period. + + Interestingly enough, the timing values for the 32-cell display mode + are identical to that of the SMS. + + It would appear that in 40-cell mode, the horizontal blanking period + is shorter as the active display period takes more time. + + The V-blanking flag can also be forcibly set by disabling the display + through bit 6 of register #1. + + + -------------------------------------------------------------------------- + H counter + + Now for some additional information on the horizontal aspects of the + display, taken from the TMS9918 manual and my tests on a NTSC Genesis. + Be warned that a real SMS may have different results. + + The H counter is 9 bits, and reading it returns the upper 8 bits. This is + because a scanline consists of 342 pixels, which couldn't be represented + with an 8-bit counter. Each scanline is divided up as follows: + + Pixels H.Cnt Description + 256 : 00-7F : Active display + 15 : 80-87 : Right border + 8 : 87-8B : Right blanking + 26 : 8B-ED : Horizontal sync + 2 : ED-EE : Left blanking + 14 : EE-F5 : Color burst + 8 : F5-F9 : Left blanking + 13 : F9-FF : Left border + + Here's a description of what these areas look like: + + Active display - Where the display generated by the VDP goes. + Right border - Filled with border color from VDP register $07. + Right blanking - Filled with a light black color. (like display was blanked) + Horizontal sync - Filled with a pure black color. (like display was turned off) + Left blanking - Filled with the border color from VDP register $07. + Color burst - Filled with a dark brown/orange color. + Left blanking - Filled with a light black color. (like display was blanked) + Left border - Filled with the border color from VDP register $07. + +*/ + +uint8 cycle2hc32[488] = { + 0x85, 0x85, 0x85, 0x86, 0x86, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x8A, 0x8A, + 0x8A, 0x8B, 0x8B, 0x8B, 0x8C, 0x8C, 0x8D, 0x8D, 0x8D, 0x8E, 0x8E, 0x8E, 0x8F, 0x8F, 0x8F, 0x90, + 0x90, 0x90, 0x91, 0x91, 0x91, 0x92, 0x92, 0x92, 0x93, 0x93, + 0xE9, 0xE9, 0xE9, 0xEA, 0xEA, 0xEA, + 0xEB, 0xEB, 0xEB, 0xEC, 0xEC, 0xEC, 0xED, 0xED, 0xED, 0xEE, 0xEE, 0xEE, 0xEF, 0xEF, 0xF0, 0xF0, + 0xF0, 0xF1, 0xF1, 0xF1, 0xF2, 0xF2, 0xF2, 0xF3, 0xF3, 0xF3, 0xF4, 0xF4, 0xF4, 0xF5, 0xF5, 0xF6, + 0xF6, 0xF6, 0xF7, 0xF7, 0xF7, 0xF8, 0xF8, 0xF8, 0xF9, 0xF9, 0xF9, 0xFA, 0xFA, 0xFA, 0xFB, 0xFB, + 0xFB, 0xFC, 0xFC, 0xFD, 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0A, 0x0A, 0x0A, 0x0B, 0x0B, 0x0B, 0x0C, + 0x0C, 0x0C, 0x0D, 0x0D, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, + 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x14, 0x14, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x17, 0x17, + 0x17, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x1C, 0x1C, 0x1C, 0x1D, + 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x22, + 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, + 0x28, 0x29, 0x29, 0x29, 0x2A, 0x2A, 0x2A, 0x2B, 0x2B, 0x2B, 0x2C, 0x2C, 0x2C, 0x2D, 0x2D, 0x2D, + 0x2E, 0x2E, 0x2F, 0x2F, 0x2F, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x32, 0x32, 0x32, 0x33, 0x33, + 0x33, 0x34, 0x34, 0x34, 0x35, 0x35, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x39, + 0x39, 0x39, 0x3A, 0x3A, 0x3A, 0x3B, 0x3B, 0x3B, 0x3C, 0x3C, 0x3D, 0x3D, 0x3D, 0x3E, 0x3E, 0x3E, + 0x3F, 0x3F, 0x3F, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x43, 0x43, 0x44, 0x44, + 0x44, 0x45, 0x45, 0x45, 0x46, 0x46, 0x46, 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x49, 0x49, 0x4A, + 0x4A, 0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x4C, 0x4C, 0x4D, 0x4D, 0x4D, 0x4E, 0x4E, 0x4E, 0x4F, 0x4F, + 0x4F, 0x50, 0x50, 0x51, 0x51, 0x51, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x55, + 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, 0x57, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x5A, 0x5A, 0x5A, + 0x5B, 0x5B, 0x5B, 0x5C, 0x5C, 0x5C, 0x5D, 0x5D, 0x5E, 0x5E, 0x5E, 0x5F, 0x5F, 0x5F, 0x60, 0x60, + 0x60, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, 0x63, 0x64, 0x64, 0x65, 0x65, 0x65, 0x66, + 0x66, 0x66, 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x6A, 0x6A, 0x6A, 0x6B, 0x6B, + 0x6C, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D, 0x6E, 0x6E, 0x6E, 0x6F, 0x6F, 0x6F, 0x70, 0x70, 0x70, 0x71, + 0x71, 0x72, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, 0x74, 0x75, 0x75, 0x75, 0x76, 0x76, 0x76, + 0x77, 0x77, 0x77, 0x78, 0x78, 0x79, 0x79, 0x79, 0x7A, 0x7A, 0x7A, 0x7B, 0x7B, 0x7B, 0x7C, 0x7C, + 0x7C, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, + 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84 +}; + +uint8 cycle2hc40[488] = { + 0xA5, 0xA5, 0xA6, 0xA6, 0xA7, 0xA7, 0xA7, 0xA8, 0xA8, 0xA9, 0xA9, 0xAA, 0xAA, 0xAA, 0xAB, 0xAB, + 0xAC, 0xAC, 0xAD, 0xAD, 0xAD, 0xAE, 0xAE, 0xAF, 0xAF, 0xB0, 0xB0, 0xB1, 0xB1, 0xB1, 0xB2, 0xB2, + 0xB3, 0xB3, 0xB4, 0xB4, 0xB4, 0xB5, 0xB5, 0xB6, 0xB6, + 0xE4, 0xE4, 0xE4, 0xE5, 0xE5, 0xE6, 0xE6, + 0xE7, 0xE7, 0xE7, 0xE8, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, 0xEB, 0xEB, 0xEB, 0xEC, 0xEC, 0xED, 0xED, + 0xEE, 0xEE, 0xEE, 0xEF, 0xEF, 0xF0, 0xF0, 0xF1, 0xF1, 0xF1, 0xF2, 0xF2, 0xF3, 0xF3, 0xF4, 0xF4, + 0xF4, 0xF5, 0xF5, 0xF6, 0xF6, 0xF7, 0xF7, 0xF7, 0xF8, 0xF8, 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, + 0xFB, 0xFC, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, + 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x09, + 0x09, 0x09, 0x0A, 0x0A, 0x0B, 0x0B, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0E, 0x0E, 0x0F, 0x0F, 0x10, + 0x10, 0x10, 0x11, 0x11, 0x12, 0x12, 0x13, 0x13, 0x13, 0x14, 0x14, 0x15, 0x15, 0x16, 0x16, 0x16, + 0x17, 0x17, 0x18, 0x18, 0x19, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, + 0x1E, 0x1E, 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, + 0x25, 0x25, 0x26, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, + 0x2C, 0x2C, 0x2D, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x30, 0x30, 0x31, 0x31, 0x32, 0x32, + 0x33, 0x33, 0x33, 0x34, 0x34, 0x35, 0x35, 0x36, 0x36, 0x36, 0x37, 0x37, 0x38, 0x38, 0x39, 0x39, + 0x39, 0x3A, 0x3A, 0x3B, 0x3B, 0x3C, 0x3C, 0x3D, 0x3D, 0x3D, 0x3E, 0x3E, 0x3F, 0x3F, 0x40, 0x40, + 0x40, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43, 0x43, 0x44, 0x44, 0x45, 0x45, 0x46, 0x46, 0x46, 0x47, + 0x47, 0x48, 0x48, 0x49, 0x49, 0x4A, 0x4A, 0x4A, 0x4B, 0x4B, 0x4C, 0x4C, 0x4D, 0x4D, 0x4D, 0x4E, + 0x4E, 0x4F, 0x4F, 0x50, 0x50, 0x50, 0x51, 0x51, 0x52, 0x52, 0x53, 0x53, 0x53, 0x54, 0x54, 0x55, + 0x55, 0x56, 0x56, 0x56, 0x57, 0x57, 0x58, 0x58, 0x59, 0x59, 0x5A, 0x5A, 0x5A, 0x5B, 0x5B, 0x5C, + 0x5C, 0x5D, 0x5D, 0x5D, 0x5E, 0x5E, 0x5F, 0x5F, 0x60, 0x60, 0x60, 0x61, 0x61, 0x62, 0x62, 0x63, + 0x63, 0x63, 0x64, 0x64, 0x65, 0x65, 0x66, 0x66, 0x67, 0x67, 0x67, 0x68, 0x68, 0x69, 0x69, 0x6A, + 0x6A, 0x6A, 0x6B, 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, 0x70, 0x70, 0x70, + 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77, 0x77, + 0x78, 0x78, 0x79, 0x79, 0x7A, 0x7A, 0x7A, 0x7B, 0x7B, 0x7C, 0x7C, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, + 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, 0x85, 0x85, + 0x86, 0x86, 0x87, 0x87, 0x87, 0x88, 0x88, 0x89, 0x89, 0x8A, 0x8A, 0x8A, 0x8B, 0x8B, 0x8C, 0x8C, + 0x8D, 0x8D, 0x8D, 0x8E, 0x8E, 0x8F, 0x8F, 0x90, 0x90, 0x90, 0x91, 0x91, 0x92, 0x92, 0x93, 0x93, + 0x94, 0x94, 0x94, 0x95, 0x95, 0x96, 0x96, 0x97, 0x97, 0x97, 0x98, 0x98, 0x99, 0x99, 0x9A, 0x9A, + 0x9A, 0x9B, 0x9B, 0x9C, 0x9C, 0x9D, 0x9D, 0x9D, 0x9E, 0x9E, 0x9F, 0x9F, 0xA0, 0xA0, 0xA1, 0xA1, + 0xA1, 0xA2, 0xA2, 0xA3, 0xA3, 0xA4, 0xA4, 0xA4, +}; + + +uint8 *vctab; +uint8 *hctab; + +#endif /* _HVC_H_ */ + diff --git a/source/input.c b/source/input.c index 1449882..2363dfd 100644 --- a/source/input.c +++ b/source/input.c @@ -1,220 +1,136 @@ -/* - Copyright (C) 1999, 2000, 2001, 2002, 2003 Charles MacDonald - - 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -/* - 02/2007: fixed 6BUTTONS gamepad emulation (Eke-Eke) - 06/2007: Added TEAMPLAYER/4WAYPLAY/MENACER emulation (Eke-Eke) -*/ +/*************************************************************************************** + * Genesis Plus 1.2a + * Peripheral Input Support + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ #include "shared.h" t_input input; -uint8 current_pad = 0; -uint8 j_cart = 0; - -void gamepad_reset(uint8 num); -void gamepad_update(uint8 num); -void gamepad_raz(uint8 num); -void lightgun_update(void); -void lightgun_reset(void); -void teamplayer_reset(uint8 port); - -/***************************************************************************** - * Generic INPUTS Control - * - *****************************************************************************/ -void input_reset (int padtype) -{ - uint8 i; - - input.max = 0; - for (i=0; i MAX_INPUTS) input.max = MAX_INPUTS; - - /* J-CART: add two gamepad inputs */ - if (j_cart) - { - input.dev[5] = padtype; - input.dev[6] = padtype; - gamepad_reset(5); - gamepad_reset(6); - input.max+=2; - } -} - -void input_update() -{ - uint8 i; - switch (input.system[0]) - { - case SYSTEM_GAMEPAD: - if (input.dev[0] == DEVICE_6BUTTON) gamepad_update(0); - break; - - case SYSTEM_WAYPLAY: - for (i=0; i<4; i++) - { - if (input.dev[i] == DEVICE_6BUTTON) gamepad_update(i); - } - break; - } - - switch (input.system[1]) - { - case SYSTEM_GAMEPAD: - if (input.dev[4] == DEVICE_6BUTTON) gamepad_update(4); - break; - - case SYSTEM_MENACER: - lightgun_update(); - break; - } -} - -void input_raz() -{ - uint8 i; - switch (input.system[0]) - { - case SYSTEM_GAMEPAD: - if (input.dev[0] == DEVICE_6BUTTON) gamepad_raz(0); - break; - - case SYSTEM_WAYPLAY: - for (i=0; i<4; i++) - { - if (input.dev[i] == DEVICE_6BUTTON) gamepad_raz(i); - } - break; - } - - switch (input.system[1]) - { - case SYSTEM_GAMEPAD: - if (input.dev[4] == DEVICE_6BUTTON) gamepad_raz(4); - break; - } -} /***************************************************************************** * LIGHTGUN specific functions * *****************************************************************************/ -struct gun -{ - int16 x; - int16 y; -} lightgun; +/* H counter values for a 256-pixel wide display (342 pixel max.) */ +uint8 hc_256[171] = { + 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, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, + 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; -void lightgun_reset(void) +/* H counter values for a 320-pixel wide display (442 pixels max.) */ +uint8 hc_320[210] = { + 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, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, + 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +static inline void lightgun_reset(int num) { - lightgun.x = bitmap.viewport.w >> 1; - lightgun.y = bitmap.viewport.h >> 1; + input.analog[num][0] = bitmap.viewport.w >> 1; + input.analog[num][1] = bitmap.viewport.h >> 1; } -void lightgun_update(void) +static inline void lightgun_update(int num) { - if ((v_counter == lightgun.y)) + if ((input.analog[num][1] == v_counter + input.y_offset)) { - if (reg[0x0B] & 8) m68k_set_irq(2); - if (reg[0x00] & 2) - { - hc_latch = lightgun.x + 166; - if (hc_latch >= bitmap.viewport.w + 52) hc_latch -= (bitmap.viewport.w + 52 + 48); - hc_latch >>= 1; + /* HL enabled ? */ + if (io_reg[5] & 0x80) + { + /* External Interrupt ? */ + if (reg[11] & 0x08) m68k_set_irq(2); + + /* HVC Latch: + 1) some games does not set HVC latch but instead use bigger X offset + 2) for games using H40 mode, the gun routine scales up the Hcounter value, + H-Counter range is approx. 292 pixel clocks + */ + if (reg[12] & 1) + hc_latch = hc_320[((input.analog[num][0] * 290) / (2 * 320) + input.x_offset) % 210]; + else + hc_latch = hc_256[(input.analog[num][0] / 2 + input.x_offset)%171]; } + } } - -void lightgun_set () -{ - if ((input.pad[4] & INPUT_RIGHT)) lightgun.x ++; - if ((input.pad[4] & INPUT_LEFT)) lightgun.x --; - if ((input.pad[4] & INPUT_UP)) lightgun.y --; - if ((input.pad[4] & INPUT_DOWN)) lightgun.y ++; - if (lightgun.x < 0) lightgun.x = 0; - else if (lightgun.x > bitmap.viewport.w-34) lightgun.x = bitmap.viewport.w-34; - - if (lightgun.y < 0) lightgun.y = 0; - else if (lightgun.y > bitmap.viewport.h-8) lightgun.y = bitmap.viewport.h-8; -} - -uint8 lightgun_read (void) +/* Sega Menacer specific */ +unsigned int menacer_read() { - uint8 retval = 0x00; + int retval = 0x70; if ((input.pad[4] & INPUT_B)) retval |= 0x01; if ((input.pad[4] & INPUT_A)) retval |= 0x02; - if ((input.pad[4] & INPUT_C)) retval |= 0x04; + if ((input.pad[4] & INPUT_C)) retval |= 0x04; if ((input.pad[4] & INPUT_START)) retval |= 0x08; - return (retval & 0x7F); + + return retval; } +/* Konami Justifier specific */ +unsigned int justifier_read() +{ + /* TL & TR pins should always return 1 (write only) */ + /* LEFT & RIGHT pins should always return 0 (needed during gun detection) */ + int retval = 0x73; + + switch (io_reg[2]) + { + case 0x40: /* gun detection */ + return 0x30; + + case 0x00: /* gun #1 enabled */ + if ((input.pad[4] & INPUT_A)) retval &= ~0x01; + if ((input.pad[4] & INPUT_START)) retval &= ~0x02; + return retval; + + case 0x20: /* gun #2 enabled */ + if ((input.pad[5] & INPUT_A)) retval &= ~0x01; + if ((input.pad[5] & INPUT_START)) retval &= ~0x02; + return retval; + + default: /* guns disabled */ + return retval; +} +} /***************************************************************************** * GAMEPAD specific functions (2PLAYERS/4WAYPLAY) @@ -227,30 +143,28 @@ struct pad uint8 Delay; } gamepad[MAX_DEVICES]; -void gamepad_reset(uint8 i) -{ - gamepad[i].State = 0x40; - if (input.dev[i] == DEVICE_6BUTTON) gamepad_raz(i); -} - -void gamepad_raz(uint8 i) +static inline void gamepad_raz(unsigned int i) { gamepad[i].Counter = 0; gamepad[i].Delay = 0; } -void gamepad_update(uint8 i) +static inline void gamepad_reset(unsigned int i) +{ + gamepad[i].State = 0x40; + if (input.dev[i] == DEVICE_6BUTTON) gamepad_raz(i); +} + +static inline void gamepad_update(unsigned int i) { if (gamepad[i].Delay++ > 25) gamepad_raz(i); } -uint8 gamepad_read (uint8 i) +static inline unsigned int gamepad_read(unsigned int i) { int control; - unsigned char retval = 0xFF; + int retval = 0x7F; - if (input.dev[i] == NO_DEVICE) return 0x7F; - control = (gamepad[i].State & 0x40) >> 6; /* current TH state */ if (input.dev[i] == DEVICE_6BUTTON) @@ -264,74 +178,74 @@ uint8 gamepad_read (uint8 i) case 3: /*** Second High ***/ case 5: /*** Third High ***/ - /* TH = 1 : ?1CBRLDU */ - if (input.pad[i] & INPUT_C) retval &= ~0x20; - if (input.pad[i] & INPUT_B) retval &= ~0x10; - if (input.pad[i] & INPUT_UP) retval &= ~0x01; - if (input.pad[i] & INPUT_DOWN) retval &= ~0x02; - if (input.pad[i] & INPUT_LEFT) retval &= ~0x04; - if (input.pad[i] & INPUT_RIGHT) retval &= ~0x08; - break; + /* TH = 1 : ?1CBRLDU */ + if (input.pad[i] & INPUT_C) retval &= ~0x20; + if (input.pad[i] & INPUT_B) retval &= ~0x10; + if (input.pad[i] & INPUT_UP) retval &= ~0x01; + if (input.pad[i] & INPUT_DOWN) retval &= ~0x02; + if (input.pad[i] & INPUT_LEFT) retval &= ~0x04; + if (input.pad[i] & INPUT_RIGHT) retval &= ~0x08; + break; case 0: /*** First low ***/ case 2: /*** Second low ***/ - /* TH = 0 : ?0SA00DU */ - if (input.pad[i] & INPUT_A) retval &= ~0x10; - if (input.pad[i] & INPUT_START) retval &= ~0x20; - if (input.pad[i] & INPUT_UP) retval &= ~0x01; - if (input.pad[i] & INPUT_DOWN) retval &= ~0x02; - retval &= 0xB3; - break; + /* TH = 0 : ?0SA00DU */ + if (input.pad[i] & INPUT_A) retval &= ~0x10; + if (input.pad[i] & INPUT_START) retval &= ~0x20; + if (input.pad[i] & INPUT_UP) retval &= ~0x01; + if (input.pad[i] & INPUT_DOWN) retval &= ~0x02; + retval &= 0xB3; + break; /* 6buttons specific (taken from gen-hw.txt) */ - /* A 6-button gamepad allows the extra buttons to be read based on how */ - /* many times TH is switched from 1 to 0 (and not 0 to 1). Observe the */ - /* following sequence */ - /* - TH = 1 : ?1CBRLDU 3-button pad return value - TH = 0 : ?0SA00DU 3-button pad return value - TH = 1 : ?1CBRLDU 3-button pad return value - TH = 0 : ?0SA0000 D3-0 are forced to '0' - TH = 1 : ?1CBMXYZ Extra buttons returned in D3-0 - TH = 0 : ?0SA1111 D3-0 are forced to '1' - */ - case 4: /*** Third Low ***/ + /* A 6-button gamepad allows the extra buttons to be read based on how */ + /* many times TH is switched from 1 to 0 (and not 0 to 1). Observe the */ + /* following sequence */ + /* + TH = 1 : ?1CBRLDU 3-button pad return value + TH = 0 : ?0SA00DU 3-button pad return value + TH = 1 : ?1CBRLDU 3-button pad return value + TH = 0 : ?0SA0000 D3-0 are forced to '0' + TH = 1 : ?1CBMXYZ Extra buttons returned in D3-0 + TH = 0 : ?0SA1111 D3-0 are forced to '1' + */ + case 4: /*** Third Low ***/ - /* TH = 0 : ?0SA0000 D3-0 are forced to '0'*/ - if (input.pad[i] & INPUT_A) retval &= ~0x10; - if (input.pad[i] & INPUT_START) retval &= ~0x20; - retval &= 0xB0; - break; + /* TH = 0 : ?0SA0000 D3-0 are forced to '0'*/ + if (input.pad[i] & INPUT_A) retval &= ~0x10; + if (input.pad[i] & INPUT_START) retval &= ~0x20; + retval &= 0xB0; + break; case 6: /*** Fourth Low ***/ - /* TH = 0 : ?0SA1111 D3-0 are forced to '1'*/ - if (input.pad[i] & INPUT_A) retval &= ~0x10; - if (input.pad[i] & INPUT_START) retval &= ~0x20; - retval &= 0xBF; - break; + /* TH = 0 : ?0SA1111 D3-0 are forced to '1'*/ + if (input.pad[i] & INPUT_A) retval &= ~0x10; + if (input.pad[i] & INPUT_START) retval &= ~0x20; + retval &= 0xBF; + break; case 7: /*** Fourth High ***/ - /* TH = 1 : ?1CBMXYZ Extra buttons returned in D3-0*/ - if (input.pad[i] & INPUT_X) retval &= ~0x04; - if (input.pad[i] & INPUT_Y) retval &= ~0x02; - if (input.pad[i] & INPUT_Z) retval &= ~0x01; - if (input.pad[i] & INPUT_B) retval &= ~0x10; - if (input.pad[i] & INPUT_C) retval &= ~0x20; - if (input.pad[i] & INPUT_MODE) retval &= ~0x08; - break; + /* TH = 1 : ?1CBMXYZ Extra buttons returned in D3-0*/ + if (input.pad[i] & INPUT_X) retval &= ~0x04; + if (input.pad[i] & INPUT_Y) retval &= ~0x02; + if (input.pad[i] & INPUT_Z) retval &= ~0x01; + if (input.pad[i] & INPUT_B) retval &= ~0x10; + if (input.pad[i] & INPUT_C) retval &= ~0x20; + if (input.pad[i] & INPUT_MODE) retval &= ~0x08; + break; default: break; } - /* bit7 is latched*/ - return (retval&0x7f); + /* bit7 is latched */ + return retval; } -void gamepad_write (uint8 i, uint8 data) +static inline void gamepad_write(unsigned int i, unsigned int data) { if (input.dev[i] == DEVICE_6BUTTON) { @@ -348,7 +262,7 @@ void gamepad_write (uint8 i, uint8 data) /***************************************************************************** - * TEAMPLAYER specific functions + * TEAMPLAYER adapter * *****************************************************************************/ struct teamplayer @@ -358,11 +272,11 @@ struct teamplayer uint8 Table[12]; } teamplayer[2]; -void teamplayer_reset(uint8 port) +static inline void teamplayer_reset(unsigned int port) { - uint8 i; - uint8 index = 0; - uint8 pad_input = 0; + int i; + int index = 0; + int pad_input = 0; teamplayer[port].State = 0x60; /* TH = 1, TR = 1 */ teamplayer[port].Counter = 0; @@ -388,23 +302,22 @@ void teamplayer_reset(uint8 port) } } - /* SEGA teamplayer returns successively: - - PAD1 inputs + - PAD1 inputs - PAD2 inputs - PAD3 inputs - PAD4 inputs Each PAD inputs is obtained through 2 or 3 sequential reads: - 1/ DIR buttons + 1/ DIR buttons 2/ START,A,C,B buttons 3/ MODE, X,Y,Z buttons (6Button only !) */ -uint8 teamplayer_read(uint8 port, uint8 index) +static inline unsigned int teamplayer_read_device(unsigned int port, unsigned int index) { - uint8 retval = 0x7F; - uint8 pad_input = teamplayer[port].Table[index] & 0x03; - uint8 pad_num = (4 * port) + ((teamplayer[port].Table[index] >> 2) & 0x03); + int retval = 0x7F; + int pad_input = teamplayer[port].Table[index] & 0x03; + int pad_num = (4 * port) + ((teamplayer[port].Table[index] >> 2) & 0x03); switch (pad_input) { @@ -436,74 +349,279 @@ uint8 teamplayer_read(uint8 port, uint8 index) return retval; } +static inline unsigned int teamplayer_read(unsigned int port) +{ + int retval = 0x7F; + int padnum; + + switch (teamplayer[port].Counter) /* acquisition sequence steps */ + { + case 0: /* initial state: TH = 1, TR = 1 */ + retval = 0x73; + break; + + case 1: /* start request: TH = 0, TR = 1 */ + retval = 0x3F; + break; + + case 2: + case 3: /* ack request: TH=0, TR handshake */ + retval = 0x00; + break; + + case 4: + case 5: + case 6: + case 7: /* gamepads type */ + padnum = (4 * port) + teamplayer[port].Counter - 4; + retval = input.dev[padnum]; + break; + + default: /* gamepads inputs acquisition */ + retval = teamplayer_read_device(port, teamplayer[port].Counter - 8); + break; + } + + /* TL must match TR state */ + retval &= ~0x10; + if (teamplayer[port].State & 0x20) retval |= 0x10; + + return retval; +} + +static inline void teamplayer_write(unsigned int port, unsigned int data) +{ + int old_state = teamplayer[port].State; + teamplayer[port].State = (data & io_reg[port+4]) | (teamplayer[port].State & ~io_reg[port+4]); + if (old_state != teamplayer[port].State) teamplayer[port].Counter ++; + if ((data&0x60) == 0x60) teamplayer[port].Counter = 0; +} + /***************************************************************************** - * MULTITAP generic functions (TEAMPLAYER/4WAYPLAY) + * 4WAYPLAY adapter * *****************************************************************************/ -void multitap_write (uint8 port, uint8 data) +static inline void wayplay_write(unsigned int port, unsigned int data) { - uint8 old_state; - switch (input.system[port]) - { + if (port == 0) gamepad_write(input.current, data); + else input.current = (data >> 4) & 0x07; +} + +static inline unsigned int wayplay_read(unsigned int port) +{ + if (port == 1) return 0x7F; + if (input.current >= 4) return 0x70; /* multitap detection (TH2 = 1) */ + return gamepad_read(input.current); /* 0x0C = Pad1, 0x1C = Pad2, ... */ +} + + +/***************************************************************************** + * I/O wrappers + * + *****************************************************************************/ +unsigned int gamepad_1_read (void) +{ + return gamepad_read(0); +} + +unsigned int gamepad_2_read (void) +{ + return gamepad_read(4); +} + +void gamepad_1_write (unsigned int data) +{ + gamepad_write(0, data); +} + +void gamepad_2_write (unsigned int data) +{ + gamepad_write(4, data); +} + +unsigned int wayplay_1_read (void) +{ + return wayplay_read(0); +} + +unsigned int wayplay_2_read (void) +{ + return wayplay_read(1); +} + +void wayplay_1_write (unsigned int data) +{ + wayplay_write(0, data); +} + +void wayplay_2_write (unsigned int data) +{ + wayplay_write(1, data); +} + +unsigned int teamplayer_1_read (void) +{ + return teamplayer_read(0); +} + +unsigned int teamplayer_2_read (void) +{ + return teamplayer_read(1); +} + +void teamplayer_1_write (unsigned int data) +{ + teamplayer_write(0, data); +} + +void teamplayer_2_write (unsigned int data) +{ + teamplayer_write(1, data); +} + +unsigned int jcart_read(void) +{ + return (gamepad_read(5) | (gamepad_read(6) << 8)); +} + +void jcart_write(unsigned int data) +{ + gamepad_write(5, (data&1) << 6); + gamepad_write(6, (data&1) << 6); + return; +} + +/***************************************************************************** + * Generic INPUTS Control + * + *****************************************************************************/ +void input_reset () +{ + int i,j; + + input.max = 0; + input.current = 0; + + for (i=0; i> 4) & 0x07; + for (i=0; i<4; i++) + { + if (input.dev[i] == DEVICE_6BUTTON) gamepad_update(i); + } + break; + } + + switch (input.system[1]) + { + case SYSTEM_GAMEPAD: + if (input.dev[4] == DEVICE_6BUTTON) gamepad_update(4); break; - case SYSTEM_TEAMPLAYER: - old_state = teamplayer[port].State; - teamplayer[port].State = (data & io_reg[port+4]) | (teamplayer[port].State & ~io_reg[port+4]); - if (old_state != teamplayer[port].State) teamplayer[port].Counter ++; - if ((data&0x60) == 0x60) teamplayer[port].Counter = 0; + case SYSTEM_MENACER: + lightgun_update(0); + break; + + case SYSTEM_JUSTIFIER: + if ((io_reg[2] & 0x30) == 0x00) lightgun_update(0); + if ((io_reg[2] & 0x30) == 0x20) lightgun_update(1); break; } } -uint8 multitap_read (uint8 port) +void input_raz() { - uint8 retval = 0x7F; - uint8 padnum; - - switch (input.system[port]) - { + int i; + switch (input.system[0]) + { + case SYSTEM_GAMEPAD: + if (input.dev[0] == DEVICE_6BUTTON) gamepad_raz(0); + break; + case SYSTEM_WAYPLAY: - if (port == 1) return 0x7F; - if (current_pad >= 4) return 0x70; /* multitap detection (TH2 = 1) */ - return gamepad_read(current_pad); /* 0x0C = Pad1, 0x1C = Pad2, ... */ - - case SYSTEM_TEAMPLAYER: - switch (teamplayer[port].Counter) /* acquisition sequence steps */ - { - case 0: /* initial state: TH = 1, TR = 1 */ - retval = 0x73; - break; - - case 1: /* start request: TH = 0, TR = 1 */ - retval = 0x3F; - break; - - case 2: - case 3: /* ack request: TH=0, TR handshake */ - retval = 0x00; - break; - - case 4: - case 5: - case 6: - case 7: /* gamepads type */ - padnum = (4 * port) + teamplayer[port].Counter - 4; - retval = input.dev[padnum]; - break; - - default: /* gamepads inputs acquisition */ - retval = teamplayer_read(port, teamplayer[port].Counter - 8); - break; - } - - /* TL must match TR state */ - retval &= ~0x10; - if (teamplayer[port].State & 0x20) retval |= 0x10; - return retval; + for (i=0; i<4; i++) + { + if (input.dev[i] == DEVICE_6BUTTON) gamepad_raz(i); + } + break; + } + + switch (input.system[1]) + { + case SYSTEM_GAMEPAD: + if (input.dev[4] == DEVICE_6BUTTON) gamepad_raz(4); + break; } - return retval; } diff --git a/source/input.h b/source/input.h index 29b8be0..fdb27cb 100644 --- a/source/input.h +++ b/source/input.h @@ -1,20 +1,45 @@ -#ifndef _INPUT_H_ -#define _INPUT_H_ -#include "types.h" +/*************************************************************************************** + * Genesis Plus 1.2a + * Peripheral Input Support + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#ifndef _INPUT_HW_H_ +#define _INPUT_HW_H_ + +/* Available inputs */ +#ifdef HW_DOL +#define MAX_INPUTS 4 +#else +#define MAX_INPUTS 8 +#endif /* Input devices */ -#ifdef NGC -#define MAX_INPUTS (4) -#else -#define MAX_INPUTS (8) -#endif -#define MAX_DEVICES (8) +#define MAX_DEVICES (8) + #define DEVICE_3BUTTON (0x00) /* 3-button gamepad */ #define DEVICE_6BUTTON (0x01) /* 6-button gamepad */ -#define DEVICE_MOUSE (0x02) /* Sega Mouse (not supported) */ -#define DEVICE_LIGHTGUN (0x03) /* Sega Menacer */ +#define DEVICE_LIGHTGUN (0x02) /* Sega Menacer */ +#define DEVICE_MOUSE (0x03) /* Sega Mouse (not supported) */ #define DEVICE_2BUTTON (0x04) /* 2-button gamepad (not supported) */ -#define NO_DEVICE (0x0F) /* unconnected */ +#define NO_DEVICE (0x0F) /* unconnected */ /* Input bitmasks */ #define INPUT_MODE (0x00000800) @@ -31,33 +56,60 @@ #define INPUT_UP (0x00000001) /* System bitmasks */ -#define SYSTEM_GAMEPAD (0) /* Single Gamepad */ -#define SYSTEM_TEAMPLAYER (1) /* Sega TeamPlayer (1~8 players) */ -#define SYSTEM_WAYPLAY (2) /* EA 4-Way Play (1~4 players) */ -#define SYSTEM_MENACER (3) /* SEGA Menacer Lightgun */ -#define NO_SYSTEM (4) /* Unconnected Port*/ +#define NO_SYSTEM (0) /* Unconnected Port*/ +#define SYSTEM_GAMEPAD (1) /* Single Gamepad */ +#define SYSTEM_MENACER (2) /* Sega Lightgun */ +#define SYSTEM_JUSTIFIER (3) /* Konami Lightgun */ +#define SYSTEM_TEAMPLAYER (4) /* Sega TeamPlayer */ +#define SYSTEM_WAYPLAY (5) /* EA 4-Way Play (use both ports) */ + +/* Players Inputs */ +#define PLAYER_1A (0) +#define PLAYER_1B (1) +#define PLAYER_1C (2) +#define PLAYER_1D (3) +#define PLAYER_2A (4) +#define PLAYER_2B (5) +#define PLAYER_2C (6) +#define PLAYER_2D (7) typedef struct { - uint8 dev[MAX_DEVICES]; /* Can be any of the DEVICE_* values */ - uint32 pad[MAX_DEVICES]; /* Can be any of the INPUT_* bitmasks */ - uint8 system[2]; /* Can be any of the SYSTEM_* bitmasks (PORTA & PORTB) */ - uint8 max; /* maximum number of connected devices */ + uint8 dev[MAX_DEVICES]; /* Can be any of the DEVICE_* values */ + uint32 pad[MAX_DEVICES]; /* Can be any of the INPUT_* bitmasks */ + uint8 padtype[MAX_DEVICES]; /* 3BUTTONS or 6BUTTONS gamepad */ + uint8 system[2]; /* Can be any of the SYSTEM_* bitmasks */ + uint8 max; /* maximum number of connected devices */ + uint8 current; /* current PAD number (4WAYPLAY) */ + int analog[2][2]; /* analog device */ + int x_offset; + int y_offset; } t_input; -/* global variables */ +/* Global variables */ extern t_input input; -extern uint8 j_cart; /* Function prototypes */ -extern void input_reset (int padtype); +extern void input_reset (void); extern void input_update(void); extern void input_raz(void); -extern void lightgun_set (void); -extern uint8 lightgun_read (void); -extern uint8 gamepad_read (uint8 i); -extern void gamepad_write (uint8 i, uint8 data); -extern uint8 multitap_read (uint8 port); -extern void multitap_write (uint8 port, uint8 data); + +/* Peripherals specific */ +extern unsigned int menacer_read (void); +extern unsigned int justifier_read (void); +extern unsigned int gamepad_1_read (void); +extern unsigned int gamepad_2_read (void); +extern void gamepad_1_write (unsigned int data); +extern void gamepad_2_write (unsigned int data); +extern unsigned int wayplay_1_read (void); +extern unsigned int wayplay_2_read (void); +extern void wayplay_1_write (unsigned int data); +extern void wayplay_2_write (unsigned int data); +extern unsigned int teamplayer_1_read (void); +extern unsigned int teamplayer_2_read (void); +extern void teamplayer_1_write (unsigned int data); +extern void teamplayer_2_write (unsigned int data); +extern unsigned int jcart_read(void); +extern void jcart_write(unsigned int data); #endif diff --git a/source/io.c b/source/io.c index df570f6..9d1d110 100644 --- a/source/io.c +++ b/source/io.c @@ -1,215 +1,189 @@ -/* - Copyright (C) 1999, 2000, 2001, 2002, 2003 Charles MacDonald - - 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - I/O controller chip emulation -*/ - -#include "shared.h" - -uint8 io_reg[0x10]; -uint8 region_code = REGION_USA; -uint8 pad_type = DEVICE_3BUTTON; - -/***************************************************************************** - * IO Read/Write wrappers - * - *****************************************************************************/ - -unsigned char Player1_Read (void) -{ - return gamepad_read(0); -} - -unsigned char Player2_Read (void) -{ - return gamepad_read(4); -} - -void Player1_Write (unsigned char data) -{ - gamepad_write(0, data); -} - -void Player2_Write (unsigned char data) -{ - gamepad_write(4, data); -} - -unsigned char MultiTap1_Read (void) -{ - return multitap_read(0); -} - -unsigned char MultiTap2_Read (void) -{ - return multitap_read(1); -} - -void MultiTap1_Write (unsigned char data) -{ - multitap_write(0, data); -} - -void MultiTap2_Write (unsigned char data) -{ - multitap_write(1, data); -} - -/***************************************************************************** - * I/O chip functions * - * * - ***************************************************************************** -*/ -struct port_t -{ - void (*data_w)(uint8 data); - uint8 (*data_r)(void); -} port[3]; - -void io_reset(void) -{ - /* I/O register default settings */ - uint8 io_def[0x10] = - { - 0xA0, - 0x7F, 0x7F, 0x7F, - 0x00, 0x00, 0x00, - 0xFF, 0x00, 0x00, - 0xFF, 0x00, 0x00, - 0xFB, 0x00, 0x00, - }; - - /* Initialize I/O registers */ - memcpy (io_reg, io_def, 0x10); - - switch (input.system[0]) - { - case SYSTEM_GAMEPAD: - port[0].data_w = Player1_Write; - port[0].data_r = Player1_Read; - break; - - case SYSTEM_WAYPLAY: - case SYSTEM_TEAMPLAYER: - port[0].data_w = MultiTap1_Write; - port[0].data_r = MultiTap1_Read; - break; - - default: - port[0].data_w = NULL; - port[0].data_r = NULL; - break; - } - - switch (input.system[1]) - { - case SYSTEM_GAMEPAD: - port[1].data_w = Player2_Write; - port[1].data_r = Player2_Read; - break; - - case SYSTEM_WAYPLAY: - case SYSTEM_TEAMPLAYER: - port[1].data_w = MultiTap2_Write; - port[1].data_r = MultiTap2_Read; - break; - - case SYSTEM_MENACER: - port[1].data_w = NULL; - port[1].data_r = lightgun_read; - break; - - default: - port[1].data_w = NULL; - port[1].data_r = NULL; - break; - } - - port[2].data_w = NULL; - port[2].data_r = NULL; - - j_cart = 0; - input_reset(pad_type); -} - -void io_write(int offset, int value) -{ - switch (offset) - { - case 0x01: /* Port A Data */ - case 0x02: /* Port B Data */ - case 0x03: /* Port C Data */ - io_reg[offset] = ((value & 0x80) | (value & io_reg[offset+3])); - if(port[offset-1].data_w) port[offset-1].data_w(value); - return; - - case 0x05: /* Port B Ctrl */ - if (((value & 0x7F) == 0x7F) && - ((input.system[0] == SYSTEM_TEAMPLAYER) || - (input.system[1] == SYSTEM_TEAMPLAYER))) - { - /* autodetect 4-Way play ! */ - input.system[0] = SYSTEM_WAYPLAY; - input.system[1] = SYSTEM_WAYPLAY; - port[0].data_w = MultiTap1_Write; - port[0].data_r = MultiTap1_Read; - port[1].data_w = MultiTap2_Write; - port[1].data_r = MultiTap2_Read; - input_reset(pad_type); - } - - case 0x04: /* Port A Ctrl */ - case 0x06: /* Port C Ctrl */ - io_reg[offset] = value & 0xFF; - io_reg[offset-3] = ((io_reg[offset-3] & 0x80) | (io_reg[offset-3] & io_reg[offset])); - break; - - case 0x07: /* Port A TxData */ - case 0x0A: /* Port B TxData */ - case 0x0D: /* Port C TxData */ - io_reg[offset] = value; - break; - - case 0x09: /* Port A S-Ctrl */ - case 0x0C: /* Port B S-Ctrl */ - case 0x0F: /* Port C S-Ctrl */ - io_reg[offset] = (value & 0xF8); - break; - } -} - -int io_read(int offset) -{ - uint8 has_scd = 0x20; /* No Sega CD unit attached */ - uint8 gen_ver = 0x00; /* Version 0 hardware */ - uint8 input = 0x7F; /* default input state */ - - switch(offset) - { - case 0x00: /* Version */ - return (region_code | has_scd | gen_ver); - - case 0x01: /* Port A Data */ - case 0x02: /* Port B Data */ - case 0x03: /* Port C Data */ - if(port[offset-1].data_r) input = port[offset-1].data_r(); - return (io_reg[offset] | ((~io_reg[offset+3]) & input)); - } - - return (io_reg[offset]); -} +/*************************************************************************************** + * Genesis Plus 1.2a + * I/O Chip + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#include "shared.h" + +uint8 io_reg[0x10]; +uint8 region_code = REGION_USA; + +/***************************************************************************** + * I/O chip functions * + * * + *****************************************************************************/ +struct port_t +{ + void (*data_w)(unsigned int data); + unsigned int (*data_r)(void); +} port[3]; + +void io_reset(void) +{ + /* I/O register default settings */ + uint8 io_def[0x10] = + { + 0xA0, + 0x7F, 0x7F, 0x7F, + 0x00, 0x00, 0x00, + 0xFF, 0x00, 0x00, + 0xFF, 0x00, 0x00, + 0xFB, 0x00, 0x00, + }; + + /* Initialize I/O registers */ + memcpy (io_reg, io_def, 0x10); + + /* Initialize Port handlers */ + switch (input.system[0]) + { + case SYSTEM_GAMEPAD: + port[0].data_w = gamepad_1_write; + port[0].data_r = gamepad_1_read; + break; + + case SYSTEM_WAYPLAY: + port[0].data_w = wayplay_1_write; + port[0].data_r = wayplay_1_read; + break; + + case SYSTEM_TEAMPLAYER: + port[0].data_w = teamplayer_1_write; + port[0].data_r = teamplayer_1_read; + break; + + default: + port[0].data_w = NULL; + port[0].data_r = NULL; + break; + } + + switch (input.system[1]) + { + case SYSTEM_GAMEPAD: + port[1].data_w = gamepad_2_write; + port[1].data_r = gamepad_2_read; + break; + + case SYSTEM_MENACER: + port[1].data_w = NULL; + port[1].data_r = menacer_read; + break; + + case SYSTEM_JUSTIFIER: + port[1].data_w = NULL; + port[1].data_r = justifier_read; + break; + + case SYSTEM_WAYPLAY: + port[1].data_w = wayplay_2_write; + port[1].data_r = wayplay_2_read; + break; + + case SYSTEM_TEAMPLAYER: + port[1].data_w = teamplayer_2_write; + port[1].data_r = teamplayer_2_read; + break; + + default: + port[1].data_w = NULL; + port[1].data_r = NULL; + break; + } + + /* External Port (unconnected) */ + port[2].data_w = NULL; + port[2].data_r = NULL; + + /* Initialize Input Devices */ + input_reset(); +} + +void io_write(unsigned int offset, unsigned int value) +{ + switch (offset) + { + case 0x01: /* Port A Data */ + case 0x02: /* Port B Data */ + case 0x03: /* Port C Data */ + io_reg[offset] = ((value & 0x80) | (value & io_reg[offset+3])); + if(port[offset-1].data_w) port[offset-1].data_w(value); + return; + + case 0x05: /* Port B Ctrl */ + if (((value & 0x7F) == 0x7F) && + ((input.system[0] == SYSTEM_TEAMPLAYER) || + (input.system[1] == SYSTEM_TEAMPLAYER))) + { + /* autodetect 4-Way play ! */ + input.system[0] = SYSTEM_WAYPLAY; + input.system[1] = SYSTEM_WAYPLAY; + port[0].data_w = wayplay_1_write; + port[0].data_r = wayplay_1_read; + port[1].data_w = wayplay_2_write; + port[1].data_r = wayplay_2_read; + input_reset(); + } + + case 0x04: /* Port A Ctrl */ + case 0x06: /* Port C Ctrl */ + io_reg[offset] = value & 0xFF; + io_reg[offset-3] = ((io_reg[offset-3] & 0x80) | (io_reg[offset-3] & io_reg[offset])); + return; + + case 0x07: /* Port A TxData */ + case 0x0A: /* Port B TxData */ + case 0x0D: /* Port C TxData */ + io_reg[offset] = value; + return; + + case 0x09: /* Port A S-Ctrl */ + case 0x0C: /* Port B S-Ctrl */ + case 0x0F: /* Port C S-Ctrl */ + io_reg[offset] = (value & 0xF8); + return; + } +} + +unsigned int io_read(unsigned int offset) +{ + switch(offset) + { + case 0x00: /* Version register */ + { + uint8 has_scd = 0x20; /* No Sega CD unit attached */ + uint8 gen_ver = (config.bios_enabled == 3) ? 0x01 : 0x00; /* hardware version */ + return (region_code | has_scd | gen_ver); + } + + case 0x01: /* Port A Data */ + case 0x02: /* Port B Data */ + case 0x03: /* Port C Data */ + { + uint8 input = 0x7F; /* default input state */ + if(port[offset-1].data_r) input = port[offset-1].data_r(); + return (io_reg[offset] | ((~io_reg[offset+3]) & input)); + } + + default: + return (io_reg[offset]); + } +} diff --git a/source/io.h b/source/io.h index 6a0d0ff..79c3822 100644 --- a/source/io.h +++ b/source/io.h @@ -1,20 +1,43 @@ -#ifndef _IO_H_ -#define _IO_H_ - -#define REGION_USA 0x80 -#define REGION_JAPAN_NTSC 0x00 -#define REGION_EUROPE 0xC0 -#define REGION_JAPAN_PAL 0x40 - -/* Global variables */ -extern uint8 io_reg[0x10]; -extern uint8 region_code; -extern uint8 pad_type; - -/* Function prototypes */ -extern void io_reset(void); -extern void io_write(int offset, int value); -extern int io_read(int offset); - -#endif /* _IO_H_ */ - +/*************************************************************************************** + * Genesis Plus 1.2a + * I/O Chip + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#ifndef _IO_H_ +#define _IO_H_ + +#define REGION_USA 0x80 +#define REGION_JAPAN_NTSC 0x00 +#define REGION_EUROPE 0xC0 +#define REGION_JAPAN_PAL 0x40 + +/* Global variables */ +extern uint8 io_reg[0x10]; +extern uint8 region_code; +extern uint8 pad_type; + +/* Function prototypes */ +extern void io_reset(void); +extern void io_write(unsigned int offset, unsigned int value); +extern unsigned int io_read(unsigned int offset); + +#endif /* _IO_H_ */ + diff --git a/source/ngc/gui/rominfo.c b/source/loadrom.c similarity index 53% rename from source/ngc/gui/rominfo.c rename to source/loadrom.c index 436c988..96b76ca 100644 --- a/source/ngc/gui/rominfo.c +++ b/source/loadrom.c @@ -1,409 +1,436 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Information in this module was gleaned from - * http://en.wikibooks.org/wiki/Genesis_Programming - ***************************************************************************/ - -#include "shared.h" -#include "font.h" -#include "rominfo.h" - -#define MAXCOMPANY 64 - -/*** ROM Information ***/ -#define ROMCONSOLE 256 -#define ROMCOPYRIGHT 272 -#define ROMDOMESTIC 288 -#define ROMWORLD 336 -#define ROMTYPE 384 -#define ROMPRODUCT 386 -#define ROMCHECKSUM 398 -#define ROMIOSUPPORT 400 -#define ROMROMSTART 416 -#define ROMROMEND 420 -#define ROMRAMINFO 424 -#define ROMRAMSTART 436 -#define ROMRAMEND 440 -#define ROMMODEMINFO 444 -#define ROMMEMO 456 -#define ROMCOUNTRY 496 - -#define P3BUTTONS 1 -#define P6BUTTONS 2 -#define PKEYBOARD 4 -#define PPRINTER 8 -#define PBALL 16 -#define PFLOPPY 32 -#define PACTIVATOR 64 -#define PTEAMPLAYER 128 -#define PMSYSTEMPAD 256 -#define PSERIAL 512 -#define PTABLET 1024 -#define PPADDLE 2048 -#define PCDROM 4096 -#define PMOUSE 8192 - -typedef struct -{ - char companyid[6]; - char company[30]; -} COMPANYINFO; - -typedef struct -{ - char pID[2]; - char pName[21]; -} PERIPHERALINFO; - -int peripherals; -int checksumok; -ROMINFO rominfo; -uint16 GetRealChecksum (); - - /*************************************************************************** - * Genesis ROM Manufacturers - * - * Based on the document provided at - * http://www.zophar.net/tech/files/Genesis_ROM_Format.txt - ***************************************************************************/ -COMPANYINFO companyinfo[MAXCOMPANY] = { - {"ACLD", "Ballistic"}, - {"RSI", "Razorsoft"}, - {"SEGA", "SEGA"}, - {"TREC", "Treco"}, - {"VRGN", "Virgin Games"}, - {"WSTN", "Westone"}, - {"10", "Takara"}, - {"11", "Taito or Accolade"}, - {"12", "Capcom"}, - {"13", "Data East"}, - {"14", "Namco or Tengen"}, - {"15", "Sunsoft"}, - {"16", "Bandai"}, - {"17", "Dempa"}, - {"18", "Technosoft"}, - {"19", "Technosoft"}, - {"20", "Asmik"}, - {"22", "Micronet"}, - {"23", "Vic Tokai"}, - {"24", "American Sammy"}, - {"29", "Kyugo"}, - {"32", "Wolfteam"}, - {"33", "Kaneko"}, - {"35", "Toaplan"}, - {"36", "Tecmo"}, - {"40", "Toaplan"}, - {"42", "UFL Company Limited"}, - {"43", "Human"}, - {"45", "Game Arts"}, - {"47", "Sage's Creation"}, - {"48", "Tengen"}, - {"49", "Renovation or Telenet"}, - {"50", "Electronic Arts"}, - {"56", "Razorsoft"}, - {"58", "Mentrix"}, - {"60", "Victor Musical Industries"}, - {"69", "Arena"}, - {"70", "Virgin"}, - {"73", "Soft Vision"}, - {"74", "Palsoft"}, - {"76", "Koei"}, - {"79", "U.S. Gold"}, - {"81", "Acclaim/Flying Edge"}, - {"83", "Gametek"}, - {"86", "Absolute"}, - {"87", "Mindscape"}, - {"93", "Sony"}, - {"95", "Konami"}, - {"97", "Tradewest"}, - {"100", "T*HQ Software"}, - {"101", "Tecmagik"}, - {"112", "Designer Software"}, - {"113", "Psygnosis"}, - {"119", "Accolade"}, - {"120", "Code Masters"}, - {"125", "Interplay"}, - {"130", "Activision"}, - {"132", "Shiny & Playmates"}, - {"144", "Atlus"}, - {"151", "Infogrames"}, - {"161", "Fox Interactive"}, - {"177", "Ubisoft"}, - {"239", "Disney Interactive"}, - {"---", "Unknown"} -}; - - /*************************************************************************** - * Genesis Peripheral Information - * - * Based on the document provided at - * http://www.zophar.net/tech/files/Genesis_ROM_Format.txt - ***************************************************************************/ -PERIPHERALINFO peripheralinfo[14] = { - {"J", "3-Button Joypad"}, - {"6", "6-button Joypad"}, - {"K", "Keyboard"}, - {"P", "Printer"}, - {"B", "Control Ball"}, - {"F", "Floppy Drive"}, - {"L", "Activator"}, - {"4", "Team Player"}, - {"0", "MS Joypad"}, - {"R", "RS232C Serial"}, - {"T", "Tablet"}, - {"V", "Paddle"}, - {"C", "CD-ROM"}, - {"M", "Mega Mouse"} -}; - -/**************************************************************************** - * getcompany - * - * Try to determine which company made this rom - * - * Ok, for some reason there's no standard for this. - * It seems that there can be pretty much anything you like following the - * copyright (C) symbol! - ****************************************************************************/ -int getcompany () -{ - char *s; - int i; - char company[10]; - - for (i = 3; i < 8; i++) company[i - 3] = rominfo.copyright[i]; - company[5] = 0; - - /** OK, first look for a hyphen - * Capcom use T-12 for example - */ - s = strstr (company, "-"); - if (s != NULL) - { - s++; - strcpy (company, s); - } - - /** Strip any trailing spaces **/ - for (i = strlen (company) - 1; i >= 0; i--) - if (company[i] == 32) company[i] = 0; - - if (strlen (company) == 0) return MAXCOMPANY - 1; - - for (i = 0; i < MAXCOMPANY - 1; i++) - { - if (!(strncmp (company, companyinfo[i].companyid, strlen (company)))) return i; - } - - return MAXCOMPANY - 1; -} - - - /*************************************************************************** - * getrominfo - * - * Pass a pointer to the ROM base address. - ***************************************************************************/ -void getrominfo (char *romheader) -{ - int i,j; - - memset (&rominfo, 0, sizeof (ROMINFO)); - - memcpy (&rominfo.consoletype, romheader + ROMCONSOLE, 16); - memcpy (&rominfo.copyright, romheader + ROMCOPYRIGHT, 16); - memcpy (&rominfo.domestic, romheader + ROMDOMESTIC, 48); - memcpy (&rominfo.international, romheader + ROMWORLD, 48); - memcpy (&rominfo.ROMType, romheader + ROMTYPE, 2); - memcpy (&rominfo.product, romheader + ROMPRODUCT, 12); - memcpy (&rominfo.checksum, romheader + ROMCHECKSUM, 2); - memcpy (&rominfo.io_support, romheader + ROMIOSUPPORT, 16); - memcpy (&rominfo.romstart, romheader + ROMROMSTART, 4); - memcpy (&rominfo.romend, romheader + ROMROMEND, 4); - memcpy (&rominfo.RAMInfo, romheader + ROMRAMINFO, 12); - memcpy (&rominfo.ramstart, romheader + ROMRAMSTART, 4); - memcpy (&rominfo.ramend, romheader + ROMRAMEND, 4); - memcpy (&rominfo.modem, romheader + ROMMODEMINFO, 12); - memcpy (&rominfo.memo, romheader + ROMMEMO, 40); - memcpy (&rominfo.country, romheader + ROMCOUNTRY, 16); - - checksumok = (GetRealChecksum ((char *) cart_rom + 512, genromsize - 512) - == rominfo.checksum); - - peripherals = 0; - - for (i = 0; i < 14; i++) - for (j=0; j < 14; j++) - if (rominfo.io_support[i] == peripheralinfo[j].pID[0]) peripherals |= (1 << j); - - if (peripherals & P6BUTTONS) pad_type = DEVICE_6BUTTON; - else pad_type = DEVICE_3BUTTON; - -} - -/*************************************************************************** - * Show rom info screen - ***************************************************************************/ - /* Automatically fixing the checksum is not a cool idea - * This should be user switchable, or at least only applied - * when genromsize == ( romend - romstart ) - if(realchecksum != (rominfo.checksum)) - { - sprintf(msg, "WARNING: Possible hacked ROM loaded!"); - write_font( 10, 224, msg); - cart_rom[0x18e] = realchecksum >> 8; - cart_rom[0x18f] = realchecksum & 0xff; - sprintf(msg, "Checksum corrected to %04x", realchecksum); - write_font( 10, 248, msg); - } - */ -void showrominfo () -{ - int ypos; - u8 i,j,quit,redraw,max; - char msg[128]; - short p; - signed char a; - char pName[14][21]; - uint16 realchecksum = GetRealChecksum (((uint8 *) cart_rom) + 0x200, genromsize - 0x200); - - quit = 0; - j = 0; - redraw = 1; - - /*** Remove any still held buttons ***/ - while(PAD_ButtonsHeld(0)) VIDEO_WaitVSync(); - - max = 14; - for (i = 0; i < 14; i++) - { - if (peripherals & (1 << i)) - { - sprintf(pName[max-14],"%s", peripheralinfo[i].pName); - max ++; - } - } - - while (quit == 0) - { - if (redraw) - { - ClearScreen (); - - ypos = 134; - WriteCentre(ypos, "ROM Header Information"); - ypos += 2*fheight; - - for (i=0; i<8; i++) - { - switch (i+j) - { - case 0: - sprintf (msg, "Console type: %s", rominfo.consoletype); - break; - case 1: - sprintf (msg, "Copyright: %s", rominfo.copyright); - break; - case 2: - sprintf (msg, "Company: %s", companyinfo[getcompany ()].company); - break; - case 3: - sprintf (msg, "Game Domestic Name:"); - break; - case 4: - sprintf(msg, " %s",rominfo.domestic); - break; - case 5: - sprintf (msg, "Game International Name:"); - break; - case 6: - sprintf(msg, " %s",rominfo.international); - break; - case 7: - sprintf (msg, "Type - %s : %s", rominfo.ROMType, strcmp (rominfo.ROMType, "AI") ? "Game" : "Educational"); - break; - case 8: - sprintf (msg, "Product - %s", rominfo.product); - break; - case 9: - sprintf (msg, "Checksum - %04x (%04x) (%s)", rominfo.checksum, realchecksum, rominfo.checksum == realchecksum ? "Good" : "Bad"); - break; - case 10: - sprintf (msg, "ROM end: $%06X", rominfo.romend); - break; - case 11: - if (sram.custom) sprintf (msg, "EEPROM(%dK) - $%06X", ((eeprom.type.size_mask+1)* 8) /1024, (unsigned int)sram.start); - else if (sram.detected) sprintf (msg, "SRAM Start - $%06X", rominfo.ramstart); - else sprintf (msg, "External RAM undetected"); - - break; - case 12: - if (sram.custom) sprintf (msg, "EEPROM(%dK) - $%06X", ((eeprom.type.size_mask+1)* 8) /1024, (unsigned int)sram.end); - else if (sram.detected) sprintf (msg, "SRAM End - $%06X", rominfo.ramend); - else if (sram.on) sprintf (msg, "Default SRAM activated "); - else sprintf (msg, "SRAM is disactivated "); - break; - case 13: - if (region_code == REGION_USA) sprintf (msg, "Region - %s (USA)", rominfo.country); - else if (region_code == REGION_EUROPE) sprintf (msg, "Region - %s (EUR)", rominfo.country); - else if (region_code == REGION_JAPAN_NTSC) sprintf (msg, "Region - %s (JAP)", rominfo.country); - else if (region_code == REGION_JAPAN_PAL) sprintf (msg, "Region - %s (JPAL)", rominfo.country); - break; - default: - sprintf (msg, "Supports - %s", pName[i+j-14]); - break; - } - - write_font (100, ypos, msg); - ypos += fheight; - } - - ypos += fheight; - WriteCentre (ypos, "Press A to Continue"); - SetScreen (); - } - - p = PAD_ButtonsDown (0); - a = PAD_StickY (0); - redraw = 0; - - if ((j<(max-8)) && ((p & PAD_BUTTON_DOWN) || (a < -70))) {redraw = 1; j++;} - if ((j>0) && ((p & PAD_BUTTON_UP) || (a > 70))) {redraw = 1; j--;} - if (p & PAD_BUTTON_A) quit = 1; - if (p & PAD_BUTTON_B) quit = 1; - } -} - -/* - * softdev - New Checksum Calculation - */ -uint16 GetRealChecksum (uint8 * rom, int length) -{ - int i; - uint16 checksum = 0; - - for (i = 0; i < length; i += 2) - { - checksum += (uint16) rom[i]; - checksum += (uint16) rom[i + 1] << 8; - } - - return checksum; -} +/*************************************************************************************** + * Genesis Plus 1.2a + * ROM Loading Support + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#include +#include "shared.h" + +/*** ROM Information ***/ +#define ROMCONSOLE 256 +#define ROMCOPYRIGHT 272 +#define ROMDOMESTIC 288 +#define ROMWORLD 336 +#define ROMTYPE 384 +#define ROMPRODUCT 386 +#define ROMCHECKSUM 398 +#define ROMIOSUPPORT 400 +#define ROMROMSTART 416 +#define ROMROMEND 420 +#define ROMRAMINFO 424 +#define ROMRAMSTART 436 +#define ROMRAMEND 440 +#define ROMMODEMINFO 444 +#define ROMMEMO 456 +#define ROMCOUNTRY 496 + +#define P3BUTTONS 1 +#define P6BUTTONS 2 +#define PKEYBOARD 4 +#define PPRINTER 8 +#define PBALL 16 +#define PFLOPPY 32 +#define PACTIVATOR 64 +#define PTEAMPLAYER 128 +#define PMSYSTEMPAD 256 +#define PSERIAL 512 +#define PTABLET 1024 +#define PPADDLE 2048 +#define PCDROM 4096 +#define PMOUSE 8192 + +int peripherals; +uint16 realchecksum; +ROMINFO rominfo; + + /*************************************************************************** + * Genesis ROM Manufacturers + * + * Based on the document provided at + * http://www.zophar.net/tech/files/Genesis_ROM_Format.txt + ***************************************************************************/ +COMPANYINFO companyinfo[MAXCOMPANY] = { + {"ACLD", "Ballistic"}, + {"RSI", "Razorsoft"}, + {"SEGA", "SEGA"}, + {"TREC", "Treco"}, + {"VRGN", "Virgin Games"}, + {"WSTN", "Westone"}, + {"10", "Takara"}, + {"11", "Taito or Accolade"}, + {"12", "Capcom"}, + {"13", "Data East"}, + {"14", "Namco or Tengen"}, + {"15", "Sunsoft"}, + {"16", "Bandai"}, + {"17", "Dempa"}, + {"18", "Technosoft"}, + {"19", "Technosoft"}, + {"20", "Asmik"}, + {"22", "Micronet"}, + {"23", "Vic Tokai"}, + {"24", "American Sammy"}, + {"29", "Kyugo"}, + {"32", "Wolfteam"}, + {"33", "Kaneko"}, + {"35", "Toaplan"}, + {"36", "Tecmo"}, + {"40", "Toaplan"}, + {"42", "UFL Company Limited"}, + {"43", "Human"}, + {"45", "Game Arts"}, + {"47", "Sage's Creation"}, + {"48", "Tengen"}, + {"49", "Renovation or Telenet"}, + {"50", "Electronic Arts"}, + {"56", "Razorsoft"}, + {"58", "Mentrix"}, + {"60", "Victor Musical Industries"}, + {"69", "Arena"}, + {"70", "Virgin"}, + {"73", "Soft Vision"}, + {"74", "Palsoft"}, + {"76", "Koei"}, + {"79", "U.S. Gold"}, + {"81", "Acclaim/Flying Edge"}, + {"83", "Gametek"}, + {"86", "Absolute"}, + {"87", "Mindscape"}, + {"93", "Sony"}, + {"95", "Konami"}, + {"97", "Tradewest"}, + {"100", "T*HQ Software"}, + {"101", "Tecmagik"}, + {"112", "Designer Software"}, + {"113", "Psygnosis"}, + {"119", "Accolade"}, + {"120", "Code Masters"}, + {"125", "Interplay"}, + {"130", "Activision"}, + {"132", "Shiny & Playmates"}, + {"144", "Atlus"}, + {"151", "Infogrames"}, + {"161", "Fox Interactive"}, + {"177", "Ubisoft"}, + {"239", "Disney Interactive"}, + {"---", "Unknown"} +}; + + /*************************************************************************** + * Genesis Peripheral Information + * + * Based on the document provided at + * http://www.zophar.net/tech/files/Genesis_ROM_Format.txt + ***************************************************************************/ +PERIPHERALINFO peripheralinfo[14] = { + {"J", "3-Button Joypad"}, + {"6", "6-button Joypad"}, + {"K", "Keyboard"}, + {"P", "Printer"}, + {"B", "Control Ball"}, + {"F", "Floppy Drive"}, + {"L", "Activator"}, + {"4", "Team Player"}, + {"0", "MS Joypad"}, + {"R", "RS232C Serial"}, + {"T", "Tablet"}, + {"V", "Paddle"}, + {"C", "CD-ROM"}, + {"M", "Mega Mouse"} +}; + +/* + * softdev - New Checksum Calculation + eke-eke: fixed + */ +uint16 GetRealChecksum (uint8 *rom, int length) +{ + int i; + uint16 checksum = 0; + + for (i = 0; i < length; i += 2) + { + checksum += ((rom[i] << 8) + rom[i + 1]); + } + + return checksum; +} + + +/**************************************************************************** + * getcompany + * + * Try to determine which company made this rom + * + * Ok, for some reason there's no standard for this. + * It seems that there can be pretty much anything you like following the + * copyright (C) symbol! + ****************************************************************************/ +int getcompany () +{ + char *s; + int i; + char company[10]; + + for (i = 3; i < 8; i++) company[i - 3] = rominfo.copyright[i]; + company[5] = 0; + + /** OK, first look for a hyphen + * Capcom use T-12 for example + */ + s = strstr (company, "-"); + if (s != NULL) + { + s++; + strcpy (company, s); + } + + /** Strip any trailing spaces **/ + for (i = strlen (company) - 1; i >= 0; i--) + if (company[i] == 32) company[i] = 0; + + if (strlen (company) == 0) return MAXCOMPANY - 1; + + for (i = 0; i < MAXCOMPANY - 1; i++) + { + if (!(strncmp (company, companyinfo[i].companyid, strlen (company)))) return i; + } + + return MAXCOMPANY - 1; +} + + + /*************************************************************************** + * getrominfo + * + * Pass a pointer to the ROM base address. + ***************************************************************************/ +void getrominfo (char *romheader) +{ + int i,j; + + memset (&rominfo, 0, sizeof (ROMINFO)); + + memcpy (&rominfo.consoletype, romheader + ROMCONSOLE, 16); + memcpy (&rominfo.copyright, romheader + ROMCOPYRIGHT, 16); + + rominfo.domestic[0] = romheader[ROMDOMESTIC]; + j=1; + for (i=1; i<48; i++) + { + if ((rominfo.domestic[j-1] != 32) || (romheader[ROMDOMESTIC + i] != 32)) + { + rominfo.domestic[j] = romheader[ROMDOMESTIC + i]; + j++; + } + } + rominfo.domestic[j] = 0; + + rominfo.international[0] = romheader[ROMWORLD]; + j=1; + for (i=1; i<48; i++) + { + if ((rominfo.international[j-1] != 32) || (romheader[ROMWORLD + i] != 32)) + { + rominfo.international[j] = romheader[ROMWORLD + i]; + j++; + } + } + rominfo.international[j] = 0; + + memcpy (&rominfo.ROMType, romheader + ROMTYPE, 2); + memcpy (&rominfo.product, romheader + ROMPRODUCT, 12); + memcpy (&rominfo.checksum, romheader + ROMCHECKSUM, 2); + memcpy (&rominfo.io_support, romheader + ROMIOSUPPORT, 16); + memcpy (&rominfo.romstart, romheader + ROMROMSTART, 4); + memcpy (&rominfo.romend, romheader + ROMROMEND, 4); + memcpy (&rominfo.RAMInfo, romheader + ROMRAMINFO, 12); + memcpy (&rominfo.ramstart, romheader + ROMRAMSTART, 4); + memcpy (&rominfo.ramend, romheader + ROMRAMEND, 4); + memcpy (&rominfo.modem, romheader + ROMMODEMINFO, 12); + memcpy (&rominfo.memo, romheader + ROMMEMO, 40); + memcpy (&rominfo.country, romheader + ROMCOUNTRY, 16); + + realchecksum = GetRealChecksum (((uint8 *) cart_rom) + 0x200, genromsize - 0x200); +#ifdef LSB_FIRST + rominfo.checksum = (rominfo.checksum >> 8) | ((rominfo.checksum & 0xff) << 8); +#endif + + peripherals = 0; + + for (i = 0; i < 14; i++) + for (j=0; j < 14; j++) + if (rominfo.io_support[i] == peripheralinfo[j].pID[0]) peripherals |= (1 << j); + + for (i = 0; i < 8; i++) + { + input.padtype[i] = (peripherals & P6BUTTONS) ? DEVICE_6BUTTON : DEVICE_3BUTTON; +#ifdef HW_RVL + if (config.input[i].device == 1) input.padtype[i] = DEVICE_3BUTTON; +#endif + } +} + +/* 05/05/2006: new region detection routine (taken from GENS sourcecode) */ +void set_region () +{ + /* country codes used to differentiate region */ + /* 0001 = japan ntsc (1) */ + /* 0010 = japan pal (2) */ + /* 0100 = usa (4) */ + /* 1000 = europe (8) */ + + int country = 0; + int i = 0; + char c; + + /* reading header to find the country */ + if (!strnicmp(rominfo.country, "eur", 3)) country |= 8; + else if (!strnicmp(rominfo.country, "usa", 3)) country |= 4; + else if (!strnicmp(rominfo.country, "jap", 3)) country |= 1; + + else for(i = 0; i < 4; i++) + { + c = toupper((int)rominfo.country[i]); + if (c == 'U') country |= 4; + else if (c == 'J') country |= 1; + else if (c == 'E') country |= 8; + else if (c < 16) country |= c; + else if ((c >= '0') && (c <= '9')) country |= c - '0'; + else if ((c >= 'A') && (c <= 'F')) country |= c - 'A' + 10; + } + + /* automatic detection */ + /* setting region */ + /* this is used by IO register */ + if (country & 4) region_code = REGION_USA; + else if (country & 1) region_code = REGION_JAPAN_NTSC; + else if (country & 8) region_code = REGION_EUROPE; + else if (country & 2) region_code = REGION_JAPAN_PAL; + else region_code = REGION_USA; + + /* some games need specific REGION setting */ + if (((strstr(rominfo.product,"T-45033") != NULL) && (rominfo.checksum == 0x0F81)) || /* Alisia Dragon (E) */ + (strstr(rominfo.product,"T-69046-50") != NULL)) /* On Dal Jang Goon (Korea) */ + { + /* need PAL settings */ + region_code = REGION_EUROPE; + } + else if ((realchecksum == 0x532e) && (strstr(rominfo.product,"1011-00") != NULL)) + { + /* On Dal Jang Goon (Korea) needs JAP region code */ + region_code = REGION_JAPAN_NTSC; + } + + /* Force region setting */ + if (config.region_detect == 1) region_code = REGION_USA; + else if (config.region_detect == 2) region_code = REGION_EUROPE; + else if (config.region_detect == 3) region_code = REGION_JAPAN_NTSC; + else if (config.region_detect == 4) region_code = REGION_JAPAN_PAL; + + /* set cpu/vdp speed: PAL or NTSC */ + if ((region_code == REGION_EUROPE) || (region_code == REGION_JAPAN_PAL)) vdp_pal = 1; + else vdp_pal = 0; +} + +/* SMD (interleaved) rom support */ +static uint8 block[0x4000]; + +void deinterleave_block (uint8 * src) +{ + int i; + memcpy (block, src, 0x4000); + for (i = 0; i < 0x2000; i += 1) + { + src[i * 2 + 0] = block[0x2000 + (i)]; + src[i * 2 + 1] = block[0x0000 + (i)]; + } +} + +int load_rom(char *filename) +{ + int i, size, offset = 0; + +#ifdef NGC + size = genromsize; +#else + uint8 *ptr; + ptr = load_archive(filename, &size); + if(!ptr) return (0); + memcpy(cart_rom, ptr + offset, size); + free(ptr); +#endif + + /* detect interleaved roms (.smd format) */ + if (strncmp((char *)(cart_rom + 0x100),"SEGA", 4) && ((size / 512) & 1)) + { + size -= 512; + offset += 512; + + for (i = 0; i < (size / 0x4000); i += 1) + { + deinterleave_block (cart_rom + offset + (i * 0x4000)); + } + + memcpy(cart_rom, cart_rom + offset, size); + } + + /* max. 10 MBytes supported */ + if (size > 0xA00000) size = 0xA00000; + genromsize = size; + + /* clear unused ROM space */ + if (size < 0xA00000) memset (cart_rom + size, 0x00, 0xA00000 - size); + + getrominfo((char *)cart_rom); /* get infos from ROM header */ + set_region(); /* set game region (PAL/NTSC, JAP/USA/EUR) */ + +#ifdef LSB_FIRST + /* Byteswap ROM */ + uint8 temp; + for(i = 0; i < genromsize; i += 2) + { + temp = cart_rom[i]; + cart_rom[i] = cart_rom[i+1]; + cart_rom[i+1] = temp; + } +#endif + + /* byteswapped RADICA dumps (from Haze) */ + if (((strstr(rominfo.product,"-K0101") != NULL) && (rominfo.checksum == 0xf424)) || + ((strstr(rominfo.product,"-K0109") != NULL) && (rominfo.checksum == 0x4f10))) + { + uint8 temp; + for(i = 0; i < genromsize; i += 2) + { + temp = cart_rom[i]; + cart_rom[i] = cart_rom[i+1]; + cart_rom[i+1] = temp; + } + } + + /* console hardware */ + if (strstr(rominfo.consoletype, "SEGA PICO") != NULL) system_hw = SYSTEM_PICO; + else if (strstr(rominfo.consoletype, "SEGA MEGADRIVE") != NULL) system_hw = SYSTEM_MEGADRIVE; + else system_hw = SYSTEM_GENESIS; + + return(1); +} diff --git a/source/ngc/gui/rominfo.h b/source/loadrom.h similarity index 69% rename from source/ngc/gui/rominfo.h rename to source/loadrom.h index 9078dbf..edbab9b 100644 --- a/source/ngc/gui/rominfo.h +++ b/source/loadrom.h @@ -1,49 +1,70 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Information in this module was gleaned from - * http://en.wikibooks.org/wiki/Genesis_Programming - ***************************************************************************/ -#include "shared.h" - - -typedef struct -{ - char consoletype[18]; /* Genesis or Mega Drive */ - char copyright[18]; /* Copyright message */ - char domestic[50]; /* Domestic name of ROM */ - char international[50]; /* International name of ROM */ - char ROMType[4]; /* Educational or Game */ - char product[14]; /* Product serial number */ - unsigned short checksum; /* Checksum */ - char io_support[18]; /* Actually 16 chars :) */ - unsigned int romstart; - unsigned int romend; - char RAMInfo[14]; - unsigned int ramstart; - unsigned int ramend; - char modem[14]; - char memo[50]; - char country[18]; -} ROMINFO; - - -extern void getrominfo (char *romheader); -extern void showrominfo (); -extern ROMINFO rominfo; +/*************************************************************************************** + * Genesis Plus 1.2a + * ROM Loading Support + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ +#ifndef _LOADROM_H_ +#define _LOADROM_H_ + +#define MAXCOMPANY 64 + +typedef struct +{ + char consoletype[18]; /* Genesis or Mega Drive */ + char copyright[18]; /* Copyright message */ + char domestic[50]; /* Domestic name of ROM */ + char international[50]; /* International name of ROM */ + char ROMType[4]; /* Educational or Game */ + char product[14]; /* Product serial number */ + unsigned short checksum; /* Checksum */ + char io_support[18]; /* Actually 16 chars :) */ + unsigned int romstart; + unsigned int romend; + char RAMInfo[14]; + unsigned int ramstart; + unsigned int ramend; + char modem[14]; + char memo[50]; + char country[18]; +} ROMINFO; + +typedef struct +{ + char companyid[6]; + char company[30]; +} COMPANYINFO; + +typedef struct +{ + char pID[2]; + char pName[21]; +} PERIPHERALINFO; + +/* Global variables */ +extern ROMINFO rominfo; +extern COMPANYINFO companyinfo[MAXCOMPANY]; +extern PERIPHERALINFO peripheralinfo[14]; +extern uint16 realchecksum; + +/* Function prototypes */ +extern int load_rom(char *filename); + +#endif /* _LOADROM_H_ */ + diff --git a/source/cpu/m68k.h b/source/m68k/m68k.h similarity index 80% rename from source/cpu/m68k.h rename to source/m68k/m68k.h index 6fc93b3..c2536a9 100644 --- a/source/cpu/m68k.h +++ b/source/m68k/m68k.h @@ -1,342 +1,381 @@ -#ifndef M68K__HEADER -#define M68K__HEADER - -/* ======================================================================== */ -/* ========================= LICENSING & COPYRIGHT ======================== */ -/* ======================================================================== */ -/* - * MUSASHI - * Version 3.3 - * - * A portable Motorola M680x0 processor emulation engine. - * Copyright 1998-2001 Karl Stenerud. All rights reserved. - * - * This code may be freely used for non-commercial purposes as long as this - * copyright notice remains unaltered in the source code and any binary files - * containing this code in compiled form. - * - * All other lisencing terms must be negotiated with the author - * (Karl Stenerud). - * - * The latest version of this code can be obtained at: - * http://kstenerud.cjb.net - */ - - - -/* ======================================================================== */ -/* ============================ GENERAL DEFINES =========================== */ - -/* ======================================================================== */ - -/* There are 7 levels of interrupt to the 68K. - * A transition from < 7 to 7 will cause a non-maskable interrupt (NMI). - */ -#define M68K_IRQ_NONE 0 -#define M68K_IRQ_1 1 -#define M68K_IRQ_2 2 -#define M68K_IRQ_3 3 -#define M68K_IRQ_4 4 -#define M68K_IRQ_5 5 -#define M68K_IRQ_6 6 -#define M68K_IRQ_7 7 - - -/* Special interrupt acknowledge values. - * Use these as special returns from the interrupt acknowledge callback - * (specified later in this header). - */ - -/* Causes an interrupt autovector (0x18 + interrupt level) to be taken. - * This happens in a real 68K if VPA or AVEC is asserted during an interrupt - * acknowledge cycle instead of DTACK. - */ -#define M68K_INT_ACK_AUTOVECTOR 0xffffffff - -/* Causes the spurious interrupt vector (0x18) to be taken - * This happens in a real 68K if BERR is asserted during the interrupt - * acknowledge cycle (i.e. no devices responded to the acknowledge). - */ -#define M68K_INT_ACK_SPURIOUS 0xfffffffe - - -/* CPU types for use in m68k_set_cpu_type() */ -enum -{ - M68K_CPU_TYPE_INVALID, - M68K_CPU_TYPE_68000, - M68K_CPU_TYPE_68010, - M68K_CPU_TYPE_68EC020, - M68K_CPU_TYPE_68020, - M68K_CPU_TYPE_68030, /* Supported by disassembler ONLY */ - M68K_CPU_TYPE_68040 /* Supported by disassembler ONLY */ -}; - -/* Registers used by m68k_get_reg() and m68k_set_reg() */ -typedef enum -{ - /* Real registers */ - M68K_REG_D0, /* Data registers */ - M68K_REG_D1, - M68K_REG_D2, - M68K_REG_D3, - M68K_REG_D4, - M68K_REG_D5, - M68K_REG_D6, - M68K_REG_D7, - M68K_REG_A0, /* Address registers */ - M68K_REG_A1, - M68K_REG_A2, - M68K_REG_A3, - M68K_REG_A4, - M68K_REG_A5, - M68K_REG_A6, - M68K_REG_A7, - M68K_REG_PC, /* Program Counter */ - M68K_REG_SR, /* Status Register */ - M68K_REG_SP, /* The current Stack Pointer (located in A7) */ - M68K_REG_USP, /* User Stack Pointer */ - M68K_REG_ISP, /* Interrupt Stack Pointer */ - M68K_REG_MSP, /* Master Stack Pointer */ - M68K_REG_SFC, /* Source Function Code */ - M68K_REG_DFC, /* Destination Function Code */ - M68K_REG_VBR, /* Vector Base Register */ - M68K_REG_CACR, /* Cache Control Register */ - M68K_REG_CAAR, /* Cache Address Register */ - - /* Assumed registers */ - /* These are cheat registers which emulate the 1-longword prefetch - * present in the 68000 and 68010. - */ - M68K_REG_PREF_ADDR, /* Last prefetch address */ - M68K_REG_PREF_DATA, /* Last prefetch data */ - - /* Convenience registers */ - M68K_REG_PPC, /* Previous value in the program counter */ - M68K_REG_IR, /* Instruction register */ - M68K_REG_CPU_TYPE /* Type of CPU being run */ -} m68k_register_t; - -/* ======================================================================== */ -/* ====================== FUNCTIONS CALLED BY THE CPU ===================== */ -/* ======================================================================== */ - -/* You will have to implement these functions */ - -/* read/write functions called by the CPU to access memory. - * while values used are 32 bits, only the appropriate number - * of bits are relevant (i.e. in write_memory_8, only the lower 8 bits - * of value should be written to memory). - * - * NOTE: I have separated the immediate and PC-relative memory fetches - * from the other memory fetches because some systems require - * differentiation between PROGRAM and DATA fetches (usually - * for security setups such as encryption). - * This separation can either be achieved by setting - * M68K_SEPARATE_READS in m68kconf.h and defining - * the read functions, or by setting M68K_EMULATE_FC and - * making a function code callback function. - * Using the callback offers better emulation coverage - * because you can also monitor whether the CPU is in SYSTEM or - * USER mode, but it is also slower. - */ - -/* Read from anywhere */ -unsigned int m68k_read_memory_8(unsigned int address); -unsigned int m68k_read_memory_16(unsigned int address); -unsigned int m68k_read_memory_32(unsigned int address); - -/* Read data immediately following the PC */ -unsigned int m68k_read_immediate_16(unsigned int address); -unsigned int m68k_read_immediate_32(unsigned int address); - -/* Read data relative to the PC */ -unsigned int m68k_read_pcrelative_8(unsigned int address); -unsigned int m68k_read_pcrelative_16(unsigned int address); -unsigned int m68k_read_pcrelative_32(unsigned int address); - -/* Memory access for the disassembler */ -unsigned int m68k_read_disassembler_8 (unsigned int address); -unsigned int m68k_read_disassembler_16 (unsigned int address); -unsigned int m68k_read_disassembler_32 (unsigned int address); - -/* Write to anywhere */ -void m68k_write_memory_8(unsigned int address, unsigned int value); -void m68k_write_memory_16(unsigned int address, unsigned int value); -void m68k_write_memory_32(unsigned int address, unsigned int value); - - - -/* ======================================================================== */ -/* ============================== CALLBACKS =============================== */ -/* ======================================================================== */ - -/* These functions allow you to set callbacks to the host when specific events - * occur. Note that you must enable the corresponding value in m68kconf.h - * in order for these to do anything useful. - * Note: I have defined default callbacks which are used if you have enabled - * the corresponding #define in m68kconf.h but either haven't assigned a - * callback or have assigned a callback of NULL. - */ - -/* Set the callback for an interrupt acknowledge. - * You must enable M68K_EMULATE_INT_ACK in m68kconf.h. - * The CPU will call the callback with the interrupt level being acknowledged. - * The host program must return either a vector from 0x02-0xff, or one of the - * special interrupt acknowledge values specified earlier in this header. - * If this is not implemented, the CPU will always assume an autovectored - * interrupt, and will automatically clear the interrupt request when it - * services the interrupt. - * Default behavior: return M68K_INT_ACK_AUTOVECTOR. - */ -void m68k_set_int_ack_callback(int (*callback)(int int_level)); - - -/* Set the callback for a breakpoint acknowledge (68010+). - * You must enable M68K_EMULATE_BKPT_ACK in m68kconf.h. - * The CPU will call the callback with whatever was in the data field of the - * BKPT instruction for 68020+, or 0 for 68010. - * Default behavior: do nothing. - */ -void m68k_set_bkpt_ack_callback(void (*callback)(unsigned int data)); - - -/* Set the callback for the RESET instruction. - * You must enable M68K_EMULATE_RESET in m68kconf.h. - * The CPU calls this callback every time it encounters a RESET instruction. - * Default behavior: do nothing. - */ -void m68k_set_reset_instr_callback(void (*callback)(void)); - - -/* Set the callback for informing of a large PC change. - * You must enable M68K_MONITOR_PC in m68kconf.h. - * The CPU calls this callback with the new PC value every time the PC changes - * by a large value (currently set for changes by longwords). - * Default behavior: do nothing. - */ -void m68k_set_pc_changed_callback(void (*callback)(unsigned int new_pc)); - - -/* Set the callback for CPU function code changes. - * You must enable M68K_EMULATE_FC in m68kconf.h. - * The CPU calls this callback with the function code before every memory - * access to set the CPU's function code according to what kind of memory - * access it is (supervisor/user, program/data and such). - * Default behavior: do nothing. - */ -void m68k_set_fc_callback(void (*callback)(unsigned int new_fc)); - - -/* Set a callback for the instruction cycle of the CPU. - * You must enable M68K_INSTRUCTION_HOOK in m68kconf.h. - * The CPU calls this callback just before fetching the opcode in the - * instruction cycle. - * Default behavior: do nothing. - */ -void m68k_set_instr_hook_callback(void (*callback)(void)); - - - -/* ======================================================================== */ -/* ====================== FUNCTIONS TO ACCESS THE CPU ===================== */ -/* ======================================================================== */ - -/* Use this function to set the CPU type you want to emulate. - * Currently supported types are: M68K_CPU_TYPE_68000, M68K_CPU_TYPE_68010, - * M68K_CPU_TYPE_EC020, and M68K_CPU_TYPE_68020. - */ -void m68k_set_cpu_type(unsigned int cpu_type); - -/* Pulse the RESET pin on the CPU. - * You *MUST* reset the CPU at least once to initialize the emulation - * Note: If you didn't call m68k_set_cpu_type() before resetting - * the CPU for the first time, the CPU will be set to - * M68K_CPU_TYPE_68000. - */ -void m68k_pulse_reset(void); - -/* execute num_cycles worth of instructions. returns number of cycles used */ -int m68k_execute(int num_cycles); - -/* These functions let you read/write/modify the number of cycles left to run - * while m68k_execute() is running. - * These are useful if the 68k accesses a memory-mapped port on another device - * that requires immediate processing by another CPU. - */ -int m68k_cycles_run(void); /* Number of cycles run so far */ -int m68k_cycles_remaining(void); /* Number of cycles left */ -void m68k_modify_timeslice(int cycles); /* Modify cycles left */ -void m68k_end_timeslice(void); /* End timeslice now */ - -/* Set the IPL0-IPL2 pins on the CPU (IRQ). - * A transition from < 7 to 7 will cause a non-maskable interrupt (NMI). - * Setting IRQ to 0 will clear an interrupt request. - */ -void m68k_set_irq(unsigned int int_level); - - -/* Halt the CPU as if you pulsed the HALT pin. */ -void m68k_pulse_halt(void); - - -/* Context switching to allow multiple CPUs */ - -/* Get the size of the cpu context in bytes */ -unsigned int m68k_context_size(void); - -/* Get a cpu context */ -unsigned int m68k_get_context(void* dst); - -/* set the current cpu context */ -void m68k_set_context(void* dst); - -/* Save the current cpu context to disk. - * You must provide a function pointer of the form: - * void save_value(char* identifier, unsigned int value) - */ -void m68k_save_context( void (*save_value)(char* identifier, unsigned int value)); - -/* Load a cpu context from disk. - * You must provide a function pointer of the form: - * unsigned int load_value(char* identifier) - */ -void m68k_load_context(unsigned int (*load_value)(char* identifier)); - - - -/* Peek at the internals of a CPU context. This can either be a context - * retrieved using m68k_get_context() or the currently running context. - * If context is NULL, the currently running CPU context will be used. - */ -unsigned int m68k_get_reg(void* context, m68k_register_t reg); - -/* Poke values into the internals of the currently running CPU context */ -void m68k_set_reg(m68k_register_t reg, unsigned int value); - -/* Check if an instruction is valid for the specified CPU type */ -unsigned int m68k_is_valid_instruction(unsigned int instruction, unsigned int cpu_type); - -/* Disassemble 1 instruction using the epecified CPU type at pc. Stores - * disassembly in str_buff and returns the size of the instruction in bytes. - */ -unsigned int m68k_disassemble(char* str_buff, unsigned int pc, unsigned int cpu_type); - - -/* ======================================================================== */ -/* ============================= CONFIGURATION ============================ */ -/* ======================================================================== */ - -/* Import the configuration for this build */ -#include "m68kconf.h" - - - -/* ======================================================================== */ -/* ============================== END OF FILE ============================= */ -/* ======================================================================== */ - -#endif /* M68K__HEADER */ - -/*** Not really required, but makes for clean compile under DevkitPPC ***/ -extern int vdp_int_ack_callback(int int_level); +#ifndef M68K__HEADER +#define M68K__HEADER + +/* ======================================================================== */ +/* ========================= LICENSING & COPYRIGHT ======================== */ +/* ======================================================================== */ +/* + * MUSASHI + * Version 3.32 + * + * A portable Motorola M680x0 processor emulation engine. + * Copyright Karl Stenerud. All rights reserved. + * + * This code may be freely used for non-commercial purposes as long as this + * copyright notice remains unaltered in the source code and any binary files + * containing this code in compiled form. + * + * All other licensing terms must be negotiated with the author + * (Karl Stenerud). + * + * The latest version of this code can be obtained at: + * http://kstenerud.cjb.net + */ + +/* ======================================================================== */ +/* ============================= CONFIGURATION ============================ */ +/* ======================================================================== */ + +/* Import the configuration for this build */ +#include "m68kconf.h" + + +/* ======================================================================== */ +/* ============================ GENERAL DEFINES =========================== */ + +/* ======================================================================== */ + +/* There are 7 levels of interrupt to the 68K. + * A transition from < 7 to 7 will cause a non-maskable interrupt (NMI). + */ +#define M68K_IRQ_NONE 0 +#define M68K_IRQ_1 1 +#define M68K_IRQ_2 2 +#define M68K_IRQ_3 3 +#define M68K_IRQ_4 4 +#define M68K_IRQ_5 5 +#define M68K_IRQ_6 6 +#define M68K_IRQ_7 7 + + +/* Special interrupt acknowledge values. + * Use these as special returns from the interrupt acknowledge callback + * (specified later in this header). + */ + +/* Causes an interrupt autovector (0x18 + interrupt level) to be taken. + * This happens in a real 68K if VPA or AVEC is asserted during an interrupt + * acknowledge cycle instead of DTACK. + */ +#define M68K_INT_ACK_AUTOVECTOR 0xffffffff + +/* Causes the spurious interrupt vector (0x18) to be taken + * This happens in a real 68K if BERR is asserted during the interrupt + * acknowledge cycle (i.e. no devices responded to the acknowledge). + */ +#define M68K_INT_ACK_SPURIOUS 0xfffffffe + + +/* CPU types for use in m68k_set_cpu_type() */ +enum +{ + M68K_CPU_TYPE_INVALID, + M68K_CPU_TYPE_68000, + M68K_CPU_TYPE_68008, + M68K_CPU_TYPE_68010, + M68K_CPU_TYPE_68EC020, + M68K_CPU_TYPE_68020, + M68K_CPU_TYPE_68030, /* Supported by disassembler ONLY */ + M68K_CPU_TYPE_68040 /* Supported by disassembler ONLY */ +}; + +/* Registers used by m68k_get_reg() and m68k_set_reg() */ +typedef enum +{ + /* Real registers */ + M68K_REG_D0, /* Data registers */ + M68K_REG_D1, + M68K_REG_D2, + M68K_REG_D3, + M68K_REG_D4, + M68K_REG_D5, + M68K_REG_D6, + M68K_REG_D7, + M68K_REG_A0, /* Address registers */ + M68K_REG_A1, + M68K_REG_A2, + M68K_REG_A3, + M68K_REG_A4, + M68K_REG_A5, + M68K_REG_A6, + M68K_REG_A7, + M68K_REG_PC, /* Program Counter */ + M68K_REG_SR, /* Status Register */ + M68K_REG_SP, /* The current Stack Pointer (located in A7) */ + M68K_REG_USP, /* User Stack Pointer */ + M68K_REG_ISP, /* Interrupt Stack Pointer */ + M68K_REG_MSP, /* Master Stack Pointer */ + M68K_REG_SFC, /* Source Function Code */ + M68K_REG_DFC, /* Destination Function Code */ + M68K_REG_VBR, /* Vector Base Register */ + M68K_REG_CACR, /* Cache Control Register */ + M68K_REG_CAAR, /* Cache Address Register */ + + /* Assumed registers */ + /* These are cheat registers which emulate the 1-longword prefetch + * present in the 68000 and 68010. + */ + M68K_REG_PREF_ADDR, /* Last prefetch address */ + M68K_REG_PREF_DATA, /* Last prefetch data */ + + /* Convenience registers */ + M68K_REG_PPC, /* Previous value in the program counter */ + M68K_REG_IR, /* Instruction register */ + M68K_REG_CPU_TYPE /* Type of CPU being run */ +} m68k_register_t; + +/* ======================================================================== */ +/* ====================== FUNCTIONS CALLED BY THE CPU ===================== */ +/* ======================================================================== */ + +/* You will have to implement these functions */ + +/* read/write functions called by the CPU to access memory. + * while values used are 32 bits, only the appropriate number + * of bits are relevant (i.e. in write_memory_8, only the lower 8 bits + * of value should be written to memory). + * + * NOTE: I have separated the immediate and PC-relative memory fetches + * from the other memory fetches because some systems require + * differentiation between PROGRAM and DATA fetches (usually + * for security setups such as encryption). + * This separation can either be achieved by setting + * M68K_SEPARATE_READS in m68kconf.h and defining + * the read functions, or by setting M68K_EMULATE_FC and + * making a function code callback function. + * Using the callback offers better emulation coverage + * because you can also monitor whether the CPU is in SYSTEM or + * USER mode, but it is also slower. + */ + +/* Read from anywhere */ +unsigned int m68k_read_memory_8(unsigned int address); +unsigned int m68k_read_memory_16(unsigned int address); +unsigned int m68k_read_memory_32(unsigned int address); + +/* Read data immediately following the PC */ +unsigned int m68k_read_immediate_16(unsigned int address); +unsigned int m68k_read_immediate_32(unsigned int address); + +/* Read data relative to the PC */ +unsigned int m68k_read_pcrelative_8(unsigned int address); +unsigned int m68k_read_pcrelative_16(unsigned int address); +unsigned int m68k_read_pcrelative_32(unsigned int address); + +/* Memory access for the disassembler */ +unsigned int m68k_read_disassembler_8 (unsigned int address); +unsigned int m68k_read_disassembler_16 (unsigned int address); +unsigned int m68k_read_disassembler_32 (unsigned int address); + +/* Write to anywhere */ +void m68k_write_memory_8(unsigned int address, unsigned int value); +void m68k_write_memory_16(unsigned int address, unsigned int value); +void m68k_write_memory_32(unsigned int address, unsigned int value); + +/* Special call to simulate undocumented 68k behavior when move.l with a + * predecrement destination mode is executed. + * To simulate real 68k behavior, first write the high word to + * [address+2], and then write the low word to [address]. + * + * Enable this functionality with M68K_SIMULATE_PD_WRITES in m68kconf.h. + */ +void m68k_write_memory_32_pd(unsigned int address, unsigned int value); + + + +/* ======================================================================== */ +/* ============================== CALLBACKS =============================== */ +/* ======================================================================== */ + +/* These functions allow you to set callbacks to the host when specific events + * occur. Note that you must enable the corresponding value in m68kconf.h + * in order for these to do anything useful. + * Note: I have defined default callbacks which are used if you have enabled + * the corresponding #define in m68kconf.h but either haven't assigned a + * callback or have assigned a callback of NULL. + */ + +/* Set the callback for an interrupt acknowledge. + * You must enable M68K_EMULATE_INT_ACK in m68kconf.h. + * The CPU will call the callback with the interrupt level being acknowledged. + * The host program must return either a vector from 0x02-0xff, or one of the + * special interrupt acknowledge values specified earlier in this header. + * If this is not implemented, the CPU will always assume an autovectored + * interrupt, and will automatically clear the interrupt request when it + * services the interrupt. + * Default behavior: return M68K_INT_ACK_AUTOVECTOR. + */ +void m68k_set_int_ack_callback(int (*callback)(int int_level)); + + +/* Set the callback for a breakpoint acknowledge (68010+). + * You must enable M68K_EMULATE_BKPT_ACK in m68kconf.h. + * The CPU will call the callback with whatever was in the data field of the + * BKPT instruction for 68020+, or 0 for 68010. + * Default behavior: do nothing. + */ +void m68k_set_bkpt_ack_callback(void (*callback)(unsigned int data)); + + +/* Set the callback for the RESET instruction. + * You must enable M68K_EMULATE_RESET in m68kconf.h. + * The CPU calls this callback every time it encounters a RESET instruction. + * Default behavior: do nothing. + */ +void m68k_set_reset_instr_callback(void (*callback)(void)); + + +/* Set the callback for the CMPI.L #v, Dn instruction. + * You must enable M68K_CMPILD_HAS_CALLBACK in m68kconf.h. + * The CPU calls this callback every time it encounters a CMPI.L #v, Dn instruction. + * Default behavior: do nothing. + */ +void m68k_set_cmpild_instr_callback(void (*callback)(unsigned int val, int reg)); + + +/* Set the callback for the RTE instruction. + * You must enable M68K_RTE_HAS_CALLBACK in m68kconf.h. + * The CPU calls this callback every time it encounters a RTE instruction. + * Default behavior: do nothing. + */ +void m68k_set_rte_instr_callback(void (*callback)(void)); + +/* Set the callback for the TAS instruction. + * You must enable M68K_TAS_HAS_CALLBACK in m68kconf.h. + * The CPU calls this callback every time it encounters a TAS instruction. + * Default behavior: return 1, allow writeback. + */ +void m68k_set_tas_instr_callback(int (*callback)(void)); + + + +/* Set the callback for informing of a large PC change. + * You must enable M68K_MONITOR_PC in m68kconf.h. + * The CPU calls this callback with the new PC value every time the PC changes + * by a large value (currently set for changes by longwords). + * Default behavior: do nothing. + */ +void m68k_set_pc_changed_callback(void (*callback)(unsigned int new_pc)); + + +/* Set the callback for CPU function code changes. + * You must enable M68K_EMULATE_FC in m68kconf.h. + * The CPU calls this callback with the function code before every memory + * access to set the CPU's function code according to what kind of memory + * access it is (supervisor/user, program/data and such). + * Default behavior: do nothing. + */ +void m68k_set_fc_callback(void (*callback)(unsigned int new_fc)); + + +/* Set a callback for the instruction cycle of the CPU. + * You must enable M68K_INSTRUCTION_HOOK in m68kconf.h. + * The CPU calls this callback just before fetching the opcode in the + * instruction cycle. + * Default behavior: do nothing. + */ +void m68k_set_instr_hook_callback(void (*callback)(unsigned int pc)); + + + +/* ======================================================================== */ +/* ====================== FUNCTIONS TO ACCESS THE CPU ===================== */ +/* ======================================================================== */ + +/* Use this function to set the CPU type you want to emulate. + * Currently supported types are: M68K_CPU_TYPE_68000, M68K_CPU_TYPE_68008, + * M68K_CPU_TYPE_68010, M68K_CPU_TYPE_EC020, and M68K_CPU_TYPE_68020. + */ +void m68k_set_cpu_type(unsigned int cpu_type); + +/* Do whatever initialisations the core requires. Should be called + * at least once at init time. + */ +void m68k_init(void); + +/* Pulse the RESET pin on the CPU. + * You *MUST* reset the CPU at least once to initialize the emulation + * Note: If you didn't call m68k_set_cpu_type() before resetting + * the CPU for the first time, the CPU will be set to + * M68K_CPU_TYPE_68000. + */ +void m68k_pulse_reset(void); + +/* execute num_cycles worth of instructions. returns number of cycles used */ +int m68k_execute(int num_cycles); + +/* These functions let you read/write/modify the number of cycles left to run + * while m68k_execute() is running. + * These are useful if the 68k accesses a memory-mapped port on another device + * that requires immediate processing by another CPU. + */ +int m68k_cycles_run(void); /* Number of cycles run so far */ +int m68k_cycles_remaining(void); /* Number of cycles left */ +void m68k_modify_timeslice(int cycles); /* Modify cycles left */ +void m68k_end_timeslice(void); /* End timeslice now */ + +/* Set the IPL0-IPL2 pins on the CPU (IRQ). + * A transition from < 7 to 7 will cause a non-maskable interrupt (NMI). + * Setting IRQ to 0 will clear an interrupt request. + */ +void m68k_set_irq(unsigned int int_level); + + +/* Halt the CPU as if you pulsed the HALT pin. */ +void m68k_pulse_halt(void); + + +/* Context switching to allow multiple CPUs */ + +/* Get the size of the cpu context in bytes */ +unsigned int m68k_context_size(void); + +/* Get a cpu context */ +unsigned int m68k_get_context(void* dst); + +/* set the current cpu context */ +void m68k_set_context(void* dst); + +/* Register the CPU state information */ +void m68k_state_register(const char *type, int index); + + +/* Peek at the internals of a CPU context. This can either be a context + * retrieved using m68k_get_context() or the currently running context. + * If context is NULL, the currently running CPU context will be used. + */ +unsigned int m68k_get_reg(void* context, m68k_register_t reg); + +/* Poke values into the internals of the currently running CPU context */ +void m68k_set_reg(m68k_register_t reg, unsigned int value); + +/* Check if an instruction is valid for the specified CPU type */ +unsigned int m68k_is_valid_instruction(unsigned int instruction, unsigned int cpu_type); + +/* Disassemble 1 instruction using the epecified CPU type at pc. Stores + * disassembly in str_buff and returns the size of the instruction in bytes. + */ +unsigned int m68k_disassemble(char* str_buff, unsigned int pc, unsigned int cpu_type); + +/* Same as above but accepts raw opcode data directly rather than fetching + * via the read/write interfaces. + */ +unsigned int m68k_disassemble_raw(char* str_buff, unsigned int pc, const unsigned char* opdata, const unsigned char* argdata, unsigned int cpu_type); + +/*** Not really required, but makes for clean compile under DevkitPPC ***/ +extern int vdp_int_ack_callback(int int_level); + +/* ======================================================================== */ +/* ============================== MAME STUFF ============================== */ +/* ======================================================================== */ + +#if M68K_COMPILE_FOR_MAME == OPT_ON +#include "m68kmame.h" +#endif /* M68K_COMPILE_FOR_MAME */ + + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ + +#endif /* M68K__HEADER */ diff --git a/source/cpu/m68kconf.h b/source/m68k/m68kconf.h similarity index 66% rename from source/cpu/m68kconf.h rename to source/m68k/m68kconf.h index 801a646..bcb72b6 100644 --- a/source/cpu/m68kconf.h +++ b/source/m68k/m68kconf.h @@ -1,183 +1,201 @@ -/* ======================================================================== */ -/* ========================= LICENSING & COPYRIGHT ======================== */ -/* ======================================================================== */ -/* - * MUSASHI - * Version 3.3 - * - * A portable Motorola M680x0 processor emulation engine. - * Copyright 1998-2001 Karl Stenerud. All rights reserved. - * - * This code may be freely used for non-commercial purposes as long as this - * copyright notice remains unaltered in the source code and any binary files - * containing this code in compiled form. - * - * All other lisencing terms must be negotiated with the author - * (Karl Stenerud). - * - * The latest version of this code can be obtained at: - * http://kstenerud.cjb.net - */ - - - -#ifndef M68KCONF__HEADER -#define M68KCONF__HEADER - - -/* Configuration switches. - * Use OPT_SPECIFY_HANDLER for configuration options that allow callbacks. - * OPT_SPECIFY_HANDLER causes the core to link directly to the function - * or macro you specify, rather than using callback functions whose pointer - * must be passed in using m68k_set_xxx_callback(). - */ -#define OPT_OFF 0 -#define OPT_ON 1 -#define OPT_SPECIFY_HANDLER 2 - - -/* ======================================================================== */ -/* ============================== MAME STUFF ============================== */ -/* ======================================================================== */ - -/* If you're compiling this for MAME, only change M68K_COMPILE_FOR_MAME - * to OPT_ON and use m68kmame.h to configure the 68k core. - */ -#ifndef M68K_COMPILE_FOR_MAME -#define M68K_COMPILE_FOR_MAME OPT_OFF -#endif /* M68K_COMPILE_FOR_MAME */ - -#if M68K_COMPILE_FOR_MAME == OPT_ON -#include "m68kmame.h" -#else - - - -/* ======================================================================== */ -/* ============================= CONFIGURATION ============================ */ -/* ======================================================================== */ - -/* Turn on if you want to use the following M68K variants */ -#define M68K_EMULATE_010 OPT_ON -#define M68K_EMULATE_EC020 OPT_ON -#define M68K_EMULATE_020 OPT_ON - - -/* If on, the CPU will call m68k_read_immediate_xx() for immediate addressing - * and m68k_read_pcrelative_xx() for PC-relative addressing. - * If off, all read requests from the CPU will be redirected to m68k_read_xx() - */ -#define M68K_SEPARATE_READS OPT_OFF - - -/* If on, CPU will call the interrupt acknowledge callback when it services an - * interrupt. - * If off, all interrupts will be autovectored and all interrupt requests will - * auto-clear when the interrupt is serviced. - */ -#define M68K_EMULATE_INT_ACK OPT_SPECIFY_HANDLER -#define M68K_INT_ACK_CALLBACK(A) vdp_int_ack_callback(A) - - -/* If on, CPU will call the breakpoint acknowledge callback when it encounters - * a breakpoint instruction and it is running a 68010+. - */ -#define M68K_EMULATE_BKPT_ACK OPT_OFF -#define M68K_BKPT_ACK_CALLBACK() your_bkpt_ack_handler_function() - - -/* If on, the CPU will monitor the trace flags and take trace exceptions - */ -#define M68K_EMULATE_TRACE OPT_OFF - - -/* If on, CPU will call the output reset callback when it encounters a reset - * instruction. - */ -#define M68K_EMULATE_RESET OPT_OFF -#define M68K_RESET_CALLBACK() your_reset_handler_function() - - -/* If on, CPU will call the set fc callback on every memory access to - * differentiate between user/supervisor, program/data access like a real - * 68000 would. This should be enabled and the callback should be set if you - * want to properly emulate the m68010 or higher. (moves uses function codes - * to read/write data from different address spaces) - */ -#define M68K_EMULATE_FC OPT_OFF -#define M68K_SET_FC_CALLBACK(A) your_set_fc_handler_function(A) - - -/* If on, CPU will call the pc changed callback when it changes the PC by a - * large value. This allows host programs to be nicer when it comes to - * fetching immediate data and instructions on a banked memory system. - */ -#define M68K_MONITOR_PC OPT_OFF -#define M68K_SET_PC_CALLBACK(A) your_pc_changed_handler_function(A) - - -/* If on, CPU will call the instruction hook callback before every - * instruction. - */ -#define M68K_INSTRUCTION_HOOK OPT_OFF -#define M68K_INSTRUCTION_CALLBACK() your_instruction_hook_function() - - -/* If on, the CPU will emulate the 4-byte prefetch queue of a real 68000 */ -#define M68K_EMULATE_PREFETCH OPT_OFF - - -/* If on, the CPU will generate address error exceptions if it tries to - * access a word or longword at an odd address. - * NOTE: Do not enable this! It is not working! - */ -#define M68K_EMULATE_ADDRESS_ERROR OPT_OFF - - -/* Turn on to enable logging of illegal instruction calls. - * M68K_LOG_FILEHANDLE must be #defined to a stdio file stream. - * Turn on M68K_LOG_1010_1111 to log all 1010 and 1111 calls. - */ -#define M68K_LOG_ENABLE OPT_OFF -#define M68K_LOG_1010_1111 OPT_OFF -#define M68K_LOG_FILEHANDLE some_file_handle - - -/* ----------------------------- COMPATIBILITY ---------------------------- */ - -/* The following options set optimizations that violate the current ANSI - * standard, but will be compliant under the forthcoming C9X standard. - */ - - -/* If on, the enulation core will use 64-bit integers to speed up some - * operations. -*/ -#define M68K_USE_64_BIT OPT_OFF - - -/* Set to your compiler's static inline keyword to enable it, or - * set it to blank to disable it. - * If you define INLINE in the makefile, it will override this value. - * NOTE: not enabling inline functions will SEVERELY slow down emulation. - */ -#ifndef INLINE -#define INLINE static __inline__ -#endif /* INLINE */ - - -/* If your environment requires special prefixes for system callback functions - * such as the argument to qsort(), then set them here or in the makefile. - */ -#ifndef DECL_SPEC -#define DECL_SPEC -#endif - -#endif /* M68K_COMPILE_FOR_MAME */ - - -/* ======================================================================== */ -/* ============================== END OF FILE ============================= */ -/* ======================================================================== */ - -#endif /* M68KCONF__HEADER */ +/* ======================================================================== */ +/* ========================= LICENSING & COPYRIGHT ======================== */ +/* ======================================================================== */ +/* + * MUSASHI + * Version 3.32 + * + * A portable Motorola M680x0 processor emulation engine. + * Copyright Karl Stenerud. All rights reserved. + * + * This code may be freely used for non-commercial purposes as long as this + * copyright notice remains unaltered in the source code and any binary files + * containing this code in compiled form. + * + * All other licensing terms must be negotiated with the author + * (Karl Stenerud). + * + * The latest version of this code can be obtained at: + * http://kstenerud.cjb.net + */ + + + +#ifndef M68KCONF__HEADER +#define M68KCONF__HEADER + + +/* Configuration switches. + * Use OPT_SPECIFY_HANDLER for configuration options that allow callbacks. + * OPT_SPECIFY_HANDLER causes the core to link directly to the function + * or macro you specify, rather than using callback functions whose pointer + * must be passed in using m68k_set_xxx_callback(). + */ +#define OPT_OFF 0 +#define OPT_ON 1 +#define OPT_SPECIFY_HANDLER 2 + + +/* ======================================================================== */ +/* ============================== MAME STUFF ============================== */ +/* ======================================================================== */ + +/* If you're compiling this for MAME, only change M68K_COMPILE_FOR_MAME + * to OPT_ON and use m68kmame.h to configure the 68k core. + */ +#ifndef M68K_COMPILE_FOR_MAME +#define M68K_COMPILE_FOR_MAME OPT_OFF +#endif /* M68K_COMPILE_FOR_MAME */ + + +#if M68K_COMPILE_FOR_MAME == OPT_OFF + + +/* ======================================================================== */ +/* ============================= CONFIGURATION ============================ */ +/* ======================================================================== */ + +/* Turn ON if you want to use the following M68K variants */ +#define M68K_EMULATE_008 OPT_OFF +#define M68K_EMULATE_010 OPT_OFF +#define M68K_EMULATE_EC020 OPT_OFF +#define M68K_EMULATE_020 OPT_OFF +#define M68K_EMULATE_040 OPT_OFF + + +/* If ON, the CPU will call m68k_read_immediate_xx() for immediate addressing + * and m68k_read_pcrelative_xx() for PC-relative addressing. + * If off, all read requests from the CPU will be redirected to m68k_read_xx() + */ +#define M68K_SEPARATE_READS OPT_OFF + +/* If ON, the CPU will call m68k_write_32_pd() when it executes move.l with a + * predecrement destination EA mode instead of m68k_write_32(). + * To simulate real 68k behavior, m68k_write_32_pd() must first write the high + * word to [address+2], and then write the low word to [address]. + */ +#define M68K_SIMULATE_PD_WRITES OPT_OFF + +/* If ON, CPU will call the interrupt acknowledge callback when it services an + * interrupt. + * If off, all interrupts will be autovectored and all interrupt requests will + * auto-clear when the interrupt is serviced. + */ +#define M68K_EMULATE_INT_ACK OPT_SPECIFY_HANDLER +#define M68K_INT_ACK_CALLBACK(A) vdp_int_ack_callback(A) + + +/* If ON, CPU will call the breakpoint acknowledge callback when it encounters + * a breakpoint instruction and it is running a 68010+. + */ +#define M68K_EMULATE_BKPT_ACK OPT_OFF +#define M68K_BKPT_ACK_CALLBACK() your_bkpt_ack_handler_function() + + +/* If ON, the CPU will monitor the trace flags and take trace exceptions + */ +#define M68K_EMULATE_TRACE OPT_OFF + + +/* If ON, CPU will call the output reset callback when it encounters a reset + * instruction. + */ +#define M68K_EMULATE_RESET OPT_OFF +#define M68K_RESET_CALLBACK() your_reset_handler_function() + + +/* If ON, CPU will call the callback when it encounters a cmpi.l #v, dn + * instruction. + */ +#define M68K_CMPILD_HAS_CALLBACK OPT_OFF +#define M68K_CMPILD_CALLBACK(v,r) your_cmpild_handler_function(v,r) + + +/* If ON, CPU will call the callback when it encounters a rte + * instruction. + */ +#define M68K_RTE_HAS_CALLBACK OPT_OFF +#define M68K_RTE_CALLBACK() your_rte_handler_function() + +/* If ON, CPU will call the callback when it encounters a tas + * instruction. + */ +#define M68K_TAS_HAS_CALLBACK OPT_OFF +#define M68K_TAS_CALLBACK() your_tas_handler_function() + + +/* If ON, CPU will call the set fc callback on every memory access to + * differentiate between user/supervisor, program/data access like a real + * 68000 would. This should be enabled and the callback should be set if you + * want to properly emulate the m68010 or higher. (moves uses function codes + * to read/write data from different address spaces) + */ +#define M68K_EMULATE_FC OPT_OFF +#define M68K_SET_FC_CALLBACK(A) your_set_fc_handler_function(A) + + +/* If ON, CPU will call the pc changed callback when it changes the PC by a + * large value. This allows host programs to be nicer when it comes to + * fetching immediate data and instructions on a banked memory system. + */ +#define M68K_MONITOR_PC OPT_OFF +#define M68K_SET_PC_CALLBACK(A) your_pc_changed_handler_function(A) + + +/* If ON, CPU will call the instruction hook callback before every + * instruction. + */ +#define M68K_INSTRUCTION_HOOK OPT_OFF +#define M68K_INSTRUCTION_CALLBACK() your_instruction_hook_function() + + +/* If ON, the CPU will emulate the 4-byte prefetch queue of a real 68000 */ +#define M68K_EMULATE_PREFETCH OPT_OFF + + +/* If ON, the CPU will generate address error exceptions if it tries to + * access a word or longword at an odd address. + * NOTE: This is only emulated properly for 68000 mode. + */ +#define M68K_EMULATE_ADDRESS_ERROR OPT_ON + + +/* Turn ON to enable logging of illegal instruction calls. + * M68K_LOG_FILEHANDLE must be #defined to a stdio file stream. + * Turn on M68K_LOG_1010_1111 to log all 1010 and 1111 calls. + */ +#define M68K_LOG_ENABLE OPT_OFF +#define M68K_LOG_1010_1111 OPT_OFF +#define M68K_LOG_FILEHANDLE some_file_handle + + +/* ----------------------------- COMPATIBILITY ---------------------------- */ + +/* The following options set optimizations that violate the current ANSI + * standard, but will be compliant under the forthcoming C9X standard. + */ + + +/* If ON, the enulation core will use 64-bit integers to speed up some + * operations. +*/ +#define M68K_USE_64_BIT OPT_OFF + + +/* Set to your compiler's static inline keyword to enable it, or + * set it to blank to disable it. + * If you define INLINE in the makefile, it will override this value. + * NOTE: not enabling inline functions will SEVERELY slow down emulation. + */ +#ifndef INLINE +#define INLINE static __inline__ +#endif /* INLINE */ + +#endif /* M68K_COMPILE_FOR_MAME */ + + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ + +#endif /* M68KCONF__HEADER */ diff --git a/source/m68k/m68kcpu.c b/source/m68k/m68kcpu.c index 1daadfe..f88675c 100644 --- a/source/m68k/m68kcpu.c +++ b/source/m68k/m68kcpu.c @@ -1,894 +1,1027 @@ -/* ======================================================================== */ -/* ========================= LICENSING & COPYRIGHT ======================== */ -/* ======================================================================== */ - -#if 0 -static const char* copyright_notice = -"MUSASHI\n" -"Version 3.3 (2001-01-29)\n" -"A portable Motorola M680x0 processor emulation engine.\n" -"Copyright 1998-2001 Karl Stenerud. All rights reserved.\n" -"\n" -"This code may be freely used for non-commercial purpooses as long as this\n" -"copyright notice remains unaltered in the source code and any binary files\n" -"containing this code in compiled form.\n" -"\n" -"All other lisencing terms must be negotiated with the author\n" -"(Karl Stenerud).\n" -"\n" -"The latest version of this code can be obtained at:\n" -"http://kstenerud.cjb.net\n" -; -#endif - - -/* ======================================================================== */ -/* ================================= NOTES ================================ */ -/* ======================================================================== */ - - - -/* ======================================================================== */ -/* ================================ INCLUDES ============================== */ -/* ======================================================================== */ - -#include "m68kops.h" -#include "m68kcpu.h" - -/* ======================================================================== */ -/* ================================= DATA ================================= */ -/* ======================================================================== */ - -int m68ki_initial_cycles; -int m68ki_remaining_cycles = 0; /* Number of clocks remaining */ -uint m68ki_tracing = 0; -uint m68ki_address_space; - -#ifdef M68K_LOG_ENABLE -char* m68ki_cpu_names[9] = -{ - "Invalid CPU", - "M68000", - "M68010", - "Invalid CPU", - "M68EC020" - "Invalid CPU", - "Invalid CPU", - "Invalid CPU", - "M68020" -}; -#endif /* M68K_LOG_ENABLE */ - -/* The CPU core */ -m68ki_cpu_core m68ki_cpu = {0}; - -#if M68K_EMULATE_ADDRESS_ERROR -jmp_buf m68ki_address_error_trap; -#endif /* M68K_EMULATE_ADDRESS_ERROR */ - -/* Used by shift & rotate instructions */ -uint8 m68ki_shift_8_table[65] = -{ - 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff -}; -uint16 m68ki_shift_16_table[65] = -{ - 0x0000, 0x8000, 0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00, 0xff00, - 0xff80, 0xffc0, 0xffe0, 0xfff0, 0xfff8, 0xfffc, 0xfffe, 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 -}; -uint m68ki_shift_32_table[65] = -{ - 0x00000000, 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000, 0xf8000000, - 0xfc000000, 0xfe000000, 0xff000000, 0xff800000, 0xffc00000, 0xffe00000, - 0xfff00000, 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000, 0xffff8000, - 0xffffc000, 0xffffe000, 0xfffff000, 0xfffff800, 0xfffffc00, 0xfffffe00, - 0xffffff00, 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0, 0xfffffff8, - 0xfffffffc, 0xfffffffe, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, - 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, - 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, - 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, - 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, - 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff -}; - - -/* Number of clock cycles to use for exception processing. - * I used 4 for any vectors that are undocumented for processing times. - */ -uint8 m68ki_exception_cycle_table[3][256] = -{ - { /* 000 */ - 4, /* 0: Reset - Initial Stack Pointer */ - 4, /* 1: Reset - Initial Program Counter */ - 50, /* 2: Bus Error (unemulated) */ - 50, /* 3: Address Error (unemulated) */ - 34, /* 4: Illegal Instruction */ - 38, /* 5: Divide by Zero -- ASG: changed from 42 */ - 40, /* 6: CHK -- ASG: chanaged from 44 */ - 34, /* 7: TRAPV */ - 34, /* 8: Privilege Violation */ - 34, /* 9: Trace */ - 4, /* 10: 1010 */ - 4, /* 11: 1111 */ - 4, /* 12: RESERVED */ - 4, /* 13: Coprocessor Protocol Violation (unemulated) */ - 4, /* 14: Format Error */ - 44, /* 15: Uninitialized Interrupt */ - 4, /* 16: RESERVED */ - 4, /* 17: RESERVED */ - 4, /* 18: RESERVED */ - 4, /* 19: RESERVED */ - 4, /* 20: RESERVED */ - 4, /* 21: RESERVED */ - 4, /* 22: RESERVED */ - 4, /* 23: RESERVED */ - 44, /* 24: Spurious Interrupt */ - 44, /* 25: Level 1 Interrupt Autovector */ - 44, /* 26: Level 2 Interrupt Autovector */ - 44, /* 27: Level 3 Interrupt Autovector */ - 44, /* 28: Level 4 Interrupt Autovector */ - 44, /* 29: Level 5 Interrupt Autovector */ - 44, /* 30: Level 6 Interrupt Autovector */ - 44, /* 31: Level 7 Interrupt Autovector */ - 34, /* 32: TRAP #0 -- ASG: chanaged from 38 */ - 34, /* 33: TRAP #1 */ - 34, /* 34: TRAP #2 */ - 34, /* 35: TRAP #3 */ - 34, /* 36: TRAP #4 */ - 34, /* 37: TRAP #5 */ - 34, /* 38: TRAP #6 */ - 34, /* 39: TRAP #7 */ - 34, /* 40: TRAP #8 */ - 34, /* 41: TRAP #9 */ - 34, /* 42: TRAP #10 */ - 34, /* 43: TRAP #11 */ - 34, /* 44: TRAP #12 */ - 34, /* 45: TRAP #13 */ - 34, /* 46: TRAP #14 */ - 34, /* 47: TRAP #15 */ - 4, /* 48: FP Branch or Set on Unknown Condition (unemulated) */ - 4, /* 49: FP Inexact Result (unemulated) */ - 4, /* 50: FP Divide by Zero (unemulated) */ - 4, /* 51: FP Underflow (unemulated) */ - 4, /* 52: FP Operand Error (unemulated) */ - 4, /* 53: FP Overflow (unemulated) */ - 4, /* 54: FP Signaling NAN (unemulated) */ - 4, /* 55: FP Unimplemented Data Type (unemulated) */ - 4, /* 56: MMU Configuration Error (unemulated) */ - 4, /* 57: MMU Illegal Operation Error (unemulated) */ - 4, /* 58: MMU Access Level Violation Error (unemulated) */ - 4, /* 59: RESERVED */ - 4, /* 60: RESERVED */ - 4, /* 61: RESERVED */ - 4, /* 62: RESERVED */ - 4, /* 63: RESERVED */ - /* 64-255: User Defined */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 - }, - { /* 010 */ - 4, /* 0: Reset - Initial Stack Pointer */ - 4, /* 1: Reset - Initial Program Counter */ - 126, /* 2: Bus Error (unemulated) */ - 126, /* 3: Address Error (unemulated) */ - 38, /* 4: Illegal Instruction */ - 44, /* 5: Divide by Zero */ - 44, /* 6: CHK */ - 34, /* 7: TRAPV */ - 38, /* 8: Privilege Violation */ - 38, /* 9: Trace */ - 4, /* 10: 1010 */ - 4, /* 11: 1111 */ - 4, /* 12: RESERVED */ - 4, /* 13: Coprocessor Protocol Violation (unemulated) */ - 4, /* 14: Format Error */ - 44, /* 15: Uninitialized Interrupt */ - 4, /* 16: RESERVED */ - 4, /* 17: RESERVED */ - 4, /* 18: RESERVED */ - 4, /* 19: RESERVED */ - 4, /* 20: RESERVED */ - 4, /* 21: RESERVED */ - 4, /* 22: RESERVED */ - 4, /* 23: RESERVED */ - 46, /* 24: Spurious Interrupt */ - 46, /* 25: Level 1 Interrupt Autovector */ - 46, /* 26: Level 2 Interrupt Autovector */ - 46, /* 27: Level 3 Interrupt Autovector */ - 46, /* 28: Level 4 Interrupt Autovector */ - 46, /* 29: Level 5 Interrupt Autovector */ - 46, /* 30: Level 6 Interrupt Autovector */ - 46, /* 31: Level 7 Interrupt Autovector */ - 38, /* 32: TRAP #0 */ - 38, /* 33: TRAP #1 */ - 38, /* 34: TRAP #2 */ - 38, /* 35: TRAP #3 */ - 38, /* 36: TRAP #4 */ - 38, /* 37: TRAP #5 */ - 38, /* 38: TRAP #6 */ - 38, /* 39: TRAP #7 */ - 38, /* 40: TRAP #8 */ - 38, /* 41: TRAP #9 */ - 38, /* 42: TRAP #10 */ - 38, /* 43: TRAP #11 */ - 38, /* 44: TRAP #12 */ - 38, /* 45: TRAP #13 */ - 38, /* 46: TRAP #14 */ - 38, /* 47: TRAP #15 */ - 4, /* 48: FP Branch or Set on Unknown Condition (unemulated) */ - 4, /* 49: FP Inexact Result (unemulated) */ - 4, /* 50: FP Divide by Zero (unemulated) */ - 4, /* 51: FP Underflow (unemulated) */ - 4, /* 52: FP Operand Error (unemulated) */ - 4, /* 53: FP Overflow (unemulated) */ - 4, /* 54: FP Signaling NAN (unemulated) */ - 4, /* 55: FP Unimplemented Data Type (unemulated) */ - 4, /* 56: MMU Configuration Error (unemulated) */ - 4, /* 57: MMU Illegal Operation Error (unemulated) */ - 4, /* 58: MMU Access Level Violation Error (unemulated) */ - 4, /* 59: RESERVED */ - 4, /* 60: RESERVED */ - 4, /* 61: RESERVED */ - 4, /* 62: RESERVED */ - 4, /* 63: RESERVED */ - /* 64-255: User Defined */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 - }, - { /* 020 */ - 4, /* 0: Reset - Initial Stack Pointer */ - 4, /* 1: Reset - Initial Program Counter */ - 50, /* 2: Bus Error (unemulated) */ - 50, /* 3: Address Error (unemulated) */ - 20, /* 4: Illegal Instruction */ - 38, /* 5: Divide by Zero */ - 40, /* 6: CHK */ - 20, /* 7: TRAPV */ - 34, /* 8: Privilege Violation */ - 25, /* 9: Trace */ - 20, /* 10: 1010 */ - 20, /* 11: 1111 */ - 4, /* 12: RESERVED */ - 4, /* 13: Coprocessor Protocol Violation (unemulated) */ - 4, /* 14: Format Error */ - 30, /* 15: Uninitialized Interrupt */ - 4, /* 16: RESERVED */ - 4, /* 17: RESERVED */ - 4, /* 18: RESERVED */ - 4, /* 19: RESERVED */ - 4, /* 20: RESERVED */ - 4, /* 21: RESERVED */ - 4, /* 22: RESERVED */ - 4, /* 23: RESERVED */ - 30, /* 24: Spurious Interrupt */ - 30, /* 25: Level 1 Interrupt Autovector */ - 30, /* 26: Level 2 Interrupt Autovector */ - 30, /* 27: Level 3 Interrupt Autovector */ - 30, /* 28: Level 4 Interrupt Autovector */ - 30, /* 29: Level 5 Interrupt Autovector */ - 30, /* 30: Level 6 Interrupt Autovector */ - 30, /* 31: Level 7 Interrupt Autovector */ - 20, /* 32: TRAP #0 */ - 20, /* 33: TRAP #1 */ - 20, /* 34: TRAP #2 */ - 20, /* 35: TRAP #3 */ - 20, /* 36: TRAP #4 */ - 20, /* 37: TRAP #5 */ - 20, /* 38: TRAP #6 */ - 20, /* 39: TRAP #7 */ - 20, /* 40: TRAP #8 */ - 20, /* 41: TRAP #9 */ - 20, /* 42: TRAP #10 */ - 20, /* 43: TRAP #11 */ - 20, /* 44: TRAP #12 */ - 20, /* 45: TRAP #13 */ - 20, /* 46: TRAP #14 */ - 20, /* 47: TRAP #15 */ - 4, /* 48: FP Branch or Set on Unknown Condition (unemulated) */ - 4, /* 49: FP Inexact Result (unemulated) */ - 4, /* 50: FP Divide by Zero (unemulated) */ - 4, /* 51: FP Underflow (unemulated) */ - 4, /* 52: FP Operand Error (unemulated) */ - 4, /* 53: FP Overflow (unemulated) */ - 4, /* 54: FP Signaling NAN (unemulated) */ - 4, /* 55: FP Unimplemented Data Type (unemulated) */ - 4, /* 56: MMU Configuration Error (unemulated) */ - 4, /* 57: MMU Illegal Operation Error (unemulated) */ - 4, /* 58: MMU Access Level Violation Error (unemulated) */ - 4, /* 59: RESERVED */ - 4, /* 60: RESERVED */ - 4, /* 61: RESERVED */ - 4, /* 62: RESERVED */ - 4, /* 63: RESERVED */ - /* 64-255: User Defined */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 - } -}; - -uint8 m68ki_ea_idx_cycle_table[64] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, /* ..01.000 no memory indirect, base NULL */ - 5, /* ..01..01 memory indirect, base NULL, outer NULL */ - 7, /* ..01..10 memory indirect, base NULL, outer 16 */ - 7, /* ..01..11 memory indirect, base NULL, outer 32 */ - 0, 5, 7, 7, 0, 5, 7, 7, 0, 5, 7, 7, - 2, /* ..10.000 no memory indirect, base 16 */ - 7, /* ..10..01 memory indirect, base 16, outer NULL */ - 9, /* ..10..10 memory indirect, base 16, outer 16 */ - 9, /* ..10..11 memory indirect, base 16, outer 32 */ - 0, 7, 9, 9, 0, 7, 9, 9, 0, 7, 9, 9, - 6, /* ..11.000 no memory indirect, base 32 */ - 11, /* ..11..01 memory indirect, base 32, outer NULL */ - 13, /* ..11..10 memory indirect, base 32, outer 16 */ - 13, /* ..11..11 memory indirect, base 32, outer 32 */ - 0, 11, 13, 13, 0, 11, 13, 13, 0, 11, 13, 13 -}; - - - -/* ======================================================================== */ -/* =============================== CALLBACKS ============================== */ -/* ======================================================================== */ - -/* Default callbacks used if the callback hasn't been set yet, or if the - * callback is set to NULL - */ - -/* Interrupt acknowledge */ -static int default_int_ack_callback_data; -static int default_int_ack_callback(int int_level) -{ - default_int_ack_callback_data = int_level; - CPU_INT_LEVEL = 0; - return M68K_INT_ACK_AUTOVECTOR; -} - -/* Breakpoint acknowledge */ -static unsigned int default_bkpt_ack_callback_data; -static void default_bkpt_ack_callback(unsigned int data) -{ - default_bkpt_ack_callback_data = data; -} - -/* Called when a reset instruction is executed */ -static void default_reset_instr_callback(void) -{ -} - -/* Called when the program counter changed by a large value */ -static unsigned int default_pc_changed_callback_data; -static void default_pc_changed_callback(unsigned int new_pc) -{ - default_pc_changed_callback_data = new_pc; -} - -/* Called every time there's bus activity (read/write to/from memory */ -static unsigned int default_set_fc_callback_data; -static void default_set_fc_callback(unsigned int new_fc) -{ - default_set_fc_callback_data = new_fc; -} - -/* Called every instruction cycle prior to execution */ -static void default_instr_hook_callback(void) -{ -} - - - -/* ======================================================================== */ -/* ================================= API ================================== */ -/* ======================================================================== */ - -/* Access the internals of the CPU */ -unsigned int m68k_get_reg(void* context, m68k_register_t regnum) -{ - m68ki_cpu_core* cpu = context != NULL ?(m68ki_cpu_core*)context : &m68ki_cpu; - - switch(regnum) - { - case M68K_REG_D0: return cpu->dar[0]; - case M68K_REG_D1: return cpu->dar[1]; - case M68K_REG_D2: return cpu->dar[2]; - case M68K_REG_D3: return cpu->dar[3]; - case M68K_REG_D4: return cpu->dar[4]; - case M68K_REG_D5: return cpu->dar[5]; - case M68K_REG_D6: return cpu->dar[6]; - case M68K_REG_D7: return cpu->dar[7]; - case M68K_REG_A0: return cpu->dar[8]; - case M68K_REG_A1: return cpu->dar[9]; - case M68K_REG_A2: return cpu->dar[10]; - case M68K_REG_A3: return cpu->dar[11]; - case M68K_REG_A4: return cpu->dar[12]; - case M68K_REG_A5: return cpu->dar[13]; - case M68K_REG_A6: return cpu->dar[14]; - case M68K_REG_A7: return cpu->dar[15]; - case M68K_REG_PC: return MASK_OUT_ABOVE_32(cpu->pc); - case M68K_REG_SR: return cpu->t1_flag | - cpu->t0_flag | - (cpu->s_flag << 11) | - (cpu->m_flag << 11) | - cpu->int_mask | - ((cpu->x_flag & XFLAG_SET) >> 4) | - ((cpu->n_flag & NFLAG_SET) >> 4) | - ((!cpu->not_z_flag) << 2) | - ((cpu->v_flag & VFLAG_SET) >> 6) | - ((cpu->c_flag & CFLAG_SET) >> 8); - case M68K_REG_SP: return cpu->dar[15]; - case M68K_REG_USP: return cpu->s_flag ? cpu->sp[0] : cpu->dar[15]; - case M68K_REG_ISP: return cpu->s_flag && !cpu->m_flag ? cpu->dar[15] : cpu->sp[4]; - case M68K_REG_MSP: return cpu->s_flag && cpu->m_flag ? cpu->dar[15] : cpu->sp[6]; - case M68K_REG_SFC: return cpu->sfc; - case M68K_REG_DFC: return cpu->dfc; - case M68K_REG_VBR: return cpu->vbr; - case M68K_REG_CACR: return cpu->cacr; - case M68K_REG_CAAR: return cpu->caar; - case M68K_REG_PREF_ADDR: return cpu->pref_addr; - case M68K_REG_PREF_DATA: return cpu->pref_data; - case M68K_REG_PPC: return MASK_OUT_ABOVE_32(cpu->ppc); - case M68K_REG_IR: return cpu->ir; - case M68K_REG_CPU_TYPE: - switch(cpu->cpu_type) - { - case CPU_TYPE_000: return (unsigned int)M68K_CPU_TYPE_68000; - case CPU_TYPE_010: return (unsigned int)M68K_CPU_TYPE_68010; - case CPU_TYPE_EC020: return (unsigned int)M68K_CPU_TYPE_68EC020; - case CPU_TYPE_020: return (unsigned int)M68K_CPU_TYPE_68020; - } - return M68K_CPU_TYPE_INVALID; - default: return 0; - } - return 0; -} - -void m68k_set_reg(m68k_register_t regnum, unsigned int value) -{ - switch(regnum) - { - case M68K_REG_D0: REG_D[0] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_D1: REG_D[1] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_D2: REG_D[2] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_D3: REG_D[3] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_D4: REG_D[4] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_D5: REG_D[5] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_D6: REG_D[6] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_D7: REG_D[7] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_A0: REG_A[0] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_A1: REG_A[1] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_A2: REG_A[2] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_A3: REG_A[3] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_A4: REG_A[4] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_A5: REG_A[5] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_A6: REG_A[6] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_A7: REG_A[7] = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_PC: m68ki_jump(MASK_OUT_ABOVE_32(value)); return; - case M68K_REG_SR: m68ki_set_sr(value); return; - case M68K_REG_SP: REG_SP = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_USP: if(FLAG_S) - REG_USP = MASK_OUT_ABOVE_32(value); - else - REG_SP = MASK_OUT_ABOVE_32(value); - return; - case M68K_REG_ISP: if(FLAG_S && !FLAG_M) - REG_SP = MASK_OUT_ABOVE_32(value); - else - REG_ISP = MASK_OUT_ABOVE_32(value); - return; - case M68K_REG_MSP: if(FLAG_S && FLAG_M) - REG_SP = MASK_OUT_ABOVE_32(value); - else - REG_MSP = MASK_OUT_ABOVE_32(value); - return; - case M68K_REG_VBR: REG_VBR = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_SFC: REG_SFC = value & 7; return; - case M68K_REG_DFC: REG_DFC = value & 7; return; - case M68K_REG_CACR: REG_CACR = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_CAAR: REG_CAAR = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_PPC: REG_PPC = MASK_OUT_ABOVE_32(value); return; - case M68K_REG_IR: REG_IR = MASK_OUT_ABOVE_16(value); return; - case M68K_REG_CPU_TYPE: m68k_set_cpu_type(value); return; - default: return; - } -} - -/* Set the callbacks */ -void m68k_set_int_ack_callback(int (*callback)(int int_level)) -{ - CALLBACK_INT_ACK = callback ? callback : default_int_ack_callback; -} - -void m68k_set_bkpt_ack_callback(void (*callback)(unsigned int data)) -{ - CALLBACK_BKPT_ACK = callback ? callback : default_bkpt_ack_callback; -} - -void m68k_set_reset_instr_callback(void (*callback)(void)) -{ - CALLBACK_RESET_INSTR = callback ? callback : default_reset_instr_callback; -} - -void m68k_set_pc_changed_callback(void (*callback)(unsigned int new_pc)) -{ - CALLBACK_PC_CHANGED = callback ? callback : default_pc_changed_callback; -} - -void m68k_set_fc_callback(void (*callback)(unsigned int new_fc)) -{ - CALLBACK_SET_FC = callback ? callback : default_set_fc_callback; -} - -void m68k_set_instr_hook_callback(void (*callback)(void)) -{ - CALLBACK_INSTR_HOOK = callback ? callback : default_instr_hook_callback; -} - -#include -/* Set the CPU type. */ -void m68k_set_cpu_type(unsigned int cpu_type) -{ - switch(cpu_type) - { - case M68K_CPU_TYPE_68000: - CPU_TYPE = CPU_TYPE_000; - CPU_ADDRESS_MASK = 0x00ffffff; - CPU_SR_MASK = 0xa71f; /* T1 -- S -- -- I2 I1 I0 -- -- -- X N Z V C */ - CYC_INSTRUCTION = m68ki_cycles[0]; - CYC_EXCEPTION = m68ki_exception_cycle_table[0]; - CYC_BCC_NOTAKE_B = -2; - CYC_BCC_NOTAKE_W = 2; - CYC_DBCC_F_NOEXP = -2; - CYC_DBCC_F_EXP = 2; - CYC_SCC_R_FALSE = 2; - CYC_MOVEM_W = 2; - CYC_MOVEM_L = 3; - CYC_SHIFT = 1; - CYC_RESET = 132; - return; - case M68K_CPU_TYPE_68010: - CPU_TYPE = CPU_TYPE_010; - CPU_ADDRESS_MASK = 0x00ffffff; - CPU_SR_MASK = 0xa71f; /* T1 -- S -- -- I2 I1 I0 -- -- -- X N Z V C */ - CYC_INSTRUCTION = m68ki_cycles[1]; - CYC_EXCEPTION = m68ki_exception_cycle_table[1]; - CYC_BCC_NOTAKE_B = -4; - CYC_BCC_NOTAKE_W = 0; - CYC_DBCC_F_NOEXP = 0; - CYC_DBCC_F_EXP = 6; - CYC_SCC_R_FALSE = 0; - CYC_MOVEM_W = 2; - CYC_MOVEM_L = 3; - CYC_SHIFT = 1; - CYC_RESET = 130; - return; - case M68K_CPU_TYPE_68EC020: - CPU_TYPE = CPU_TYPE_EC020; - CPU_ADDRESS_MASK = 0x00ffffff; - CPU_SR_MASK = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ - CYC_INSTRUCTION = m68ki_cycles[2]; - CYC_EXCEPTION = m68ki_exception_cycle_table[2]; - CYC_BCC_NOTAKE_B = -2; - CYC_BCC_NOTAKE_W = 0; - CYC_DBCC_F_NOEXP = 0; - CYC_DBCC_F_EXP = 4; - CYC_SCC_R_FALSE = 0; - CYC_MOVEM_W = 2; - CYC_MOVEM_L = 2; - CYC_SHIFT = 0; - CYC_RESET = 518; - return; - case M68K_CPU_TYPE_68020: - CPU_TYPE = CPU_TYPE_020; - CPU_ADDRESS_MASK = 0xffffffff; - CPU_SR_MASK = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ - CYC_INSTRUCTION = m68ki_cycles[2]; - CYC_EXCEPTION = m68ki_exception_cycle_table[2]; - CYC_BCC_NOTAKE_B = -2; - CYC_BCC_NOTAKE_W = 0; - CYC_DBCC_F_NOEXP = 0; - CYC_DBCC_F_EXP = 4; - CYC_SCC_R_FALSE = 0; - CYC_MOVEM_W = 2; - CYC_MOVEM_L = 2; - CYC_SHIFT = 0; - CYC_RESET = 518; - return; - } -} - -/* Execute some instructions until we use up num_cycles clock cycles */ -/* ASG: removed per-instruction interrupt checks */ -int m68k_execute(int num_cycles) -{ - /* Make sure we're not stopped */ - if(!CPU_STOPPED) - { - /* Set our pool of clock cycles available */ - SET_CYCLES(num_cycles); - m68ki_initial_cycles = num_cycles; - - /* ASG: update cycles */ - USE_CYCLES(CPU_INT_CYCLES); - CPU_INT_CYCLES = 0; - - /* Return point if we had an address error */ - m68ki_set_address_error_trap(); /* auto-disable (see m68kcpu.h) */ - - /* Main loop. Keep going until we run out of clock cycles */ - do - { - /* Set tracing accodring to T1. (T0 is done inside instruction) */ - m68ki_trace_t1(); /* auto-disable (see m68kcpu.h) */ - - /* Set the address space for reads */ - m68ki_use_data_space(); /* auto-disable (see m68kcpu.h) */ - - /* Call external hook to peek at CPU */ - m68ki_instr_hook(); /* auto-disable (see m68kcpu.h) */ - - /* Record previous program counter */ - REG_PPC = REG_PC; - - /* Read an instruction and call its handler */ - REG_IR = m68ki_read_imm_16(); - m68ki_instruction_jump_table[REG_IR](); - USE_CYCLES(CYC_INSTRUCTION[REG_IR]); - - /* Trace m68k_exception, if necessary */ - m68ki_exception_if_trace(); /* auto-disable (see m68kcpu.h) */ - } while(GET_CYCLES() > 0); - - /* set previous PC to current PC for the next entry into the loop */ - REG_PPC = REG_PC; - - /* ASG: update cycles */ - USE_CYCLES(CPU_INT_CYCLES); - CPU_INT_CYCLES = 0; - - /* return how many clocks we used */ - return m68ki_initial_cycles - GET_CYCLES(); - } - - /* We get here if the CPU is stopped or halted */ - SET_CYCLES(0); - CPU_INT_CYCLES = 0; - - return num_cycles; -} - - -int m68k_cycles_run(void) -{ - return m68ki_initial_cycles - GET_CYCLES(); -} - -int m68k_cycles_remaining(void) -{ - return GET_CYCLES(); -} - -/* Change the timeslice */ -void m68k_modify_timeslice(int cycles) -{ - m68ki_initial_cycles += cycles; - ADD_CYCLES(cycles); -} - - -void m68k_end_timeslice(void) -{ - m68ki_initial_cycles = GET_CYCLES(); - SET_CYCLES(0); -} - - -/* ASG: rewrote so that the int_level is a mask of the IPL0/IPL1/IPL2 bits */ -/* KS: Modified so that IPL* bits match with mask positions in the SR - * and cleaned out remenants of the interrupt controller. - */ -void m68k_set_irq(unsigned int int_level) -{ - uint old_level = CPU_INT_LEVEL; - CPU_INT_LEVEL = int_level << 8; - - /* A transition from < 7 to 7 always interrupts (NMI) */ - /* Note: Level 7 can also level trigger like a normal IRQ */ - if(old_level != 0x0700 && CPU_INT_LEVEL == 0x0700) - m68ki_exception_interrupt(7); /* Edge triggered level 7 (NMI) */ - else - m68ki_check_interrupts(); /* Level triggered (IRQ) */ -} - - -/* Pulse the RESET line on the CPU */ -void m68k_pulse_reset(void) -{ - static uint emulation_initialized = 0; - - /* The first call to this function initializes the opcode handler jump table */ - if(!emulation_initialized) - { - m68ki_build_opcode_table(); - m68k_set_int_ack_callback(NULL); - m68k_set_bkpt_ack_callback(NULL); - m68k_set_reset_instr_callback(NULL); - m68k_set_pc_changed_callback(NULL); - m68k_set_fc_callback(NULL); - m68k_set_instr_hook_callback(NULL); - - emulation_initialized = 1; - } - - - if(CPU_TYPE == 0) /* KW 990319 */ - m68k_set_cpu_type(M68K_CPU_TYPE_68000); - - /* Clear all stop levels and eat up all remaining cycles */ - CPU_STOPPED = 0; - SET_CYCLES(0); - - /* Turn off tracing */ - FLAG_T1 = FLAG_T0 = 0; - m68ki_clear_trace(); - /* Interrupt mask to level 7 */ - FLAG_INT_MASK = 0x0700; - /* Reset VBR */ - REG_VBR = 0; - /* Go to supervisor mode */ - m68ki_set_sm_flag(SFLAG_SET | MFLAG_CLEAR); - - /* Invalidate the prefetch queue */ -#if M68K_EMULATE_PREFETCH - /* Set to arbitrary number since our first fetch is from 0 */ - CPU_PREF_ADDR = 0x1000; -#endif /* M68K_EMULATE_PREFETCH */ - - /* Read the initial stack pointer and program counter */ - m68ki_jump(0); - REG_SP = m68ki_read_imm_32(); - REG_PC = m68ki_read_imm_32(); - m68ki_jump(REG_PC); -} - -/* Pulse the HALT line on the CPU */ -void m68k_pulse_halt(void) -{ - CPU_STOPPED |= STOP_LEVEL_HALT; -} - - -/* Get and set the current CPU context */ -/* This is to allow for multiple CPUs */ -unsigned int m68k_context_size() -{ - return sizeof(m68ki_cpu_core); -} - -unsigned int m68k_get_context(void* dst) -{ - if(dst) *(m68ki_cpu_core*)dst = m68ki_cpu; - return sizeof(m68ki_cpu_core); -} - -void m68k_set_context(void* src) -{ - if(src) m68ki_cpu = *(m68ki_cpu_core*)src; -} - -void m68k_save_context( void (*save_value)(char*, unsigned int)) -{ - if(!save_value) - return; - - save_value("CPU_TYPE" , m68k_get_reg(NULL, M68K_REG_CPU_TYPE)); - save_value("D0" , REG_D[0]); - save_value("D1" , REG_D[1]); - save_value("D2" , REG_D[2]); - save_value("D3" , REG_D[3]); - save_value("D4" , REG_D[4]); - save_value("D5" , REG_D[5]); - save_value("D6" , REG_D[6]); - save_value("D7" , REG_D[7]); - save_value("A0" , REG_A[0]); - save_value("A1" , REG_A[1]); - save_value("A2" , REG_A[2]); - save_value("A3" , REG_A[3]); - save_value("A4" , REG_A[4]); - save_value("A5" , REG_A[5]); - save_value("A6" , REG_A[6]); - save_value("A7" , REG_A[7]); - save_value("PPC" , REG_PPC); - save_value("PC" , REG_PC); - save_value("USP" , REG_USP); - save_value("ISP" , REG_ISP); - save_value("MSP" , REG_MSP); - save_value("VBR" , REG_VBR); - save_value("SFC" , REG_SFC); - save_value("DFC" , REG_DFC); - save_value("CACR" , REG_CACR); - save_value("CAAR" , REG_CAAR); - save_value("SR" , m68ki_get_sr()); - save_value("INT_LEVEL" , CPU_INT_LEVEL); - save_value("INT_CYCLES", CPU_INT_CYCLES); - save_value("STOPPED" , (CPU_STOPPED & STOP_LEVEL_STOP) != 0); - save_value("HALTED" , (CPU_STOPPED & STOP_LEVEL_HALT) != 0); - save_value("PREF_ADDR" , CPU_PREF_ADDR); - save_value("PREF_DATA" , CPU_PREF_DATA); -} - -void m68k_load_context(unsigned int (*load_value)(char*)) -{ - unsigned int temp; - - m68k_set_cpu_type(load_value("CPU_TYPE")); - REG_PPC = load_value("PPC"); - REG_PC = load_value("PC"); - m68ki_jump(REG_PC); - CPU_INT_LEVEL = 0; - m68ki_set_sr_noint(load_value("SR")); - REG_D[0] = load_value("D0"); - REG_D[1] = load_value("D1"); - REG_D[2] = load_value("D2"); - REG_D[3] = load_value("D3"); - REG_D[4] = load_value("D4"); - REG_D[5] = load_value("D5"); - REG_D[6] = load_value("D6"); - REG_D[7] = load_value("D7"); - REG_A[0] = load_value("A0"); - REG_A[1] = load_value("A1"); - REG_A[2] = load_value("A2"); - REG_A[3] = load_value("A3"); - REG_A[4] = load_value("A4"); - REG_A[5] = load_value("A5"); - REG_A[6] = load_value("A6"); - REG_A[7] = load_value("A7"); - REG_USP = load_value("USP"); - REG_ISP = load_value("ISP"); - REG_MSP = load_value("MSP"); - REG_VBR = load_value("VBR"); - REG_SFC = load_value("SFC"); - REG_DFC = load_value("DFC"); - REG_CACR = load_value("CACR"); - REG_CAAR = load_value("CAAR"); - CPU_INT_LEVEL = load_value("INT_LEVEL"); - CPU_INT_CYCLES = load_value("INT_CYCLES"); - - CPU_STOPPED = 0; - temp = load_value("STOPPED"); - if(temp) CPU_STOPPED |= STOP_LEVEL_STOP; - temp = load_value("HALTED"); - if(temp) CPU_STOPPED |= STOP_LEVEL_HALT; - - CPU_PREF_ADDR = load_value("PREF_ADDR"); - CPU_PREF_DATA = load_value("PREF_DATA"); -} - - - -/* ======================================================================== */ -/* ============================== END OF FILE ============================= */ -/* ======================================================================== */ +/* ======================================================================== */ +/* ========================= LICENSING & COPYRIGHT ======================== */ +/* ======================================================================== */ + +#if 0 +static const char copyright_notice[] = +"MUSASHI\n" +"Version 3.32 (2007-12-15)\n" +"A portable Motorola M680x0 processor emulation engine.\n" +"Copyright Karl Stenerud. All rights reserved.\n" +"\n" +"This code may be freely used for non-commercial purpooses as long as this\n" +"copyright notice remains unaltered in the source code and any binary files\n" +"containing this code in compiled form.\n" +"\n" +"All other licensing terms must be negotiated with the author\n" +"(Karl Stenerud).\n" +"\n" +"The latest version of this code can be obtained at:\n" +"http://kstenerud.cjb.net\n" +; +#endif + + +/* ======================================================================== */ +/* ================================= NOTES ================================ */ +/* ======================================================================== */ + + + +/* ======================================================================== */ +/* ================================ INCLUDES ============================== */ +/* ======================================================================== */ + +extern void m68040_fpu_op0(void); +extern void m68040_fpu_op1(void); + +#include "m68kops.h" +#include "m68kcpu.h" +//#include "m68kfpu.c" + +/* ======================================================================== */ +/* ================================= DATA ================================= */ +/* ======================================================================== */ + +int m68ki_initial_cycles; +int m68ki_remaining_cycles = 0; /* Number of clocks remaining */ +uint m68ki_tracing = 0; +uint m68ki_address_space; + +#ifdef M68K_LOG_ENABLE +const char *const m68ki_cpu_names[] = +{ + "Invalid CPU", + "M68000", + "M68008", + "Invalid CPU", + "M68010", + "Invalid CPU", + "Invalid CPU", + "Invalid CPU", + "M68EC020", + "Invalid CPU", + "Invalid CPU", + "Invalid CPU", + "Invalid CPU", + "Invalid CPU", + "Invalid CPU", + "Invalid CPU", + "M68020" +}; +#endif /* M68K_LOG_ENABLE */ + +/* The CPU core */ +m68ki_cpu_core m68ki_cpu = {0}; + +#if M68K_EMULATE_ADDRESS_ERROR +jmp_buf m68ki_aerr_trap; +#endif /* M68K_EMULATE_ADDRESS_ERROR */ + +uint m68ki_aerr_address; +uint m68ki_aerr_write_mode; +uint m68ki_aerr_fc; + +/* Used by shift & rotate instructions */ +const uint8 m68ki_shift_8_table[65] = +{ + 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff +}; +const uint16 m68ki_shift_16_table[65] = +{ + 0x0000, 0x8000, 0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00, 0xff00, + 0xff80, 0xffc0, 0xffe0, 0xfff0, 0xfff8, 0xfffc, 0xfffe, 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 +}; +const uint m68ki_shift_32_table[65] = +{ + 0x00000000, 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000, 0xf8000000, + 0xfc000000, 0xfe000000, 0xff000000, 0xff800000, 0xffc00000, 0xffe00000, + 0xfff00000, 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000, 0xffff8000, + 0xffffc000, 0xffffe000, 0xfffff000, 0xfffff800, 0xfffffc00, 0xfffffe00, + 0xffffff00, 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0, 0xfffffff8, + 0xfffffffc, 0xfffffffe, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff +}; + + +/* Number of clock cycles to use for exception processing. + * I used 4 for any vectors that are undocumented for processing times. + */ +const uint8 m68ki_exception_cycle_table[4][256] = +{ + { /* 000 */ + 4, /* 0: Reset - Initial Stack Pointer */ + 4, /* 1: Reset - Initial Program Counter */ + 50, /* 2: Bus Error (unemulated) */ + 50, /* 3: Address Error (unemulated) */ + 34, /* 4: Illegal Instruction */ + 38, /* 5: Divide by Zero -- ASG: changed from 42 */ + 40, /* 6: CHK -- ASG: chanaged from 44 */ + 34, /* 7: TRAPV */ + 34, /* 8: Privilege Violation */ + 34, /* 9: Trace */ + 4, /* 10: 1010 */ + 4, /* 11: 1111 */ + 4, /* 12: RESERVED */ + 4, /* 13: Coprocessor Protocol Violation (unemulated) */ + 4, /* 14: Format Error */ + 44, /* 15: Uninitialized Interrupt */ + 4, /* 16: RESERVED */ + 4, /* 17: RESERVED */ + 4, /* 18: RESERVED */ + 4, /* 19: RESERVED */ + 4, /* 20: RESERVED */ + 4, /* 21: RESERVED */ + 4, /* 22: RESERVED */ + 4, /* 23: RESERVED */ + 44, /* 24: Spurious Interrupt */ + 44, /* 25: Level 1 Interrupt Autovector */ + 44, /* 26: Level 2 Interrupt Autovector */ + 44, /* 27: Level 3 Interrupt Autovector */ + 44, /* 28: Level 4 Interrupt Autovector */ + 44, /* 29: Level 5 Interrupt Autovector */ + 44, /* 30: Level 6 Interrupt Autovector */ + 44, /* 31: Level 7 Interrupt Autovector */ + 34, /* 32: TRAP #0 -- ASG: chanaged from 38 */ + 34, /* 33: TRAP #1 */ + 34, /* 34: TRAP #2 */ + 34, /* 35: TRAP #3 */ + 34, /* 36: TRAP #4 */ + 34, /* 37: TRAP #5 */ + 34, /* 38: TRAP #6 */ + 34, /* 39: TRAP #7 */ + 34, /* 40: TRAP #8 */ + 34, /* 41: TRAP #9 */ + 34, /* 42: TRAP #10 */ + 34, /* 43: TRAP #11 */ + 34, /* 44: TRAP #12 */ + 34, /* 45: TRAP #13 */ + 34, /* 46: TRAP #14 */ + 34, /* 47: TRAP #15 */ + 4, /* 48: FP Branch or Set on Unknown Condition (unemulated) */ + 4, /* 49: FP Inexact Result (unemulated) */ + 4, /* 50: FP Divide by Zero (unemulated) */ + 4, /* 51: FP Underflow (unemulated) */ + 4, /* 52: FP Operand Error (unemulated) */ + 4, /* 53: FP Overflow (unemulated) */ + 4, /* 54: FP Signaling NAN (unemulated) */ + 4, /* 55: FP Unimplemented Data Type (unemulated) */ + 4, /* 56: MMU Configuration Error (unemulated) */ + 4, /* 57: MMU Illegal Operation Error (unemulated) */ + 4, /* 58: MMU Access Level Violation Error (unemulated) */ + 4, /* 59: RESERVED */ + 4, /* 60: RESERVED */ + 4, /* 61: RESERVED */ + 4, /* 62: RESERVED */ + 4, /* 63: RESERVED */ + /* 64-255: User Defined */ + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + }, + { /* 010 */ + 4, /* 0: Reset - Initial Stack Pointer */ + 4, /* 1: Reset - Initial Program Counter */ + 126, /* 2: Bus Error (unemulated) */ + 126, /* 3: Address Error (unemulated) */ + 38, /* 4: Illegal Instruction */ + 44, /* 5: Divide by Zero */ + 44, /* 6: CHK */ + 34, /* 7: TRAPV */ + 38, /* 8: Privilege Violation */ + 38, /* 9: Trace */ + 4, /* 10: 1010 */ + 4, /* 11: 1111 */ + 4, /* 12: RESERVED */ + 4, /* 13: Coprocessor Protocol Violation (unemulated) */ + 4, /* 14: Format Error */ + 44, /* 15: Uninitialized Interrupt */ + 4, /* 16: RESERVED */ + 4, /* 17: RESERVED */ + 4, /* 18: RESERVED */ + 4, /* 19: RESERVED */ + 4, /* 20: RESERVED */ + 4, /* 21: RESERVED */ + 4, /* 22: RESERVED */ + 4, /* 23: RESERVED */ + 46, /* 24: Spurious Interrupt */ + 46, /* 25: Level 1 Interrupt Autovector */ + 46, /* 26: Level 2 Interrupt Autovector */ + 46, /* 27: Level 3 Interrupt Autovector */ + 46, /* 28: Level 4 Interrupt Autovector */ + 46, /* 29: Level 5 Interrupt Autovector */ + 46, /* 30: Level 6 Interrupt Autovector */ + 46, /* 31: Level 7 Interrupt Autovector */ + 38, /* 32: TRAP #0 */ + 38, /* 33: TRAP #1 */ + 38, /* 34: TRAP #2 */ + 38, /* 35: TRAP #3 */ + 38, /* 36: TRAP #4 */ + 38, /* 37: TRAP #5 */ + 38, /* 38: TRAP #6 */ + 38, /* 39: TRAP #7 */ + 38, /* 40: TRAP #8 */ + 38, /* 41: TRAP #9 */ + 38, /* 42: TRAP #10 */ + 38, /* 43: TRAP #11 */ + 38, /* 44: TRAP #12 */ + 38, /* 45: TRAP #13 */ + 38, /* 46: TRAP #14 */ + 38, /* 47: TRAP #15 */ + 4, /* 48: FP Branch or Set on Unknown Condition (unemulated) */ + 4, /* 49: FP Inexact Result (unemulated) */ + 4, /* 50: FP Divide by Zero (unemulated) */ + 4, /* 51: FP Underflow (unemulated) */ + 4, /* 52: FP Operand Error (unemulated) */ + 4, /* 53: FP Overflow (unemulated) */ + 4, /* 54: FP Signaling NAN (unemulated) */ + 4, /* 55: FP Unimplemented Data Type (unemulated) */ + 4, /* 56: MMU Configuration Error (unemulated) */ + 4, /* 57: MMU Illegal Operation Error (unemulated) */ + 4, /* 58: MMU Access Level Violation Error (unemulated) */ + 4, /* 59: RESERVED */ + 4, /* 60: RESERVED */ + 4, /* 61: RESERVED */ + 4, /* 62: RESERVED */ + 4, /* 63: RESERVED */ + /* 64-255: User Defined */ + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + }, + { /* 020 */ + 4, /* 0: Reset - Initial Stack Pointer */ + 4, /* 1: Reset - Initial Program Counter */ + 50, /* 2: Bus Error (unemulated) */ + 50, /* 3: Address Error (unemulated) */ + 20, /* 4: Illegal Instruction */ + 38, /* 5: Divide by Zero */ + 40, /* 6: CHK */ + 20, /* 7: TRAPV */ + 34, /* 8: Privilege Violation */ + 25, /* 9: Trace */ + 20, /* 10: 1010 */ + 20, /* 11: 1111 */ + 4, /* 12: RESERVED */ + 4, /* 13: Coprocessor Protocol Violation (unemulated) */ + 4, /* 14: Format Error */ + 30, /* 15: Uninitialized Interrupt */ + 4, /* 16: RESERVED */ + 4, /* 17: RESERVED */ + 4, /* 18: RESERVED */ + 4, /* 19: RESERVED */ + 4, /* 20: RESERVED */ + 4, /* 21: RESERVED */ + 4, /* 22: RESERVED */ + 4, /* 23: RESERVED */ + 30, /* 24: Spurious Interrupt */ + 30, /* 25: Level 1 Interrupt Autovector */ + 30, /* 26: Level 2 Interrupt Autovector */ + 30, /* 27: Level 3 Interrupt Autovector */ + 30, /* 28: Level 4 Interrupt Autovector */ + 30, /* 29: Level 5 Interrupt Autovector */ + 30, /* 30: Level 6 Interrupt Autovector */ + 30, /* 31: Level 7 Interrupt Autovector */ + 20, /* 32: TRAP #0 */ + 20, /* 33: TRAP #1 */ + 20, /* 34: TRAP #2 */ + 20, /* 35: TRAP #3 */ + 20, /* 36: TRAP #4 */ + 20, /* 37: TRAP #5 */ + 20, /* 38: TRAP #6 */ + 20, /* 39: TRAP #7 */ + 20, /* 40: TRAP #8 */ + 20, /* 41: TRAP #9 */ + 20, /* 42: TRAP #10 */ + 20, /* 43: TRAP #11 */ + 20, /* 44: TRAP #12 */ + 20, /* 45: TRAP #13 */ + 20, /* 46: TRAP #14 */ + 20, /* 47: TRAP #15 */ + 4, /* 48: FP Branch or Set on Unknown Condition (unemulated) */ + 4, /* 49: FP Inexact Result (unemulated) */ + 4, /* 50: FP Divide by Zero (unemulated) */ + 4, /* 51: FP Underflow (unemulated) */ + 4, /* 52: FP Operand Error (unemulated) */ + 4, /* 53: FP Overflow (unemulated) */ + 4, /* 54: FP Signaling NAN (unemulated) */ + 4, /* 55: FP Unimplemented Data Type (unemulated) */ + 4, /* 56: MMU Configuration Error (unemulated) */ + 4, /* 57: MMU Illegal Operation Error (unemulated) */ + 4, /* 58: MMU Access Level Violation Error (unemulated) */ + 4, /* 59: RESERVED */ + 4, /* 60: RESERVED */ + 4, /* 61: RESERVED */ + 4, /* 62: RESERVED */ + 4, /* 63: RESERVED */ + /* 64-255: User Defined */ + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + }, + { /* 040 */ // TODO: these values are not correct + 4, /* 0: Reset - Initial Stack Pointer */ + 4, /* 1: Reset - Initial Program Counter */ + 50, /* 2: Bus Error (unemulated) */ + 50, /* 3: Address Error (unemulated) */ + 20, /* 4: Illegal Instruction */ + 38, /* 5: Divide by Zero */ + 40, /* 6: CHK */ + 20, /* 7: TRAPV */ + 34, /* 8: Privilege Violation */ + 25, /* 9: Trace */ + 20, /* 10: 1010 */ + 20, /* 11: 1111 */ + 4, /* 12: RESERVED */ + 4, /* 13: Coprocessor Protocol Violation (unemulated) */ + 4, /* 14: Format Error */ + 30, /* 15: Uninitialized Interrupt */ + 4, /* 16: RESERVED */ + 4, /* 17: RESERVED */ + 4, /* 18: RESERVED */ + 4, /* 19: RESERVED */ + 4, /* 20: RESERVED */ + 4, /* 21: RESERVED */ + 4, /* 22: RESERVED */ + 4, /* 23: RESERVED */ + 30, /* 24: Spurious Interrupt */ + 30, /* 25: Level 1 Interrupt Autovector */ + 30, /* 26: Level 2 Interrupt Autovector */ + 30, /* 27: Level 3 Interrupt Autovector */ + 30, /* 28: Level 4 Interrupt Autovector */ + 30, /* 29: Level 5 Interrupt Autovector */ + 30, /* 30: Level 6 Interrupt Autovector */ + 30, /* 31: Level 7 Interrupt Autovector */ + 20, /* 32: TRAP #0 */ + 20, /* 33: TRAP #1 */ + 20, /* 34: TRAP #2 */ + 20, /* 35: TRAP #3 */ + 20, /* 36: TRAP #4 */ + 20, /* 37: TRAP #5 */ + 20, /* 38: TRAP #6 */ + 20, /* 39: TRAP #7 */ + 20, /* 40: TRAP #8 */ + 20, /* 41: TRAP #9 */ + 20, /* 42: TRAP #10 */ + 20, /* 43: TRAP #11 */ + 20, /* 44: TRAP #12 */ + 20, /* 45: TRAP #13 */ + 20, /* 46: TRAP #14 */ + 20, /* 47: TRAP #15 */ + 4, /* 48: FP Branch or Set on Unknown Condition (unemulated) */ + 4, /* 49: FP Inexact Result (unemulated) */ + 4, /* 50: FP Divide by Zero (unemulated) */ + 4, /* 51: FP Underflow (unemulated) */ + 4, /* 52: FP Operand Error (unemulated) */ + 4, /* 53: FP Overflow (unemulated) */ + 4, /* 54: FP Signaling NAN (unemulated) */ + 4, /* 55: FP Unimplemented Data Type (unemulated) */ + 4, /* 56: MMU Configuration Error (unemulated) */ + 4, /* 57: MMU Illegal Operation Error (unemulated) */ + 4, /* 58: MMU Access Level Violation Error (unemulated) */ + 4, /* 59: RESERVED */ + 4, /* 60: RESERVED */ + 4, /* 61: RESERVED */ + 4, /* 62: RESERVED */ + 4, /* 63: RESERVED */ + /* 64-255: User Defined */ + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + } +}; + +const uint8 m68ki_ea_idx_cycle_table[64] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, /* ..01.000 no memory indirect, base NULL */ + 5, /* ..01..01 memory indirect, base NULL, outer NULL */ + 7, /* ..01..10 memory indirect, base NULL, outer 16 */ + 7, /* ..01..11 memory indirect, base NULL, outer 32 */ + 0, 5, 7, 7, 0, 5, 7, 7, 0, 5, 7, 7, + 2, /* ..10.000 no memory indirect, base 16 */ + 7, /* ..10..01 memory indirect, base 16, outer NULL */ + 9, /* ..10..10 memory indirect, base 16, outer 16 */ + 9, /* ..10..11 memory indirect, base 16, outer 32 */ + 0, 7, 9, 9, 0, 7, 9, 9, 0, 7, 9, 9, + 6, /* ..11.000 no memory indirect, base 32 */ + 11, /* ..11..01 memory indirect, base 32, outer NULL */ + 13, /* ..11..10 memory indirect, base 32, outer 16 */ + 13, /* ..11..11 memory indirect, base 32, outer 32 */ + 0, 11, 13, 13, 0, 11, 13, 13, 0, 11, 13, 13 +}; + + + +/* ======================================================================== */ +/* =============================== CALLBACKS ============================== */ +/* ======================================================================== */ + +/* Default callbacks used if the callback hasn't been set yet, or if the + * callback is set to NULL + */ + +/* Interrupt acknowledge */ +static int default_int_ack_callback_data; +static int default_int_ack_callback(int int_level) +{ + default_int_ack_callback_data = int_level; + CPU_INT_LEVEL = 0; + return M68K_INT_ACK_AUTOVECTOR; +} + +/* Breakpoint acknowledge */ +static unsigned int default_bkpt_ack_callback_data; +static void default_bkpt_ack_callback(unsigned int data) +{ + default_bkpt_ack_callback_data = data; +} + +/* Called when a reset instruction is executed */ +static void default_reset_instr_callback(void) +{ +} + +/* Called when a cmpi.l #v, dn instruction is executed */ +static void default_cmpild_instr_callback(unsigned int val, int reg) +{ +} + +/* Called when a rte instruction is executed */ +static void default_rte_instr_callback(void) +{ +} + +/* Called when a tas instruction is executed */ +static int default_tas_instr_callback(void) +{ + return 1; // allow writeback +} + +/* Called when the program counter changed by a large value */ +static unsigned int default_pc_changed_callback_data; +static void default_pc_changed_callback(unsigned int new_pc) +{ + default_pc_changed_callback_data = new_pc; +} + +/* Called every time there's bus activity (read/write to/from memory */ +static unsigned int default_set_fc_callback_data; +static void default_set_fc_callback(unsigned int new_fc) +{ + default_set_fc_callback_data = new_fc; +} + +/* Called every instruction cycle prior to execution */ +static void default_instr_hook_callback(unsigned int pc) +{ +} + + +#if M68K_EMULATE_ADDRESS_ERROR + #include + jmp_buf m68ki_aerr_trap; + int emulate_address_error = 0; +#endif /* M68K_EMULATE_ADDRESS_ERROR */ + + +/* ======================================================================== */ +/* ================================= API ================================== */ +/* ======================================================================== */ + +/* Access the internals of the CPU */ +unsigned int m68k_get_reg(void* context, m68k_register_t regnum) +{ + m68ki_cpu_core* cpu = context != NULL ?(m68ki_cpu_core*)context : &m68ki_cpu; + + switch(regnum) + { + case M68K_REG_D0: return cpu->dar[0]; + case M68K_REG_D1: return cpu->dar[1]; + case M68K_REG_D2: return cpu->dar[2]; + case M68K_REG_D3: return cpu->dar[3]; + case M68K_REG_D4: return cpu->dar[4]; + case M68K_REG_D5: return cpu->dar[5]; + case M68K_REG_D6: return cpu->dar[6]; + case M68K_REG_D7: return cpu->dar[7]; + case M68K_REG_A0: return cpu->dar[8]; + case M68K_REG_A1: return cpu->dar[9]; + case M68K_REG_A2: return cpu->dar[10]; + case M68K_REG_A3: return cpu->dar[11]; + case M68K_REG_A4: return cpu->dar[12]; + case M68K_REG_A5: return cpu->dar[13]; + case M68K_REG_A6: return cpu->dar[14]; + case M68K_REG_A7: return cpu->dar[15]; + case M68K_REG_PC: return MASK_OUT_ABOVE_32(cpu->pc); + case M68K_REG_SR: return cpu->t1_flag | + cpu->t0_flag | + (cpu->s_flag << 11) | + (cpu->m_flag << 11) | + cpu->int_mask | + ((cpu->x_flag & XFLAG_SET) >> 4) | + ((cpu->n_flag & NFLAG_SET) >> 4) | + ((!cpu->not_z_flag) << 2) | + ((cpu->v_flag & VFLAG_SET) >> 6) | + ((cpu->c_flag & CFLAG_SET) >> 8); + case M68K_REG_SP: return cpu->dar[15]; + case M68K_REG_USP: return cpu->s_flag ? cpu->sp[0] : cpu->dar[15]; + case M68K_REG_ISP: return cpu->s_flag && !cpu->m_flag ? cpu->dar[15] : cpu->sp[4]; + case M68K_REG_MSP: return cpu->s_flag && cpu->m_flag ? cpu->dar[15] : cpu->sp[6]; + case M68K_REG_SFC: return cpu->sfc; + case M68K_REG_DFC: return cpu->dfc; + case M68K_REG_VBR: return cpu->vbr; + case M68K_REG_CACR: return cpu->cacr; + case M68K_REG_CAAR: return cpu->caar; + case M68K_REG_PREF_ADDR: return cpu->pref_addr; + case M68K_REG_PREF_DATA: return cpu->pref_data; + case M68K_REG_PPC: return MASK_OUT_ABOVE_32(cpu->ppc); + case M68K_REG_IR: return cpu->ir; + case M68K_REG_CPU_TYPE: + switch(cpu->cpu_type) + { + case CPU_TYPE_000: return (unsigned int)M68K_CPU_TYPE_68000; + case CPU_TYPE_008: return (unsigned int)M68K_CPU_TYPE_68008; + case CPU_TYPE_010: return (unsigned int)M68K_CPU_TYPE_68010; + case CPU_TYPE_EC020: return (unsigned int)M68K_CPU_TYPE_68EC020; + case CPU_TYPE_020: return (unsigned int)M68K_CPU_TYPE_68020; + case CPU_TYPE_040: return (unsigned int)M68K_CPU_TYPE_68040; + } + return M68K_CPU_TYPE_INVALID; + default: return 0; + } + return 0; +} + +void m68k_set_reg(m68k_register_t regnum, unsigned int value) +{ + switch(regnum) + { + case M68K_REG_D0: REG_D[0] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_D1: REG_D[1] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_D2: REG_D[2] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_D3: REG_D[3] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_D4: REG_D[4] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_D5: REG_D[5] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_D6: REG_D[6] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_D7: REG_D[7] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_A0: REG_A[0] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_A1: REG_A[1] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_A2: REG_A[2] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_A3: REG_A[3] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_A4: REG_A[4] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_A5: REG_A[5] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_A6: REG_A[6] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_A7: REG_A[7] = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_PC: m68ki_jump(MASK_OUT_ABOVE_32(value)); return; + case M68K_REG_SR: m68ki_set_sr(value); return; + case M68K_REG_SP: REG_SP = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_USP: if(FLAG_S) + REG_USP = MASK_OUT_ABOVE_32(value); + else + REG_SP = MASK_OUT_ABOVE_32(value); + return; + case M68K_REG_ISP: if(FLAG_S && !FLAG_M) + REG_SP = MASK_OUT_ABOVE_32(value); + else + REG_ISP = MASK_OUT_ABOVE_32(value); + return; + case M68K_REG_MSP: if(FLAG_S && FLAG_M) + REG_SP = MASK_OUT_ABOVE_32(value); + else + REG_MSP = MASK_OUT_ABOVE_32(value); + return; + case M68K_REG_VBR: REG_VBR = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_SFC: REG_SFC = value & 7; return; + case M68K_REG_DFC: REG_DFC = value & 7; return; + case M68K_REG_CACR: REG_CACR = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_CAAR: REG_CAAR = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_PPC: REG_PPC = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_IR: REG_IR = MASK_OUT_ABOVE_16(value); return; + case M68K_REG_PREF_ADDR: CPU_PREF_ADDR = MASK_OUT_ABOVE_32(value); return; + case M68K_REG_CPU_TYPE: m68k_set_cpu_type(value); return; + default: return; + } +} + +/* Set the callbacks */ +void m68k_set_int_ack_callback(int (*callback)(int int_level)) +{ + CALLBACK_INT_ACK = callback ? callback : default_int_ack_callback; +} + +void m68k_set_bkpt_ack_callback(void (*callback)(unsigned int data)) +{ + CALLBACK_BKPT_ACK = callback ? callback : default_bkpt_ack_callback; +} + +void m68k_set_reset_instr_callback(void (*callback)(void)) +{ + CALLBACK_RESET_INSTR = callback ? callback : default_reset_instr_callback; +} + +void m68k_set_cmpild_instr_callback(void (*callback)(unsigned int, int)) +{ + CALLBACK_CMPILD_INSTR = callback ? callback : default_cmpild_instr_callback; +} + +void m68k_set_rte_instr_callback(void (*callback)(void)) +{ + CALLBACK_RTE_INSTR = callback ? callback : default_rte_instr_callback; +} + +void m68k_set_tas_instr_callback(int (*callback)(void)) +{ + CALLBACK_TAS_INSTR = callback ? callback : default_tas_instr_callback; +} + +void m68k_set_pc_changed_callback(void (*callback)(unsigned int new_pc)) +{ + CALLBACK_PC_CHANGED = callback ? callback : default_pc_changed_callback; +} + +void m68k_set_fc_callback(void (*callback)(unsigned int new_fc)) +{ + CALLBACK_SET_FC = callback ? callback : default_set_fc_callback; +} + +void m68k_set_instr_hook_callback(void (*callback)(unsigned int pc)) +{ + CALLBACK_INSTR_HOOK = callback ? callback : default_instr_hook_callback; +} + +#include +/* Set the CPU type. */ +void m68k_set_cpu_type(unsigned int cpu_type) +{ + switch(cpu_type) + { + case M68K_CPU_TYPE_68000: + CPU_TYPE = CPU_TYPE_000; + CPU_ADDRESS_MASK = 0x00ffffff; + CPU_SR_MASK = 0xa71f; /* T1 -- S -- -- I2 I1 I0 -- -- -- X N Z V C */ + CYC_INSTRUCTION = m68ki_cycles[0]; + CYC_EXCEPTION = m68ki_exception_cycle_table[0]; + CYC_BCC_NOTAKE_B = -2; + CYC_BCC_NOTAKE_W = 2; + CYC_DBCC_F_NOEXP = -2; + CYC_DBCC_F_EXP = 2; + CYC_SCC_R_TRUE = 2; + CYC_MOVEM_W = 2; + CYC_MOVEM_L = 3; + CYC_SHIFT = 1; + CYC_RESET = 132; + return; + case M68K_CPU_TYPE_68008: + CPU_TYPE = CPU_TYPE_008; + CPU_ADDRESS_MASK = 0x003fffff; + CPU_SR_MASK = 0xa71f; /* T1 -- S -- -- I2 I1 I0 -- -- -- X N Z V C */ + CYC_INSTRUCTION = m68ki_cycles[0]; + CYC_EXCEPTION = m68ki_exception_cycle_table[0]; + CYC_BCC_NOTAKE_B = -2; + CYC_BCC_NOTAKE_W = 2; + CYC_DBCC_F_NOEXP = -2; + CYC_DBCC_F_EXP = 2; + CYC_SCC_R_TRUE = 2; + CYC_MOVEM_W = 2; + CYC_MOVEM_L = 3; + CYC_SHIFT = 1; + CYC_RESET = 132; + return; + case M68K_CPU_TYPE_68010: + CPU_TYPE = CPU_TYPE_010; + CPU_ADDRESS_MASK = 0x00ffffff; + CPU_SR_MASK = 0xa71f; /* T1 -- S -- -- I2 I1 I0 -- -- -- X N Z V C */ + CYC_INSTRUCTION = m68ki_cycles[1]; + CYC_EXCEPTION = m68ki_exception_cycle_table[1]; + CYC_BCC_NOTAKE_B = -4; + CYC_BCC_NOTAKE_W = 0; + CYC_DBCC_F_NOEXP = 0; + CYC_DBCC_F_EXP = 6; + CYC_SCC_R_TRUE = 0; + CYC_MOVEM_W = 2; + CYC_MOVEM_L = 3; + CYC_SHIFT = 1; + CYC_RESET = 130; + return; + case M68K_CPU_TYPE_68EC020: + CPU_TYPE = CPU_TYPE_EC020; + CPU_ADDRESS_MASK = 0x00ffffff; + CPU_SR_MASK = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ + CYC_INSTRUCTION = m68ki_cycles[2]; + CYC_EXCEPTION = m68ki_exception_cycle_table[2]; + CYC_BCC_NOTAKE_B = -2; + CYC_BCC_NOTAKE_W = 0; + CYC_DBCC_F_NOEXP = 0; + CYC_DBCC_F_EXP = 4; + CYC_SCC_R_TRUE = 0; + CYC_MOVEM_W = 2; + CYC_MOVEM_L = 2; + CYC_SHIFT = 0; + CYC_RESET = 518; + return; + case M68K_CPU_TYPE_68020: + CPU_TYPE = CPU_TYPE_020; + CPU_ADDRESS_MASK = 0xffffffff; + CPU_SR_MASK = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ + CYC_INSTRUCTION = m68ki_cycles[2]; + CYC_EXCEPTION = m68ki_exception_cycle_table[2]; + CYC_BCC_NOTAKE_B = -2; + CYC_BCC_NOTAKE_W = 0; + CYC_DBCC_F_NOEXP = 0; + CYC_DBCC_F_EXP = 4; + CYC_SCC_R_TRUE = 0; + CYC_MOVEM_W = 2; + CYC_MOVEM_L = 2; + CYC_SHIFT = 0; + CYC_RESET = 518; + return; + case M68K_CPU_TYPE_68040: // TODO: these values are not correct + CPU_TYPE = CPU_TYPE_040; + CPU_ADDRESS_MASK = 0xffffffff; + CPU_SR_MASK = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ + CYC_INSTRUCTION = m68ki_cycles[2]; + CYC_EXCEPTION = m68ki_exception_cycle_table[2]; + CYC_BCC_NOTAKE_B = -2; + CYC_BCC_NOTAKE_W = 0; + CYC_DBCC_F_NOEXP = 0; + CYC_DBCC_F_EXP = 4; + CYC_SCC_R_TRUE = 0; + CYC_MOVEM_W = 2; + CYC_MOVEM_L = 2; + CYC_SHIFT = 0; + CYC_RESET = 518; + return; + } +} + +/* Execute some instructions until we use up num_cycles clock cycles */ +/* ASG: removed per-instruction interrupt checks */ +int m68k_execute(int num_cycles) +{ + /* Make sure we're not stopped */ + if(!CPU_STOPPED) + { + /* Set our pool of clock cycles available */ + SET_CYCLES(num_cycles); + m68ki_initial_cycles = num_cycles; + + /* ASG: update cycles */ + USE_CYCLES(CPU_INT_CYCLES); + CPU_INT_CYCLES = 0; + + /* Return point if we had an address error */ + m68ki_set_address_error_trap(); /* auto-disable (see m68kcpu.h) */ + + /* Main loop. Keep going until we run out of clock cycles */ + do + { + /* Set tracing accodring to T1. (T0 is done inside instruction) */ + m68ki_trace_t1(); /* auto-disable (see m68kcpu.h) */ + + /* Set the address space for reads */ + m68ki_use_data_space(); /* auto-disable (see m68kcpu.h) */ + + /* Call external hook to peek at CPU */ + m68ki_instr_hook(REG_PC); /* auto-disable (see m68kcpu.h) */ + + /* Record previous program counter */ + REG_PPC = REG_PC; + + /* Read an instruction and call its handler */ + REG_IR = m68ki_read_imm_16(); + m68ki_instruction_jump_table[REG_IR](); + USE_CYCLES(CYC_INSTRUCTION[REG_IR]); + + /* Trace m68k_exception, if necessary */ + m68ki_exception_if_trace(); /* auto-disable (see m68kcpu.h) */ + } while(GET_CYCLES() > 0); + + /* set previous PC to current PC for the next entry into the loop */ + REG_PPC = REG_PC; + + /* ASG: update cycles */ + USE_CYCLES(CPU_INT_CYCLES); + CPU_INT_CYCLES = 0; + + /* return how many clocks we used */ + return m68ki_initial_cycles - GET_CYCLES(); + } + + /* We get here if the CPU is stopped or halted */ + SET_CYCLES(0); + CPU_INT_CYCLES = 0; + + return num_cycles; +} + + +int m68k_cycles_run(void) +{ + return m68ki_initial_cycles - GET_CYCLES(); +} + +int m68k_cycles_remaining(void) +{ + return GET_CYCLES(); +} + +/* Change the timeslice */ +void m68k_modify_timeslice(int cycles) +{ + m68ki_initial_cycles += cycles; + ADD_CYCLES(cycles); +} + + +void m68k_end_timeslice(void) +{ + m68ki_initial_cycles = GET_CYCLES(); + SET_CYCLES(0); +} + + +/* ASG: rewrote so that the int_level is a mask of the IPL0/IPL1/IPL2 bits */ +/* KS: Modified so that IPL* bits match with mask positions in the SR + * and cleaned out remenants of the interrupt controller. + */ +void m68k_set_irq(unsigned int int_level) +{ + uint old_level = CPU_INT_LEVEL; + CPU_INT_LEVEL = int_level << 8; + + /* A transition from < 7 to 7 always interrupts (NMI) */ + /* Note: Level 7 can also level trigger like a normal IRQ */ + if(old_level != 0x0700 && CPU_INT_LEVEL == 0x0700) + m68ki_exception_interrupt(7); /* Edge triggered level 7 (NMI) */ + else + m68ki_check_interrupts(); /* Level triggered (IRQ) */ +} + +void m68k_init(void) +{ + static uint emulation_initialized = 0; + + /* The first call to this function initializes the opcode handler jump table */ + if(!emulation_initialized) + { + m68ki_build_opcode_table(); + emulation_initialized = 1; + } + + m68k_set_int_ack_callback(NULL); + m68k_set_bkpt_ack_callback(NULL); + m68k_set_reset_instr_callback(NULL); + m68k_set_cmpild_instr_callback(NULL); + m68k_set_rte_instr_callback(NULL); + m68k_set_tas_instr_callback(NULL); + m68k_set_pc_changed_callback(NULL); + m68k_set_fc_callback(NULL); + m68k_set_instr_hook_callback(NULL); +} + +/* Pulse the RESET line on the CPU */ +void m68k_pulse_reset(void) +{ + /* Clear all stop levels and eat up all remaining cycles */ + CPU_STOPPED = 0; + SET_CYCLES(0); + + CPU_RUN_MODE = RUN_MODE_BERR_AERR_RESET; + + /* Turn off tracing */ + FLAG_T1 = FLAG_T0 = 0; + m68ki_clear_trace(); + /* Interrupt mask to level 7 */ + FLAG_INT_MASK = 0x0700; + CPU_INT_LEVEL = 0; + /* Reset VBR */ + REG_VBR = 0; + /* Go to supervisor mode */ + m68ki_set_sm_flag(SFLAG_SET | MFLAG_CLEAR); + + /* Invalidate the prefetch queue */ +#if M68K_EMULATE_PREFETCH + /* Set to arbitrary number since our first fetch is from 0 */ + CPU_PREF_ADDR = 0x1000; +#endif /* M68K_EMULATE_PREFETCH */ + + /* Read the initial stack pointer and program counter */ + m68ki_jump(0); + REG_SP = m68ki_read_imm_32(); + REG_PC = m68ki_read_imm_32(); + m68ki_jump(REG_PC); + + CPU_RUN_MODE = RUN_MODE_NORMAL; +} + +/* Pulse the HALT line on the CPU */ +void m68k_pulse_halt(void) +{ + CPU_STOPPED |= STOP_LEVEL_HALT; +} + + +/* Get and set the current CPU context */ +/* This is to allow for multiple CPUs */ +unsigned int m68k_context_size() +{ + return sizeof(m68ki_cpu_core); +} + +unsigned int m68k_get_context(void* dst) +{ + if(dst) *(m68ki_cpu_core*)dst = m68ki_cpu; + return sizeof(m68ki_cpu_core); +} + +void m68k_set_context(void* src) +{ + if(src) m68ki_cpu = *(m68ki_cpu_core*)src; +} + + + +/* ======================================================================== */ +/* ============================== MAME STUFF ============================== */ +/* ======================================================================== */ + +#if M68K_COMPILE_FOR_MAME == OPT_ON + +static struct { + uint16 sr; + uint8 stopped; + uint8 halted; +} m68k_substate; + +static void m68k_prepare_substate(void) +{ + m68k_substate.sr = m68ki_get_sr(); + m68k_substate.stopped = (CPU_STOPPED & STOP_LEVEL_STOP) != 0; + m68k_substate.halted = (CPU_STOPPED & STOP_LEVEL_HALT) != 0; +} + +static void m68k_post_load(void) +{ + m68ki_set_sr_noint_nosp(m68k_substate.sr); + CPU_STOPPED = m68k_substate.stopped ? STOP_LEVEL_STOP : 0 + | m68k_substate.halted ? STOP_LEVEL_HALT : 0; + m68ki_jump(REG_PC); +} + +void m68k_state_register(const char *type, int index) +{ + /* Note, D covers A because the dar array is common, REG_A=REG_D+8 */ + state_save_register_item_array(type, index, REG_D); + state_save_register_item(type, index, REG_PPC); + state_save_register_item(type, index, REG_PC); + state_save_register_item(type, index, REG_USP); + state_save_register_item(type, index, REG_ISP); + state_save_register_item(type, index, REG_MSP); + state_save_register_item(type, index, REG_VBR); + state_save_register_item(type, index, REG_SFC); + state_save_register_item(type, index, REG_DFC); + state_save_register_item(type, index, REG_CACR); + state_save_register_item(type, index, REG_CAAR); + state_save_register_item(type, index, m68k_substate.sr); + state_save_register_item(type, index, CPU_INT_LEVEL); + state_save_register_item(type, index, CPU_INT_CYCLES); + state_save_register_item(type, index, m68k_substate.stopped); + state_save_register_item(type, index, m68k_substate.halted); + state_save_register_item(type, index, CPU_PREF_ADDR); + state_save_register_item(type, index, CPU_PREF_DATA); + state_save_register_func_presave(m68k_prepare_substate); + state_save_register_func_postload(m68k_post_load); +} + +#endif /* M68K_COMPILE_FOR_MAME */ + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ diff --git a/source/m68k/m68kcpu.h b/source/m68k/m68kcpu.h index 8bdb44c..ad174ce 100644 --- a/source/m68k/m68kcpu.h +++ b/source/m68k/m68kcpu.h @@ -1,1837 +1,2038 @@ -#include -/* ======================================================================== */ -/* ========================= LICENSING & COPYRIGHT ======================== */ -/* ======================================================================== */ -/* - * MUSASHI - * Version 3.3 - * - * A portable Motorola M680x0 processor emulation engine. - * Copyright 1998-2001 Karl Stenerud. All rights reserved. - * - * This code may be freely used for non-commercial purposes as long as this - * copyright notice remains unaltered in the source code and any binary files - * containing this code in compiled form. - * - * All other lisencing terms must be negotiated with the author - * (Karl Stenerud). - * - * The latest version of this code can be obtained at: - * http://kstenerud.cjb.net - */ - - - - -#ifndef M68KCPU__HEADER -#define M68KCPU__HEADER - -#include "m68k.h" -#include - -#if M68K_EMULATE_ADDRESS_ERROR -#include -#endif /* M68K_EMULATE_ADDRESS_ERROR */ - -/* ======================================================================== */ -/* ==================== ARCHITECTURE-DEPENDANT DEFINES ==================== */ -/* ======================================================================== */ - -/* Check for > 32bit sizes */ -#if UINT_MAX > 0xffffffff - #define M68K_INT_GT_32_BIT 1 -#endif - -/* Data types used in this emulation core */ -#undef sint8 -#undef sint16 -#undef sint32 -#undef sint64 -#undef uint8 -#undef uint16 -#undef uint32 -#undef uint64 -#undef sint -#undef uint - -#define sint8 signed char /* ASG: changed from char to signed char */ -#define sint16 signed short -#define sint32 signed long -#define uint8 unsigned char -#define uint16 unsigned short -#define uint32 unsigned long - -/* signed and unsigned int must be at least 32 bits wide */ -#define sint signed int -#define uint unsigned int - - -#if M68K_USE_64_BIT -#define sint64 signed long long -#define uint64 unsigned long long -#else -#define sint64 sint32 -#define uint64 uint32 -#endif /* M68K_USE_64_BIT */ - - - -/* Allow for architectures that don't have 8-bit sizes */ -#if UCHAR_MAX == 0xff - #define MAKE_INT_8(A) (sint8)(A) -#else - #undef sint8 - #define sint8 signed int - #undef uint8 - #define uint8 unsigned int - INLINE sint MAKE_INT_8(uint value) - { - return (value & 0x80) ? value | ~0xff : value & 0xff; - } -#endif /* UCHAR_MAX == 0xff */ - - -/* Allow for architectures that don't have 16-bit sizes */ -#if USHRT_MAX == 0xffff - #define MAKE_INT_16(A) (sint16)(A) -#else - #undef sint16 - #define sint16 signed int - #undef uint16 - #define uint16 unsigned int - INLINE sint MAKE_INT_16(uint value) - { - return (value & 0x8000) ? value | ~0xffff : value & 0xffff; - } -#endif /* USHRT_MAX == 0xffff */ - - -/* Allow for architectures that don't have 32-bit sizes */ -#if ULONG_MAX == 0xffffffff - #define MAKE_INT_32(A) (sint32)(A) -#else - #undef sint32 - #define sint32 signed int - #undef uint32 - #define uint32 unsigned int - INLINE sint MAKE_INT_32(uint value) - { - return (value & 0x80000000) ? value | ~0xffffffff : value & 0xffffffff; - } -#endif /* ULONG_MAX == 0xffffffff */ - - - - -/* ======================================================================== */ -/* ============================ GENERAL DEFINES =========================== */ -/* ======================================================================== */ - -/* Exception Vectors handled by emulation */ -#define EXCEPTION_BUS_ERROR 2 /* This one is not emulated! */ -#define EXCEPTION_ADDRESS_ERROR 3 /* This one is partially emulated (doesn't stack a proper frame yet) */ -#define EXCEPTION_ILLEGAL_INSTRUCTION 4 -#define EXCEPTION_ZERO_DIVIDE 5 -#define EXCEPTION_CHK 6 -#define EXCEPTION_TRAPV 7 -#define EXCEPTION_PRIVILEGE_VIOLATION 8 -#define EXCEPTION_TRACE 9 -#define EXCEPTION_1010 10 -#define EXCEPTION_1111 11 -#define EXCEPTION_FORMAT_ERROR 14 -#define EXCEPTION_UNINITIALIZED_INTERRUPT 15 -#define EXCEPTION_SPURIOUS_INTERRUPT 24 -#define EXCEPTION_INTERRUPT_AUTOVECTOR 24 -#define EXCEPTION_TRAP_BASE 32 - -/* Function codes set by CPU during data/address bus activity */ -#define FUNCTION_CODE_USER_DATA 1 -#define FUNCTION_CODE_USER_PROGRAM 2 -#define FUNCTION_CODE_SUPERVISOR_DATA 5 -#define FUNCTION_CODE_SUPERVISOR_PROGRAM 6 -#define FUNCTION_CODE_CPU_SPACE 7 - -/* CPU types for deciding what to emulate */ -#define CPU_TYPE_000 1 -#define CPU_TYPE_010 2 -#define CPU_TYPE_EC020 4 -#define CPU_TYPE_020 8 - -/* Different ways to stop the CPU */ -#define STOP_LEVEL_STOP 1 -#define STOP_LEVEL_HALT 2 - -#ifndef NULL -#define NULL ((void*)0) -#endif - -/* ======================================================================== */ -/* ================================ MACROS ================================ */ -/* ======================================================================== */ - - -/* ---------------------------- General Macros ---------------------------- */ - -/* Bit Isolation Macros */ -#define BIT_0(A) ((A) & 0x00000001) -#define BIT_1(A) ((A) & 0x00000002) -#define BIT_2(A) ((A) & 0x00000004) -#define BIT_3(A) ((A) & 0x00000008) -#define BIT_4(A) ((A) & 0x00000010) -#define BIT_5(A) ((A) & 0x00000020) -#define BIT_6(A) ((A) & 0x00000040) -#define BIT_7(A) ((A) & 0x00000080) -#define BIT_8(A) ((A) & 0x00000100) -#define BIT_9(A) ((A) & 0x00000200) -#define BIT_A(A) ((A) & 0x00000400) -#define BIT_B(A) ((A) & 0x00000800) -#define BIT_C(A) ((A) & 0x00001000) -#define BIT_D(A) ((A) & 0x00002000) -#define BIT_E(A) ((A) & 0x00004000) -#define BIT_F(A) ((A) & 0x00008000) -#define BIT_10(A) ((A) & 0x00010000) -#define BIT_11(A) ((A) & 0x00020000) -#define BIT_12(A) ((A) & 0x00040000) -#define BIT_13(A) ((A) & 0x00080000) -#define BIT_14(A) ((A) & 0x00100000) -#define BIT_15(A) ((A) & 0x00200000) -#define BIT_16(A) ((A) & 0x00400000) -#define BIT_17(A) ((A) & 0x00800000) -#define BIT_18(A) ((A) & 0x01000000) -#define BIT_19(A) ((A) & 0x02000000) -#define BIT_1A(A) ((A) & 0x04000000) -#define BIT_1B(A) ((A) & 0x08000000) -#define BIT_1C(A) ((A) & 0x10000000) -#define BIT_1D(A) ((A) & 0x20000000) -#define BIT_1E(A) ((A) & 0x40000000) -#define BIT_1F(A) ((A) & 0x80000000) - -/* Get the most significant bit for specific sizes */ -#define GET_MSB_8(A) ((A) & 0x80) -#define GET_MSB_9(A) ((A) & 0x100) -#define GET_MSB_16(A) ((A) & 0x8000) -#define GET_MSB_17(A) ((A) & 0x10000) -#define GET_MSB_32(A) ((A) & 0x80000000) -#if M68K_USE_64_BIT -#define GET_MSB_33(A) ((A) & 0x100000000) -#endif /* M68K_USE_64_BIT */ - -/* Isolate nibbles */ -#define LOW_NIBBLE(A) ((A) & 0x0f) -#define HIGH_NIBBLE(A) ((A) & 0xf0) - -/* These are used to isolate 8, 16, and 32 bit sizes */ -#define MASK_OUT_ABOVE_2(A) ((A) & 3) -#define MASK_OUT_ABOVE_8(A) ((A) & 0xff) -#define MASK_OUT_ABOVE_16(A) ((A) & 0xffff) -#define MASK_OUT_BELOW_2(A) ((A) & ~3) -#define MASK_OUT_BELOW_8(A) ((A) & ~0xff) -#define MASK_OUT_BELOW_16(A) ((A) & ~0xffff) - -/* No need to mask if we are 32 bit */ -#if M68K_INT_GT_32BIT || M68K_USE_64_BIT - #define MASK_OUT_ABOVE_32(A) ((A) & 0xffffffff) - #define MASK_OUT_BELOW_32(A) ((A) & ~0xffffffff) -#else - #define MASK_OUT_ABOVE_32(A) (A) - #define MASK_OUT_BELOW_32(A) 0 -#endif /* M68K_INT_GT_32BIT || M68K_USE_64_BIT */ - -/* Simulate address lines of 68k family */ -#define ADDRESS_68K(A) ((A)&CPU_ADDRESS_MASK) - - -/* Shift & Rotate Macros. */ -#define LSL(A, C) ((A) << (C)) -#define LSR(A, C) ((A) >> (C)) - -/* Some > 32-bit optimizations */ -#if M68K_INT_GT_32BIT - /* Shift left and right */ - #define LSR_32(A, C) ((A) >> (C)) - #define LSL_32(A, C) ((A) << (C)) -#else - /* We have to do this because the morons at ANSI decided that shifts - * by >= data size are undefined. - */ - #define LSR_32(A, C) ((C) < 32 ? (A) >> (C) : 0) - #define LSL_32(A, C) ((C) < 32 ? (A) << (C) : 0) -#endif /* M68K_INT_GT_32BIT */ - -#if M68K_USE_64_BIT - #define LSL_32_64(A, C) ((A) << (C)) - #define LSR_32_64(A, C) ((A) >> (C)) - #define ROL_33_64(A, C) (LSL_32_64(A, C) | LSR_32_64(A, 33-(C))) - #define ROR_33_64(A, C) (LSR_32_64(A, C) | LSL_32_64(A, 33-(C))) -#endif /* M68K_USE_64_BIT */ - -#define ROL_8(A, C) MASK_OUT_ABOVE_8(LSL(A, C) | LSR(A, 8-(C))) -#define ROL_9(A, C) (LSL(A, C) | LSR(A, 9-(C))) -#define ROL_16(A, C) MASK_OUT_ABOVE_16(LSL(A, C) | LSR(A, 16-(C))) -#define ROL_17(A, C) (LSL(A, C) | LSR(A, 17-(C))) -#define ROL_32(A, C) MASK_OUT_ABOVE_32(LSL_32(A, C) | LSR_32(A, 32-(C))) -#define ROL_33(A, C) (LSL_32(A, C) | LSR_32(A, 33-(C))) - -#define ROR_8(A, C) MASK_OUT_ABOVE_8(LSR(A, C) | LSL(A, 8-(C))) -#define ROR_9(A, C) (LSR(A, C) | LSL(A, 9-(C))) -#define ROR_16(A, C) MASK_OUT_ABOVE_16(LSR(A, C) | LSL(A, 16-(C))) -#define ROR_17(A, C) (LSR(A, C) | LSL(A, 17-(C))) -#define ROR_32(A, C) MASK_OUT_ABOVE_32(LSR_32(A, C) | LSL_32(A, 32-(C))) -#define ROR_33(A, C) (LSR_32(A, C) | LSL_32(A, 33-(C))) - - - -/* ------------------------------ CPU Access ------------------------------ */ - -/* Access the CPU registers */ -#define CPU_TYPE m68ki_cpu.cpu_type - -#define REG_DA m68ki_cpu.dar /* easy access to data and address regs */ -#define REG_D m68ki_cpu.dar -#define REG_A (m68ki_cpu.dar+8) -#define REG_PPC m68ki_cpu.ppc -#define REG_PC m68ki_cpu.pc -#define REG_SP_BASE m68ki_cpu.sp -#define REG_USP m68ki_cpu.sp[0] -#define REG_ISP m68ki_cpu.sp[4] -#define REG_MSP m68ki_cpu.sp[6] -#define REG_SP m68ki_cpu.dar[15] -#define REG_VBR m68ki_cpu.vbr -#define REG_SFC m68ki_cpu.sfc -#define REG_DFC m68ki_cpu.dfc -#define REG_CACR m68ki_cpu.cacr -#define REG_CAAR m68ki_cpu.caar -#define REG_IR m68ki_cpu.ir - -#define FLAG_T1 m68ki_cpu.t1_flag -#define FLAG_T0 m68ki_cpu.t0_flag -#define FLAG_S m68ki_cpu.s_flag -#define FLAG_M m68ki_cpu.m_flag -#define FLAG_X m68ki_cpu.x_flag -#define FLAG_N m68ki_cpu.n_flag -#define FLAG_Z m68ki_cpu.not_z_flag -#define FLAG_V m68ki_cpu.v_flag -#define FLAG_C m68ki_cpu.c_flag -#define FLAG_INT_MASK m68ki_cpu.int_mask - -#define CPU_INT_LEVEL m68ki_cpu.int_level /* ASG: changed from CPU_INTS_PENDING */ -#define CPU_INT_CYCLES m68ki_cpu.int_cycles /* ASG */ -#define CPU_STOPPED m68ki_cpu.stopped -#define CPU_PREF_ADDR m68ki_cpu.pref_addr -#define CPU_PREF_DATA m68ki_cpu.pref_data -#define CPU_ADDRESS_MASK m68ki_cpu.address_mask -#define CPU_SR_MASK m68ki_cpu.sr_mask - -#define CYC_INSTRUCTION m68ki_cpu.cyc_instruction -#define CYC_EXCEPTION m68ki_cpu.cyc_exception -#define CYC_BCC_NOTAKE_B m68ki_cpu.cyc_bcc_notake_b -#define CYC_BCC_NOTAKE_W m68ki_cpu.cyc_bcc_notake_w -#define CYC_DBCC_F_NOEXP m68ki_cpu.cyc_dbcc_f_noexp -#define CYC_DBCC_F_EXP m68ki_cpu.cyc_dbcc_f_exp -#define CYC_SCC_R_FALSE m68ki_cpu.cyc_scc_r_false -#define CYC_MOVEM_W m68ki_cpu.cyc_movem_w -#define CYC_MOVEM_L m68ki_cpu.cyc_movem_l -#define CYC_SHIFT m68ki_cpu.cyc_shift -#define CYC_RESET m68ki_cpu.cyc_reset - - -#define CALLBACK_INT_ACK m68ki_cpu.int_ack_callback -#define CALLBACK_BKPT_ACK m68ki_cpu.bkpt_ack_callback -#define CALLBACK_RESET_INSTR m68ki_cpu.reset_instr_callback -#define CALLBACK_PC_CHANGED m68ki_cpu.pc_changed_callback -#define CALLBACK_SET_FC m68ki_cpu.set_fc_callback -#define CALLBACK_INSTR_HOOK m68ki_cpu.instr_hook_callback - - - -/* ----------------------------- Configuration ---------------------------- */ - -/* These defines are dependant on the configuration defines in m68kconf.h */ - -/* Disable certain comparisons if we're not using all CPU types */ -#if M68K_EMULATE_020 - #define CPU_TYPE_IS_020_PLUS(A) ((A) & CPU_TYPE_020) - #define CPU_TYPE_IS_020_LESS(A) 1 -#else - #define CPU_TYPE_IS_020_PLUS(A) 0 - #define CPU_TYPE_IS_020_LESS(A) 1 -#endif - -#if M68K_EMULATE_EC020 - #define CPU_TYPE_IS_EC020_PLUS(A) ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020)) - #define CPU_TYPE_IS_EC020_LESS(A) ((A) & (CPU_TYPE_000 | CPU_TYPE_010 | CPU_TYPE_EC020)) -#else - #define CPU_TYPE_IS_EC020_PLUS(A) CPU_TYPE_IS_020_PLUS(A) - #define CPU_TYPE_IS_EC020_LESS(A) CPU_TYPE_IS_020_LESS(A) -#endif - -#if M68K_EMULATE_010 - #define CPU_TYPE_IS_010(A) ((A) == CPU_TYPE_010) - #define CPU_TYPE_IS_010_PLUS(A) ((A) & (CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020)) - #define CPU_TYPE_IS_010_LESS(A) ((A) & (CPU_TYPE_000 | CPU_TYPE_010)) -#else - #define CPU_TYPE_IS_010(A) 0 - #define CPU_TYPE_IS_010_PLUS(A) CPU_TYPE_IS_EC020_PLUS(A) - #define CPU_TYPE_IS_010_LESS(A) CPU_TYPE_IS_EC020_LESS(A) -#endif - -#if M68K_EMULATE_020 || M68K_EMULATE_EC020 - #define CPU_TYPE_IS_020_VARIANT(A) ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020)) -#else - #define CPU_TYPE_IS_020_VARIANT(A) 0 -#endif - -#if M68K_EMULATE_020 || M68K_EMULATE_EC020 || M68K_EMULATE_010 - #define CPU_TYPE_IS_000(A) ((A) == CPU_TYPE_000) -#else - #define CPU_TYPE_IS_000(A) 1 -#endif - - -#if !M68K_SEPARATE_READS -#define m68k_read_immediate_16(A) m68ki_read_program_16(A) -#define m68k_read_immediate_32(A) m68ki_read_program_32(A) - -#define m68k_read_pcrelative_8(A) m68ki_read_program_8(A) -#define m68k_read_pcrelative_16(A) m68ki_read_program_16(A) -#define m68k_read_pcrelative_32(A) m68ki_read_program_32(A) -#endif /* M68K_SEPARATE_READS */ - - -/* Enable or disable callback functions */ -#if M68K_EMULATE_INT_ACK - #if M68K_EMULATE_INT_ACK == OPT_SPECIFY_HANDLER - #define m68ki_int_ack(A) M68K_INT_ACK_CALLBACK(A) - #else - #define m68ki_int_ack(A) CALLBACK_INT_ACK(A) - #endif -#else - /* Default action is to used autovector mode, which is most common */ - #define m68ki_int_ack(A) M68K_INT_ACK_AUTOVECTOR -#endif /* M68K_EMULATE_INT_ACK */ - -#if M68K_EMULATE_BKPT_ACK - #if M68K_EMULATE_BKPT_ACK == OPT_SPECIFY_HANDLER - #define m68ki_bkpt_ack(A) M68K_BKPT_ACK_CALLBACK(A) - #else - #define m68ki_bkpt_ack(A) CALLBACK_BKPT_ACK(A) - #endif -#else - #define m68ki_bkpt_ack(A) -#endif /* M68K_EMULATE_BKPT_ACK */ - -#if M68K_EMULATE_RESET - #if M68K_EMULATE_RESET == OPT_SPECIFY_HANDLER - #define m68ki_output_reset() M68K_RESET_CALLBACK() - #else - #define m68ki_output_reset() CALLBACK_RESET_INSTR() - #endif -#else - #define m68ki_output_reset() -#endif /* M68K_EMULATE_RESET */ - -#if M68K_INSTRUCTION_HOOK - #if M68K_INSTRUCTION_HOOK == OPT_SPECIFY_HANDLER - #define m68ki_instr_hook() M68K_INSTRUCTION_CALLBACK() - #else - #define m68ki_instr_hook() CALLBACK_INSTR_HOOK() - #endif -#else - #define m68ki_instr_hook() -#endif /* M68K_INSTRUCTION_HOOK */ - -#if M68K_MONITOR_PC - #if M68K_MONITOR_PC == OPT_SPECIFY_HANDLER - #define m68ki_pc_changed(A) M68K_SET_PC_CALLBACK(ADDRESS_68K(A)) - #else - #define m68ki_pc_changed(A) CALLBACK_PC_CHANGED(ADDRESS_68K(A)) - #endif -#else - #define m68ki_pc_changed(A) -#endif /* M68K_MONITOR_PC */ - - -/* Enable or disable function code emulation */ -#if M68K_EMULATE_FC - #if M68K_EMULATE_FC == OPT_SPECIFY_HANDLER - #define m68ki_set_fc(A) M68K_SET_FC_CALLBACK(A) - #else - #define m68ki_set_fc(A) CALLBACK_SET_FC(A) - #endif - #define m68ki_use_data_space() m68ki_address_space = FUNCTION_CODE_USER_DATA - #define m68ki_use_program_space() m68ki_address_space = FUNCTION_CODE_USER_PROGRAM - #define m68ki_get_address_space() m68ki_address_space -#else - #define m68ki_set_fc(A) - #define m68ki_use_data_space() - #define m68ki_use_program_space() - #define m68ki_get_address_space() FUNCTION_CODE_USER_DATA -#endif /* M68K_EMULATE_FC */ - - -/* Enable or disable trace emulation */ -#if M68K_EMULATE_TRACE - /* Initiates trace checking before each instruction (t1) */ - #define m68ki_trace_t1() m68ki_tracing = FLAG_T1 - /* adds t0 to trace checking if we encounter change of flow */ - #define m68ki_trace_t0() m68ki_tracing |= FLAG_T0 - /* Clear all tracing */ - #define m68ki_clear_trace() m68ki_tracing = 0 - /* Cause a trace exception if we are tracing */ - #define m68ki_exception_if_trace() if(m68ki_tracing) m68ki_exception_trace() -#else - #define m68ki_trace_t1() - #define m68ki_trace_t0() - #define m68ki_clear_trace() - #define m68ki_exception_if_trace() -#endif /* M68K_EMULATE_TRACE */ - - - -/* Address error */ -#if M68K_EMULATE_ADDRESS_ERROR - extern jmp_buf m68ki_address_error_trap; - #define m68ki_set_address_error_trap() if(setjmp(m68ki_address_error_trap)) m68ki_exception_address_error(); - #define m68ki_check_address_error(A) if((A)&1) longjmp(m68ki_address_error_jump, 1); -#else - #define m68ki_set_address_error_trap() - #define m68ki_check_address_error(A) -#endif /* M68K_ADDRESS_ERROR */ - -/* Logging */ -#if M68K_LOG_ENABLE - #include - extern FILE* M68K_LOG_FILEHANDLE - extern char* m68ki_cpu_names[]; - - #define M68K_DO_LOG(A) if(M68K_LOG_FILEHANDLE) fprintf A - #if M68K_LOG_1010_1111 - #define M68K_DO_LOG_EMU(A) if(M68K_LOG_FILEHANDLE) fprintf A - #else - #define M68K_DO_LOG_EMU(A) - #endif -#else - #define M68K_DO_LOG(A) - #define M68K_DO_LOG_EMU(A) -#endif - - - -/* -------------------------- EA / Operand Access ------------------------- */ - -/* - * The general instruction format follows this pattern: - * .... XXX. .... .YYY - * where XXX is register X and YYY is register Y - */ -/* Data Register Isolation */ -#define DX (REG_D[(REG_IR >> 9) & 7]) -#define DY (REG_D[REG_IR & 7]) -/* Address Register Isolation */ -#define AX (REG_A[(REG_IR >> 9) & 7]) -#define AY (REG_A[REG_IR & 7]) - - -/* Effective Address Calculations */ -#define EA_AY_AI_8() AY /* address register indirect */ -#define EA_AY_AI_16() EA_AY_AI_8() -#define EA_AY_AI_32() EA_AY_AI_8() -#define EA_AY_PI_8() (AY++) /* postincrement (size = byte) */ -#define EA_AY_PI_16() ((AY+=2)-2) /* postincrement (size = word) */ -#define EA_AY_PI_32() ((AY+=4)-4) /* postincrement (size = long) */ -#define EA_AY_PD_8() (--AY) /* predecrement (size = byte) */ -#define EA_AY_PD_16() (AY-=2) /* predecrement (size = word) */ -#define EA_AY_PD_32() (AY-=4) /* predecrement (size = long) */ -#define EA_AY_DI_8() (AY+MAKE_INT_16(m68ki_read_imm_16())) /* displacement */ -#define EA_AY_DI_16() EA_AY_DI_8() -#define EA_AY_DI_32() EA_AY_DI_8() -#define EA_AY_IX_8() m68ki_get_ea_ix(AY) /* indirect + index */ -#define EA_AY_IX_16() EA_AY_IX_8() -#define EA_AY_IX_32() EA_AY_IX_8() - -#define EA_AX_AI_8() AX -#define EA_AX_AI_16() EA_AX_AI_8() -#define EA_AX_AI_32() EA_AX_AI_8() -#define EA_AX_PI_8() (AX++) -#define EA_AX_PI_16() ((AX+=2)-2) -#define EA_AX_PI_32() ((AX+=4)-4) -#define EA_AX_PD_8() (--AX) -#define EA_AX_PD_16() (AX-=2) -#define EA_AX_PD_32() (AX-=4) -#define EA_AX_DI_8() (AX+MAKE_INT_16(m68ki_read_imm_16())) -#define EA_AX_DI_16() EA_AX_DI_8() -#define EA_AX_DI_32() EA_AX_DI_8() -#define EA_AX_IX_8() m68ki_get_ea_ix(AX) -#define EA_AX_IX_16() EA_AX_IX_8() -#define EA_AX_IX_32() EA_AX_IX_8() - -#define EA_A7_PI_8() ((REG_A[7]+=2)-2) -#define EA_A7_PD_8() (REG_A[7]-=2) - -#define EA_AW_8() MAKE_INT_16(m68ki_read_imm_16()) /* absolute word */ -#define EA_AW_16() EA_AW_8() -#define EA_AW_32() EA_AW_8() -#define EA_AL_8() m68ki_read_imm_32() /* absolute long */ -#define EA_AL_16() EA_AL_8() -#define EA_AL_32() EA_AL_8() -#define EA_PCDI_8() m68ki_get_ea_pcdi() /* pc indirect + displacement */ -#define EA_PCDI_16() EA_PCDI_8() -#define EA_PCDI_32() EA_PCDI_8() -#define EA_PCIX_8() m68ki_get_ea_pcix() /* pc indirect + index */ -#define EA_PCIX_16() EA_PCIX_8() -#define EA_PCIX_32() EA_PCIX_8() - - -#define OPER_I_8() m68ki_read_imm_8() -#define OPER_I_16() m68ki_read_imm_16() -#define OPER_I_32() m68ki_read_imm_32() - - - -/* --------------------------- Status Register ---------------------------- */ - -/* Flag Calculation Macros */ -#define CFLAG_8(A) (A) -#define CFLAG_16(A) ((A)>>8) - -#if M68K_INT_GT_32_BIT - #define CFLAG_ADD_32(S, D, R) ((R)>>24) - #define CFLAG_SUB_32(S, D, R) ((R)>>24) -#else - #define CFLAG_ADD_32(S, D, R) (((S & D) | (~R & (S | D)))>>23) - #define CFLAG_SUB_32(S, D, R) (((S & R) | (~D & (S | R)))>>23) -#endif /* M68K_INT_GT_32_BIT */ - -#define VFLAG_ADD_8(S, D, R) ((S^R) & (D^R)) -#define VFLAG_ADD_16(S, D, R) (((S^R) & (D^R))>>8) -#define VFLAG_ADD_32(S, D, R) (((S^R) & (D^R))>>24) - -#define VFLAG_SUB_8(S, D, R) ((S^D) & (R^D)) -#define VFLAG_SUB_16(S, D, R) (((S^D) & (R^D))>>8) -#define VFLAG_SUB_32(S, D, R) (((S^D) & (R^D))>>24) - -#define NFLAG_8(A) (A) -#define NFLAG_16(A) ((A)>>8) -#define NFLAG_32(A) ((A)>>24) -#define NFLAG_64(A) ((A)>>56) - -#define ZFLAG_8(A) MASK_OUT_ABOVE_8(A) -#define ZFLAG_16(A) MASK_OUT_ABOVE_16(A) -#define ZFLAG_32(A) MASK_OUT_ABOVE_32(A) - - -/* Flag values */ -#define NFLAG_SET 0x80 -#define NFLAG_CLEAR 0 -#define CFLAG_SET 0x100 -#define CFLAG_CLEAR 0 -#define XFLAG_SET 0x100 -#define XFLAG_CLEAR 0 -#define VFLAG_SET 0x80 -#define VFLAG_CLEAR 0 -#define ZFLAG_SET 0 -#define ZFLAG_CLEAR 0xffffffff - -#define SFLAG_SET 4 -#define SFLAG_CLEAR 0 -#define MFLAG_SET 2 -#define MFLAG_CLEAR 0 - -/* Turn flag values into 1 or 0 */ -#define XFLAG_AS_1() ((FLAG_X>>8)&1) -#define NFLAG_AS_1() ((FLAG_N>>7)&1) -#define VFLAG_AS_1() ((FLAG_V>>7)&1) -#define ZFLAG_AS_1() (!FLAG_Z) -#define CFLAG_AS_1() ((FLAG_C>>8)&1) - - -/* Conditions */ -#define COND_CS() (FLAG_C&0x100) -#define COND_CC() (!COND_CS()) -#define COND_VS() (FLAG_V&0x80) -#define COND_VC() (!COND_VS()) -#define COND_NE() FLAG_Z -#define COND_EQ() (!COND_NE()) -#define COND_MI() (FLAG_N&0x80) -#define COND_PL() (!COND_MI()) -#define COND_LT() ((FLAG_N^FLAG_V)&0x80) -#define COND_GE() (!COND_LT()) -#define COND_HI() (COND_CC() && COND_NE()) -#define COND_LS() (COND_CS() || COND_EQ()) -#define COND_GT() (COND_GE() && COND_NE()) -#define COND_LE() (COND_LT() || COND_EQ()) - -/* Reversed conditions */ -#define COND_NOT_CS() COND_CC() -#define COND_NOT_CC() COND_CS() -#define COND_NOT_VS() COND_VC() -#define COND_NOT_VC() COND_VS() -#define COND_NOT_NE() COND_EQ() -#define COND_NOT_EQ() COND_NE() -#define COND_NOT_MI() COND_PL() -#define COND_NOT_PL() COND_MI() -#define COND_NOT_LT() COND_GE() -#define COND_NOT_GE() COND_LT() -#define COND_NOT_HI() COND_LS() -#define COND_NOT_LS() COND_HI() -#define COND_NOT_GT() COND_LE() -#define COND_NOT_LE() COND_GT() - -/* Not real conditions, but here for convenience */ -#define COND_XS() (FLAG_X&0x100) -#define COND_XC() (!COND_XS) - - -/* Get the condition code register */ -#define m68ki_get_ccr() ((COND_XS() >> 4) | \ - (COND_MI() >> 4) | \ - (COND_EQ() << 2) | \ - (COND_VS() >> 6) | \ - (COND_CS() >> 8)) - -/* Get the status register */ -#define m68ki_get_sr() ( FLAG_T1 | \ - FLAG_T0 | \ - (FLAG_S << 11) | \ - (FLAG_M << 11) | \ - FLAG_INT_MASK | \ - m68ki_get_ccr()) - - - -/* ---------------------------- Cycle Counting ---------------------------- */ - -#define ADD_CYCLES(A) m68ki_remaining_cycles += (A) -#define USE_CYCLES(A) m68ki_remaining_cycles -= (A) -#define SET_CYCLES(A) m68ki_remaining_cycles = A -#define GET_CYCLES() m68ki_remaining_cycles -#define USE_ALL_CYCLES() m68ki_remaining_cycles = 0 - - - -/* ----------------------------- Read / Write ----------------------------- */ - -/* Read from the current address space */ -#define m68ki_read_8(A) m68ki_read_8_fc (A, FLAG_S | m68ki_get_address_space()) -#define m68ki_read_16(A) m68ki_read_16_fc(A, FLAG_S | m68ki_get_address_space()) -#define m68ki_read_32(A) m68ki_read_32_fc(A, FLAG_S | m68ki_get_address_space()) - -/* Write to the current data space */ -#define m68ki_write_8(A, V) m68ki_write_8_fc (A, FLAG_S | FUNCTION_CODE_USER_DATA, V) -#define m68ki_write_16(A, V) m68ki_write_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V) -#define m68ki_write_32(A, V) m68ki_write_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V) - -/* map read immediate 8 to read immediate 16 */ -#define m68ki_read_imm_8() MASK_OUT_ABOVE_8(m68ki_read_imm_16()) - -/* Map PC-relative reads */ -#define m68ki_read_pcrel_8(A) m68k_read_pcrelative_8(A) -#define m68ki_read_pcrel_16(A) m68k_read_pcrelative_16(A) -#define m68ki_read_pcrel_32(A) m68k_read_pcrelative_32(A) - -/* Read from the program space */ -#define m68ki_read_program_8(A) m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM) -#define m68ki_read_program_16(A) m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM) -#define m68ki_read_program_32(A) m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM) - -/* Read from the data space */ -#define m68ki_read_data_8(A) m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA) -#define m68ki_read_data_16(A) m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA) -#define m68ki_read_data_32(A) m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA) - - - -/* ======================================================================== */ -/* =============================== PROTOTYPES ============================= */ -/* ======================================================================== */ - -typedef struct -{ - uint cpu_type; /* CPU Type: 68000, 68010, 68EC020, or 68020 */ - uint dar[16]; /* Data and Address Registers */ - uint ppc; /* Previous program counter */ - uint pc; /* Program Counter */ - uint sp[7]; /* User, Interrupt, and Master Stack Pointers */ - uint vbr; /* Vector Base Register (m68010+) */ - uint sfc; /* Source Function Code Register (m68010+) */ - uint dfc; /* Destination Function Code Register (m68010+) */ - uint cacr; /* Cache Control Register (m68020, unemulated) */ - uint caar; /* Cache Address Register (m68020, unemulated) */ - uint ir; /* Instruction Register */ - uint t1_flag; /* Trace 1 */ - uint t0_flag; /* Trace 0 */ - uint s_flag; /* Supervisor */ - uint m_flag; /* Master/Interrupt state */ - uint x_flag; /* Extend */ - uint n_flag; /* Negative */ - uint not_z_flag; /* Zero, inverted for speedups */ - uint v_flag; /* Overflow */ - uint c_flag; /* Carry */ - uint int_mask; /* I0-I2 */ - uint int_level; /* State of interrupt pins IPL0-IPL2 -- ASG: changed from ints_pending */ - uint int_cycles; /* ASG: extra cycles from generated interrupts */ - uint stopped; /* Stopped state */ - uint pref_addr; /* Last prefetch address */ - uint pref_data; /* Data in the prefetch queue */ - uint address_mask; /* Available address pins */ - uint sr_mask; /* Implemented status register bits */ - - /* Clocks required for instructions / exceptions */ - uint cyc_bcc_notake_b; - uint cyc_bcc_notake_w; - uint cyc_dbcc_f_noexp; - uint cyc_dbcc_f_exp; - uint cyc_scc_r_false; - uint cyc_movem_w; - uint cyc_movem_l; - uint cyc_shift; - uint cyc_reset; - uint8* cyc_instruction; - uint8* cyc_exception; - - /* Callbacks to host */ - int (*int_ack_callback)(int int_line); /* Interrupt Acknowledge */ - void (*bkpt_ack_callback)(unsigned int data); /* Breakpoint Acknowledge */ - void (*reset_instr_callback)(void); /* Called when a RESET instruction is encountered */ - void (*pc_changed_callback)(unsigned int new_pc); /* Called when the PC changes by a large amount */ - void (*set_fc_callback)(unsigned int new_fc); /* Called when the CPU function code changes */ - void (*instr_hook_callback)(void); /* Called every instruction cycle prior to execution */ - -} m68ki_cpu_core; - - -extern m68ki_cpu_core m68ki_cpu; -extern sint m68ki_remaining_cycles; -extern uint m68ki_tracing; -extern uint8 m68ki_shift_8_table[]; -extern uint16 m68ki_shift_16_table[]; -extern uint m68ki_shift_32_table[]; -extern uint8 m68ki_exception_cycle_table[][256]; -extern uint m68ki_address_space; -extern uint8 m68ki_ea_idx_cycle_table[]; - - -/* Read data immediately after the program counter */ -INLINE uint m68ki_read_imm_16(void); -INLINE uint m68ki_read_imm_32(void); - -/* Read data with specific function code */ -INLINE uint m68ki_read_8_fc (uint address, uint fc); -INLINE uint m68ki_read_16_fc (uint address, uint fc); -INLINE uint m68ki_read_32_fc (uint address, uint fc); - -/* Write data with specific function code */ -INLINE void m68ki_write_8_fc (uint address, uint fc, uint value); -INLINE void m68ki_write_16_fc(uint address, uint fc, uint value); -INLINE void m68ki_write_32_fc(uint address, uint fc, uint value); - -/* Indexed and PC-relative ea fetching */ -INLINE uint m68ki_get_ea_pcdi(void); -INLINE uint m68ki_get_ea_pcix(void); -INLINE uint m68ki_get_ea_ix(uint An); - -/* Operand fetching */ -INLINE uint OPER_AY_AI_8(void); -INLINE uint OPER_AY_AI_16(void); -INLINE uint OPER_AY_AI_32(void); -INLINE uint OPER_AY_PI_8(void); -INLINE uint OPER_AY_PI_16(void); -INLINE uint OPER_AY_PI_32(void); -INLINE uint OPER_AY_PD_8(void); -INLINE uint OPER_AY_PD_16(void); -INLINE uint OPER_AY_PD_32(void); -INLINE uint OPER_AY_DI_8(void); -INLINE uint OPER_AY_DI_16(void); -INLINE uint OPER_AY_DI_32(void); -INLINE uint OPER_AY_IX_8(void); -INLINE uint OPER_AY_IX_16(void); -INLINE uint OPER_AY_IX_32(void); - -INLINE uint OPER_AX_AI_8(void); -INLINE uint OPER_AX_AI_16(void); -INLINE uint OPER_AX_AI_32(void); -INLINE uint OPER_AX_PI_8(void); -INLINE uint OPER_AX_PI_16(void); -INLINE uint OPER_AX_PI_32(void); -INLINE uint OPER_AX_PD_8(void); -INLINE uint OPER_AX_PD_16(void); -INLINE uint OPER_AX_PD_32(void); -INLINE uint OPER_AX_DI_8(void); -INLINE uint OPER_AX_DI_16(void); -INLINE uint OPER_AX_DI_32(void); -INLINE uint OPER_AX_IX_8(void); -INLINE uint OPER_AX_IX_16(void); -INLINE uint OPER_AX_IX_32(void); - -INLINE uint OPER_A7_PI_8(void); -INLINE uint OPER_A7_PD_8(void); - -INLINE uint OPER_AW_8(void); -INLINE uint OPER_AW_16(void); -INLINE uint OPER_AW_32(void); -INLINE uint OPER_AL_8(void); -INLINE uint OPER_AL_16(void); -INLINE uint OPER_AL_32(void); -INLINE uint OPER_PCDI_8(void); -INLINE uint OPER_PCDI_16(void); -INLINE uint OPER_PCDI_32(void); -INLINE uint OPER_PCIX_8(void); -INLINE uint OPER_PCIX_16(void); -INLINE uint OPER_PCIX_32(void); - -/* Stack operations */ -INLINE void m68ki_push_16(uint value); -INLINE void m68ki_push_32(uint value); -INLINE uint m68ki_pull_16(void); -INLINE uint m68ki_pull_32(void); - -/* Program flow operations */ -INLINE void m68ki_jump(uint new_pc); -INLINE void m68ki_jump_vector(uint vector); -INLINE void m68ki_branch_8(uint offset); -INLINE void m68ki_branch_16(uint offset); -INLINE void m68ki_branch_32(uint offset); - -/* Status register operations. */ -INLINE void m68ki_set_s_flag(uint value); /* Only bit 2 of value should be set (i.e. 4 or 0) */ -INLINE void m68ki_set_sm_flag(uint value); /* only bits 1 and 2 of value should be set */ -INLINE void m68ki_set_ccr(uint value); /* set the condition code register */ -INLINE void m68ki_set_sr(uint value); /* set the status register */ -INLINE void m68ki_set_sr_noint(uint value); /* set the status register */ - -/* Exception processing */ -INLINE uint m68ki_init_exception(void); /* Initial exception processing */ - -INLINE void m68ki_stack_frame_3word(uint pc, uint sr); /* Stack various frame types */ -INLINE void m68ki_stack_frame_buserr(uint pc, uint sr, uint address, uint write, uint instruction, uint fc); - -INLINE void m68ki_stack_frame_0000(uint pc, uint sr, uint vector); -INLINE void m68ki_stack_frame_0001(uint pc, uint sr, uint vector); -INLINE void m68ki_stack_frame_0010(uint sr, uint vector); -INLINE void m68ki_stack_frame_1000(uint pc, uint sr, uint vector); -INLINE void m68ki_stack_frame_1010(uint sr, uint vector, uint pc); -INLINE void m68ki_stack_frame_1011(uint sr, uint vector, uint pc); - -INLINE void m68ki_exception_trap(uint vector); -INLINE void m68ki_exception_trapN(uint vector); -INLINE void m68ki_exception_trace(void); -INLINE void m68ki_exception_privilege_violation(void); -INLINE void m68ki_exception_1010(void); -INLINE void m68ki_exception_1111(void); -INLINE void m68ki_exception_illegal(void); -INLINE void m68ki_exception_format_error(void); -INLINE void m68ki_exception_address_error(void); -INLINE void m68ki_exception_interrupt(uint int_level); -INLINE void m68ki_check_interrupts(void); /* ASG: check for interrupts */ - -/* quick disassembly (used for logging) */ -char* m68ki_disassemble_quick(unsigned int pc, unsigned int cpu_type); - - -/* ======================================================================== */ -/* =========================== UTILITY FUNCTIONS ========================== */ -/* ======================================================================== */ - - -/* ---------------------------- Read Immediate ---------------------------- */ - -/* Handles all immediate reads, does address error check, function code setting, - * and prefetching if they are enabled in m68kconf.h - */ -INLINE uint m68ki_read_imm_16(void) -{ - m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */ - m68ki_check_address_error(REG_PC); /* auto-disable (see m68kcpu.h) */ -#if M68K_EMULATE_PREFETCH - if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR) - { - CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC); - CPU_PREF_DATA = m68k_read_immediate_32(ADDRESS_68K(CPU_PREF_ADDR)); - } - REG_PC += 2; - return MASK_OUT_ABOVE_16(CPU_PREF_DATA >> ((2-((REG_PC-2)&2))<<3)); -#else - REG_PC += 2; - return m68k_read_immediate_16(ADDRESS_68K(REG_PC-2)); -#endif /* M68K_EMULATE_PREFETCH */ -} -INLINE uint m68ki_read_imm_32(void) -{ -#if M68K_EMULATE_PREFETCH - uint temp_val; - - m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */ - m68ki_check_address_error(REG_PC); /* auto-disable (see m68kcpu.h) */ - if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR) - { - CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC); - CPU_PREF_DATA = m68k_read_immediate_32(ADDRESS_68K(CPU_PREF_ADDR)); - } - temp_val = CPU_PREF_DATA; - REG_PC += 2; - if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR) - { - CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC); - CPU_PREF_DATA = m68k_read_immediate_32(ADDRESS_68K(CPU_PREF_ADDR)); - temp_val = MASK_OUT_ABOVE_32((temp_val << 16) | (CPU_PREF_DATA >> 16)); - } - REG_PC += 2; - - return temp_val; -#else - m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */ - m68ki_check_address_error(REG_PC); /* auto-disable (see m68kcpu.h) */ - REG_PC += 4; - return m68k_read_immediate_32(ADDRESS_68K(REG_PC-4)); -#endif /* M68K_EMULATE_PREFETCH */ -} - - - -/* ------------------------- Top level read/write ------------------------- */ - -/* Handles all memory accesses (except for immediate reads if they are - * configured to use separate functions in m68kconf.h). - * All memory accesses must go through these top level functions. - * These functions will also check for address error and set the function - * code if they are enabled in m68kconf.h. - */ -INLINE uint m68ki_read_8_fc(uint address, uint fc) -{ - m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */ - return m68k_read_memory_8(ADDRESS_68K(address)); -} -INLINE uint m68ki_read_16_fc(uint address, uint fc) -{ - m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */ - m68ki_check_address_error(address); /* auto-disable (see m68kcpu.h) */ - return m68k_read_memory_16(ADDRESS_68K(address)); -} -INLINE uint m68ki_read_32_fc(uint address, uint fc) -{ - m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */ - m68ki_check_address_error(address); /* auto-disable (see m68kcpu.h) */ - return m68k_read_memory_32(ADDRESS_68K(address)); -} - -INLINE void m68ki_write_8_fc(uint address, uint fc, uint value) -{ - m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */ - m68k_write_memory_8(ADDRESS_68K(address), value); -} -INLINE void m68ki_write_16_fc(uint address, uint fc, uint value) -{ - m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */ - m68ki_check_address_error(address); /* auto-disable (see m68kcpu.h) */ - m68k_write_memory_16(ADDRESS_68K(address), value); -} -INLINE void m68ki_write_32_fc(uint address, uint fc, uint value) -{ - m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */ - m68ki_check_address_error(address); /* auto-disable (see m68kcpu.h) */ - m68k_write_memory_32(ADDRESS_68K(address), value); -} - - - -/* --------------------- Effective Address Calculation -------------------- */ - -/* The program counter relative addressing modes cause operands to be - * retrieved from program space, not data space. - */ -INLINE uint m68ki_get_ea_pcdi(void) -{ - uint old_pc = REG_PC; - m68ki_use_program_space(); /* auto-disable */ - return old_pc + MAKE_INT_16(m68ki_read_imm_16()); -} - - -INLINE uint m68ki_get_ea_pcix(void) -{ - m68ki_use_program_space(); /* auto-disable */ - return m68ki_get_ea_ix(REG_PC); -} - -/* Indexed addressing modes are encoded as follows: - * - * Base instruction format: - * F E D C B A 9 8 7 6 | 5 4 3 | 2 1 0 - * x x x x x x x x x x | 1 1 0 | BASE REGISTER (An) - * - * Base instruction format for destination EA in move instructions: - * F E D C | B A 9 | 8 7 6 | 5 4 3 2 1 0 - * x x x x | BASE REG | 1 1 0 | X X X X X X (An) - * - * Brief extension format: - * F | E D C | B | A 9 | 8 | 7 6 5 4 3 2 1 0 - * D/A | REGISTER | W/L | SCALE | 0 | DISPLACEMENT - * - * Full extension format: - * F E D C B A 9 8 7 6 5 4 3 2 1 0 - * D/A | REGISTER | W/L | SCALE | 1 | BS | IS | BD SIZE | 0 | I/IS - * BASE DISPLACEMENT (0, 16, 32 bit) (bd) - * OUTER DISPLACEMENT (0, 16, 32 bit) (od) - * - * D/A: 0 = Dn, 1 = An (Xn) - * W/L: 0 = W (sign extend), 1 = L (.SIZE) - * SCALE: 00=1, 01=2, 10=4, 11=8 (*SCALE) - * BS: 0=add base reg, 1=suppress base reg (An suppressed) - * IS: 0=add index, 1=suppress index (Xn suppressed) - * BD SIZE: 00=reserved, 01=NULL, 10=Word, 11=Long (size of bd) - * - * IS I/IS Operation - * 0 000 No Memory Indirect - * 0 001 indir prex with null outer - * 0 010 indir prex with word outer - * 0 011 indir prex with long outer - * 0 100 reserved - * 0 101 indir postx with null outer - * 0 110 indir postx with word outer - * 0 111 indir postx with long outer - * 1 000 no memory indirect - * 1 001 mem indir with null outer - * 1 010 mem indir with word outer - * 1 011 mem indir with long outer - * 1 100-111 reserved - */ -INLINE uint m68ki_get_ea_ix(uint An) -{ - /* An = base register */ - uint extension = m68ki_read_imm_16(); - uint Xn = 0; /* Index register */ - uint bd = 0; /* Base Displacement */ - uint od = 0; /* Outer Displacement */ - - if(CPU_TYPE_IS_010_LESS(CPU_TYPE)) - { - /* Calculate index */ - Xn = REG_DA[extension>>12]; /* Xn */ - if(!BIT_B(extension)) /* W/L */ - Xn = MAKE_INT_16(Xn); - - /* Add base register and displacement and return */ - return An + Xn + MAKE_INT_8(extension); - } - - /* Brief extension format */ - if(!BIT_8(extension)) - { - /* Calculate index */ - Xn = REG_DA[extension>>12]; /* Xn */ - if(!BIT_B(extension)) /* W/L */ - Xn = MAKE_INT_16(Xn); - /* Add scale if proper CPU type */ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - Xn <<= (extension>>9) & 3; /* SCALE */ - - /* Add base register and displacement and return */ - return An + Xn + MAKE_INT_8(extension); - } - - /* Full extension format */ - - USE_CYCLES(m68ki_ea_idx_cycle_table[extension&0x3f]); - - /* Check if base register is present */ - if(BIT_7(extension)) /* BS */ - An = 0; /* An */ - - /* Check if index is present */ - if(!BIT_6(extension)) /* IS */ - { - Xn = REG_DA[extension>>12]; /* Xn */ - if(!BIT_B(extension)) /* W/L */ - Xn = MAKE_INT_16(Xn); - Xn <<= (extension>>9) & 3; /* SCALE */ - } - - /* Check if base displacement is present */ - if(BIT_5(extension)) /* BD SIZE */ - bd = BIT_4(extension) ? m68ki_read_imm_32() : MAKE_INT_16(m68ki_read_imm_16()); - - /* If no indirect action, we are done */ - if(!(extension&7)) /* No Memory Indirect */ - return An + bd + Xn; - - /* Check if outer displacement is present */ - if(BIT_1(extension)) /* I/IS: od */ - od = BIT_0(extension) ? m68ki_read_imm_32() : MAKE_INT_16(m68ki_read_imm_16()); - - /* Postindex */ - if(BIT_2(extension)) /* I/IS: 0 = preindex, 1 = postindex */ - return m68ki_read_32(An + bd) + Xn + od; - - /* Preindex */ - return m68ki_read_32(An + bd + Xn) + od; -} - - -/* Fetch operands */ -INLINE uint OPER_AY_AI_8(void) {uint ea = EA_AY_AI_8(); return m68ki_read_8(ea); } -INLINE uint OPER_AY_AI_16(void) {uint ea = EA_AY_AI_16(); return m68ki_read_16(ea);} -INLINE uint OPER_AY_AI_32(void) {uint ea = EA_AY_AI_32(); return m68ki_read_32(ea);} -INLINE uint OPER_AY_PI_8(void) {uint ea = EA_AY_PI_8(); return m68ki_read_8(ea); } -INLINE uint OPER_AY_PI_16(void) {uint ea = EA_AY_PI_16(); return m68ki_read_16(ea);} -INLINE uint OPER_AY_PI_32(void) {uint ea = EA_AY_PI_32(); return m68ki_read_32(ea);} -INLINE uint OPER_AY_PD_8(void) {uint ea = EA_AY_PD_8(); return m68ki_read_8(ea); } -INLINE uint OPER_AY_PD_16(void) {uint ea = EA_AY_PD_16(); return m68ki_read_16(ea);} -INLINE uint OPER_AY_PD_32(void) {uint ea = EA_AY_PD_32(); return m68ki_read_32(ea);} -INLINE uint OPER_AY_DI_8(void) {uint ea = EA_AY_DI_8(); return m68ki_read_8(ea); } -INLINE uint OPER_AY_DI_16(void) {uint ea = EA_AY_DI_16(); return m68ki_read_16(ea);} -INLINE uint OPER_AY_DI_32(void) {uint ea = EA_AY_DI_32(); return m68ki_read_32(ea);} -INLINE uint OPER_AY_IX_8(void) {uint ea = EA_AY_IX_8(); return m68ki_read_8(ea); } -INLINE uint OPER_AY_IX_16(void) {uint ea = EA_AY_IX_16(); return m68ki_read_16(ea);} -INLINE uint OPER_AY_IX_32(void) {uint ea = EA_AY_IX_32(); return m68ki_read_32(ea);} - -INLINE uint OPER_AX_AI_8(void) {uint ea = EA_AX_AI_8(); return m68ki_read_8(ea); } -INLINE uint OPER_AX_AI_16(void) {uint ea = EA_AX_AI_16(); return m68ki_read_16(ea);} -INLINE uint OPER_AX_AI_32(void) {uint ea = EA_AX_AI_32(); return m68ki_read_32(ea);} -INLINE uint OPER_AX_PI_8(void) {uint ea = EA_AX_PI_8(); return m68ki_read_8(ea); } -INLINE uint OPER_AX_PI_16(void) {uint ea = EA_AX_PI_16(); return m68ki_read_16(ea);} -INLINE uint OPER_AX_PI_32(void) {uint ea = EA_AX_PI_32(); return m68ki_read_32(ea);} -INLINE uint OPER_AX_PD_8(void) {uint ea = EA_AX_PD_8(); return m68ki_read_8(ea); } -INLINE uint OPER_AX_PD_16(void) {uint ea = EA_AX_PD_16(); return m68ki_read_16(ea);} -INLINE uint OPER_AX_PD_32(void) {uint ea = EA_AX_PD_32(); return m68ki_read_32(ea);} -INLINE uint OPER_AX_DI_8(void) {uint ea = EA_AX_DI_8(); return m68ki_read_8(ea); } -INLINE uint OPER_AX_DI_16(void) {uint ea = EA_AX_DI_16(); return m68ki_read_16(ea);} -INLINE uint OPER_AX_DI_32(void) {uint ea = EA_AX_DI_32(); return m68ki_read_32(ea);} -INLINE uint OPER_AX_IX_8(void) {uint ea = EA_AX_IX_8(); return m68ki_read_8(ea); } -INLINE uint OPER_AX_IX_16(void) {uint ea = EA_AX_IX_16(); return m68ki_read_16(ea);} -INLINE uint OPER_AX_IX_32(void) {uint ea = EA_AX_IX_32(); return m68ki_read_32(ea);} - -INLINE uint OPER_A7_PI_8(void) {uint ea = EA_A7_PI_8(); return m68ki_read_8(ea); } -INLINE uint OPER_A7_PD_8(void) {uint ea = EA_A7_PD_8(); return m68ki_read_8(ea); } - -INLINE uint OPER_AW_8(void) {uint ea = EA_AW_8(); return m68ki_read_8(ea); } -INLINE uint OPER_AW_16(void) {uint ea = EA_AW_16(); return m68ki_read_16(ea);} -INLINE uint OPER_AW_32(void) {uint ea = EA_AW_32(); return m68ki_read_32(ea);} -INLINE uint OPER_AL_8(void) {uint ea = EA_AL_8(); return m68ki_read_8(ea); } -INLINE uint OPER_AL_16(void) {uint ea = EA_AL_16(); return m68ki_read_16(ea);} -INLINE uint OPER_AL_32(void) {uint ea = EA_AL_32(); return m68ki_read_32(ea);} -INLINE uint OPER_PCDI_8(void) {uint ea = EA_PCDI_8(); return m68ki_read_pcrel_8(ea); } -INLINE uint OPER_PCDI_16(void) {uint ea = EA_PCDI_16(); return m68ki_read_pcrel_16(ea);} -INLINE uint OPER_PCDI_32(void) {uint ea = EA_PCDI_32(); return m68ki_read_pcrel_32(ea);} -INLINE uint OPER_PCIX_8(void) {uint ea = EA_PCIX_8(); return m68ki_read_pcrel_8(ea); } -INLINE uint OPER_PCIX_16(void) {uint ea = EA_PCIX_16(); return m68ki_read_pcrel_16(ea);} -INLINE uint OPER_PCIX_32(void) {uint ea = EA_PCIX_32(); return m68ki_read_pcrel_32(ea);} - - - -/* ---------------------------- Stack Functions --------------------------- */ - -/* Push/pull data from the stack */ -INLINE void m68ki_push_16(uint value) -{ - REG_SP = MASK_OUT_ABOVE_32(REG_SP - 2); - m68ki_write_16(REG_SP, value); -} - -INLINE void m68ki_push_32(uint value) -{ - REG_SP = MASK_OUT_ABOVE_32(REG_SP - 4); - m68ki_write_32(REG_SP, value); -} - -INLINE uint m68ki_pull_16(void) -{ - REG_SP = MASK_OUT_ABOVE_32(REG_SP + 2); - return m68ki_read_16(REG_SP-2); -} - -INLINE uint m68ki_pull_32(void) -{ - REG_SP = MASK_OUT_ABOVE_32(REG_SP + 4); - return m68ki_read_32(REG_SP-4); -} - - -/* Increment/decrement the stack as if doing a push/pull but - * don't do any memory access. - */ -INLINE void m68ki_fake_push_16(void) -{ - REG_SP = MASK_OUT_ABOVE_32(REG_SP - 2); -} - -INLINE void m68ki_fake_push_32(void) -{ - REG_SP = MASK_OUT_ABOVE_32(REG_SP - 4); -} - -INLINE void m68ki_fake_pull_16(void) -{ - REG_SP = MASK_OUT_ABOVE_32(REG_SP + 2); -} - -INLINE void m68ki_fake_pull_32(void) -{ - REG_SP = MASK_OUT_ABOVE_32(REG_SP + 4); -} - - -/* ----------------------------- Program Flow ----------------------------- */ - -/* Jump to a new program location or vector. - * These functions will also call the pc_changed callback if it was enabled - * in m68kconf.h. - */ -INLINE void m68ki_jump(uint new_pc) -{ - REG_PC = new_pc; - m68ki_pc_changed(REG_PC); -} - -INLINE void m68ki_jump_vector(uint vector) -{ - REG_PC = (vector<<2) + REG_VBR; - REG_PC = m68ki_read_data_32(REG_PC); - m68ki_pc_changed(REG_PC); -} - - -/* Branch to a new memory location. - * The 32-bit branch will call pc_changed if it was enabled in m68kconf.h. - * So far I've found no problems with not calling pc_changed for 8 or 16 - * bit branches. - */ -INLINE void m68ki_branch_8(uint offset) -{ - REG_PC += MAKE_INT_8(offset); -} - -INLINE void m68ki_branch_16(uint offset) -{ - REG_PC += MAKE_INT_16(offset); -} - -INLINE void m68ki_branch_32(uint offset) -{ - REG_PC += offset; - m68ki_pc_changed(REG_PC); -} - - - -/* ---------------------------- Status Register --------------------------- */ - -/* Set the S flag and change the active stack pointer. - * Note that value MUST be 4 or 0. - */ -INLINE void m68ki_set_s_flag(uint value) -{ - /* Backup the old stack pointer */ - REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)] = REG_SP; - /* Set the S flag */ - FLAG_S = value; - /* Set the new stack pointer */ - REG_SP = REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)]; -} - -/* Set the S and M flags and change the active stack pointer. - * Note that value MUST be 0, 2, 4, or 6 (bit2 = S, bit1 = M). - */ -INLINE void m68ki_set_sm_flag(uint value) -{ - /* Backup the old stack pointer */ - REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)] = REG_SP; - /* Set the S and M flags */ - FLAG_S = value & SFLAG_SET; - FLAG_M = value & MFLAG_SET; - /* Set the new stack pointer */ - REG_SP = REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)]; -} - - -/* Set the condition code register */ -INLINE void m68ki_set_ccr(uint value) -{ - FLAG_X = BIT_4(value) << 4; - FLAG_N = BIT_3(value) << 4; - FLAG_Z = !BIT_2(value); - FLAG_V = BIT_1(value) << 6; - FLAG_C = BIT_0(value) << 8; -} - -/* Set the status register but don't check for interrupts */ -INLINE void m68ki_set_sr_noint(uint value) -{ - /* Mask out the "unimplemented" bits */ - value &= CPU_SR_MASK; - - /* Now set the status register */ - FLAG_T1 = BIT_F(value); - FLAG_T0 = BIT_E(value); - FLAG_INT_MASK = value & 0x0700; - m68ki_set_ccr(value); - m68ki_set_sm_flag((value >> 11) & 6); -} - -/* Set the status register and check for interrupts */ -INLINE void m68ki_set_sr(uint value) -{ - m68ki_set_sr_noint(value); - m68ki_check_interrupts(); -} - - -/* ------------------------- Exception Processing ------------------------- */ - -/* Initiate exception processing */ -INLINE uint m68ki_init_exception(void) -{ - /* Save the old status register */ - uint sr = m68ki_get_sr(); - - /* Turn off trace flag, clear pending traces */ - FLAG_T1 = FLAG_T0 = 0; - m68ki_clear_trace(); - /* Enter supervisor mode */ - m68ki_set_s_flag(SFLAG_SET); - - return sr; -} - -/* 3 word stack frame (68000 only) */ -INLINE void m68ki_stack_frame_3word(uint pc, uint sr) -{ - m68ki_push_32(pc); - m68ki_push_16(sr); -} - -/* Format 0 stack frame. - * This is the standard stack frame for 68010+. - */ -INLINE void m68ki_stack_frame_0000(uint pc, uint sr, uint vector) -{ - /* Stack a 3-word frame if we are 68000 */ - if(CPU_TYPE == CPU_TYPE_000) - { - m68ki_stack_frame_3word(pc, sr); - return; - } - m68ki_push_16(vector<<2); - m68ki_push_32(pc); - m68ki_push_16(sr); -} - -/* Format 1 stack frame (68020). - * For 68020, this is the 4 word throwaway frame. - */ -INLINE void m68ki_stack_frame_0001(uint pc, uint sr, uint vector) -{ - m68ki_push_16(0x1000 | (vector<<2)); - m68ki_push_32(pc); - m68ki_push_16(sr); -} - -/* Format 2 stack frame. - * This is used only by 68020 for trap exceptions. - */ -INLINE void m68ki_stack_frame_0010(uint sr, uint vector) -{ - m68ki_push_32(REG_PPC); - m68ki_push_16(0x2000 | (vector<<2)); - m68ki_push_32(REG_PC); - m68ki_push_16(sr); -} - - -/* Bus error stack frame (68000 only). - */ -INLINE void m68ki_stack_frame_buserr(uint pc, uint sr, uint address, uint write, uint instruction, uint fc) -{ - m68ki_push_32(pc); - m68ki_push_16(sr); - m68ki_push_16(REG_IR); - m68ki_push_32(address); /* access address */ - /* 0 0 0 0 0 0 0 0 0 0 0 R/W I/N FC - * R/W 0 = write, 1 = read - * I/N 0 = instruction, 1 = not - * FC 3-bit function code - */ - m68ki_push_16(((!write)<<4) | ((!instruction)<<3) | fc); -} - -/* Format 8 stack frame (68010). - * 68010 only. This is the 29 word bus/address error frame. - */ -void m68ki_stack_frame_1000(uint pc, uint sr, uint vector) -{ - /* VERSION - * NUMBER - * INTERNAL INFORMATION, 16 WORDS - */ - m68ki_fake_push_32(); - m68ki_fake_push_32(); - m68ki_fake_push_32(); - m68ki_fake_push_32(); - m68ki_fake_push_32(); - m68ki_fake_push_32(); - m68ki_fake_push_32(); - m68ki_fake_push_32(); - - /* INSTRUCTION INPUT BUFFER */ - m68ki_push_16(0); - - /* UNUSED, RESERVED (not written) */ - m68ki_fake_push_16(); - - /* DATA INPUT BUFFER */ - m68ki_push_16(0); - - /* UNUSED, RESERVED (not written) */ - m68ki_fake_push_16(); - - /* DATA OUTPUT BUFFER */ - m68ki_push_16(0); - - /* UNUSED, RESERVED (not written) */ - m68ki_fake_push_16(); - - /* FAULT ADDRESS */ - m68ki_push_32(0); - - /* SPECIAL STATUS WORD */ - m68ki_push_16(0); - - /* 1000, VECTOR OFFSET */ - m68ki_push_16(0x8000 | (vector<<2)); - - /* PROGRAM COUNTER */ - m68ki_push_32(pc); - - /* STATUS REGISTER */ - m68ki_push_16(sr); -} - -/* Format A stack frame (short bus fault). - * This is used only by 68020 for bus fault and address error - * if the error happens at an instruction boundary. - * PC stacked is address of next instruction. - */ -void m68ki_stack_frame_1010(uint sr, uint vector, uint pc) -{ - /* INTERNAL REGISTER */ - m68ki_push_16(0); - - /* INTERNAL REGISTER */ - m68ki_push_16(0); - - /* DATA OUTPUT BUFFER (2 words) */ - m68ki_push_32(0); - - /* INTERNAL REGISTER */ - m68ki_push_16(0); - - /* INTERNAL REGISTER */ - m68ki_push_16(0); - - /* DATA CYCLE FAULT ADDRESS (2 words) */ - m68ki_push_32(0); - - /* INSTRUCTION PIPE STAGE B */ - m68ki_push_16(0); - - /* INSTRUCTION PIPE STAGE C */ - m68ki_push_16(0); - - /* SPECIAL STATUS REGISTER */ - m68ki_push_16(0); - - /* INTERNAL REGISTER */ - m68ki_push_16(0); - - /* 1010, VECTOR OFFSET */ - m68ki_push_16(0xa000 | (vector<<2)); - - /* PROGRAM COUNTER */ - m68ki_push_32(pc); - - /* STATUS REGISTER */ - m68ki_push_16(sr); -} - -/* Format B stack frame (long bus fault). - * This is used only by 68020 for bus fault and address error - * if the error happens during instruction execution. - * PC stacked is address of instruction in progress. - */ -void m68ki_stack_frame_1011(uint sr, uint vector, uint pc) -{ - /* INTERNAL REGISTERS (18 words) */ - m68ki_push_32(0); - m68ki_push_32(0); - m68ki_push_32(0); - m68ki_push_32(0); - m68ki_push_32(0); - m68ki_push_32(0); - m68ki_push_32(0); - m68ki_push_32(0); - m68ki_push_32(0); - - /* VERSION# (4 bits), INTERNAL INFORMATION */ - m68ki_push_16(0); - - /* INTERNAL REGISTERS (3 words) */ - m68ki_push_32(0); - m68ki_push_16(0); - - /* DATA INTPUT BUFFER (2 words) */ - m68ki_push_32(0); - - /* INTERNAL REGISTERS (2 words) */ - m68ki_push_32(0); - - /* STAGE B ADDRESS (2 words) */ - m68ki_push_32(0); - - /* INTERNAL REGISTER (4 words) */ - m68ki_push_32(0); - m68ki_push_32(0); - - /* DATA OUTPUT BUFFER (2 words) */ - m68ki_push_32(0); - - /* INTERNAL REGISTER */ - m68ki_push_16(0); - - /* INTERNAL REGISTER */ - m68ki_push_16(0); - - /* DATA CYCLE FAULT ADDRESS (2 words) */ - m68ki_push_32(0); - - /* INSTRUCTION PIPE STAGE B */ - m68ki_push_16(0); - - /* INSTRUCTION PIPE STAGE C */ - m68ki_push_16(0); - - /* SPECIAL STATUS REGISTER */ - m68ki_push_16(0); - - /* INTERNAL REGISTER */ - m68ki_push_16(0); - - /* 1011, VECTOR OFFSET */ - m68ki_push_16(0xb000 | (vector<<2)); - - /* PROGRAM COUNTER */ - m68ki_push_32(pc); - - /* STATUS REGISTER */ - m68ki_push_16(sr); -} - - -/* Used for Group 2 exceptions. - * These stack a type 2 frame on the 020. - */ -INLINE void m68ki_exception_trap(uint vector) -{ - uint sr = m68ki_init_exception(); - - if(CPU_TYPE_IS_010_LESS(CPU_TYPE)) - m68ki_stack_frame_0000(REG_PC, sr, vector); - else - m68ki_stack_frame_0010(sr, vector); - - m68ki_jump_vector(vector); - - /* Use up some clock cycles */ - USE_CYCLES(CYC_EXCEPTION[vector]); -} - -/* Trap#n stacks a 0 frame but behaves like group2 otherwise */ -INLINE void m68ki_exception_trapN(uint vector) -{ - uint sr = m68ki_init_exception(); - m68ki_stack_frame_0000(REG_PC, sr, vector); - m68ki_jump_vector(vector); - - /* Use up some clock cycles */ - USE_CYCLES(CYC_EXCEPTION[vector]); -} - -/* Exception for trace mode */ -INLINE void m68ki_exception_trace(void) -{ - uint sr = m68ki_init_exception(); - - if(CPU_TYPE_IS_010_LESS(CPU_TYPE)) - m68ki_stack_frame_0000(REG_PC, sr, EXCEPTION_TRACE); - else - m68ki_stack_frame_0010(sr, EXCEPTION_TRACE); - - m68ki_jump_vector(EXCEPTION_TRACE); - - /* Trace nullifies a STOP instruction */ - CPU_STOPPED &= ~STOP_LEVEL_STOP; - - /* Use up some clock cycles */ - USE_CYCLES(CYC_EXCEPTION[EXCEPTION_TRACE]); -} - -/* Exception for privilege violation */ -INLINE void m68ki_exception_privilege_violation(void) -{ - uint sr = m68ki_init_exception(); - m68ki_stack_frame_0000(REG_PC, sr, EXCEPTION_PRIVILEGE_VIOLATION); - m68ki_jump_vector(EXCEPTION_PRIVILEGE_VIOLATION); - - /* Use up some clock cycles and undo the instruction's cycles */ - USE_CYCLES(CYC_EXCEPTION[EXCEPTION_PRIVILEGE_VIOLATION] - CYC_INSTRUCTION[REG_IR]); -} - -/* Exception for A-Line instructions */ -INLINE void m68ki_exception_1010(void) -{ - uint sr; -#if M68K_LOG_1010_1111 == OPT_ON - M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: called 1010 instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PPC), REG_IR, - m68ki_disassemble_quick(ADDRESS_68K(REG_PPC)))); -#endif - - sr = m68ki_init_exception(); - m68ki_stack_frame_0000(REG_PC-2, sr, EXCEPTION_1010); - m68ki_jump_vector(EXCEPTION_1010); - - /* Use up some clock cycles and undo the instruction's cycles */ - USE_CYCLES(CYC_EXCEPTION[EXCEPTION_1010] - CYC_INSTRUCTION[REG_IR]); -} - -/* Exception for F-Line instructions */ -INLINE void m68ki_exception_1111(void) -{ - uint sr; - -#if M68K_LOG_1010_1111 == OPT_ON - M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: called 1111 instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PPC), REG_IR, - m68ki_disassemble_quick(ADDRESS_68K(REG_PPC)))); -#endif - - sr = m68ki_init_exception(); - m68ki_stack_frame_0000(REG_PC-2, sr, EXCEPTION_1111); - m68ki_jump_vector(EXCEPTION_1111); - - /* Use up some clock cycles and undo the instruction's cycles */ - USE_CYCLES(CYC_EXCEPTION[EXCEPTION_1111] - CYC_INSTRUCTION[REG_IR]); -} - -/* Exception for illegal instructions */ -INLINE void m68ki_exception_illegal(void) -{ - uint sr; - - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: illegal instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PPC), REG_IR, - m68ki_disassemble_quick(ADDRESS_68K(REG_PPC)))); - - sr = m68ki_init_exception(); - m68ki_stack_frame_0000(REG_PC, sr, EXCEPTION_ILLEGAL_INSTRUCTION); - m68ki_jump_vector(EXCEPTION_ILLEGAL_INSTRUCTION); - - /* Use up some clock cycles and undo the instruction's cycles */ - USE_CYCLES(CYC_EXCEPTION[EXCEPTION_ILLEGAL_INSTRUCTION] - CYC_INSTRUCTION[REG_IR]); -} - -/* Exception for format errror in RTE */ -INLINE void m68ki_exception_format_error(void) -{ - uint sr = m68ki_init_exception(); - m68ki_stack_frame_0000(REG_PC, sr, EXCEPTION_FORMAT_ERROR); - m68ki_jump_vector(EXCEPTION_FORMAT_ERROR); - - /* Use up some clock cycles and undo the instruction's cycles */ - USE_CYCLES(CYC_EXCEPTION[EXCEPTION_FORMAT_ERROR] - CYC_INSTRUCTION[REG_IR]); -} - -/* Exception for address error */ -INLINE void m68ki_exception_address_error(void) -{ - /* Not emulated yet */ -} - - -/* Service an interrupt request and start exception processing */ -void m68ki_exception_interrupt(uint int_level) -{ - uint vector; - uint sr; - uint new_pc; - - /* Turn off the stopped state */ - CPU_STOPPED &= ~STOP_LEVEL_STOP; - - /* If we are halted, don't do anything */ - if(CPU_STOPPED) return; - - /* Acknowledge the interrupt */ - vector = m68ki_int_ack(int_level); - - /* Get the interrupt vector */ - if(vector == M68K_INT_ACK_AUTOVECTOR) - /* Use the autovectors. This is the most commonly used implementation */ - vector = EXCEPTION_INTERRUPT_AUTOVECTOR+int_level; - else if(vector == M68K_INT_ACK_SPURIOUS) - /* Called if no devices respond to the interrupt acknowledge */ - vector = EXCEPTION_SPURIOUS_INTERRUPT; - else if(vector > 255) - { - M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: Interrupt acknowledge returned invalid vector $%x\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC), vector)); - return; - } - - /* Start exception processing */ - sr = m68ki_init_exception(); - - /* Set the interrupt mask to the level of the one being serviced */ - FLAG_INT_MASK = int_level<<8; - - /* Get the new PC */ - new_pc = m68ki_read_data_32((vector<<2) + REG_VBR); - - /* If vector is uninitialized, call the uninitialized interrupt vector */ - if(new_pc == 0) - new_pc = m68ki_read_data_32((EXCEPTION_UNINITIALIZED_INTERRUPT<<2) + REG_VBR); - - /* Generate a stack frame */ - m68ki_stack_frame_0000(REG_PC, sr, vector); - if(FLAG_M && CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - /* Create throwaway frame */ - m68ki_set_sm_flag(FLAG_S); /* clear M */ - sr |= 0x2000; /* Same as SR in master stack frame except S is forced high */ - m68ki_stack_frame_0001(REG_PC, sr, vector); - } - - m68ki_jump(new_pc); - - /* Defer cycle counting until later */ - CPU_INT_CYCLES += CYC_EXCEPTION[vector]; - -//#if !M68K_EMULATE_INT_ACK - /* Automatically clear IRQ if we are not using an acknowledge scheme */ - CPU_INT_LEVEL = 0; -//#endif /* M68K_EMULATE_INT_ACK */ -} - - -/* ASG: Check for interrupts */ -INLINE void m68ki_check_interrupts(void) -{ - if(CPU_INT_LEVEL > FLAG_INT_MASK) - m68ki_exception_interrupt(CPU_INT_LEVEL>>8); -} - - - -/* ======================================================================== */ -/* ============================== END OF FILE ============================= */ -/* ======================================================================== */ - -#endif /* M68KCPU__HEADER */ +#include +/* ======================================================================== */ +/* ========================= LICENSING & COPYRIGHT ======================== */ +/* ======================================================================== */ +/* + * MUSASHI + * Version 3.32 + * + * A portable Motorola M680x0 processor emulation engine. + * Copyright Karl Stenerud. All rights reserved. + * + * This code may be freely used for non-commercial purposes as long as this + * copyright notice remains unaltered in the source code and any binary files + * containing this code in compiled form. + * + * All other licensing terms must be negotiated with the author + * (Karl Stenerud). + * + * The latest version of this code can be obtained at: + * http://kstenerud.cjb.net + */ + + + + +#ifndef M68KCPU__HEADER +#define M68KCPU__HEADER + +#include "m68k.h" +#include + +#if M68K_EMULATE_ADDRESS_ERROR +#include +#endif /* M68K_EMULATE_ADDRESS_ERROR */ + +/* ======================================================================== */ +/* ==================== ARCHITECTURE-DEPENDANT DEFINES ==================== */ +/* ======================================================================== */ + +/* Check for > 32bit sizes */ +#if UINT_MAX > 0xffffffff + #define M68K_INT_GT_32_BIT 1 +#else + #define M68K_INT_GT_32_BIT 0 +#endif + +/* Data types used in this emulation core */ +#undef sint8 +#undef sint16 +#undef sint32 +#undef sint64 +#undef uint8 +#undef uint16 +#undef uint32 +#undef uint64 +#undef sint +#undef uint + +#define sint8 signed char /* ASG: changed from char to signed char */ +#define sint16 signed short +#define sint32 signed int /* AWJ: changed from long to int */ +#define uint8 unsigned char +#define uint16 unsigned short +#define uint32 unsigned int /* AWJ: changed from long to int */ + +/* signed and unsigned int must be at least 32 bits wide */ +#define sint signed int +#define uint unsigned int + + +#if M68K_USE_64_BIT +#define sint64 signed long long +#define uint64 unsigned long long +#else +#define sint64 sint32 +#define uint64 uint32 +#endif /* M68K_USE_64_BIT */ + + + +/* Allow for architectures that don't have 8-bit sizes */ +#if UCHAR_MAX == 0xff + #define MAKE_INT_8(A) (sint8)(A) +#else + #undef sint8 + #define sint8 signed int + #undef uint8 + #define uint8 unsigned int + INLINE sint MAKE_INT_8(uint value) + { + return (value & 0x80) ? value | ~0xff : value & 0xff; + } +#endif /* UCHAR_MAX == 0xff */ + + +/* Allow for architectures that don't have 16-bit sizes */ +#if USHRT_MAX == 0xffff + #define MAKE_INT_16(A) (sint16)(A) +#else + #undef sint16 + #define sint16 signed int + #undef uint16 + #define uint16 unsigned int + INLINE sint MAKE_INT_16(uint value) + { + return (value & 0x8000) ? value | ~0xffff : value & 0xffff; + } +#endif /* USHRT_MAX == 0xffff */ + + +/* Allow for architectures that don't have 32-bit sizes */ +#if UINT_MAX == 0xffffffff + #define MAKE_INT_32(A) (sint32)(A) +#else + #undef sint32 + #define sint32 signed int + #undef uint32 + #define uint32 unsigned int + INLINE sint MAKE_INT_32(uint value) + { + return (value & 0x80000000) ? value | ~0xffffffff : value & 0xffffffff; + } +#endif /* UINT_MAX == 0xffffffff */ + + + + +/* ======================================================================== */ +/* ============================ GENERAL DEFINES =========================== */ +/* ======================================================================== */ + +/* Exception Vectors handled by emulation */ +#define EXCEPTION_BUS_ERROR 2 /* This one is not emulated! */ +#define EXCEPTION_ADDRESS_ERROR 3 /* This one is partially emulated (doesn't stack a proper frame yet) */ +#define EXCEPTION_ILLEGAL_INSTRUCTION 4 +#define EXCEPTION_ZERO_DIVIDE 5 +#define EXCEPTION_CHK 6 +#define EXCEPTION_TRAPV 7 +#define EXCEPTION_PRIVILEGE_VIOLATION 8 +#define EXCEPTION_TRACE 9 +#define EXCEPTION_1010 10 +#define EXCEPTION_1111 11 +#define EXCEPTION_FORMAT_ERROR 14 +#define EXCEPTION_UNINITIALIZED_INTERRUPT 15 +#define EXCEPTION_SPURIOUS_INTERRUPT 24 +#define EXCEPTION_INTERRUPT_AUTOVECTOR 24 +#define EXCEPTION_TRAP_BASE 32 + +/* Function codes set by CPU during data/address bus activity */ +#define FUNCTION_CODE_USER_DATA 1 +#define FUNCTION_CODE_USER_PROGRAM 2 +#define FUNCTION_CODE_SUPERVISOR_DATA 5 +#define FUNCTION_CODE_SUPERVISOR_PROGRAM 6 +#define FUNCTION_CODE_CPU_SPACE 7 + +/* CPU types for deciding what to emulate */ +#define CPU_TYPE_000 1 +#define CPU_TYPE_008 2 +#define CPU_TYPE_010 4 +#define CPU_TYPE_EC020 8 +#define CPU_TYPE_020 16 +#define CPU_TYPE_040 32 + +/* Different ways to stop the CPU */ +#define STOP_LEVEL_STOP 1 +#define STOP_LEVEL_HALT 2 + +/* Used for 68000 address error processing */ +#define INSTRUCTION_YES 0 +#define INSTRUCTION_NO 0x08 +#define MODE_READ 0x10 +#define MODE_WRITE 0 + +#define RUN_MODE_NORMAL 0 +#define RUN_MODE_BERR_AERR_RESET 1 + +#ifndef NULL +#define NULL ((void*)0) +#endif + +/* ======================================================================== */ +/* ================================ MACROS ================================ */ +/* ======================================================================== */ + + +/* ---------------------------- General Macros ---------------------------- */ + +/* Bit Isolation Macros */ +#define BIT_0(A) ((A) & 0x00000001) +#define BIT_1(A) ((A) & 0x00000002) +#define BIT_2(A) ((A) & 0x00000004) +#define BIT_3(A) ((A) & 0x00000008) +#define BIT_4(A) ((A) & 0x00000010) +#define BIT_5(A) ((A) & 0x00000020) +#define BIT_6(A) ((A) & 0x00000040) +#define BIT_7(A) ((A) & 0x00000080) +#define BIT_8(A) ((A) & 0x00000100) +#define BIT_9(A) ((A) & 0x00000200) +#define BIT_A(A) ((A) & 0x00000400) +#define BIT_B(A) ((A) & 0x00000800) +#define BIT_C(A) ((A) & 0x00001000) +#define BIT_D(A) ((A) & 0x00002000) +#define BIT_E(A) ((A) & 0x00004000) +#define BIT_F(A) ((A) & 0x00008000) +#define BIT_10(A) ((A) & 0x00010000) +#define BIT_11(A) ((A) & 0x00020000) +#define BIT_12(A) ((A) & 0x00040000) +#define BIT_13(A) ((A) & 0x00080000) +#define BIT_14(A) ((A) & 0x00100000) +#define BIT_15(A) ((A) & 0x00200000) +#define BIT_16(A) ((A) & 0x00400000) +#define BIT_17(A) ((A) & 0x00800000) +#define BIT_18(A) ((A) & 0x01000000) +#define BIT_19(A) ((A) & 0x02000000) +#define BIT_1A(A) ((A) & 0x04000000) +#define BIT_1B(A) ((A) & 0x08000000) +#define BIT_1C(A) ((A) & 0x10000000) +#define BIT_1D(A) ((A) & 0x20000000) +#define BIT_1E(A) ((A) & 0x40000000) +#define BIT_1F(A) ((A) & 0x80000000) + +/* Get the most significant bit for specific sizes */ +#define GET_MSB_8(A) ((A) & 0x80) +#define GET_MSB_9(A) ((A) & 0x100) +#define GET_MSB_16(A) ((A) & 0x8000) +#define GET_MSB_17(A) ((A) & 0x10000) +#define GET_MSB_32(A) ((A) & 0x80000000) +#if M68K_USE_64_BIT +#define GET_MSB_33(A) ((A) & 0x100000000) +#endif /* M68K_USE_64_BIT */ + +/* Isolate nibbles */ +#define LOW_NIBBLE(A) ((A) & 0x0f) +#define HIGH_NIBBLE(A) ((A) & 0xf0) + +/* These are used to isolate 8, 16, and 32 bit sizes */ +#define MASK_OUT_ABOVE_2(A) ((A) & 3) +#define MASK_OUT_ABOVE_8(A) ((A) & 0xff) +#define MASK_OUT_ABOVE_16(A) ((A) & 0xffff) +#define MASK_OUT_BELOW_2(A) ((A) & ~3) +#define MASK_OUT_BELOW_8(A) ((A) & ~0xff) +#define MASK_OUT_BELOW_16(A) ((A) & ~0xffff) + +/* No need to mask if we are 32 bit */ +#if M68K_INT_GT_32_BIT || M68K_USE_64_BIT + #define MASK_OUT_ABOVE_32(A) ((A) & 0xffffffff) + #define MASK_OUT_BELOW_32(A) ((A) & ~0xffffffff) +#else + #define MASK_OUT_ABOVE_32(A) (A) + #define MASK_OUT_BELOW_32(A) 0 +#endif /* M68K_INT_GT_32_BIT || M68K_USE_64_BIT */ + +/* Simulate address lines of 68k family */ +#define ADDRESS_68K(A) ((A)&CPU_ADDRESS_MASK) + + +/* Shift & Rotate Macros. */ +#define LSL(A, C) ((A) << (C)) +#define LSR(A, C) ((A) >> (C)) + +/* Some > 32-bit optimizations */ +#if M68K_INT_GT_32_BIT + /* Shift left and right */ + #define LSR_32(A, C) ((A) >> (C)) + #define LSL_32(A, C) ((A) << (C)) +#else + /* We have to do this because the morons at ANSI decided that shifts + * by >= data size are undefined. + */ + #define LSR_32(A, C) ((C) < 32 ? (A) >> (C) : 0) + #define LSL_32(A, C) ((C) < 32 ? (A) << (C) : 0) +#endif /* M68K_INT_GT_32_BIT */ + +#if M68K_USE_64_BIT + #define LSL_32_64(A, C) ((A) << (C)) + #define LSR_32_64(A, C) ((A) >> (C)) + #define ROL_33_64(A, C) (LSL_32_64(A, C) | LSR_32_64(A, 33-(C))) + #define ROR_33_64(A, C) (LSR_32_64(A, C) | LSL_32_64(A, 33-(C))) +#endif /* M68K_USE_64_BIT */ + +#define ROL_8(A, C) MASK_OUT_ABOVE_8(LSL(A, C) | LSR(A, 8-(C))) +#define ROL_9(A, C) (LSL(A, C) | LSR(A, 9-(C))) +#define ROL_16(A, C) MASK_OUT_ABOVE_16(LSL(A, C) | LSR(A, 16-(C))) +#define ROL_17(A, C) (LSL(A, C) | LSR(A, 17-(C))) +#define ROL_32(A, C) MASK_OUT_ABOVE_32(LSL_32(A, C) | LSR_32(A, 32-(C))) +#define ROL_33(A, C) (LSL_32(A, C) | LSR_32(A, 33-(C))) + +#define ROR_8(A, C) MASK_OUT_ABOVE_8(LSR(A, C) | LSL(A, 8-(C))) +#define ROR_9(A, C) (LSR(A, C) | LSL(A, 9-(C))) +#define ROR_16(A, C) MASK_OUT_ABOVE_16(LSR(A, C) | LSL(A, 16-(C))) +#define ROR_17(A, C) (LSR(A, C) | LSL(A, 17-(C))) +#define ROR_32(A, C) MASK_OUT_ABOVE_32(LSR_32(A, C) | LSL_32(A, 32-(C))) +#define ROR_33(A, C) (LSR_32(A, C) | LSL_32(A, 33-(C))) + + + +/* ------------------------------ CPU Access ------------------------------ */ + +/* Access the CPU registers */ +#define CPU_TYPE m68ki_cpu.cpu_type + +#define REG_DA m68ki_cpu.dar /* easy access to data and address regs */ +#define REG_D m68ki_cpu.dar +#define REG_A (m68ki_cpu.dar+8) +#define REG_PPC m68ki_cpu.ppc +#define REG_PC m68ki_cpu.pc +#define REG_SP_BASE m68ki_cpu.sp +#define REG_USP m68ki_cpu.sp[0] +#define REG_ISP m68ki_cpu.sp[4] +#define REG_MSP m68ki_cpu.sp[6] +#define REG_SP m68ki_cpu.dar[15] +#define REG_VBR m68ki_cpu.vbr +#define REG_SFC m68ki_cpu.sfc +#define REG_DFC m68ki_cpu.dfc +#define REG_CACR m68ki_cpu.cacr +#define REG_CAAR m68ki_cpu.caar +#define REG_IR m68ki_cpu.ir + +#define REG_FP m68ki_cpu.fpr +#define REG_FPCR m68ki_cpu.fpcr +#define REG_FPSR m68ki_cpu.fpsr +#define REG_FPIAR m68ki_cpu.fpiar + +#define FLAG_T1 m68ki_cpu.t1_flag +#define FLAG_T0 m68ki_cpu.t0_flag +#define FLAG_S m68ki_cpu.s_flag +#define FLAG_M m68ki_cpu.m_flag +#define FLAG_X m68ki_cpu.x_flag +#define FLAG_N m68ki_cpu.n_flag +#define FLAG_Z m68ki_cpu.not_z_flag +#define FLAG_V m68ki_cpu.v_flag +#define FLAG_C m68ki_cpu.c_flag +#define FLAG_INT_MASK m68ki_cpu.int_mask + +#define CPU_INT_LEVEL m68ki_cpu.int_level /* ASG: changed from CPU_INTS_PENDING */ +#define CPU_INT_CYCLES m68ki_cpu.int_cycles /* ASG */ +#define CPU_STOPPED m68ki_cpu.stopped +#define CPU_PREF_ADDR m68ki_cpu.pref_addr +#define CPU_PREF_DATA m68ki_cpu.pref_data +#define CPU_ADDRESS_MASK m68ki_cpu.address_mask +#define CPU_SR_MASK m68ki_cpu.sr_mask +#define CPU_INSTR_MODE m68ki_cpu.instr_mode +#define CPU_RUN_MODE m68ki_cpu.run_mode + +#define CYC_INSTRUCTION m68ki_cpu.cyc_instruction +#define CYC_EXCEPTION m68ki_cpu.cyc_exception +#define CYC_BCC_NOTAKE_B m68ki_cpu.cyc_bcc_notake_b +#define CYC_BCC_NOTAKE_W m68ki_cpu.cyc_bcc_notake_w +#define CYC_DBCC_F_NOEXP m68ki_cpu.cyc_dbcc_f_noexp +#define CYC_DBCC_F_EXP m68ki_cpu.cyc_dbcc_f_exp +#define CYC_SCC_R_TRUE m68ki_cpu.cyc_scc_r_true +#define CYC_MOVEM_W m68ki_cpu.cyc_movem_w +#define CYC_MOVEM_L m68ki_cpu.cyc_movem_l +#define CYC_SHIFT m68ki_cpu.cyc_shift +#define CYC_RESET m68ki_cpu.cyc_reset + + +#define CALLBACK_INT_ACK m68ki_cpu.int_ack_callback +#define CALLBACK_BKPT_ACK m68ki_cpu.bkpt_ack_callback +#define CALLBACK_RESET_INSTR m68ki_cpu.reset_instr_callback +#define CALLBACK_CMPILD_INSTR m68ki_cpu.cmpild_instr_callback +#define CALLBACK_RTE_INSTR m68ki_cpu.rte_instr_callback +#define CALLBACK_TAS_INSTR m68ki_cpu.tas_instr_callback +#define CALLBACK_PC_CHANGED m68ki_cpu.pc_changed_callback +#define CALLBACK_SET_FC m68ki_cpu.set_fc_callback +#define CALLBACK_INSTR_HOOK m68ki_cpu.instr_hook_callback + + + +/* ----------------------------- Configuration ---------------------------- */ + +/* These defines are dependant on the configuration defines in m68kconf.h */ + +/* Disable certain comparisons if we're not using all CPU types */ +#if M68K_EMULATE_040 + #define CPU_TYPE_IS_040_PLUS(A) ((A) & CPU_TYPE_040) + #define CPU_TYPE_IS_040_LESS(A) 1 +#else + #define CPU_TYPE_IS_040_PLUS(A) 0 + #define CPU_TYPE_IS_040_LESS(A) 1 +#endif + +#if M68K_EMULATE_020 + #define CPU_TYPE_IS_020_PLUS(A) ((A) & (CPU_TYPE_020 | CPU_TYPE_040)) + #define CPU_TYPE_IS_020_LESS(A) 1 +#else + #define CPU_TYPE_IS_020_PLUS(A) 0 + #define CPU_TYPE_IS_020_LESS(A) 1 +#endif + +#if M68K_EMULATE_EC020 + #define CPU_TYPE_IS_EC020_PLUS(A) ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_040)) + #define CPU_TYPE_IS_EC020_LESS(A) ((A) & (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010 | CPU_TYPE_EC020)) +#else + #define CPU_TYPE_IS_EC020_PLUS(A) CPU_TYPE_IS_020_PLUS(A) + #define CPU_TYPE_IS_EC020_LESS(A) CPU_TYPE_IS_020_LESS(A) +#endif + +#if M68K_EMULATE_010 + #define CPU_TYPE_IS_010(A) ((A) == CPU_TYPE_010) + #define CPU_TYPE_IS_010_PLUS(A) ((A) & (CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_040)) + #define CPU_TYPE_IS_010_LESS(A) ((A) & (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010)) +#else + #define CPU_TYPE_IS_010(A) 0 + #define CPU_TYPE_IS_010_PLUS(A) CPU_TYPE_IS_EC020_PLUS(A) + #define CPU_TYPE_IS_010_LESS(A) CPU_TYPE_IS_EC020_LESS(A) +#endif + +#if M68K_EMULATE_020 || M68K_EMULATE_EC020 + #define CPU_TYPE_IS_020_VARIANT(A) ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020)) +#else + #define CPU_TYPE_IS_020_VARIANT(A) 0 +#endif + +#if M68K_EMULATE_040 || M68K_EMULATE_020 || M68K_EMULATE_EC020 || M68K_EMULATE_010 + #define CPU_TYPE_IS_000(A) ((A) == CPU_TYPE_000 || (A) == CPU_TYPE_008) +#else + #define CPU_TYPE_IS_000(A) 1 +#endif + + +#if !M68K_SEPARATE_READS +#define m68k_read_immediate_16(A) m68ki_read_program_16(A) +#define m68k_read_immediate_32(A) m68ki_read_program_32(A) + +#define m68k_read_pcrelative_8(A) m68ki_read_program_8(A) +#define m68k_read_pcrelative_16(A) m68ki_read_program_16(A) +#define m68k_read_pcrelative_32(A) m68ki_read_program_32(A) +#endif /* M68K_SEPARATE_READS */ + + +/* Enable or disable callback functions */ +#if M68K_EMULATE_INT_ACK + #if M68K_EMULATE_INT_ACK == OPT_SPECIFY_HANDLER + #define m68ki_int_ack(A) M68K_INT_ACK_CALLBACK(A) + #else + #define m68ki_int_ack(A) CALLBACK_INT_ACK(A) + #endif +#else + /* Default action is to used autovector mode, which is most common */ + #define m68ki_int_ack(A) M68K_INT_ACK_AUTOVECTOR +#endif /* M68K_EMULATE_INT_ACK */ + +#if M68K_EMULATE_BKPT_ACK + #if M68K_EMULATE_BKPT_ACK == OPT_SPECIFY_HANDLER + #define m68ki_bkpt_ack(A) M68K_BKPT_ACK_CALLBACK(A) + #else + #define m68ki_bkpt_ack(A) CALLBACK_BKPT_ACK(A) + #endif +#else + #define m68ki_bkpt_ack(A) +#endif /* M68K_EMULATE_BKPT_ACK */ + +#if M68K_EMULATE_RESET + #if M68K_EMULATE_RESET == OPT_SPECIFY_HANDLER + #define m68ki_output_reset() M68K_RESET_CALLBACK() + #else + #define m68ki_output_reset() CALLBACK_RESET_INSTR() + #endif +#else + #define m68ki_output_reset() +#endif /* M68K_EMULATE_RESET */ + +#if M68K_CMPILD_HAS_CALLBACK + #if M68K_CMPILD_HAS_CALLBACK == OPT_SPECIFY_HANDLER + #define m68ki_cmpild_callback(v,r) M68K_CMPILD_CALLBACK(v,r) + #else + #define m68ki_cmpild_callback(v,r) CALLBACK_CMPILD_INSTR(v,r) + #endif +#else + #define m68ki_cmpild_callback(v,r) +#endif /* M68K_CMPILD_HAS_CALLBACK */ + +#if M68K_RTE_HAS_CALLBACK + #if M68K_RTE_HAS_CALLBACK == OPT_SPECIFY_HANDLER + #define m68ki_rte_callback() M68K_RTE_CALLBACK() + #else + #define m68ki_rte_callback() CALLBACK_RTE_INSTR() + #endif +#else + #define m68ki_rte_callback() +#endif /* M68K_RTE_HAS_CALLBACK */ + +#if M68K_TAS_HAS_CALLBACK + #if M68K_TAS_HAS_CALLBACK == OPT_SPECIFY_HANDLER + #define m68ki_tas_callback() M68K_TAS_CALLBACK() + #else + #define m68ki_tas_callback() CALLBACK_TAS_INSTR() + #endif +#else + #define m68ki_tas_callback() 0 +#endif /* M68K_TAS_HAS_CALLBACK */ + + +#if M68K_INSTRUCTION_HOOK + #if M68K_INSTRUCTION_HOOK == OPT_SPECIFY_HANDLER + #define m68ki_instr_hook(pc) M68K_INSTRUCTION_CALLBACK(pc) + #else + #define m68ki_instr_hook(pc) CALLBACK_INSTR_HOOK(pc) + #endif +#else + #define m68ki_instr_hook(pc) +#endif /* M68K_INSTRUCTION_HOOK */ + +#if M68K_MONITOR_PC + #if M68K_MONITOR_PC == OPT_SPECIFY_HANDLER + #define m68ki_pc_changed(A) M68K_SET_PC_CALLBACK(ADDRESS_68K(A)) + #else + #define m68ki_pc_changed(A) CALLBACK_PC_CHANGED(ADDRESS_68K(A)) + #endif +#else + #define m68ki_pc_changed(A) +#endif /* M68K_MONITOR_PC */ + + +/* Enable or disable function code emulation */ +#if M68K_EMULATE_FC + #if M68K_EMULATE_FC == OPT_SPECIFY_HANDLER + #define m68ki_set_fc(A) M68K_SET_FC_CALLBACK(A) + #else + #define m68ki_set_fc(A) CALLBACK_SET_FC(A) + #endif + #define m68ki_use_data_space() m68ki_address_space = FUNCTION_CODE_USER_DATA + #define m68ki_use_program_space() m68ki_address_space = FUNCTION_CODE_USER_PROGRAM + #define m68ki_get_address_space() m68ki_address_space +#else + #define m68ki_set_fc(A) + #define m68ki_use_data_space() + #define m68ki_use_program_space() + #define m68ki_get_address_space() FUNCTION_CODE_USER_DATA +#endif /* M68K_EMULATE_FC */ + + +/* Enable or disable trace emulation */ +#if M68K_EMULATE_TRACE + /* Initiates trace checking before each instruction (t1) */ + #define m68ki_trace_t1() m68ki_tracing = FLAG_T1 + /* adds t0 to trace checking if we encounter change of flow */ + #define m68ki_trace_t0() m68ki_tracing |= FLAG_T0 + /* Clear all tracing */ + #define m68ki_clear_trace() m68ki_tracing = 0 + /* Cause a trace exception if we are tracing */ + #define m68ki_exception_if_trace() if(m68ki_tracing) m68ki_exception_trace() +#else + #define m68ki_trace_t1() + #define m68ki_trace_t0() + #define m68ki_clear_trace() + #define m68ki_exception_if_trace() +#endif /* M68K_EMULATE_TRACE */ + + + +/* Address error */ +#if M68K_EMULATE_ADDRESS_ERROR + #include + extern jmp_buf m68ki_aerr_trap; + extern int emulate_address_error; + + #define m68ki_set_address_error_trap() \ + if(setjmp(m68ki_aerr_trap) != 0) \ + { \ + m68ki_exception_address_error(); \ + if(CPU_STOPPED) \ + { \ + SET_CYCLES(0); \ + CPU_INT_CYCLES = 0; \ + return m68ki_initial_cycles; \ + } \ + } + + #define m68ki_check_address_error(ADDR, WRITE_MODE, FC) \ + if(((ADDR)&1) && emulate_address_error)\ + { \ + m68ki_aerr_address = ADDR; \ + m68ki_aerr_write_mode = WRITE_MODE; \ + m68ki_aerr_fc = FC; \ + longjmp(m68ki_aerr_trap, 1); \ + } + + #define m68ki_check_address_error_010_less(ADDR, WRITE_MODE, FC) \ + if (CPU_TYPE_IS_010_LESS(CPU_TYPE)) \ + { \ + m68ki_check_address_error(ADDR, WRITE_MODE, FC) \ + } +#else + #define m68ki_set_address_error_trap() + #define m68ki_check_address_error(ADDR, WRITE_MODE, FC) + #define m68ki_check_address_error_010_less(ADDR, WRITE_MODE, FC) +#endif /* M68K_ADDRESS_ERROR */ + +/* Logging */ +#if M68K_LOG_ENABLE + #include + extern FILE* M68K_LOG_FILEHANDLE + extern const char *const m68ki_cpu_names[]; + + #define M68K_DO_LOG(A) if(M68K_LOG_FILEHANDLE) fprintf A + #if M68K_LOG_1010_1111 + #define M68K_DO_LOG_EMU(A) if(M68K_LOG_FILEHANDLE) fprintf A + #else + #define M68K_DO_LOG_EMU(A) + #endif +#else + #define M68K_DO_LOG(A) + #define M68K_DO_LOG_EMU(A) +#endif + + + +/* -------------------------- EA / Operand Access ------------------------- */ + +/* + * The general instruction format follows this pattern: + * .... XXX. .... .YYY + * where XXX is register X and YYY is register Y + */ +/* Data Register Isolation */ +#define DX (REG_D[(REG_IR >> 9) & 7]) +#define DY (REG_D[REG_IR & 7]) +/* Address Register Isolation */ +#define AX (REG_A[(REG_IR >> 9) & 7]) +#define AY (REG_A[REG_IR & 7]) + + +/* Effective Address Calculations */ +#define EA_AY_AI_8() AY /* address register indirect */ +#define EA_AY_AI_16() EA_AY_AI_8() +#define EA_AY_AI_32() EA_AY_AI_8() +#define EA_AY_PI_8() (AY++) /* postincrement (size = byte) */ +#define EA_AY_PI_16() ((AY+=2)-2) /* postincrement (size = word) */ +#define EA_AY_PI_32() ((AY+=4)-4) /* postincrement (size = long) */ +#define EA_AY_PD_8() (--AY) /* predecrement (size = byte) */ +#define EA_AY_PD_16() (AY-=2) /* predecrement (size = word) */ +#define EA_AY_PD_32() (AY-=4) /* predecrement (size = long) */ +#define EA_AY_DI_8() (AY+MAKE_INT_16(m68ki_read_imm_16())) /* displacement */ +#define EA_AY_DI_16() EA_AY_DI_8() +#define EA_AY_DI_32() EA_AY_DI_8() +#define EA_AY_IX_8() m68ki_get_ea_ix(AY) /* indirect + index */ +#define EA_AY_IX_16() EA_AY_IX_8() +#define EA_AY_IX_32() EA_AY_IX_8() + +#define EA_AX_AI_8() AX +#define EA_AX_AI_16() EA_AX_AI_8() +#define EA_AX_AI_32() EA_AX_AI_8() +#define EA_AX_PI_8() (AX++) +#define EA_AX_PI_16() ((AX+=2)-2) +#define EA_AX_PI_32() ((AX+=4)-4) +#define EA_AX_PD_8() (--AX) +#define EA_AX_PD_16() (AX-=2) +#define EA_AX_PD_32() (AX-=4) +#define EA_AX_DI_8() (AX+MAKE_INT_16(m68ki_read_imm_16())) +#define EA_AX_DI_16() EA_AX_DI_8() +#define EA_AX_DI_32() EA_AX_DI_8() +#define EA_AX_IX_8() m68ki_get_ea_ix(AX) +#define EA_AX_IX_16() EA_AX_IX_8() +#define EA_AX_IX_32() EA_AX_IX_8() + +#define EA_A7_PI_8() ((REG_A[7]+=2)-2) +#define EA_A7_PD_8() (REG_A[7]-=2) + +#define EA_AW_8() MAKE_INT_16(m68ki_read_imm_16()) /* absolute word */ +#define EA_AW_16() EA_AW_8() +#define EA_AW_32() EA_AW_8() +#define EA_AL_8() m68ki_read_imm_32() /* absolute long */ +#define EA_AL_16() EA_AL_8() +#define EA_AL_32() EA_AL_8() +#define EA_PCDI_8() m68ki_get_ea_pcdi() /* pc indirect + displacement */ +#define EA_PCDI_16() EA_PCDI_8() +#define EA_PCDI_32() EA_PCDI_8() +#define EA_PCIX_8() m68ki_get_ea_pcix() /* pc indirect + index */ +#define EA_PCIX_16() EA_PCIX_8() +#define EA_PCIX_32() EA_PCIX_8() + + +#define OPER_I_8() m68ki_read_imm_8() +#define OPER_I_16() m68ki_read_imm_16() +#define OPER_I_32() m68ki_read_imm_32() + + + +/* --------------------------- Status Register ---------------------------- */ + +/* Flag Calculation Macros */ +#define CFLAG_8(A) (A) +#define CFLAG_16(A) ((A)>>8) + +#if M68K_INT_GT_32_BIT + #define CFLAG_ADD_32(S, D, R) ((R)>>24) + #define CFLAG_SUB_32(S, D, R) ((R)>>24) +#else + #define CFLAG_ADD_32(S, D, R) (((S & D) | (~R & (S | D)))>>23) + #define CFLAG_SUB_32(S, D, R) (((S & R) | (~D & (S | R)))>>23) +#endif /* M68K_INT_GT_32_BIT */ + +#define VFLAG_ADD_8(S, D, R) ((S^R) & (D^R)) +#define VFLAG_ADD_16(S, D, R) (((S^R) & (D^R))>>8) +#define VFLAG_ADD_32(S, D, R) (((S^R) & (D^R))>>24) + +#define VFLAG_SUB_8(S, D, R) ((S^D) & (R^D)) +#define VFLAG_SUB_16(S, D, R) (((S^D) & (R^D))>>8) +#define VFLAG_SUB_32(S, D, R) (((S^D) & (R^D))>>24) + +#define NFLAG_8(A) (A) +#define NFLAG_16(A) ((A)>>8) +#define NFLAG_32(A) ((A)>>24) +#define NFLAG_64(A) ((A)>>56) + +#define ZFLAG_8(A) MASK_OUT_ABOVE_8(A) +#define ZFLAG_16(A) MASK_OUT_ABOVE_16(A) +#define ZFLAG_32(A) MASK_OUT_ABOVE_32(A) + + +/* Flag values */ +#define NFLAG_SET 0x80 +#define NFLAG_CLEAR 0 +#define CFLAG_SET 0x100 +#define CFLAG_CLEAR 0 +#define XFLAG_SET 0x100 +#define XFLAG_CLEAR 0 +#define VFLAG_SET 0x80 +#define VFLAG_CLEAR 0 +#define ZFLAG_SET 0 +#define ZFLAG_CLEAR 0xffffffff + +#define SFLAG_SET 4 +#define SFLAG_CLEAR 0 +#define MFLAG_SET 2 +#define MFLAG_CLEAR 0 + +/* Turn flag values into 1 or 0 */ +#define XFLAG_AS_1() ((FLAG_X>>8)&1) +#define NFLAG_AS_1() ((FLAG_N>>7)&1) +#define VFLAG_AS_1() ((FLAG_V>>7)&1) +#define ZFLAG_AS_1() (!FLAG_Z) +#define CFLAG_AS_1() ((FLAG_C>>8)&1) + + +/* Conditions */ +#define COND_CS() (FLAG_C&0x100) +#define COND_CC() (!COND_CS()) +#define COND_VS() (FLAG_V&0x80) +#define COND_VC() (!COND_VS()) +#define COND_NE() FLAG_Z +#define COND_EQ() (!COND_NE()) +#define COND_MI() (FLAG_N&0x80) +#define COND_PL() (!COND_MI()) +#define COND_LT() ((FLAG_N^FLAG_V)&0x80) +#define COND_GE() (!COND_LT()) +#define COND_HI() (COND_CC() && COND_NE()) +#define COND_LS() (COND_CS() || COND_EQ()) +#define COND_GT() (COND_GE() && COND_NE()) +#define COND_LE() (COND_LT() || COND_EQ()) + +/* Reversed conditions */ +#define COND_NOT_CS() COND_CC() +#define COND_NOT_CC() COND_CS() +#define COND_NOT_VS() COND_VC() +#define COND_NOT_VC() COND_VS() +#define COND_NOT_NE() COND_EQ() +#define COND_NOT_EQ() COND_NE() +#define COND_NOT_MI() COND_PL() +#define COND_NOT_PL() COND_MI() +#define COND_NOT_LT() COND_GE() +#define COND_NOT_GE() COND_LT() +#define COND_NOT_HI() COND_LS() +#define COND_NOT_LS() COND_HI() +#define COND_NOT_GT() COND_LE() +#define COND_NOT_LE() COND_GT() + +/* Not real conditions, but here for convenience */ +#define COND_XS() (FLAG_X&0x100) +#define COND_XC() (!COND_XS) + + +/* Get the condition code register */ +#define m68ki_get_ccr() ((COND_XS() >> 4) | \ + (COND_MI() >> 4) | \ + (COND_EQ() << 2) | \ + (COND_VS() >> 6) | \ + (COND_CS() >> 8)) + +/* Get the status register */ +#define m68ki_get_sr() ( FLAG_T1 | \ + FLAG_T0 | \ + (FLAG_S << 11) | \ + (FLAG_M << 11) | \ + FLAG_INT_MASK | \ + m68ki_get_ccr()) + + + +/* ---------------------------- Cycle Counting ---------------------------- */ + +#define ADD_CYCLES(A) m68ki_remaining_cycles += (A) +#define USE_CYCLES(A) m68ki_remaining_cycles -= (A) +#define SET_CYCLES(A) m68ki_remaining_cycles = A +#define GET_CYCLES() m68ki_remaining_cycles +#define USE_ALL_CYCLES() m68ki_remaining_cycles = 0 + + + +/* ----------------------------- Read / Write ----------------------------- */ + +/* Read from the current address space */ +#define m68ki_read_8(A) m68ki_read_8_fc (A, FLAG_S | m68ki_get_address_space()) +#define m68ki_read_16(A) m68ki_read_16_fc(A, FLAG_S | m68ki_get_address_space()) +#define m68ki_read_32(A) m68ki_read_32_fc(A, FLAG_S | m68ki_get_address_space()) + +/* Write to the current data space */ +#define m68ki_write_8(A, V) m68ki_write_8_fc (A, FLAG_S | FUNCTION_CODE_USER_DATA, V) +#define m68ki_write_16(A, V) m68ki_write_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V) +#define m68ki_write_32(A, V) m68ki_write_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V) + +#if M68K_SIMULATE_PD_WRITES +#define m68ki_write_32_pd(A, V) m68ki_write_32_pd_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V) +#else +#define m68ki_write_32_pd(A, V) m68ki_write_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V) +#endif + +/* map read immediate 8 to read immediate 16 */ +#define m68ki_read_imm_8() MASK_OUT_ABOVE_8(m68ki_read_imm_16()) + +/* Map PC-relative reads */ +#define m68ki_read_pcrel_8(A) m68k_read_pcrelative_8(A) +#define m68ki_read_pcrel_16(A) m68k_read_pcrelative_16(A) +#define m68ki_read_pcrel_32(A) m68k_read_pcrelative_32(A) + +/* Read from the program space */ +#define m68ki_read_program_8(A) m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM) +#define m68ki_read_program_16(A) m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM) +#define m68ki_read_program_32(A) m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM) + +/* Read from the data space */ +#define m68ki_read_data_8(A) m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA) +#define m68ki_read_data_16(A) m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA) +#define m68ki_read_data_32(A) m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA) + + + +/* ======================================================================== */ +/* =============================== PROTOTYPES ============================= */ +/* ======================================================================== */ + +typedef union +{ + uint64 i; + double f; +} fp_reg; + +typedef struct +{ + uint cpu_type; /* CPU Type: 68000, 68008, 68010, 68EC020, or 68020 */ + uint dar[16]; /* Data and Address Registers */ + uint ppc; /* Previous program counter */ + uint pc; /* Program Counter */ + uint sp[7]; /* User, Interrupt, and Master Stack Pointers */ + uint vbr; /* Vector Base Register (m68010+) */ + uint sfc; /* Source Function Code Register (m68010+) */ + uint dfc; /* Destination Function Code Register (m68010+) */ + uint cacr; /* Cache Control Register (m68020, unemulated) */ + uint caar; /* Cache Address Register (m68020, unemulated) */ + uint ir; /* Instruction Register */ + fp_reg fpr[8]; /* FPU Data Register (m68040) */ + uint fpiar; /* FPU Instruction Address Register (m68040) */ + uint fpsr; /* FPU Status Register (m68040) */ + uint fpcr; /* FPU Control Register (m68040) */ + uint t1_flag; /* Trace 1 */ + uint t0_flag; /* Trace 0 */ + uint s_flag; /* Supervisor */ + uint m_flag; /* Master/Interrupt state */ + uint x_flag; /* Extend */ + uint n_flag; /* Negative */ + uint not_z_flag; /* Zero, inverted for speedups */ + uint v_flag; /* Overflow */ + uint c_flag; /* Carry */ + uint int_mask; /* I0-I2 */ + uint int_level; /* State of interrupt pins IPL0-IPL2 -- ASG: changed from ints_pending */ + uint int_cycles; /* ASG: extra cycles from generated interrupts */ + uint stopped; /* Stopped state */ + uint pref_addr; /* Last prefetch address */ + uint pref_data; /* Data in the prefetch queue */ + uint address_mask; /* Available address pins */ + uint sr_mask; /* Implemented status register bits */ + uint instr_mode; /* Stores whether we are in instruction mode or group 0/1 exception mode */ + uint run_mode; /* Stores whether we are processing a reset, bus error, address error, or something else */ + + /* Clocks required for instructions / exceptions */ + uint cyc_bcc_notake_b; + uint cyc_bcc_notake_w; + uint cyc_dbcc_f_noexp; + uint cyc_dbcc_f_exp; + uint cyc_scc_r_true; + uint cyc_movem_w; + uint cyc_movem_l; + uint cyc_shift; + uint cyc_reset; + const uint8* cyc_instruction; + const uint8* cyc_exception; + + /* Callbacks to host */ + int (*int_ack_callback)(int int_line); /* Interrupt Acknowledge */ + void (*bkpt_ack_callback)(unsigned int data); /* Breakpoint Acknowledge */ + void (*reset_instr_callback)(void); /* Called when a RESET instruction is encountered */ + void (*cmpild_instr_callback)(unsigned int, int); /* Called when a CMPI.L #v, Dn instruction is encountered */ + void (*rte_instr_callback)(void); /* Called when a RTE instruction is encountered */ + int (*tas_instr_callback)(void); /* Called when a TAS instruction is encountered, allows / disallows writeback */ + void (*pc_changed_callback)(unsigned int new_pc); /* Called when the PC changes by a large amount */ + void (*set_fc_callback)(unsigned int new_fc); /* Called when the CPU function code changes */ + void (*instr_hook_callback)(unsigned int pc); /* Called every instruction cycle prior to execution */ + +} m68ki_cpu_core; + + +extern m68ki_cpu_core m68ki_cpu; +extern sint m68ki_remaining_cycles; +extern uint m68ki_tracing; +extern const uint8 m68ki_shift_8_table[]; +extern const uint16 m68ki_shift_16_table[]; +extern const uint m68ki_shift_32_table[]; +extern const uint8 m68ki_exception_cycle_table[][256]; +extern uint m68ki_address_space; +extern const uint8 m68ki_ea_idx_cycle_table[]; + +extern uint m68ki_aerr_address; +extern uint m68ki_aerr_write_mode; +extern uint m68ki_aerr_fc; + +/* Read data immediately after the program counter */ +INLINE uint m68ki_read_imm_16(void); +INLINE uint m68ki_read_imm_32(void); + +/* Read data with specific function code */ +INLINE uint m68ki_read_8_fc (uint address, uint fc); +INLINE uint m68ki_read_16_fc (uint address, uint fc); +INLINE uint m68ki_read_32_fc (uint address, uint fc); + +/* Write data with specific function code */ +INLINE void m68ki_write_8_fc (uint address, uint fc, uint value); +INLINE void m68ki_write_16_fc(uint address, uint fc, uint value); +INLINE void m68ki_write_32_fc(uint address, uint fc, uint value); +#if M68K_SIMULATE_PD_WRITES +INLINE void m68ki_write_32_pd_fc(uint address, uint fc, uint value); +#endif /* M68K_SIMULATE_PD_WRITES */ + +/* Indexed and PC-relative ea fetching */ +INLINE uint m68ki_get_ea_pcdi(void); +INLINE uint m68ki_get_ea_pcix(void); +INLINE uint m68ki_get_ea_ix(uint An); + +/* Operand fetching */ +INLINE uint OPER_AY_AI_8(void); +INLINE uint OPER_AY_AI_16(void); +INLINE uint OPER_AY_AI_32(void); +INLINE uint OPER_AY_PI_8(void); +INLINE uint OPER_AY_PI_16(void); +INLINE uint OPER_AY_PI_32(void); +INLINE uint OPER_AY_PD_8(void); +INLINE uint OPER_AY_PD_16(void); +INLINE uint OPER_AY_PD_32(void); +INLINE uint OPER_AY_DI_8(void); +INLINE uint OPER_AY_DI_16(void); +INLINE uint OPER_AY_DI_32(void); +INLINE uint OPER_AY_IX_8(void); +INLINE uint OPER_AY_IX_16(void); +INLINE uint OPER_AY_IX_32(void); + +INLINE uint OPER_AX_AI_8(void); +INLINE uint OPER_AX_AI_16(void); +INLINE uint OPER_AX_AI_32(void); +INLINE uint OPER_AX_PI_8(void); +INLINE uint OPER_AX_PI_16(void); +INLINE uint OPER_AX_PI_32(void); +INLINE uint OPER_AX_PD_8(void); +INLINE uint OPER_AX_PD_16(void); +INLINE uint OPER_AX_PD_32(void); +INLINE uint OPER_AX_DI_8(void); +INLINE uint OPER_AX_DI_16(void); +INLINE uint OPER_AX_DI_32(void); +INLINE uint OPER_AX_IX_8(void); +INLINE uint OPER_AX_IX_16(void); +INLINE uint OPER_AX_IX_32(void); + +INLINE uint OPER_A7_PI_8(void); +INLINE uint OPER_A7_PD_8(void); + +INLINE uint OPER_AW_8(void); +INLINE uint OPER_AW_16(void); +INLINE uint OPER_AW_32(void); +INLINE uint OPER_AL_8(void); +INLINE uint OPER_AL_16(void); +INLINE uint OPER_AL_32(void); +INLINE uint OPER_PCDI_8(void); +INLINE uint OPER_PCDI_16(void); +INLINE uint OPER_PCDI_32(void); +INLINE uint OPER_PCIX_8(void); +INLINE uint OPER_PCIX_16(void); +INLINE uint OPER_PCIX_32(void); + +/* Stack operations */ +INLINE void m68ki_push_16(uint value); +INLINE void m68ki_push_32(uint value); +INLINE uint m68ki_pull_16(void); +INLINE uint m68ki_pull_32(void); + +/* Program flow operations */ +INLINE void m68ki_jump(uint new_pc); +INLINE void m68ki_jump_vector(uint vector); +INLINE void m68ki_branch_8(uint offset); +INLINE void m68ki_branch_16(uint offset); +INLINE void m68ki_branch_32(uint offset); + +/* Status register operations. */ +INLINE void m68ki_set_s_flag(uint value); /* Only bit 2 of value should be set (i.e. 4 or 0) */ +INLINE void m68ki_set_sm_flag(uint value); /* only bits 1 and 2 of value should be set */ +INLINE void m68ki_set_ccr(uint value); /* set the condition code register */ +INLINE void m68ki_set_sr(uint value); /* set the status register */ +INLINE void m68ki_set_sr_noint(uint value); /* set the status register */ + +/* Exception processing */ +INLINE uint m68ki_init_exception(void); /* Initial exception processing */ + +INLINE void m68ki_stack_frame_3word(uint pc, uint sr); /* Stack various frame types */ +INLINE void m68ki_stack_frame_buserr(uint sr); + +INLINE void m68ki_stack_frame_0000(uint pc, uint sr, uint vector); +INLINE void m68ki_stack_frame_0001(uint pc, uint sr, uint vector); +INLINE void m68ki_stack_frame_0010(uint sr, uint vector); +INLINE void m68ki_stack_frame_1000(uint pc, uint sr, uint vector); +INLINE void m68ki_stack_frame_1010(uint sr, uint vector, uint pc); +INLINE void m68ki_stack_frame_1011(uint sr, uint vector, uint pc); + +INLINE void m68ki_exception_trap(uint vector); +INLINE void m68ki_exception_trapN(uint vector); +INLINE void m68ki_exception_trace(void); +INLINE void m68ki_exception_privilege_violation(void); +INLINE void m68ki_exception_1010(void); +INLINE void m68ki_exception_1111(void); +INLINE void m68ki_exception_illegal(void); +INLINE void m68ki_exception_format_error(void); +INLINE void m68ki_exception_address_error(void); +INLINE void m68ki_exception_interrupt(uint int_level); +INLINE void m68ki_check_interrupts(void); /* ASG: check for interrupts */ + +/* quick disassembly (used for logging) */ +char* m68ki_disassemble_quick(unsigned int pc, unsigned int cpu_type); + + +/* ======================================================================== */ +/* =========================== UTILITY FUNCTIONS ========================== */ +/* ======================================================================== */ + + +/* ---------------------------- Read Immediate ---------------------------- */ + +/* Handles all immediate reads, does address error check, function code setting, + * and prefetching if they are enabled in m68kconf.h + */ +INLINE uint m68ki_read_imm_16(void) +{ + m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */ + m68ki_check_address_error(REG_PC, MODE_READ, FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */ +#if M68K_EMULATE_PREFETCH + if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR) + { + CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC); + CPU_PREF_DATA = m68k_read_immediate_32(ADDRESS_68K(CPU_PREF_ADDR)); + } + REG_PC += 2; + return MASK_OUT_ABOVE_16(CPU_PREF_DATA >> ((2-((REG_PC-2)&2))<<3)); +#else + REG_PC += 2; + return m68k_read_immediate_16(ADDRESS_68K(REG_PC-2)); +#endif /* M68K_EMULATE_PREFETCH */ +} +INLINE uint m68ki_read_imm_32(void) +{ +#if M68K_EMULATE_PREFETCH + uint temp_val; + + m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */ + m68ki_check_address_error(REG_PC, MODE_READ, FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */ + if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR) + { + CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC); + CPU_PREF_DATA = m68k_read_immediate_32(ADDRESS_68K(CPU_PREF_ADDR)); + } + temp_val = CPU_PREF_DATA; + REG_PC += 2; + if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR) + { + CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC); + CPU_PREF_DATA = m68k_read_immediate_32(ADDRESS_68K(CPU_PREF_ADDR)); + temp_val = MASK_OUT_ABOVE_32((temp_val << 16) | (CPU_PREF_DATA >> 16)); + } + REG_PC += 2; + + return temp_val; +#else + m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */ + m68ki_check_address_error(REG_PC, MODE_READ, FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */ + REG_PC += 4; + return m68k_read_immediate_32(ADDRESS_68K(REG_PC-4)); +#endif /* M68K_EMULATE_PREFETCH */ +} + + + +/* ------------------------- Top level read/write ------------------------- */ + +/* Handles all memory accesses (except for immediate reads if they are + * configured to use separate functions in m68kconf.h). + * All memory accesses must go through these top level functions. + * These functions will also check for address error and set the function + * code if they are enabled in m68kconf.h. + */ +INLINE uint m68ki_read_8_fc(uint address, uint fc) +{ + m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */ + return m68k_read_memory_8(ADDRESS_68K(address)); +} +INLINE uint m68ki_read_16_fc(uint address, uint fc) +{ + m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */ + m68ki_check_address_error_010_less(address, MODE_READ, fc); /* auto-disable (see m68kcpu.h) */ + return m68k_read_memory_16(ADDRESS_68K(address)); +} +INLINE uint m68ki_read_32_fc(uint address, uint fc) +{ + m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */ + m68ki_check_address_error_010_less(address, MODE_READ, fc); /* auto-disable (see m68kcpu.h) */ + return m68k_read_memory_32(ADDRESS_68K(address)); +} + +INLINE void m68ki_write_8_fc(uint address, uint fc, uint value) +{ + m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */ + m68k_write_memory_8(ADDRESS_68K(address), value); +} +INLINE void m68ki_write_16_fc(uint address, uint fc, uint value) +{ + m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */ + m68ki_check_address_error_010_less(address, MODE_WRITE, fc); /* auto-disable (see m68kcpu.h) */ + m68k_write_memory_16(ADDRESS_68K(address), value); +} +INLINE void m68ki_write_32_fc(uint address, uint fc, uint value) +{ + m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */ + m68ki_check_address_error_010_less(address, MODE_WRITE, fc); /* auto-disable (see m68kcpu.h) */ + m68k_write_memory_32(ADDRESS_68K(address), value); +} + +#if M68K_SIMULATE_PD_WRITES +INLINE void m68ki_write_32_pd_fc(uint address, uint fc, uint value) +{ + m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */ + m68ki_check_address_error_010_less(address, MODE_WRITE, fc); /* auto-disable (see m68kcpu.h) */ + m68k_write_memory_32_pd(ADDRESS_68K(address), value); +} +#endif + + +/* --------------------- Effective Address Calculation -------------------- */ + +/* The program counter relative addressing modes cause operands to be + * retrieved from program space, not data space. + */ +INLINE uint m68ki_get_ea_pcdi(void) +{ + uint old_pc = REG_PC; + m68ki_use_program_space(); /* auto-disable */ + return old_pc + MAKE_INT_16(m68ki_read_imm_16()); +} + + +INLINE uint m68ki_get_ea_pcix(void) +{ + m68ki_use_program_space(); /* auto-disable */ + return m68ki_get_ea_ix(REG_PC); +} + +/* Indexed addressing modes are encoded as follows: + * + * Base instruction format: + * F E D C B A 9 8 7 6 | 5 4 3 | 2 1 0 + * x x x x x x x x x x | 1 1 0 | BASE REGISTER (An) + * + * Base instruction format for destination EA in move instructions: + * F E D C | B A 9 | 8 7 6 | 5 4 3 2 1 0 + * x x x x | BASE REG | 1 1 0 | X X X X X X (An) + * + * Brief extension format: + * F | E D C | B | A 9 | 8 | 7 6 5 4 3 2 1 0 + * D/A | REGISTER | W/L | SCALE | 0 | DISPLACEMENT + * + * Full extension format: + * F E D C B A 9 8 7 6 5 4 3 2 1 0 + * D/A | REGISTER | W/L | SCALE | 1 | BS | IS | BD SIZE | 0 | I/IS + * BASE DISPLACEMENT (0, 16, 32 bit) (bd) + * OUTER DISPLACEMENT (0, 16, 32 bit) (od) + * + * D/A: 0 = Dn, 1 = An (Xn) + * W/L: 0 = W (sign extend), 1 = L (.SIZE) + * SCALE: 00=1, 01=2, 10=4, 11=8 (*SCALE) + * BS: 0=add base reg, 1=suppress base reg (An suppressed) + * IS: 0=add index, 1=suppress index (Xn suppressed) + * BD SIZE: 00=reserved, 01=NULL, 10=Word, 11=Long (size of bd) + * + * IS I/IS Operation + * 0 000 No Memory Indirect + * 0 001 indir prex with null outer + * 0 010 indir prex with word outer + * 0 011 indir prex with long outer + * 0 100 reserved + * 0 101 indir postx with null outer + * 0 110 indir postx with word outer + * 0 111 indir postx with long outer + * 1 000 no memory indirect + * 1 001 mem indir with null outer + * 1 010 mem indir with word outer + * 1 011 mem indir with long outer + * 1 100-111 reserved + */ +INLINE uint m68ki_get_ea_ix(uint An) +{ + /* An = base register */ + uint extension = m68ki_read_imm_16(); + uint Xn = 0; /* Index register */ + uint bd = 0; /* Base Displacement */ + uint od = 0; /* Outer Displacement */ + + if(CPU_TYPE_IS_010_LESS(CPU_TYPE)) + { + /* Calculate index */ + Xn = REG_DA[extension>>12]; /* Xn */ + if(!BIT_B(extension)) /* W/L */ + Xn = MAKE_INT_16(Xn); + + /* Add base register and displacement and return */ + return An + Xn + MAKE_INT_8(extension); + } + + /* Brief extension format */ + if(!BIT_8(extension)) + { + /* Calculate index */ + Xn = REG_DA[extension>>12]; /* Xn */ + if(!BIT_B(extension)) /* W/L */ + Xn = MAKE_INT_16(Xn); + /* Add scale if proper CPU type */ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + Xn <<= (extension>>9) & 3; /* SCALE */ + + /* Add base register and displacement and return */ + return An + Xn + MAKE_INT_8(extension); + } + + /* Full extension format */ + + USE_CYCLES(m68ki_ea_idx_cycle_table[extension&0x3f]); + + /* Check if base register is present */ + if(BIT_7(extension)) /* BS */ + An = 0; /* An */ + + /* Check if index is present */ + if(!BIT_6(extension)) /* IS */ + { + Xn = REG_DA[extension>>12]; /* Xn */ + if(!BIT_B(extension)) /* W/L */ + Xn = MAKE_INT_16(Xn); + Xn <<= (extension>>9) & 3; /* SCALE */ + } + + /* Check if base displacement is present */ + if(BIT_5(extension)) /* BD SIZE */ + bd = BIT_4(extension) ? m68ki_read_imm_32() : MAKE_INT_16(m68ki_read_imm_16()); + + /* If no indirect action, we are done */ + if(!(extension&7)) /* No Memory Indirect */ + return An + bd + Xn; + + /* Check if outer displacement is present */ + if(BIT_1(extension)) /* I/IS: od */ + od = BIT_0(extension) ? m68ki_read_imm_32() : MAKE_INT_16(m68ki_read_imm_16()); + + /* Postindex */ + if(BIT_2(extension)) /* I/IS: 0 = preindex, 1 = postindex */ + return m68ki_read_32(An + bd) + Xn + od; + + /* Preindex */ + return m68ki_read_32(An + bd + Xn) + od; +} + + +/* Fetch operands */ +INLINE uint OPER_AY_AI_8(void) {uint ea = EA_AY_AI_8(); return m68ki_read_8(ea); } +INLINE uint OPER_AY_AI_16(void) {uint ea = EA_AY_AI_16(); return m68ki_read_16(ea);} +INLINE uint OPER_AY_AI_32(void) {uint ea = EA_AY_AI_32(); return m68ki_read_32(ea);} +INLINE uint OPER_AY_PI_8(void) {uint ea = EA_AY_PI_8(); return m68ki_read_8(ea); } +INLINE uint OPER_AY_PI_16(void) {uint ea = EA_AY_PI_16(); return m68ki_read_16(ea);} +INLINE uint OPER_AY_PI_32(void) {uint ea = EA_AY_PI_32(); return m68ki_read_32(ea);} +INLINE uint OPER_AY_PD_8(void) {uint ea = EA_AY_PD_8(); return m68ki_read_8(ea); } +INLINE uint OPER_AY_PD_16(void) {uint ea = EA_AY_PD_16(); return m68ki_read_16(ea);} +INLINE uint OPER_AY_PD_32(void) {uint ea = EA_AY_PD_32(); return m68ki_read_32(ea);} +INLINE uint OPER_AY_DI_8(void) {uint ea = EA_AY_DI_8(); return m68ki_read_8(ea); } +INLINE uint OPER_AY_DI_16(void) {uint ea = EA_AY_DI_16(); return m68ki_read_16(ea);} +INLINE uint OPER_AY_DI_32(void) {uint ea = EA_AY_DI_32(); return m68ki_read_32(ea);} +INLINE uint OPER_AY_IX_8(void) {uint ea = EA_AY_IX_8(); return m68ki_read_8(ea); } +INLINE uint OPER_AY_IX_16(void) {uint ea = EA_AY_IX_16(); return m68ki_read_16(ea);} +INLINE uint OPER_AY_IX_32(void) {uint ea = EA_AY_IX_32(); return m68ki_read_32(ea);} + +INLINE uint OPER_AX_AI_8(void) {uint ea = EA_AX_AI_8(); return m68ki_read_8(ea); } +INLINE uint OPER_AX_AI_16(void) {uint ea = EA_AX_AI_16(); return m68ki_read_16(ea);} +INLINE uint OPER_AX_AI_32(void) {uint ea = EA_AX_AI_32(); return m68ki_read_32(ea);} +INLINE uint OPER_AX_PI_8(void) {uint ea = EA_AX_PI_8(); return m68ki_read_8(ea); } +INLINE uint OPER_AX_PI_16(void) {uint ea = EA_AX_PI_16(); return m68ki_read_16(ea);} +INLINE uint OPER_AX_PI_32(void) {uint ea = EA_AX_PI_32(); return m68ki_read_32(ea);} +INLINE uint OPER_AX_PD_8(void) {uint ea = EA_AX_PD_8(); return m68ki_read_8(ea); } +INLINE uint OPER_AX_PD_16(void) {uint ea = EA_AX_PD_16(); return m68ki_read_16(ea);} +INLINE uint OPER_AX_PD_32(void) {uint ea = EA_AX_PD_32(); return m68ki_read_32(ea);} +INLINE uint OPER_AX_DI_8(void) {uint ea = EA_AX_DI_8(); return m68ki_read_8(ea); } +INLINE uint OPER_AX_DI_16(void) {uint ea = EA_AX_DI_16(); return m68ki_read_16(ea);} +INLINE uint OPER_AX_DI_32(void) {uint ea = EA_AX_DI_32(); return m68ki_read_32(ea);} +INLINE uint OPER_AX_IX_8(void) {uint ea = EA_AX_IX_8(); return m68ki_read_8(ea); } +INLINE uint OPER_AX_IX_16(void) {uint ea = EA_AX_IX_16(); return m68ki_read_16(ea);} +INLINE uint OPER_AX_IX_32(void) {uint ea = EA_AX_IX_32(); return m68ki_read_32(ea);} + +INLINE uint OPER_A7_PI_8(void) {uint ea = EA_A7_PI_8(); return m68ki_read_8(ea); } +INLINE uint OPER_A7_PD_8(void) {uint ea = EA_A7_PD_8(); return m68ki_read_8(ea); } + +INLINE uint OPER_AW_8(void) {uint ea = EA_AW_8(); return m68ki_read_8(ea); } +INLINE uint OPER_AW_16(void) {uint ea = EA_AW_16(); return m68ki_read_16(ea);} +INLINE uint OPER_AW_32(void) {uint ea = EA_AW_32(); return m68ki_read_32(ea);} +INLINE uint OPER_AL_8(void) {uint ea = EA_AL_8(); return m68ki_read_8(ea); } +INLINE uint OPER_AL_16(void) {uint ea = EA_AL_16(); return m68ki_read_16(ea);} +INLINE uint OPER_AL_32(void) {uint ea = EA_AL_32(); return m68ki_read_32(ea);} +INLINE uint OPER_PCDI_8(void) {uint ea = EA_PCDI_8(); return m68ki_read_pcrel_8(ea); } +INLINE uint OPER_PCDI_16(void) {uint ea = EA_PCDI_16(); return m68ki_read_pcrel_16(ea);} +INLINE uint OPER_PCDI_32(void) {uint ea = EA_PCDI_32(); return m68ki_read_pcrel_32(ea);} +INLINE uint OPER_PCIX_8(void) {uint ea = EA_PCIX_8(); return m68ki_read_pcrel_8(ea); } +INLINE uint OPER_PCIX_16(void) {uint ea = EA_PCIX_16(); return m68ki_read_pcrel_16(ea);} +INLINE uint OPER_PCIX_32(void) {uint ea = EA_PCIX_32(); return m68ki_read_pcrel_32(ea);} + + + +/* ---------------------------- Stack Functions --------------------------- */ + +/* Push/pull data from the stack */ +INLINE void m68ki_push_16(uint value) +{ + REG_SP = MASK_OUT_ABOVE_32(REG_SP - 2); + m68ki_write_16(REG_SP, value); +} + +INLINE void m68ki_push_32(uint value) +{ + REG_SP = MASK_OUT_ABOVE_32(REG_SP - 4); + m68ki_write_32(REG_SP, value); +} + +INLINE uint m68ki_pull_16(void) +{ + REG_SP = MASK_OUT_ABOVE_32(REG_SP + 2); + return m68ki_read_16(REG_SP-2); +} + +INLINE uint m68ki_pull_32(void) +{ + REG_SP = MASK_OUT_ABOVE_32(REG_SP + 4); + return m68ki_read_32(REG_SP-4); +} + + +/* Increment/decrement the stack as if doing a push/pull but + * don't do any memory access. + */ +INLINE void m68ki_fake_push_16(void) +{ + REG_SP = MASK_OUT_ABOVE_32(REG_SP - 2); +} + +INLINE void m68ki_fake_push_32(void) +{ + REG_SP = MASK_OUT_ABOVE_32(REG_SP - 4); +} + +INLINE void m68ki_fake_pull_16(void) +{ + REG_SP = MASK_OUT_ABOVE_32(REG_SP + 2); +} + +INLINE void m68ki_fake_pull_32(void) +{ + REG_SP = MASK_OUT_ABOVE_32(REG_SP + 4); +} + + +/* ----------------------------- Program Flow ----------------------------- */ + +/* Jump to a new program location or vector. + * These functions will also call the pc_changed callback if it was enabled + * in m68kconf.h. + */ +INLINE void m68ki_jump(uint new_pc) +{ + REG_PC = new_pc; + m68ki_pc_changed(REG_PC); +} + +INLINE void m68ki_jump_vector(uint vector) +{ + REG_PC = (vector<<2) + REG_VBR; + REG_PC = m68ki_read_data_32(REG_PC); + m68ki_pc_changed(REG_PC); +} + + +/* Branch to a new memory location. + * The 32-bit branch will call pc_changed if it was enabled in m68kconf.h. + * So far I've found no problems with not calling pc_changed for 8 or 16 + * bit branches. + */ +INLINE void m68ki_branch_8(uint offset) +{ + REG_PC += MAKE_INT_8(offset); +} + +INLINE void m68ki_branch_16(uint offset) +{ + REG_PC += MAKE_INT_16(offset); +} + +INLINE void m68ki_branch_32(uint offset) +{ + REG_PC += offset; + m68ki_pc_changed(REG_PC); +} + + + +/* ---------------------------- Status Register --------------------------- */ + +/* Set the S flag and change the active stack pointer. + * Note that value MUST be 4 or 0. + */ +INLINE void m68ki_set_s_flag(uint value) +{ + /* Backup the old stack pointer */ + REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)] = REG_SP; + /* Set the S flag */ + FLAG_S = value; + /* Set the new stack pointer */ + REG_SP = REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)]; +} + +/* Set the S and M flags and change the active stack pointer. + * Note that value MUST be 0, 2, 4, or 6 (bit2 = S, bit1 = M). + */ +INLINE void m68ki_set_sm_flag(uint value) +{ + /* Backup the old stack pointer */ + REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)] = REG_SP; + /* Set the S and M flags */ + FLAG_S = value & SFLAG_SET; + FLAG_M = value & MFLAG_SET; + /* Set the new stack pointer */ + REG_SP = REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)]; +} + +/* Set the S and M flags. Don't touch the stack pointer. */ +INLINE void m68ki_set_sm_flag_nosp(uint value) +{ + /* Set the S and M flags */ + FLAG_S = value & SFLAG_SET; + FLAG_M = value & MFLAG_SET; +} + + +/* Set the condition code register */ +INLINE void m68ki_set_ccr(uint value) +{ + FLAG_X = BIT_4(value) << 4; + FLAG_N = BIT_3(value) << 4; + FLAG_Z = !BIT_2(value); + FLAG_V = BIT_1(value) << 6; + FLAG_C = BIT_0(value) << 8; +} + +/* Set the status register but don't check for interrupts */ +INLINE void m68ki_set_sr_noint(uint value) +{ + /* Mask out the "unimplemented" bits */ + value &= CPU_SR_MASK; + + /* Now set the status register */ + FLAG_T1 = BIT_F(value); + FLAG_T0 = BIT_E(value); + FLAG_INT_MASK = value & 0x0700; + m68ki_set_ccr(value); + m68ki_set_sm_flag((value >> 11) & 6); +} + +/* Set the status register but don't check for interrupts nor + * change the stack pointer + */ +INLINE void m68ki_set_sr_noint_nosp(uint value) +{ + /* Mask out the "unimplemented" bits */ + value &= CPU_SR_MASK; + + /* Now set the status register */ + FLAG_T1 = BIT_F(value); + FLAG_T0 = BIT_E(value); + FLAG_INT_MASK = value & 0x0700; + m68ki_set_ccr(value); + m68ki_set_sm_flag_nosp((value >> 11) & 6); +} + +/* Set the status register and check for interrupts */ +INLINE void m68ki_set_sr(uint value) +{ + m68ki_set_sr_noint(value); + m68ki_check_interrupts(); +} + + +/* ------------------------- Exception Processing ------------------------- */ + +/* Initiate exception processing */ +INLINE uint m68ki_init_exception(void) +{ + /* Save the old status register */ + uint sr = m68ki_get_sr(); + + /* Turn off trace flag, clear pending traces */ + FLAG_T1 = FLAG_T0 = 0; + m68ki_clear_trace(); + /* Enter supervisor mode */ + m68ki_set_s_flag(SFLAG_SET); + + return sr; +} + +/* 3 word stack frame (68000 only) */ +INLINE void m68ki_stack_frame_3word(uint pc, uint sr) +{ + m68ki_push_32(pc); + m68ki_push_16(sr); +} + +/* Format 0 stack frame. + * This is the standard stack frame for 68010+. + */ +INLINE void m68ki_stack_frame_0000(uint pc, uint sr, uint vector) +{ + /* Stack a 3-word frame if we are 68000 */ + if(CPU_TYPE == CPU_TYPE_000 || CPU_TYPE == CPU_TYPE_008) + { + m68ki_stack_frame_3word(pc, sr); + return; + } + m68ki_push_16(vector<<2); + m68ki_push_32(pc); + m68ki_push_16(sr); +} + +/* Format 1 stack frame (68020). + * For 68020, this is the 4 word throwaway frame. + */ +INLINE void m68ki_stack_frame_0001(uint pc, uint sr, uint vector) +{ + m68ki_push_16(0x1000 | (vector<<2)); + m68ki_push_32(pc); + m68ki_push_16(sr); +} + +/* Format 2 stack frame. + * This is used only by 68020 for trap exceptions. + */ +INLINE void m68ki_stack_frame_0010(uint sr, uint vector) +{ + m68ki_push_32(REG_PPC); + m68ki_push_16(0x2000 | (vector<<2)); + m68ki_push_32(REG_PC); + m68ki_push_16(sr); +} + + +/* Bus error stack frame (68000 only). + */ +INLINE void m68ki_stack_frame_buserr(uint sr) +{ + m68ki_push_32(REG_PC); + m68ki_push_16(sr); + m68ki_push_16(REG_IR); + m68ki_push_32(m68ki_aerr_address); /* access address */ + /* 0 0 0 0 0 0 0 0 0 0 0 R/W I/N FC + * R/W 0 = write, 1 = read + * I/N 0 = instruction, 1 = not + * FC 3-bit function code + */ + m68ki_push_16(m68ki_aerr_write_mode | CPU_INSTR_MODE | m68ki_aerr_fc); +} + +/* Format 8 stack frame (68010). + * 68010 only. This is the 29 word bus/address error frame. + */ +void m68ki_stack_frame_1000(uint pc, uint sr, uint vector) +{ + /* VERSION + * NUMBER + * INTERNAL INFORMATION, 16 WORDS + */ + m68ki_fake_push_32(); + m68ki_fake_push_32(); + m68ki_fake_push_32(); + m68ki_fake_push_32(); + m68ki_fake_push_32(); + m68ki_fake_push_32(); + m68ki_fake_push_32(); + m68ki_fake_push_32(); + + /* INSTRUCTION INPUT BUFFER */ + m68ki_push_16(0); + + /* UNUSED, RESERVED (not written) */ + m68ki_fake_push_16(); + + /* DATA INPUT BUFFER */ + m68ki_push_16(0); + + /* UNUSED, RESERVED (not written) */ + m68ki_fake_push_16(); + + /* DATA OUTPUT BUFFER */ + m68ki_push_16(0); + + /* UNUSED, RESERVED (not written) */ + m68ki_fake_push_16(); + + /* FAULT ADDRESS */ + m68ki_push_32(0); + + /* SPECIAL STATUS WORD */ + m68ki_push_16(0); + + /* 1000, VECTOR OFFSET */ + m68ki_push_16(0x8000 | (vector<<2)); + + /* PROGRAM COUNTER */ + m68ki_push_32(pc); + + /* STATUS REGISTER */ + m68ki_push_16(sr); +} + +/* Format A stack frame (short bus fault). + * This is used only by 68020 for bus fault and address error + * if the error happens at an instruction boundary. + * PC stacked is address of next instruction. + */ +void m68ki_stack_frame_1010(uint sr, uint vector, uint pc) +{ + /* INTERNAL REGISTER */ + m68ki_push_16(0); + + /* INTERNAL REGISTER */ + m68ki_push_16(0); + + /* DATA OUTPUT BUFFER (2 words) */ + m68ki_push_32(0); + + /* INTERNAL REGISTER */ + m68ki_push_16(0); + + /* INTERNAL REGISTER */ + m68ki_push_16(0); + + /* DATA CYCLE FAULT ADDRESS (2 words) */ + m68ki_push_32(0); + + /* INSTRUCTION PIPE STAGE B */ + m68ki_push_16(0); + + /* INSTRUCTION PIPE STAGE C */ + m68ki_push_16(0); + + /* SPECIAL STATUS REGISTER */ + m68ki_push_16(0); + + /* INTERNAL REGISTER */ + m68ki_push_16(0); + + /* 1010, VECTOR OFFSET */ + m68ki_push_16(0xa000 | (vector<<2)); + + /* PROGRAM COUNTER */ + m68ki_push_32(pc); + + /* STATUS REGISTER */ + m68ki_push_16(sr); +} + +/* Format B stack frame (long bus fault). + * This is used only by 68020 for bus fault and address error + * if the error happens during instruction execution. + * PC stacked is address of instruction in progress. + */ +void m68ki_stack_frame_1011(uint sr, uint vector, uint pc) +{ + /* INTERNAL REGISTERS (18 words) */ + m68ki_push_32(0); + m68ki_push_32(0); + m68ki_push_32(0); + m68ki_push_32(0); + m68ki_push_32(0); + m68ki_push_32(0); + m68ki_push_32(0); + m68ki_push_32(0); + m68ki_push_32(0); + + /* VERSION# (4 bits), INTERNAL INFORMATION */ + m68ki_push_16(0); + + /* INTERNAL REGISTERS (3 words) */ + m68ki_push_32(0); + m68ki_push_16(0); + + /* DATA INTPUT BUFFER (2 words) */ + m68ki_push_32(0); + + /* INTERNAL REGISTERS (2 words) */ + m68ki_push_32(0); + + /* STAGE B ADDRESS (2 words) */ + m68ki_push_32(0); + + /* INTERNAL REGISTER (4 words) */ + m68ki_push_32(0); + m68ki_push_32(0); + + /* DATA OUTPUT BUFFER (2 words) */ + m68ki_push_32(0); + + /* INTERNAL REGISTER */ + m68ki_push_16(0); + + /* INTERNAL REGISTER */ + m68ki_push_16(0); + + /* DATA CYCLE FAULT ADDRESS (2 words) */ + m68ki_push_32(0); + + /* INSTRUCTION PIPE STAGE B */ + m68ki_push_16(0); + + /* INSTRUCTION PIPE STAGE C */ + m68ki_push_16(0); + + /* SPECIAL STATUS REGISTER */ + m68ki_push_16(0); + + /* INTERNAL REGISTER */ + m68ki_push_16(0); + + /* 1011, VECTOR OFFSET */ + m68ki_push_16(0xb000 | (vector<<2)); + + /* PROGRAM COUNTER */ + m68ki_push_32(pc); + + /* STATUS REGISTER */ + m68ki_push_16(sr); +} + + +/* Used for Group 2 exceptions. + * These stack a type 2 frame on the 020. + */ +INLINE void m68ki_exception_trap(uint vector) +{ + uint sr = m68ki_init_exception(); + + if(CPU_TYPE_IS_010_LESS(CPU_TYPE)) + m68ki_stack_frame_0000(REG_PC, sr, vector); + else + m68ki_stack_frame_0010(sr, vector); + + m68ki_jump_vector(vector); + + /* Use up some clock cycles */ + USE_CYCLES(CYC_EXCEPTION[vector]); +} + +/* Trap#n stacks a 0 frame but behaves like group2 otherwise */ +INLINE void m68ki_exception_trapN(uint vector) +{ + uint sr = m68ki_init_exception(); + m68ki_stack_frame_0000(REG_PC, sr, vector); + m68ki_jump_vector(vector); + + /* Use up some clock cycles */ + USE_CYCLES(CYC_EXCEPTION[vector]); +} + +/* Exception for trace mode */ +INLINE void m68ki_exception_trace(void) +{ + uint sr = m68ki_init_exception(); + + if(CPU_TYPE_IS_010_LESS(CPU_TYPE)) + { + #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON + if(CPU_TYPE_IS_000(CPU_TYPE)) + { + CPU_INSTR_MODE = INSTRUCTION_NO; + } + #endif /* M68K_EMULATE_ADDRESS_ERROR */ + m68ki_stack_frame_0000(REG_PC, sr, EXCEPTION_TRACE); + } + else + m68ki_stack_frame_0010(sr, EXCEPTION_TRACE); + + m68ki_jump_vector(EXCEPTION_TRACE); + + /* Trace nullifies a STOP instruction */ + CPU_STOPPED &= ~STOP_LEVEL_STOP; + + /* Use up some clock cycles */ + USE_CYCLES(CYC_EXCEPTION[EXCEPTION_TRACE]); +} + +/* Exception for privilege violation */ +INLINE void m68ki_exception_privilege_violation(void) +{ + uint sr = m68ki_init_exception(); + + #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON + if(CPU_TYPE_IS_000(CPU_TYPE)) + { + CPU_INSTR_MODE = INSTRUCTION_NO; + } + #endif /* M68K_EMULATE_ADDRESS_ERROR */ + + m68ki_stack_frame_0000(REG_PPC, sr, EXCEPTION_PRIVILEGE_VIOLATION); + m68ki_jump_vector(EXCEPTION_PRIVILEGE_VIOLATION); + + /* Use up some clock cycles and undo the instruction's cycles */ + USE_CYCLES(CYC_EXCEPTION[EXCEPTION_PRIVILEGE_VIOLATION] - CYC_INSTRUCTION[REG_IR]); +} + +/* Exception for A-Line instructions */ +INLINE void m68ki_exception_1010(void) +{ + uint sr; +#if M68K_LOG_1010_1111 == OPT_ON + M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: called 1010 instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PPC), REG_IR, + m68ki_disassemble_quick(ADDRESS_68K(REG_PPC)))); +#endif + + sr = m68ki_init_exception(); + m68ki_stack_frame_0000(REG_PPC, sr, EXCEPTION_1010); + m68ki_jump_vector(EXCEPTION_1010); + + /* Use up some clock cycles and undo the instruction's cycles */ + USE_CYCLES(CYC_EXCEPTION[EXCEPTION_1010] - CYC_INSTRUCTION[REG_IR]); +} + +/* Exception for F-Line instructions */ +INLINE void m68ki_exception_1111(void) +{ + uint sr; + +#if M68K_LOG_1010_1111 == OPT_ON + M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: called 1111 instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PPC), REG_IR, + m68ki_disassemble_quick(ADDRESS_68K(REG_PPC)))); +#endif + + sr = m68ki_init_exception(); + m68ki_stack_frame_0000(REG_PPC, sr, EXCEPTION_1111); + m68ki_jump_vector(EXCEPTION_1111); + + /* Use up some clock cycles and undo the instruction's cycles */ + USE_CYCLES(CYC_EXCEPTION[EXCEPTION_1111] - CYC_INSTRUCTION[REG_IR]); +} + +/* Exception for illegal instructions */ +INLINE void m68ki_exception_illegal(void) +{ + uint sr; + + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: illegal instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PPC), REG_IR, + m68ki_disassemble_quick(ADDRESS_68K(REG_PPC)))); + + sr = m68ki_init_exception(); + + #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON + if(CPU_TYPE_IS_000(CPU_TYPE)) + { + CPU_INSTR_MODE = INSTRUCTION_NO; + } + #endif /* M68K_EMULATE_ADDRESS_ERROR */ + + m68ki_stack_frame_0000(REG_PPC, sr, EXCEPTION_ILLEGAL_INSTRUCTION); + m68ki_jump_vector(EXCEPTION_ILLEGAL_INSTRUCTION); + + /* Use up some clock cycles and undo the instruction's cycles */ + USE_CYCLES(CYC_EXCEPTION[EXCEPTION_ILLEGAL_INSTRUCTION] - CYC_INSTRUCTION[REG_IR]); +} + +/* Exception for format errror in RTE */ +INLINE void m68ki_exception_format_error(void) +{ + uint sr = m68ki_init_exception(); + m68ki_stack_frame_0000(REG_PC, sr, EXCEPTION_FORMAT_ERROR); + m68ki_jump_vector(EXCEPTION_FORMAT_ERROR); + + /* Use up some clock cycles and undo the instruction's cycles */ + USE_CYCLES(CYC_EXCEPTION[EXCEPTION_FORMAT_ERROR] - CYC_INSTRUCTION[REG_IR]); +} + +/* Exception for address error */ +INLINE void m68ki_exception_address_error(void) +{ + uint sr = m68ki_init_exception(); + + /* If we were processing a bus error, address error, or reset, + * this is a catastrophic failure. + * Halt the CPU + */ + if(CPU_RUN_MODE == RUN_MODE_BERR_AERR_RESET) + { + m68k_read_memory_8(0x00ffff01); + CPU_STOPPED = STOP_LEVEL_HALT; + return; + } + CPU_RUN_MODE = RUN_MODE_BERR_AERR_RESET; + + /* Note: This is implemented for 68000 only! */ + m68ki_stack_frame_buserr(sr); + + m68ki_jump_vector(EXCEPTION_ADDRESS_ERROR); + + /* Use up some clock cycles and undo the instruction's cycles */ + USE_CYCLES(CYC_EXCEPTION[EXCEPTION_ADDRESS_ERROR] - CYC_INSTRUCTION[REG_IR]); +} + + +/* Service an interrupt request and start exception processing */ +void m68ki_exception_interrupt(uint int_level) +{ + uint vector; + uint sr; + uint new_pc; + + #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON + if(CPU_TYPE_IS_000(CPU_TYPE)) + { + CPU_INSTR_MODE = INSTRUCTION_NO; + } + #endif /* M68K_EMULATE_ADDRESS_ERROR */ + + /* Turn off the stopped state */ + CPU_STOPPED &= ~STOP_LEVEL_STOP; + + /* If we are halted, don't do anything */ + if(CPU_STOPPED) + return; + + /* Acknowledge the interrupt */ + vector = m68ki_int_ack(int_level); + + /* Get the interrupt vector */ + if(vector == M68K_INT_ACK_AUTOVECTOR) + /* Use the autovectors. This is the most commonly used implementation */ + vector = EXCEPTION_INTERRUPT_AUTOVECTOR+int_level; + else if(vector == M68K_INT_ACK_SPURIOUS) + /* Called if no devices respond to the interrupt acknowledge */ + vector = EXCEPTION_SPURIOUS_INTERRUPT; + else if(vector > 255) + { + M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: Interrupt acknowledge returned invalid vector $%x\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC), vector)); + return; + } + + /* Start exception processing */ + sr = m68ki_init_exception(); + + /* Set the interrupt mask to the level of the one being serviced */ + FLAG_INT_MASK = int_level<<8; + + /* Get the new PC */ + new_pc = m68ki_read_data_32((vector<<2) + REG_VBR); + + /* If vector is uninitialized, call the uninitialized interrupt vector */ + if(new_pc == 0) + new_pc = m68ki_read_data_32((EXCEPTION_UNINITIALIZED_INTERRUPT<<2) + REG_VBR); + + /* Generate a stack frame */ + m68ki_stack_frame_0000(REG_PC, sr, vector); + if(FLAG_M && CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + /* Create throwaway frame */ + m68ki_set_sm_flag(FLAG_S); /* clear M */ + sr |= 0x2000; /* Same as SR in master stack frame except S is forced high */ + m68ki_stack_frame_0001(REG_PC, sr, vector); + } + + m68ki_jump(new_pc); + + /* Defer cycle counting until later */ + CPU_INT_CYCLES += CYC_EXCEPTION[vector]; + +//#if !M68K_EMULATE_INT_ACK + /* Automatically clear IRQ if we are not using an acknowledge scheme */ + CPU_INT_LEVEL = 0; +//#endif /* M68K_EMULATE_INT_ACK */ +} + + +/* ASG: Check for interrupts */ +INLINE void m68ki_check_interrupts(void) +{ + if(CPU_INT_LEVEL > FLAG_INT_MASK) + m68ki_exception_interrupt(CPU_INT_LEVEL>>8); +} + + + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ + +#endif /* M68KCPU__HEADER */ diff --git a/source/m68k/m68kopac.c b/source/m68k/m68kopac.c deleted file mode 100644 index d1ed933..0000000 --- a/source/m68k/m68kopac.c +++ /dev/null @@ -1,11948 +0,0 @@ -#include "m68kcpu.h" - -/* ======================================================================== */ -/* ========================= INSTRUCTION HANDLERS ========================= */ -/* ======================================================================== */ - - -void m68k_op_1010(void) -{ - m68ki_exception_1010(); -} - - -void m68k_op_1111(void) -{ - m68ki_exception_1111(); -} - - -void m68k_op_abcd_8_rr(void) -{ - uint* r_dst = &DX; - uint src = DY; - uint dst = *r_dst; - uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); - - if(res > 9) - res += 6; - res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); - FLAG_X = FLAG_C = (res > 0x99) << 8; - if(FLAG_C) - res -= 0xa0; - - FLAG_N = NFLAG_8(res); /* officially undefined */ - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; -} - - -void m68k_op_abcd_8_mm_ax7(void) -{ - uint src = OPER_AY_PD_8(); - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); - - if(res > 9) - res += 6; - res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); - FLAG_X = FLAG_C = (res > 0x99) << 8; - if(FLAG_C) - res -= 0xa0; - - FLAG_N = NFLAG_8(res); /* officially undefined */ - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_abcd_8_mm_ay7(void) -{ - uint src = OPER_A7_PD_8(); - uint ea = EA_AX_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); - - if(res > 9) - res += 6; - res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); - FLAG_X = FLAG_C = (res > 0x99) << 8; - if(FLAG_C) - res -= 0xa0; - - FLAG_N = NFLAG_8(res); /* officially undefined */ - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_abcd_8_mm_axy7(void) -{ - uint src = OPER_A7_PD_8(); - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); - - if(res > 9) - res += 6; - res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); - FLAG_X = FLAG_C = (res > 0x99) << 8; - if(FLAG_C) - res -= 0xa0; - - FLAG_N = NFLAG_8(res); /* officially undefined */ - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_abcd_8_mm(void) -{ - uint src = OPER_AY_PD_8(); - uint ea = EA_AX_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); - - if(res > 9) - res += 6; - res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); - FLAG_X = FLAG_C = (res > 0x99) << 8; - if(FLAG_C) - res -= 0xa0; - - FLAG_N = NFLAG_8(res); /* officially undefined */ - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_add_8_er_d(void) -{ - uint* r_dst = &DX; - uint src = MASK_OUT_ABOVE_8(DY); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_8_er_ai(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_AI_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_8_er_pi(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PI_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_8_er_pi7(void) -{ - uint* r_dst = &DX; - uint src = OPER_A7_PI_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_8_er_pd(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PD_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_8_er_pd7(void) -{ - uint* r_dst = &DX; - uint src = OPER_A7_PD_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_8_er_di(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_DI_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_8_er_ix(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_IX_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_8_er_aw(void) -{ - uint* r_dst = &DX; - uint src = OPER_AW_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_8_er_al(void) -{ - uint* r_dst = &DX; - uint src = OPER_AL_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_8_er_pcdi(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCDI_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_8_er_pcix(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCIX_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_8_er_i(void) -{ - uint* r_dst = &DX; - uint src = OPER_I_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_16_er_d(void) -{ - uint* r_dst = &DX; - uint src = MASK_OUT_ABOVE_16(DY); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_16_er_a(void) -{ - uint* r_dst = &DX; - uint src = MASK_OUT_ABOVE_16(AY); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_16_er_ai(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_AI_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_16_er_pi(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PI_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_16_er_pd(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PD_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_16_er_di(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_DI_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_16_er_ix(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_IX_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_16_er_aw(void) -{ - uint* r_dst = &DX; - uint src = OPER_AW_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_16_er_al(void) -{ - uint* r_dst = &DX; - uint src = OPER_AL_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_16_er_pcdi(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCDI_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_16_er_pcix(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCIX_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_16_er_i(void) -{ - uint* r_dst = &DX; - uint src = OPER_I_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_add_32_er_d(void) -{ - uint* r_dst = &DX; - uint src = DY; - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_add_32_er_a(void) -{ - uint* r_dst = &DX; - uint src = AY; - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_add_32_er_ai(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_AI_32(); - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_add_32_er_pi(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PI_32(); - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_add_32_er_pd(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PD_32(); - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_add_32_er_di(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_DI_32(); - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_add_32_er_ix(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_IX_32(); - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_add_32_er_aw(void) -{ - uint* r_dst = &DX; - uint src = OPER_AW_32(); - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_add_32_er_al(void) -{ - uint* r_dst = &DX; - uint src = OPER_AL_32(); - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_add_32_er_pcdi(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCDI_32(); - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_add_32_er_pcix(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCIX_32(); - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_add_32_er_i(void) -{ - uint* r_dst = &DX; - uint src = OPER_I_32(); - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_add_8_re_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_add_8_re_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_add_8_re_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_add_8_re_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_add_8_re_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_add_8_re_di(void) -{ - uint ea = EA_AY_DI_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_add_8_re_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_add_8_re_aw(void) -{ - uint ea = EA_AW_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_add_8_re_al(void) -{ - uint ea = EA_AL_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_add_16_re_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_add_16_re_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_add_16_re_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_add_16_re_di(void) -{ - uint ea = EA_AY_DI_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_add_16_re_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_add_16_re_aw(void) -{ - uint ea = EA_AW_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_add_16_re_al(void) -{ - uint ea = EA_AL_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_add_32_re_ai(void) -{ - uint ea = EA_AY_AI_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_add_32_re_pi(void) -{ - uint ea = EA_AY_PI_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_add_32_re_pd(void) -{ - uint ea = EA_AY_PD_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_add_32_re_di(void) -{ - uint ea = EA_AY_DI_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_add_32_re_ix(void) -{ - uint ea = EA_AY_IX_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_add_32_re_aw(void) -{ - uint ea = EA_AW_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_add_32_re_al(void) -{ - uint ea = EA_AL_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_adda_16_d(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(DY)); -} - - -void m68k_op_adda_16_a(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(AY)); -} - - -void m68k_op_adda_16_ai(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AY_AI_16())); -} - - -void m68k_op_adda_16_pi(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AY_PI_16())); -} - - -void m68k_op_adda_16_pd(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AY_PD_16())); -} - - -void m68k_op_adda_16_di(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AY_DI_16())); -} - - -void m68k_op_adda_16_ix(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AY_IX_16())); -} - - -void m68k_op_adda_16_aw(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AW_16())); -} - - -void m68k_op_adda_16_al(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AL_16())); -} - - -void m68k_op_adda_16_pcdi(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_PCDI_16())); -} - - -void m68k_op_adda_16_pcix(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_PCIX_16())); -} - - -void m68k_op_adda_16_i(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_I_16())); -} - - -void m68k_op_adda_32_d(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + DY); -} - - -void m68k_op_adda_32_a(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + AY); -} - - -void m68k_op_adda_32_ai(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AY_AI_32()); -} - - -void m68k_op_adda_32_pi(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AY_PI_32()); -} - - -void m68k_op_adda_32_pd(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AY_PD_32()); -} - - -void m68k_op_adda_32_di(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AY_DI_32()); -} - - -void m68k_op_adda_32_ix(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AY_IX_32()); -} - - -void m68k_op_adda_32_aw(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AW_32()); -} - - -void m68k_op_adda_32_al(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AL_32()); -} - - -void m68k_op_adda_32_pcdi(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_PCDI_32()); -} - - -void m68k_op_adda_32_pcix(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_PCIX_32()); -} - - -void m68k_op_adda_32_i(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_I_32()); -} - - -void m68k_op_addi_8_d(void) -{ - uint* r_dst = &DY; - uint src = OPER_I_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_addi_8_ai(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_AI_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addi_8_pi(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_PI_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addi_8_pi7(void) -{ - uint src = OPER_I_8(); - uint ea = EA_A7_PI_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addi_8_pd(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addi_8_pd7(void) -{ - uint src = OPER_I_8(); - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addi_8_di(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_DI_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addi_8_ix(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_IX_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addi_8_aw(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AW_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addi_8_al(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AL_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addi_16_d(void) -{ - uint* r_dst = &DY; - uint src = OPER_I_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_addi_16_ai(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_AI_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addi_16_pi(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_PI_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addi_16_pd(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_PD_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addi_16_di(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_DI_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addi_16_ix(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_IX_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addi_16_aw(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AW_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addi_16_al(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AL_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addi_32_d(void) -{ - uint* r_dst = &DY; - uint src = OPER_I_32(); - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_addi_32_ai(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_AI_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addi_32_pi(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_PI_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addi_32_pd(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_PD_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addi_32_di(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_DI_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addi_32_ix(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_IX_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addi_32_aw(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AW_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addi_32_al(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AL_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addq_8_d(void) -{ - uint* r_dst = &DY; - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_addq_8_ai(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_AI_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addq_8_pi(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_PI_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addq_8_pi7(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_A7_PI_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addq_8_pd(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addq_8_pd7(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addq_8_di(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_DI_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addq_8_ix(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_IX_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addq_8_aw(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AW_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addq_8_al(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AL_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst; - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_addq_16_d(void) -{ - uint* r_dst = &DY; - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_addq_16_a(void) -{ - uint* r_dst = &AY; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1); -} - - -void m68k_op_addq_16_ai(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_AI_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addq_16_pi(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_PI_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addq_16_pd(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_PD_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addq_16_di(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_DI_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addq_16_ix(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_IX_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addq_16_aw(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AW_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addq_16_al(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AL_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst; - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_addq_32_d(void) -{ - uint* r_dst = &DY; - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint dst = *r_dst; - uint res = src + dst; - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_addq_32_a(void) -{ - uint* r_dst = &AY; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1); -} - - -void m68k_op_addq_32_ai(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_AI_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addq_32_pi(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_PI_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addq_32_pd(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_PD_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addq_32_di(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_DI_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addq_32_ix(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_IX_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addq_32_aw(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AW_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addq_32_al(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AL_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst; - - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_addx_8_rr(void) -{ - uint* r_dst = &DX; - uint src = MASK_OUT_ABOVE_8(DY); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = src + dst + XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; -} - - -void m68k_op_addx_16_rr(void) -{ - uint* r_dst = &DX; - uint src = MASK_OUT_ABOVE_16(DY); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = src + dst + XFLAG_AS_1(); - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - - res = MASK_OUT_ABOVE_16(res); - FLAG_Z |= res; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; -} - - -void m68k_op_addx_32_rr(void) -{ - uint* r_dst = &DX; - uint src = DY; - uint dst = *r_dst; - uint res = src + dst + XFLAG_AS_1(); - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - - res = MASK_OUT_ABOVE_32(res); - FLAG_Z |= res; - - *r_dst = res; -} - - -void m68k_op_addx_8_mm_ax7(void) -{ - uint src = OPER_AY_PD_8(); - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst + XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_addx_8_mm_ay7(void) -{ - uint src = OPER_A7_PD_8(); - uint ea = EA_AX_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst + XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_addx_8_mm_axy7(void) -{ - uint src = OPER_A7_PD_8(); - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst + XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_addx_8_mm(void) -{ - uint src = OPER_AY_PD_8(); - uint ea = EA_AX_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = src + dst + XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_V = VFLAG_ADD_8(src, dst, res); - FLAG_X = FLAG_C = CFLAG_8(res); - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_addx_16_mm(void) -{ - uint src = OPER_AY_PD_16(); - uint ea = EA_AX_PD_16(); - uint dst = m68ki_read_16(ea); - uint res = src + dst + XFLAG_AS_1(); - - FLAG_N = NFLAG_16(res); - FLAG_V = VFLAG_ADD_16(src, dst, res); - FLAG_X = FLAG_C = CFLAG_16(res); - - res = MASK_OUT_ABOVE_16(res); - FLAG_Z |= res; - - m68ki_write_16(ea, res); -} - - -void m68k_op_addx_32_mm(void) -{ - uint src = OPER_AY_PD_32(); - uint ea = EA_AX_PD_32(); - uint dst = m68ki_read_32(ea); - uint res = src + dst + XFLAG_AS_1(); - - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_ADD_32(src, dst, res); - FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); - - res = MASK_OUT_ABOVE_32(res); - FLAG_Z |= res; - - m68ki_write_32(ea, res); -} - - -void m68k_op_and_8_er_d(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DX &= (DY | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_8_er_ai(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_AI_8() | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_8_er_pi(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_PI_8() | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_8_er_pi7(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_A7_PI_8() | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_8_er_pd(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_PD_8() | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_8_er_pd7(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_A7_PD_8() | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_8_er_di(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_DI_8() | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_8_er_ix(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_IX_8() | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_8_er_aw(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AW_8() | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_8_er_al(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AL_8() | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_8_er_pcdi(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_PCDI_8() | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_8_er_pcix(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_PCIX_8() | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_8_er_i(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_I_8() | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_16_er_d(void) -{ - FLAG_Z = MASK_OUT_ABOVE_16(DX &= (DY | 0xffff0000)); - - FLAG_N = NFLAG_16(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_16_er_ai(void) -{ - FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_AI_16() | 0xffff0000)); - - FLAG_N = NFLAG_16(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_16_er_pi(void) -{ - FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_PI_16() | 0xffff0000)); - - FLAG_N = NFLAG_16(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_16_er_pd(void) -{ - FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_PD_16() | 0xffff0000)); - - FLAG_N = NFLAG_16(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_16_er_di(void) -{ - FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_DI_16() | 0xffff0000)); - - FLAG_N = NFLAG_16(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_16_er_ix(void) -{ - FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_IX_16() | 0xffff0000)); - - FLAG_N = NFLAG_16(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_16_er_aw(void) -{ - FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AW_16() | 0xffff0000)); - - FLAG_N = NFLAG_16(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_16_er_al(void) -{ - FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AL_16() | 0xffff0000)); - - FLAG_N = NFLAG_16(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_16_er_pcdi(void) -{ - FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_PCDI_16() | 0xffff0000)); - - FLAG_N = NFLAG_16(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_16_er_pcix(void) -{ - FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_PCIX_16() | 0xffff0000)); - - FLAG_N = NFLAG_16(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_16_er_i(void) -{ - FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_I_16() | 0xffff0000)); - - FLAG_N = NFLAG_16(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_32_er_d(void) -{ - FLAG_Z = DX &= DY; - - FLAG_N = NFLAG_32(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_32_er_ai(void) -{ - FLAG_Z = DX &= OPER_AY_AI_32(); - - FLAG_N = NFLAG_32(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_32_er_pi(void) -{ - FLAG_Z = DX &= OPER_AY_PI_32(); - - FLAG_N = NFLAG_32(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_32_er_pd(void) -{ - FLAG_Z = DX &= OPER_AY_PD_32(); - - FLAG_N = NFLAG_32(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_32_er_di(void) -{ - FLAG_Z = DX &= OPER_AY_DI_32(); - - FLAG_N = NFLAG_32(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_32_er_ix(void) -{ - FLAG_Z = DX &= OPER_AY_IX_32(); - - FLAG_N = NFLAG_32(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_32_er_aw(void) -{ - FLAG_Z = DX &= OPER_AW_32(); - - FLAG_N = NFLAG_32(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_32_er_al(void) -{ - FLAG_Z = DX &= OPER_AL_32(); - - FLAG_N = NFLAG_32(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_32_er_pcdi(void) -{ - FLAG_Z = DX &= OPER_PCDI_32(); - - FLAG_N = NFLAG_32(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_32_er_pcix(void) -{ - FLAG_Z = DX &= OPER_PCIX_32(); - - FLAG_N = NFLAG_32(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_32_er_i(void) -{ - FLAG_Z = DX &= OPER_I_32(); - - FLAG_N = NFLAG_32(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_and_8_re_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint res = DX & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_and_8_re_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint res = DX & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_and_8_re_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint res = DX & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_and_8_re_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint res = DX & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_and_8_re_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint res = DX & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_and_8_re_di(void) -{ - uint ea = EA_AY_DI_8(); - uint res = DX & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_and_8_re_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint res = DX & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_and_8_re_aw(void) -{ - uint ea = EA_AW_8(); - uint res = DX & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_and_8_re_al(void) -{ - uint ea = EA_AL_8(); - uint res = DX & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_and_16_re_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint res = DX & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_and_16_re_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint res = DX & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_and_16_re_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint res = DX & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_and_16_re_di(void) -{ - uint ea = EA_AY_DI_16(); - uint res = DX & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_and_16_re_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint res = DX & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_and_16_re_aw(void) -{ - uint ea = EA_AW_16(); - uint res = DX & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_and_16_re_al(void) -{ - uint ea = EA_AL_16(); - uint res = DX & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_and_32_re_ai(void) -{ - uint ea = EA_AY_AI_32(); - uint res = DX & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_and_32_re_pi(void) -{ - uint ea = EA_AY_PI_32(); - uint res = DX & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_and_32_re_pd(void) -{ - uint ea = EA_AY_PD_32(); - uint res = DX & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_and_32_re_di(void) -{ - uint ea = EA_AY_DI_32(); - uint res = DX & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_and_32_re_ix(void) -{ - uint ea = EA_AY_IX_32(); - uint res = DX & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_and_32_re_aw(void) -{ - uint ea = EA_AW_32(); - uint res = DX & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_and_32_re_al(void) -{ - uint ea = EA_AL_32(); - uint res = DX & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_andi_8_d(void) -{ - FLAG_Z = MASK_OUT_ABOVE_8(DY &= (OPER_I_8() | 0xffffff00)); - - FLAG_N = NFLAG_8(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_andi_8_ai(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_AI_8(); - uint res = src & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_8(ea, res); -} - - -void m68k_op_andi_8_pi(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_PI_8(); - uint res = src & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_8(ea, res); -} - - -void m68k_op_andi_8_pi7(void) -{ - uint src = OPER_I_8(); - uint ea = EA_A7_PI_8(); - uint res = src & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_8(ea, res); -} - - -void m68k_op_andi_8_pd(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_PD_8(); - uint res = src & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_8(ea, res); -} - - -void m68k_op_andi_8_pd7(void) -{ - uint src = OPER_I_8(); - uint ea = EA_A7_PD_8(); - uint res = src & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_8(ea, res); -} - - -void m68k_op_andi_8_di(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_DI_8(); - uint res = src & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_8(ea, res); -} - - -void m68k_op_andi_8_ix(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_IX_8(); - uint res = src & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_8(ea, res); -} - - -void m68k_op_andi_8_aw(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AW_8(); - uint res = src & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_8(ea, res); -} - - -void m68k_op_andi_8_al(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AL_8(); - uint res = src & m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_8(ea, res); -} - - -void m68k_op_andi_16_d(void) -{ - FLAG_Z = MASK_OUT_ABOVE_16(DY &= (OPER_I_16() | 0xffff0000)); - - FLAG_N = NFLAG_16(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_andi_16_ai(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_AI_16(); - uint res = src & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_16(ea, res); -} - - -void m68k_op_andi_16_pi(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_PI_16(); - uint res = src & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_16(ea, res); -} - - -void m68k_op_andi_16_pd(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_PD_16(); - uint res = src & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_16(ea, res); -} - - -void m68k_op_andi_16_di(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_DI_16(); - uint res = src & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_16(ea, res); -} - - -void m68k_op_andi_16_ix(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_IX_16(); - uint res = src & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_16(ea, res); -} - - -void m68k_op_andi_16_aw(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AW_16(); - uint res = src & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_16(ea, res); -} - - -void m68k_op_andi_16_al(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AL_16(); - uint res = src & m68ki_read_16(ea); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_16(ea, res); -} - - -void m68k_op_andi_32_d(void) -{ - FLAG_Z = DY &= (OPER_I_32()); - - FLAG_N = NFLAG_32(FLAG_Z); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_andi_32_ai(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_AI_32(); - uint res = src & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_andi_32_pi(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_PI_32(); - uint res = src & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_andi_32_pd(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_PD_32(); - uint res = src & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_andi_32_di(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_DI_32(); - uint res = src & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_andi_32_ix(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_IX_32(); - uint res = src & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_andi_32_aw(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AW_32(); - uint res = src & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_andi_32_al(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AL_32(); - uint res = src & m68ki_read_32(ea); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - - m68ki_write_32(ea, res); -} - - -void m68k_op_andi_16_toc(void) -{ - m68ki_set_ccr(m68ki_get_ccr() & OPER_I_16()); -} - - -void m68k_op_andi_16_tos(void) -{ - if(FLAG_S) - { - uint src = OPER_I_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_sr(m68ki_get_sr() & src); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_asr_8_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = src >> shift; - - if(GET_MSB_8(src)) - res |= m68ki_shift_8_table[shift]; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_X = FLAG_C = src << (9-shift); -} - - -void m68k_op_asr_16_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_16(*r_dst); - uint res = src >> shift; - - if(GET_MSB_16(src)) - res |= m68ki_shift_16_table[shift]; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_X = FLAG_C = src << (9-shift); -} - - -void m68k_op_asr_32_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = *r_dst; - uint res = src >> shift; - - if(GET_MSB_32(src)) - res |= m68ki_shift_32_table[shift]; - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_X = FLAG_C = src << (9-shift); -} - - -void m68k_op_asr_8_r(void) -{ - uint* r_dst = &DY; - uint shift = DX & 0x3f; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = src >> shift; - - if(shift != 0) - { - USE_CYCLES(shift<> shift; - - if(shift != 0) - { - USE_CYCLES(shift<> (shift - 1))<<8; - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - - if(GET_MSB_16(src)) - { - *r_dst |= 0xffff; - FLAG_C = CFLAG_SET; - FLAG_X = XFLAG_SET; - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - return; - } - - *r_dst &= 0xffff0000; - FLAG_C = CFLAG_CLEAR; - FLAG_X = XFLAG_CLEAR; - FLAG_N = NFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_16(src); - FLAG_Z = src; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_asr_32_r(void) -{ - uint* r_dst = &DY; - uint shift = DX & 0x3f; - uint src = *r_dst; - uint res = src >> shift; - - if(shift != 0) - { - USE_CYCLES(shift<> (shift - 1))<<8; - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - - if(GET_MSB_32(src)) - { - *r_dst = 0xffffffff; - FLAG_C = CFLAG_SET; - FLAG_X = XFLAG_SET; - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - return; - } - - *r_dst = 0; - FLAG_C = CFLAG_CLEAR; - FLAG_X = XFLAG_CLEAR; - FLAG_N = NFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_32(src); - FLAG_Z = src; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_asr_16_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - if(GET_MSB_16(src)) - res |= 0x8000; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = FLAG_X = src << 8; -} - - -void m68k_op_asr_16_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - if(GET_MSB_16(src)) - res |= 0x8000; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = FLAG_X = src << 8; -} - - -void m68k_op_asr_16_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - if(GET_MSB_16(src)) - res |= 0x8000; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = FLAG_X = src << 8; -} - - -void m68k_op_asr_16_di(void) -{ - uint ea = EA_AY_DI_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - if(GET_MSB_16(src)) - res |= 0x8000; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = FLAG_X = src << 8; -} - - -void m68k_op_asr_16_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - if(GET_MSB_16(src)) - res |= 0x8000; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = FLAG_X = src << 8; -} - - -void m68k_op_asr_16_aw(void) -{ - uint ea = EA_AW_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - if(GET_MSB_16(src)) - res |= 0x8000; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = FLAG_X = src << 8; -} - - -void m68k_op_asr_16_al(void) -{ - uint ea = EA_AL_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - if(GET_MSB_16(src)) - res |= 0x8000; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = FLAG_X = src << 8; -} - - -void m68k_op_asl_8_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = MASK_OUT_ABOVE_8(src << shift); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_X = FLAG_C = src << shift; - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - src &= m68ki_shift_8_table[shift + 1]; - FLAG_V = (!(src == 0 || (src == m68ki_shift_8_table[shift + 1] && shift < 8)))<<7; -} - - -void m68k_op_asl_16_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_16(*r_dst); - uint res = MASK_OUT_ABOVE_16(src << shift); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> (8-shift); - src &= m68ki_shift_16_table[shift + 1]; - FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7; -} - - -void m68k_op_asl_32_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = *r_dst; - uint res = MASK_OUT_ABOVE_32(src << shift); - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> (24-shift); - src &= m68ki_shift_32_table[shift + 1]; - FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7; -} - - -void m68k_op_asl_8_r(void) -{ - uint* r_dst = &DY; - uint shift = DX & 0x3f; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = MASK_OUT_ABOVE_8(src << shift); - - if(shift != 0) - { - USE_CYCLES(shift<> 8; - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - src &= m68ki_shift_16_table[shift + 1]; - FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7; - return; - } - - *r_dst &= 0xffff0000; - FLAG_X = FLAG_C = ((shift == 16 ? src & 1 : 0))<<8; - FLAG_N = NFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; - FLAG_V = (!(src == 0))<<7; - return; - } - - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_16(src); - FLAG_Z = src; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_asl_32_r(void) -{ - uint* r_dst = &DY; - uint shift = DX & 0x3f; - uint src = *r_dst; - uint res = MASK_OUT_ABOVE_32(src << shift); - - if(shift != 0) - { - USE_CYCLES(shift<> (32 - shift)) << 8; - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - src &= m68ki_shift_32_table[shift + 1]; - FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7; - return; - } - - *r_dst = 0; - FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8; - FLAG_N = NFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; - FLAG_V = (!(src == 0))<<7; - return; - } - - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_32(src); - FLAG_Z = src; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_asl_16_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - src &= 0xc000; - FLAG_V = (!(src == 0 || src == 0xc000))<<7; -} - - -void m68k_op_asl_16_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - src &= 0xc000; - FLAG_V = (!(src == 0 || src == 0xc000))<<7; -} - - -void m68k_op_asl_16_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - src &= 0xc000; - FLAG_V = (!(src == 0 || src == 0xc000))<<7; -} - - -void m68k_op_asl_16_di(void) -{ - uint ea = EA_AY_DI_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - src &= 0xc000; - FLAG_V = (!(src == 0 || src == 0xc000))<<7; -} - - -void m68k_op_asl_16_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - src &= 0xc000; - FLAG_V = (!(src == 0 || src == 0xc000))<<7; -} - - -void m68k_op_asl_16_aw(void) -{ - uint ea = EA_AW_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - src &= 0xc000; - FLAG_V = (!(src == 0 || src == 0xc000))<<7; -} - - -void m68k_op_asl_16_al(void) -{ - uint ea = EA_AL_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - src &= 0xc000; - FLAG_V = (!(src == 0 || src == 0xc000))<<7; -} - - -void m68k_op_bhi_8(void) -{ - if(COND_HI()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_bls_8(void) -{ - if(COND_LS()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_bcc_8(void) -{ - if(COND_CC()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_bcs_8(void) -{ - if(COND_CS()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_bne_8(void) -{ - if(COND_NE()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_beq_8(void) -{ - if(COND_EQ()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_bvc_8(void) -{ - if(COND_VC()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_bvs_8(void) -{ - if(COND_VS()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_bpl_8(void) -{ - if(COND_PL()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_bmi_8(void) -{ - if(COND_MI()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_bge_8(void) -{ - if(COND_GE()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_blt_8(void) -{ - if(COND_LT()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_bgt_8(void) -{ - if(COND_GT()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_ble_8(void) -{ - if(COND_LE()) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - return; - } - USE_CYCLES(CYC_BCC_NOTAKE_B); -} - - -void m68k_op_bhi_16(void) -{ - if(COND_HI()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_bls_16(void) -{ - if(COND_LS()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_bcc_16(void) -{ - if(COND_CC()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_bcs_16(void) -{ - if(COND_CS()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_bne_16(void) -{ - if(COND_NE()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_beq_16(void) -{ - if(COND_EQ()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_bvc_16(void) -{ - if(COND_VC()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_bvs_16(void) -{ - if(COND_VS()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_bpl_16(void) -{ - if(COND_PL()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_bmi_16(void) -{ - if(COND_MI()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_bge_16(void) -{ - if(COND_GE()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_blt_16(void) -{ - if(COND_LT()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_bgt_16(void) -{ - if(COND_GT()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_ble_16(void) -{ - if(COND_LE()) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_BCC_NOTAKE_W); -} - - -void m68k_op_bhi_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_HI()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bls_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_LS()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bcc_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_CC()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bcs_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_CS()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bne_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_NE()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_beq_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_EQ()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bvc_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_VC()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bvs_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_VS()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bpl_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_PL()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bmi_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_MI()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bge_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_GE()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_blt_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_LT()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bgt_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_GT()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_ble_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_LE()) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bchg_32_r_d(void) -{ - uint* r_dst = &DY; - uint mask = 1 << (DX & 0x1f); - - FLAG_Z = *r_dst & mask; - *r_dst ^= mask; -} - - -void m68k_op_bchg_8_r_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_r_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_r_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_r_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_r_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_r_di(void) -{ - uint ea = EA_AY_DI_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_r_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_r_aw(void) -{ - uint ea = EA_AW_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_r_al(void) -{ - uint ea = EA_AL_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_32_s_d(void) -{ - uint* r_dst = &DY; - uint mask = 1 << (OPER_I_8() & 0x1f); - - FLAG_Z = *r_dst & mask; - *r_dst ^= mask; -} - - -void m68k_op_bchg_8_s_ai(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_AI_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_s_pi(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_PI_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_s_pi7(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_A7_PI_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_s_pd(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_PD_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_s_pd7(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_A7_PD_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_s_di(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_DI_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_s_ix(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_IX_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_s_aw(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AW_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bchg_8_s_al(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AL_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src ^ mask); -} - - -void m68k_op_bclr_32_r_d(void) -{ - uint* r_dst = &DY; - uint mask = 1 << (DX & 0x1f); - - FLAG_Z = *r_dst & mask; - *r_dst &= ~mask; -} - - -void m68k_op_bclr_8_r_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_r_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_r_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_r_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_r_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_r_di(void) -{ - uint ea = EA_AY_DI_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_r_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_r_aw(void) -{ - uint ea = EA_AW_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_r_al(void) -{ - uint ea = EA_AL_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_32_s_d(void) -{ - uint* r_dst = &DY; - uint mask = 1 << (OPER_I_8() & 0x1f); - - FLAG_Z = *r_dst & mask; - *r_dst &= ~mask; -} - - -void m68k_op_bclr_8_s_ai(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_AI_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_s_pi(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_PI_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_s_pi7(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_A7_PI_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_s_pd(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_PD_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_s_pd7(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_A7_PD_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_s_di(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_DI_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_s_ix(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_IX_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_s_aw(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AW_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bclr_8_s_al(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AL_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src & ~mask); -} - - -void m68k_op_bfchg_32_d(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint offset = (word2>>6)&31; - uint width = word2; - uint* data = &DY; - uint64 mask; - - - if(BIT_B(word2)) - offset = REG_D[offset&7]; - if(BIT_5(word2)) - width = REG_D[width&7]; - - offset &= 31; - width = ((width-1) & 31) + 1; - - mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask = ROR_32(mask, offset); - - FLAG_N = NFLAG_32(*data<>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_AI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long ^ mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte ^ mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfchg_32_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_DI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long ^ mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte ^ mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfchg_32_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_IX_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long ^ mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte ^ mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfchg_32_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AW_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long ^ mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte ^ mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfchg_32_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AL_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long ^ mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte ^ mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfclr_32_d(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint offset = (word2>>6)&31; - uint width = word2; - uint* data = &DY; - uint64 mask; - - - if(BIT_B(word2)) - offset = REG_D[offset&7]; - if(BIT_5(word2)) - width = REG_D[width&7]; - - - offset &= 31; - width = ((width-1) & 31) + 1; - - - mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask = ROR_32(mask, offset); - - FLAG_N = NFLAG_32(*data<>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_AI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long & ~mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte & ~mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfclr_32_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_DI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long & ~mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte & ~mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfclr_32_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_IX_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long & ~mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte & ~mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfclr_32_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AW_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long & ~mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte & ~mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfclr_32_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AL_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long & ~mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte & ~mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfexts_32_d(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint offset = (word2>>6)&31; - uint width = word2; - uint64 data = DY; - - - if(BIT_B(word2)) - offset = REG_D[offset&7]; - if(BIT_5(word2)) - width = REG_D[width&7]; - - offset &= 31; - width = ((width-1) & 31) + 1; - - data = ROL_32(data, offset); - FLAG_N = NFLAG_32(data); - data = MAKE_INT_32(data) >> (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2>>12)&7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfexts_32_ai(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_AY_AI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data = MAKE_INT_32(data) >> (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfexts_32_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_AY_DI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data = MAKE_INT_32(data) >> (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfexts_32_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_AY_IX_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data = MAKE_INT_32(data) >> (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfexts_32_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_AW_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data = MAKE_INT_32(data) >> (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfexts_32_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_AL_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data = MAKE_INT_32(data) >> (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfexts_32_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_PCDI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data = MAKE_INT_32(data) >> (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfexts_32_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_PCIX_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data = MAKE_INT_32(data) >> (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfextu_32_d(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint offset = (word2>>6)&31; - uint width = word2; - uint64 data = DY; - - - if(BIT_B(word2)) - offset = REG_D[offset&7]; - if(BIT_5(word2)) - width = REG_D[width&7]; - - offset &= 31; - width = ((width-1) & 31) + 1; - - data = ROL_32(data, offset); - FLAG_N = NFLAG_32(data); - data >>= 32 - width; - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2>>12)&7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfextu_32_ai(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_AY_AI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfextu_32_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_AY_DI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfextu_32_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_AY_IX_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfextu_32_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_AW_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfextu_32_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_AL_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfextu_32_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_PCDI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfextu_32_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint data; - uint ea = EA_PCIX_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - REG_D[(word2 >> 12) & 7] = data; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfffo_32_d(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint offset = (word2>>6)&31; - uint width = word2; - uint64 data = DY; - uint bit; - - - if(BIT_B(word2)) - offset = REG_D[offset&7]; - if(BIT_5(word2)) - width = REG_D[width&7]; - - offset &= 31; - width = ((width-1) & 31) + 1; - - data = ROL_32(data, offset); - FLAG_N = NFLAG_32(data); - data >>= 32 - width; - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) - offset++; - - REG_D[(word2>>12)&7] = offset; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfffo_32_ai(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - sint local_offset; - uint width = word2; - uint data; - uint bit; - uint ea = EA_AY_AI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - local_offset = offset % 8; - if(local_offset < 0) - { - local_offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << local_offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) - offset++; - - REG_D[(word2>>12)&7] = offset; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfffo_32_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - sint local_offset; - uint width = word2; - uint data; - uint bit; - uint ea = EA_AY_DI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - local_offset = offset % 8; - if(local_offset < 0) - { - local_offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << local_offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) - offset++; - - REG_D[(word2>>12)&7] = offset; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfffo_32_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - sint local_offset; - uint width = word2; - uint data; - uint bit; - uint ea = EA_AY_IX_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - local_offset = offset % 8; - if(local_offset < 0) - { - local_offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << local_offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) - offset++; - - REG_D[(word2>>12)&7] = offset; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfffo_32_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - sint local_offset; - uint width = word2; - uint data; - uint bit; - uint ea = EA_AW_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - local_offset = offset % 8; - if(local_offset < 0) - { - local_offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << local_offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) - offset++; - - REG_D[(word2>>12)&7] = offset; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfffo_32_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - sint local_offset; - uint width = word2; - uint data; - uint bit; - uint ea = EA_AL_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - local_offset = offset % 8; - if(local_offset < 0) - { - local_offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << local_offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) - offset++; - - REG_D[(word2>>12)&7] = offset; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfffo_32_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - sint local_offset; - uint width = word2; - uint data; - uint bit; - uint ea = EA_PCDI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - local_offset = offset % 8; - if(local_offset < 0) - { - local_offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << local_offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) - offset++; - - REG_D[(word2>>12)&7] = offset; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfffo_32_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - sint local_offset; - uint width = word2; - uint data; - uint bit; - uint ea = EA_PCIX_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - local_offset = offset % 8; - if(local_offset < 0) - { - local_offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - data = m68ki_read_32(ea); - data = MASK_OUT_ABOVE_32(data< 32) - data |= (m68ki_read_8(ea+4) << local_offset) >> 8; - - FLAG_N = NFLAG_32(data); - data >>= (32 - width); - - FLAG_Z = data; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) - offset++; - - REG_D[(word2>>12)&7] = offset; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfins_32_d(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint offset = (word2>>6)&31; - uint width = word2; - uint* data = &DY; - uint64 mask; - uint64 insert = REG_D[(word2>>12)&7]; - - - if(BIT_B(word2)) - offset = REG_D[offset&7]; - if(BIT_5(word2)) - width = REG_D[width&7]; - - - offset &= 31; - width = ((width-1) & 31) + 1; - - - mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask = ROR_32(mask, offset); - - insert = MASK_OUT_ABOVE_32(insert << (32 - width)); - FLAG_N = NFLAG_32(insert); - FLAG_Z = insert; - insert = ROR_32(insert, offset); - - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - *data &= ~mask; - *data |= insert; - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfins_32_ai(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint insert_base = REG_D[(word2>>12)&7]; - uint insert_long; - uint insert_byte; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_AI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width)); - FLAG_N = NFLAG_32(insert_base); - FLAG_Z = insert_base; - insert_long = insert_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, (data_long & ~mask_long) | insert_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - insert_byte = MASK_OUT_ABOVE_8(insert_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfins_32_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint insert_base = REG_D[(word2>>12)&7]; - uint insert_long; - uint insert_byte; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_DI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width)); - FLAG_N = NFLAG_32(insert_base); - FLAG_Z = insert_base; - insert_long = insert_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, (data_long & ~mask_long) | insert_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - insert_byte = MASK_OUT_ABOVE_8(insert_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfins_32_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint insert_base = REG_D[(word2>>12)&7]; - uint insert_long; - uint insert_byte; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_IX_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width)); - FLAG_N = NFLAG_32(insert_base); - FLAG_Z = insert_base; - insert_long = insert_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, (data_long & ~mask_long) | insert_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - insert_byte = MASK_OUT_ABOVE_8(insert_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfins_32_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint insert_base = REG_D[(word2>>12)&7]; - uint insert_long; - uint insert_byte; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AW_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width)); - FLAG_N = NFLAG_32(insert_base); - FLAG_Z = insert_base; - insert_long = insert_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, (data_long & ~mask_long) | insert_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - insert_byte = MASK_OUT_ABOVE_8(insert_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfins_32_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint insert_base = REG_D[(word2>>12)&7]; - uint insert_long; - uint insert_byte; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AL_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width)); - FLAG_N = NFLAG_32(insert_base); - FLAG_Z = insert_base; - insert_long = insert_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, (data_long & ~mask_long) | insert_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - insert_byte = MASK_OUT_ABOVE_8(insert_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfset_32_d(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint offset = (word2>>6)&31; - uint width = word2; - uint* data = &DY; - uint64 mask; - - - if(BIT_B(word2)) - offset = REG_D[offset&7]; - if(BIT_5(word2)) - width = REG_D[width&7]; - - - offset &= 31; - width = ((width-1) & 31) + 1; - - - mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask = ROR_32(mask, offset); - - FLAG_N = NFLAG_32(*data<>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_AI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long | mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte | mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfset_32_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_DI_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long | mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte | mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfset_32_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_IX_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long | mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte | mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfset_32_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AW_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long | mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte | mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bfset_32_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AL_8(); - - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = NFLAG_32(data_long << offset); - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - m68ki_write_32(ea, data_long | mask_long); - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - m68ki_write_8(ea+4, data_byte | mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bftst_32_d(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint offset = (word2>>6)&31; - uint width = word2; - uint* data = &DY; - uint64 mask; - - - if(BIT_B(word2)) - offset = REG_D[offset&7]; - if(BIT_5(word2)) - width = REG_D[width&7]; - - - offset &= 31; - width = ((width-1) & 31) + 1; - - - mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask = ROR_32(mask, offset); - - FLAG_N = NFLAG_32(*data<>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_AI_8(); - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = ((data_long & (0x80000000 >> offset))<>24; - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bftst_32_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_DI_8(); - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = ((data_long & (0x80000000 >> offset))<>24; - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bftst_32_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AY_IX_8(); - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = ((data_long & (0x80000000 >> offset))<>24; - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bftst_32_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AW_8(); - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = ((data_long & (0x80000000 >> offset))<>24; - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bftst_32_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_AL_8(); - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = ((data_long & (0x80000000 >> offset))<>24; - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bftst_32_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_PCDI_8(); - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = ((data_long & (0x80000000 >> offset))<>24; - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bftst_32_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - sint offset = (word2>>6)&31; - uint width = word2; - uint mask_base; - uint data_long; - uint mask_long; - uint data_byte = 0; - uint mask_byte = 0; - uint ea = EA_PCIX_8(); - - if(BIT_B(word2)) - offset = MAKE_INT_32(REG_D[offset&7]); - if(BIT_5(word2)) - width = REG_D[width&7]; - - /* Offset is signed so we have to use ugly math =( */ - ea += offset / 8; - offset %= 8; - if(offset < 0) - { - offset += 8; - ea--; - } - width = ((width-1) & 31) + 1; - - - mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); - mask_long = mask_base >> offset; - - data_long = m68ki_read_32(ea); - FLAG_N = ((data_long & (0x80000000 >> offset))<>24; - FLAG_Z = data_long & mask_long; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - - if((width + offset) > 32) - { - mask_byte = MASK_OUT_ABOVE_8(mask_base); - data_byte = m68ki_read_8(ea+4); - FLAG_Z |= (data_byte & mask_byte); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bkpt(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - m68ki_bkpt_ack(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE) ? REG_IR & 7 : 0); /* auto-disable (see m68kcpu.h) */ - } - m68ki_exception_illegal(); -} - - -void m68k_op_bra_8(void) -{ - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); - if(REG_PC == REG_PPC) - USE_ALL_CYCLES(); -} - - -void m68k_op_bra_16(void) -{ - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - if(REG_PC == REG_PPC) - USE_ALL_CYCLES(); -} - - -void m68k_op_bra_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint offset = OPER_I_32(); - REG_PC -= 4; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_32(offset); - if(REG_PC == REG_PPC) - USE_ALL_CYCLES(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_bset_32_r_d(void) -{ - uint* r_dst = &DY; - uint mask = 1 << (DX & 0x1f); - - FLAG_Z = *r_dst & mask; - *r_dst |= mask; -} - - -void m68k_op_bset_8_r_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_r_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_r_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_r_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_r_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_r_di(void) -{ - uint ea = EA_AY_DI_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_r_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_r_aw(void) -{ - uint ea = EA_AW_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_r_al(void) -{ - uint ea = EA_AL_8(); - uint src = m68ki_read_8(ea); - uint mask = 1 << (DX & 7); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_32_s_d(void) -{ - uint* r_dst = &DY; - uint mask = 1 << (OPER_I_8() & 0x1f); - - FLAG_Z = *r_dst & mask; - *r_dst |= mask; -} - - -void m68k_op_bset_8_s_ai(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_AI_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_s_pi(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_PI_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_s_pi7(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_A7_PI_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_s_pd(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_PD_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_s_pd7(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_A7_PD_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_s_di(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_DI_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_s_ix(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AY_IX_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_s_aw(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AW_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bset_8_s_al(void) -{ - uint mask = 1 << (OPER_I_8() & 7); - uint ea = EA_AL_8(); - uint src = m68ki_read_8(ea); - - FLAG_Z = src & mask; - m68ki_write_8(ea, src | mask); -} - - -void m68k_op_bsr_8(void) -{ - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_push_32(REG_PC); - m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); -} - - -void m68k_op_bsr_16(void) -{ - uint offset = OPER_I_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_push_32(REG_PC); - REG_PC -= 2; - m68ki_branch_16(offset); -} - - -void m68k_op_bsr_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint offset = OPER_I_32(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_push_32(REG_PC); - REG_PC -= 4; - m68ki_branch_32(offset); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_btst_32_r_d(void) -{ - FLAG_Z = DY & (1 << (DX & 0x1f)); -} - - -void m68k_op_btst_8_r_ai(void) -{ - FLAG_Z = OPER_AY_AI_8() & (1 << (DX & 7)); -} - - -void m68k_op_btst_8_r_pi(void) -{ - FLAG_Z = OPER_AY_PI_8() & (1 << (DX & 7)); -} - - -void m68k_op_btst_8_r_pi7(void) -{ - FLAG_Z = OPER_A7_PI_8() & (1 << (DX & 7)); -} - - -void m68k_op_btst_8_r_pd(void) -{ - FLAG_Z = OPER_AY_PD_8() & (1 << (DX & 7)); -} - - -void m68k_op_btst_8_r_pd7(void) -{ - FLAG_Z = OPER_A7_PD_8() & (1 << (DX & 7)); -} - - -void m68k_op_btst_8_r_di(void) -{ - FLAG_Z = OPER_AY_DI_8() & (1 << (DX & 7)); -} - - -void m68k_op_btst_8_r_ix(void) -{ - FLAG_Z = OPER_AY_IX_8() & (1 << (DX & 7)); -} - - -void m68k_op_btst_8_r_aw(void) -{ - FLAG_Z = OPER_AW_8() & (1 << (DX & 7)); -} - - -void m68k_op_btst_8_r_al(void) -{ - FLAG_Z = OPER_AL_8() & (1 << (DX & 7)); -} - - -void m68k_op_btst_8_r_pcdi(void) -{ - FLAG_Z = OPER_PCDI_8() & (1 << (DX & 7)); -} - - -void m68k_op_btst_8_r_pcix(void) -{ - FLAG_Z = OPER_PCIX_8() & (1 << (DX & 7)); -} - - -void m68k_op_btst_8_r_i(void) -{ - FLAG_Z = OPER_I_8() & (1 << (DX & 7)); -} - - -void m68k_op_btst_32_s_d(void) -{ - FLAG_Z = DY & (1 << (OPER_I_8() & 0x1f)); -} - - -void m68k_op_btst_8_s_ai(void) -{ - uint bit = OPER_I_8() & 7; - - FLAG_Z = OPER_AY_AI_8() & (1 << bit); -} - - -void m68k_op_btst_8_s_pi(void) -{ - uint bit = OPER_I_8() & 7; - - FLAG_Z = OPER_AY_PI_8() & (1 << bit); -} - - -void m68k_op_btst_8_s_pi7(void) -{ - uint bit = OPER_I_8() & 7; - - FLAG_Z = OPER_A7_PI_8() & (1 << bit); -} - - -void m68k_op_btst_8_s_pd(void) -{ - uint bit = OPER_I_8() & 7; - - FLAG_Z = OPER_AY_PD_8() & (1 << bit); -} - - -void m68k_op_btst_8_s_pd7(void) -{ - uint bit = OPER_I_8() & 7; - - FLAG_Z = OPER_A7_PD_8() & (1 << bit); -} - - -void m68k_op_btst_8_s_di(void) -{ - uint bit = OPER_I_8() & 7; - - FLAG_Z = OPER_AY_DI_8() & (1 << bit); -} - - -void m68k_op_btst_8_s_ix(void) -{ - uint bit = OPER_I_8() & 7; - - FLAG_Z = OPER_AY_IX_8() & (1 << bit); -} - - -void m68k_op_btst_8_s_aw(void) -{ - uint bit = OPER_I_8() & 7; - - FLAG_Z = OPER_AW_8() & (1 << bit); -} - - -void m68k_op_btst_8_s_al(void) -{ - uint bit = OPER_I_8() & 7; - - FLAG_Z = OPER_AL_8() & (1 << bit); -} - - -void m68k_op_btst_8_s_pcdi(void) -{ - uint bit = OPER_I_8() & 7; - - FLAG_Z = OPER_PCDI_8() & (1 << bit); -} - - -void m68k_op_btst_8_s_pcix(void) -{ - uint bit = OPER_I_8() & 7; - - FLAG_Z = OPER_PCIX_8() & (1 << bit); -} - - -void m68k_op_callm_32_ai(void) -{ - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - { - uint ea = EA_AY_AI_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - REG_PC += 2; -(void)ea; /* just to avoid an 'unused variable' warning */ - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, - m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_callm_32_di(void) -{ - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - { - uint ea = EA_AY_DI_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - REG_PC += 2; -(void)ea; /* just to avoid an 'unused variable' warning */ - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, - m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_callm_32_ix(void) -{ - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - { - uint ea = EA_AY_IX_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - REG_PC += 2; -(void)ea; /* just to avoid an 'unused variable' warning */ - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, - m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_callm_32_aw(void) -{ - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - { - uint ea = EA_AW_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - REG_PC += 2; -(void)ea; /* just to avoid an 'unused variable' warning */ - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, - m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_callm_32_al(void) -{ - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - { - uint ea = EA_AL_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - REG_PC += 2; -(void)ea; /* just to avoid an 'unused variable' warning */ - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, - m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_callm_32_pcdi(void) -{ - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - { - uint ea = EA_PCDI_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - REG_PC += 2; -(void)ea; /* just to avoid an 'unused variable' warning */ - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, - m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_callm_32_pcix(void) -{ - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - { - uint ea = EA_PCIX_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - REG_PC += 2; -(void)ea; /* just to avoid an 'unused variable' warning */ - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, - m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_8_ai(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_AI_8(); - uint dest = m68ki_read_8(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_8(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(*compare, dest, res); - FLAG_C = CFLAG_8(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_8(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_8_pi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_PI_8(); - uint dest = m68ki_read_8(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_8(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(*compare, dest, res); - FLAG_C = CFLAG_8(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_8(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_8_pi7(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_A7_PI_8(); - uint dest = m68ki_read_8(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_8(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(*compare, dest, res); - FLAG_C = CFLAG_8(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_8(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_8_pd(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_PD_8(); - uint dest = m68ki_read_8(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_8(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(*compare, dest, res); - FLAG_C = CFLAG_8(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_8(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_8_pd7(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_A7_PD_8(); - uint dest = m68ki_read_8(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_8(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(*compare, dest, res); - FLAG_C = CFLAG_8(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_8(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_8_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_DI_8(); - uint dest = m68ki_read_8(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_8(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(*compare, dest, res); - FLAG_C = CFLAG_8(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_8(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_8_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_IX_8(); - uint dest = m68ki_read_8(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_8(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(*compare, dest, res); - FLAG_C = CFLAG_8(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_8(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_8_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AW_8(); - uint dest = m68ki_read_8(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_8(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(*compare, dest, res); - FLAG_C = CFLAG_8(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_8(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_8_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AL_8(); - uint dest = m68ki_read_8(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_8(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(*compare, dest, res); - FLAG_C = CFLAG_8(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_8(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_16_ai(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_AI_16(); - uint dest = m68ki_read_16(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_16(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(*compare, dest, res); - FLAG_C = CFLAG_16(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_16(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_16_pi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_PI_16(); - uint dest = m68ki_read_16(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_16(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(*compare, dest, res); - FLAG_C = CFLAG_16(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_16(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_16_pd(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_PD_16(); - uint dest = m68ki_read_16(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_16(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(*compare, dest, res); - FLAG_C = CFLAG_16(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_16(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_16_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_DI_16(); - uint dest = m68ki_read_16(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_16(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(*compare, dest, res); - FLAG_C = CFLAG_16(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_16(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_16_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_IX_16(); - uint dest = m68ki_read_16(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_16(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(*compare, dest, res); - FLAG_C = CFLAG_16(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_16(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_16_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AW_16(); - uint dest = m68ki_read_16(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_16(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(*compare, dest, res); - FLAG_C = CFLAG_16(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_16(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_16_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AL_16(); - uint dest = m68ki_read_16(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - MASK_OUT_ABOVE_16(*compare); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(*compare, dest, res); - FLAG_C = CFLAG_16(res); - - if(COND_NE()) - *compare = MASK_OUT_BELOW_16(*compare) | dest; - else - { - USE_CYCLES(3); - m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_32_ai(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_AI_32(); - uint dest = m68ki_read_32(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - *compare; - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(*compare, dest, res); - FLAG_C = CFLAG_SUB_32(*compare, dest, res); - - if(COND_NE()) - *compare = dest; - else - { - USE_CYCLES(3); - m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_32_pi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_PI_32(); - uint dest = m68ki_read_32(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - *compare; - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(*compare, dest, res); - FLAG_C = CFLAG_SUB_32(*compare, dest, res); - - if(COND_NE()) - *compare = dest; - else - { - USE_CYCLES(3); - m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_32_pd(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_PD_32(); - uint dest = m68ki_read_32(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - *compare; - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(*compare, dest, res); - FLAG_C = CFLAG_SUB_32(*compare, dest, res); - - if(COND_NE()) - *compare = dest; - else - { - USE_CYCLES(3); - m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_32_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_DI_32(); - uint dest = m68ki_read_32(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - *compare; - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(*compare, dest, res); - FLAG_C = CFLAG_SUB_32(*compare, dest, res); - - if(COND_NE()) - *compare = dest; - else - { - USE_CYCLES(3); - m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_32_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_IX_32(); - uint dest = m68ki_read_32(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - *compare; - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(*compare, dest, res); - FLAG_C = CFLAG_SUB_32(*compare, dest, res); - - if(COND_NE()) - *compare = dest; - else - { - USE_CYCLES(3); - m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_32_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AW_32(); - uint dest = m68ki_read_32(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - *compare; - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(*compare, dest, res); - FLAG_C = CFLAG_SUB_32(*compare, dest, res); - - if(COND_NE()) - *compare = dest; - else - { - USE_CYCLES(3); - m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas_32_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint ea = EA_AL_32(); - uint dest = m68ki_read_32(ea); - uint* compare = ®_D[word2 & 7]; - uint res = dest - *compare; - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(*compare, dest, res); - FLAG_C = CFLAG_SUB_32(*compare, dest, res); - - if(COND_NE()) - *compare = dest; - else - { - USE_CYCLES(3); - m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); - } - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas2_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_32(); - uint* compare1 = ®_D[(word2 >> 16) & 7]; - uint ea1 = REG_DA[(word2 >> 28) & 15]; - uint dest1 = m68ki_read_16(ea1); - uint res1 = dest1 - MASK_OUT_ABOVE_16(*compare1); - uint* compare2 = ®_D[word2 & 7]; - uint ea2 = REG_DA[(word2 >> 12) & 15]; - uint dest2 = m68ki_read_16(ea2); - uint res2; - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_16(res1); - FLAG_Z = MASK_OUT_ABOVE_16(res1); - FLAG_V = VFLAG_SUB_16(*compare1, dest1, res1); - FLAG_C = CFLAG_16(res1); - - if(COND_EQ()) - { - res2 = dest2 - MASK_OUT_ABOVE_16(*compare2); - - FLAG_N = NFLAG_16(res2); - FLAG_Z = MASK_OUT_ABOVE_16(res2); - FLAG_V = VFLAG_SUB_16(*compare2, dest2, res2); - FLAG_C = CFLAG_16(res2); - - if(COND_EQ()) - { - USE_CYCLES(3); - m68ki_write_16(ea1, REG_D[(word2 >> 22) & 7]); - m68ki_write_16(ea2, REG_D[(word2 >> 6) & 7]); - return; - } - } - *compare1 = BIT_1F(word2) ? MAKE_INT_16(dest1) : MASK_OUT_BELOW_16(*compare1) | dest1; - *compare2 = BIT_F(word2) ? MAKE_INT_16(dest2) : MASK_OUT_BELOW_16(*compare2) | dest2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cas2_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_32(); - uint* compare1 = ®_D[(word2 >> 16) & 7]; - uint ea1 = REG_DA[(word2 >> 28) & 15]; - uint dest1 = m68ki_read_32(ea1); - uint res1 = dest1 - *compare1; - uint* compare2 = ®_D[word2 & 7]; - uint ea2 = REG_DA[(word2 >> 12) & 15]; - uint dest2 = m68ki_read_32(ea2); - uint res2; - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - FLAG_N = NFLAG_32(res1); - FLAG_Z = MASK_OUT_ABOVE_32(res1); - FLAG_V = VFLAG_SUB_32(*compare1, dest1, res1); - FLAG_C = CFLAG_SUB_32(*compare1, dest1, res1); - - if(COND_EQ()) - { - res2 = dest2 - *compare2; - - FLAG_N = NFLAG_32(res2); - FLAG_Z = MASK_OUT_ABOVE_32(res2); - FLAG_V = VFLAG_SUB_32(*compare2, dest2, res2); - FLAG_C = CFLAG_SUB_32(*compare2, dest2, res2); - - if(COND_EQ()) - { - USE_CYCLES(3); - m68ki_write_32(ea1, REG_D[(word2 >> 22) & 7]); - m68ki_write_32(ea2, REG_D[(word2 >> 6) & 7]); - return; - } - } - *compare1 = dest1; - *compare2 = dest2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk_16_d(void) -{ - sint src = MAKE_INT_16(DX); - sint bound = MAKE_INT_16(DY); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); -} - - -void m68k_op_chk_16_ai(void) -{ - sint src = MAKE_INT_16(DX); - sint bound = MAKE_INT_16(OPER_AY_AI_16()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); -} - - -void m68k_op_chk_16_pi(void) -{ - sint src = MAKE_INT_16(DX); - sint bound = MAKE_INT_16(OPER_AY_PI_16()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); -} - - -void m68k_op_chk_16_pd(void) -{ - sint src = MAKE_INT_16(DX); - sint bound = MAKE_INT_16(OPER_AY_PD_16()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); -} - - -void m68k_op_chk_16_di(void) -{ - sint src = MAKE_INT_16(DX); - sint bound = MAKE_INT_16(OPER_AY_DI_16()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); -} - - -void m68k_op_chk_16_ix(void) -{ - sint src = MAKE_INT_16(DX); - sint bound = MAKE_INT_16(OPER_AY_IX_16()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); -} - - -void m68k_op_chk_16_aw(void) -{ - sint src = MAKE_INT_16(DX); - sint bound = MAKE_INT_16(OPER_AW_16()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); -} - - -void m68k_op_chk_16_al(void) -{ - sint src = MAKE_INT_16(DX); - sint bound = MAKE_INT_16(OPER_AL_16()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); -} - - -void m68k_op_chk_16_pcdi(void) -{ - sint src = MAKE_INT_16(DX); - sint bound = MAKE_INT_16(OPER_PCDI_16()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); -} - - -void m68k_op_chk_16_pcix(void) -{ - sint src = MAKE_INT_16(DX); - sint bound = MAKE_INT_16(OPER_PCIX_16()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); -} - - -void m68k_op_chk_16_i(void) -{ - sint src = MAKE_INT_16(DX); - sint bound = MAKE_INT_16(OPER_I_16()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); -} - - -void m68k_op_chk_32_d(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - sint src = MAKE_INT_32(DX); - sint bound = MAKE_INT_32(DY); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk_32_ai(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - sint src = MAKE_INT_32(DX); - sint bound = MAKE_INT_32(OPER_AY_AI_32()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk_32_pi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - sint src = MAKE_INT_32(DX); - sint bound = MAKE_INT_32(OPER_AY_PI_32()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk_32_pd(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - sint src = MAKE_INT_32(DX); - sint bound = MAKE_INT_32(OPER_AY_PD_32()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk_32_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - sint src = MAKE_INT_32(DX); - sint bound = MAKE_INT_32(OPER_AY_DI_32()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk_32_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - sint src = MAKE_INT_32(DX); - sint bound = MAKE_INT_32(OPER_AY_IX_32()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk_32_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - sint src = MAKE_INT_32(DX); - sint bound = MAKE_INT_32(OPER_AW_32()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk_32_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - sint src = MAKE_INT_32(DX); - sint bound = MAKE_INT_32(OPER_AL_32()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk_32_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - sint src = MAKE_INT_32(DX); - sint bound = MAKE_INT_32(OPER_PCDI_32()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk_32_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - sint src = MAKE_INT_32(DX); - sint bound = MAKE_INT_32(OPER_PCIX_32()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk_32_i(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - sint src = MAKE_INT_32(DX); - sint bound = MAKE_INT_32(OPER_I_32()); - - if(src >= 0 && src <= bound) - { - return; - } - FLAG_N = (src < 0)<<7; - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_8_ai(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AY_AI_8(); - uint lower_bound = m68ki_read_8(ea); - uint upper_bound = m68ki_read_8(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_8(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_8_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AY_DI_8(); - uint lower_bound = m68ki_read_8(ea); - uint upper_bound = m68ki_read_8(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_8(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_8_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AY_IX_8(); - uint lower_bound = m68ki_read_8(ea); - uint upper_bound = m68ki_read_8(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_8(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_8_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AW_8(); - uint lower_bound = m68ki_read_8(ea); - uint upper_bound = m68ki_read_8(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_8(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_8_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AL_8(); - uint lower_bound = m68ki_read_8(ea); - uint upper_bound = m68ki_read_8(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_8(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_8_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_PCDI_8(); - uint lower_bound = m68ki_read_8(ea); - uint upper_bound = m68ki_read_8(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_8(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_8_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_PCIX_8(); - uint lower_bound = m68ki_read_8(ea); - uint upper_bound = m68ki_read_8(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_8(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_16_ai(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AY_AI_16(); - uint lower_bound = m68ki_read_16(ea); - uint upper_bound = m68ki_read_16(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_16(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_16_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AY_DI_16(); - uint lower_bound = m68ki_read_16(ea); - uint upper_bound = m68ki_read_16(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_16(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_16_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AY_IX_16(); - uint lower_bound = m68ki_read_16(ea); - uint upper_bound = m68ki_read_16(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_16(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_16_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AW_16(); - uint lower_bound = m68ki_read_16(ea); - uint upper_bound = m68ki_read_16(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_16(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_16_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AL_16(); - uint lower_bound = m68ki_read_16(ea); - uint upper_bound = m68ki_read_16(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_16(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_16_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_PCDI_16(); - uint lower_bound = m68ki_read_16(ea); - uint upper_bound = m68ki_read_16(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_16(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_16_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_PCIX_16(); - uint lower_bound = m68ki_read_16(ea); - uint upper_bound = m68ki_read_16(ea + 1); - - if(!BIT_F(word2)) - compare = MAKE_INT_16(compare); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C); - FLAG_C = CFLAG_16(FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_32_ai(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AY_AI_32(); - uint lower_bound = m68ki_read_32(ea); - uint upper_bound = m68ki_read_32(ea + 1); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_32_di(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AY_DI_32(); - uint lower_bound = m68ki_read_32(ea); - uint upper_bound = m68ki_read_32(ea + 1); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_32_ix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AY_IX_32(); - uint lower_bound = m68ki_read_32(ea); - uint upper_bound = m68ki_read_32(ea + 1); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_32_aw(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AW_32(); - uint lower_bound = m68ki_read_32(ea); - uint upper_bound = m68ki_read_32(ea + 1); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_32_al(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_AL_32(); - uint lower_bound = m68ki_read_32(ea); - uint upper_bound = m68ki_read_32(ea + 1); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_32_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_PCDI_32(); - uint lower_bound = m68ki_read_32(ea); - uint upper_bound = m68ki_read_32(ea + 1); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_chk2cmp2_32_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint compare = REG_DA[(word2 >> 12) & 15]; - uint ea = EA_PCIX_32(); - uint lower_bound = m68ki_read_32(ea); - uint upper_bound = m68ki_read_32(ea + 1); - - FLAG_C = compare - lower_bound; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); - if(COND_CS()) - { - if(BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - return; - } - - FLAG_C = upper_bound - compare; - FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C); - FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); - if(COND_CS() && BIT_B(word2)) - m68ki_exception_trap(EXCEPTION_CHK); - - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_clr_8_d(void) -{ - DY &= 0xffffff00; - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_8_al(void) -{ - m68ki_write_8(EA_AL_8(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_16_d(void) -{ - DY &= 0xffff0000; - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_16_ai(void) -{ - m68ki_write_16(EA_AY_AI_16(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_16_pi(void) -{ - m68ki_write_16(EA_AY_PI_16(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_16_pd(void) -{ - m68ki_write_16(EA_AY_PD_16(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_16_di(void) -{ - m68ki_write_16(EA_AY_DI_16(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_16_ix(void) -{ - m68ki_write_16(EA_AY_IX_16(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_16_aw(void) -{ - m68ki_write_16(EA_AW_16(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_16_al(void) -{ - m68ki_write_16(EA_AL_16(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_32_d(void) -{ - DY = 0; - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_32_ai(void) -{ - m68ki_write_32(EA_AY_AI_32(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_32_pi(void) -{ - m68ki_write_32(EA_AY_PI_32(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_32_pd(void) -{ - m68ki_write_32(EA_AY_PD_32(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_32_di(void) -{ - m68ki_write_32(EA_AY_DI_32(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_32_ix(void) -{ - m68ki_write_32(EA_AY_IX_32(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_32_aw(void) -{ - m68ki_write_32(EA_AW_32(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_clr_32_al(void) -{ - m68ki_write_32(EA_AL_32(), 0); - - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; -} - - -void m68k_op_cmp_8_d(void) -{ - uint src = MASK_OUT_ABOVE_8(DY); - uint dst = MASK_OUT_ABOVE_8(DX); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmp_8_ai(void) -{ - uint src = OPER_AY_AI_8(); - uint dst = MASK_OUT_ABOVE_8(DX); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmp_8_pi(void) -{ - uint src = OPER_AY_PI_8(); - uint dst = MASK_OUT_ABOVE_8(DX); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmp_8_pi7(void) -{ - uint src = OPER_A7_PI_8(); - uint dst = MASK_OUT_ABOVE_8(DX); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmp_8_pd(void) -{ - uint src = OPER_AY_PD_8(); - uint dst = MASK_OUT_ABOVE_8(DX); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmp_8_pd7(void) -{ - uint src = OPER_A7_PD_8(); - uint dst = MASK_OUT_ABOVE_8(DX); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmp_8_di(void) -{ - uint src = OPER_AY_DI_8(); - uint dst = MASK_OUT_ABOVE_8(DX); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmp_8_ix(void) -{ - uint src = OPER_AY_IX_8(); - uint dst = MASK_OUT_ABOVE_8(DX); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmp_8_aw(void) -{ - uint src = OPER_AW_8(); - uint dst = MASK_OUT_ABOVE_8(DX); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmp_8_al(void) -{ - uint src = OPER_AL_8(); - uint dst = MASK_OUT_ABOVE_8(DX); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmp_8_pcdi(void) -{ - uint src = OPER_PCDI_8(); - uint dst = MASK_OUT_ABOVE_8(DX); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmp_8_pcix(void) -{ - uint src = OPER_PCIX_8(); - uint dst = MASK_OUT_ABOVE_8(DX); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmp_8_i(void) -{ - uint src = OPER_I_8(); - uint dst = MASK_OUT_ABOVE_8(DX); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmp_16_d(void) -{ - uint src = MASK_OUT_ABOVE_16(DY); - uint dst = MASK_OUT_ABOVE_16(DX); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmp_16_a(void) -{ - uint src = MASK_OUT_ABOVE_16(AY); - uint dst = MASK_OUT_ABOVE_16(DX); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmp_16_ai(void) -{ - uint src = OPER_AY_AI_16(); - uint dst = MASK_OUT_ABOVE_16(DX); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmp_16_pi(void) -{ - uint src = OPER_AY_PI_16(); - uint dst = MASK_OUT_ABOVE_16(DX); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmp_16_pd(void) -{ - uint src = OPER_AY_PD_16(); - uint dst = MASK_OUT_ABOVE_16(DX); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmp_16_di(void) -{ - uint src = OPER_AY_DI_16(); - uint dst = MASK_OUT_ABOVE_16(DX); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmp_16_ix(void) -{ - uint src = OPER_AY_IX_16(); - uint dst = MASK_OUT_ABOVE_16(DX); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmp_16_aw(void) -{ - uint src = OPER_AW_16(); - uint dst = MASK_OUT_ABOVE_16(DX); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmp_16_al(void) -{ - uint src = OPER_AL_16(); - uint dst = MASK_OUT_ABOVE_16(DX); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmp_16_pcdi(void) -{ - uint src = OPER_PCDI_16(); - uint dst = MASK_OUT_ABOVE_16(DX); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmp_16_pcix(void) -{ - uint src = OPER_PCIX_16(); - uint dst = MASK_OUT_ABOVE_16(DX); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmp_16_i(void) -{ - uint src = OPER_I_16(); - uint dst = MASK_OUT_ABOVE_16(DX); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmp_32_d(void) -{ - uint src = DY; - uint dst = DX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmp_32_a(void) -{ - uint src = AY; - uint dst = DX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmp_32_ai(void) -{ - uint src = OPER_AY_AI_32(); - uint dst = DX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmp_32_pi(void) -{ - uint src = OPER_AY_PI_32(); - uint dst = DX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmp_32_pd(void) -{ - uint src = OPER_AY_PD_32(); - uint dst = DX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmp_32_di(void) -{ - uint src = OPER_AY_DI_32(); - uint dst = DX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmp_32_ix(void) -{ - uint src = OPER_AY_IX_32(); - uint dst = DX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmp_32_aw(void) -{ - uint src = OPER_AW_32(); - uint dst = DX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmp_32_al(void) -{ - uint src = OPER_AL_32(); - uint dst = DX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmp_32_pcdi(void) -{ - uint src = OPER_PCDI_32(); - uint dst = DX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmp_32_pcix(void) -{ - uint src = OPER_PCIX_32(); - uint dst = DX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmp_32_i(void) -{ - uint src = OPER_I_32(); - uint dst = DX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_16_d(void) -{ - uint src = MAKE_INT_16(DY); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_16_a(void) -{ - uint src = MAKE_INT_16(AY); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_16_ai(void) -{ - uint src = MAKE_INT_16(OPER_AY_AI_16()); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_16_pi(void) -{ - uint src = MAKE_INT_16(OPER_AY_PI_16()); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_16_pd(void) -{ - uint src = MAKE_INT_16(OPER_AY_PD_16()); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_16_di(void) -{ - uint src = MAKE_INT_16(OPER_AY_DI_16()); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_16_ix(void) -{ - uint src = MAKE_INT_16(OPER_AY_IX_16()); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_16_aw(void) -{ - uint src = MAKE_INT_16(OPER_AW_16()); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_16_al(void) -{ - uint src = MAKE_INT_16(OPER_AL_16()); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_16_pcdi(void) -{ - uint src = MAKE_INT_16(OPER_PCDI_16()); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_16_pcix(void) -{ - uint src = MAKE_INT_16(OPER_PCIX_16()); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_16_i(void) -{ - uint src = MAKE_INT_16(OPER_I_16()); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_32_d(void) -{ - uint src = DY; - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_32_a(void) -{ - uint src = AY; - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_32_ai(void) -{ - uint src = OPER_AY_AI_32(); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_32_pi(void) -{ - uint src = OPER_AY_PI_32(); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_32_pd(void) -{ - uint src = OPER_AY_PD_32(); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_32_di(void) -{ - uint src = OPER_AY_DI_32(); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_32_ix(void) -{ - uint src = OPER_AY_IX_32(); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_32_aw(void) -{ - uint src = OPER_AW_32(); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_32_al(void) -{ - uint src = OPER_AL_32(); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_32_pcdi(void) -{ - uint src = OPER_PCDI_32(); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_32_pcix(void) -{ - uint src = OPER_PCIX_32(); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpa_32_i(void) -{ - uint src = OPER_I_32(); - uint dst = AX; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpi_8_d(void) -{ - uint src = OPER_I_8(); - uint dst = MASK_OUT_ABOVE_8(DY); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpi_8_ai(void) -{ - uint src = OPER_I_8(); - uint dst = OPER_AY_AI_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpi_8_pi(void) -{ - uint src = OPER_I_8(); - uint dst = OPER_AY_PI_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpi_8_pi7(void) -{ - uint src = OPER_I_8(); - uint dst = OPER_A7_PI_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpi_8_pd(void) -{ - uint src = OPER_I_8(); - uint dst = OPER_AY_PD_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpi_8_pd7(void) -{ - uint src = OPER_I_8(); - uint dst = OPER_A7_PD_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpi_8_di(void) -{ - uint src = OPER_I_8(); - uint dst = OPER_AY_DI_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpi_8_ix(void) -{ - uint src = OPER_I_8(); - uint dst = OPER_AY_IX_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpi_8_aw(void) -{ - uint src = OPER_I_8(); - uint dst = OPER_AW_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpi_8_al(void) -{ - uint src = OPER_I_8(); - uint dst = OPER_AL_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpi_8_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint src = OPER_I_8(); - uint dst = OPER_PCDI_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cmpi_8_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint src = OPER_I_8(); - uint dst = OPER_PCIX_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cmpi_16_d(void) -{ - uint src = OPER_I_16(); - uint dst = MASK_OUT_ABOVE_16(DY); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmpi_16_ai(void) -{ - uint src = OPER_I_16(); - uint dst = OPER_AY_AI_16(); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmpi_16_pi(void) -{ - uint src = OPER_I_16(); - uint dst = OPER_AY_PI_16(); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmpi_16_pd(void) -{ - uint src = OPER_I_16(); - uint dst = OPER_AY_PD_16(); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmpi_16_di(void) -{ - uint src = OPER_I_16(); - uint dst = OPER_AY_DI_16(); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmpi_16_ix(void) -{ - uint src = OPER_I_16(); - uint dst = OPER_AY_IX_16(); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmpi_16_aw(void) -{ - uint src = OPER_I_16(); - uint dst = OPER_AW_16(); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmpi_16_al(void) -{ - uint src = OPER_I_16(); - uint dst = OPER_AL_16(); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmpi_16_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint src = OPER_I_16(); - uint dst = OPER_PCDI_16(); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cmpi_16_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint src = OPER_I_16(); - uint dst = OPER_PCIX_16(); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cmpi_32_d(void) -{ - uint src = OPER_I_32(); - uint dst = DY; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpi_32_ai(void) -{ - uint src = OPER_I_32(); - uint dst = OPER_AY_AI_32(); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpi_32_pi(void) -{ - uint src = OPER_I_32(); - uint dst = OPER_AY_PI_32(); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpi_32_pd(void) -{ - uint src = OPER_I_32(); - uint dst = OPER_AY_PD_32(); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpi_32_di(void) -{ - uint src = OPER_I_32(); - uint dst = OPER_AY_DI_32(); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpi_32_ix(void) -{ - uint src = OPER_I_32(); - uint dst = OPER_AY_IX_32(); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpi_32_aw(void) -{ - uint src = OPER_I_32(); - uint dst = OPER_AW_32(); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpi_32_al(void) -{ - uint src = OPER_I_32(); - uint dst = OPER_AL_32(); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cmpi_32_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint src = OPER_I_32(); - uint dst = OPER_PCDI_32(); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cmpi_32_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint src = OPER_I_32(); - uint dst = OPER_PCIX_32(); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_cmpm_8_ax7(void) -{ - uint src = OPER_AY_PI_8(); - uint dst = OPER_A7_PI_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpm_8_ay7(void) -{ - uint src = OPER_A7_PI_8(); - uint dst = OPER_AX_PI_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpm_8_axy7(void) -{ - uint src = OPER_A7_PI_8(); - uint dst = OPER_A7_PI_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpm_8(void) -{ - uint src = OPER_AY_PI_8(); - uint dst = OPER_AX_PI_8(); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_C = CFLAG_8(res); -} - - -void m68k_op_cmpm_16(void) -{ - uint src = OPER_AY_PI_16(); - uint dst = OPER_AX_PI_16(); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_C = CFLAG_16(res); -} - - -void m68k_op_cmpm_32(void) -{ - uint src = OPER_AY_PI_32(); - uint dst = OPER_AX_PI_32(); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_C = CFLAG_SUB_32(src, dst, res); -} - - -void m68k_op_cpbcc_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, - m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); - return; - } - m68ki_exception_1111(); -} - - -void m68k_op_cpdbcc_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, - m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); - return; - } - m68ki_exception_1111(); -} - - -void m68k_op_cpgen_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, - m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); - return; - } - m68ki_exception_1111(); -} - - -void m68k_op_cpscc_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, - m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); - return; - } - m68ki_exception_1111(); -} - - -void m68k_op_cptrapcc_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, - m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); - return; - } - m68ki_exception_1111(); -} - - -/* ======================================================================== */ -/* ============================== END OF FILE ============================= */ -/* ======================================================================== */ - - diff --git a/source/m68k/m68kopdm.c b/source/m68k/m68kopdm.c deleted file mode 100644 index 7a47d63..0000000 --- a/source/m68k/m68kopdm.c +++ /dev/null @@ -1,13286 +0,0 @@ -#include "m68kcpu.h" - -/* ======================================================================== */ -/* ========================= INSTRUCTION HANDLERS ========================= */ -/* ======================================================================== */ - - -void m68k_op_dbt_16(void) -{ - REG_PC += 2; -} - - -void m68k_op_dbf_16(void) -{ - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - return; - } - REG_PC += 2; -} - - -void m68k_op_dbhi_16(void) -{ - if(COND_NOT_HI()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_dbls_16(void) -{ - if(COND_NOT_LS()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_dbcc_16(void) -{ - if(COND_NOT_CC()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_dbcs_16(void) -{ - if(COND_NOT_CS()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_dbne_16(void) -{ - if(COND_NOT_NE()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_dbeq_16(void) -{ - if(COND_NOT_EQ()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_dbvc_16(void) -{ - if(COND_NOT_VC()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_dbvs_16(void) -{ - if(COND_NOT_VS()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_dbpl_16(void) -{ - if(COND_NOT_PL()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_dbmi_16(void) -{ - if(COND_NOT_MI()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_dbge_16(void) -{ - if(COND_NOT_GE()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_dblt_16(void) -{ - if(COND_NOT_LT()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_dbgt_16(void) -{ - if(COND_NOT_GT()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_dble_16(void) -{ - if(COND_NOT_LE()) - { - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(*r_dst - 1); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - if(res != 0xffff) - { - uint offset = OPER_I_16(); - REG_PC -= 2; - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_branch_16(offset); - USE_CYCLES(CYC_DBCC_F_NOEXP); - return; - } - REG_PC += 2; - USE_CYCLES(CYC_DBCC_F_EXP); - return; - } - REG_PC += 2; -} - - -void m68k_op_divs_16_d(void) -{ - uint* r_dst = &DX; - sint src = MAKE_INT_16(DY); - sint quotient; - sint remainder; - - if(src != 0) - { - if((uint32)*r_dst == 0x80000000 && src == -1) - { - FLAG_Z = 0; - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = 0; - return; - } - - quotient = MAKE_INT_32(*r_dst) / src; - remainder = MAKE_INT_32(*r_dst) % src; - - if(quotient == MAKE_INT_16(quotient)) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divs_16_ai(void) -{ - uint* r_dst = &DX; - sint src = MAKE_INT_16(OPER_AY_AI_16()); - sint quotient; - sint remainder; - - if(src != 0) - { - if((uint32)*r_dst == 0x80000000 && src == -1) - { - FLAG_Z = 0; - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = 0; - return; - } - - quotient = MAKE_INT_32(*r_dst) / src; - remainder = MAKE_INT_32(*r_dst) % src; - - if(quotient == MAKE_INT_16(quotient)) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divs_16_pi(void) -{ - uint* r_dst = &DX; - sint src = MAKE_INT_16(OPER_AY_PI_16()); - sint quotient; - sint remainder; - - if(src != 0) - { - if((uint32)*r_dst == 0x80000000 && src == -1) - { - FLAG_Z = 0; - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = 0; - return; - } - - quotient = MAKE_INT_32(*r_dst) / src; - remainder = MAKE_INT_32(*r_dst) % src; - - if(quotient == MAKE_INT_16(quotient)) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divs_16_pd(void) -{ - uint* r_dst = &DX; - sint src = MAKE_INT_16(OPER_AY_PD_16()); - sint quotient; - sint remainder; - - if(src != 0) - { - if((uint32)*r_dst == 0x80000000 && src == -1) - { - FLAG_Z = 0; - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = 0; - return; - } - - quotient = MAKE_INT_32(*r_dst) / src; - remainder = MAKE_INT_32(*r_dst) % src; - - if(quotient == MAKE_INT_16(quotient)) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divs_16_di(void) -{ - uint* r_dst = &DX; - sint src = MAKE_INT_16(OPER_AY_DI_16()); - sint quotient; - sint remainder; - - if(src != 0) - { - if((uint32)*r_dst == 0x80000000 && src == -1) - { - FLAG_Z = 0; - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = 0; - return; - } - - quotient = MAKE_INT_32(*r_dst) / src; - remainder = MAKE_INT_32(*r_dst) % src; - - if(quotient == MAKE_INT_16(quotient)) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divs_16_ix(void) -{ - uint* r_dst = &DX; - sint src = MAKE_INT_16(OPER_AY_IX_16()); - sint quotient; - sint remainder; - - if(src != 0) - { - if((uint32)*r_dst == 0x80000000 && src == -1) - { - FLAG_Z = 0; - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = 0; - return; - } - - quotient = MAKE_INT_32(*r_dst) / src; - remainder = MAKE_INT_32(*r_dst) % src; - - if(quotient == MAKE_INT_16(quotient)) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divs_16_aw(void) -{ - uint* r_dst = &DX; - sint src = MAKE_INT_16(OPER_AW_16()); - sint quotient; - sint remainder; - - if(src != 0) - { - if((uint32)*r_dst == 0x80000000 && src == -1) - { - FLAG_Z = 0; - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = 0; - return; - } - - quotient = MAKE_INT_32(*r_dst) / src; - remainder = MAKE_INT_32(*r_dst) % src; - - if(quotient == MAKE_INT_16(quotient)) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divs_16_al(void) -{ - uint* r_dst = &DX; - sint src = MAKE_INT_16(OPER_AL_16()); - sint quotient; - sint remainder; - - if(src != 0) - { - if((uint32)*r_dst == 0x80000000 && src == -1) - { - FLAG_Z = 0; - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = 0; - return; - } - - quotient = MAKE_INT_32(*r_dst) / src; - remainder = MAKE_INT_32(*r_dst) % src; - - if(quotient == MAKE_INT_16(quotient)) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divs_16_pcdi(void) -{ - uint* r_dst = &DX; - sint src = MAKE_INT_16(OPER_PCDI_16()); - sint quotient; - sint remainder; - - if(src != 0) - { - if((uint32)*r_dst == 0x80000000 && src == -1) - { - FLAG_Z = 0; - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = 0; - return; - } - - quotient = MAKE_INT_32(*r_dst) / src; - remainder = MAKE_INT_32(*r_dst) % src; - - if(quotient == MAKE_INT_16(quotient)) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divs_16_pcix(void) -{ - uint* r_dst = &DX; - sint src = MAKE_INT_16(OPER_PCIX_16()); - sint quotient; - sint remainder; - - if(src != 0) - { - if((uint32)*r_dst == 0x80000000 && src == -1) - { - FLAG_Z = 0; - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = 0; - return; - } - - quotient = MAKE_INT_32(*r_dst) / src; - remainder = MAKE_INT_32(*r_dst) % src; - - if(quotient == MAKE_INT_16(quotient)) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divs_16_i(void) -{ - uint* r_dst = &DX; - sint src = MAKE_INT_16(OPER_I_16()); - sint quotient; - sint remainder; - - if(src != 0) - { - if((uint32)*r_dst == 0x80000000 && src == -1) - { - FLAG_Z = 0; - FLAG_N = NFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = 0; - return; - } - - quotient = MAKE_INT_32(*r_dst) / src; - remainder = MAKE_INT_32(*r_dst) % src; - - if(quotient == MAKE_INT_16(quotient)) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divu_16_d(void) -{ - uint* r_dst = &DX; - uint src = MASK_OUT_ABOVE_16(DY); - - if(src != 0) - { - uint quotient = *r_dst / src; - uint remainder = *r_dst % src; - - if(quotient < 0x10000) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divu_16_ai(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_AI_16(); - - if(src != 0) - { - uint quotient = *r_dst / src; - uint remainder = *r_dst % src; - - if(quotient < 0x10000) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divu_16_pi(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PI_16(); - - if(src != 0) - { - uint quotient = *r_dst / src; - uint remainder = *r_dst % src; - - if(quotient < 0x10000) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divu_16_pd(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PD_16(); - - if(src != 0) - { - uint quotient = *r_dst / src; - uint remainder = *r_dst % src; - - if(quotient < 0x10000) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divu_16_di(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_DI_16(); - - if(src != 0) - { - uint quotient = *r_dst / src; - uint remainder = *r_dst % src; - - if(quotient < 0x10000) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divu_16_ix(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_IX_16(); - - if(src != 0) - { - uint quotient = *r_dst / src; - uint remainder = *r_dst % src; - - if(quotient < 0x10000) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divu_16_aw(void) -{ - uint* r_dst = &DX; - uint src = OPER_AW_16(); - - if(src != 0) - { - uint quotient = *r_dst / src; - uint remainder = *r_dst % src; - - if(quotient < 0x10000) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divu_16_al(void) -{ - uint* r_dst = &DX; - uint src = OPER_AL_16(); - - if(src != 0) - { - uint quotient = *r_dst / src; - uint remainder = *r_dst % src; - - if(quotient < 0x10000) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divu_16_pcdi(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCDI_16(); - - if(src != 0) - { - uint quotient = *r_dst / src; - uint remainder = *r_dst % src; - - if(quotient < 0x10000) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divu_16_pcix(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCIX_16(); - - if(src != 0) - { - uint quotient = *r_dst / src; - uint remainder = *r_dst % src; - - if(quotient < 0x10000) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divu_16_i(void) -{ - uint* r_dst = &DX; - uint src = OPER_I_16(); - - if(src != 0) - { - uint quotient = *r_dst / src; - uint remainder = *r_dst % src; - - if(quotient < 0x10000) - { - FLAG_Z = quotient; - FLAG_N = NFLAG_16(quotient); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); - return; - } - FLAG_V = VFLAG_SET; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); -} - - -void m68k_op_divl_32_d(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 divisor = DY; - uint64 dividend = 0; - uint64 quotient = 0; - uint64 remainder = 0; - - if(divisor != 0) - { - if(BIT_A(word2)) /* 64 bit */ - { - dividend = REG_D[word2 & 7]; - dividend <<= 32; - dividend |= REG_D[(word2 >> 12) & 7]; - - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); - if((sint64)quotient != (sint64)((sint32)quotient)) - { - FLAG_V = VFLAG_SET; - return; - } - } - else /* unsigned */ - { - quotient = dividend / divisor; - if(quotient > 0xffffffff) - { - FLAG_V = VFLAG_SET; - return; - } - remainder = dividend % divisor; - } - } - else /* 32 bit */ - { - dividend = REG_D[(word2 >> 12) & 7]; - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); - } - else /* unsigned */ - { - quotient = dividend / divisor; - remainder = dividend % divisor; - } - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint divisor = DY; - uint dividend_hi = REG_D[word2 & 7]; - uint dividend_lo = REG_D[(word2 >> 12) & 7]; - uint quotient = 0; - uint remainder = 0; - uint dividend_neg = 0; - uint divisor_neg = 0; - sint i; - uint overflow; - - if(divisor != 0) - { - /* quad / long : long quotient, long remainder */ - if(BIT_A(word2)) - { - if(BIT_B(word2)) /* signed */ - { - /* special case in signed divide */ - if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - REG_D[word2 & 7] = 0; - REG_D[(word2 >> 12) & 7] = 0x80000000; - - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - if(GET_MSB_32(dividend_hi)) - { - dividend_neg = 1; - dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); - dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); - } - if(GET_MSB_32(divisor)) - { - divisor_neg = 1; - divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); - - } - } - - /* if the upper long is greater than the divisor, we're overflowing. */ - if(dividend_hi >= divisor) - { - FLAG_V = VFLAG_SET; - return; - } - - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - remainder = (remainder << 1) + ((dividend_hi >> i) & 1); - if(remainder >= divisor) - { - remainder -= divisor; - quotient++; - } - } - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - overflow = GET_MSB_32(remainder); - remainder = (remainder << 1) + ((dividend_lo >> i) & 1); - if(remainder >= divisor || overflow) - { - remainder -= divisor; - quotient++; - } - } - - if(BIT_B(word2)) /* signed */ - { - if(quotient > 0x7fffffff) - { - FLAG_V = VFLAG_SET; - return; - } - if(dividend_neg) - { - remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - if(divisor_neg) - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - - /* long / long: long quotient, maybe long remainder */ - if(BIT_B(word2)) /* signed */ - { - /* Special case in divide */ - if(dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - REG_D[(word2 >> 12) & 7] = 0x80000000; - REG_D[word2 & 7] = 0; - return; - } - REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); - } - else - { - REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); - } - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_divl_32_ai(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 divisor = OPER_AY_AI_32(); - uint64 dividend = 0; - uint64 quotient = 0; - uint64 remainder = 0; - - if(divisor != 0) - { - if(BIT_A(word2)) /* 64 bit */ - { - dividend = REG_D[word2 & 7]; - dividend <<= 32; - dividend |= REG_D[(word2 >> 12) & 7]; - - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); - if((sint64)quotient != (sint64)((sint32)quotient)) - { - FLAG_V = VFLAG_SET; - return; - } - } - else /* unsigned */ - { - quotient = dividend / divisor; - if(quotient > 0xffffffff) - { - FLAG_V = VFLAG_SET; - return; - } - remainder = dividend % divisor; - } - } - else /* 32 bit */ - { - dividend = REG_D[(word2 >> 12) & 7]; - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); - } - else /* unsigned */ - { - quotient = dividend / divisor; - remainder = dividend % divisor; - } - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint divisor = OPER_AY_AI_32(); - uint dividend_hi = REG_D[word2 & 7]; - uint dividend_lo = REG_D[(word2 >> 12) & 7]; - uint quotient = 0; - uint remainder = 0; - uint dividend_neg = 0; - uint divisor_neg = 0; - sint i; - uint overflow; - - if(divisor != 0) - { - /* quad / long : long quotient, long remainder */ - if(BIT_A(word2)) - { - if(BIT_B(word2)) /* signed */ - { - /* special case in signed divide */ - if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - REG_D[word2 & 7] = 0; - REG_D[(word2 >> 12) & 7] = 0x80000000; - - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - if(GET_MSB_32(dividend_hi)) - { - dividend_neg = 1; - dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); - dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); - } - if(GET_MSB_32(divisor)) - { - divisor_neg = 1; - divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); - - } - } - - /* if the upper long is greater than the divisor, we're overflowing. */ - if(dividend_hi >= divisor) - { - FLAG_V = VFLAG_SET; - return; - } - - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - remainder = (remainder << 1) + ((dividend_hi >> i) & 1); - if(remainder >= divisor) - { - remainder -= divisor; - quotient++; - } - } - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - overflow = GET_MSB_32(remainder); - remainder = (remainder << 1) + ((dividend_lo >> i) & 1); - if(remainder >= divisor || overflow) - { - remainder -= divisor; - quotient++; - } - } - - if(BIT_B(word2)) /* signed */ - { - if(quotient > 0x7fffffff) - { - FLAG_V = VFLAG_SET; - return; - } - if(dividend_neg) - { - remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - if(divisor_neg) - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - - /* long / long: long quotient, maybe long remainder */ - if(BIT_B(word2)) /* signed */ - { - /* Special case in divide */ - if(dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - REG_D[(word2 >> 12) & 7] = 0x80000000; - REG_D[word2 & 7] = 0; - return; - } - REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); - } - else - { - REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); - } - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_divl_32_pi(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 divisor = OPER_AY_PI_32(); - uint64 dividend = 0; - uint64 quotient = 0; - uint64 remainder = 0; - - if(divisor != 0) - { - if(BIT_A(word2)) /* 64 bit */ - { - dividend = REG_D[word2 & 7]; - dividend <<= 32; - dividend |= REG_D[(word2 >> 12) & 7]; - - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); - if((sint64)quotient != (sint64)((sint32)quotient)) - { - FLAG_V = VFLAG_SET; - return; - } - } - else /* unsigned */ - { - quotient = dividend / divisor; - if(quotient > 0xffffffff) - { - FLAG_V = VFLAG_SET; - return; - } - remainder = dividend % divisor; - } - } - else /* 32 bit */ - { - dividend = REG_D[(word2 >> 12) & 7]; - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); - } - else /* unsigned */ - { - quotient = dividend / divisor; - remainder = dividend % divisor; - } - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint divisor = OPER_AY_PI_32(); - uint dividend_hi = REG_D[word2 & 7]; - uint dividend_lo = REG_D[(word2 >> 12) & 7]; - uint quotient = 0; - uint remainder = 0; - uint dividend_neg = 0; - uint divisor_neg = 0; - sint i; - uint overflow; - - if(divisor != 0) - { - /* quad / long : long quotient, long remainder */ - if(BIT_A(word2)) - { - if(BIT_B(word2)) /* signed */ - { - /* special case in signed divide */ - if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - REG_D[word2 & 7] = 0; - REG_D[(word2 >> 12) & 7] = 0x80000000; - - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - if(GET_MSB_32(dividend_hi)) - { - dividend_neg = 1; - dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); - dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); - } - if(GET_MSB_32(divisor)) - { - divisor_neg = 1; - divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); - - } - } - - /* if the upper long is greater than the divisor, we're overflowing. */ - if(dividend_hi >= divisor) - { - FLAG_V = VFLAG_SET; - return; - } - - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - remainder = (remainder << 1) + ((dividend_hi >> i) & 1); - if(remainder >= divisor) - { - remainder -= divisor; - quotient++; - } - } - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - overflow = GET_MSB_32(remainder); - remainder = (remainder << 1) + ((dividend_lo >> i) & 1); - if(remainder >= divisor || overflow) - { - remainder -= divisor; - quotient++; - } - } - - if(BIT_B(word2)) /* signed */ - { - if(quotient > 0x7fffffff) - { - FLAG_V = VFLAG_SET; - return; - } - if(dividend_neg) - { - remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - if(divisor_neg) - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - - /* long / long: long quotient, maybe long remainder */ - if(BIT_B(word2)) /* signed */ - { - /* Special case in divide */ - if(dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - REG_D[(word2 >> 12) & 7] = 0x80000000; - REG_D[word2 & 7] = 0; - return; - } - REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); - } - else - { - REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); - } - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_divl_32_pd(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 divisor = OPER_AY_PD_32(); - uint64 dividend = 0; - uint64 quotient = 0; - uint64 remainder = 0; - - if(divisor != 0) - { - if(BIT_A(word2)) /* 64 bit */ - { - dividend = REG_D[word2 & 7]; - dividend <<= 32; - dividend |= REG_D[(word2 >> 12) & 7]; - - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); - if((sint64)quotient != (sint64)((sint32)quotient)) - { - FLAG_V = VFLAG_SET; - return; - } - } - else /* unsigned */ - { - quotient = dividend / divisor; - if(quotient > 0xffffffff) - { - FLAG_V = VFLAG_SET; - return; - } - remainder = dividend % divisor; - } - } - else /* 32 bit */ - { - dividend = REG_D[(word2 >> 12) & 7]; - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); - } - else /* unsigned */ - { - quotient = dividend / divisor; - remainder = dividend % divisor; - } - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint divisor = OPER_AY_PD_32(); - uint dividend_hi = REG_D[word2 & 7]; - uint dividend_lo = REG_D[(word2 >> 12) & 7]; - uint quotient = 0; - uint remainder = 0; - uint dividend_neg = 0; - uint divisor_neg = 0; - sint i; - uint overflow; - - if(divisor != 0) - { - /* quad / long : long quotient, long remainder */ - if(BIT_A(word2)) - { - if(BIT_B(word2)) /* signed */ - { - /* special case in signed divide */ - if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - REG_D[word2 & 7] = 0; - REG_D[(word2 >> 12) & 7] = 0x80000000; - - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - if(GET_MSB_32(dividend_hi)) - { - dividend_neg = 1; - dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); - dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); - } - if(GET_MSB_32(divisor)) - { - divisor_neg = 1; - divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); - - } - } - - /* if the upper long is greater than the divisor, we're overflowing. */ - if(dividend_hi >= divisor) - { - FLAG_V = VFLAG_SET; - return; - } - - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - remainder = (remainder << 1) + ((dividend_hi >> i) & 1); - if(remainder >= divisor) - { - remainder -= divisor; - quotient++; - } - } - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - overflow = GET_MSB_32(remainder); - remainder = (remainder << 1) + ((dividend_lo >> i) & 1); - if(remainder >= divisor || overflow) - { - remainder -= divisor; - quotient++; - } - } - - if(BIT_B(word2)) /* signed */ - { - if(quotient > 0x7fffffff) - { - FLAG_V = VFLAG_SET; - return; - } - if(dividend_neg) - { - remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - if(divisor_neg) - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - - /* long / long: long quotient, maybe long remainder */ - if(BIT_B(word2)) /* signed */ - { - /* Special case in divide */ - if(dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - REG_D[(word2 >> 12) & 7] = 0x80000000; - REG_D[word2 & 7] = 0; - return; - } - REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); - } - else - { - REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); - } - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_divl_32_di(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 divisor = OPER_AY_DI_32(); - uint64 dividend = 0; - uint64 quotient = 0; - uint64 remainder = 0; - - if(divisor != 0) - { - if(BIT_A(word2)) /* 64 bit */ - { - dividend = REG_D[word2 & 7]; - dividend <<= 32; - dividend |= REG_D[(word2 >> 12) & 7]; - - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); - if((sint64)quotient != (sint64)((sint32)quotient)) - { - FLAG_V = VFLAG_SET; - return; - } - } - else /* unsigned */ - { - quotient = dividend / divisor; - if(quotient > 0xffffffff) - { - FLAG_V = VFLAG_SET; - return; - } - remainder = dividend % divisor; - } - } - else /* 32 bit */ - { - dividend = REG_D[(word2 >> 12) & 7]; - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); - } - else /* unsigned */ - { - quotient = dividend / divisor; - remainder = dividend % divisor; - } - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint divisor = OPER_AY_DI_32(); - uint dividend_hi = REG_D[word2 & 7]; - uint dividend_lo = REG_D[(word2 >> 12) & 7]; - uint quotient = 0; - uint remainder = 0; - uint dividend_neg = 0; - uint divisor_neg = 0; - sint i; - uint overflow; - - if(divisor != 0) - { - /* quad / long : long quotient, long remainder */ - if(BIT_A(word2)) - { - if(BIT_B(word2)) /* signed */ - { - /* special case in signed divide */ - if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - REG_D[word2 & 7] = 0; - REG_D[(word2 >> 12) & 7] = 0x80000000; - - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - if(GET_MSB_32(dividend_hi)) - { - dividend_neg = 1; - dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); - dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); - } - if(GET_MSB_32(divisor)) - { - divisor_neg = 1; - divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); - - } - } - - /* if the upper long is greater than the divisor, we're overflowing. */ - if(dividend_hi >= divisor) - { - FLAG_V = VFLAG_SET; - return; - } - - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - remainder = (remainder << 1) + ((dividend_hi >> i) & 1); - if(remainder >= divisor) - { - remainder -= divisor; - quotient++; - } - } - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - overflow = GET_MSB_32(remainder); - remainder = (remainder << 1) + ((dividend_lo >> i) & 1); - if(remainder >= divisor || overflow) - { - remainder -= divisor; - quotient++; - } - } - - if(BIT_B(word2)) /* signed */ - { - if(quotient > 0x7fffffff) - { - FLAG_V = VFLAG_SET; - return; - } - if(dividend_neg) - { - remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - if(divisor_neg) - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - - /* long / long: long quotient, maybe long remainder */ - if(BIT_B(word2)) /* signed */ - { - /* Special case in divide */ - if(dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - REG_D[(word2 >> 12) & 7] = 0x80000000; - REG_D[word2 & 7] = 0; - return; - } - REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); - } - else - { - REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); - } - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_divl_32_ix(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 divisor = OPER_AY_IX_32(); - uint64 dividend = 0; - uint64 quotient = 0; - uint64 remainder = 0; - - if(divisor != 0) - { - if(BIT_A(word2)) /* 64 bit */ - { - dividend = REG_D[word2 & 7]; - dividend <<= 32; - dividend |= REG_D[(word2 >> 12) & 7]; - - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); - if((sint64)quotient != (sint64)((sint32)quotient)) - { - FLAG_V = VFLAG_SET; - return; - } - } - else /* unsigned */ - { - quotient = dividend / divisor; - if(quotient > 0xffffffff) - { - FLAG_V = VFLAG_SET; - return; - } - remainder = dividend % divisor; - } - } - else /* 32 bit */ - { - dividend = REG_D[(word2 >> 12) & 7]; - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); - } - else /* unsigned */ - { - quotient = dividend / divisor; - remainder = dividend % divisor; - } - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint divisor = OPER_AY_IX_32(); - uint dividend_hi = REG_D[word2 & 7]; - uint dividend_lo = REG_D[(word2 >> 12) & 7]; - uint quotient = 0; - uint remainder = 0; - uint dividend_neg = 0; - uint divisor_neg = 0; - sint i; - uint overflow; - - if(divisor != 0) - { - /* quad / long : long quotient, long remainder */ - if(BIT_A(word2)) - { - if(BIT_B(word2)) /* signed */ - { - /* special case in signed divide */ - if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - REG_D[word2 & 7] = 0; - REG_D[(word2 >> 12) & 7] = 0x80000000; - - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - if(GET_MSB_32(dividend_hi)) - { - dividend_neg = 1; - dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); - dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); - } - if(GET_MSB_32(divisor)) - { - divisor_neg = 1; - divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); - - } - } - - /* if the upper long is greater than the divisor, we're overflowing. */ - if(dividend_hi >= divisor) - { - FLAG_V = VFLAG_SET; - return; - } - - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - remainder = (remainder << 1) + ((dividend_hi >> i) & 1); - if(remainder >= divisor) - { - remainder -= divisor; - quotient++; - } - } - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - overflow = GET_MSB_32(remainder); - remainder = (remainder << 1) + ((dividend_lo >> i) & 1); - if(remainder >= divisor || overflow) - { - remainder -= divisor; - quotient++; - } - } - - if(BIT_B(word2)) /* signed */ - { - if(quotient > 0x7fffffff) - { - FLAG_V = VFLAG_SET; - return; - } - if(dividend_neg) - { - remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - if(divisor_neg) - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - - /* long / long: long quotient, maybe long remainder */ - if(BIT_B(word2)) /* signed */ - { - /* Special case in divide */ - if(dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - REG_D[(word2 >> 12) & 7] = 0x80000000; - REG_D[word2 & 7] = 0; - return; - } - REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); - } - else - { - REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); - } - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_divl_32_aw(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 divisor = OPER_AW_32(); - uint64 dividend = 0; - uint64 quotient = 0; - uint64 remainder = 0; - - if(divisor != 0) - { - if(BIT_A(word2)) /* 64 bit */ - { - dividend = REG_D[word2 & 7]; - dividend <<= 32; - dividend |= REG_D[(word2 >> 12) & 7]; - - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); - if((sint64)quotient != (sint64)((sint32)quotient)) - { - FLAG_V = VFLAG_SET; - return; - } - } - else /* unsigned */ - { - quotient = dividend / divisor; - if(quotient > 0xffffffff) - { - FLAG_V = VFLAG_SET; - return; - } - remainder = dividend % divisor; - } - } - else /* 32 bit */ - { - dividend = REG_D[(word2 >> 12) & 7]; - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); - } - else /* unsigned */ - { - quotient = dividend / divisor; - remainder = dividend % divisor; - } - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint divisor = OPER_AW_32(); - uint dividend_hi = REG_D[word2 & 7]; - uint dividend_lo = REG_D[(word2 >> 12) & 7]; - uint quotient = 0; - uint remainder = 0; - uint dividend_neg = 0; - uint divisor_neg = 0; - sint i; - uint overflow; - - if(divisor != 0) - { - /* quad / long : long quotient, long remainder */ - if(BIT_A(word2)) - { - if(BIT_B(word2)) /* signed */ - { - /* special case in signed divide */ - if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - REG_D[word2 & 7] = 0; - REG_D[(word2 >> 12) & 7] = 0x80000000; - - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - if(GET_MSB_32(dividend_hi)) - { - dividend_neg = 1; - dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); - dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); - } - if(GET_MSB_32(divisor)) - { - divisor_neg = 1; - divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); - - } - } - - /* if the upper long is greater than the divisor, we're overflowing. */ - if(dividend_hi >= divisor) - { - FLAG_V = VFLAG_SET; - return; - } - - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - remainder = (remainder << 1) + ((dividend_hi >> i) & 1); - if(remainder >= divisor) - { - remainder -= divisor; - quotient++; - } - } - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - overflow = GET_MSB_32(remainder); - remainder = (remainder << 1) + ((dividend_lo >> i) & 1); - if(remainder >= divisor || overflow) - { - remainder -= divisor; - quotient++; - } - } - - if(BIT_B(word2)) /* signed */ - { - if(quotient > 0x7fffffff) - { - FLAG_V = VFLAG_SET; - return; - } - if(dividend_neg) - { - remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - if(divisor_neg) - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - - /* long / long: long quotient, maybe long remainder */ - if(BIT_B(word2)) /* signed */ - { - /* Special case in divide */ - if(dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - REG_D[(word2 >> 12) & 7] = 0x80000000; - REG_D[word2 & 7] = 0; - return; - } - REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); - } - else - { - REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); - } - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_divl_32_al(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 divisor = OPER_AL_32(); - uint64 dividend = 0; - uint64 quotient = 0; - uint64 remainder = 0; - - if(divisor != 0) - { - if(BIT_A(word2)) /* 64 bit */ - { - dividend = REG_D[word2 & 7]; - dividend <<= 32; - dividend |= REG_D[(word2 >> 12) & 7]; - - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); - if((sint64)quotient != (sint64)((sint32)quotient)) - { - FLAG_V = VFLAG_SET; - return; - } - } - else /* unsigned */ - { - quotient = dividend / divisor; - if(quotient > 0xffffffff) - { - FLAG_V = VFLAG_SET; - return; - } - remainder = dividend % divisor; - } - } - else /* 32 bit */ - { - dividend = REG_D[(word2 >> 12) & 7]; - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); - } - else /* unsigned */ - { - quotient = dividend / divisor; - remainder = dividend % divisor; - } - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint divisor = OPER_AL_32(); - uint dividend_hi = REG_D[word2 & 7]; - uint dividend_lo = REG_D[(word2 >> 12) & 7]; - uint quotient = 0; - uint remainder = 0; - uint dividend_neg = 0; - uint divisor_neg = 0; - sint i; - uint overflow; - - if(divisor != 0) - { - /* quad / long : long quotient, long remainder */ - if(BIT_A(word2)) - { - if(BIT_B(word2)) /* signed */ - { - /* special case in signed divide */ - if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - REG_D[word2 & 7] = 0; - REG_D[(word2 >> 12) & 7] = 0x80000000; - - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - if(GET_MSB_32(dividend_hi)) - { - dividend_neg = 1; - dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); - dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); - } - if(GET_MSB_32(divisor)) - { - divisor_neg = 1; - divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); - - } - } - - /* if the upper long is greater than the divisor, we're overflowing. */ - if(dividend_hi >= divisor) - { - FLAG_V = VFLAG_SET; - return; - } - - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - remainder = (remainder << 1) + ((dividend_hi >> i) & 1); - if(remainder >= divisor) - { - remainder -= divisor; - quotient++; - } - } - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - overflow = GET_MSB_32(remainder); - remainder = (remainder << 1) + ((dividend_lo >> i) & 1); - if(remainder >= divisor || overflow) - { - remainder -= divisor; - quotient++; - } - } - - if(BIT_B(word2)) /* signed */ - { - if(quotient > 0x7fffffff) - { - FLAG_V = VFLAG_SET; - return; - } - if(dividend_neg) - { - remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - if(divisor_neg) - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - - /* long / long: long quotient, maybe long remainder */ - if(BIT_B(word2)) /* signed */ - { - /* Special case in divide */ - if(dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - REG_D[(word2 >> 12) & 7] = 0x80000000; - REG_D[word2 & 7] = 0; - return; - } - REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); - } - else - { - REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); - } - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_divl_32_pcdi(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 divisor = OPER_PCDI_32(); - uint64 dividend = 0; - uint64 quotient = 0; - uint64 remainder = 0; - - if(divisor != 0) - { - if(BIT_A(word2)) /* 64 bit */ - { - dividend = REG_D[word2 & 7]; - dividend <<= 32; - dividend |= REG_D[(word2 >> 12) & 7]; - - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); - if((sint64)quotient != (sint64)((sint32)quotient)) - { - FLAG_V = VFLAG_SET; - return; - } - } - else /* unsigned */ - { - quotient = dividend / divisor; - if(quotient > 0xffffffff) - { - FLAG_V = VFLAG_SET; - return; - } - remainder = dividend % divisor; - } - } - else /* 32 bit */ - { - dividend = REG_D[(word2 >> 12) & 7]; - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); - } - else /* unsigned */ - { - quotient = dividend / divisor; - remainder = dividend % divisor; - } - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint divisor = OPER_PCDI_32(); - uint dividend_hi = REG_D[word2 & 7]; - uint dividend_lo = REG_D[(word2 >> 12) & 7]; - uint quotient = 0; - uint remainder = 0; - uint dividend_neg = 0; - uint divisor_neg = 0; - sint i; - uint overflow; - - if(divisor != 0) - { - /* quad / long : long quotient, long remainder */ - if(BIT_A(word2)) - { - if(BIT_B(word2)) /* signed */ - { - /* special case in signed divide */ - if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - REG_D[word2 & 7] = 0; - REG_D[(word2 >> 12) & 7] = 0x80000000; - - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - if(GET_MSB_32(dividend_hi)) - { - dividend_neg = 1; - dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); - dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); - } - if(GET_MSB_32(divisor)) - { - divisor_neg = 1; - divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); - - } - } - - /* if the upper long is greater than the divisor, we're overflowing. */ - if(dividend_hi >= divisor) - { - FLAG_V = VFLAG_SET; - return; - } - - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - remainder = (remainder << 1) + ((dividend_hi >> i) & 1); - if(remainder >= divisor) - { - remainder -= divisor; - quotient++; - } - } - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - overflow = GET_MSB_32(remainder); - remainder = (remainder << 1) + ((dividend_lo >> i) & 1); - if(remainder >= divisor || overflow) - { - remainder -= divisor; - quotient++; - } - } - - if(BIT_B(word2)) /* signed */ - { - if(quotient > 0x7fffffff) - { - FLAG_V = VFLAG_SET; - return; - } - if(dividend_neg) - { - remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - if(divisor_neg) - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - - /* long / long: long quotient, maybe long remainder */ - if(BIT_B(word2)) /* signed */ - { - /* Special case in divide */ - if(dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - REG_D[(word2 >> 12) & 7] = 0x80000000; - REG_D[word2 & 7] = 0; - return; - } - REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); - } - else - { - REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); - } - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_divl_32_pcix(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 divisor = OPER_PCIX_32(); - uint64 dividend = 0; - uint64 quotient = 0; - uint64 remainder = 0; - - if(divisor != 0) - { - if(BIT_A(word2)) /* 64 bit */ - { - dividend = REG_D[word2 & 7]; - dividend <<= 32; - dividend |= REG_D[(word2 >> 12) & 7]; - - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); - if((sint64)quotient != (sint64)((sint32)quotient)) - { - FLAG_V = VFLAG_SET; - return; - } - } - else /* unsigned */ - { - quotient = dividend / divisor; - if(quotient > 0xffffffff) - { - FLAG_V = VFLAG_SET; - return; - } - remainder = dividend % divisor; - } - } - else /* 32 bit */ - { - dividend = REG_D[(word2 >> 12) & 7]; - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); - } - else /* unsigned */ - { - quotient = dividend / divisor; - remainder = dividend % divisor; - } - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint divisor = OPER_PCIX_32(); - uint dividend_hi = REG_D[word2 & 7]; - uint dividend_lo = REG_D[(word2 >> 12) & 7]; - uint quotient = 0; - uint remainder = 0; - uint dividend_neg = 0; - uint divisor_neg = 0; - sint i; - uint overflow; - - if(divisor != 0) - { - /* quad / long : long quotient, long remainder */ - if(BIT_A(word2)) - { - if(BIT_B(word2)) /* signed */ - { - /* special case in signed divide */ - if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - REG_D[word2 & 7] = 0; - REG_D[(word2 >> 12) & 7] = 0x80000000; - - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - if(GET_MSB_32(dividend_hi)) - { - dividend_neg = 1; - dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); - dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); - } - if(GET_MSB_32(divisor)) - { - divisor_neg = 1; - divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); - - } - } - - /* if the upper long is greater than the divisor, we're overflowing. */ - if(dividend_hi >= divisor) - { - FLAG_V = VFLAG_SET; - return; - } - - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - remainder = (remainder << 1) + ((dividend_hi >> i) & 1); - if(remainder >= divisor) - { - remainder -= divisor; - quotient++; - } - } - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - overflow = GET_MSB_32(remainder); - remainder = (remainder << 1) + ((dividend_lo >> i) & 1); - if(remainder >= divisor || overflow) - { - remainder -= divisor; - quotient++; - } - } - - if(BIT_B(word2)) /* signed */ - { - if(quotient > 0x7fffffff) - { - FLAG_V = VFLAG_SET; - return; - } - if(dividend_neg) - { - remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - if(divisor_neg) - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - - /* long / long: long quotient, maybe long remainder */ - if(BIT_B(word2)) /* signed */ - { - /* Special case in divide */ - if(dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - REG_D[(word2 >> 12) & 7] = 0x80000000; - REG_D[word2 & 7] = 0; - return; - } - REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); - } - else - { - REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); - } - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_divl_32_i(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 divisor = OPER_I_32(); - uint64 dividend = 0; - uint64 quotient = 0; - uint64 remainder = 0; - - if(divisor != 0) - { - if(BIT_A(word2)) /* 64 bit */ - { - dividend = REG_D[word2 & 7]; - dividend <<= 32; - dividend |= REG_D[(word2 >> 12) & 7]; - - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); - if((sint64)quotient != (sint64)((sint32)quotient)) - { - FLAG_V = VFLAG_SET; - return; - } - } - else /* unsigned */ - { - quotient = dividend / divisor; - if(quotient > 0xffffffff) - { - FLAG_V = VFLAG_SET; - return; - } - remainder = dividend % divisor; - } - } - else /* 32 bit */ - { - dividend = REG_D[(word2 >> 12) & 7]; - if(BIT_B(word2)) /* signed */ - { - quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); - remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); - } - else /* unsigned */ - { - quotient = dividend / divisor; - remainder = dividend % divisor; - } - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint divisor = OPER_I_32(); - uint dividend_hi = REG_D[word2 & 7]; - uint dividend_lo = REG_D[(word2 >> 12) & 7]; - uint quotient = 0; - uint remainder = 0; - uint dividend_neg = 0; - uint divisor_neg = 0; - sint i; - uint overflow; - - if(divisor != 0) - { - /* quad / long : long quotient, long remainder */ - if(BIT_A(word2)) - { - if(BIT_B(word2)) /* signed */ - { - /* special case in signed divide */ - if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - REG_D[word2 & 7] = 0; - REG_D[(word2 >> 12) & 7] = 0x80000000; - - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - if(GET_MSB_32(dividend_hi)) - { - dividend_neg = 1; - dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); - dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); - } - if(GET_MSB_32(divisor)) - { - divisor_neg = 1; - divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); - - } - } - - /* if the upper long is greater than the divisor, we're overflowing. */ - if(dividend_hi >= divisor) - { - FLAG_V = VFLAG_SET; - return; - } - - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - remainder = (remainder << 1) + ((dividend_hi >> i) & 1); - if(remainder >= divisor) - { - remainder -= divisor; - quotient++; - } - } - for(i = 31; i >= 0; i--) - { - quotient <<= 1; - overflow = GET_MSB_32(remainder); - remainder = (remainder << 1) + ((dividend_lo >> i) & 1); - if(remainder >= divisor || overflow) - { - remainder -= divisor; - quotient++; - } - } - - if(BIT_B(word2)) /* signed */ - { - if(quotient > 0x7fffffff) - { - FLAG_V = VFLAG_SET; - return; - } - if(dividend_neg) - { - remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - if(divisor_neg) - quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); - } - - REG_D[word2 & 7] = remainder; - REG_D[(word2 >> 12) & 7] = quotient; - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - - /* long / long: long quotient, maybe long remainder */ - if(BIT_B(word2)) /* signed */ - { - /* Special case in divide */ - if(dividend_lo == 0x80000000 && divisor == 0xffffffff) - { - FLAG_N = NFLAG_SET; - FLAG_Z = ZFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - REG_D[(word2 >> 12) & 7] = 0x80000000; - REG_D[word2 & 7] = 0; - return; - } - REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); - } - else - { - REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); - quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); - } - - FLAG_N = NFLAG_32(quotient); - FLAG_Z = quotient; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_eor_8_d(void) -{ - uint res = MASK_OUT_ABOVE_8(DY ^= MASK_OUT_ABOVE_8(DX)); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_8_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_8_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_8_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_8_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_8_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_8_di(void) -{ - uint ea = EA_AY_DI_8(); - uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_8_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_8_aw(void) -{ - uint ea = EA_AW_8(); - uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_8_al(void) -{ - uint ea = EA_AL_8(); - uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_16_d(void) -{ - uint res = MASK_OUT_ABOVE_16(DY ^= MASK_OUT_ABOVE_16(DX)); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_16_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_16_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_16_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_16_di(void) -{ - uint ea = EA_AY_DI_16(); - uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_16_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_16_aw(void) -{ - uint ea = EA_AW_16(); - uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_16_al(void) -{ - uint ea = EA_AL_16(); - uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_32_d(void) -{ - uint res = DY ^= DX; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_32_ai(void) -{ - uint ea = EA_AY_AI_32(); - uint res = DX ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_32_pi(void) -{ - uint ea = EA_AY_PI_32(); - uint res = DX ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_32_pd(void) -{ - uint ea = EA_AY_PD_32(); - uint res = DX ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_32_di(void) -{ - uint ea = EA_AY_DI_32(); - uint res = DX ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_32_ix(void) -{ - uint ea = EA_AY_IX_32(); - uint res = DX ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_32_aw(void) -{ - uint ea = EA_AW_32(); - uint res = DX ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eor_32_al(void) -{ - uint ea = EA_AL_32(); - uint res = DX ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_8_d(void) -{ - uint res = MASK_OUT_ABOVE_8(DY ^= OPER_I_8()); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_8_ai(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_AI_8(); - uint res = src ^ m68ki_read_8(ea); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_8_pi(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_PI_8(); - uint res = src ^ m68ki_read_8(ea); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_8_pi7(void) -{ - uint src = OPER_I_8(); - uint ea = EA_A7_PI_8(); - uint res = src ^ m68ki_read_8(ea); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_8_pd(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_PD_8(); - uint res = src ^ m68ki_read_8(ea); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_8_pd7(void) -{ - uint src = OPER_I_8(); - uint ea = EA_A7_PD_8(); - uint res = src ^ m68ki_read_8(ea); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_8_di(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_DI_8(); - uint res = src ^ m68ki_read_8(ea); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_8_ix(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_IX_8(); - uint res = src ^ m68ki_read_8(ea); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_8_aw(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AW_8(); - uint res = src ^ m68ki_read_8(ea); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_8_al(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AL_8(); - uint res = src ^ m68ki_read_8(ea); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_16_d(void) -{ - uint res = MASK_OUT_ABOVE_16(DY ^= OPER_I_16()); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_16_ai(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_AI_16(); - uint res = src ^ m68ki_read_16(ea); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_16_pi(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_PI_16(); - uint res = src ^ m68ki_read_16(ea); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_16_pd(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_PD_16(); - uint res = src ^ m68ki_read_16(ea); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_16_di(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_DI_16(); - uint res = src ^ m68ki_read_16(ea); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_16_ix(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_IX_16(); - uint res = src ^ m68ki_read_16(ea); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_16_aw(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AW_16(); - uint res = src ^ m68ki_read_16(ea); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_16_al(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AL_16(); - uint res = src ^ m68ki_read_16(ea); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_32_d(void) -{ - uint res = DY ^= OPER_I_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_32_ai(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_AI_32(); - uint res = src ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_32_pi(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_PI_32(); - uint res = src ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_32_pd(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_PD_32(); - uint res = src ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_32_di(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_DI_32(); - uint res = src ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_32_ix(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_IX_32(); - uint res = src ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_32_aw(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AW_32(); - uint res = src ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_32_al(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AL_32(); - uint res = src ^ m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_eori_16_toc(void) -{ - m68ki_set_ccr(m68ki_get_ccr() ^ OPER_I_16()); -} - - -void m68k_op_eori_16_tos(void) -{ - if(FLAG_S) - { - uint src = OPER_I_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_sr(m68ki_get_sr() ^ src); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_exg_32_dd(void) -{ - uint* reg_a = &DX; - uint* reg_b = &DY; - uint tmp = *reg_a; - *reg_a = *reg_b; - *reg_b = tmp; -} - - -void m68k_op_exg_32_aa(void) -{ - uint* reg_a = &AX; - uint* reg_b = &AY; - uint tmp = *reg_a; - *reg_a = *reg_b; - *reg_b = tmp; -} - - -void m68k_op_exg_32_da(void) -{ - uint* reg_a = &DX; - uint* reg_b = &AY; - uint tmp = *reg_a; - *reg_a = *reg_b; - *reg_b = tmp; -} - - -void m68k_op_ext_16(void) -{ - uint* r_dst = &DY; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xff00 : 0); - - FLAG_N = NFLAG_16(*r_dst); - FLAG_Z = MASK_OUT_ABOVE_16(*r_dst); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_ext_32(void) -{ - uint* r_dst = &DY; - - *r_dst = MASK_OUT_ABOVE_16(*r_dst) | (GET_MSB_16(*r_dst) ? 0xffff0000 : 0); - - FLAG_N = NFLAG_32(*r_dst); - FLAG_Z = *r_dst; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_extb_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint* r_dst = &DY; - - *r_dst = MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xffffff00 : 0); - - FLAG_N = NFLAG_32(*r_dst); - FLAG_Z = *r_dst; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_illegal(void) -{ - m68ki_exception_illegal(); -} - - -void m68k_op_jmp_32_ai(void) -{ - m68ki_jump(EA_AY_AI_32()); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(REG_PC == REG_PPC) - USE_ALL_CYCLES(); -} - - -void m68k_op_jmp_32_di(void) -{ - m68ki_jump(EA_AY_DI_32()); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(REG_PC == REG_PPC) - USE_ALL_CYCLES(); -} - - -void m68k_op_jmp_32_ix(void) -{ - m68ki_jump(EA_AY_IX_32()); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(REG_PC == REG_PPC) - USE_ALL_CYCLES(); -} - - -void m68k_op_jmp_32_aw(void) -{ - m68ki_jump(EA_AW_32()); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(REG_PC == REG_PPC) - USE_ALL_CYCLES(); -} - - -void m68k_op_jmp_32_al(void) -{ - m68ki_jump(EA_AL_32()); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(REG_PC == REG_PPC) - USE_ALL_CYCLES(); -} - - -void m68k_op_jmp_32_pcdi(void) -{ - m68ki_jump(EA_PCDI_32()); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(REG_PC == REG_PPC) - USE_ALL_CYCLES(); -} - - -void m68k_op_jmp_32_pcix(void) -{ - m68ki_jump(EA_PCIX_32()); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(REG_PC == REG_PPC) - USE_ALL_CYCLES(); -} - - -void m68k_op_jsr_32_ai(void) -{ - uint ea = EA_AY_AI_32(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_push_32(REG_PC); - m68ki_jump(ea); -} - - -void m68k_op_jsr_32_di(void) -{ - uint ea = EA_AY_DI_32(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_push_32(REG_PC); - m68ki_jump(ea); -} - - -void m68k_op_jsr_32_ix(void) -{ - uint ea = EA_AY_IX_32(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_push_32(REG_PC); - m68ki_jump(ea); -} - - -void m68k_op_jsr_32_aw(void) -{ - uint ea = EA_AW_32(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_push_32(REG_PC); - m68ki_jump(ea); -} - - -void m68k_op_jsr_32_al(void) -{ - uint ea = EA_AL_32(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_push_32(REG_PC); - m68ki_jump(ea); -} - - -void m68k_op_jsr_32_pcdi(void) -{ - uint ea = EA_PCDI_32(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_push_32(REG_PC); - m68ki_jump(ea); -} - - -void m68k_op_jsr_32_pcix(void) -{ - uint ea = EA_PCIX_32(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_push_32(REG_PC); - m68ki_jump(ea); -} - - -void m68k_op_lea_32_ai(void) -{ - AX = EA_AY_AI_32(); -} - - -void m68k_op_lea_32_di(void) -{ - AX = EA_AY_DI_32(); -} - - -void m68k_op_lea_32_ix(void) -{ - AX = EA_AY_IX_32(); -} - - -void m68k_op_lea_32_aw(void) -{ - AX = EA_AW_32(); -} - - -void m68k_op_lea_32_al(void) -{ - AX = EA_AL_32(); -} - - -void m68k_op_lea_32_pcdi(void) -{ - AX = EA_PCDI_32(); -} - - -void m68k_op_lea_32_pcix(void) -{ - AX = EA_PCIX_32(); -} - - -void m68k_op_link_16_a7(void) -{ - REG_A[7] -= 4; - m68ki_write_32(REG_A[7], REG_A[7]); - REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16())); -} - - -void m68k_op_link_16(void) -{ - uint* r_dst = &AY; - - m68ki_push_32(*r_dst); - *r_dst = REG_A[7]; - REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16())); -} - - -void m68k_op_link_32_a7(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - REG_A[7] -= 4; - m68ki_write_32(REG_A[7], REG_A[7]); - REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32()); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_link_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint* r_dst = &AY; - - m68ki_push_32(*r_dst); - *r_dst = REG_A[7]; - REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32()); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_lsr_8_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = src >> shift; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_CLEAR; - FLAG_Z = res; - FLAG_X = FLAG_C = src << (9-shift); - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsr_16_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_16(*r_dst); - uint res = src >> shift; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_CLEAR; - FLAG_Z = res; - FLAG_X = FLAG_C = src << (9-shift); - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsr_32_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = *r_dst; - uint res = src >> shift; - - *r_dst = res; - - FLAG_N = NFLAG_CLEAR; - FLAG_Z = res; - FLAG_X = FLAG_C = src << (9-shift); - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsr_8_r(void) -{ - uint* r_dst = &DY; - uint shift = DX & 0x3f; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = src >> shift; - - if(shift != 0) - { - USE_CYCLES(shift<> shift; - - if(shift != 0) - { - USE_CYCLES(shift<> (shift - 1))<<8; - FLAG_N = NFLAG_CLEAR; - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - - *r_dst &= 0xffff0000; - FLAG_X = XFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_16(src); - FLAG_Z = src; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsr_32_r(void) -{ - uint* r_dst = &DY; - uint shift = DX & 0x3f; - uint src = *r_dst; - uint res = src >> shift; - - if(shift != 0) - { - USE_CYCLES(shift<> (shift - 1))<<8; - FLAG_N = NFLAG_CLEAR; - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - - *r_dst = 0; - FLAG_X = FLAG_C = (shift == 32 ? GET_MSB_32(src)>>23 : 0); - FLAG_N = NFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_32(src); - FLAG_Z = src; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsr_16_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_CLEAR; - FLAG_Z = res; - FLAG_C = FLAG_X = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsr_16_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_CLEAR; - FLAG_Z = res; - FLAG_C = FLAG_X = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsr_16_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_CLEAR; - FLAG_Z = res; - FLAG_C = FLAG_X = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsr_16_di(void) -{ - uint ea = EA_AY_DI_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_CLEAR; - FLAG_Z = res; - FLAG_C = FLAG_X = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsr_16_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_CLEAR; - FLAG_Z = res; - FLAG_C = FLAG_X = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsr_16_aw(void) -{ - uint ea = EA_AW_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_CLEAR; - FLAG_Z = res; - FLAG_C = FLAG_X = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsr_16_al(void) -{ - uint ea = EA_AL_16(); - uint src = m68ki_read_16(ea); - uint res = src >> 1; - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_CLEAR; - FLAG_Z = res; - FLAG_C = FLAG_X = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsl_8_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = MASK_OUT_ABOVE_8(src << shift); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src << shift; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsl_16_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_16(*r_dst); - uint res = MASK_OUT_ABOVE_16(src << shift); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> (8-shift); - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsl_32_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = *r_dst; - uint res = MASK_OUT_ABOVE_32(src << shift); - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> (24-shift); - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsl_8_r(void) -{ - uint* r_dst = &DY; - uint shift = DX & 0x3f; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = MASK_OUT_ABOVE_8(src << shift); - - if(shift != 0) - { - USE_CYCLES(shift<> 8; - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - - *r_dst &= 0xffff0000; - FLAG_X = XFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_16(src); - FLAG_Z = src; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsl_32_r(void) -{ - uint* r_dst = &DY; - uint shift = DX & 0x3f; - uint src = *r_dst; - uint res = MASK_OUT_ABOVE_32(src << shift); - - if(shift != 0) - { - USE_CYCLES(shift<> (32 - shift)) << 8; - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - - *r_dst = 0; - FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8; - FLAG_N = NFLAG_CLEAR; - FLAG_Z = ZFLAG_SET; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_32(src); - FLAG_Z = src; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsl_16_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsl_16_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsl_16_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsl_16_di(void) -{ - uint ea = EA_AY_DI_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsl_16_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsl_16_aw(void) -{ - uint ea = EA_AW_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_lsl_16_al(void) -{ - uint ea = EA_AL_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(src << 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_X = FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_move_8_d_d(void) -{ - uint res = MASK_OUT_ABOVE_8(DY); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_d_ai(void) -{ - uint res = OPER_AY_AI_8(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_d_pi(void) -{ - uint res = OPER_AY_PI_8(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_d_pi7(void) -{ - uint res = OPER_A7_PI_8(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_d_pd(void) -{ - uint res = OPER_AY_PD_8(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_d_pd7(void) -{ - uint res = OPER_A7_PD_8(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_d_di(void) -{ - uint res = OPER_AY_DI_8(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_d_ix(void) -{ - uint res = OPER_AY_IX_8(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_d_aw(void) -{ - uint res = OPER_AW_8(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_d_al(void) -{ - uint res = OPER_AL_8(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_d_pcdi(void) -{ - uint res = OPER_PCDI_8(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_d_pcix(void) -{ - uint res = OPER_PCIX_8(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_d_i(void) -{ - uint res = OPER_I_8(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ai_d(void) -{ - uint res = MASK_OUT_ABOVE_8(DY); - uint ea = EA_AX_AI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ai_ai(void) -{ - uint res = OPER_AY_AI_8(); - uint ea = EA_AX_AI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ai_pi(void) -{ - uint res = OPER_AY_PI_8(); - uint ea = EA_AX_AI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ai_pi7(void) -{ - uint res = OPER_A7_PI_8(); - uint ea = EA_AX_AI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ai_pd(void) -{ - uint res = OPER_AY_PD_8(); - uint ea = EA_AX_AI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ai_pd7(void) -{ - uint res = OPER_A7_PD_8(); - uint ea = EA_AX_AI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ai_di(void) -{ - uint res = OPER_AY_DI_8(); - uint ea = EA_AX_AI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ai_ix(void) -{ - uint res = OPER_AY_IX_8(); - uint ea = EA_AX_AI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ai_aw(void) -{ - uint res = OPER_AW_8(); - uint ea = EA_AX_AI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ai_al(void) -{ - uint res = OPER_AL_8(); - uint ea = EA_AX_AI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ai_pcdi(void) -{ - uint res = OPER_PCDI_8(); - uint ea = EA_AX_AI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ai_pcix(void) -{ - uint res = OPER_PCIX_8(); - uint ea = EA_AX_AI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ai_i(void) -{ - uint res = OPER_I_8(); - uint ea = EA_AX_AI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi7_d(void) -{ - uint res = MASK_OUT_ABOVE_8(DY); - uint ea = EA_A7_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi_d(void) -{ - uint res = MASK_OUT_ABOVE_8(DY); - uint ea = EA_AX_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi7_ai(void) -{ - uint res = OPER_AY_AI_8(); - uint ea = EA_A7_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi7_pi(void) -{ - uint res = OPER_AY_PI_8(); - uint ea = EA_A7_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi7_pi7(void) -{ - uint res = OPER_A7_PI_8(); - uint ea = EA_A7_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi7_pd(void) -{ - uint res = OPER_AY_PD_8(); - uint ea = EA_A7_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi7_pd7(void) -{ - uint res = OPER_A7_PD_8(); - uint ea = EA_A7_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi7_di(void) -{ - uint res = OPER_AY_DI_8(); - uint ea = EA_A7_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi7_ix(void) -{ - uint res = OPER_AY_IX_8(); - uint ea = EA_A7_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi7_aw(void) -{ - uint res = OPER_AW_8(); - uint ea = EA_A7_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi7_al(void) -{ - uint res = OPER_AL_8(); - uint ea = EA_A7_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi7_pcdi(void) -{ - uint res = OPER_PCDI_8(); - uint ea = EA_A7_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi7_pcix(void) -{ - uint res = OPER_PCIX_8(); - uint ea = EA_A7_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi7_i(void) -{ - uint res = OPER_I_8(); - uint ea = EA_A7_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi_ai(void) -{ - uint res = OPER_AY_AI_8(); - uint ea = EA_AX_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi_pi(void) -{ - uint res = OPER_AY_PI_8(); - uint ea = EA_AX_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi_pi7(void) -{ - uint res = OPER_A7_PI_8(); - uint ea = EA_AX_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi_pd(void) -{ - uint res = OPER_AY_PD_8(); - uint ea = EA_AX_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi_pd7(void) -{ - uint res = OPER_A7_PD_8(); - uint ea = EA_AX_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi_di(void) -{ - uint res = OPER_AY_DI_8(); - uint ea = EA_AX_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi_ix(void) -{ - uint res = OPER_AY_IX_8(); - uint ea = EA_AX_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi_aw(void) -{ - uint res = OPER_AW_8(); - uint ea = EA_AX_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi_al(void) -{ - uint res = OPER_AL_8(); - uint ea = EA_AX_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi_pcdi(void) -{ - uint res = OPER_PCDI_8(); - uint ea = EA_AX_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi_pcix(void) -{ - uint res = OPER_PCIX_8(); - uint ea = EA_AX_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pi_i(void) -{ - uint res = OPER_I_8(); - uint ea = EA_AX_PI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd7_d(void) -{ - uint res = MASK_OUT_ABOVE_8(DY); - uint ea = EA_A7_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd_d(void) -{ - uint res = MASK_OUT_ABOVE_8(DY); - uint ea = EA_AX_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd7_ai(void) -{ - uint res = OPER_AY_AI_8(); - uint ea = EA_A7_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd7_pi(void) -{ - uint res = OPER_AY_PI_8(); - uint ea = EA_A7_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd7_pi7(void) -{ - uint res = OPER_A7_PI_8(); - uint ea = EA_A7_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd7_pd(void) -{ - uint res = OPER_AY_PD_8(); - uint ea = EA_A7_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd7_pd7(void) -{ - uint res = OPER_A7_PD_8(); - uint ea = EA_A7_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd7_di(void) -{ - uint res = OPER_AY_DI_8(); - uint ea = EA_A7_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd7_ix(void) -{ - uint res = OPER_AY_IX_8(); - uint ea = EA_A7_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd7_aw(void) -{ - uint res = OPER_AW_8(); - uint ea = EA_A7_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd7_al(void) -{ - uint res = OPER_AL_8(); - uint ea = EA_A7_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd7_pcdi(void) -{ - uint res = OPER_PCDI_8(); - uint ea = EA_A7_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd7_pcix(void) -{ - uint res = OPER_PCIX_8(); - uint ea = EA_A7_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd7_i(void) -{ - uint res = OPER_I_8(); - uint ea = EA_A7_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd_ai(void) -{ - uint res = OPER_AY_AI_8(); - uint ea = EA_AX_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd_pi(void) -{ - uint res = OPER_AY_PI_8(); - uint ea = EA_AX_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd_pi7(void) -{ - uint res = OPER_A7_PI_8(); - uint ea = EA_AX_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd_pd(void) -{ - uint res = OPER_AY_PD_8(); - uint ea = EA_AX_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd_pd7(void) -{ - uint res = OPER_A7_PD_8(); - uint ea = EA_AX_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd_di(void) -{ - uint res = OPER_AY_DI_8(); - uint ea = EA_AX_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd_ix(void) -{ - uint res = OPER_AY_IX_8(); - uint ea = EA_AX_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd_aw(void) -{ - uint res = OPER_AW_8(); - uint ea = EA_AX_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd_al(void) -{ - uint res = OPER_AL_8(); - uint ea = EA_AX_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd_pcdi(void) -{ - uint res = OPER_PCDI_8(); - uint ea = EA_AX_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd_pcix(void) -{ - uint res = OPER_PCIX_8(); - uint ea = EA_AX_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_pd_i(void) -{ - uint res = OPER_I_8(); - uint ea = EA_AX_PD_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_di_d(void) -{ - uint res = MASK_OUT_ABOVE_8(DY); - uint ea = EA_AX_DI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_di_ai(void) -{ - uint res = OPER_AY_AI_8(); - uint ea = EA_AX_DI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_di_pi(void) -{ - uint res = OPER_AY_PI_8(); - uint ea = EA_AX_DI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_di_pi7(void) -{ - uint res = OPER_A7_PI_8(); - uint ea = EA_AX_DI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_di_pd(void) -{ - uint res = OPER_AY_PD_8(); - uint ea = EA_AX_DI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_di_pd7(void) -{ - uint res = OPER_A7_PD_8(); - uint ea = EA_AX_DI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_di_di(void) -{ - uint res = OPER_AY_DI_8(); - uint ea = EA_AX_DI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_di_ix(void) -{ - uint res = OPER_AY_IX_8(); - uint ea = EA_AX_DI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_di_aw(void) -{ - uint res = OPER_AW_8(); - uint ea = EA_AX_DI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_di_al(void) -{ - uint res = OPER_AL_8(); - uint ea = EA_AX_DI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_di_pcdi(void) -{ - uint res = OPER_PCDI_8(); - uint ea = EA_AX_DI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_di_pcix(void) -{ - uint res = OPER_PCIX_8(); - uint ea = EA_AX_DI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_di_i(void) -{ - uint res = OPER_I_8(); - uint ea = EA_AX_DI_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ix_d(void) -{ - uint res = MASK_OUT_ABOVE_8(DY); - uint ea = EA_AX_IX_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ix_ai(void) -{ - uint res = OPER_AY_AI_8(); - uint ea = EA_AX_IX_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ix_pi(void) -{ - uint res = OPER_AY_PI_8(); - uint ea = EA_AX_IX_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ix_pi7(void) -{ - uint res = OPER_A7_PI_8(); - uint ea = EA_AX_IX_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ix_pd(void) -{ - uint res = OPER_AY_PD_8(); - uint ea = EA_AX_IX_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ix_pd7(void) -{ - uint res = OPER_A7_PD_8(); - uint ea = EA_AX_IX_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ix_di(void) -{ - uint res = OPER_AY_DI_8(); - uint ea = EA_AX_IX_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ix_ix(void) -{ - uint res = OPER_AY_IX_8(); - uint ea = EA_AX_IX_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ix_aw(void) -{ - uint res = OPER_AW_8(); - uint ea = EA_AX_IX_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ix_al(void) -{ - uint res = OPER_AL_8(); - uint ea = EA_AX_IX_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ix_pcdi(void) -{ - uint res = OPER_PCDI_8(); - uint ea = EA_AX_IX_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ix_pcix(void) -{ - uint res = OPER_PCIX_8(); - uint ea = EA_AX_IX_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_ix_i(void) -{ - uint res = OPER_I_8(); - uint ea = EA_AX_IX_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_aw_d(void) -{ - uint res = MASK_OUT_ABOVE_8(DY); - uint ea = EA_AW_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_aw_ai(void) -{ - uint res = OPER_AY_AI_8(); - uint ea = EA_AW_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_aw_pi(void) -{ - uint res = OPER_AY_PI_8(); - uint ea = EA_AW_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_aw_pi7(void) -{ - uint res = OPER_A7_PI_8(); - uint ea = EA_AW_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_aw_pd(void) -{ - uint res = OPER_AY_PD_8(); - uint ea = EA_AW_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_aw_pd7(void) -{ - uint res = OPER_A7_PD_8(); - uint ea = EA_AW_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_aw_di(void) -{ - uint res = OPER_AY_DI_8(); - uint ea = EA_AW_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_aw_ix(void) -{ - uint res = OPER_AY_IX_8(); - uint ea = EA_AW_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_aw_aw(void) -{ - uint res = OPER_AW_8(); - uint ea = EA_AW_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_aw_al(void) -{ - uint res = OPER_AL_8(); - uint ea = EA_AW_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_aw_pcdi(void) -{ - uint res = OPER_PCDI_8(); - uint ea = EA_AW_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_aw_pcix(void) -{ - uint res = OPER_PCIX_8(); - uint ea = EA_AW_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_aw_i(void) -{ - uint res = OPER_I_8(); - uint ea = EA_AW_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_al_d(void) -{ - uint res = MASK_OUT_ABOVE_8(DY); - uint ea = EA_AL_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_al_ai(void) -{ - uint res = OPER_AY_AI_8(); - uint ea = EA_AL_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_al_pi(void) -{ - uint res = OPER_AY_PI_8(); - uint ea = EA_AL_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_al_pi7(void) -{ - uint res = OPER_A7_PI_8(); - uint ea = EA_AL_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_al_pd(void) -{ - uint res = OPER_AY_PD_8(); - uint ea = EA_AL_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_al_pd7(void) -{ - uint res = OPER_A7_PD_8(); - uint ea = EA_AL_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_al_di(void) -{ - uint res = OPER_AY_DI_8(); - uint ea = EA_AL_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_al_ix(void) -{ - uint res = OPER_AY_IX_8(); - uint ea = EA_AL_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_al_aw(void) -{ - uint res = OPER_AW_8(); - uint ea = EA_AL_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_al_al(void) -{ - uint res = OPER_AL_8(); - uint ea = EA_AL_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_al_pcdi(void) -{ - uint res = OPER_PCDI_8(); - uint ea = EA_AL_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_al_pcix(void) -{ - uint res = OPER_PCIX_8(); - uint ea = EA_AL_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_8_al_i(void) -{ - uint res = OPER_I_8(); - uint ea = EA_AL_8(); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_d_d(void) -{ - uint res = MASK_OUT_ABOVE_16(DY); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_d_a(void) -{ - uint res = MASK_OUT_ABOVE_16(AY); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_d_ai(void) -{ - uint res = OPER_AY_AI_16(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_d_pi(void) -{ - uint res = OPER_AY_PI_16(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_d_pd(void) -{ - uint res = OPER_AY_PD_16(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_d_di(void) -{ - uint res = OPER_AY_DI_16(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_d_ix(void) -{ - uint res = OPER_AY_IX_16(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_d_aw(void) -{ - uint res = OPER_AW_16(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_d_al(void) -{ - uint res = OPER_AL_16(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_d_pcdi(void) -{ - uint res = OPER_PCDI_16(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_d_pcix(void) -{ - uint res = OPER_PCIX_16(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_d_i(void) -{ - uint res = OPER_I_16(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ai_d(void) -{ - uint res = MASK_OUT_ABOVE_16(DY); - uint ea = EA_AX_AI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ai_a(void) -{ - uint res = MASK_OUT_ABOVE_16(AY); - uint ea = EA_AX_AI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ai_ai(void) -{ - uint res = OPER_AY_AI_16(); - uint ea = EA_AX_AI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ai_pi(void) -{ - uint res = OPER_AY_PI_16(); - uint ea = EA_AX_AI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ai_pd(void) -{ - uint res = OPER_AY_PD_16(); - uint ea = EA_AX_AI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ai_di(void) -{ - uint res = OPER_AY_DI_16(); - uint ea = EA_AX_AI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ai_ix(void) -{ - uint res = OPER_AY_IX_16(); - uint ea = EA_AX_AI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ai_aw(void) -{ - uint res = OPER_AW_16(); - uint ea = EA_AX_AI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ai_al(void) -{ - uint res = OPER_AL_16(); - uint ea = EA_AX_AI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ai_pcdi(void) -{ - uint res = OPER_PCDI_16(); - uint ea = EA_AX_AI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ai_pcix(void) -{ - uint res = OPER_PCIX_16(); - uint ea = EA_AX_AI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ai_i(void) -{ - uint res = OPER_I_16(); - uint ea = EA_AX_AI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pi_d(void) -{ - uint res = MASK_OUT_ABOVE_16(DY); - uint ea = EA_AX_PI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pi_a(void) -{ - uint res = MASK_OUT_ABOVE_16(AY); - uint ea = EA_AX_PI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pi_ai(void) -{ - uint res = OPER_AY_AI_16(); - uint ea = EA_AX_PI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pi_pi(void) -{ - uint res = OPER_AY_PI_16(); - uint ea = EA_AX_PI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pi_pd(void) -{ - uint res = OPER_AY_PD_16(); - uint ea = EA_AX_PI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pi_di(void) -{ - uint res = OPER_AY_DI_16(); - uint ea = EA_AX_PI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pi_ix(void) -{ - uint res = OPER_AY_IX_16(); - uint ea = EA_AX_PI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pi_aw(void) -{ - uint res = OPER_AW_16(); - uint ea = EA_AX_PI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pi_al(void) -{ - uint res = OPER_AL_16(); - uint ea = EA_AX_PI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pi_pcdi(void) -{ - uint res = OPER_PCDI_16(); - uint ea = EA_AX_PI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pi_pcix(void) -{ - uint res = OPER_PCIX_16(); - uint ea = EA_AX_PI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pi_i(void) -{ - uint res = OPER_I_16(); - uint ea = EA_AX_PI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pd_d(void) -{ - uint res = MASK_OUT_ABOVE_16(DY); - uint ea = EA_AX_PD_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pd_a(void) -{ - uint res = MASK_OUT_ABOVE_16(AY); - uint ea = EA_AX_PD_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pd_ai(void) -{ - uint res = OPER_AY_AI_16(); - uint ea = EA_AX_PD_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pd_pi(void) -{ - uint res = OPER_AY_PI_16(); - uint ea = EA_AX_PD_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pd_pd(void) -{ - uint res = OPER_AY_PD_16(); - uint ea = EA_AX_PD_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pd_di(void) -{ - uint res = OPER_AY_DI_16(); - uint ea = EA_AX_PD_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pd_ix(void) -{ - uint res = OPER_AY_IX_16(); - uint ea = EA_AX_PD_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pd_aw(void) -{ - uint res = OPER_AW_16(); - uint ea = EA_AX_PD_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pd_al(void) -{ - uint res = OPER_AL_16(); - uint ea = EA_AX_PD_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pd_pcdi(void) -{ - uint res = OPER_PCDI_16(); - uint ea = EA_AX_PD_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pd_pcix(void) -{ - uint res = OPER_PCIX_16(); - uint ea = EA_AX_PD_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_pd_i(void) -{ - uint res = OPER_I_16(); - uint ea = EA_AX_PD_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_di_d(void) -{ - uint res = MASK_OUT_ABOVE_16(DY); - uint ea = EA_AX_DI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_di_a(void) -{ - uint res = MASK_OUT_ABOVE_16(AY); - uint ea = EA_AX_DI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_di_ai(void) -{ - uint res = OPER_AY_AI_16(); - uint ea = EA_AX_DI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_di_pi(void) -{ - uint res = OPER_AY_PI_16(); - uint ea = EA_AX_DI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_di_pd(void) -{ - uint res = OPER_AY_PD_16(); - uint ea = EA_AX_DI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_di_di(void) -{ - uint res = OPER_AY_DI_16(); - uint ea = EA_AX_DI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_di_ix(void) -{ - uint res = OPER_AY_IX_16(); - uint ea = EA_AX_DI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_di_aw(void) -{ - uint res = OPER_AW_16(); - uint ea = EA_AX_DI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_di_al(void) -{ - uint res = OPER_AL_16(); - uint ea = EA_AX_DI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_di_pcdi(void) -{ - uint res = OPER_PCDI_16(); - uint ea = EA_AX_DI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_di_pcix(void) -{ - uint res = OPER_PCIX_16(); - uint ea = EA_AX_DI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_di_i(void) -{ - uint res = OPER_I_16(); - uint ea = EA_AX_DI_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ix_d(void) -{ - uint res = MASK_OUT_ABOVE_16(DY); - uint ea = EA_AX_IX_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ix_a(void) -{ - uint res = MASK_OUT_ABOVE_16(AY); - uint ea = EA_AX_IX_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ix_ai(void) -{ - uint res = OPER_AY_AI_16(); - uint ea = EA_AX_IX_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ix_pi(void) -{ - uint res = OPER_AY_PI_16(); - uint ea = EA_AX_IX_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ix_pd(void) -{ - uint res = OPER_AY_PD_16(); - uint ea = EA_AX_IX_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ix_di(void) -{ - uint res = OPER_AY_DI_16(); - uint ea = EA_AX_IX_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ix_ix(void) -{ - uint res = OPER_AY_IX_16(); - uint ea = EA_AX_IX_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ix_aw(void) -{ - uint res = OPER_AW_16(); - uint ea = EA_AX_IX_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ix_al(void) -{ - uint res = OPER_AL_16(); - uint ea = EA_AX_IX_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ix_pcdi(void) -{ - uint res = OPER_PCDI_16(); - uint ea = EA_AX_IX_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ix_pcix(void) -{ - uint res = OPER_PCIX_16(); - uint ea = EA_AX_IX_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_ix_i(void) -{ - uint res = OPER_I_16(); - uint ea = EA_AX_IX_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_aw_d(void) -{ - uint res = MASK_OUT_ABOVE_16(DY); - uint ea = EA_AW_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_aw_a(void) -{ - uint res = MASK_OUT_ABOVE_16(AY); - uint ea = EA_AW_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_aw_ai(void) -{ - uint res = OPER_AY_AI_16(); - uint ea = EA_AW_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_aw_pi(void) -{ - uint res = OPER_AY_PI_16(); - uint ea = EA_AW_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_aw_pd(void) -{ - uint res = OPER_AY_PD_16(); - uint ea = EA_AW_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_aw_di(void) -{ - uint res = OPER_AY_DI_16(); - uint ea = EA_AW_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_aw_ix(void) -{ - uint res = OPER_AY_IX_16(); - uint ea = EA_AW_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_aw_aw(void) -{ - uint res = OPER_AW_16(); - uint ea = EA_AW_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_aw_al(void) -{ - uint res = OPER_AL_16(); - uint ea = EA_AW_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_aw_pcdi(void) -{ - uint res = OPER_PCDI_16(); - uint ea = EA_AW_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_aw_pcix(void) -{ - uint res = OPER_PCIX_16(); - uint ea = EA_AW_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_aw_i(void) -{ - uint res = OPER_I_16(); - uint ea = EA_AW_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_al_d(void) -{ - uint res = MASK_OUT_ABOVE_16(DY); - uint ea = EA_AL_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_al_a(void) -{ - uint res = MASK_OUT_ABOVE_16(AY); - uint ea = EA_AL_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_al_ai(void) -{ - uint res = OPER_AY_AI_16(); - uint ea = EA_AL_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_al_pi(void) -{ - uint res = OPER_AY_PI_16(); - uint ea = EA_AL_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_al_pd(void) -{ - uint res = OPER_AY_PD_16(); - uint ea = EA_AL_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_al_di(void) -{ - uint res = OPER_AY_DI_16(); - uint ea = EA_AL_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_al_ix(void) -{ - uint res = OPER_AY_IX_16(); - uint ea = EA_AL_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_al_aw(void) -{ - uint res = OPER_AW_16(); - uint ea = EA_AL_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_al_al(void) -{ - uint res = OPER_AL_16(); - uint ea = EA_AL_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_al_pcdi(void) -{ - uint res = OPER_PCDI_16(); - uint ea = EA_AL_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_al_pcix(void) -{ - uint res = OPER_PCIX_16(); - uint ea = EA_AL_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_16_al_i(void) -{ - uint res = OPER_I_16(); - uint ea = EA_AL_16(); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_d_d(void) -{ - uint res = DY; - uint* r_dst = &DX; - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_d_a(void) -{ - uint res = AY; - uint* r_dst = &DX; - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_d_ai(void) -{ - uint res = OPER_AY_AI_32(); - uint* r_dst = &DX; - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_d_pi(void) -{ - uint res = OPER_AY_PI_32(); - uint* r_dst = &DX; - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_d_pd(void) -{ - uint res = OPER_AY_PD_32(); - uint* r_dst = &DX; - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_d_di(void) -{ - uint res = OPER_AY_DI_32(); - uint* r_dst = &DX; - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_d_ix(void) -{ - uint res = OPER_AY_IX_32(); - uint* r_dst = &DX; - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_d_aw(void) -{ - uint res = OPER_AW_32(); - uint* r_dst = &DX; - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_d_al(void) -{ - uint res = OPER_AL_32(); - uint* r_dst = &DX; - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_d_pcdi(void) -{ - uint res = OPER_PCDI_32(); - uint* r_dst = &DX; - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_d_pcix(void) -{ - uint res = OPER_PCIX_32(); - uint* r_dst = &DX; - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_d_i(void) -{ - uint res = OPER_I_32(); - uint* r_dst = &DX; - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ai_d(void) -{ - uint res = DY; - uint ea = EA_AX_AI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ai_a(void) -{ - uint res = AY; - uint ea = EA_AX_AI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ai_ai(void) -{ - uint res = OPER_AY_AI_32(); - uint ea = EA_AX_AI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ai_pi(void) -{ - uint res = OPER_AY_PI_32(); - uint ea = EA_AX_AI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ai_pd(void) -{ - uint res = OPER_AY_PD_32(); - uint ea = EA_AX_AI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ai_di(void) -{ - uint res = OPER_AY_DI_32(); - uint ea = EA_AX_AI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ai_ix(void) -{ - uint res = OPER_AY_IX_32(); - uint ea = EA_AX_AI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ai_aw(void) -{ - uint res = OPER_AW_32(); - uint ea = EA_AX_AI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ai_al(void) -{ - uint res = OPER_AL_32(); - uint ea = EA_AX_AI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ai_pcdi(void) -{ - uint res = OPER_PCDI_32(); - uint ea = EA_AX_AI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ai_pcix(void) -{ - uint res = OPER_PCIX_32(); - uint ea = EA_AX_AI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ai_i(void) -{ - uint res = OPER_I_32(); - uint ea = EA_AX_AI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pi_d(void) -{ - uint res = DY; - uint ea = EA_AX_PI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pi_a(void) -{ - uint res = AY; - uint ea = EA_AX_PI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pi_ai(void) -{ - uint res = OPER_AY_AI_32(); - uint ea = EA_AX_PI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pi_pi(void) -{ - uint res = OPER_AY_PI_32(); - uint ea = EA_AX_PI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pi_pd(void) -{ - uint res = OPER_AY_PD_32(); - uint ea = EA_AX_PI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pi_di(void) -{ - uint res = OPER_AY_DI_32(); - uint ea = EA_AX_PI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pi_ix(void) -{ - uint res = OPER_AY_IX_32(); - uint ea = EA_AX_PI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pi_aw(void) -{ - uint res = OPER_AW_32(); - uint ea = EA_AX_PI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pi_al(void) -{ - uint res = OPER_AL_32(); - uint ea = EA_AX_PI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pi_pcdi(void) -{ - uint res = OPER_PCDI_32(); - uint ea = EA_AX_PI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pi_pcix(void) -{ - uint res = OPER_PCIX_32(); - uint ea = EA_AX_PI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pi_i(void) -{ - uint res = OPER_I_32(); - uint ea = EA_AX_PI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pd_d(void) -{ - uint res = DY; - uint ea = EA_AX_PD_32(); - -#if GENESIS_HACKS - m68ki_write_16(ea+2, res & 0xFFFF ); - m68ki_write_16(ea, (res >> 16) & 0xFFFF ); -#else - m68ki_write_32(ea, res); -#endif - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pd_a(void) -{ - uint res = AY; - uint ea = EA_AX_PD_32(); - -#if GENESIS_HACKS - m68ki_write_16(ea+2, res & 0xFFFF ); - m68ki_write_16(ea, (res >> 16) & 0xFFFF ); -#else - m68ki_write_32(ea, res); -#endif - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pd_ai(void) -{ - uint res = OPER_AY_AI_32(); - uint ea = EA_AX_PD_32(); - -#if GENESIS_HACKS - m68ki_write_16(ea+2, res & 0xFFFF ); - m68ki_write_16(ea, (res >> 16) & 0xFFFF ); -#else - m68ki_write_32(ea, res); -#endif - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pd_pi(void) -{ - uint res = OPER_AY_PI_32(); - uint ea = EA_AX_PD_32(); - -#if GENESIS_HACKS - m68ki_write_16(ea+2, res & 0xFFFF ); - m68ki_write_16(ea, (res >> 16) & 0xFFFF ); -#else - m68ki_write_32(ea, res); -#endif - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pd_pd(void) -{ - uint res = OPER_AY_PD_32(); - uint ea = EA_AX_PD_32(); - -#if GENESIS_HACKS - m68ki_write_16(ea+2, res & 0xFFFF ); - m68ki_write_16(ea, (res >> 16) & 0xFFFF ); -#else - m68ki_write_32(ea, res); -#endif - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pd_di(void) -{ - uint res = OPER_AY_DI_32(); - uint ea = EA_AX_PD_32(); - -#if GENESIS_HACKS - m68ki_write_16(ea+2, res & 0xFFFF ); - m68ki_write_16(ea, (res >> 16) & 0xFFFF ); -#else - m68ki_write_32(ea, res); -#endif - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pd_ix(void) -{ - uint res = OPER_AY_IX_32(); - uint ea = EA_AX_PD_32(); - -#if GENESIS_HACKS - m68ki_write_16(ea+2, res & 0xFFFF ); - m68ki_write_16(ea, (res >> 16) & 0xFFFF ); -#else - m68ki_write_32(ea, res); -#endif - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pd_aw(void) -{ - uint res = OPER_AW_32(); - uint ea = EA_AX_PD_32(); - -#if GENESIS_HACKS - m68ki_write_16(ea+2, res & 0xFFFF ); - m68ki_write_16(ea, (res >> 16) & 0xFFFF ); -#else - m68ki_write_32(ea, res); -#endif - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pd_al(void) -{ - uint res = OPER_AL_32(); - uint ea = EA_AX_PD_32(); - -#if GENESIS_HACKS - m68ki_write_16(ea+2, res & 0xFFFF ); - m68ki_write_16(ea, (res >> 16) & 0xFFFF ); -#else - m68ki_write_32(ea, res); -#endif - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pd_pcdi(void) -{ - uint res = OPER_PCDI_32(); - uint ea = EA_AX_PD_32(); - -#if GENESIS_HACKS - m68ki_write_16(ea+2, res & 0xFFFF ); - m68ki_write_16(ea, (res >> 16) & 0xFFFF ); -#else - m68ki_write_32(ea, res); -#endif - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pd_pcix(void) -{ - uint res = OPER_PCIX_32(); - uint ea = EA_AX_PD_32(); - -#if GENESIS_HACKS - m68ki_write_16(ea+2, res & 0xFFFF ); - m68ki_write_16(ea, (res >> 16) & 0xFFFF ); -#else - m68ki_write_32(ea, res); -#endif - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_pd_i(void) -{ - uint res = OPER_I_32(); - uint ea = EA_AX_PD_32(); - -#if GENESIS_HACKS - m68ki_write_16(ea+2, res & 0xFFFF ); - m68ki_write_16(ea, (res >> 16) & 0xFFFF ); -#else - m68ki_write_32(ea, res); -#endif - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_di_d(void) -{ - uint res = DY; - uint ea = EA_AX_DI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_di_a(void) -{ - uint res = AY; - uint ea = EA_AX_DI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_di_ai(void) -{ - uint res = OPER_AY_AI_32(); - uint ea = EA_AX_DI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_di_pi(void) -{ - uint res = OPER_AY_PI_32(); - uint ea = EA_AX_DI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_di_pd(void) -{ - uint res = OPER_AY_PD_32(); - uint ea = EA_AX_DI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_di_di(void) -{ - uint res = OPER_AY_DI_32(); - uint ea = EA_AX_DI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_di_ix(void) -{ - uint res = OPER_AY_IX_32(); - uint ea = EA_AX_DI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_di_aw(void) -{ - uint res = OPER_AW_32(); - uint ea = EA_AX_DI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_di_al(void) -{ - uint res = OPER_AL_32(); - uint ea = EA_AX_DI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_di_pcdi(void) -{ - uint res = OPER_PCDI_32(); - uint ea = EA_AX_DI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_di_pcix(void) -{ - uint res = OPER_PCIX_32(); - uint ea = EA_AX_DI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_di_i(void) -{ - uint res = OPER_I_32(); - uint ea = EA_AX_DI_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ix_d(void) -{ - uint res = DY; - uint ea = EA_AX_IX_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ix_a(void) -{ - uint res = AY; - uint ea = EA_AX_IX_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ix_ai(void) -{ - uint res = OPER_AY_AI_32(); - uint ea = EA_AX_IX_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ix_pi(void) -{ - uint res = OPER_AY_PI_32(); - uint ea = EA_AX_IX_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ix_pd(void) -{ - uint res = OPER_AY_PD_32(); - uint ea = EA_AX_IX_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ix_di(void) -{ - uint res = OPER_AY_DI_32(); - uint ea = EA_AX_IX_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ix_ix(void) -{ - uint res = OPER_AY_IX_32(); - uint ea = EA_AX_IX_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ix_aw(void) -{ - uint res = OPER_AW_32(); - uint ea = EA_AX_IX_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ix_al(void) -{ - uint res = OPER_AL_32(); - uint ea = EA_AX_IX_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ix_pcdi(void) -{ - uint res = OPER_PCDI_32(); - uint ea = EA_AX_IX_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ix_pcix(void) -{ - uint res = OPER_PCIX_32(); - uint ea = EA_AX_IX_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_ix_i(void) -{ - uint res = OPER_I_32(); - uint ea = EA_AX_IX_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_aw_d(void) -{ - uint res = DY; - uint ea = EA_AW_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_aw_a(void) -{ - uint res = AY; - uint ea = EA_AW_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_aw_ai(void) -{ - uint res = OPER_AY_AI_32(); - uint ea = EA_AW_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_aw_pi(void) -{ - uint res = OPER_AY_PI_32(); - uint ea = EA_AW_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_aw_pd(void) -{ - uint res = OPER_AY_PD_32(); - uint ea = EA_AW_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_aw_di(void) -{ - uint res = OPER_AY_DI_32(); - uint ea = EA_AW_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_aw_ix(void) -{ - uint res = OPER_AY_IX_32(); - uint ea = EA_AW_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_aw_aw(void) -{ - uint res = OPER_AW_32(); - uint ea = EA_AW_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_aw_al(void) -{ - uint res = OPER_AL_32(); - uint ea = EA_AW_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_aw_pcdi(void) -{ - uint res = OPER_PCDI_32(); - uint ea = EA_AW_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_aw_pcix(void) -{ - uint res = OPER_PCIX_32(); - uint ea = EA_AW_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_aw_i(void) -{ - uint res = OPER_I_32(); - uint ea = EA_AW_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_al_d(void) -{ - uint res = DY; - uint ea = EA_AL_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_al_a(void) -{ - uint res = AY; - uint ea = EA_AL_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_al_ai(void) -{ - uint res = OPER_AY_AI_32(); - uint ea = EA_AL_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_al_pi(void) -{ - uint res = OPER_AY_PI_32(); - uint ea = EA_AL_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_al_pd(void) -{ - uint res = OPER_AY_PD_32(); - uint ea = EA_AL_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_al_di(void) -{ - uint res = OPER_AY_DI_32(); - uint ea = EA_AL_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_al_ix(void) -{ - uint res = OPER_AY_IX_32(); - uint ea = EA_AL_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_al_aw(void) -{ - uint res = OPER_AW_32(); - uint ea = EA_AL_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_al_al(void) -{ - uint res = OPER_AL_32(); - uint ea = EA_AL_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_al_pcdi(void) -{ - uint res = OPER_PCDI_32(); - uint ea = EA_AL_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_al_pcix(void) -{ - uint res = OPER_PCIX_32(); - uint ea = EA_AL_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_move_32_al_i(void) -{ - uint res = OPER_I_32(); - uint ea = EA_AL_32(); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_movea_16_d(void) -{ - AX = MAKE_INT_16(DY); -} - - -void m68k_op_movea_16_a(void) -{ - AX = MAKE_INT_16(AY); -} - - -void m68k_op_movea_16_ai(void) -{ - AX = MAKE_INT_16(OPER_AY_AI_16()); -} - - -void m68k_op_movea_16_pi(void) -{ - AX = MAKE_INT_16(OPER_AY_PI_16()); -} - - -void m68k_op_movea_16_pd(void) -{ - AX = MAKE_INT_16(OPER_AY_PD_16()); -} - - -void m68k_op_movea_16_di(void) -{ - AX = MAKE_INT_16(OPER_AY_DI_16()); -} - - -void m68k_op_movea_16_ix(void) -{ - AX = MAKE_INT_16(OPER_AY_IX_16()); -} - - -void m68k_op_movea_16_aw(void) -{ - AX = MAKE_INT_16(OPER_AW_16()); -} - - -void m68k_op_movea_16_al(void) -{ - AX = MAKE_INT_16(OPER_AL_16()); -} - - -void m68k_op_movea_16_pcdi(void) -{ - AX = MAKE_INT_16(OPER_PCDI_16()); -} - - -void m68k_op_movea_16_pcix(void) -{ - AX = MAKE_INT_16(OPER_PCIX_16()); -} - - -void m68k_op_movea_16_i(void) -{ - AX = MAKE_INT_16(OPER_I_16()); -} - - -void m68k_op_movea_32_d(void) -{ - AX = DY; -} - - -void m68k_op_movea_32_a(void) -{ - AX = AY; -} - - -void m68k_op_movea_32_ai(void) -{ - AX = OPER_AY_AI_32(); -} - - -void m68k_op_movea_32_pi(void) -{ - AX = OPER_AY_PI_32(); -} - - -void m68k_op_movea_32_pd(void) -{ - AX = OPER_AY_PD_32(); -} - - -void m68k_op_movea_32_di(void) -{ - AX = OPER_AY_DI_32(); -} - - -void m68k_op_movea_32_ix(void) -{ - AX = OPER_AY_IX_32(); -} - - -void m68k_op_movea_32_aw(void) -{ - AX = OPER_AW_32(); -} - - -void m68k_op_movea_32_al(void) -{ - AX = OPER_AL_32(); -} - - -void m68k_op_movea_32_pcdi(void) -{ - AX = OPER_PCDI_32(); -} - - -void m68k_op_movea_32_pcix(void) -{ - AX = OPER_PCIX_32(); -} - - -void m68k_op_movea_32_i(void) -{ - AX = OPER_I_32(); -} - - -void m68k_op_move_16_frc_d(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - DY = MASK_OUT_BELOW_16(DY) | m68ki_get_ccr(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_move_16_frc_ai(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - m68ki_write_16(EA_AY_AI_16(), m68ki_get_ccr()); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_move_16_frc_pi(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - m68ki_write_16(EA_AY_PI_16(), m68ki_get_ccr()); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_move_16_frc_pd(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - m68ki_write_16(EA_AY_PD_16(), m68ki_get_ccr()); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_move_16_frc_di(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - m68ki_write_16(EA_AY_DI_16(), m68ki_get_ccr()); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_move_16_frc_ix(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - m68ki_write_16(EA_AY_IX_16(), m68ki_get_ccr()); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_move_16_frc_aw(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - m68ki_write_16(EA_AW_16(), m68ki_get_ccr()); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_move_16_frc_al(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - m68ki_write_16(EA_AL_16(), m68ki_get_ccr()); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_move_16_toc_d(void) -{ - m68ki_set_ccr(DY); -} - - -void m68k_op_move_16_toc_ai(void) -{ - m68ki_set_ccr(OPER_AY_AI_16()); -} - - -void m68k_op_move_16_toc_pi(void) -{ - m68ki_set_ccr(OPER_AY_PI_16()); -} - - -void m68k_op_move_16_toc_pd(void) -{ - m68ki_set_ccr(OPER_AY_PD_16()); -} - - -void m68k_op_move_16_toc_di(void) -{ - m68ki_set_ccr(OPER_AY_DI_16()); -} - - -void m68k_op_move_16_toc_ix(void) -{ - m68ki_set_ccr(OPER_AY_IX_16()); -} - - -void m68k_op_move_16_toc_aw(void) -{ - m68ki_set_ccr(OPER_AW_16()); -} - - -void m68k_op_move_16_toc_al(void) -{ - m68ki_set_ccr(OPER_AL_16()); -} - - -void m68k_op_move_16_toc_pcdi(void) -{ - m68ki_set_ccr(OPER_PCDI_16()); -} - - -void m68k_op_move_16_toc_pcix(void) -{ - m68ki_set_ccr(OPER_PCIX_16()); -} - - -void m68k_op_move_16_toc_i(void) -{ - m68ki_set_ccr(OPER_I_16()); -} - - -void m68k_op_move_16_frs_d(void) -{ - if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ - { - DY = MASK_OUT_BELOW_16(DY) | m68ki_get_sr(); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_frs_ai(void) -{ - if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ - { - uint ea = EA_AY_AI_16(); - m68ki_write_16(ea, m68ki_get_sr()); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_frs_pi(void) -{ - if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ - { - uint ea = EA_AY_PI_16(); - m68ki_write_16(ea, m68ki_get_sr()); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_frs_pd(void) -{ - if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ - { - uint ea = EA_AY_PD_16(); - m68ki_write_16(ea, m68ki_get_sr()); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_frs_di(void) -{ - if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ - { - uint ea = EA_AY_DI_16(); - m68ki_write_16(ea, m68ki_get_sr()); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_frs_ix(void) -{ - if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ - { - uint ea = EA_AY_IX_16(); - m68ki_write_16(ea, m68ki_get_sr()); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_frs_aw(void) -{ - if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ - { - uint ea = EA_AW_16(); - m68ki_write_16(ea, m68ki_get_sr()); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_frs_al(void) -{ - if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ - { - uint ea = EA_AL_16(); - m68ki_write_16(ea, m68ki_get_sr()); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_tos_d(void) -{ - if(FLAG_S) - { - m68ki_set_sr(DY); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_tos_ai(void) -{ - if(FLAG_S) - { - uint new_sr = OPER_AY_AI_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_sr(new_sr); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_tos_pi(void) -{ - if(FLAG_S) - { - uint new_sr = OPER_AY_PI_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_sr(new_sr); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_tos_pd(void) -{ - if(FLAG_S) - { - uint new_sr = OPER_AY_PD_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_sr(new_sr); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_tos_di(void) -{ - if(FLAG_S) - { - uint new_sr = OPER_AY_DI_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_sr(new_sr); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_tos_ix(void) -{ - if(FLAG_S) - { - uint new_sr = OPER_AY_IX_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_sr(new_sr); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_tos_aw(void) -{ - if(FLAG_S) - { - uint new_sr = OPER_AW_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_sr(new_sr); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_tos_al(void) -{ - if(FLAG_S) - { - uint new_sr = OPER_AL_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_sr(new_sr); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_tos_pcdi(void) -{ - if(FLAG_S) - { - uint new_sr = OPER_PCDI_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_sr(new_sr); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_tos_pcix(void) -{ - if(FLAG_S) - { - uint new_sr = OPER_PCIX_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_sr(new_sr); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_16_tos_i(void) -{ - if(FLAG_S) - { - uint new_sr = OPER_I_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_sr(new_sr); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_32_fru(void) -{ - if(FLAG_S) - { - AY = REG_USP; - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_move_32_tou(void) -{ - if(FLAG_S) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - REG_USP = AY; - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_movec_32_cr(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - switch (word2 & 0xfff) - { - case 0x000: /* SFC */ - REG_DA[(word2 >> 12) & 15] = REG_SFC; - return; - case 0x001: /* DFC */ - REG_DA[(word2 >> 12) & 15] = REG_DFC; - return; - case 0x002: /* CACR */ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - REG_DA[(word2 >> 12) & 15] = REG_CACR; - return; - } - return; - case 0x800: /* USP */ - REG_DA[(word2 >> 12) & 15] = REG_USP; - return; - case 0x801: /* VBR */ - REG_DA[(word2 >> 12) & 15] = REG_VBR; - return; - case 0x802: /* CAAR */ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - REG_DA[(word2 >> 12) & 15] = REG_CAAR; - return; - } - m68ki_exception_illegal(); - break; - case 0x803: /* MSP */ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_SP : REG_MSP; - return; - } - m68ki_exception_illegal(); - return; - case 0x804: /* ISP */ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_ISP : REG_SP; - return; - } - m68ki_exception_illegal(); - return; - default: - m68ki_exception_illegal(); - return; - } - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_movec_32_rc(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - switch (word2 & 0xfff) - { - case 0x000: /* SFC */ - REG_SFC = REG_DA[(word2 >> 12) & 15] & 7; - return; - case 0x001: /* DFC */ - REG_DFC = REG_DA[(word2 >> 12) & 15] & 7; - return; - case 0x002: /* CACR */ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - REG_CACR = REG_DA[(word2 >> 12) & 15]; - return; - } - m68ki_exception_illegal(); - return; - case 0x800: /* USP */ - REG_USP = REG_DA[(word2 >> 12) & 15]; - return; - case 0x801: /* VBR */ - REG_VBR = REG_DA[(word2 >> 12) & 15]; - return; - case 0x802: /* CAAR */ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - REG_CAAR = REG_DA[(word2 >> 12) & 15]; - return; - } - m68ki_exception_illegal(); - return; - case 0x803: /* MSP */ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - /* we are in supervisor mode so just check for M flag */ - if(!FLAG_M) - { - REG_MSP = REG_DA[(word2 >> 12) & 15]; - return; - } - REG_SP = REG_DA[(word2 >> 12) & 15]; - return; - } - m68ki_exception_illegal(); - return; - case 0x804: /* ISP */ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(!FLAG_M) - { - REG_SP = REG_DA[(word2 >> 12) & 15]; - return; - } - REG_ISP = REG_DA[(word2 >> 12) & 15]; - return; - } - m68ki_exception_illegal(); - return; - default: - m68ki_exception_illegal(); - return; - } - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_movem_16_re_pd(void) -{ - uint i = 0; - uint register_list = OPER_I_16(); - uint ea = AY; - uint count = 0; - - for(; i < 16; i++) - if(register_list & (1 << i)) - { - ea -= 2; - m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[15-i])); - count++; - } - AY = ea; - - USE_CYCLES(count<> 16) & 0xFFFF ); -#else - m68ki_write_32(ea, REG_DA[15-i]); -#endif - count++; - } - AY = ea; - - USE_CYCLES(count<> 8)); - m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src)); -} - - -void m68k_op_movep_32_re(void) -{ - uint ea = EA_AY_DI_32(); - uint src = DX; - - m68ki_write_8(ea, MASK_OUT_ABOVE_8(src >> 24)); - m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 16)); - m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 8)); - m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src)); -} - - -void m68k_op_movep_16_er(void) -{ - uint ea = EA_AY_DI_16(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | ((m68ki_read_8(ea) << 8) + m68ki_read_8(ea + 2)); -} - - -void m68k_op_movep_32_er(void) -{ - uint ea = EA_AY_DI_32(); - - DX = (m68ki_read_8(ea) << 24) + (m68ki_read_8(ea + 2) << 16) - + (m68ki_read_8(ea + 4) << 8) + m68ki_read_8(ea + 6); -} - - -void m68k_op_moves_8_ai(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_AI_8(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_8_pi(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_PI_8(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_8_pi7(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_A7_PI_8(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_8_pd(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_PD_8(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_8_pd7(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_A7_PD_8(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_8_di(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_DI_8(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_8_ix(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_IX_8(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_8_aw(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AW_8(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_8_al(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AL_8(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_16_ai(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_AI_16(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_16_pi(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_PI_16(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_16_pd(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_PD_16(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_16_di(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_DI_16(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_16_ix(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_IX_16(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_16_aw(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AW_16(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_16_al(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AL_16(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); - return; - } - if(BIT_F(word2)) /* Memory to address register */ - { - REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to data register */ - REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_32_ai(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_AI_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to register */ - REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_32_pi(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_PI_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to register */ - REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_32_pd(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_PD_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to register */ - REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_32_di(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_DI_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to register */ - REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_32_ix(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AY_IX_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to register */ - REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_32_aw(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AW_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to register */ - REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moves_32_al(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - if(FLAG_S) - { - uint word2 = OPER_I_16(); - uint ea = EA_AL_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - if(BIT_B(word2)) /* Register to memory */ - { - m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - /* Memory to register */ - REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - USE_CYCLES(2); - return; - } - m68ki_exception_privilege_violation(); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_moveq_32(void) -{ - uint res = DX = MAKE_INT_8(MASK_OUT_ABOVE_8(REG_IR)); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_muls_16_d(void) -{ - uint* r_dst = &DX; - uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(DY) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_muls_16_ai(void) -{ - uint* r_dst = &DX; - uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_AI_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_muls_16_pi(void) -{ - uint* r_dst = &DX; - uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_PI_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_muls_16_pd(void) -{ - uint* r_dst = &DX; - uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_PD_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_muls_16_di(void) -{ - uint* r_dst = &DX; - uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_DI_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_muls_16_ix(void) -{ - uint* r_dst = &DX; - uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_IX_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_muls_16_aw(void) -{ - uint* r_dst = &DX; - uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AW_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_muls_16_al(void) -{ - uint* r_dst = &DX; - uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AL_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_muls_16_pcdi(void) -{ - uint* r_dst = &DX; - uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_PCDI_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_muls_16_pcix(void) -{ - uint* r_dst = &DX; - uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_PCIX_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_muls_16_i(void) -{ - uint* r_dst = &DX; - uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_I_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_mulu_16_d(void) -{ - uint* r_dst = &DX; - uint res = MASK_OUT_ABOVE_16(DY) * MASK_OUT_ABOVE_16(*r_dst); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_mulu_16_ai(void) -{ - uint* r_dst = &DX; - uint res = OPER_AY_AI_16() * MASK_OUT_ABOVE_16(*r_dst); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_mulu_16_pi(void) -{ - uint* r_dst = &DX; - uint res = OPER_AY_PI_16() * MASK_OUT_ABOVE_16(*r_dst); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_mulu_16_pd(void) -{ - uint* r_dst = &DX; - uint res = OPER_AY_PD_16() * MASK_OUT_ABOVE_16(*r_dst); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_mulu_16_di(void) -{ - uint* r_dst = &DX; - uint res = OPER_AY_DI_16() * MASK_OUT_ABOVE_16(*r_dst); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_mulu_16_ix(void) -{ - uint* r_dst = &DX; - uint res = OPER_AY_IX_16() * MASK_OUT_ABOVE_16(*r_dst); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_mulu_16_aw(void) -{ - uint* r_dst = &DX; - uint res = OPER_AW_16() * MASK_OUT_ABOVE_16(*r_dst); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_mulu_16_al(void) -{ - uint* r_dst = &DX; - uint res = OPER_AL_16() * MASK_OUT_ABOVE_16(*r_dst); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_mulu_16_pcdi(void) -{ - uint* r_dst = &DX; - uint res = OPER_PCDI_16() * MASK_OUT_ABOVE_16(*r_dst); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_mulu_16_pcix(void) -{ - uint* r_dst = &DX; - uint res = OPER_PCIX_16() * MASK_OUT_ABOVE_16(*r_dst); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_mulu_16_i(void) -{ - uint* r_dst = &DX; - uint res = OPER_I_16() * MASK_OUT_ABOVE_16(*r_dst); - - *r_dst = res; - - FLAG_Z = res; - FLAG_N = NFLAG_32(res); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_mull_32_d(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 src = DY; - uint64 dst = REG_D[(word2 >> 12) & 7]; - uint64 res; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - res = (sint64)((sint32)src) * (sint64)((sint32)dst); - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = ((sint64)res != (sint32)res)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - - res = src * dst; - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = (res > 0xffffffff)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint src = DY; - uint dst = REG_D[(word2 >> 12) & 7]; - uint neg = GET_MSB_32(src ^ dst); - uint src1; - uint src2; - uint dst1; - uint dst2; - uint r1; - uint r2; - uint r3; - uint r4; - uint lo; - uint hi; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - if(GET_MSB_32(src)) - src = (uint)MASK_OUT_ABOVE_32(-(sint)src); - if(GET_MSB_32(dst)) - dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); - } - - src1 = MASK_OUT_ABOVE_16(src); - src2 = src>>16; - dst1 = MASK_OUT_ABOVE_16(dst); - dst2 = dst>>16; - - - r1 = src1 * dst1; - r2 = src1 * dst2; - r3 = src2 * dst1; - r4 = src2 * dst2; - - lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); - hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); - - if(BIT_B(word2) && neg) - { - hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); - lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); - } - - if(BIT_A(word2)) - { - REG_D[word2 & 7] = hi; - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(hi); - FLAG_Z = hi | lo; - FLAG_V = VFLAG_CLEAR; - return; - } - - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(lo); - FLAG_Z = lo; - if(BIT_B(word2)) - FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; - else - FLAG_V = (hi != 0) << 7; - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_mull_32_ai(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 src = OPER_AY_AI_32(); - uint64 dst = REG_D[(word2 >> 12) & 7]; - uint64 res; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - res = (sint64)((sint32)src) * (sint64)((sint32)dst); - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = ((sint64)res != (sint32)res)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - - res = src * dst; - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = (res > 0xffffffff)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint src = OPER_AY_AI_32(); - uint dst = REG_D[(word2 >> 12) & 7]; - uint neg = GET_MSB_32(src ^ dst); - uint src1; - uint src2; - uint dst1; - uint dst2; - uint r1; - uint r2; - uint r3; - uint r4; - uint lo; - uint hi; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - if(GET_MSB_32(src)) - src = (uint)MASK_OUT_ABOVE_32(-(sint)src); - if(GET_MSB_32(dst)) - dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); - } - - src1 = MASK_OUT_ABOVE_16(src); - src2 = src>>16; - dst1 = MASK_OUT_ABOVE_16(dst); - dst2 = dst>>16; - - - r1 = src1 * dst1; - r2 = src1 * dst2; - r3 = src2 * dst1; - r4 = src2 * dst2; - - lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); - hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); - - if(BIT_B(word2) && neg) - { - hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); - lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); - } - - if(BIT_A(word2)) - { - REG_D[word2 & 7] = hi; - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(hi); - FLAG_Z = hi | lo; - FLAG_V = VFLAG_CLEAR; - return; - } - - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(lo); - FLAG_Z = lo; - if(BIT_B(word2)) - FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; - else - FLAG_V = (hi != 0) << 7; - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_mull_32_pi(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 src = OPER_AY_PI_32(); - uint64 dst = REG_D[(word2 >> 12) & 7]; - uint64 res; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - res = (sint64)((sint32)src) * (sint64)((sint32)dst); - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = ((sint64)res != (sint32)res)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - - res = src * dst; - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = (res > 0xffffffff)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint src = OPER_AY_PI_32(); - uint dst = REG_D[(word2 >> 12) & 7]; - uint neg = GET_MSB_32(src ^ dst); - uint src1; - uint src2; - uint dst1; - uint dst2; - uint r1; - uint r2; - uint r3; - uint r4; - uint lo; - uint hi; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - if(GET_MSB_32(src)) - src = (uint)MASK_OUT_ABOVE_32(-(sint)src); - if(GET_MSB_32(dst)) - dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); - } - - src1 = MASK_OUT_ABOVE_16(src); - src2 = src>>16; - dst1 = MASK_OUT_ABOVE_16(dst); - dst2 = dst>>16; - - - r1 = src1 * dst1; - r2 = src1 * dst2; - r3 = src2 * dst1; - r4 = src2 * dst2; - - lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); - hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); - - if(BIT_B(word2) && neg) - { - hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); - lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); - } - - if(BIT_A(word2)) - { - REG_D[word2 & 7] = hi; - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(hi); - FLAG_Z = hi | lo; - FLAG_V = VFLAG_CLEAR; - return; - } - - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(lo); - FLAG_Z = lo; - if(BIT_B(word2)) - FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; - else - FLAG_V = (hi != 0) << 7; - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_mull_32_pd(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 src = OPER_AY_PD_32(); - uint64 dst = REG_D[(word2 >> 12) & 7]; - uint64 res; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - res = (sint64)((sint32)src) * (sint64)((sint32)dst); - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = ((sint64)res != (sint32)res)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - - res = src * dst; - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = (res > 0xffffffff)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint src = OPER_AY_PD_32(); - uint dst = REG_D[(word2 >> 12) & 7]; - uint neg = GET_MSB_32(src ^ dst); - uint src1; - uint src2; - uint dst1; - uint dst2; - uint r1; - uint r2; - uint r3; - uint r4; - uint lo; - uint hi; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - if(GET_MSB_32(src)) - src = (uint)MASK_OUT_ABOVE_32(-(sint)src); - if(GET_MSB_32(dst)) - dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); - } - - src1 = MASK_OUT_ABOVE_16(src); - src2 = src>>16; - dst1 = MASK_OUT_ABOVE_16(dst); - dst2 = dst>>16; - - - r1 = src1 * dst1; - r2 = src1 * dst2; - r3 = src2 * dst1; - r4 = src2 * dst2; - - lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); - hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); - - if(BIT_B(word2) && neg) - { - hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); - lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); - } - - if(BIT_A(word2)) - { - REG_D[word2 & 7] = hi; - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(hi); - FLAG_Z = hi | lo; - FLAG_V = VFLAG_CLEAR; - return; - } - - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(lo); - FLAG_Z = lo; - if(BIT_B(word2)) - FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; - else - FLAG_V = (hi != 0) << 7; - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_mull_32_di(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 src = OPER_AY_DI_32(); - uint64 dst = REG_D[(word2 >> 12) & 7]; - uint64 res; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - res = (sint64)((sint32)src) * (sint64)((sint32)dst); - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = ((sint64)res != (sint32)res)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - - res = src * dst; - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = (res > 0xffffffff)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint src = OPER_AY_DI_32(); - uint dst = REG_D[(word2 >> 12) & 7]; - uint neg = GET_MSB_32(src ^ dst); - uint src1; - uint src2; - uint dst1; - uint dst2; - uint r1; - uint r2; - uint r3; - uint r4; - uint lo; - uint hi; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - if(GET_MSB_32(src)) - src = (uint)MASK_OUT_ABOVE_32(-(sint)src); - if(GET_MSB_32(dst)) - dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); - } - - src1 = MASK_OUT_ABOVE_16(src); - src2 = src>>16; - dst1 = MASK_OUT_ABOVE_16(dst); - dst2 = dst>>16; - - - r1 = src1 * dst1; - r2 = src1 * dst2; - r3 = src2 * dst1; - r4 = src2 * dst2; - - lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); - hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); - - if(BIT_B(word2) && neg) - { - hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); - lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); - } - - if(BIT_A(word2)) - { - REG_D[word2 & 7] = hi; - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(hi); - FLAG_Z = hi | lo; - FLAG_V = VFLAG_CLEAR; - return; - } - - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(lo); - FLAG_Z = lo; - if(BIT_B(word2)) - FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; - else - FLAG_V = (hi != 0) << 7; - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_mull_32_ix(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 src = OPER_AY_IX_32(); - uint64 dst = REG_D[(word2 >> 12) & 7]; - uint64 res; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - res = (sint64)((sint32)src) * (sint64)((sint32)dst); - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = ((sint64)res != (sint32)res)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - - res = src * dst; - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = (res > 0xffffffff)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint src = OPER_AY_IX_32(); - uint dst = REG_D[(word2 >> 12) & 7]; - uint neg = GET_MSB_32(src ^ dst); - uint src1; - uint src2; - uint dst1; - uint dst2; - uint r1; - uint r2; - uint r3; - uint r4; - uint lo; - uint hi; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - if(GET_MSB_32(src)) - src = (uint)MASK_OUT_ABOVE_32(-(sint)src); - if(GET_MSB_32(dst)) - dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); - } - - src1 = MASK_OUT_ABOVE_16(src); - src2 = src>>16; - dst1 = MASK_OUT_ABOVE_16(dst); - dst2 = dst>>16; - - - r1 = src1 * dst1; - r2 = src1 * dst2; - r3 = src2 * dst1; - r4 = src2 * dst2; - - lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); - hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); - - if(BIT_B(word2) && neg) - { - hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); - lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); - } - - if(BIT_A(word2)) - { - REG_D[word2 & 7] = hi; - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(hi); - FLAG_Z = hi | lo; - FLAG_V = VFLAG_CLEAR; - return; - } - - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(lo); - FLAG_Z = lo; - if(BIT_B(word2)) - FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; - else - FLAG_V = (hi != 0) << 7; - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_mull_32_aw(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 src = OPER_AW_32(); - uint64 dst = REG_D[(word2 >> 12) & 7]; - uint64 res; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - res = (sint64)((sint32)src) * (sint64)((sint32)dst); - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = ((sint64)res != (sint32)res)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - - res = src * dst; - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = (res > 0xffffffff)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint src = OPER_AW_32(); - uint dst = REG_D[(word2 >> 12) & 7]; - uint neg = GET_MSB_32(src ^ dst); - uint src1; - uint src2; - uint dst1; - uint dst2; - uint r1; - uint r2; - uint r3; - uint r4; - uint lo; - uint hi; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - if(GET_MSB_32(src)) - src = (uint)MASK_OUT_ABOVE_32(-(sint)src); - if(GET_MSB_32(dst)) - dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); - } - - src1 = MASK_OUT_ABOVE_16(src); - src2 = src>>16; - dst1 = MASK_OUT_ABOVE_16(dst); - dst2 = dst>>16; - - - r1 = src1 * dst1; - r2 = src1 * dst2; - r3 = src2 * dst1; - r4 = src2 * dst2; - - lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); - hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); - - if(BIT_B(word2) && neg) - { - hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); - lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); - } - - if(BIT_A(word2)) - { - REG_D[word2 & 7] = hi; - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(hi); - FLAG_Z = hi | lo; - FLAG_V = VFLAG_CLEAR; - return; - } - - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(lo); - FLAG_Z = lo; - if(BIT_B(word2)) - FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; - else - FLAG_V = (hi != 0) << 7; - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_mull_32_al(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 src = OPER_AL_32(); - uint64 dst = REG_D[(word2 >> 12) & 7]; - uint64 res; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - res = (sint64)((sint32)src) * (sint64)((sint32)dst); - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = ((sint64)res != (sint32)res)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - - res = src * dst; - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = (res > 0xffffffff)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint src = OPER_AL_32(); - uint dst = REG_D[(word2 >> 12) & 7]; - uint neg = GET_MSB_32(src ^ dst); - uint src1; - uint src2; - uint dst1; - uint dst2; - uint r1; - uint r2; - uint r3; - uint r4; - uint lo; - uint hi; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - if(GET_MSB_32(src)) - src = (uint)MASK_OUT_ABOVE_32(-(sint)src); - if(GET_MSB_32(dst)) - dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); - } - - src1 = MASK_OUT_ABOVE_16(src); - src2 = src>>16; - dst1 = MASK_OUT_ABOVE_16(dst); - dst2 = dst>>16; - - - r1 = src1 * dst1; - r2 = src1 * dst2; - r3 = src2 * dst1; - r4 = src2 * dst2; - - lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); - hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); - - if(BIT_B(word2) && neg) - { - hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); - lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); - } - - if(BIT_A(word2)) - { - REG_D[word2 & 7] = hi; - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(hi); - FLAG_Z = hi | lo; - FLAG_V = VFLAG_CLEAR; - return; - } - - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(lo); - FLAG_Z = lo; - if(BIT_B(word2)) - FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; - else - FLAG_V = (hi != 0) << 7; - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_mull_32_pcdi(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 src = OPER_PCDI_32(); - uint64 dst = REG_D[(word2 >> 12) & 7]; - uint64 res; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - res = (sint64)((sint32)src) * (sint64)((sint32)dst); - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = ((sint64)res != (sint32)res)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - - res = src * dst; - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = (res > 0xffffffff)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint src = OPER_PCDI_32(); - uint dst = REG_D[(word2 >> 12) & 7]; - uint neg = GET_MSB_32(src ^ dst); - uint src1; - uint src2; - uint dst1; - uint dst2; - uint r1; - uint r2; - uint r3; - uint r4; - uint lo; - uint hi; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - if(GET_MSB_32(src)) - src = (uint)MASK_OUT_ABOVE_32(-(sint)src); - if(GET_MSB_32(dst)) - dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); - } - - src1 = MASK_OUT_ABOVE_16(src); - src2 = src>>16; - dst1 = MASK_OUT_ABOVE_16(dst); - dst2 = dst>>16; - - - r1 = src1 * dst1; - r2 = src1 * dst2; - r3 = src2 * dst1; - r4 = src2 * dst2; - - lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); - hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); - - if(BIT_B(word2) && neg) - { - hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); - lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); - } - - if(BIT_A(word2)) - { - REG_D[word2 & 7] = hi; - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(hi); - FLAG_Z = hi | lo; - FLAG_V = VFLAG_CLEAR; - return; - } - - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(lo); - FLAG_Z = lo; - if(BIT_B(word2)) - FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; - else - FLAG_V = (hi != 0) << 7; - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_mull_32_pcix(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 src = OPER_PCIX_32(); - uint64 dst = REG_D[(word2 >> 12) & 7]; - uint64 res; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - res = (sint64)((sint32)src) * (sint64)((sint32)dst); - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = ((sint64)res != (sint32)res)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - - res = src * dst; - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = (res > 0xffffffff)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint src = OPER_PCIX_32(); - uint dst = REG_D[(word2 >> 12) & 7]; - uint neg = GET_MSB_32(src ^ dst); - uint src1; - uint src2; - uint dst1; - uint dst2; - uint r1; - uint r2; - uint r3; - uint r4; - uint lo; - uint hi; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - if(GET_MSB_32(src)) - src = (uint)MASK_OUT_ABOVE_32(-(sint)src); - if(GET_MSB_32(dst)) - dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); - } - - src1 = MASK_OUT_ABOVE_16(src); - src2 = src>>16; - dst1 = MASK_OUT_ABOVE_16(dst); - dst2 = dst>>16; - - - r1 = src1 * dst1; - r2 = src1 * dst2; - r3 = src2 * dst1; - r4 = src2 * dst2; - - lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); - hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); - - if(BIT_B(word2) && neg) - { - hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); - lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); - } - - if(BIT_A(word2)) - { - REG_D[word2 & 7] = hi; - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(hi); - FLAG_Z = hi | lo; - FLAG_V = VFLAG_CLEAR; - return; - } - - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(lo); - FLAG_Z = lo; - if(BIT_B(word2)) - FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; - else - FLAG_V = (hi != 0) << 7; - return; - } - m68ki_exception_illegal(); - -#endif -} - - -void m68k_op_mull_32_i(void) -{ -#if M68K_USE_64_BIT - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint64 src = OPER_I_32(); - uint64 dst = REG_D[(word2 >> 12) & 7]; - uint64 res; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - res = (sint64)((sint32)src) * (sint64)((sint32)dst); - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = ((sint64)res != (sint32)res)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - - res = src * dst; - if(!BIT_A(word2)) - { - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_N = NFLAG_32(res); - FLAG_V = (res > 0xffffffff)<<7; - REG_D[(word2 >> 12) & 7] = FLAG_Z; - return; - } - FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); - FLAG_N = NFLAG_64(res); - FLAG_V = VFLAG_CLEAR; - REG_D[word2 & 7] = (res >> 32); - REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); - return; - } - m68ki_exception_illegal(); - -#else - - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint word2 = OPER_I_16(); - uint src = OPER_I_32(); - uint dst = REG_D[(word2 >> 12) & 7]; - uint neg = GET_MSB_32(src ^ dst); - uint src1; - uint src2; - uint dst1; - uint dst2; - uint r1; - uint r2; - uint r3; - uint r4; - uint lo; - uint hi; - - FLAG_C = CFLAG_CLEAR; - - if(BIT_B(word2)) /* signed */ - { - if(GET_MSB_32(src)) - src = (uint)MASK_OUT_ABOVE_32(-(sint)src); - if(GET_MSB_32(dst)) - dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); - } - - src1 = MASK_OUT_ABOVE_16(src); - src2 = src>>16; - dst1 = MASK_OUT_ABOVE_16(dst); - dst2 = dst>>16; - - - r1 = src1 * dst1; - r2 = src1 * dst2; - r3 = src2 * dst1; - r4 = src2 * dst2; - - lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); - hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); - - if(BIT_B(word2) && neg) - { - hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); - lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); - } - - if(BIT_A(word2)) - { - REG_D[word2 & 7] = hi; - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(hi); - FLAG_Z = hi | lo; - FLAG_V = VFLAG_CLEAR; - return; - } - - REG_D[(word2 >> 12) & 7] = lo; - FLAG_N = NFLAG_32(lo); - FLAG_Z = lo; - if(BIT_B(word2)) - FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; - else - FLAG_V = (hi != 0) << 7; - return; - } - m68ki_exception_illegal(); - -#endif -} - - -/* ======================================================================== */ -/* ============================== END OF FILE ============================= */ -/* ======================================================================== */ - - diff --git a/source/m68k/m68kopnz.c b/source/m68k/m68kopnz.c deleted file mode 100644 index 60c57eb..0000000 --- a/source/m68k/m68kopnz.c +++ /dev/null @@ -1,8746 +0,0 @@ -#include "m68kcpu.h" - -/* ======================================================================== */ -/* ========================= INSTRUCTION HANDLERS ========================= */ -/* ======================================================================== */ - - -void m68k_op_nbcd_8_d(void) -{ - uint* r_dst = &DY; - uint dst = *r_dst; - uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); - - if(res != 0x9a) - { - if((res & 0x0f) == 0xa) - res = (res & 0xf0) + 0x10; - - res = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_Z |= res; - FLAG_C = CFLAG_SET; - FLAG_X = XFLAG_SET; - } - else - { - FLAG_C = CFLAG_CLEAR; - FLAG_X = XFLAG_CLEAR; - } - FLAG_N = NFLAG_8(res); /* officially undefined */ -} - - -void m68k_op_nbcd_8_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint dst = m68ki_read_8(ea); - uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); - - if(res != 0x9a) - { - if((res & 0x0f) == 0xa) - res = (res & 0xf0) + 0x10; - - res = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); - - FLAG_Z |= res; - FLAG_C = CFLAG_SET; - FLAG_X = XFLAG_SET; - } - else - { - FLAG_C = CFLAG_CLEAR; - FLAG_X = XFLAG_CLEAR; - } - FLAG_N = NFLAG_8(res); /* officially undefined */ -} - - -void m68k_op_nbcd_8_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint dst = m68ki_read_8(ea); - uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); - - if(res != 0x9a) - { - if((res & 0x0f) == 0xa) - res = (res & 0xf0) + 0x10; - - res = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); - - FLAG_Z |= res; - FLAG_C = CFLAG_SET; - FLAG_X = XFLAG_SET; - } - else - { - FLAG_C = CFLAG_CLEAR; - FLAG_X = XFLAG_CLEAR; - } - FLAG_N = NFLAG_8(res); /* officially undefined */ -} - - -void m68k_op_nbcd_8_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint dst = m68ki_read_8(ea); - uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); - - if(res != 0x9a) - { - if((res & 0x0f) == 0xa) - res = (res & 0xf0) + 0x10; - - res = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); - - FLAG_Z |= res; - FLAG_C = CFLAG_SET; - FLAG_X = XFLAG_SET; - } - else - { - FLAG_C = CFLAG_CLEAR; - FLAG_X = XFLAG_CLEAR; - } - FLAG_N = NFLAG_8(res); /* officially undefined */ -} - - -void m68k_op_nbcd_8_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); - - if(res != 0x9a) - { - if((res & 0x0f) == 0xa) - res = (res & 0xf0) + 0x10; - - res = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); - - FLAG_Z |= res; - FLAG_C = CFLAG_SET; - FLAG_X = XFLAG_SET; - } - else - { - FLAG_C = CFLAG_CLEAR; - FLAG_X = XFLAG_CLEAR; - } - FLAG_N = NFLAG_8(res); /* officially undefined */ -} - - -void m68k_op_nbcd_8_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); - - if(res != 0x9a) - { - if((res & 0x0f) == 0xa) - res = (res & 0xf0) + 0x10; - - res = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); - - FLAG_Z |= res; - FLAG_C = CFLAG_SET; - FLAG_X = XFLAG_SET; - } - else - { - FLAG_C = CFLAG_CLEAR; - FLAG_X = XFLAG_CLEAR; - } - FLAG_N = NFLAG_8(res); /* officially undefined */ -} - - -void m68k_op_nbcd_8_di(void) -{ - uint ea = EA_AY_DI_8(); - uint dst = m68ki_read_8(ea); - uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); - - if(res != 0x9a) - { - if((res & 0x0f) == 0xa) - res = (res & 0xf0) + 0x10; - - res = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); - - FLAG_Z |= res; - FLAG_C = CFLAG_SET; - FLAG_X = XFLAG_SET; - } - else - { - FLAG_C = CFLAG_CLEAR; - FLAG_X = XFLAG_CLEAR; - } - FLAG_N = NFLAG_8(res); /* officially undefined */ -} - - -void m68k_op_nbcd_8_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint dst = m68ki_read_8(ea); - uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); - - if(res != 0x9a) - { - if((res & 0x0f) == 0xa) - res = (res & 0xf0) + 0x10; - - res = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); - - FLAG_Z |= res; - FLAG_C = CFLAG_SET; - FLAG_X = XFLAG_SET; - } - else - { - FLAG_C = CFLAG_CLEAR; - FLAG_X = XFLAG_CLEAR; - } - FLAG_N = NFLAG_8(res); /* officially undefined */ -} - - -void m68k_op_nbcd_8_aw(void) -{ - uint ea = EA_AW_8(); - uint dst = m68ki_read_8(ea); - uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); - - if(res != 0x9a) - { - if((res & 0x0f) == 0xa) - res = (res & 0xf0) + 0x10; - - res = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); - - FLAG_Z |= res; - FLAG_C = CFLAG_SET; - FLAG_X = XFLAG_SET; - } - else - { - FLAG_C = CFLAG_CLEAR; - FLAG_X = XFLAG_CLEAR; - } - FLAG_N = NFLAG_8(res); /* officially undefined */ -} - - -void m68k_op_nbcd_8_al(void) -{ - uint ea = EA_AL_8(); - uint dst = m68ki_read_8(ea); - uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); - - if(res != 0x9a) - { - if((res & 0x0f) == 0xa) - res = (res & 0xf0) + 0x10; - - res = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); - - FLAG_Z |= res; - FLAG_C = CFLAG_SET; - FLAG_X = XFLAG_SET; - } - else - { - FLAG_C = CFLAG_CLEAR; - FLAG_X = XFLAG_CLEAR; - } - FLAG_N = NFLAG_8(res); /* officially undefined */ -} - - -void m68k_op_neg_8_d(void) -{ - uint* r_dst = &DY; - uint res = 0 - MASK_OUT_ABOVE_8(*r_dst); - - FLAG_N = NFLAG_8(res); - FLAG_C = FLAG_X = CFLAG_8(res); - FLAG_V = *r_dst & res; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_neg_8_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_8(res); - FLAG_C = FLAG_X = CFLAG_8(res); - FLAG_V = src & res; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_neg_8_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_8(res); - FLAG_C = FLAG_X = CFLAG_8(res); - FLAG_V = src & res; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_neg_8_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_8(res); - FLAG_C = FLAG_X = CFLAG_8(res); - FLAG_V = src & res; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_neg_8_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_8(res); - FLAG_C = FLAG_X = CFLAG_8(res); - FLAG_V = src & res; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_neg_8_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_8(res); - FLAG_C = FLAG_X = CFLAG_8(res); - FLAG_V = src & res; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_neg_8_di(void) -{ - uint ea = EA_AY_DI_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_8(res); - FLAG_C = FLAG_X = CFLAG_8(res); - FLAG_V = src & res; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_neg_8_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_8(res); - FLAG_C = FLAG_X = CFLAG_8(res); - FLAG_V = src & res; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_neg_8_aw(void) -{ - uint ea = EA_AW_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_8(res); - FLAG_C = FLAG_X = CFLAG_8(res); - FLAG_V = src & res; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_neg_8_al(void) -{ - uint ea = EA_AL_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_8(res); - FLAG_C = FLAG_X = CFLAG_8(res); - FLAG_V = src & res; - FLAG_Z = MASK_OUT_ABOVE_8(res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_neg_16_d(void) -{ - uint* r_dst = &DY; - uint res = 0 - MASK_OUT_ABOVE_16(*r_dst); - - FLAG_N = NFLAG_16(res); - FLAG_C = FLAG_X = CFLAG_16(res); - FLAG_V = (*r_dst & res)>>8; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_neg_16_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_16(res); - FLAG_C = FLAG_X = CFLAG_16(res); - FLAG_V = (src & res)>>8; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_neg_16_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_16(res); - FLAG_C = FLAG_X = CFLAG_16(res); - FLAG_V = (src & res)>>8; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_neg_16_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_16(res); - FLAG_C = FLAG_X = CFLAG_16(res); - FLAG_V = (src & res)>>8; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_neg_16_di(void) -{ - uint ea = EA_AY_DI_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_16(res); - FLAG_C = FLAG_X = CFLAG_16(res); - FLAG_V = (src & res)>>8; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_neg_16_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_16(res); - FLAG_C = FLAG_X = CFLAG_16(res); - FLAG_V = (src & res)>>8; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_neg_16_aw(void) -{ - uint ea = EA_AW_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_16(res); - FLAG_C = FLAG_X = CFLAG_16(res); - FLAG_V = (src & res)>>8; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_neg_16_al(void) -{ - uint ea = EA_AL_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_16(res); - FLAG_C = FLAG_X = CFLAG_16(res); - FLAG_V = (src & res)>>8; - FLAG_Z = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_neg_32_d(void) -{ - uint* r_dst = &DY; - uint res = 0 - *r_dst; - - FLAG_N = NFLAG_32(res); - FLAG_C = FLAG_X = CFLAG_SUB_32(*r_dst, 0, res); - FLAG_V = (*r_dst & res)>>24; - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_neg_32_ai(void) -{ - uint ea = EA_AY_AI_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_32(res); - FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_neg_32_pi(void) -{ - uint ea = EA_AY_PI_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_32(res); - FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_neg_32_pd(void) -{ - uint ea = EA_AY_PD_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_32(res); - FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_neg_32_di(void) -{ - uint ea = EA_AY_DI_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_32(res); - FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_neg_32_ix(void) -{ - uint ea = EA_AY_IX_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_32(res); - FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_neg_32_aw(void) -{ - uint ea = EA_AW_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_32(res); - FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_neg_32_al(void) -{ - uint ea = EA_AL_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - src; - - FLAG_N = NFLAG_32(res); - FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - FLAG_Z = MASK_OUT_ABOVE_32(res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_negx_8_d(void) -{ - uint* r_dst = &DY; - uint res = 0 - MASK_OUT_ABOVE_8(*r_dst) - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = *r_dst & res; - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; -} - - -void m68k_op_negx_8_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = src & res; - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_negx_8_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = src & res; - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_negx_8_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = src & res; - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_negx_8_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = src & res; - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_negx_8_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = src & res; - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_negx_8_di(void) -{ - uint ea = EA_AY_DI_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = src & res; - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_negx_8_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = src & res; - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_negx_8_aw(void) -{ - uint ea = EA_AW_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = src & res; - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_negx_8_al(void) -{ - uint ea = EA_AL_8(); - uint src = m68ki_read_8(ea); - uint res = 0 - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = src & res; - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_negx_16_d(void) -{ - uint* r_dst = &DY; - uint res = 0 - MASK_OUT_ABOVE_16(*r_dst) - XFLAG_AS_1(); - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = (*r_dst & res)>>8; - - res = MASK_OUT_ABOVE_16(res); - FLAG_Z |= res; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; -} - - -void m68k_op_negx_16_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = (src & res)>>8; - - res = MASK_OUT_ABOVE_16(res); - FLAG_Z |= res; - - m68ki_write_16(ea, res); -} - - -void m68k_op_negx_16_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = (src & res)>>8; - - res = MASK_OUT_ABOVE_16(res); - FLAG_Z |= res; - - m68ki_write_16(ea, res); -} - - -void m68k_op_negx_16_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = (src & res)>>8; - - res = MASK_OUT_ABOVE_16(res); - FLAG_Z |= res; - - m68ki_write_16(ea, res); -} - - -void m68k_op_negx_16_di(void) -{ - uint ea = EA_AY_DI_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = (src & res)>>8; - - res = MASK_OUT_ABOVE_16(res); - FLAG_Z |= res; - - m68ki_write_16(ea, res); -} - - -void m68k_op_negx_16_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = (src & res)>>8; - - res = MASK_OUT_ABOVE_16(res); - FLAG_Z |= res; - - m68ki_write_16(ea, res); -} - - -void m68k_op_negx_16_aw(void) -{ - uint ea = EA_AW_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = (src & res)>>8; - - res = MASK_OUT_ABOVE_16(res); - FLAG_Z |= res; - - m68ki_write_16(ea, res); -} - - -void m68k_op_negx_16_al(void) -{ - uint ea = EA_AL_16(); - uint src = m68ki_read_16(ea); - uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = (src & res)>>8; - - res = MASK_OUT_ABOVE_16(res); - FLAG_Z |= res; - - m68ki_write_16(ea, res); -} - - -void m68k_op_negx_32_d(void) -{ - uint* r_dst = &DY; - uint res = 0 - MASK_OUT_ABOVE_32(*r_dst) - XFLAG_AS_1(); - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(*r_dst, 0, res); - FLAG_V = (*r_dst & res)>>24; - - res = MASK_OUT_ABOVE_32(res); - FLAG_Z |= res; - - *r_dst = res; -} - - -void m68k_op_negx_32_ai(void) -{ - uint ea = EA_AY_AI_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - - res = MASK_OUT_ABOVE_32(res); - FLAG_Z |= res; - - m68ki_write_32(ea, res); -} - - -void m68k_op_negx_32_pi(void) -{ - uint ea = EA_AY_PI_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - - res = MASK_OUT_ABOVE_32(res); - FLAG_Z |= res; - - m68ki_write_32(ea, res); -} - - -void m68k_op_negx_32_pd(void) -{ - uint ea = EA_AY_PD_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - - res = MASK_OUT_ABOVE_32(res); - FLAG_Z |= res; - - m68ki_write_32(ea, res); -} - - -void m68k_op_negx_32_di(void) -{ - uint ea = EA_AY_DI_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - - res = MASK_OUT_ABOVE_32(res); - FLAG_Z |= res; - - m68ki_write_32(ea, res); -} - - -void m68k_op_negx_32_ix(void) -{ - uint ea = EA_AY_IX_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - - res = MASK_OUT_ABOVE_32(res); - FLAG_Z |= res; - - m68ki_write_32(ea, res); -} - - -void m68k_op_negx_32_aw(void) -{ - uint ea = EA_AW_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - - res = MASK_OUT_ABOVE_32(res); - FLAG_Z |= res; - - m68ki_write_32(ea, res); -} - - -void m68k_op_negx_32_al(void) -{ - uint ea = EA_AL_32(); - uint src = m68ki_read_32(ea); - uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); - FLAG_V = (src & res)>>24; - - res = MASK_OUT_ABOVE_32(res); - FLAG_Z |= res; - - m68ki_write_32(ea, res); -} - - -void m68k_op_nop(void) -{ - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ -} - - -void m68k_op_not_8_d(void) -{ - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_8(~*r_dst); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_8_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_8_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_8_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_8_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_8_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_8_di(void) -{ - uint ea = EA_AY_DI_8(); - uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_8_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_8_aw(void) -{ - uint ea = EA_AW_8(); - uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_8_al(void) -{ - uint ea = EA_AL_8(); - uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_16_d(void) -{ - uint* r_dst = &DY; - uint res = MASK_OUT_ABOVE_16(~*r_dst); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_16_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_16_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_16_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_16_di(void) -{ - uint ea = EA_AY_DI_16(); - uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_16_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_16_aw(void) -{ - uint ea = EA_AW_16(); - uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_16_al(void) -{ - uint ea = EA_AL_16(); - uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_32_d(void) -{ - uint* r_dst = &DY; - uint res = *r_dst = MASK_OUT_ABOVE_32(~*r_dst); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_32_ai(void) -{ - uint ea = EA_AY_AI_32(); - uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_32_pi(void) -{ - uint ea = EA_AY_PI_32(); - uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_32_pd(void) -{ - uint ea = EA_AY_PD_32(); - uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_32_di(void) -{ - uint ea = EA_AY_DI_32(); - uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_32_ix(void) -{ - uint ea = EA_AY_IX_32(); - uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_32_aw(void) -{ - uint ea = EA_AW_32(); - uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_not_32_al(void) -{ - uint ea = EA_AL_32(); - uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_er_d(void) -{ - uint res = MASK_OUT_ABOVE_8((DX |= MASK_OUT_ABOVE_8(DY))); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_er_ai(void) -{ - uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_AI_8())); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_er_pi(void) -{ - uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_PI_8())); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_er_pi7(void) -{ - uint res = MASK_OUT_ABOVE_8((DX |= OPER_A7_PI_8())); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_er_pd(void) -{ - uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_PD_8())); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_er_pd7(void) -{ - uint res = MASK_OUT_ABOVE_8((DX |= OPER_A7_PD_8())); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_er_di(void) -{ - uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_DI_8())); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_er_ix(void) -{ - uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_IX_8())); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_er_aw(void) -{ - uint res = MASK_OUT_ABOVE_8((DX |= OPER_AW_8())); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_er_al(void) -{ - uint res = MASK_OUT_ABOVE_8((DX |= OPER_AL_8())); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_er_pcdi(void) -{ - uint res = MASK_OUT_ABOVE_8((DX |= OPER_PCDI_8())); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_er_pcix(void) -{ - uint res = MASK_OUT_ABOVE_8((DX |= OPER_PCIX_8())); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_er_i(void) -{ - uint res = MASK_OUT_ABOVE_8((DX |= OPER_I_8())); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_er_d(void) -{ - uint res = MASK_OUT_ABOVE_16((DX |= MASK_OUT_ABOVE_16(DY))); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_er_ai(void) -{ - uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_AI_16())); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_er_pi(void) -{ - uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_PI_16())); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_er_pd(void) -{ - uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_PD_16())); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_er_di(void) -{ - uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_DI_16())); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_er_ix(void) -{ - uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_IX_16())); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_er_aw(void) -{ - uint res = MASK_OUT_ABOVE_16((DX |= OPER_AW_16())); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_er_al(void) -{ - uint res = MASK_OUT_ABOVE_16((DX |= OPER_AL_16())); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_er_pcdi(void) -{ - uint res = MASK_OUT_ABOVE_16((DX |= OPER_PCDI_16())); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_er_pcix(void) -{ - uint res = MASK_OUT_ABOVE_16((DX |= OPER_PCIX_16())); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_er_i(void) -{ - uint res = MASK_OUT_ABOVE_16((DX |= OPER_I_16())); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_er_d(void) -{ - uint res = DX |= DY; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_er_ai(void) -{ - uint res = DX |= OPER_AY_AI_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_er_pi(void) -{ - uint res = DX |= OPER_AY_PI_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_er_pd(void) -{ - uint res = DX |= OPER_AY_PD_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_er_di(void) -{ - uint res = DX |= OPER_AY_DI_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_er_ix(void) -{ - uint res = DX |= OPER_AY_IX_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_er_aw(void) -{ - uint res = DX |= OPER_AW_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_er_al(void) -{ - uint res = DX |= OPER_AL_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_er_pcdi(void) -{ - uint res = DX |= OPER_PCDI_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_er_pcix(void) -{ - uint res = DX |= OPER_PCIX_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_er_i(void) -{ - uint res = DX |= OPER_I_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_re_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_re_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_re_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_re_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_re_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_re_di(void) -{ - uint ea = EA_AY_DI_8(); - uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_re_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_re_aw(void) -{ - uint ea = EA_AW_8(); - uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_8_re_al(void) -{ - uint ea = EA_AL_8(); - uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_re_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_re_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_re_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_re_di(void) -{ - uint ea = EA_AY_DI_16(); - uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_re_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_re_aw(void) -{ - uint ea = EA_AW_16(); - uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_16_re_al(void) -{ - uint ea = EA_AL_16(); - uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_re_ai(void) -{ - uint ea = EA_AY_AI_32(); - uint res = DX | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_re_pi(void) -{ - uint ea = EA_AY_PI_32(); - uint res = DX | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_re_pd(void) -{ - uint ea = EA_AY_PD_32(); - uint res = DX | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_re_di(void) -{ - uint ea = EA_AY_DI_32(); - uint res = DX | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_re_ix(void) -{ - uint ea = EA_AY_IX_32(); - uint res = DX | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_re_aw(void) -{ - uint ea = EA_AW_32(); - uint res = DX | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_or_32_re_al(void) -{ - uint ea = EA_AL_32(); - uint res = DX | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_8_d(void) -{ - uint res = MASK_OUT_ABOVE_8((DY |= OPER_I_8())); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_8_ai(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_AI_8(); - uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_8_pi(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_PI_8(); - uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_8_pi7(void) -{ - uint src = OPER_I_8(); - uint ea = EA_A7_PI_8(); - uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_8_pd(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_PD_8(); - uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_8_pd7(void) -{ - uint src = OPER_I_8(); - uint ea = EA_A7_PD_8(); - uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_8_di(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_DI_8(); - uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_8_ix(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_IX_8(); - uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_8_aw(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AW_8(); - uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_8_al(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AL_8(); - uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); - - m68ki_write_8(ea, res); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_16_d(void) -{ - uint res = MASK_OUT_ABOVE_16(DY |= OPER_I_16()); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_16_ai(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_AI_16(); - uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_16_pi(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_PI_16(); - uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_16_pd(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_PD_16(); - uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_16_di(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_DI_16(); - uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_16_ix(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_IX_16(); - uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_16_aw(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AW_16(); - uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_16_al(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AL_16(); - uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_32_d(void) -{ - uint res = DY |= OPER_I_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_32_ai(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_AI_32(); - uint res = src | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_32_pi(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_PI_32(); - uint res = src | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_32_pd(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_PD_32(); - uint res = src | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_32_di(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_DI_32(); - uint res = src | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_32_ix(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_IX_32(); - uint res = src | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_32_aw(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AW_32(); - uint res = src | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_32_al(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AL_32(); - uint res = src | m68ki_read_32(ea); - - m68ki_write_32(ea, res); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ori_16_toc(void) -{ - m68ki_set_ccr(m68ki_get_ccr() | OPER_I_16()); -} - - -void m68k_op_ori_16_tos(void) -{ - if(FLAG_S) - { - uint src = OPER_I_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_sr(m68ki_get_sr() | src); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_pack_16_rr(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - /* Note: DX and DY are reversed in Motorola's docs */ - uint src = DY + OPER_I_16(); - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | ((src >> 4) & 0x00f0) | (src & 0x000f); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_pack_16_mm_ax7(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - /* Note: AX and AY are reversed in Motorola's docs */ - uint ea_src = EA_AY_PD_8(); - uint src = m68ki_read_8(ea_src); - ea_src = EA_AY_PD_8(); - src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16(); - - m68ki_write_8(EA_A7_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f)); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_pack_16_mm_ay7(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - /* Note: AX and AY are reversed in Motorola's docs */ - uint ea_src = EA_A7_PD_8(); - uint src = m68ki_read_8(ea_src); - ea_src = EA_A7_PD_8(); - src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16(); - - m68ki_write_8(EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f)); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_pack_16_mm_axy7(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint ea_src = EA_A7_PD_8(); - uint src = m68ki_read_8(ea_src); - ea_src = EA_A7_PD_8(); - src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16(); - - m68ki_write_8(EA_A7_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f)); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_pack_16_mm(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - /* Note: AX and AY are reversed in Motorola's docs */ - uint ea_src = EA_AY_PD_8(); - uint src = m68ki_read_8(ea_src); - ea_src = EA_AY_PD_8(); - src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16(); - - m68ki_write_8(EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f)); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_pea_32_ai(void) -{ - uint ea = EA_AY_AI_32(); - - m68ki_push_32(ea); -} - - -void m68k_op_pea_32_di(void) -{ - uint ea = EA_AY_DI_32(); - - m68ki_push_32(ea); -} - - -void m68k_op_pea_32_ix(void) -{ - uint ea = EA_AY_IX_32(); - - m68ki_push_32(ea); -} - - -void m68k_op_pea_32_aw(void) -{ - uint ea = EA_AW_32(); - - m68ki_push_32(ea); -} - - -void m68k_op_pea_32_al(void) -{ - uint ea = EA_AL_32(); - - m68ki_push_32(ea); -} - - -void m68k_op_pea_32_pcdi(void) -{ - uint ea = EA_PCDI_32(); - - m68ki_push_32(ea); -} - - -void m68k_op_pea_32_pcix(void) -{ - uint ea = EA_PCIX_32(); - - m68ki_push_32(ea); -} - - -void m68k_op_reset(void) -{ - if(FLAG_S) - { - m68ki_output_reset(); /* auto-disable (see m68kcpu.h) */ - USE_CYCLES(CYC_RESET); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_ror_8_s(void) -{ - uint* r_dst = &DY; - uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint shift = orig_shift & 7; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = ROR_8(src, shift); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = src << (9-orig_shift); - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ror_16_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_16(*r_dst); - uint res = ROR_16(src, shift); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src << (9-shift); - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ror_32_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint64 src = *r_dst; - uint res = ROR_32(src, shift); - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = src << (9-shift); - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ror_8_r(void) -{ - uint* r_dst = &DY; - uint orig_shift = DX & 0x3f; - uint shift = orig_shift & 7; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = ROR_8(src, shift); - - if(orig_shift != 0) - { - USE_CYCLES(orig_shift<> ((shift - 1) & 15)) << 8; - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_16(src); - FLAG_Z = src; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ror_32_r(void) -{ - uint* r_dst = &DY; - uint orig_shift = DX & 0x3f; - uint shift = orig_shift & 31; - uint64 src = *r_dst; - uint res = ROR_32(src, shift); - - if(orig_shift != 0) - { - USE_CYCLES(orig_shift<> ((shift - 1) & 31)) << 8; - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_32(src); - FLAG_Z = src; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ror_16_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint src = m68ki_read_16(ea); - uint res = ROR_16(src, 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ror_16_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint src = m68ki_read_16(ea); - uint res = ROR_16(src, 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ror_16_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint src = m68ki_read_16(ea); - uint res = ROR_16(src, 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ror_16_di(void) -{ - uint ea = EA_AY_DI_16(); - uint src = m68ki_read_16(ea); - uint res = ROR_16(src, 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ror_16_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint src = m68ki_read_16(ea); - uint res = ROR_16(src, 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ror_16_aw(void) -{ - uint ea = EA_AW_16(); - uint src = m68ki_read_16(ea); - uint res = ROR_16(src, 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_ror_16_al(void) -{ - uint ea = EA_AL_16(); - uint src = m68ki_read_16(ea); - uint res = ROR_16(src, 1); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src << 8; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_rol_8_s(void) -{ - uint* r_dst = &DY; - uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint shift = orig_shift & 7; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = ROL_8(src, shift); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_C = src << orig_shift; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_rol_16_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_16(*r_dst); - uint res = ROL_16(src, shift); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src >> (8-shift); - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_rol_32_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint64 src = *r_dst; - uint res = ROL_32(src, shift); - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_C = src >> (24-shift); - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_rol_8_r(void) -{ - uint* r_dst = &DY; - uint orig_shift = DX & 0x3f; - uint shift = orig_shift & 7; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = ROL_8(src, shift); - - if(orig_shift != 0) - { - USE_CYCLES(orig_shift<> 8; - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - FLAG_C = (src & 1)<<8; - FLAG_N = NFLAG_16(src); - FLAG_Z = src; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_16(src); - FLAG_Z = src; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_rol_32_r(void) -{ - uint* r_dst = &DY; - uint orig_shift = DX & 0x3f; - uint shift = orig_shift & 31; - uint64 src = *r_dst; - uint res = ROL_32(src, shift); - - if(orig_shift != 0) - { - USE_CYCLES(orig_shift<> (32 - shift)) << 8; - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = CFLAG_CLEAR; - FLAG_N = NFLAG_32(src); - FLAG_Z = src; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_rol_16_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_rol_16_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_rol_16_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_rol_16_di(void) -{ - uint ea = EA_AY_DI_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_rol_16_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_rol_16_aw(void) -{ - uint ea = EA_AW_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_rol_16_al(void) -{ - uint ea = EA_AL_16(); - uint src = m68ki_read_16(ea); - uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_C = src >> 7; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxr_8_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = ROR_9(src | (XFLAG_AS_1() << 8), shift); - - FLAG_C = FLAG_X = res; - res = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxr_16_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_16(*r_dst); - uint res = ROR_17(src | (XFLAG_AS_1() << 16), shift); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxr_32_s(void) -{ -#if M68K_USE_64_BIT - - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint64 src = *r_dst; - uint64 res = src | (((uint64)XFLAG_AS_1()) << 32); - - res = ROR_33_64(res, shift); - - FLAG_C = FLAG_X = res >> 24; - res = MASK_OUT_ABOVE_32(res); - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - -#else - - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = *r_dst; - uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift))); - uint new_x_flag = src & (1 << (shift - 1)); - - *r_dst = res; - - FLAG_C = FLAG_X = (new_x_flag != 0)<<8; - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - -#endif -} - - -void m68k_op_roxr_8_r(void) -{ - uint* r_dst = &DY; - uint orig_shift = DX & 0x3f; - - if(orig_shift != 0) - { - uint shift = orig_shift % 9; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = ROR_9(src | (XFLAG_AS_1() << 8), shift); - - USE_CYCLES(orig_shift<> 8; - res = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = FLAG_X; - FLAG_N = NFLAG_16(*r_dst); - FLAG_Z = MASK_OUT_ABOVE_16(*r_dst); - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxr_32_r(void) -{ -#if M68K_USE_64_BIT - - uint* r_dst = &DY; - uint orig_shift = DX & 0x3f; - - if(orig_shift != 0) - { - uint shift = orig_shift % 33; - uint64 src = *r_dst; - uint64 res = src | (((uint64)XFLAG_AS_1()) << 32); - - res = ROR_33_64(res, shift); - - USE_CYCLES(orig_shift<> 24; - res = MASK_OUT_ABOVE_32(res); - - *r_dst = res; - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = FLAG_X; - FLAG_N = NFLAG_32(*r_dst); - FLAG_Z = *r_dst; - FLAG_V = VFLAG_CLEAR; - -#else - - uint* r_dst = &DY; - uint orig_shift = DX & 0x3f; - uint shift = orig_shift % 33; - uint src = *r_dst; - uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift))); - uint new_x_flag = src & (1 << (shift - 1)); - - if(orig_shift != 0) - USE_CYCLES(orig_shift<> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxr_16_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint src = m68ki_read_16(ea); - uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxr_16_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint src = m68ki_read_16(ea); - uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxr_16_di(void) -{ - uint ea = EA_AY_DI_16(); - uint src = m68ki_read_16(ea); - uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxr_16_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint src = m68ki_read_16(ea); - uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxr_16_aw(void) -{ - uint ea = EA_AW_16(); - uint src = m68ki_read_16(ea); - uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxr_16_al(void) -{ - uint ea = EA_AL_16(); - uint src = m68ki_read_16(ea); - uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxl_8_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = ROL_9(src | (XFLAG_AS_1() << 8), shift); - - FLAG_C = FLAG_X = res; - res = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxl_16_s(void) -{ - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = MASK_OUT_ABOVE_16(*r_dst); - uint res = ROL_17(src | (XFLAG_AS_1() << 16), shift); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxl_32_s(void) -{ -#if M68K_USE_64_BIT - - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint64 src = *r_dst; - uint64 res = src | (((uint64)XFLAG_AS_1()) << 32); - - res = ROL_33_64(res, shift); - - FLAG_C = FLAG_X = res >> 24; - res = MASK_OUT_ABOVE_32(res); - - *r_dst = res; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - -#else - - uint* r_dst = &DY; - uint shift = (((REG_IR >> 9) - 1) & 7) + 1; - uint src = *r_dst; - uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1))); - uint new_x_flag = src & (1 << (32 - shift)); - - *r_dst = res; - - FLAG_C = FLAG_X = (new_x_flag != 0)<<8; - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - -#endif -} - - -void m68k_op_roxl_8_r(void) -{ - uint* r_dst = &DY; - uint orig_shift = DX & 0x3f; - - - if(orig_shift != 0) - { - uint shift = orig_shift % 9; - uint src = MASK_OUT_ABOVE_8(*r_dst); - uint res = ROL_9(src | (XFLAG_AS_1() << 8), shift); - - USE_CYCLES(orig_shift<> 8; - res = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = FLAG_X; - FLAG_N = NFLAG_16(*r_dst); - FLAG_Z = MASK_OUT_ABOVE_16(*r_dst); - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxl_32_r(void) -{ -#if M68K_USE_64_BIT - - uint* r_dst = &DY; - uint orig_shift = DX & 0x3f; - - if(orig_shift != 0) - { - uint shift = orig_shift % 33; - uint64 src = *r_dst; - uint64 res = src | (((uint64)XFLAG_AS_1()) << 32); - - res = ROL_33_64(res, shift); - - USE_CYCLES(orig_shift<> 24; - res = MASK_OUT_ABOVE_32(res); - - *r_dst = res; - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - return; - } - - FLAG_C = FLAG_X; - FLAG_N = NFLAG_32(*r_dst); - FLAG_Z = *r_dst; - FLAG_V = VFLAG_CLEAR; - -#else - - uint* r_dst = &DY; - uint orig_shift = DX & 0x3f; - uint shift = orig_shift % 33; - uint src = *r_dst; - uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1))); - uint new_x_flag = src & (1 << (32 - shift)); - - if(orig_shift != 0) - USE_CYCLES(orig_shift<> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxl_16_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint src = m68ki_read_16(ea); - uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxl_16_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint src = m68ki_read_16(ea); - uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxl_16_di(void) -{ - uint ea = EA_AY_DI_16(); - uint src = m68ki_read_16(ea); - uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxl_16_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint src = m68ki_read_16(ea); - uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxl_16_aw(void) -{ - uint ea = EA_AW_16(); - uint src = m68ki_read_16(ea); - uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_roxl_16_al(void) -{ - uint ea = EA_AL_16(); - uint src = m68ki_read_16(ea); - uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); - - FLAG_C = FLAG_X = res >> 8; - res = MASK_OUT_ABOVE_16(res); - - m68ki_write_16(ea, res); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_rtd_32(void) -{ - if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) - { - uint new_pc = m68ki_pull_32(); - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16())); - m68ki_jump(new_pc); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_rte_32(void) -{ - if(FLAG_S) - { - uint new_sr; - uint new_pc; - uint format_word; - - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - - if(CPU_TYPE_IS_000(CPU_TYPE)) - { - new_sr = m68ki_pull_16(); - new_pc = m68ki_pull_32(); - m68ki_jump(new_pc); - m68ki_set_sr(new_sr); - return; - } - - if(CPU_TYPE_IS_010(CPU_TYPE)) - { - format_word = m68ki_read_16(REG_A[7]+6) >> 12; - if(format_word == 0) - { - new_sr = m68ki_pull_16(); - new_pc = m68ki_pull_32(); - m68ki_fake_pull_16(); /* format word */ - m68ki_jump(new_pc); - m68ki_set_sr(new_sr); - return; - } - /* Not handling bus fault (9) */ - m68ki_exception_format_error(); - return; - } - - /* Otherwise it's 020 */ -rte_loop: - format_word = m68ki_read_16(REG_A[7]+6) >> 12; - switch(format_word) - { - case 0: /* Normal */ - new_sr = m68ki_pull_16(); - new_pc = m68ki_pull_32(); - m68ki_fake_pull_16(); /* format word */ - m68ki_jump(new_pc); - m68ki_set_sr(new_sr); - return; - case 1: /* Throwaway */ - new_sr = m68ki_pull_16(); - m68ki_fake_pull_32(); /* program counter */ - m68ki_fake_pull_16(); /* format word */ - m68ki_set_sr_noint(new_sr); - goto rte_loop; - case 2: /* Trap */ - new_sr = m68ki_pull_16(); - new_pc = m68ki_pull_32(); - m68ki_fake_pull_16(); /* format word */ - m68ki_fake_pull_32(); /* address */ - m68ki_jump(new_pc); - m68ki_set_sr(new_sr); - return; - } - /* Not handling long or short bus fault */ - m68ki_exception_format_error(); - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_rtm_32(void) -{ - if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) - { - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", - m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, - m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_rtr_32(void) -{ - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_set_ccr(m68ki_pull_16()); - m68ki_jump(m68ki_pull_32()); -} - - -void m68k_op_rts_32(void) -{ - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - m68ki_jump(m68ki_pull_32()); -} - - -void m68k_op_sbcd_8_rr(void) -{ - uint* r_dst = &DX; - uint src = DY; - uint dst = *r_dst; - uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); - - if(res > 9) - res -= 6; - res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); - FLAG_X = FLAG_C = (res > 0x99) << 8; - if(FLAG_C) - res += 0xa0; - - res = MASK_OUT_ABOVE_8(res); - - FLAG_N = NFLAG_8(res); /* officially undefined */ - FLAG_Z |= res; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; -} - - -void m68k_op_sbcd_8_mm_ax7(void) -{ - uint src = OPER_AY_PD_8(); - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); - - if(res > 9) - res -= 6; - res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); - FLAG_X = FLAG_C = (res > 0x99) << 8; - if(FLAG_C) - res += 0xa0; - - res = MASK_OUT_ABOVE_8(res); - - FLAG_N = NFLAG_8(res); /* officially undefined */ - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_sbcd_8_mm_ay7(void) -{ - uint src = OPER_A7_PD_8(); - uint ea = EA_AX_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); - - if(res > 9) - res -= 6; - res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); - FLAG_X = FLAG_C = (res > 0x99) << 8; - if(FLAG_C) - res += 0xa0; - - res = MASK_OUT_ABOVE_8(res); - - FLAG_N = NFLAG_8(res); /* officially undefined */ - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_sbcd_8_mm_axy7(void) -{ - uint src = OPER_A7_PD_8(); - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); - - if(res > 9) - res -= 6; - res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); - FLAG_X = FLAG_C = (res > 0x99) << 8; - if(FLAG_C) - res += 0xa0; - - res = MASK_OUT_ABOVE_8(res); - - FLAG_N = NFLAG_8(res); /* officially undefined */ - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_sbcd_8_mm(void) -{ - uint src = OPER_AY_PD_8(); - uint ea = EA_AX_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); - - if(res > 9) - res -= 6; - res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); - FLAG_X = FLAG_C = (res > 0x99) << 8; - if(FLAG_C) - res += 0xa0; - - res = MASK_OUT_ABOVE_8(res); - - FLAG_N = NFLAG_8(res); /* officially undefined */ - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_st_8_d(void) -{ - DY |= 0xff; -} - - -void m68k_op_st_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), 0xff); -} - - -void m68k_op_st_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), 0xff); -} - - -void m68k_op_st_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), 0xff); -} - - -void m68k_op_st_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), 0xff); -} - - -void m68k_op_st_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), 0xff); -} - - -void m68k_op_st_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), 0xff); -} - - -void m68k_op_st_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), 0xff); -} - - -void m68k_op_st_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), 0xff); -} - - -void m68k_op_st_8_al(void) -{ - m68ki_write_8(EA_AL_8(), 0xff); -} - - -void m68k_op_sf_8_d(void) -{ - DY &= 0xffffff00; -} - - -void m68k_op_sf_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), 0); -} - - -void m68k_op_sf_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), 0); -} - - -void m68k_op_sf_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), 0); -} - - -void m68k_op_sf_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), 0); -} - - -void m68k_op_sf_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), 0); -} - - -void m68k_op_sf_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), 0); -} - - -void m68k_op_sf_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), 0); -} - - -void m68k_op_sf_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), 0); -} - - -void m68k_op_sf_8_al(void) -{ - m68ki_write_8(EA_AL_8(), 0); -} - - -void m68k_op_shi_8_d(void) -{ - if(COND_HI()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_sls_8_d(void) -{ - if(COND_LS()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_scc_8_d(void) -{ - if(COND_CC()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_scs_8_d(void) -{ - if(COND_CS()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_sne_8_d(void) -{ - if(COND_NE()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_seq_8_d(void) -{ - if(COND_EQ()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_svc_8_d(void) -{ - if(COND_VC()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_svs_8_d(void) -{ - if(COND_VS()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_spl_8_d(void) -{ - if(COND_PL()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_smi_8_d(void) -{ - if(COND_MI()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_sge_8_d(void) -{ - if(COND_GE()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_slt_8_d(void) -{ - if(COND_LT()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_sgt_8_d(void) -{ - if(COND_GT()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_sle_8_d(void) -{ - if(COND_LE()) - { - DY |= 0xff; - return; - } - DY &= 0xffffff00; -} - - -void m68k_op_shi_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_HI() ? 0xff : 0); -} - - -void m68k_op_shi_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_HI() ? 0xff : 0); -} - - -void m68k_op_shi_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_HI() ? 0xff : 0); -} - - -void m68k_op_shi_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_HI() ? 0xff : 0); -} - - -void m68k_op_shi_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_HI() ? 0xff : 0); -} - - -void m68k_op_shi_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_HI() ? 0xff : 0); -} - - -void m68k_op_shi_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_HI() ? 0xff : 0); -} - - -void m68k_op_shi_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_HI() ? 0xff : 0); -} - - -void m68k_op_shi_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_HI() ? 0xff : 0); -} - - -void m68k_op_sls_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_LS() ? 0xff : 0); -} - - -void m68k_op_sls_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_LS() ? 0xff : 0); -} - - -void m68k_op_sls_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_LS() ? 0xff : 0); -} - - -void m68k_op_sls_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_LS() ? 0xff : 0); -} - - -void m68k_op_sls_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_LS() ? 0xff : 0); -} - - -void m68k_op_sls_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_LS() ? 0xff : 0); -} - - -void m68k_op_sls_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_LS() ? 0xff : 0); -} - - -void m68k_op_sls_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_LS() ? 0xff : 0); -} - - -void m68k_op_sls_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_LS() ? 0xff : 0); -} - - -void m68k_op_scc_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_CC() ? 0xff : 0); -} - - -void m68k_op_scc_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_CC() ? 0xff : 0); -} - - -void m68k_op_scc_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_CC() ? 0xff : 0); -} - - -void m68k_op_scc_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_CC() ? 0xff : 0); -} - - -void m68k_op_scc_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_CC() ? 0xff : 0); -} - - -void m68k_op_scc_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_CC() ? 0xff : 0); -} - - -void m68k_op_scc_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_CC() ? 0xff : 0); -} - - -void m68k_op_scc_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_CC() ? 0xff : 0); -} - - -void m68k_op_scc_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_CC() ? 0xff : 0); -} - - -void m68k_op_scs_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_CS() ? 0xff : 0); -} - - -void m68k_op_scs_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_CS() ? 0xff : 0); -} - - -void m68k_op_scs_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_CS() ? 0xff : 0); -} - - -void m68k_op_scs_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_CS() ? 0xff : 0); -} - - -void m68k_op_scs_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_CS() ? 0xff : 0); -} - - -void m68k_op_scs_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_CS() ? 0xff : 0); -} - - -void m68k_op_scs_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_CS() ? 0xff : 0); -} - - -void m68k_op_scs_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_CS() ? 0xff : 0); -} - - -void m68k_op_scs_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_CS() ? 0xff : 0); -} - - -void m68k_op_sne_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_NE() ? 0xff : 0); -} - - -void m68k_op_sne_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_NE() ? 0xff : 0); -} - - -void m68k_op_sne_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_NE() ? 0xff : 0); -} - - -void m68k_op_sne_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_NE() ? 0xff : 0); -} - - -void m68k_op_sne_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_NE() ? 0xff : 0); -} - - -void m68k_op_sne_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_NE() ? 0xff : 0); -} - - -void m68k_op_sne_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_NE() ? 0xff : 0); -} - - -void m68k_op_sne_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_NE() ? 0xff : 0); -} - - -void m68k_op_sne_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_NE() ? 0xff : 0); -} - - -void m68k_op_seq_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_EQ() ? 0xff : 0); -} - - -void m68k_op_seq_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_EQ() ? 0xff : 0); -} - - -void m68k_op_seq_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_EQ() ? 0xff : 0); -} - - -void m68k_op_seq_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_EQ() ? 0xff : 0); -} - - -void m68k_op_seq_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_EQ() ? 0xff : 0); -} - - -void m68k_op_seq_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_EQ() ? 0xff : 0); -} - - -void m68k_op_seq_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_EQ() ? 0xff : 0); -} - - -void m68k_op_seq_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_EQ() ? 0xff : 0); -} - - -void m68k_op_seq_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_EQ() ? 0xff : 0); -} - - -void m68k_op_svc_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_VC() ? 0xff : 0); -} - - -void m68k_op_svc_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_VC() ? 0xff : 0); -} - - -void m68k_op_svc_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_VC() ? 0xff : 0); -} - - -void m68k_op_svc_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_VC() ? 0xff : 0); -} - - -void m68k_op_svc_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_VC() ? 0xff : 0); -} - - -void m68k_op_svc_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_VC() ? 0xff : 0); -} - - -void m68k_op_svc_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_VC() ? 0xff : 0); -} - - -void m68k_op_svc_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_VC() ? 0xff : 0); -} - - -void m68k_op_svc_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_VC() ? 0xff : 0); -} - - -void m68k_op_svs_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_VS() ? 0xff : 0); -} - - -void m68k_op_svs_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_VS() ? 0xff : 0); -} - - -void m68k_op_svs_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_VS() ? 0xff : 0); -} - - -void m68k_op_svs_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_VS() ? 0xff : 0); -} - - -void m68k_op_svs_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_VS() ? 0xff : 0); -} - - -void m68k_op_svs_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_VS() ? 0xff : 0); -} - - -void m68k_op_svs_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_VS() ? 0xff : 0); -} - - -void m68k_op_svs_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_VS() ? 0xff : 0); -} - - -void m68k_op_svs_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_VS() ? 0xff : 0); -} - - -void m68k_op_spl_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_PL() ? 0xff : 0); -} - - -void m68k_op_spl_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_PL() ? 0xff : 0); -} - - -void m68k_op_spl_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_PL() ? 0xff : 0); -} - - -void m68k_op_spl_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_PL() ? 0xff : 0); -} - - -void m68k_op_spl_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_PL() ? 0xff : 0); -} - - -void m68k_op_spl_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_PL() ? 0xff : 0); -} - - -void m68k_op_spl_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_PL() ? 0xff : 0); -} - - -void m68k_op_spl_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_PL() ? 0xff : 0); -} - - -void m68k_op_spl_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_PL() ? 0xff : 0); -} - - -void m68k_op_smi_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_MI() ? 0xff : 0); -} - - -void m68k_op_smi_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_MI() ? 0xff : 0); -} - - -void m68k_op_smi_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_MI() ? 0xff : 0); -} - - -void m68k_op_smi_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_MI() ? 0xff : 0); -} - - -void m68k_op_smi_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_MI() ? 0xff : 0); -} - - -void m68k_op_smi_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_MI() ? 0xff : 0); -} - - -void m68k_op_smi_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_MI() ? 0xff : 0); -} - - -void m68k_op_smi_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_MI() ? 0xff : 0); -} - - -void m68k_op_smi_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_MI() ? 0xff : 0); -} - - -void m68k_op_sge_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_GE() ? 0xff : 0); -} - - -void m68k_op_sge_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_GE() ? 0xff : 0); -} - - -void m68k_op_sge_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_GE() ? 0xff : 0); -} - - -void m68k_op_sge_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_GE() ? 0xff : 0); -} - - -void m68k_op_sge_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_GE() ? 0xff : 0); -} - - -void m68k_op_sge_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_GE() ? 0xff : 0); -} - - -void m68k_op_sge_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_GE() ? 0xff : 0); -} - - -void m68k_op_sge_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_GE() ? 0xff : 0); -} - - -void m68k_op_sge_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_GE() ? 0xff : 0); -} - - -void m68k_op_slt_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_LT() ? 0xff : 0); -} - - -void m68k_op_slt_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_LT() ? 0xff : 0); -} - - -void m68k_op_slt_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_LT() ? 0xff : 0); -} - - -void m68k_op_slt_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_LT() ? 0xff : 0); -} - - -void m68k_op_slt_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_LT() ? 0xff : 0); -} - - -void m68k_op_slt_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_LT() ? 0xff : 0); -} - - -void m68k_op_slt_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_LT() ? 0xff : 0); -} - - -void m68k_op_slt_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_LT() ? 0xff : 0); -} - - -void m68k_op_slt_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_LT() ? 0xff : 0); -} - - -void m68k_op_sgt_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_GT() ? 0xff : 0); -} - - -void m68k_op_sgt_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_GT() ? 0xff : 0); -} - - -void m68k_op_sgt_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_GT() ? 0xff : 0); -} - - -void m68k_op_sgt_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_GT() ? 0xff : 0); -} - - -void m68k_op_sgt_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_GT() ? 0xff : 0); -} - - -void m68k_op_sgt_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_GT() ? 0xff : 0); -} - - -void m68k_op_sgt_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_GT() ? 0xff : 0); -} - - -void m68k_op_sgt_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_GT() ? 0xff : 0); -} - - -void m68k_op_sgt_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_GT() ? 0xff : 0); -} - - -void m68k_op_sle_8_ai(void) -{ - m68ki_write_8(EA_AY_AI_8(), COND_LE() ? 0xff : 0); -} - - -void m68k_op_sle_8_pi(void) -{ - m68ki_write_8(EA_AY_PI_8(), COND_LE() ? 0xff : 0); -} - - -void m68k_op_sle_8_pi7(void) -{ - m68ki_write_8(EA_A7_PI_8(), COND_LE() ? 0xff : 0); -} - - -void m68k_op_sle_8_pd(void) -{ - m68ki_write_8(EA_AY_PD_8(), COND_LE() ? 0xff : 0); -} - - -void m68k_op_sle_8_pd7(void) -{ - m68ki_write_8(EA_A7_PD_8(), COND_LE() ? 0xff : 0); -} - - -void m68k_op_sle_8_di(void) -{ - m68ki_write_8(EA_AY_DI_8(), COND_LE() ? 0xff : 0); -} - - -void m68k_op_sle_8_ix(void) -{ - m68ki_write_8(EA_AY_IX_8(), COND_LE() ? 0xff : 0); -} - - -void m68k_op_sle_8_aw(void) -{ - m68ki_write_8(EA_AW_8(), COND_LE() ? 0xff : 0); -} - - -void m68k_op_sle_8_al(void) -{ - m68ki_write_8(EA_AL_8(), COND_LE() ? 0xff : 0); -} - - -void m68k_op_stop(void) -{ - if(FLAG_S) - { - uint new_sr = OPER_I_16(); - m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ - CPU_STOPPED |= STOP_LEVEL_STOP; - m68ki_set_sr(new_sr); - m68ki_remaining_cycles = 0; - return; - } - m68ki_exception_privilege_violation(); -} - - -void m68k_op_sub_8_er_d(void) -{ - uint* r_dst = &DX; - uint src = MASK_OUT_ABOVE_8(DY); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_8_er_ai(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_AI_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_8_er_pi(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PI_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_8_er_pi7(void) -{ - uint* r_dst = &DX; - uint src = OPER_A7_PI_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_8_er_pd(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PD_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_8_er_pd7(void) -{ - uint* r_dst = &DX; - uint src = OPER_A7_PD_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_8_er_di(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_DI_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_8_er_ix(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_IX_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_8_er_aw(void) -{ - uint* r_dst = &DX; - uint src = OPER_AW_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_8_er_al(void) -{ - uint* r_dst = &DX; - uint src = OPER_AL_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_8_er_pcdi(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCDI_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_8_er_pcix(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCIX_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_8_er_i(void) -{ - uint* r_dst = &DX; - uint src = OPER_I_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_16_er_d(void) -{ - uint* r_dst = &DX; - uint src = MASK_OUT_ABOVE_16(DY); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_16_er_a(void) -{ - uint* r_dst = &DX; - uint src = MASK_OUT_ABOVE_16(AY); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_16_er_ai(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_AI_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_16_er_pi(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PI_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_16_er_pd(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PD_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_16_er_di(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_DI_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_16_er_ix(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_IX_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_16_er_aw(void) -{ - uint* r_dst = &DX; - uint src = OPER_AW_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_16_er_al(void) -{ - uint* r_dst = &DX; - uint src = OPER_AL_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_16_er_pcdi(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCDI_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_16_er_pcix(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCIX_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_16_er_i(void) -{ - uint* r_dst = &DX; - uint src = OPER_I_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_sub_32_er_d(void) -{ - uint* r_dst = &DX; - uint src = DY; - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_sub_32_er_a(void) -{ - uint* r_dst = &DX; - uint src = AY; - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_sub_32_er_ai(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_AI_32(); - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_sub_32_er_pi(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PI_32(); - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_sub_32_er_pd(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_PD_32(); - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_sub_32_er_di(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_DI_32(); - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_sub_32_er_ix(void) -{ - uint* r_dst = &DX; - uint src = OPER_AY_IX_32(); - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_sub_32_er_aw(void) -{ - uint* r_dst = &DX; - uint src = OPER_AW_32(); - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_sub_32_er_al(void) -{ - uint* r_dst = &DX; - uint src = OPER_AL_32(); - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_sub_32_er_pcdi(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCDI_32(); - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_sub_32_er_pcix(void) -{ - uint* r_dst = &DX; - uint src = OPER_PCIX_32(); - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_sub_32_er_i(void) -{ - uint* r_dst = &DX; - uint src = OPER_I_32(); - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_sub_8_re_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_sub_8_re_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_sub_8_re_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_sub_8_re_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_sub_8_re_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_sub_8_re_di(void) -{ - uint ea = EA_AY_DI_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_sub_8_re_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_sub_8_re_aw(void) -{ - uint ea = EA_AW_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_sub_8_re_al(void) -{ - uint ea = EA_AL_8(); - uint src = MASK_OUT_ABOVE_8(DX); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_sub_16_re_ai(void) -{ - uint ea = EA_AY_AI_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_sub_16_re_pi(void) -{ - uint ea = EA_AY_PI_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_sub_16_re_pd(void) -{ - uint ea = EA_AY_PD_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_sub_16_re_di(void) -{ - uint ea = EA_AY_DI_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_sub_16_re_ix(void) -{ - uint ea = EA_AY_IX_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_sub_16_re_aw(void) -{ - uint ea = EA_AW_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_sub_16_re_al(void) -{ - uint ea = EA_AL_16(); - uint src = MASK_OUT_ABOVE_16(DX); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_sub_32_re_ai(void) -{ - uint ea = EA_AY_AI_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_sub_32_re_pi(void) -{ - uint ea = EA_AY_PI_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_sub_32_re_pd(void) -{ - uint ea = EA_AY_PD_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_sub_32_re_di(void) -{ - uint ea = EA_AY_DI_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_sub_32_re_ix(void) -{ - uint ea = EA_AY_IX_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_sub_32_re_aw(void) -{ - uint ea = EA_AW_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_sub_32_re_al(void) -{ - uint ea = EA_AL_32(); - uint src = DX; - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_suba_16_d(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(DY)); -} - - -void m68k_op_suba_16_a(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(AY)); -} - - -void m68k_op_suba_16_ai(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AY_AI_16())); -} - - -void m68k_op_suba_16_pi(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AY_PI_16())); -} - - -void m68k_op_suba_16_pd(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AY_PD_16())); -} - - -void m68k_op_suba_16_di(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AY_DI_16())); -} - - -void m68k_op_suba_16_ix(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AY_IX_16())); -} - - -void m68k_op_suba_16_aw(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AW_16())); -} - - -void m68k_op_suba_16_al(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AL_16())); -} - - -void m68k_op_suba_16_pcdi(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_PCDI_16())); -} - - -void m68k_op_suba_16_pcix(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_PCIX_16())); -} - - -void m68k_op_suba_16_i(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_I_16())); -} - - -void m68k_op_suba_32_d(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - DY); -} - - -void m68k_op_suba_32_a(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - AY); -} - - -void m68k_op_suba_32_ai(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AY_AI_32()); -} - - -void m68k_op_suba_32_pi(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AY_PI_32()); -} - - -void m68k_op_suba_32_pd(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AY_PD_32()); -} - - -void m68k_op_suba_32_di(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AY_DI_32()); -} - - -void m68k_op_suba_32_ix(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AY_IX_32()); -} - - -void m68k_op_suba_32_aw(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AW_32()); -} - - -void m68k_op_suba_32_al(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AL_32()); -} - - -void m68k_op_suba_32_pcdi(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_PCDI_32()); -} - - -void m68k_op_suba_32_pcix(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_PCIX_32()); -} - - -void m68k_op_suba_32_i(void) -{ - uint* r_dst = &AX; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_I_32()); -} - - -void m68k_op_subi_8_d(void) -{ - uint* r_dst = &DY; - uint src = OPER_I_8(); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_subi_8_ai(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_AI_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subi_8_pi(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_PI_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subi_8_pi7(void) -{ - uint src = OPER_I_8(); - uint ea = EA_A7_PI_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subi_8_pd(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subi_8_pd7(void) -{ - uint src = OPER_I_8(); - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subi_8_di(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_DI_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subi_8_ix(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AY_IX_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subi_8_aw(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AW_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subi_8_al(void) -{ - uint src = OPER_I_8(); - uint ea = EA_AL_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subi_16_d(void) -{ - uint* r_dst = &DY; - uint src = OPER_I_16(); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_subi_16_ai(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_AI_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subi_16_pi(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_PI_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subi_16_pd(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_PD_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subi_16_di(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_DI_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subi_16_ix(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AY_IX_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subi_16_aw(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AW_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subi_16_al(void) -{ - uint src = OPER_I_16(); - uint ea = EA_AL_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subi_32_d(void) -{ - uint* r_dst = &DY; - uint src = OPER_I_32(); - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_subi_32_ai(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_AI_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subi_32_pi(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_PI_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subi_32_pd(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_PD_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subi_32_di(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_DI_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subi_32_ix(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AY_IX_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subi_32_aw(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AW_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subi_32_al(void) -{ - uint src = OPER_I_32(); - uint ea = EA_AL_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subq_8_d(void) -{ - uint* r_dst = &DY; - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; -} - - -void m68k_op_subq_8_ai(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_AI_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subq_8_pi(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_PI_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subq_8_pi7(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_A7_PI_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subq_8_pd(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subq_8_pd7(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subq_8_di(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_DI_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subq_8_ix(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_IX_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subq_8_aw(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AW_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subq_8_al(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AL_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src; - - FLAG_N = NFLAG_8(res); - FLAG_Z = MASK_OUT_ABOVE_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - m68ki_write_8(ea, FLAG_Z); -} - - -void m68k_op_subq_16_d(void) -{ - uint* r_dst = &DY; - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; -} - - -void m68k_op_subq_16_a(void) -{ - uint* r_dst = &AY; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1)); -} - - -void m68k_op_subq_16_ai(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_AI_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subq_16_pi(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_PI_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subq_16_pd(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_PD_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subq_16_di(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_DI_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subq_16_ix(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_IX_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subq_16_aw(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AW_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subq_16_al(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AL_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src; - - FLAG_N = NFLAG_16(res); - FLAG_Z = MASK_OUT_ABOVE_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - m68ki_write_16(ea, FLAG_Z); -} - - -void m68k_op_subq_32_d(void) -{ - uint* r_dst = &DY; - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint dst = *r_dst; - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - *r_dst = FLAG_Z; -} - - -void m68k_op_subq_32_a(void) -{ - uint* r_dst = &AY; - - *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1)); -} - - -void m68k_op_subq_32_ai(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_AI_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subq_32_pi(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_PI_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subq_32_pd(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_PD_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subq_32_di(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_DI_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subq_32_ix(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AY_IX_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subq_32_aw(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AW_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subq_32_al(void) -{ - uint src = (((REG_IR >> 9) - 1) & 7) + 1; - uint ea = EA_AL_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src; - - FLAG_N = NFLAG_32(res); - FLAG_Z = MASK_OUT_ABOVE_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - m68ki_write_32(ea, FLAG_Z); -} - - -void m68k_op_subx_8_rr(void) -{ - uint* r_dst = &DX; - uint src = MASK_OUT_ABOVE_8(DY); - uint dst = MASK_OUT_ABOVE_8(*r_dst); - uint res = dst - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; -} - - -void m68k_op_subx_16_rr(void) -{ - uint* r_dst = &DX; - uint src = MASK_OUT_ABOVE_16(DY); - uint dst = MASK_OUT_ABOVE_16(*r_dst); - uint res = dst - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - res = MASK_OUT_ABOVE_16(res); - FLAG_Z |= res; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; -} - - -void m68k_op_subx_32_rr(void) -{ - uint* r_dst = &DX; - uint src = DY; - uint dst = *r_dst; - uint res = dst - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - res = MASK_OUT_ABOVE_32(res); - FLAG_Z |= res; - - *r_dst = res; -} - - -void m68k_op_subx_8_mm_ax7(void) -{ - uint src = OPER_AY_PD_8(); - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_subx_8_mm_ay7(void) -{ - uint src = OPER_A7_PD_8(); - uint ea = EA_AX_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_subx_8_mm_axy7(void) -{ - uint src = OPER_A7_PD_8(); - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_subx_8_mm(void) -{ - uint src = OPER_AY_PD_8(); - uint ea = EA_AX_PD_8(); - uint dst = m68ki_read_8(ea); - uint res = dst - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_8(res); - FLAG_X = FLAG_C = CFLAG_8(res); - FLAG_V = VFLAG_SUB_8(src, dst, res); - - res = MASK_OUT_ABOVE_8(res); - FLAG_Z |= res; - - m68ki_write_8(ea, res); -} - - -void m68k_op_subx_16_mm(void) -{ - uint src = OPER_AY_PD_16(); - uint ea = EA_AX_PD_16(); - uint dst = m68ki_read_16(ea); - uint res = dst - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_16(res); - FLAG_X = FLAG_C = CFLAG_16(res); - FLAG_V = VFLAG_SUB_16(src, dst, res); - - res = MASK_OUT_ABOVE_16(res); - FLAG_Z |= res; - - m68ki_write_16(ea, res); -} - - -void m68k_op_subx_32_mm(void) -{ - uint src = OPER_AY_PD_32(); - uint ea = EA_AX_PD_32(); - uint dst = m68ki_read_32(ea); - uint res = dst - src - XFLAG_AS_1(); - - FLAG_N = NFLAG_32(res); - FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); - FLAG_V = VFLAG_SUB_32(src, dst, res); - - res = MASK_OUT_ABOVE_32(res); - FLAG_Z |= res; - - m68ki_write_32(ea, res); -} - - -void m68k_op_swap_32(void) -{ - uint* r_dst = &DY; - - FLAG_Z = MASK_OUT_ABOVE_32(*r_dst<<16); - *r_dst = (*r_dst>>16) | FLAG_Z; - - FLAG_Z = *r_dst; - FLAG_N = NFLAG_32(*r_dst); - FLAG_C = CFLAG_CLEAR; - FLAG_V = VFLAG_CLEAR; -} - - -void m68k_op_tas_8_d(void) -{ - uint* r_dst = &DY; - - FLAG_Z = MASK_OUT_ABOVE_8(*r_dst); - FLAG_N = NFLAG_8(*r_dst); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - *r_dst |= 0x80; -} - - -void m68k_op_tas_8_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint dst = m68ki_read_8(ea); - - FLAG_Z = dst; - FLAG_N = NFLAG_8(dst); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -#if GENESIS_HACKS - /* Write-back prevented in this system */ -#else - m68ki_write_8(ea, dst | 0x80); -#endif -} - - -void m68k_op_tas_8_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint dst = m68ki_read_8(ea); - - FLAG_Z = dst; - FLAG_N = NFLAG_8(dst); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -#if GENESIS_HACKS - /* Write-back prevented in this system */ -#else - m68ki_write_8(ea, dst | 0x80); -#endif -} - - -void m68k_op_tas_8_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint dst = m68ki_read_8(ea); - - FLAG_Z = dst; - FLAG_N = NFLAG_8(dst); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -#if GENESIS_HACKS - /* Write-back prevented in this system */ -#else - m68ki_write_8(ea, dst | 0x80); -#endif -} - - -void m68k_op_tas_8_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint dst = m68ki_read_8(ea); - - FLAG_Z = dst; - FLAG_N = NFLAG_8(dst); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -#if GENESIS_HACKS - /* Write-back prevented in this system */ -#else - m68ki_write_8(ea, dst | 0x80); -#endif -} - - -void m68k_op_tas_8_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint dst = m68ki_read_8(ea); - - FLAG_Z = dst; - FLAG_N = NFLAG_8(dst); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -#if GENESIS_HACKS - /* Write-back prevented in this system */ -#else - m68ki_write_8(ea, dst | 0x80); -#endif -} - - -void m68k_op_tas_8_di(void) -{ - uint ea = EA_AY_DI_8(); - uint dst = m68ki_read_8(ea); - - FLAG_Z = dst; - FLAG_N = NFLAG_8(dst); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -#if GENESIS_HACKS - /* Write-back prevented in this system */ -#else - m68ki_write_8(ea, dst | 0x80); -#endif -} - - -void m68k_op_tas_8_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint dst = m68ki_read_8(ea); - - FLAG_Z = dst; - FLAG_N = NFLAG_8(dst); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -#if GENESIS_HACKS - /* Write-back prevented in this system */ -#else - m68ki_write_8(ea, dst | 0x80); -#endif -} - - -void m68k_op_tas_8_aw(void) -{ - uint ea = EA_AW_8(); - uint dst = m68ki_read_8(ea); - - FLAG_Z = dst; - FLAG_N = NFLAG_8(dst); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -#if GENESIS_HACKS - /* Write-back prevented in this system */ -#else - m68ki_write_8(ea, dst | 0x80); -#endif -} - - -void m68k_op_tas_8_al(void) -{ - uint ea = EA_AL_8(); - uint dst = m68ki_read_8(ea); - - FLAG_Z = dst; - FLAG_N = NFLAG_8(dst); - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -#if GENESIS_HACKS - /* Write-back prevented in this system */ -#else - m68ki_write_8(ea, dst | 0x80); -#endif -} - - -void m68k_op_trap(void) -{ - /* Trap#n stacks exception frame type 0 */ - m68ki_exception_trapN(EXCEPTION_TRAP_BASE + (REG_IR & 0xf)); /* HJB 990403 */ -} - - -void m68k_op_trapt(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapt_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapt_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapf(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapf_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapf_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_traphi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_HI()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapls(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_LS()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapcc(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_CC()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapcs(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_CS()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapne(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_NE()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapeq(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_EQ()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapvc(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_VC()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapvs(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_VS()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trappl(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_PL()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapmi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_MI()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapge(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_GE()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_traplt(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_LT()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapgt(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_GT()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_traple(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_LE()) - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_traphi_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_HI()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapls_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_LS()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapcc_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_CC()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapcs_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_CS()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapne_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_NE()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapeq_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_EQ()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapvc_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_VC()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapvs_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_VS()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trappl_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_PL()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapmi_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_MI()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapge_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_GE()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_traplt_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_LT()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapgt_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_GT()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_traple_16(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_LE()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 2; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_traphi_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_HI()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapls_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_LS()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapcc_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_CC()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapcs_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_CS()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapne_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_NE()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapeq_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_EQ()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapvc_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_VC()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapvs_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_VS()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trappl_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_PL()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapmi_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_MI()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapge_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_GE()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_traplt_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_LT()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapgt_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_GT()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_traple_32(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - if(COND_LE()) - { - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ - return; - } - REG_PC += 4; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_trapv(void) -{ - if(COND_VC()) - { - return; - } - m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ -} - - -void m68k_op_tst_8_d(void) -{ - uint res = MASK_OUT_ABOVE_8(DY); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_8_ai(void) -{ - uint ea = EA_AY_AI_8(); - uint res = m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_8_pi(void) -{ - uint ea = EA_AY_PI_8(); - uint res = m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_8_pi7(void) -{ - uint ea = EA_A7_PI_8(); - uint res = m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_8_pd(void) -{ - uint ea = EA_AY_PD_8(); - uint res = m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_8_pd7(void) -{ - uint ea = EA_A7_PD_8(); - uint res = m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_8_di(void) -{ - uint ea = EA_AY_DI_8(); - uint res = m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_8_ix(void) -{ - uint ea = EA_AY_IX_8(); - uint res = m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_8_aw(void) -{ - uint ea = EA_AW_8(); - uint res = m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_8_al(void) -{ - uint ea = EA_AL_8(); - uint res = m68ki_read_8(ea); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_8_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint res = OPER_PCDI_8(); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_tst_8_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint res = OPER_PCIX_8(); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_tst_8_i(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint res = OPER_I_8(); - - FLAG_N = NFLAG_8(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_tst_16_d(void) -{ - uint res = MASK_OUT_ABOVE_16(DY); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_16_a(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint res = MAKE_INT_16(AY); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_tst_16_ai(void) -{ - uint res = OPER_AY_AI_16(); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_16_pi(void) -{ - uint res = OPER_AY_PI_16(); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_16_pd(void) -{ - uint res = OPER_AY_PD_16(); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_16_di(void) -{ - uint res = OPER_AY_DI_16(); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_16_ix(void) -{ - uint res = OPER_AY_IX_16(); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_16_aw(void) -{ - uint res = OPER_AW_16(); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_16_al(void) -{ - uint res = OPER_AL_16(); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_16_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint res = OPER_PCDI_16(); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_tst_16_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint res = OPER_PCIX_16(); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_tst_16_i(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint res = OPER_I_16(); - - FLAG_N = NFLAG_16(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_tst_32_d(void) -{ - uint res = DY; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_32_a(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint res = AY; - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_tst_32_ai(void) -{ - uint res = OPER_AY_AI_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_32_pi(void) -{ - uint res = OPER_AY_PI_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_32_pd(void) -{ - uint res = OPER_AY_PD_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_32_di(void) -{ - uint res = OPER_AY_DI_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_32_ix(void) -{ - uint res = OPER_AY_IX_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_32_aw(void) -{ - uint res = OPER_AW_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_32_al(void) -{ - uint res = OPER_AL_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; -} - - -void m68k_op_tst_32_pcdi(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint res = OPER_PCDI_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_tst_32_pcix(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint res = OPER_PCIX_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_tst_32_i(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint res = OPER_I_32(); - - FLAG_N = NFLAG_32(res); - FLAG_Z = res; - FLAG_V = VFLAG_CLEAR; - FLAG_C = CFLAG_CLEAR; - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_unlk_32_a7(void) -{ - REG_A[7] = m68ki_read_32(REG_A[7]); -} - - -void m68k_op_unlk_32(void) -{ - uint* r_dst = &AY; - - REG_A[7] = *r_dst; - *r_dst = m68ki_pull_32(); -} - - -void m68k_op_unpk_16_rr(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - /* Note: DX and DY are reversed in Motorola's docs */ - uint src = DY; - uint* r_dst = &DX; - - *r_dst = MASK_OUT_BELOW_16(*r_dst) | (((((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16()) & 0xffff); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_unpk_16_mm_ax7(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - /* Note: AX and AY are reversed in Motorola's docs */ - uint src = OPER_AY_PD_8(); - uint ea_dst; - - src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(); - ea_dst = EA_A7_PD_8(); - m68ki_write_8(ea_dst, (src >> 8) & 0xff); - ea_dst = EA_A7_PD_8(); - m68ki_write_8(ea_dst, src & 0xff); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_unpk_16_mm_ay7(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - /* Note: AX and AY are reversed in Motorola's docs */ - uint src = OPER_A7_PD_8(); - uint ea_dst; - - src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(); - ea_dst = EA_AX_PD_8(); - m68ki_write_8(ea_dst, (src >> 8) & 0xff); - ea_dst = EA_AX_PD_8(); - m68ki_write_8(ea_dst, src & 0xff); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_unpk_16_mm_axy7(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - uint src = OPER_A7_PD_8(); - uint ea_dst; - - src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(); - ea_dst = EA_A7_PD_8(); - m68ki_write_8(ea_dst, (src >> 8) & 0xff); - ea_dst = EA_A7_PD_8(); - m68ki_write_8(ea_dst, src & 0xff); - return; - } - m68ki_exception_illegal(); -} - - -void m68k_op_unpk_16_mm(void) -{ - if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) - { - /* Note: AX and AY are reversed in Motorola's docs */ - uint src = OPER_AY_PD_8(); - uint ea_dst; - - src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(); - ea_dst = EA_AX_PD_8(); - m68ki_write_8(ea_dst, (src >> 8) & 0xff); - ea_dst = EA_AX_PD_8(); - m68ki_write_8(ea_dst, src & 0xff); - return; - } - m68ki_exception_illegal(); -} - - -/* ======================================================================== */ -/* ============================== END OF FILE ============================= */ -/* ======================================================================== */ - - diff --git a/source/m68k/m68kops.c b/source/m68k/m68kops.c index ac79916..12a2d20 100644 --- a/source/m68k/m68kops.c +++ b/source/m68k/m68kops.c @@ -1,2093 +1,36682 @@ -/* ======================================================================== */ -/* ========================= OPCODE TABLE BUILDER ========================= */ -/* ======================================================================== */ - -#include "m68kops.h" - -#define NUM_CPU_TYPES 3 - -void (*m68ki_instruction_jump_table[0x10000])(void); /* opcode handler jump table */ -unsigned char m68ki_cycles[NUM_CPU_TYPES][0x10000]; /* Cycles used by CPU type */ - -/* This is used to generate the opcode handler jump table */ -typedef struct -{ - void (*opcode_handler)(void); /* handler function */ - unsigned int mask; /* mask on opcode */ - unsigned int match; /* what to match after masking */ - unsigned char cycles[NUM_CPU_TYPES]; /* cycles each cpu type takes */ -} opcode_handler_struct; - - -/* Opcode handler table */ -static opcode_handler_struct m68k_opcode_handler_table[] = -{ -/* function mask match 000 010 020 */ - {m68k_op_1010 , 0xf000, 0xa000, { 4, 4, 4}}, - {m68k_op_1111 , 0xf000, 0xf000, { 4, 4, 4}}, - {m68k_op_moveq_32 , 0xf100, 0x7000, { 4, 4, 2}}, - {m68k_op_cpbcc_32 , 0xf180, 0xf080, { 0, 0, 4}}, - {m68k_op_cpgen_32 , 0xf1c0, 0xf000, { 0, 0, 4}}, - {m68k_op_cpscc_32 , 0xf1c0, 0xf040, { 0, 0, 4}}, - {m68k_op_bra_8 , 0xff00, 0x6000, { 10, 10, 10}}, - {m68k_op_bsr_8 , 0xff00, 0x6100, { 18, 18, 7}}, - {m68k_op_bhi_8 , 0xff00, 0x6200, { 8, 8, 6}}, - {m68k_op_bls_8 , 0xff00, 0x6300, { 8, 8, 6}}, - {m68k_op_bcc_8 , 0xff00, 0x6400, { 8, 8, 6}}, - {m68k_op_bcs_8 , 0xff00, 0x6500, { 8, 8, 6}}, - {m68k_op_bne_8 , 0xff00, 0x6600, { 8, 8, 6}}, - {m68k_op_beq_8 , 0xff00, 0x6700, { 8, 8, 6}}, - {m68k_op_bvc_8 , 0xff00, 0x6800, { 8, 8, 6}}, - {m68k_op_bvs_8 , 0xff00, 0x6900, { 8, 8, 6}}, - {m68k_op_bpl_8 , 0xff00, 0x6a00, { 8, 8, 6}}, - {m68k_op_bmi_8 , 0xff00, 0x6b00, { 8, 8, 6}}, - {m68k_op_bge_8 , 0xff00, 0x6c00, { 8, 8, 6}}, - {m68k_op_blt_8 , 0xff00, 0x6d00, { 8, 8, 6}}, - {m68k_op_bgt_8 , 0xff00, 0x6e00, { 8, 8, 6}}, - {m68k_op_ble_8 , 0xff00, 0x6f00, { 8, 8, 6}}, - {m68k_op_btst_32_r_d , 0xf1f8, 0x0100, { 6, 6, 4}}, - {m68k_op_movep_16_er , 0xf1f8, 0x0108, { 16, 16, 12}}, - {m68k_op_btst_8_r_ai , 0xf1f8, 0x0110, { 8, 8, 8}}, - {m68k_op_btst_8_r_pi , 0xf1f8, 0x0118, { 8, 8, 8}}, - {m68k_op_btst_8_r_pd , 0xf1f8, 0x0120, { 10, 10, 9}}, - {m68k_op_btst_8_r_di , 0xf1f8, 0x0128, { 12, 12, 9}}, - {m68k_op_btst_8_r_ix , 0xf1f8, 0x0130, { 14, 14, 11}}, - {m68k_op_bchg_32_r_d , 0xf1f8, 0x0140, { 8, 8, 4}}, - {m68k_op_movep_32_er , 0xf1f8, 0x0148, { 24, 24, 18}}, - {m68k_op_bchg_8_r_ai , 0xf1f8, 0x0150, { 12, 12, 8}}, - {m68k_op_bchg_8_r_pi , 0xf1f8, 0x0158, { 12, 12, 8}}, - {m68k_op_bchg_8_r_pd , 0xf1f8, 0x0160, { 14, 14, 9}}, - {m68k_op_bchg_8_r_di , 0xf1f8, 0x0168, { 16, 16, 9}}, - {m68k_op_bchg_8_r_ix , 0xf1f8, 0x0170, { 18, 18, 11}}, - {m68k_op_bclr_32_r_d , 0xf1f8, 0x0180, { 10, 10, 4}}, - {m68k_op_movep_16_re , 0xf1f8, 0x0188, { 16, 16, 11}}, - {m68k_op_bclr_8_r_ai , 0xf1f8, 0x0190, { 12, 14, 8}}, - {m68k_op_bclr_8_r_pi , 0xf1f8, 0x0198, { 12, 14, 8}}, - {m68k_op_bclr_8_r_pd , 0xf1f8, 0x01a0, { 14, 16, 9}}, - {m68k_op_bclr_8_r_di , 0xf1f8, 0x01a8, { 16, 18, 9}}, - {m68k_op_bclr_8_r_ix , 0xf1f8, 0x01b0, { 18, 20, 11}}, - {m68k_op_bset_32_r_d , 0xf1f8, 0x01c0, { 8, 8, 4}}, - {m68k_op_movep_32_re , 0xf1f8, 0x01c8, { 24, 24, 17}}, - {m68k_op_bset_8_r_ai , 0xf1f8, 0x01d0, { 12, 12, 8}}, - {m68k_op_bset_8_r_pi , 0xf1f8, 0x01d8, { 12, 12, 8}}, - {m68k_op_bset_8_r_pd , 0xf1f8, 0x01e0, { 14, 14, 9}}, - {m68k_op_bset_8_r_di , 0xf1f8, 0x01e8, { 16, 16, 9}}, - {m68k_op_bset_8_r_ix , 0xf1f8, 0x01f0, { 18, 18, 11}}, - {m68k_op_move_8_d_d , 0xf1f8, 0x1000, { 4, 4, 2}}, - {m68k_op_move_8_d_ai , 0xf1f8, 0x1010, { 8, 8, 6}}, - {m68k_op_move_8_d_pi , 0xf1f8, 0x1018, { 8, 8, 6}}, - {m68k_op_move_8_d_pd , 0xf1f8, 0x1020, { 10, 10, 7}}, - {m68k_op_move_8_d_di , 0xf1f8, 0x1028, { 12, 12, 7}}, - {m68k_op_move_8_d_ix , 0xf1f8, 0x1030, { 14, 14, 9}}, - {m68k_op_move_8_ai_d , 0xf1f8, 0x1080, { 8, 8, 4}}, - {m68k_op_move_8_ai_ai , 0xf1f8, 0x1090, { 12, 12, 8}}, - {m68k_op_move_8_ai_pi , 0xf1f8, 0x1098, { 12, 12, 8}}, - {m68k_op_move_8_ai_pd , 0xf1f8, 0x10a0, { 14, 14, 9}}, - {m68k_op_move_8_ai_di , 0xf1f8, 0x10a8, { 16, 16, 9}}, - {m68k_op_move_8_ai_ix , 0xf1f8, 0x10b0, { 18, 18, 11}}, - {m68k_op_move_8_pi_d , 0xf1f8, 0x10c0, { 8, 8, 4}}, - {m68k_op_move_8_pi_ai , 0xf1f8, 0x10d0, { 12, 12, 8}}, - {m68k_op_move_8_pi_pi , 0xf1f8, 0x10d8, { 12, 12, 8}}, - {m68k_op_move_8_pi_pd , 0xf1f8, 0x10e0, { 14, 14, 9}}, - {m68k_op_move_8_pi_di , 0xf1f8, 0x10e8, { 16, 16, 9}}, - {m68k_op_move_8_pi_ix , 0xf1f8, 0x10f0, { 18, 18, 11}}, - {m68k_op_move_8_pd_d , 0xf1f8, 0x1100, { 8, 8, 5}}, - {m68k_op_move_8_pd_ai , 0xf1f8, 0x1110, { 12, 12, 9}}, - {m68k_op_move_8_pd_pi , 0xf1f8, 0x1118, { 12, 12, 9}}, - {m68k_op_move_8_pd_pd , 0xf1f8, 0x1120, { 14, 14, 10}}, - {m68k_op_move_8_pd_di , 0xf1f8, 0x1128, { 16, 16, 10}}, - {m68k_op_move_8_pd_ix , 0xf1f8, 0x1130, { 18, 18, 12}}, - {m68k_op_move_8_di_d , 0xf1f8, 0x1140, { 12, 12, 5}}, - {m68k_op_move_8_di_ai , 0xf1f8, 0x1150, { 16, 16, 9}}, - {m68k_op_move_8_di_pi , 0xf1f8, 0x1158, { 16, 16, 9}}, - {m68k_op_move_8_di_pd , 0xf1f8, 0x1160, { 18, 18, 10}}, - {m68k_op_move_8_di_di , 0xf1f8, 0x1168, { 20, 20, 10}}, - {m68k_op_move_8_di_ix , 0xf1f8, 0x1170, { 22, 22, 12}}, - {m68k_op_move_8_ix_d , 0xf1f8, 0x1180, { 14, 14, 7}}, - {m68k_op_move_8_ix_ai , 0xf1f8, 0x1190, { 18, 18, 11}}, - {m68k_op_move_8_ix_pi , 0xf1f8, 0x1198, { 18, 18, 11}}, - {m68k_op_move_8_ix_pd , 0xf1f8, 0x11a0, { 20, 20, 12}}, - {m68k_op_move_8_ix_di , 0xf1f8, 0x11a8, { 22, 22, 12}}, - {m68k_op_move_8_ix_ix , 0xf1f8, 0x11b0, { 24, 24, 14}}, - {m68k_op_move_32_d_d , 0xf1f8, 0x2000, { 4, 4, 2}}, - {m68k_op_move_32_d_a , 0xf1f8, 0x2008, { 4, 4, 2}}, - {m68k_op_move_32_d_ai , 0xf1f8, 0x2010, { 12, 12, 6}}, - {m68k_op_move_32_d_pi , 0xf1f8, 0x2018, { 12, 12, 6}}, - {m68k_op_move_32_d_pd , 0xf1f8, 0x2020, { 14, 14, 7}}, - {m68k_op_move_32_d_di , 0xf1f8, 0x2028, { 16, 16, 7}}, - {m68k_op_move_32_d_ix , 0xf1f8, 0x2030, { 18, 18, 9}}, - {m68k_op_movea_32_d , 0xf1f8, 0x2040, { 4, 4, 2}}, - {m68k_op_movea_32_a , 0xf1f8, 0x2048, { 4, 4, 2}}, - {m68k_op_movea_32_ai , 0xf1f8, 0x2050, { 12, 12, 6}}, - {m68k_op_movea_32_pi , 0xf1f8, 0x2058, { 12, 12, 6}}, - {m68k_op_movea_32_pd , 0xf1f8, 0x2060, { 14, 14, 7}}, - {m68k_op_movea_32_di , 0xf1f8, 0x2068, { 16, 16, 7}}, - {m68k_op_movea_32_ix , 0xf1f8, 0x2070, { 18, 18, 9}}, - {m68k_op_move_32_ai_d , 0xf1f8, 0x2080, { 12, 12, 4}}, - {m68k_op_move_32_ai_a , 0xf1f8, 0x2088, { 12, 12, 4}}, - {m68k_op_move_32_ai_ai , 0xf1f8, 0x2090, { 20, 20, 8}}, - {m68k_op_move_32_ai_pi , 0xf1f8, 0x2098, { 20, 20, 8}}, - {m68k_op_move_32_ai_pd , 0xf1f8, 0x20a0, { 22, 22, 9}}, - {m68k_op_move_32_ai_di , 0xf1f8, 0x20a8, { 24, 24, 9}}, - {m68k_op_move_32_ai_ix , 0xf1f8, 0x20b0, { 26, 26, 11}}, - {m68k_op_move_32_pi_d , 0xf1f8, 0x20c0, { 12, 12, 4}}, - {m68k_op_move_32_pi_a , 0xf1f8, 0x20c8, { 12, 12, 4}}, - {m68k_op_move_32_pi_ai , 0xf1f8, 0x20d0, { 20, 20, 8}}, - {m68k_op_move_32_pi_pi , 0xf1f8, 0x20d8, { 20, 20, 8}}, - {m68k_op_move_32_pi_pd , 0xf1f8, 0x20e0, { 22, 22, 9}}, - {m68k_op_move_32_pi_di , 0xf1f8, 0x20e8, { 24, 24, 9}}, - {m68k_op_move_32_pi_ix , 0xf1f8, 0x20f0, { 26, 26, 11}}, - {m68k_op_move_32_pd_d , 0xf1f8, 0x2100, { 12, 14, 5}}, - {m68k_op_move_32_pd_a , 0xf1f8, 0x2108, { 12, 14, 5}}, - {m68k_op_move_32_pd_ai , 0xf1f8, 0x2110, { 20, 22, 9}}, - {m68k_op_move_32_pd_pi , 0xf1f8, 0x2118, { 20, 22, 9}}, - {m68k_op_move_32_pd_pd , 0xf1f8, 0x2120, { 22, 24, 10}}, - {m68k_op_move_32_pd_di , 0xf1f8, 0x2128, { 24, 26, 10}}, - {m68k_op_move_32_pd_ix , 0xf1f8, 0x2130, { 26, 28, 12}}, - {m68k_op_move_32_di_d , 0xf1f8, 0x2140, { 16, 16, 5}}, - {m68k_op_move_32_di_a , 0xf1f8, 0x2148, { 16, 16, 5}}, - {m68k_op_move_32_di_ai , 0xf1f8, 0x2150, { 24, 24, 9}}, - {m68k_op_move_32_di_pi , 0xf1f8, 0x2158, { 24, 24, 9}}, - {m68k_op_move_32_di_pd , 0xf1f8, 0x2160, { 26, 26, 10}}, - {m68k_op_move_32_di_di , 0xf1f8, 0x2168, { 28, 28, 10}}, - {m68k_op_move_32_di_ix , 0xf1f8, 0x2170, { 30, 30, 12}}, - {m68k_op_move_32_ix_d , 0xf1f8, 0x2180, { 18, 18, 7}}, - {m68k_op_move_32_ix_a , 0xf1f8, 0x2188, { 18, 18, 7}}, - {m68k_op_move_32_ix_ai , 0xf1f8, 0x2190, { 26, 26, 11}}, - {m68k_op_move_32_ix_pi , 0xf1f8, 0x2198, { 26, 26, 11}}, - {m68k_op_move_32_ix_pd , 0xf1f8, 0x21a0, { 28, 28, 12}}, - {m68k_op_move_32_ix_di , 0xf1f8, 0x21a8, { 30, 30, 12}}, - {m68k_op_move_32_ix_ix , 0xf1f8, 0x21b0, { 32, 32, 14}}, - {m68k_op_move_16_d_d , 0xf1f8, 0x3000, { 4, 4, 2}}, - {m68k_op_move_16_d_a , 0xf1f8, 0x3008, { 4, 4, 2}}, - {m68k_op_move_16_d_ai , 0xf1f8, 0x3010, { 8, 8, 6}}, - {m68k_op_move_16_d_pi , 0xf1f8, 0x3018, { 8, 8, 6}}, - {m68k_op_move_16_d_pd , 0xf1f8, 0x3020, { 10, 10, 7}}, - {m68k_op_move_16_d_di , 0xf1f8, 0x3028, { 12, 12, 7}}, - {m68k_op_move_16_d_ix , 0xf1f8, 0x3030, { 14, 14, 9}}, - {m68k_op_movea_16_d , 0xf1f8, 0x3040, { 4, 4, 2}}, - {m68k_op_movea_16_a , 0xf1f8, 0x3048, { 4, 4, 2}}, - {m68k_op_movea_16_ai , 0xf1f8, 0x3050, { 8, 8, 6}}, - {m68k_op_movea_16_pi , 0xf1f8, 0x3058, { 8, 8, 6}}, - {m68k_op_movea_16_pd , 0xf1f8, 0x3060, { 10, 10, 7}}, - {m68k_op_movea_16_di , 0xf1f8, 0x3068, { 12, 12, 7}}, - {m68k_op_movea_16_ix , 0xf1f8, 0x3070, { 14, 14, 9}}, - {m68k_op_move_16_ai_d , 0xf1f8, 0x3080, { 8, 8, 4}}, - {m68k_op_move_16_ai_a , 0xf1f8, 0x3088, { 8, 8, 4}}, - {m68k_op_move_16_ai_ai , 0xf1f8, 0x3090, { 12, 12, 8}}, - {m68k_op_move_16_ai_pi , 0xf1f8, 0x3098, { 12, 12, 8}}, - {m68k_op_move_16_ai_pd , 0xf1f8, 0x30a0, { 14, 14, 9}}, - {m68k_op_move_16_ai_di , 0xf1f8, 0x30a8, { 16, 16, 9}}, - {m68k_op_move_16_ai_ix , 0xf1f8, 0x30b0, { 18, 18, 11}}, - {m68k_op_move_16_pi_d , 0xf1f8, 0x30c0, { 8, 8, 4}}, - {m68k_op_move_16_pi_a , 0xf1f8, 0x30c8, { 8, 8, 4}}, - {m68k_op_move_16_pi_ai , 0xf1f8, 0x30d0, { 12, 12, 8}}, - {m68k_op_move_16_pi_pi , 0xf1f8, 0x30d8, { 12, 12, 8}}, - {m68k_op_move_16_pi_pd , 0xf1f8, 0x30e0, { 14, 14, 9}}, - {m68k_op_move_16_pi_di , 0xf1f8, 0x30e8, { 16, 16, 9}}, - {m68k_op_move_16_pi_ix , 0xf1f8, 0x30f0, { 18, 18, 11}}, - {m68k_op_move_16_pd_d , 0xf1f8, 0x3100, { 8, 8, 5}}, - {m68k_op_move_16_pd_a , 0xf1f8, 0x3108, { 8, 8, 5}}, - {m68k_op_move_16_pd_ai , 0xf1f8, 0x3110, { 12, 12, 9}}, - {m68k_op_move_16_pd_pi , 0xf1f8, 0x3118, { 12, 12, 9}}, - {m68k_op_move_16_pd_pd , 0xf1f8, 0x3120, { 14, 14, 10}}, - {m68k_op_move_16_pd_di , 0xf1f8, 0x3128, { 16, 16, 10}}, - {m68k_op_move_16_pd_ix , 0xf1f8, 0x3130, { 18, 18, 12}}, - {m68k_op_move_16_di_d , 0xf1f8, 0x3140, { 12, 12, 5}}, - {m68k_op_move_16_di_a , 0xf1f8, 0x3148, { 12, 12, 5}}, - {m68k_op_move_16_di_ai , 0xf1f8, 0x3150, { 16, 16, 9}}, - {m68k_op_move_16_di_pi , 0xf1f8, 0x3158, { 16, 16, 9}}, - {m68k_op_move_16_di_pd , 0xf1f8, 0x3160, { 18, 18, 10}}, - {m68k_op_move_16_di_di , 0xf1f8, 0x3168, { 20, 20, 10}}, - {m68k_op_move_16_di_ix , 0xf1f8, 0x3170, { 22, 22, 12}}, - {m68k_op_move_16_ix_d , 0xf1f8, 0x3180, { 14, 14, 7}}, - {m68k_op_move_16_ix_a , 0xf1f8, 0x3188, { 14, 14, 7}}, - {m68k_op_move_16_ix_ai , 0xf1f8, 0x3190, { 18, 18, 11}}, - {m68k_op_move_16_ix_pi , 0xf1f8, 0x3198, { 18, 18, 11}}, - {m68k_op_move_16_ix_pd , 0xf1f8, 0x31a0, { 20, 20, 12}}, - {m68k_op_move_16_ix_di , 0xf1f8, 0x31a8, { 22, 22, 12}}, - {m68k_op_move_16_ix_ix , 0xf1f8, 0x31b0, { 24, 24, 14}}, - {m68k_op_chk_32_d , 0xf1f8, 0x4100, { 0, 0, 8}}, - {m68k_op_chk_32_ai , 0xf1f8, 0x4110, { 0, 0, 12}}, - {m68k_op_chk_32_pi , 0xf1f8, 0x4118, { 0, 0, 12}}, - {m68k_op_chk_32_pd , 0xf1f8, 0x4120, { 0, 0, 13}}, - {m68k_op_chk_32_di , 0xf1f8, 0x4128, { 0, 0, 13}}, - {m68k_op_chk_32_ix , 0xf1f8, 0x4130, { 0, 0, 15}}, - {m68k_op_chk_16_d , 0xf1f8, 0x4180, { 10, 8, 8}}, - {m68k_op_chk_16_ai , 0xf1f8, 0x4190, { 14, 12, 12}}, - {m68k_op_chk_16_pi , 0xf1f8, 0x4198, { 14, 12, 12}}, - {m68k_op_chk_16_pd , 0xf1f8, 0x41a0, { 16, 14, 13}}, - {m68k_op_chk_16_di , 0xf1f8, 0x41a8, { 18, 16, 13}}, - {m68k_op_chk_16_ix , 0xf1f8, 0x41b0, { 20, 18, 15}}, - {m68k_op_lea_32_ai , 0xf1f8, 0x41d0, { 4, 4, 6}}, - {m68k_op_lea_32_di , 0xf1f8, 0x41e8, { 8, 8, 7}}, - {m68k_op_lea_32_ix , 0xf1f8, 0x41f0, { 12, 12, 9}}, - {m68k_op_addq_8_d , 0xf1f8, 0x5000, { 4, 4, 2}}, - {m68k_op_addq_8_ai , 0xf1f8, 0x5010, { 12, 12, 8}}, - {m68k_op_addq_8_pi , 0xf1f8, 0x5018, { 12, 12, 8}}, - {m68k_op_addq_8_pd , 0xf1f8, 0x5020, { 14, 14, 9}}, - {m68k_op_addq_8_di , 0xf1f8, 0x5028, { 16, 16, 9}}, - {m68k_op_addq_8_ix , 0xf1f8, 0x5030, { 18, 18, 11}}, - {m68k_op_addq_16_d , 0xf1f8, 0x5040, { 4, 4, 2}}, - {m68k_op_addq_16_a , 0xf1f8, 0x5048, { 4, 4, 2}}, - {m68k_op_addq_16_ai , 0xf1f8, 0x5050, { 12, 12, 8}}, - {m68k_op_addq_16_pi , 0xf1f8, 0x5058, { 12, 12, 8}}, - {m68k_op_addq_16_pd , 0xf1f8, 0x5060, { 14, 14, 9}}, - {m68k_op_addq_16_di , 0xf1f8, 0x5068, { 16, 16, 9}}, - {m68k_op_addq_16_ix , 0xf1f8, 0x5070, { 18, 18, 11}}, - {m68k_op_addq_32_d , 0xf1f8, 0x5080, { 8, 8, 2}}, - {m68k_op_addq_32_a , 0xf1f8, 0x5088, { 8, 8, 2}}, - {m68k_op_addq_32_ai , 0xf1f8, 0x5090, { 20, 20, 8}}, - {m68k_op_addq_32_pi , 0xf1f8, 0x5098, { 20, 20, 8}}, - {m68k_op_addq_32_pd , 0xf1f8, 0x50a0, { 22, 22, 9}}, - {m68k_op_addq_32_di , 0xf1f8, 0x50a8, { 24, 24, 9}}, - {m68k_op_addq_32_ix , 0xf1f8, 0x50b0, { 26, 26, 11}}, - {m68k_op_subq_8_d , 0xf1f8, 0x5100, { 4, 4, 2}}, - {m68k_op_subq_8_ai , 0xf1f8, 0x5110, { 12, 12, 8}}, - {m68k_op_subq_8_pi , 0xf1f8, 0x5118, { 12, 12, 8}}, - {m68k_op_subq_8_pd , 0xf1f8, 0x5120, { 14, 14, 9}}, - {m68k_op_subq_8_di , 0xf1f8, 0x5128, { 16, 16, 9}}, - {m68k_op_subq_8_ix , 0xf1f8, 0x5130, { 18, 18, 11}}, - {m68k_op_subq_16_d , 0xf1f8, 0x5140, { 4, 4, 2}}, - {m68k_op_subq_16_a , 0xf1f8, 0x5148, { 8, 4, 2}}, - {m68k_op_subq_16_ai , 0xf1f8, 0x5150, { 12, 12, 8}}, - {m68k_op_subq_16_pi , 0xf1f8, 0x5158, { 12, 12, 8}}, - {m68k_op_subq_16_pd , 0xf1f8, 0x5160, { 14, 14, 9}}, - {m68k_op_subq_16_di , 0xf1f8, 0x5168, { 16, 16, 9}}, - {m68k_op_subq_16_ix , 0xf1f8, 0x5170, { 18, 18, 11}}, - {m68k_op_subq_32_d , 0xf1f8, 0x5180, { 8, 8, 2}}, - {m68k_op_subq_32_a , 0xf1f8, 0x5188, { 8, 8, 2}}, - {m68k_op_subq_32_ai , 0xf1f8, 0x5190, { 20, 20, 8}}, - {m68k_op_subq_32_pi , 0xf1f8, 0x5198, { 20, 20, 8}}, - {m68k_op_subq_32_pd , 0xf1f8, 0x51a0, { 22, 22, 9}}, - {m68k_op_subq_32_di , 0xf1f8, 0x51a8, { 24, 24, 9}}, - {m68k_op_subq_32_ix , 0xf1f8, 0x51b0, { 26, 26, 11}}, - {m68k_op_or_8_er_d , 0xf1f8, 0x8000, { 4, 4, 2}}, - {m68k_op_or_8_er_ai , 0xf1f8, 0x8010, { 8, 8, 6}}, - {m68k_op_or_8_er_pi , 0xf1f8, 0x8018, { 8, 8, 6}}, - {m68k_op_or_8_er_pd , 0xf1f8, 0x8020, { 10, 10, 7}}, - {m68k_op_or_8_er_di , 0xf1f8, 0x8028, { 12, 12, 7}}, - {m68k_op_or_8_er_ix , 0xf1f8, 0x8030, { 14, 14, 9}}, - {m68k_op_or_16_er_d , 0xf1f8, 0x8040, { 4, 4, 2}}, - {m68k_op_or_16_er_ai , 0xf1f8, 0x8050, { 8, 8, 6}}, - {m68k_op_or_16_er_pi , 0xf1f8, 0x8058, { 8, 8, 6}}, - {m68k_op_or_16_er_pd , 0xf1f8, 0x8060, { 10, 10, 7}}, - {m68k_op_or_16_er_di , 0xf1f8, 0x8068, { 12, 12, 7}}, - {m68k_op_or_16_er_ix , 0xf1f8, 0x8070, { 14, 14, 9}}, - {m68k_op_or_32_er_d , 0xf1f8, 0x8080, { 6, 6, 2}}, - {m68k_op_or_32_er_ai , 0xf1f8, 0x8090, { 14, 14, 6}}, - {m68k_op_or_32_er_pi , 0xf1f8, 0x8098, { 14, 14, 6}}, - {m68k_op_or_32_er_pd , 0xf1f8, 0x80a0, { 16, 16, 7}}, - {m68k_op_or_32_er_di , 0xf1f8, 0x80a8, { 18, 18, 7}}, - {m68k_op_or_32_er_ix , 0xf1f8, 0x80b0, { 20, 20, 9}}, - {m68k_op_divu_16_d , 0xf1f8, 0x80c0, {140, 108, 44}}, - {m68k_op_divu_16_ai , 0xf1f8, 0x80d0, {144, 112, 48}}, - {m68k_op_divu_16_pi , 0xf1f8, 0x80d8, {144, 112, 48}}, - {m68k_op_divu_16_pd , 0xf1f8, 0x80e0, {146, 114, 49}}, - {m68k_op_divu_16_di , 0xf1f8, 0x80e8, {148, 116, 49}}, - {m68k_op_divu_16_ix , 0xf1f8, 0x80f0, {150, 118, 51}}, - {m68k_op_sbcd_8_rr , 0xf1f8, 0x8100, { 6, 6, 4}}, - {m68k_op_sbcd_8_mm , 0xf1f8, 0x8108, { 18, 18, 16}}, - {m68k_op_or_8_re_ai , 0xf1f8, 0x8110, { 12, 12, 8}}, - {m68k_op_or_8_re_pi , 0xf1f8, 0x8118, { 12, 12, 8}}, - {m68k_op_or_8_re_pd , 0xf1f8, 0x8120, { 14, 14, 9}}, - {m68k_op_or_8_re_di , 0xf1f8, 0x8128, { 16, 16, 9}}, - {m68k_op_or_8_re_ix , 0xf1f8, 0x8130, { 18, 18, 11}}, - {m68k_op_pack_16_rr , 0xf1f8, 0x8140, { 0, 0, 6}}, - {m68k_op_pack_16_mm , 0xf1f8, 0x8148, { 0, 0, 13}}, - {m68k_op_or_16_re_ai , 0xf1f8, 0x8150, { 12, 12, 8}}, - {m68k_op_or_16_re_pi , 0xf1f8, 0x8158, { 12, 12, 8}}, - {m68k_op_or_16_re_pd , 0xf1f8, 0x8160, { 14, 14, 9}}, - {m68k_op_or_16_re_di , 0xf1f8, 0x8168, { 16, 16, 9}}, - {m68k_op_or_16_re_ix , 0xf1f8, 0x8170, { 18, 18, 11}}, - {m68k_op_unpk_16_rr , 0xf1f8, 0x8180, { 0, 0, 8}}, - {m68k_op_unpk_16_mm , 0xf1f8, 0x8188, { 0, 0, 13}}, - {m68k_op_or_32_re_ai , 0xf1f8, 0x8190, { 20, 20, 8}}, - {m68k_op_or_32_re_pi , 0xf1f8, 0x8198, { 20, 20, 8}}, - {m68k_op_or_32_re_pd , 0xf1f8, 0x81a0, { 22, 22, 9}}, - {m68k_op_or_32_re_di , 0xf1f8, 0x81a8, { 24, 24, 9}}, - {m68k_op_or_32_re_ix , 0xf1f8, 0x81b0, { 26, 26, 11}}, - {m68k_op_divs_16_d , 0xf1f8, 0x81c0, {158, 122, 56}}, - {m68k_op_divs_16_ai , 0xf1f8, 0x81d0, {162, 126, 60}}, - {m68k_op_divs_16_pi , 0xf1f8, 0x81d8, {162, 126, 60}}, - {m68k_op_divs_16_pd , 0xf1f8, 0x81e0, {164, 128, 61}}, - {m68k_op_divs_16_di , 0xf1f8, 0x81e8, {166, 130, 61}}, - {m68k_op_divs_16_ix , 0xf1f8, 0x81f0, {168, 132, 63}}, - {m68k_op_sub_8_er_d , 0xf1f8, 0x9000, { 4, 4, 2}}, - {m68k_op_sub_8_er_ai , 0xf1f8, 0x9010, { 8, 8, 6}}, - {m68k_op_sub_8_er_pi , 0xf1f8, 0x9018, { 8, 8, 6}}, - {m68k_op_sub_8_er_pd , 0xf1f8, 0x9020, { 10, 10, 7}}, - {m68k_op_sub_8_er_di , 0xf1f8, 0x9028, { 12, 12, 7}}, - {m68k_op_sub_8_er_ix , 0xf1f8, 0x9030, { 14, 14, 9}}, - {m68k_op_sub_16_er_d , 0xf1f8, 0x9040, { 4, 4, 2}}, - {m68k_op_sub_16_er_a , 0xf1f8, 0x9048, { 4, 4, 2}}, - {m68k_op_sub_16_er_ai , 0xf1f8, 0x9050, { 8, 8, 6}}, - {m68k_op_sub_16_er_pi , 0xf1f8, 0x9058, { 8, 8, 6}}, - {m68k_op_sub_16_er_pd , 0xf1f8, 0x9060, { 10, 10, 7}}, - {m68k_op_sub_16_er_di , 0xf1f8, 0x9068, { 12, 12, 7}}, - {m68k_op_sub_16_er_ix , 0xf1f8, 0x9070, { 14, 14, 9}}, - {m68k_op_sub_32_er_d , 0xf1f8, 0x9080, { 6, 6, 2}}, - {m68k_op_sub_32_er_a , 0xf1f8, 0x9088, { 6, 6, 2}}, - {m68k_op_sub_32_er_ai , 0xf1f8, 0x9090, { 14, 14, 6}}, - {m68k_op_sub_32_er_pi , 0xf1f8, 0x9098, { 14, 14, 6}}, - {m68k_op_sub_32_er_pd , 0xf1f8, 0x90a0, { 16, 16, 7}}, - {m68k_op_sub_32_er_di , 0xf1f8, 0x90a8, { 18, 18, 7}}, - {m68k_op_sub_32_er_ix , 0xf1f8, 0x90b0, { 20, 20, 9}}, - {m68k_op_suba_16_d , 0xf1f8, 0x90c0, { 8, 8, 2}}, - {m68k_op_suba_16_a , 0xf1f8, 0x90c8, { 8, 8, 2}}, - {m68k_op_suba_16_ai , 0xf1f8, 0x90d0, { 12, 12, 6}}, - {m68k_op_suba_16_pi , 0xf1f8, 0x90d8, { 12, 12, 6}}, - {m68k_op_suba_16_pd , 0xf1f8, 0x90e0, { 14, 14, 7}}, - {m68k_op_suba_16_di , 0xf1f8, 0x90e8, { 16, 16, 7}}, - {m68k_op_suba_16_ix , 0xf1f8, 0x90f0, { 18, 18, 9}}, - {m68k_op_subx_8_rr , 0xf1f8, 0x9100, { 4, 4, 2}}, - {m68k_op_subx_8_mm , 0xf1f8, 0x9108, { 18, 18, 12}}, - {m68k_op_sub_8_re_ai , 0xf1f8, 0x9110, { 12, 12, 8}}, - {m68k_op_sub_8_re_pi , 0xf1f8, 0x9118, { 12, 12, 8}}, - {m68k_op_sub_8_re_pd , 0xf1f8, 0x9120, { 14, 14, 9}}, - {m68k_op_sub_8_re_di , 0xf1f8, 0x9128, { 16, 16, 9}}, - {m68k_op_sub_8_re_ix , 0xf1f8, 0x9130, { 18, 18, 11}}, - {m68k_op_subx_16_rr , 0xf1f8, 0x9140, { 4, 4, 2}}, - {m68k_op_subx_16_mm , 0xf1f8, 0x9148, { 18, 18, 12}}, - {m68k_op_sub_16_re_ai , 0xf1f8, 0x9150, { 12, 12, 8}}, - {m68k_op_sub_16_re_pi , 0xf1f8, 0x9158, { 12, 12, 8}}, - {m68k_op_sub_16_re_pd , 0xf1f8, 0x9160, { 14, 14, 9}}, - {m68k_op_sub_16_re_di , 0xf1f8, 0x9168, { 16, 16, 9}}, - {m68k_op_sub_16_re_ix , 0xf1f8, 0x9170, { 18, 18, 11}}, - {m68k_op_subx_32_rr , 0xf1f8, 0x9180, { 8, 6, 2}}, - {m68k_op_subx_32_mm , 0xf1f8, 0x9188, { 30, 30, 12}}, - {m68k_op_sub_32_re_ai , 0xf1f8, 0x9190, { 20, 20, 8}}, - {m68k_op_sub_32_re_pi , 0xf1f8, 0x9198, { 20, 20, 8}}, - {m68k_op_sub_32_re_pd , 0xf1f8, 0x91a0, { 22, 22, 9}}, - {m68k_op_sub_32_re_di , 0xf1f8, 0x91a8, { 24, 24, 9}}, - {m68k_op_sub_32_re_ix , 0xf1f8, 0x91b0, { 26, 26, 11}}, - {m68k_op_suba_32_d , 0xf1f8, 0x91c0, { 6, 6, 2}}, - {m68k_op_suba_32_a , 0xf1f8, 0x91c8, { 6, 6, 2}}, - {m68k_op_suba_32_ai , 0xf1f8, 0x91d0, { 14, 14, 6}}, - {m68k_op_suba_32_pi , 0xf1f8, 0x91d8, { 14, 14, 6}}, - {m68k_op_suba_32_pd , 0xf1f8, 0x91e0, { 16, 16, 7}}, - {m68k_op_suba_32_di , 0xf1f8, 0x91e8, { 18, 18, 7}}, - {m68k_op_suba_32_ix , 0xf1f8, 0x91f0, { 20, 20, 9}}, - {m68k_op_cmp_8_d , 0xf1f8, 0xb000, { 4, 4, 2}}, - {m68k_op_cmp_8_ai , 0xf1f8, 0xb010, { 8, 8, 6}}, - {m68k_op_cmp_8_pi , 0xf1f8, 0xb018, { 8, 8, 6}}, - {m68k_op_cmp_8_pd , 0xf1f8, 0xb020, { 10, 10, 7}}, - {m68k_op_cmp_8_di , 0xf1f8, 0xb028, { 12, 12, 7}}, - {m68k_op_cmp_8_ix , 0xf1f8, 0xb030, { 14, 14, 9}}, - {m68k_op_cmp_16_d , 0xf1f8, 0xb040, { 4, 4, 2}}, - {m68k_op_cmp_16_a , 0xf1f8, 0xb048, { 4, 4, 2}}, - {m68k_op_cmp_16_ai , 0xf1f8, 0xb050, { 8, 8, 6}}, - {m68k_op_cmp_16_pi , 0xf1f8, 0xb058, { 8, 8, 6}}, - {m68k_op_cmp_16_pd , 0xf1f8, 0xb060, { 10, 10, 7}}, - {m68k_op_cmp_16_di , 0xf1f8, 0xb068, { 12, 12, 7}}, - {m68k_op_cmp_16_ix , 0xf1f8, 0xb070, { 14, 14, 9}}, - {m68k_op_cmp_32_d , 0xf1f8, 0xb080, { 6, 6, 2}}, - {m68k_op_cmp_32_a , 0xf1f8, 0xb088, { 6, 6, 2}}, - {m68k_op_cmp_32_ai , 0xf1f8, 0xb090, { 14, 14, 6}}, - {m68k_op_cmp_32_pi , 0xf1f8, 0xb098, { 14, 14, 6}}, - {m68k_op_cmp_32_pd , 0xf1f8, 0xb0a0, { 16, 16, 7}}, - {m68k_op_cmp_32_di , 0xf1f8, 0xb0a8, { 18, 18, 7}}, - {m68k_op_cmp_32_ix , 0xf1f8, 0xb0b0, { 20, 20, 9}}, - {m68k_op_cmpa_16_d , 0xf1f8, 0xb0c0, { 6, 6, 4}}, - {m68k_op_cmpa_16_a , 0xf1f8, 0xb0c8, { 6, 6, 4}}, - {m68k_op_cmpa_16_ai , 0xf1f8, 0xb0d0, { 10, 10, 8}}, - {m68k_op_cmpa_16_pi , 0xf1f8, 0xb0d8, { 10, 10, 8}}, - {m68k_op_cmpa_16_pd , 0xf1f8, 0xb0e0, { 12, 12, 9}}, - {m68k_op_cmpa_16_di , 0xf1f8, 0xb0e8, { 14, 14, 9}}, - {m68k_op_cmpa_16_ix , 0xf1f8, 0xb0f0, { 16, 16, 11}}, - {m68k_op_eor_8_d , 0xf1f8, 0xb100, { 4, 4, 2}}, - {m68k_op_cmpm_8 , 0xf1f8, 0xb108, { 12, 12, 9}}, - {m68k_op_eor_8_ai , 0xf1f8, 0xb110, { 12, 12, 8}}, - {m68k_op_eor_8_pi , 0xf1f8, 0xb118, { 12, 12, 8}}, - {m68k_op_eor_8_pd , 0xf1f8, 0xb120, { 14, 14, 9}}, - {m68k_op_eor_8_di , 0xf1f8, 0xb128, { 16, 16, 9}}, - {m68k_op_eor_8_ix , 0xf1f8, 0xb130, { 18, 18, 11}}, - {m68k_op_eor_16_d , 0xf1f8, 0xb140, { 4, 4, 2}}, - {m68k_op_cmpm_16 , 0xf1f8, 0xb148, { 12, 12, 9}}, - {m68k_op_eor_16_ai , 0xf1f8, 0xb150, { 12, 12, 8}}, - {m68k_op_eor_16_pi , 0xf1f8, 0xb158, { 12, 12, 8}}, - {m68k_op_eor_16_pd , 0xf1f8, 0xb160, { 14, 14, 9}}, - {m68k_op_eor_16_di , 0xf1f8, 0xb168, { 16, 16, 9}}, - {m68k_op_eor_16_ix , 0xf1f8, 0xb170, { 18, 18, 11}}, - {m68k_op_eor_32_d , 0xf1f8, 0xb180, { 8, 6, 2}}, - {m68k_op_cmpm_32 , 0xf1f8, 0xb188, { 20, 20, 9}}, - {m68k_op_eor_32_ai , 0xf1f8, 0xb190, { 20, 20, 8}}, - {m68k_op_eor_32_pi , 0xf1f8, 0xb198, { 20, 20, 8}}, - {m68k_op_eor_32_pd , 0xf1f8, 0xb1a0, { 22, 22, 9}}, - {m68k_op_eor_32_di , 0xf1f8, 0xb1a8, { 24, 24, 9}}, - {m68k_op_eor_32_ix , 0xf1f8, 0xb1b0, { 26, 26, 11}}, - {m68k_op_cmpa_32_d , 0xf1f8, 0xb1c0, { 6, 6, 4}}, - {m68k_op_cmpa_32_a , 0xf1f8, 0xb1c8, { 6, 6, 4}}, - {m68k_op_cmpa_32_ai , 0xf1f8, 0xb1d0, { 14, 14, 8}}, - {m68k_op_cmpa_32_pi , 0xf1f8, 0xb1d8, { 14, 14, 8}}, - {m68k_op_cmpa_32_pd , 0xf1f8, 0xb1e0, { 16, 16, 9}}, - {m68k_op_cmpa_32_di , 0xf1f8, 0xb1e8, { 18, 18, 9}}, - {m68k_op_cmpa_32_ix , 0xf1f8, 0xb1f0, { 20, 20, 11}}, - {m68k_op_and_8_er_d , 0xf1f8, 0xc000, { 4, 4, 2}}, - {m68k_op_and_8_er_ai , 0xf1f8, 0xc010, { 8, 8, 6}}, - {m68k_op_and_8_er_pi , 0xf1f8, 0xc018, { 8, 8, 6}}, - {m68k_op_and_8_er_pd , 0xf1f8, 0xc020, { 10, 10, 7}}, - {m68k_op_and_8_er_di , 0xf1f8, 0xc028, { 12, 12, 7}}, - {m68k_op_and_8_er_ix , 0xf1f8, 0xc030, { 14, 14, 9}}, - {m68k_op_and_16_er_d , 0xf1f8, 0xc040, { 4, 4, 2}}, - {m68k_op_and_16_er_ai , 0xf1f8, 0xc050, { 8, 8, 6}}, - {m68k_op_and_16_er_pi , 0xf1f8, 0xc058, { 8, 8, 6}}, - {m68k_op_and_16_er_pd , 0xf1f8, 0xc060, { 10, 10, 7}}, - {m68k_op_and_16_er_di , 0xf1f8, 0xc068, { 12, 12, 7}}, - {m68k_op_and_16_er_ix , 0xf1f8, 0xc070, { 14, 14, 9}}, - {m68k_op_and_32_er_d , 0xf1f8, 0xc080, { 6, 6, 2}}, - {m68k_op_and_32_er_ai , 0xf1f8, 0xc090, { 14, 14, 6}}, - {m68k_op_and_32_er_pi , 0xf1f8, 0xc098, { 14, 14, 6}}, - {m68k_op_and_32_er_pd , 0xf1f8, 0xc0a0, { 16, 16, 7}}, - {m68k_op_and_32_er_di , 0xf1f8, 0xc0a8, { 18, 18, 7}}, - {m68k_op_and_32_er_ix , 0xf1f8, 0xc0b0, { 20, 20, 9}}, - {m68k_op_mulu_16_d , 0xf1f8, 0xc0c0, { 54, 30, 27}}, - {m68k_op_mulu_16_ai , 0xf1f8, 0xc0d0, { 58, 34, 31}}, - {m68k_op_mulu_16_pi , 0xf1f8, 0xc0d8, { 58, 34, 31}}, - {m68k_op_mulu_16_pd , 0xf1f8, 0xc0e0, { 60, 36, 32}}, - {m68k_op_mulu_16_di , 0xf1f8, 0xc0e8, { 62, 38, 32}}, - {m68k_op_mulu_16_ix , 0xf1f8, 0xc0f0, { 64, 40, 34}}, - {m68k_op_abcd_8_rr , 0xf1f8, 0xc100, { 6, 6, 4}}, - {m68k_op_abcd_8_mm , 0xf1f8, 0xc108, { 18, 18, 16}}, - {m68k_op_and_8_re_ai , 0xf1f8, 0xc110, { 12, 12, 8}}, - {m68k_op_and_8_re_pi , 0xf1f8, 0xc118, { 12, 12, 8}}, - {m68k_op_and_8_re_pd , 0xf1f8, 0xc120, { 14, 14, 9}}, - {m68k_op_and_8_re_di , 0xf1f8, 0xc128, { 16, 16, 9}}, - {m68k_op_and_8_re_ix , 0xf1f8, 0xc130, { 18, 18, 11}}, - {m68k_op_exg_32_dd , 0xf1f8, 0xc140, { 6, 6, 2}}, - {m68k_op_exg_32_aa , 0xf1f8, 0xc148, { 6, 6, 2}}, - {m68k_op_and_16_re_ai , 0xf1f8, 0xc150, { 12, 12, 8}}, - {m68k_op_and_16_re_pi , 0xf1f8, 0xc158, { 12, 12, 8}}, - {m68k_op_and_16_re_pd , 0xf1f8, 0xc160, { 14, 14, 9}}, - {m68k_op_and_16_re_di , 0xf1f8, 0xc168, { 16, 16, 9}}, - {m68k_op_and_16_re_ix , 0xf1f8, 0xc170, { 18, 18, 11}}, - {m68k_op_exg_32_da , 0xf1f8, 0xc188, { 6, 6, 2}}, - {m68k_op_and_32_re_ai , 0xf1f8, 0xc190, { 20, 20, 8}}, - {m68k_op_and_32_re_pi , 0xf1f8, 0xc198, { 20, 20, 8}}, - {m68k_op_and_32_re_pd , 0xf1f8, 0xc1a0, { 22, 22, 9}}, - {m68k_op_and_32_re_di , 0xf1f8, 0xc1a8, { 24, 24, 9}}, - {m68k_op_and_32_re_ix , 0xf1f8, 0xc1b0, { 26, 26, 11}}, - {m68k_op_muls_16_d , 0xf1f8, 0xc1c0, { 54, 32, 27}}, - {m68k_op_muls_16_ai , 0xf1f8, 0xc1d0, { 58, 36, 31}}, - {m68k_op_muls_16_pi , 0xf1f8, 0xc1d8, { 58, 36, 31}}, - {m68k_op_muls_16_pd , 0xf1f8, 0xc1e0, { 60, 38, 32}}, - {m68k_op_muls_16_di , 0xf1f8, 0xc1e8, { 62, 40, 32}}, - {m68k_op_muls_16_ix , 0xf1f8, 0xc1f0, { 64, 42, 34}}, - {m68k_op_add_8_er_d , 0xf1f8, 0xd000, { 4, 4, 2}}, - {m68k_op_add_8_er_ai , 0xf1f8, 0xd010, { 8, 8, 6}}, - {m68k_op_add_8_er_pi , 0xf1f8, 0xd018, { 8, 8, 6}}, - {m68k_op_add_8_er_pd , 0xf1f8, 0xd020, { 10, 10, 7}}, - {m68k_op_add_8_er_di , 0xf1f8, 0xd028, { 12, 12, 7}}, - {m68k_op_add_8_er_ix , 0xf1f8, 0xd030, { 14, 14, 9}}, - {m68k_op_add_16_er_d , 0xf1f8, 0xd040, { 4, 4, 2}}, - {m68k_op_add_16_er_a , 0xf1f8, 0xd048, { 4, 4, 2}}, - {m68k_op_add_16_er_ai , 0xf1f8, 0xd050, { 8, 8, 6}}, - {m68k_op_add_16_er_pi , 0xf1f8, 0xd058, { 8, 8, 6}}, - {m68k_op_add_16_er_pd , 0xf1f8, 0xd060, { 10, 10, 7}}, - {m68k_op_add_16_er_di , 0xf1f8, 0xd068, { 12, 12, 7}}, - {m68k_op_add_16_er_ix , 0xf1f8, 0xd070, { 14, 14, 9}}, - {m68k_op_add_32_er_d , 0xf1f8, 0xd080, { 6, 6, 2}}, - {m68k_op_add_32_er_a , 0xf1f8, 0xd088, { 6, 6, 2}}, - {m68k_op_add_32_er_ai , 0xf1f8, 0xd090, { 14, 14, 6}}, - {m68k_op_add_32_er_pi , 0xf1f8, 0xd098, { 14, 14, 6}}, - {m68k_op_add_32_er_pd , 0xf1f8, 0xd0a0, { 16, 16, 7}}, - {m68k_op_add_32_er_di , 0xf1f8, 0xd0a8, { 18, 18, 7}}, - {m68k_op_add_32_er_ix , 0xf1f8, 0xd0b0, { 20, 20, 9}}, - {m68k_op_adda_16_d , 0xf1f8, 0xd0c0, { 8, 8, 2}}, - {m68k_op_adda_16_a , 0xf1f8, 0xd0c8, { 8, 8, 2}}, - {m68k_op_adda_16_ai , 0xf1f8, 0xd0d0, { 12, 12, 6}}, - {m68k_op_adda_16_pi , 0xf1f8, 0xd0d8, { 12, 12, 6}}, - {m68k_op_adda_16_pd , 0xf1f8, 0xd0e0, { 14, 14, 7}}, - {m68k_op_adda_16_di , 0xf1f8, 0xd0e8, { 16, 16, 7}}, - {m68k_op_adda_16_ix , 0xf1f8, 0xd0f0, { 18, 18, 9}}, - {m68k_op_addx_8_rr , 0xf1f8, 0xd100, { 4, 4, 2}}, - {m68k_op_addx_8_mm , 0xf1f8, 0xd108, { 18, 18, 12}}, - {m68k_op_add_8_re_ai , 0xf1f8, 0xd110, { 12, 12, 8}}, - {m68k_op_add_8_re_pi , 0xf1f8, 0xd118, { 12, 12, 8}}, - {m68k_op_add_8_re_pd , 0xf1f8, 0xd120, { 14, 14, 9}}, - {m68k_op_add_8_re_di , 0xf1f8, 0xd128, { 16, 16, 9}}, - {m68k_op_add_8_re_ix , 0xf1f8, 0xd130, { 18, 18, 11}}, - {m68k_op_addx_16_rr , 0xf1f8, 0xd140, { 4, 4, 2}}, - {m68k_op_addx_16_mm , 0xf1f8, 0xd148, { 18, 18, 12}}, - {m68k_op_add_16_re_ai , 0xf1f8, 0xd150, { 12, 12, 8}}, - {m68k_op_add_16_re_pi , 0xf1f8, 0xd158, { 12, 12, 8}}, - {m68k_op_add_16_re_pd , 0xf1f8, 0xd160, { 14, 14, 9}}, - {m68k_op_add_16_re_di , 0xf1f8, 0xd168, { 16, 16, 9}}, - {m68k_op_add_16_re_ix , 0xf1f8, 0xd170, { 18, 18, 11}}, - {m68k_op_addx_32_rr , 0xf1f8, 0xd180, { 8, 6, 2}}, - {m68k_op_addx_32_mm , 0xf1f8, 0xd188, { 30, 30, 12}}, - {m68k_op_add_32_re_ai , 0xf1f8, 0xd190, { 20, 20, 8}}, - {m68k_op_add_32_re_pi , 0xf1f8, 0xd198, { 20, 20, 8}}, - {m68k_op_add_32_re_pd , 0xf1f8, 0xd1a0, { 22, 22, 9}}, - {m68k_op_add_32_re_di , 0xf1f8, 0xd1a8, { 24, 24, 9}}, - {m68k_op_add_32_re_ix , 0xf1f8, 0xd1b0, { 26, 26, 11}}, - {m68k_op_adda_32_d , 0xf1f8, 0xd1c0, { 6, 6, 2}}, - {m68k_op_adda_32_a , 0xf1f8, 0xd1c8, { 6, 6, 2}}, - {m68k_op_adda_32_ai , 0xf1f8, 0xd1d0, { 14, 14, 6}}, - {m68k_op_adda_32_pi , 0xf1f8, 0xd1d8, { 14, 14, 6}}, - {m68k_op_adda_32_pd , 0xf1f8, 0xd1e0, { 16, 16, 7}}, - {m68k_op_adda_32_di , 0xf1f8, 0xd1e8, { 18, 18, 7}}, - {m68k_op_adda_32_ix , 0xf1f8, 0xd1f0, { 20, 20, 9}}, - {m68k_op_asr_8_s , 0xf1f8, 0xe000, { 6, 6, 6}}, - {m68k_op_lsr_8_s , 0xf1f8, 0xe008, { 6, 6, 4}}, - {m68k_op_roxr_8_s , 0xf1f8, 0xe010, { 6, 6, 12}}, - {m68k_op_ror_8_s , 0xf1f8, 0xe018, { 6, 6, 8}}, - {m68k_op_asr_8_r , 0xf1f8, 0xe020, { 6, 6, 6}}, - {m68k_op_lsr_8_r , 0xf1f8, 0xe028, { 6, 6, 6}}, - {m68k_op_roxr_8_r , 0xf1f8, 0xe030, { 6, 6, 12}}, - {m68k_op_ror_8_r , 0xf1f8, 0xe038, { 6, 6, 8}}, - {m68k_op_asr_16_s , 0xf1f8, 0xe040, { 6, 6, 6}}, - {m68k_op_lsr_16_s , 0xf1f8, 0xe048, { 6, 6, 4}}, - {m68k_op_roxr_16_s , 0xf1f8, 0xe050, { 6, 6, 12}}, - {m68k_op_ror_16_s , 0xf1f8, 0xe058, { 6, 6, 8}}, - {m68k_op_asr_16_r , 0xf1f8, 0xe060, { 6, 6, 6}}, - {m68k_op_lsr_16_r , 0xf1f8, 0xe068, { 6, 6, 6}}, - {m68k_op_roxr_16_r , 0xf1f8, 0xe070, { 6, 6, 12}}, - {m68k_op_ror_16_r , 0xf1f8, 0xe078, { 6, 6, 8}}, - {m68k_op_asr_32_s , 0xf1f8, 0xe080, { 8, 8, 6}}, - {m68k_op_lsr_32_s , 0xf1f8, 0xe088, { 8, 8, 4}}, - {m68k_op_roxr_32_s , 0xf1f8, 0xe090, { 8, 8, 12}}, - {m68k_op_ror_32_s , 0xf1f8, 0xe098, { 8, 8, 8}}, - {m68k_op_asr_32_r , 0xf1f8, 0xe0a0, { 8, 8, 6}}, - {m68k_op_lsr_32_r , 0xf1f8, 0xe0a8, { 8, 8, 6}}, - {m68k_op_roxr_32_r , 0xf1f8, 0xe0b0, { 8, 8, 12}}, - {m68k_op_ror_32_r , 0xf1f8, 0xe0b8, { 8, 8, 8}}, - {m68k_op_asl_8_s , 0xf1f8, 0xe100, { 6, 6, 8}}, - {m68k_op_lsl_8_s , 0xf1f8, 0xe108, { 6, 6, 4}}, - {m68k_op_roxl_8_s , 0xf1f8, 0xe110, { 6, 6, 12}}, - {m68k_op_rol_8_s , 0xf1f8, 0xe118, { 6, 6, 8}}, - {m68k_op_asl_8_r , 0xf1f8, 0xe120, { 6, 6, 8}}, - {m68k_op_lsl_8_r , 0xf1f8, 0xe128, { 6, 6, 6}}, - {m68k_op_roxl_8_r , 0xf1f8, 0xe130, { 6, 6, 12}}, - {m68k_op_rol_8_r , 0xf1f8, 0xe138, { 6, 6, 8}}, - {m68k_op_asl_16_s , 0xf1f8, 0xe140, { 6, 6, 8}}, - {m68k_op_lsl_16_s , 0xf1f8, 0xe148, { 6, 6, 4}}, - {m68k_op_roxl_16_s , 0xf1f8, 0xe150, { 6, 6, 12}}, - {m68k_op_rol_16_s , 0xf1f8, 0xe158, { 6, 6, 8}}, - {m68k_op_asl_16_r , 0xf1f8, 0xe160, { 6, 6, 8}}, - {m68k_op_lsl_16_r , 0xf1f8, 0xe168, { 6, 6, 6}}, - {m68k_op_roxl_16_r , 0xf1f8, 0xe170, { 6, 6, 12}}, - {m68k_op_rol_16_r , 0xf1f8, 0xe178, { 6, 6, 8}}, - {m68k_op_asl_32_s , 0xf1f8, 0xe180, { 8, 8, 8}}, - {m68k_op_lsl_32_s , 0xf1f8, 0xe188, { 8, 8, 4}}, - {m68k_op_roxl_32_s , 0xf1f8, 0xe190, { 8, 8, 12}}, - {m68k_op_rol_32_s , 0xf1f8, 0xe198, { 8, 8, 8}}, - {m68k_op_asl_32_r , 0xf1f8, 0xe1a0, { 8, 8, 8}}, - {m68k_op_lsl_32_r , 0xf1f8, 0xe1a8, { 8, 8, 6}}, - {m68k_op_roxl_32_r , 0xf1f8, 0xe1b0, { 8, 8, 12}}, - {m68k_op_rol_32_r , 0xf1f8, 0xe1b8, { 8, 8, 8}}, - {m68k_op_cpdbcc_32 , 0xf1f8, 0xf048, { 0, 0, 4}}, - {m68k_op_cptrapcc_32 , 0xf1f8, 0xf078, { 0, 0, 4}}, - {m68k_op_rtm_32 , 0xfff0, 0x06c0, { 0, 0, 19}}, - {m68k_op_trap , 0xfff0, 0x4e40, { 4, 4, 4}}, - {m68k_op_btst_8_r_pi7 , 0xf1ff, 0x011f, { 8, 8, 8}}, - {m68k_op_btst_8_r_pd7 , 0xf1ff, 0x0127, { 10, 10, 9}}, - {m68k_op_btst_8_r_aw , 0xf1ff, 0x0138, { 12, 12, 8}}, - {m68k_op_btst_8_r_al , 0xf1ff, 0x0139, { 16, 16, 8}}, - {m68k_op_btst_8_r_pcdi , 0xf1ff, 0x013a, { 12, 12, 9}}, - {m68k_op_btst_8_r_pcix , 0xf1ff, 0x013b, { 14, 14, 11}}, - {m68k_op_btst_8_r_i , 0xf1ff, 0x013c, { 8, 8, 6}}, - {m68k_op_bchg_8_r_pi7 , 0xf1ff, 0x015f, { 12, 12, 8}}, - {m68k_op_bchg_8_r_pd7 , 0xf1ff, 0x0167, { 14, 14, 9}}, - {m68k_op_bchg_8_r_aw , 0xf1ff, 0x0178, { 16, 16, 8}}, - {m68k_op_bchg_8_r_al , 0xf1ff, 0x0179, { 20, 20, 8}}, - {m68k_op_bclr_8_r_pi7 , 0xf1ff, 0x019f, { 12, 14, 8}}, - {m68k_op_bclr_8_r_pd7 , 0xf1ff, 0x01a7, { 14, 16, 9}}, - {m68k_op_bclr_8_r_aw , 0xf1ff, 0x01b8, { 16, 18, 8}}, - {m68k_op_bclr_8_r_al , 0xf1ff, 0x01b9, { 20, 22, 8}}, - {m68k_op_bset_8_r_pi7 , 0xf1ff, 0x01df, { 12, 12, 8}}, - {m68k_op_bset_8_r_pd7 , 0xf1ff, 0x01e7, { 14, 14, 9}}, - {m68k_op_bset_8_r_aw , 0xf1ff, 0x01f8, { 16, 16, 8}}, - {m68k_op_bset_8_r_al , 0xf1ff, 0x01f9, { 20, 20, 8}}, - {m68k_op_move_8_d_pi7 , 0xf1ff, 0x101f, { 8, 8, 6}}, - {m68k_op_move_8_d_pd7 , 0xf1ff, 0x1027, { 10, 10, 7}}, - {m68k_op_move_8_d_aw , 0xf1ff, 0x1038, { 12, 12, 6}}, - {m68k_op_move_8_d_al , 0xf1ff, 0x1039, { 16, 16, 6}}, - {m68k_op_move_8_d_pcdi , 0xf1ff, 0x103a, { 12, 12, 7}}, - {m68k_op_move_8_d_pcix , 0xf1ff, 0x103b, { 14, 14, 9}}, - {m68k_op_move_8_d_i , 0xf1ff, 0x103c, { 8, 8, 4}}, - {m68k_op_move_8_ai_pi7 , 0xf1ff, 0x109f, { 12, 12, 8}}, - {m68k_op_move_8_ai_pd7 , 0xf1ff, 0x10a7, { 14, 14, 9}}, - {m68k_op_move_8_ai_aw , 0xf1ff, 0x10b8, { 16, 16, 8}}, - {m68k_op_move_8_ai_al , 0xf1ff, 0x10b9, { 20, 20, 8}}, - {m68k_op_move_8_ai_pcdi , 0xf1ff, 0x10ba, { 16, 16, 9}}, - {m68k_op_move_8_ai_pcix , 0xf1ff, 0x10bb, { 18, 18, 11}}, - {m68k_op_move_8_ai_i , 0xf1ff, 0x10bc, { 12, 12, 6}}, - {m68k_op_move_8_pi_pi7 , 0xf1ff, 0x10df, { 12, 12, 8}}, - {m68k_op_move_8_pi_pd7 , 0xf1ff, 0x10e7, { 14, 14, 9}}, - {m68k_op_move_8_pi_aw , 0xf1ff, 0x10f8, { 16, 16, 8}}, - {m68k_op_move_8_pi_al , 0xf1ff, 0x10f9, { 20, 20, 8}}, - {m68k_op_move_8_pi_pcdi , 0xf1ff, 0x10fa, { 16, 16, 9}}, - {m68k_op_move_8_pi_pcix , 0xf1ff, 0x10fb, { 18, 18, 11}}, - {m68k_op_move_8_pi_i , 0xf1ff, 0x10fc, { 12, 12, 6}}, - {m68k_op_move_8_pd_pi7 , 0xf1ff, 0x111f, { 12, 12, 9}}, - {m68k_op_move_8_pd_pd7 , 0xf1ff, 0x1127, { 14, 14, 10}}, - {m68k_op_move_8_pd_aw , 0xf1ff, 0x1138, { 16, 16, 9}}, - {m68k_op_move_8_pd_al , 0xf1ff, 0x1139, { 20, 20, 9}}, - {m68k_op_move_8_pd_pcdi , 0xf1ff, 0x113a, { 16, 16, 10}}, - {m68k_op_move_8_pd_pcix , 0xf1ff, 0x113b, { 18, 18, 12}}, - {m68k_op_move_8_pd_i , 0xf1ff, 0x113c, { 12, 12, 7}}, - {m68k_op_move_8_di_pi7 , 0xf1ff, 0x115f, { 16, 16, 9}}, - {m68k_op_move_8_di_pd7 , 0xf1ff, 0x1167, { 18, 18, 10}}, - {m68k_op_move_8_di_aw , 0xf1ff, 0x1178, { 20, 20, 9}}, - {m68k_op_move_8_di_al , 0xf1ff, 0x1179, { 24, 24, 9}}, - {m68k_op_move_8_di_pcdi , 0xf1ff, 0x117a, { 20, 20, 10}}, - {m68k_op_move_8_di_pcix , 0xf1ff, 0x117b, { 22, 22, 12}}, - {m68k_op_move_8_di_i , 0xf1ff, 0x117c, { 16, 16, 7}}, - {m68k_op_move_8_ix_pi7 , 0xf1ff, 0x119f, { 18, 18, 11}}, - {m68k_op_move_8_ix_pd7 , 0xf1ff, 0x11a7, { 20, 20, 12}}, - {m68k_op_move_8_ix_aw , 0xf1ff, 0x11b8, { 22, 22, 11}}, - {m68k_op_move_8_ix_al , 0xf1ff, 0x11b9, { 26, 26, 11}}, - {m68k_op_move_8_ix_pcdi , 0xf1ff, 0x11ba, { 22, 22, 12}}, - {m68k_op_move_8_ix_pcix , 0xf1ff, 0x11bb, { 24, 24, 14}}, - {m68k_op_move_8_ix_i , 0xf1ff, 0x11bc, { 18, 18, 9}}, - {m68k_op_move_32_d_aw , 0xf1ff, 0x2038, { 16, 16, 6}}, - {m68k_op_move_32_d_al , 0xf1ff, 0x2039, { 20, 20, 6}}, - {m68k_op_move_32_d_pcdi , 0xf1ff, 0x203a, { 16, 16, 7}}, - {m68k_op_move_32_d_pcix , 0xf1ff, 0x203b, { 18, 18, 9}}, - {m68k_op_move_32_d_i , 0xf1ff, 0x203c, { 12, 12, 6}}, - {m68k_op_movea_32_aw , 0xf1ff, 0x2078, { 16, 16, 6}}, - {m68k_op_movea_32_al , 0xf1ff, 0x2079, { 20, 20, 6}}, - {m68k_op_movea_32_pcdi , 0xf1ff, 0x207a, { 16, 16, 7}}, - {m68k_op_movea_32_pcix , 0xf1ff, 0x207b, { 18, 18, 9}}, - {m68k_op_movea_32_i , 0xf1ff, 0x207c, { 12, 12, 6}}, - {m68k_op_move_32_ai_aw , 0xf1ff, 0x20b8, { 24, 24, 8}}, - {m68k_op_move_32_ai_al , 0xf1ff, 0x20b9, { 28, 28, 8}}, - {m68k_op_move_32_ai_pcdi , 0xf1ff, 0x20ba, { 24, 24, 9}}, - {m68k_op_move_32_ai_pcix , 0xf1ff, 0x20bb, { 26, 26, 11}}, - {m68k_op_move_32_ai_i , 0xf1ff, 0x20bc, { 20, 20, 8}}, - {m68k_op_move_32_pi_aw , 0xf1ff, 0x20f8, { 24, 24, 8}}, - {m68k_op_move_32_pi_al , 0xf1ff, 0x20f9, { 28, 28, 8}}, - {m68k_op_move_32_pi_pcdi , 0xf1ff, 0x20fa, { 24, 24, 9}}, - {m68k_op_move_32_pi_pcix , 0xf1ff, 0x20fb, { 26, 26, 11}}, - {m68k_op_move_32_pi_i , 0xf1ff, 0x20fc, { 20, 20, 8}}, - {m68k_op_move_32_pd_aw , 0xf1ff, 0x2138, { 24, 26, 9}}, - {m68k_op_move_32_pd_al , 0xf1ff, 0x2139, { 28, 30, 9}}, - {m68k_op_move_32_pd_pcdi , 0xf1ff, 0x213a, { 24, 26, 10}}, - {m68k_op_move_32_pd_pcix , 0xf1ff, 0x213b, { 26, 28, 12}}, - {m68k_op_move_32_pd_i , 0xf1ff, 0x213c, { 20, 22, 9}}, - {m68k_op_move_32_di_aw , 0xf1ff, 0x2178, { 28, 28, 9}}, - {m68k_op_move_32_di_al , 0xf1ff, 0x2179, { 32, 32, 9}}, - {m68k_op_move_32_di_pcdi , 0xf1ff, 0x217a, { 28, 28, 10}}, - {m68k_op_move_32_di_pcix , 0xf1ff, 0x217b, { 30, 30, 12}}, - {m68k_op_move_32_di_i , 0xf1ff, 0x217c, { 24, 24, 9}}, - {m68k_op_move_32_ix_aw , 0xf1ff, 0x21b8, { 30, 30, 11}}, - {m68k_op_move_32_ix_al , 0xf1ff, 0x21b9, { 34, 34, 11}}, - {m68k_op_move_32_ix_pcdi , 0xf1ff, 0x21ba, { 30, 30, 12}}, - {m68k_op_move_32_ix_pcix , 0xf1ff, 0x21bb, { 32, 32, 14}}, - {m68k_op_move_32_ix_i , 0xf1ff, 0x21bc, { 26, 26, 11}}, - {m68k_op_move_16_d_aw , 0xf1ff, 0x3038, { 12, 12, 6}}, - {m68k_op_move_16_d_al , 0xf1ff, 0x3039, { 16, 16, 6}}, - {m68k_op_move_16_d_pcdi , 0xf1ff, 0x303a, { 12, 12, 7}}, - {m68k_op_move_16_d_pcix , 0xf1ff, 0x303b, { 14, 14, 9}}, - {m68k_op_move_16_d_i , 0xf1ff, 0x303c, { 8, 8, 4}}, - {m68k_op_movea_16_aw , 0xf1ff, 0x3078, { 12, 12, 6}}, - {m68k_op_movea_16_al , 0xf1ff, 0x3079, { 16, 16, 6}}, - {m68k_op_movea_16_pcdi , 0xf1ff, 0x307a, { 12, 12, 7}}, - {m68k_op_movea_16_pcix , 0xf1ff, 0x307b, { 14, 14, 9}}, - {m68k_op_movea_16_i , 0xf1ff, 0x307c, { 8, 8, 4}}, - {m68k_op_move_16_ai_aw , 0xf1ff, 0x30b8, { 16, 16, 8}}, - {m68k_op_move_16_ai_al , 0xf1ff, 0x30b9, { 20, 20, 8}}, - {m68k_op_move_16_ai_pcdi , 0xf1ff, 0x30ba, { 16, 16, 9}}, - {m68k_op_move_16_ai_pcix , 0xf1ff, 0x30bb, { 18, 18, 11}}, - {m68k_op_move_16_ai_i , 0xf1ff, 0x30bc, { 12, 12, 6}}, - {m68k_op_move_16_pi_aw , 0xf1ff, 0x30f8, { 16, 16, 8}}, - {m68k_op_move_16_pi_al , 0xf1ff, 0x30f9, { 20, 20, 8}}, - {m68k_op_move_16_pi_pcdi , 0xf1ff, 0x30fa, { 16, 16, 9}}, - {m68k_op_move_16_pi_pcix , 0xf1ff, 0x30fb, { 18, 18, 11}}, - {m68k_op_move_16_pi_i , 0xf1ff, 0x30fc, { 12, 12, 6}}, - {m68k_op_move_16_pd_aw , 0xf1ff, 0x3138, { 16, 16, 9}}, - {m68k_op_move_16_pd_al , 0xf1ff, 0x3139, { 20, 20, 9}}, - {m68k_op_move_16_pd_pcdi , 0xf1ff, 0x313a, { 16, 16, 10}}, - {m68k_op_move_16_pd_pcix , 0xf1ff, 0x313b, { 18, 18, 12}}, - {m68k_op_move_16_pd_i , 0xf1ff, 0x313c, { 12, 12, 7}}, - {m68k_op_move_16_di_aw , 0xf1ff, 0x3178, { 20, 20, 9}}, - {m68k_op_move_16_di_al , 0xf1ff, 0x3179, { 24, 24, 9}}, - {m68k_op_move_16_di_pcdi , 0xf1ff, 0x317a, { 20, 20, 10}}, - {m68k_op_move_16_di_pcix , 0xf1ff, 0x317b, { 22, 22, 12}}, - {m68k_op_move_16_di_i , 0xf1ff, 0x317c, { 16, 16, 7}}, - {m68k_op_move_16_ix_aw , 0xf1ff, 0x31b8, { 22, 22, 11}}, - {m68k_op_move_16_ix_al , 0xf1ff, 0x31b9, { 26, 26, 11}}, - {m68k_op_move_16_ix_pcdi , 0xf1ff, 0x31ba, { 22, 22, 12}}, - {m68k_op_move_16_ix_pcix , 0xf1ff, 0x31bb, { 24, 24, 14}}, - {m68k_op_move_16_ix_i , 0xf1ff, 0x31bc, { 18, 18, 9}}, - {m68k_op_chk_32_aw , 0xf1ff, 0x4138, { 0, 0, 12}}, - {m68k_op_chk_32_al , 0xf1ff, 0x4139, { 0, 0, 12}}, - {m68k_op_chk_32_pcdi , 0xf1ff, 0x413a, { 0, 0, 13}}, - {m68k_op_chk_32_pcix , 0xf1ff, 0x413b, { 0, 0, 15}}, - {m68k_op_chk_32_i , 0xf1ff, 0x413c, { 0, 0, 12}}, - {m68k_op_chk_16_aw , 0xf1ff, 0x41b8, { 18, 16, 12}}, - {m68k_op_chk_16_al , 0xf1ff, 0x41b9, { 22, 20, 12}}, - {m68k_op_chk_16_pcdi , 0xf1ff, 0x41ba, { 18, 16, 13}}, - {m68k_op_chk_16_pcix , 0xf1ff, 0x41bb, { 20, 18, 15}}, - {m68k_op_chk_16_i , 0xf1ff, 0x41bc, { 14, 12, 10}}, - {m68k_op_lea_32_aw , 0xf1ff, 0x41f8, { 8, 8, 6}}, - {m68k_op_lea_32_al , 0xf1ff, 0x41f9, { 12, 12, 6}}, - {m68k_op_lea_32_pcdi , 0xf1ff, 0x41fa, { 8, 8, 7}}, - {m68k_op_lea_32_pcix , 0xf1ff, 0x41fb, { 12, 12, 9}}, - {m68k_op_addq_8_pi7 , 0xf1ff, 0x501f, { 12, 12, 8}}, - {m68k_op_addq_8_pd7 , 0xf1ff, 0x5027, { 14, 14, 9}}, - {m68k_op_addq_8_aw , 0xf1ff, 0x5038, { 16, 16, 8}}, - {m68k_op_addq_8_al , 0xf1ff, 0x5039, { 20, 20, 8}}, - {m68k_op_addq_16_aw , 0xf1ff, 0x5078, { 16, 16, 8}}, - {m68k_op_addq_16_al , 0xf1ff, 0x5079, { 20, 20, 8}}, - {m68k_op_addq_32_aw , 0xf1ff, 0x50b8, { 24, 24, 8}}, - {m68k_op_addq_32_al , 0xf1ff, 0x50b9, { 28, 28, 8}}, - {m68k_op_subq_8_pi7 , 0xf1ff, 0x511f, { 12, 12, 8}}, - {m68k_op_subq_8_pd7 , 0xf1ff, 0x5127, { 14, 14, 9}}, - {m68k_op_subq_8_aw , 0xf1ff, 0x5138, { 16, 16, 8}}, - {m68k_op_subq_8_al , 0xf1ff, 0x5139, { 20, 20, 8}}, - {m68k_op_subq_16_aw , 0xf1ff, 0x5178, { 16, 16, 8}}, - {m68k_op_subq_16_al , 0xf1ff, 0x5179, { 20, 20, 8}}, - {m68k_op_subq_32_aw , 0xf1ff, 0x51b8, { 24, 24, 8}}, - {m68k_op_subq_32_al , 0xf1ff, 0x51b9, { 28, 28, 8}}, - {m68k_op_or_8_er_pi7 , 0xf1ff, 0x801f, { 8, 8, 6}}, - {m68k_op_or_8_er_pd7 , 0xf1ff, 0x8027, { 10, 10, 7}}, - {m68k_op_or_8_er_aw , 0xf1ff, 0x8038, { 12, 12, 6}}, - {m68k_op_or_8_er_al , 0xf1ff, 0x8039, { 16, 16, 6}}, - {m68k_op_or_8_er_pcdi , 0xf1ff, 0x803a, { 12, 12, 7}}, - {m68k_op_or_8_er_pcix , 0xf1ff, 0x803b, { 14, 14, 9}}, - {m68k_op_or_8_er_i , 0xf1ff, 0x803c, { 10, 8, 4}}, - {m68k_op_or_16_er_aw , 0xf1ff, 0x8078, { 12, 12, 6}}, - {m68k_op_or_16_er_al , 0xf1ff, 0x8079, { 16, 16, 6}}, - {m68k_op_or_16_er_pcdi , 0xf1ff, 0x807a, { 12, 12, 7}}, - {m68k_op_or_16_er_pcix , 0xf1ff, 0x807b, { 14, 14, 9}}, - {m68k_op_or_16_er_i , 0xf1ff, 0x807c, { 10, 8, 4}}, - {m68k_op_or_32_er_aw , 0xf1ff, 0x80b8, { 18, 18, 6}}, - {m68k_op_or_32_er_al , 0xf1ff, 0x80b9, { 22, 22, 6}}, - {m68k_op_or_32_er_pcdi , 0xf1ff, 0x80ba, { 18, 18, 7}}, - {m68k_op_or_32_er_pcix , 0xf1ff, 0x80bb, { 20, 20, 9}}, - {m68k_op_or_32_er_i , 0xf1ff, 0x80bc, { 16, 14, 6}}, - {m68k_op_divu_16_aw , 0xf1ff, 0x80f8, {148, 116, 48}}, - {m68k_op_divu_16_al , 0xf1ff, 0x80f9, {152, 120, 48}}, - {m68k_op_divu_16_pcdi , 0xf1ff, 0x80fa, {148, 116, 49}}, - {m68k_op_divu_16_pcix , 0xf1ff, 0x80fb, {150, 118, 51}}, - {m68k_op_divu_16_i , 0xf1ff, 0x80fc, {144, 112, 46}}, - {m68k_op_sbcd_8_mm_ay7 , 0xf1ff, 0x810f, { 18, 18, 16}}, - {m68k_op_or_8_re_pi7 , 0xf1ff, 0x811f, { 12, 12, 8}}, - {m68k_op_or_8_re_pd7 , 0xf1ff, 0x8127, { 14, 14, 9}}, - {m68k_op_or_8_re_aw , 0xf1ff, 0x8138, { 16, 16, 8}}, - {m68k_op_or_8_re_al , 0xf1ff, 0x8139, { 20, 20, 8}}, - {m68k_op_pack_16_mm_ay7 , 0xf1ff, 0x814f, { 0, 0, 13}}, - {m68k_op_or_16_re_aw , 0xf1ff, 0x8178, { 16, 16, 8}}, - {m68k_op_or_16_re_al , 0xf1ff, 0x8179, { 20, 20, 8}}, - {m68k_op_unpk_16_mm_ay7 , 0xf1ff, 0x818f, { 0, 0, 13}}, - {m68k_op_or_32_re_aw , 0xf1ff, 0x81b8, { 24, 24, 8}}, - {m68k_op_or_32_re_al , 0xf1ff, 0x81b9, { 28, 28, 8}}, - {m68k_op_divs_16_aw , 0xf1ff, 0x81f8, {166, 130, 60}}, - {m68k_op_divs_16_al , 0xf1ff, 0x81f9, {170, 134, 60}}, - {m68k_op_divs_16_pcdi , 0xf1ff, 0x81fa, {166, 130, 61}}, - {m68k_op_divs_16_pcix , 0xf1ff, 0x81fb, {168, 132, 63}}, - {m68k_op_divs_16_i , 0xf1ff, 0x81fc, {162, 126, 58}}, - {m68k_op_sub_8_er_pi7 , 0xf1ff, 0x901f, { 8, 8, 6}}, - {m68k_op_sub_8_er_pd7 , 0xf1ff, 0x9027, { 10, 10, 7}}, - {m68k_op_sub_8_er_aw , 0xf1ff, 0x9038, { 12, 12, 6}}, - {m68k_op_sub_8_er_al , 0xf1ff, 0x9039, { 16, 16, 6}}, - {m68k_op_sub_8_er_pcdi , 0xf1ff, 0x903a, { 12, 12, 7}}, - {m68k_op_sub_8_er_pcix , 0xf1ff, 0x903b, { 14, 14, 9}}, - {m68k_op_sub_8_er_i , 0xf1ff, 0x903c, { 10, 8, 4}}, - {m68k_op_sub_16_er_aw , 0xf1ff, 0x9078, { 12, 12, 6}}, - {m68k_op_sub_16_er_al , 0xf1ff, 0x9079, { 16, 16, 6}}, - {m68k_op_sub_16_er_pcdi , 0xf1ff, 0x907a, { 12, 12, 7}}, - {m68k_op_sub_16_er_pcix , 0xf1ff, 0x907b, { 14, 14, 9}}, - {m68k_op_sub_16_er_i , 0xf1ff, 0x907c, { 10, 8, 4}}, - {m68k_op_sub_32_er_aw , 0xf1ff, 0x90b8, { 18, 18, 6}}, - {m68k_op_sub_32_er_al , 0xf1ff, 0x90b9, { 22, 22, 6}}, - {m68k_op_sub_32_er_pcdi , 0xf1ff, 0x90ba, { 18, 18, 7}}, - {m68k_op_sub_32_er_pcix , 0xf1ff, 0x90bb, { 20, 20, 9}}, - {m68k_op_sub_32_er_i , 0xf1ff, 0x90bc, { 16, 14, 6}}, - {m68k_op_suba_16_aw , 0xf1ff, 0x90f8, { 16, 16, 6}}, - {m68k_op_suba_16_al , 0xf1ff, 0x90f9, { 20, 20, 6}}, - {m68k_op_suba_16_pcdi , 0xf1ff, 0x90fa, { 16, 16, 7}}, - {m68k_op_suba_16_pcix , 0xf1ff, 0x90fb, { 18, 18, 9}}, - {m68k_op_suba_16_i , 0xf1ff, 0x90fc, { 14, 12, 4}}, - {m68k_op_subx_8_mm_ay7 , 0xf1ff, 0x910f, { 18, 18, 12}}, - {m68k_op_sub_8_re_pi7 , 0xf1ff, 0x911f, { 12, 12, 8}}, - {m68k_op_sub_8_re_pd7 , 0xf1ff, 0x9127, { 14, 14, 9}}, - {m68k_op_sub_8_re_aw , 0xf1ff, 0x9138, { 16, 16, 8}}, - {m68k_op_sub_8_re_al , 0xf1ff, 0x9139, { 20, 20, 8}}, - {m68k_op_sub_16_re_aw , 0xf1ff, 0x9178, { 16, 16, 8}}, - {m68k_op_sub_16_re_al , 0xf1ff, 0x9179, { 20, 20, 8}}, - {m68k_op_sub_32_re_aw , 0xf1ff, 0x91b8, { 24, 24, 8}}, - {m68k_op_sub_32_re_al , 0xf1ff, 0x91b9, { 28, 28, 8}}, - {m68k_op_suba_32_aw , 0xf1ff, 0x91f8, { 18, 18, 6}}, - {m68k_op_suba_32_al , 0xf1ff, 0x91f9, { 22, 22, 6}}, - {m68k_op_suba_32_pcdi , 0xf1ff, 0x91fa, { 18, 18, 7}}, - {m68k_op_suba_32_pcix , 0xf1ff, 0x91fb, { 20, 20, 9}}, - {m68k_op_suba_32_i , 0xf1ff, 0x91fc, { 16, 14, 6}}, - {m68k_op_cmp_8_pi7 , 0xf1ff, 0xb01f, { 8, 8, 6}}, - {m68k_op_cmp_8_pd7 , 0xf1ff, 0xb027, { 10, 10, 7}}, - {m68k_op_cmp_8_aw , 0xf1ff, 0xb038, { 12, 12, 6}}, - {m68k_op_cmp_8_al , 0xf1ff, 0xb039, { 16, 16, 6}}, - {m68k_op_cmp_8_pcdi , 0xf1ff, 0xb03a, { 12, 12, 7}}, - {m68k_op_cmp_8_pcix , 0xf1ff, 0xb03b, { 14, 14, 9}}, - {m68k_op_cmp_8_i , 0xf1ff, 0xb03c, { 8, 8, 4}}, - {m68k_op_cmp_16_aw , 0xf1ff, 0xb078, { 12, 12, 6}}, - {m68k_op_cmp_16_al , 0xf1ff, 0xb079, { 16, 16, 6}}, - {m68k_op_cmp_16_pcdi , 0xf1ff, 0xb07a, { 12, 12, 7}}, - {m68k_op_cmp_16_pcix , 0xf1ff, 0xb07b, { 14, 14, 9}}, - {m68k_op_cmp_16_i , 0xf1ff, 0xb07c, { 8, 8, 4}}, - {m68k_op_cmp_32_aw , 0xf1ff, 0xb0b8, { 18, 18, 6}}, - {m68k_op_cmp_32_al , 0xf1ff, 0xb0b9, { 22, 22, 6}}, - {m68k_op_cmp_32_pcdi , 0xf1ff, 0xb0ba, { 18, 18, 7}}, - {m68k_op_cmp_32_pcix , 0xf1ff, 0xb0bb, { 20, 20, 9}}, - {m68k_op_cmp_32_i , 0xf1ff, 0xb0bc, { 14, 14, 6}}, - {m68k_op_cmpa_16_aw , 0xf1ff, 0xb0f8, { 14, 14, 8}}, - {m68k_op_cmpa_16_al , 0xf1ff, 0xb0f9, { 18, 18, 8}}, - {m68k_op_cmpa_16_pcdi , 0xf1ff, 0xb0fa, { 14, 14, 9}}, - {m68k_op_cmpa_16_pcix , 0xf1ff, 0xb0fb, { 16, 16, 11}}, - {m68k_op_cmpa_16_i , 0xf1ff, 0xb0fc, { 10, 10, 6}}, - {m68k_op_cmpm_8_ay7 , 0xf1ff, 0xb10f, { 12, 12, 9}}, - {m68k_op_eor_8_pi7 , 0xf1ff, 0xb11f, { 12, 12, 8}}, - {m68k_op_eor_8_pd7 , 0xf1ff, 0xb127, { 14, 14, 9}}, - {m68k_op_eor_8_aw , 0xf1ff, 0xb138, { 16, 16, 8}}, - {m68k_op_eor_8_al , 0xf1ff, 0xb139, { 20, 20, 8}}, - {m68k_op_eor_16_aw , 0xf1ff, 0xb178, { 16, 16, 8}}, - {m68k_op_eor_16_al , 0xf1ff, 0xb179, { 20, 20, 8}}, - {m68k_op_eor_32_aw , 0xf1ff, 0xb1b8, { 24, 24, 8}}, - {m68k_op_eor_32_al , 0xf1ff, 0xb1b9, { 28, 28, 8}}, - {m68k_op_cmpa_32_aw , 0xf1ff, 0xb1f8, { 18, 18, 8}}, - {m68k_op_cmpa_32_al , 0xf1ff, 0xb1f9, { 22, 22, 8}}, - {m68k_op_cmpa_32_pcdi , 0xf1ff, 0xb1fa, { 18, 18, 9}}, - {m68k_op_cmpa_32_pcix , 0xf1ff, 0xb1fb, { 20, 20, 11}}, - {m68k_op_cmpa_32_i , 0xf1ff, 0xb1fc, { 14, 14, 8}}, - {m68k_op_and_8_er_pi7 , 0xf1ff, 0xc01f, { 8, 8, 6}}, - {m68k_op_and_8_er_pd7 , 0xf1ff, 0xc027, { 10, 10, 7}}, - {m68k_op_and_8_er_aw , 0xf1ff, 0xc038, { 12, 12, 6}}, - {m68k_op_and_8_er_al , 0xf1ff, 0xc039, { 16, 16, 6}}, - {m68k_op_and_8_er_pcdi , 0xf1ff, 0xc03a, { 12, 12, 7}}, - {m68k_op_and_8_er_pcix , 0xf1ff, 0xc03b, { 14, 14, 9}}, - {m68k_op_and_8_er_i , 0xf1ff, 0xc03c, { 10, 8, 4}}, - {m68k_op_and_16_er_aw , 0xf1ff, 0xc078, { 12, 12, 6}}, - {m68k_op_and_16_er_al , 0xf1ff, 0xc079, { 16, 16, 6}}, - {m68k_op_and_16_er_pcdi , 0xf1ff, 0xc07a, { 12, 12, 7}}, - {m68k_op_and_16_er_pcix , 0xf1ff, 0xc07b, { 14, 14, 9}}, - {m68k_op_and_16_er_i , 0xf1ff, 0xc07c, { 10, 8, 4}}, - {m68k_op_and_32_er_aw , 0xf1ff, 0xc0b8, { 18, 18, 6}}, - {m68k_op_and_32_er_al , 0xf1ff, 0xc0b9, { 22, 22, 6}}, - {m68k_op_and_32_er_pcdi , 0xf1ff, 0xc0ba, { 18, 18, 7}}, - {m68k_op_and_32_er_pcix , 0xf1ff, 0xc0bb, { 20, 20, 9}}, - {m68k_op_and_32_er_i , 0xf1ff, 0xc0bc, { 16, 14, 6}}, - {m68k_op_mulu_16_aw , 0xf1ff, 0xc0f8, { 62, 38, 31}}, - {m68k_op_mulu_16_al , 0xf1ff, 0xc0f9, { 66, 42, 31}}, - {m68k_op_mulu_16_pcdi , 0xf1ff, 0xc0fa, { 62, 38, 32}}, - {m68k_op_mulu_16_pcix , 0xf1ff, 0xc0fb, { 64, 40, 34}}, - {m68k_op_mulu_16_i , 0xf1ff, 0xc0fc, { 58, 34, 29}}, - {m68k_op_abcd_8_mm_ay7 , 0xf1ff, 0xc10f, { 18, 18, 16}}, - {m68k_op_and_8_re_pi7 , 0xf1ff, 0xc11f, { 12, 12, 8}}, - {m68k_op_and_8_re_pd7 , 0xf1ff, 0xc127, { 14, 14, 9}}, - {m68k_op_and_8_re_aw , 0xf1ff, 0xc138, { 16, 16, 8}}, - {m68k_op_and_8_re_al , 0xf1ff, 0xc139, { 20, 20, 8}}, - {m68k_op_and_16_re_aw , 0xf1ff, 0xc178, { 16, 16, 8}}, - {m68k_op_and_16_re_al , 0xf1ff, 0xc179, { 20, 20, 8}}, - {m68k_op_and_32_re_aw , 0xf1ff, 0xc1b8, { 24, 24, 8}}, - {m68k_op_and_32_re_al , 0xf1ff, 0xc1b9, { 28, 28, 8}}, - {m68k_op_muls_16_aw , 0xf1ff, 0xc1f8, { 62, 40, 31}}, - {m68k_op_muls_16_al , 0xf1ff, 0xc1f9, { 66, 44, 31}}, - {m68k_op_muls_16_pcdi , 0xf1ff, 0xc1fa, { 62, 40, 32}}, - {m68k_op_muls_16_pcix , 0xf1ff, 0xc1fb, { 64, 42, 34}}, - {m68k_op_muls_16_i , 0xf1ff, 0xc1fc, { 58, 36, 29}}, - {m68k_op_add_8_er_pi7 , 0xf1ff, 0xd01f, { 8, 8, 6}}, - {m68k_op_add_8_er_pd7 , 0xf1ff, 0xd027, { 10, 10, 7}}, - {m68k_op_add_8_er_aw , 0xf1ff, 0xd038, { 12, 12, 6}}, - {m68k_op_add_8_er_al , 0xf1ff, 0xd039, { 16, 16, 6}}, - {m68k_op_add_8_er_pcdi , 0xf1ff, 0xd03a, { 12, 12, 7}}, - {m68k_op_add_8_er_pcix , 0xf1ff, 0xd03b, { 14, 14, 9}}, - {m68k_op_add_8_er_i , 0xf1ff, 0xd03c, { 10, 8, 4}}, - {m68k_op_add_16_er_aw , 0xf1ff, 0xd078, { 12, 12, 6}}, - {m68k_op_add_16_er_al , 0xf1ff, 0xd079, { 16, 16, 6}}, - {m68k_op_add_16_er_pcdi , 0xf1ff, 0xd07a, { 12, 12, 7}}, - {m68k_op_add_16_er_pcix , 0xf1ff, 0xd07b, { 14, 14, 9}}, - {m68k_op_add_16_er_i , 0xf1ff, 0xd07c, { 10, 8, 4}}, - {m68k_op_add_32_er_aw , 0xf1ff, 0xd0b8, { 18, 18, 6}}, - {m68k_op_add_32_er_al , 0xf1ff, 0xd0b9, { 22, 22, 6}}, - {m68k_op_add_32_er_pcdi , 0xf1ff, 0xd0ba, { 18, 18, 7}}, - {m68k_op_add_32_er_pcix , 0xf1ff, 0xd0bb, { 20, 20, 9}}, - {m68k_op_add_32_er_i , 0xf1ff, 0xd0bc, { 16, 14, 6}}, - {m68k_op_adda_16_aw , 0xf1ff, 0xd0f8, { 16, 16, 6}}, - {m68k_op_adda_16_al , 0xf1ff, 0xd0f9, { 20, 20, 6}}, - {m68k_op_adda_16_pcdi , 0xf1ff, 0xd0fa, { 16, 16, 7}}, - {m68k_op_adda_16_pcix , 0xf1ff, 0xd0fb, { 18, 18, 9}}, - {m68k_op_adda_16_i , 0xf1ff, 0xd0fc, { 14, 12, 4}}, - {m68k_op_addx_8_mm_ay7 , 0xf1ff, 0xd10f, { 18, 18, 12}}, - {m68k_op_add_8_re_pi7 , 0xf1ff, 0xd11f, { 12, 12, 8}}, - {m68k_op_add_8_re_pd7 , 0xf1ff, 0xd127, { 14, 14, 9}}, - {m68k_op_add_8_re_aw , 0xf1ff, 0xd138, { 16, 16, 8}}, - {m68k_op_add_8_re_al , 0xf1ff, 0xd139, { 20, 20, 8}}, - {m68k_op_add_16_re_aw , 0xf1ff, 0xd178, { 16, 16, 8}}, - {m68k_op_add_16_re_al , 0xf1ff, 0xd179, { 20, 20, 8}}, - {m68k_op_add_32_re_aw , 0xf1ff, 0xd1b8, { 24, 24, 8}}, - {m68k_op_add_32_re_al , 0xf1ff, 0xd1b9, { 28, 28, 8}}, - {m68k_op_adda_32_aw , 0xf1ff, 0xd1f8, { 18, 18, 6}}, - {m68k_op_adda_32_al , 0xf1ff, 0xd1f9, { 22, 22, 6}}, - {m68k_op_adda_32_pcdi , 0xf1ff, 0xd1fa, { 18, 18, 7}}, - {m68k_op_adda_32_pcix , 0xf1ff, 0xd1fb, { 20, 20, 9}}, - {m68k_op_adda_32_i , 0xf1ff, 0xd1fc, { 16, 14, 6}}, - {m68k_op_ori_8_d , 0xfff8, 0x0000, { 8, 8, 2}}, - {m68k_op_ori_8_ai , 0xfff8, 0x0010, { 16, 16, 8}}, - {m68k_op_ori_8_pi , 0xfff8, 0x0018, { 16, 16, 8}}, - {m68k_op_ori_8_pd , 0xfff8, 0x0020, { 18, 18, 9}}, - {m68k_op_ori_8_di , 0xfff8, 0x0028, { 20, 20, 9}}, - {m68k_op_ori_8_ix , 0xfff8, 0x0030, { 22, 22, 11}}, - {m68k_op_ori_16_d , 0xfff8, 0x0040, { 8, 8, 2}}, - {m68k_op_ori_16_ai , 0xfff8, 0x0050, { 16, 16, 8}}, - {m68k_op_ori_16_pi , 0xfff8, 0x0058, { 16, 16, 8}}, - {m68k_op_ori_16_pd , 0xfff8, 0x0060, { 18, 18, 9}}, - {m68k_op_ori_16_di , 0xfff8, 0x0068, { 20, 20, 9}}, - {m68k_op_ori_16_ix , 0xfff8, 0x0070, { 22, 22, 11}}, - {m68k_op_ori_32_d , 0xfff8, 0x0080, { 16, 14, 2}}, - {m68k_op_ori_32_ai , 0xfff8, 0x0090, { 28, 28, 8}}, - {m68k_op_ori_32_pi , 0xfff8, 0x0098, { 28, 28, 8}}, - {m68k_op_ori_32_pd , 0xfff8, 0x00a0, { 30, 30, 9}}, - {m68k_op_ori_32_di , 0xfff8, 0x00a8, { 32, 32, 9}}, - {m68k_op_ori_32_ix , 0xfff8, 0x00b0, { 34, 34, 11}}, - {m68k_op_chk2cmp2_8_ai , 0xfff8, 0x00d0, { 0, 0, 22}}, - {m68k_op_chk2cmp2_8_di , 0xfff8, 0x00e8, { 0, 0, 23}}, - {m68k_op_chk2cmp2_8_ix , 0xfff8, 0x00f0, { 0, 0, 25}}, - {m68k_op_andi_8_d , 0xfff8, 0x0200, { 8, 8, 2}}, - {m68k_op_andi_8_ai , 0xfff8, 0x0210, { 16, 16, 8}}, - {m68k_op_andi_8_pi , 0xfff8, 0x0218, { 16, 16, 8}}, - {m68k_op_andi_8_pd , 0xfff8, 0x0220, { 18, 18, 9}}, - {m68k_op_andi_8_di , 0xfff8, 0x0228, { 20, 20, 9}}, - {m68k_op_andi_8_ix , 0xfff8, 0x0230, { 22, 22, 11}}, - {m68k_op_andi_16_d , 0xfff8, 0x0240, { 8, 8, 2}}, - {m68k_op_andi_16_ai , 0xfff8, 0x0250, { 16, 16, 8}}, - {m68k_op_andi_16_pi , 0xfff8, 0x0258, { 16, 16, 8}}, - {m68k_op_andi_16_pd , 0xfff8, 0x0260, { 18, 18, 9}}, - {m68k_op_andi_16_di , 0xfff8, 0x0268, { 20, 20, 9}}, - {m68k_op_andi_16_ix , 0xfff8, 0x0270, { 22, 22, 11}}, - {m68k_op_andi_32_d , 0xfff8, 0x0280, { 14, 14, 2}}, - {m68k_op_andi_32_ai , 0xfff8, 0x0290, { 28, 28, 8}}, - {m68k_op_andi_32_pi , 0xfff8, 0x0298, { 28, 28, 8}}, - {m68k_op_andi_32_pd , 0xfff8, 0x02a0, { 30, 30, 9}}, - {m68k_op_andi_32_di , 0xfff8, 0x02a8, { 32, 32, 9}}, - {m68k_op_andi_32_ix , 0xfff8, 0x02b0, { 34, 34, 11}}, - {m68k_op_chk2cmp2_16_ai , 0xfff8, 0x02d0, { 0, 0, 22}}, - {m68k_op_chk2cmp2_16_di , 0xfff8, 0x02e8, { 0, 0, 23}}, - {m68k_op_chk2cmp2_16_ix , 0xfff8, 0x02f0, { 0, 0, 25}}, - {m68k_op_subi_8_d , 0xfff8, 0x0400, { 8, 8, 2}}, - {m68k_op_subi_8_ai , 0xfff8, 0x0410, { 16, 16, 8}}, - {m68k_op_subi_8_pi , 0xfff8, 0x0418, { 16, 16, 8}}, - {m68k_op_subi_8_pd , 0xfff8, 0x0420, { 18, 18, 9}}, - {m68k_op_subi_8_di , 0xfff8, 0x0428, { 20, 20, 9}}, - {m68k_op_subi_8_ix , 0xfff8, 0x0430, { 22, 22, 11}}, - {m68k_op_subi_16_d , 0xfff8, 0x0440, { 8, 8, 2}}, - {m68k_op_subi_16_ai , 0xfff8, 0x0450, { 16, 16, 8}}, - {m68k_op_subi_16_pi , 0xfff8, 0x0458, { 16, 16, 8}}, - {m68k_op_subi_16_pd , 0xfff8, 0x0460, { 18, 18, 9}}, - {m68k_op_subi_16_di , 0xfff8, 0x0468, { 20, 20, 9}}, - {m68k_op_subi_16_ix , 0xfff8, 0x0470, { 22, 22, 11}}, - {m68k_op_subi_32_d , 0xfff8, 0x0480, { 16, 14, 2}}, - {m68k_op_subi_32_ai , 0xfff8, 0x0490, { 28, 28, 8}}, - {m68k_op_subi_32_pi , 0xfff8, 0x0498, { 28, 28, 8}}, - {m68k_op_subi_32_pd , 0xfff8, 0x04a0, { 30, 30, 9}}, - {m68k_op_subi_32_di , 0xfff8, 0x04a8, { 32, 32, 9}}, - {m68k_op_subi_32_ix , 0xfff8, 0x04b0, { 34, 34, 11}}, - {m68k_op_chk2cmp2_32_ai , 0xfff8, 0x04d0, { 0, 0, 22}}, - {m68k_op_chk2cmp2_32_di , 0xfff8, 0x04e8, { 0, 0, 23}}, - {m68k_op_chk2cmp2_32_ix , 0xfff8, 0x04f0, { 0, 0, 25}}, - {m68k_op_addi_8_d , 0xfff8, 0x0600, { 8, 8, 2}}, - {m68k_op_addi_8_ai , 0xfff8, 0x0610, { 16, 16, 8}}, - {m68k_op_addi_8_pi , 0xfff8, 0x0618, { 16, 16, 8}}, - {m68k_op_addi_8_pd , 0xfff8, 0x0620, { 18, 18, 9}}, - {m68k_op_addi_8_di , 0xfff8, 0x0628, { 20, 20, 9}}, - {m68k_op_addi_8_ix , 0xfff8, 0x0630, { 22, 22, 11}}, - {m68k_op_addi_16_d , 0xfff8, 0x0640, { 8, 8, 2}}, - {m68k_op_addi_16_ai , 0xfff8, 0x0650, { 16, 16, 8}}, - {m68k_op_addi_16_pi , 0xfff8, 0x0658, { 16, 16, 8}}, - {m68k_op_addi_16_pd , 0xfff8, 0x0660, { 18, 18, 9}}, - {m68k_op_addi_16_di , 0xfff8, 0x0668, { 20, 20, 9}}, - {m68k_op_addi_16_ix , 0xfff8, 0x0670, { 22, 22, 11}}, - {m68k_op_addi_32_d , 0xfff8, 0x0680, { 16, 14, 2}}, - {m68k_op_addi_32_ai , 0xfff8, 0x0690, { 28, 28, 8}}, - {m68k_op_addi_32_pi , 0xfff8, 0x0698, { 28, 28, 8}}, - {m68k_op_addi_32_pd , 0xfff8, 0x06a0, { 30, 30, 9}}, - {m68k_op_addi_32_di , 0xfff8, 0x06a8, { 32, 32, 9}}, - {m68k_op_addi_32_ix , 0xfff8, 0x06b0, { 34, 34, 11}}, - {m68k_op_callm_32_ai , 0xfff8, 0x06d0, { 0, 0, 64}}, - {m68k_op_callm_32_di , 0xfff8, 0x06e8, { 0, 0, 65}}, - {m68k_op_callm_32_ix , 0xfff8, 0x06f0, { 0, 0, 67}}, - {m68k_op_btst_32_s_d , 0xfff8, 0x0800, { 10, 10, 4}}, - {m68k_op_btst_8_s_ai , 0xfff8, 0x0810, { 12, 12, 8}}, - {m68k_op_btst_8_s_pi , 0xfff8, 0x0818, { 12, 12, 8}}, - {m68k_op_btst_8_s_pd , 0xfff8, 0x0820, { 14, 14, 9}}, - {m68k_op_btst_8_s_di , 0xfff8, 0x0828, { 16, 16, 9}}, - {m68k_op_btst_8_s_ix , 0xfff8, 0x0830, { 18, 18, 11}}, - {m68k_op_bchg_32_s_d , 0xfff8, 0x0840, { 12, 12, 4}}, - {m68k_op_bchg_8_s_ai , 0xfff8, 0x0850, { 16, 16, 8}}, - {m68k_op_bchg_8_s_pi , 0xfff8, 0x0858, { 16, 16, 8}}, - {m68k_op_bchg_8_s_pd , 0xfff8, 0x0860, { 18, 18, 9}}, - {m68k_op_bchg_8_s_di , 0xfff8, 0x0868, { 20, 20, 9}}, - {m68k_op_bchg_8_s_ix , 0xfff8, 0x0870, { 22, 22, 11}}, - {m68k_op_bclr_32_s_d , 0xfff8, 0x0880, { 14, 14, 4}}, - {m68k_op_bclr_8_s_ai , 0xfff8, 0x0890, { 16, 16, 8}}, - {m68k_op_bclr_8_s_pi , 0xfff8, 0x0898, { 16, 16, 8}}, - {m68k_op_bclr_8_s_pd , 0xfff8, 0x08a0, { 18, 18, 9}}, - {m68k_op_bclr_8_s_di , 0xfff8, 0x08a8, { 20, 20, 9}}, - {m68k_op_bclr_8_s_ix , 0xfff8, 0x08b0, { 22, 22, 11}}, - {m68k_op_bset_32_s_d , 0xfff8, 0x08c0, { 12, 12, 4}}, - {m68k_op_bset_8_s_ai , 0xfff8, 0x08d0, { 16, 16, 8}}, - {m68k_op_bset_8_s_pi , 0xfff8, 0x08d8, { 16, 16, 8}}, - {m68k_op_bset_8_s_pd , 0xfff8, 0x08e0, { 18, 18, 9}}, - {m68k_op_bset_8_s_di , 0xfff8, 0x08e8, { 20, 20, 9}}, - {m68k_op_bset_8_s_ix , 0xfff8, 0x08f0, { 22, 22, 11}}, - {m68k_op_eori_8_d , 0xfff8, 0x0a00, { 8, 8, 2}}, - {m68k_op_eori_8_ai , 0xfff8, 0x0a10, { 16, 16, 8}}, - {m68k_op_eori_8_pi , 0xfff8, 0x0a18, { 16, 16, 8}}, - {m68k_op_eori_8_pd , 0xfff8, 0x0a20, { 18, 18, 9}}, - {m68k_op_eori_8_di , 0xfff8, 0x0a28, { 20, 20, 9}}, - {m68k_op_eori_8_ix , 0xfff8, 0x0a30, { 22, 22, 11}}, - {m68k_op_eori_16_d , 0xfff8, 0x0a40, { 8, 8, 2}}, - {m68k_op_eori_16_ai , 0xfff8, 0x0a50, { 16, 16, 8}}, - {m68k_op_eori_16_pi , 0xfff8, 0x0a58, { 16, 16, 8}}, - {m68k_op_eori_16_pd , 0xfff8, 0x0a60, { 18, 18, 9}}, - {m68k_op_eori_16_di , 0xfff8, 0x0a68, { 20, 20, 9}}, - {m68k_op_eori_16_ix , 0xfff8, 0x0a70, { 22, 22, 11}}, - {m68k_op_eori_32_d , 0xfff8, 0x0a80, { 16, 14, 2}}, - {m68k_op_eori_32_ai , 0xfff8, 0x0a90, { 28, 28, 8}}, - {m68k_op_eori_32_pi , 0xfff8, 0x0a98, { 28, 28, 8}}, - {m68k_op_eori_32_pd , 0xfff8, 0x0aa0, { 30, 30, 9}}, - {m68k_op_eori_32_di , 0xfff8, 0x0aa8, { 32, 32, 9}}, - {m68k_op_eori_32_ix , 0xfff8, 0x0ab0, { 34, 34, 11}}, - {m68k_op_cas_8_ai , 0xfff8, 0x0ad0, { 0, 0, 16}}, - {m68k_op_cas_8_pi , 0xfff8, 0x0ad8, { 0, 0, 16}}, - {m68k_op_cas_8_pd , 0xfff8, 0x0ae0, { 0, 0, 17}}, - {m68k_op_cas_8_di , 0xfff8, 0x0ae8, { 0, 0, 17}}, - {m68k_op_cas_8_ix , 0xfff8, 0x0af0, { 0, 0, 19}}, - {m68k_op_cmpi_8_d , 0xfff8, 0x0c00, { 8, 8, 2}}, - {m68k_op_cmpi_8_ai , 0xfff8, 0x0c10, { 12, 12, 6}}, - {m68k_op_cmpi_8_pi , 0xfff8, 0x0c18, { 12, 12, 6}}, - {m68k_op_cmpi_8_pd , 0xfff8, 0x0c20, { 14, 14, 7}}, - {m68k_op_cmpi_8_di , 0xfff8, 0x0c28, { 16, 16, 7}}, - {m68k_op_cmpi_8_ix , 0xfff8, 0x0c30, { 18, 18, 9}}, - {m68k_op_cmpi_16_d , 0xfff8, 0x0c40, { 8, 8, 2}}, - {m68k_op_cmpi_16_ai , 0xfff8, 0x0c50, { 12, 12, 6}}, - {m68k_op_cmpi_16_pi , 0xfff8, 0x0c58, { 12, 12, 6}}, - {m68k_op_cmpi_16_pd , 0xfff8, 0x0c60, { 14, 14, 7}}, - {m68k_op_cmpi_16_di , 0xfff8, 0x0c68, { 16, 16, 7}}, - {m68k_op_cmpi_16_ix , 0xfff8, 0x0c70, { 18, 18, 9}}, - {m68k_op_cmpi_32_d , 0xfff8, 0x0c80, { 14, 12, 2}}, - {m68k_op_cmpi_32_ai , 0xfff8, 0x0c90, { 20, 20, 6}}, - {m68k_op_cmpi_32_pi , 0xfff8, 0x0c98, { 20, 20, 6}}, - {m68k_op_cmpi_32_pd , 0xfff8, 0x0ca0, { 22, 22, 7}}, - {m68k_op_cmpi_32_di , 0xfff8, 0x0ca8, { 24, 24, 7}}, - {m68k_op_cmpi_32_ix , 0xfff8, 0x0cb0, { 26, 26, 9}}, - {m68k_op_cas_16_ai , 0xfff8, 0x0cd0, { 0, 0, 16}}, - {m68k_op_cas_16_pi , 0xfff8, 0x0cd8, { 0, 0, 16}}, - {m68k_op_cas_16_pd , 0xfff8, 0x0ce0, { 0, 0, 17}}, - {m68k_op_cas_16_di , 0xfff8, 0x0ce8, { 0, 0, 17}}, - {m68k_op_cas_16_ix , 0xfff8, 0x0cf0, { 0, 0, 19}}, - {m68k_op_moves_8_ai , 0xfff8, 0x0e10, { 0, 18, 9}}, - {m68k_op_moves_8_pi , 0xfff8, 0x0e18, { 0, 18, 9}}, - {m68k_op_moves_8_pd , 0xfff8, 0x0e20, { 0, 20, 10}}, - {m68k_op_moves_8_di , 0xfff8, 0x0e28, { 0, 26, 10}}, - {m68k_op_moves_8_ix , 0xfff8, 0x0e30, { 0, 30, 12}}, - {m68k_op_moves_16_ai , 0xfff8, 0x0e50, { 0, 18, 9}}, - {m68k_op_moves_16_pi , 0xfff8, 0x0e58, { 0, 18, 9}}, - {m68k_op_moves_16_pd , 0xfff8, 0x0e60, { 0, 20, 10}}, - {m68k_op_moves_16_di , 0xfff8, 0x0e68, { 0, 26, 10}}, - {m68k_op_moves_16_ix , 0xfff8, 0x0e70, { 0, 30, 12}}, - {m68k_op_moves_32_ai , 0xfff8, 0x0e90, { 0, 22, 9}}, - {m68k_op_moves_32_pi , 0xfff8, 0x0e98, { 0, 22, 9}}, - {m68k_op_moves_32_pd , 0xfff8, 0x0ea0, { 0, 28, 10}}, - {m68k_op_moves_32_di , 0xfff8, 0x0ea8, { 0, 32, 10}}, - {m68k_op_moves_32_ix , 0xfff8, 0x0eb0, { 0, 36, 12}}, - {m68k_op_cas_32_ai , 0xfff8, 0x0ed0, { 0, 0, 16}}, - {m68k_op_cas_32_pi , 0xfff8, 0x0ed8, { 0, 0, 16}}, - {m68k_op_cas_32_pd , 0xfff8, 0x0ee0, { 0, 0, 17}}, - {m68k_op_cas_32_di , 0xfff8, 0x0ee8, { 0, 0, 17}}, - {m68k_op_cas_32_ix , 0xfff8, 0x0ef0, { 0, 0, 19}}, - {m68k_op_move_8_aw_d , 0xfff8, 0x11c0, { 12, 12, 4}}, - {m68k_op_move_8_aw_ai , 0xfff8, 0x11d0, { 16, 16, 8}}, - {m68k_op_move_8_aw_pi , 0xfff8, 0x11d8, { 16, 16, 8}}, - {m68k_op_move_8_aw_pd , 0xfff8, 0x11e0, { 18, 18, 9}}, - {m68k_op_move_8_aw_di , 0xfff8, 0x11e8, { 20, 20, 9}}, - {m68k_op_move_8_aw_ix , 0xfff8, 0x11f0, { 22, 22, 11}}, - {m68k_op_move_8_al_d , 0xfff8, 0x13c0, { 16, 16, 6}}, - {m68k_op_move_8_al_ai , 0xfff8, 0x13d0, { 20, 20, 10}}, - {m68k_op_move_8_al_pi , 0xfff8, 0x13d8, { 20, 20, 10}}, - {m68k_op_move_8_al_pd , 0xfff8, 0x13e0, { 22, 22, 11}}, - {m68k_op_move_8_al_di , 0xfff8, 0x13e8, { 24, 24, 11}}, - {m68k_op_move_8_al_ix , 0xfff8, 0x13f0, { 26, 26, 13}}, - {m68k_op_move_8_pi7_d , 0xfff8, 0x1ec0, { 8, 8, 4}}, - {m68k_op_move_8_pi7_ai , 0xfff8, 0x1ed0, { 12, 12, 8}}, - {m68k_op_move_8_pi7_pi , 0xfff8, 0x1ed8, { 12, 12, 8}}, - {m68k_op_move_8_pi7_pd , 0xfff8, 0x1ee0, { 14, 14, 9}}, - {m68k_op_move_8_pi7_di , 0xfff8, 0x1ee8, { 16, 16, 9}}, - {m68k_op_move_8_pi7_ix , 0xfff8, 0x1ef0, { 18, 18, 11}}, - {m68k_op_move_8_pd7_d , 0xfff8, 0x1f00, { 8, 8, 5}}, - {m68k_op_move_8_pd7_ai , 0xfff8, 0x1f10, { 12, 12, 9}}, - {m68k_op_move_8_pd7_pi , 0xfff8, 0x1f18, { 12, 12, 9}}, - {m68k_op_move_8_pd7_pd , 0xfff8, 0x1f20, { 14, 14, 10}}, - {m68k_op_move_8_pd7_di , 0xfff8, 0x1f28, { 16, 16, 10}}, - {m68k_op_move_8_pd7_ix , 0xfff8, 0x1f30, { 18, 18, 12}}, - {m68k_op_move_32_aw_d , 0xfff8, 0x21c0, { 16, 16, 4}}, - {m68k_op_move_32_aw_a , 0xfff8, 0x21c8, { 16, 16, 4}}, - {m68k_op_move_32_aw_ai , 0xfff8, 0x21d0, { 24, 24, 8}}, - {m68k_op_move_32_aw_pi , 0xfff8, 0x21d8, { 24, 24, 8}}, - {m68k_op_move_32_aw_pd , 0xfff8, 0x21e0, { 26, 26, 9}}, - {m68k_op_move_32_aw_di , 0xfff8, 0x21e8, { 28, 28, 9}}, - {m68k_op_move_32_aw_ix , 0xfff8, 0x21f0, { 30, 30, 11}}, - {m68k_op_move_32_al_d , 0xfff8, 0x23c0, { 20, 20, 6}}, - {m68k_op_move_32_al_a , 0xfff8, 0x23c8, { 20, 20, 6}}, - {m68k_op_move_32_al_ai , 0xfff8, 0x23d0, { 28, 28, 10}}, - {m68k_op_move_32_al_pi , 0xfff8, 0x23d8, { 28, 28, 10}}, - {m68k_op_move_32_al_pd , 0xfff8, 0x23e0, { 30, 30, 11}}, - {m68k_op_move_32_al_di , 0xfff8, 0x23e8, { 32, 32, 11}}, - {m68k_op_move_32_al_ix , 0xfff8, 0x23f0, { 34, 34, 13}}, - {m68k_op_move_16_aw_d , 0xfff8, 0x31c0, { 12, 12, 4}}, - {m68k_op_move_16_aw_a , 0xfff8, 0x31c8, { 12, 12, 4}}, - {m68k_op_move_16_aw_ai , 0xfff8, 0x31d0, { 16, 16, 8}}, - {m68k_op_move_16_aw_pi , 0xfff8, 0x31d8, { 16, 16, 8}}, - {m68k_op_move_16_aw_pd , 0xfff8, 0x31e0, { 18, 18, 9}}, - {m68k_op_move_16_aw_di , 0xfff8, 0x31e8, { 20, 20, 9}}, - {m68k_op_move_16_aw_ix , 0xfff8, 0x31f0, { 22, 22, 11}}, - {m68k_op_move_16_al_d , 0xfff8, 0x33c0, { 16, 16, 6}}, - {m68k_op_move_16_al_a , 0xfff8, 0x33c8, { 16, 16, 6}}, - {m68k_op_move_16_al_ai , 0xfff8, 0x33d0, { 20, 20, 10}}, - {m68k_op_move_16_al_pi , 0xfff8, 0x33d8, { 20, 20, 10}}, - {m68k_op_move_16_al_pd , 0xfff8, 0x33e0, { 22, 22, 11}}, - {m68k_op_move_16_al_di , 0xfff8, 0x33e8, { 24, 24, 11}}, - {m68k_op_move_16_al_ix , 0xfff8, 0x33f0, { 26, 26, 13}}, - {m68k_op_negx_8_d , 0xfff8, 0x4000, { 4, 4, 2}}, - {m68k_op_negx_8_ai , 0xfff8, 0x4010, { 12, 12, 8}}, - {m68k_op_negx_8_pi , 0xfff8, 0x4018, { 12, 12, 8}}, - {m68k_op_negx_8_pd , 0xfff8, 0x4020, { 14, 14, 9}}, - {m68k_op_negx_8_di , 0xfff8, 0x4028, { 16, 16, 9}}, - {m68k_op_negx_8_ix , 0xfff8, 0x4030, { 18, 18, 11}}, - {m68k_op_negx_16_d , 0xfff8, 0x4040, { 4, 4, 2}}, - {m68k_op_negx_16_ai , 0xfff8, 0x4050, { 12, 12, 8}}, - {m68k_op_negx_16_pi , 0xfff8, 0x4058, { 12, 12, 8}}, - {m68k_op_negx_16_pd , 0xfff8, 0x4060, { 14, 14, 9}}, - {m68k_op_negx_16_di , 0xfff8, 0x4068, { 16, 16, 9}}, - {m68k_op_negx_16_ix , 0xfff8, 0x4070, { 18, 18, 11}}, - {m68k_op_negx_32_d , 0xfff8, 0x4080, { 6, 6, 2}}, - {m68k_op_negx_32_ai , 0xfff8, 0x4090, { 20, 20, 8}}, - {m68k_op_negx_32_pi , 0xfff8, 0x4098, { 20, 20, 8}}, - {m68k_op_negx_32_pd , 0xfff8, 0x40a0, { 22, 22, 9}}, - {m68k_op_negx_32_di , 0xfff8, 0x40a8, { 24, 24, 9}}, - {m68k_op_negx_32_ix , 0xfff8, 0x40b0, { 26, 26, 11}}, - {m68k_op_move_16_frs_d , 0xfff8, 0x40c0, { 6, 4, 8}}, - {m68k_op_move_16_frs_ai , 0xfff8, 0x40d0, { 12, 12, 12}}, - {m68k_op_move_16_frs_pi , 0xfff8, 0x40d8, { 12, 12, 12}}, - {m68k_op_move_16_frs_pd , 0xfff8, 0x40e0, { 14, 14, 13}}, - {m68k_op_move_16_frs_di , 0xfff8, 0x40e8, { 16, 16, 13}}, - {m68k_op_move_16_frs_ix , 0xfff8, 0x40f0, { 18, 18, 15}}, - {m68k_op_clr_8_d , 0xfff8, 0x4200, { 4, 4, 2}}, - {m68k_op_clr_8_ai , 0xfff8, 0x4210, { 12, 8, 8}}, - {m68k_op_clr_8_pi , 0xfff8, 0x4218, { 12, 8, 8}}, - {m68k_op_clr_8_pd , 0xfff8, 0x4220, { 14, 10, 9}}, - {m68k_op_clr_8_di , 0xfff8, 0x4228, { 16, 12, 9}}, - {m68k_op_clr_8_ix , 0xfff8, 0x4230, { 18, 14, 11}}, - {m68k_op_clr_16_d , 0xfff8, 0x4240, { 4, 4, 2}}, - {m68k_op_clr_16_ai , 0xfff8, 0x4250, { 12, 8, 8}}, - {m68k_op_clr_16_pi , 0xfff8, 0x4258, { 12, 8, 8}}, - {m68k_op_clr_16_pd , 0xfff8, 0x4260, { 14, 10, 9}}, - {m68k_op_clr_16_di , 0xfff8, 0x4268, { 16, 12, 9}}, - {m68k_op_clr_16_ix , 0xfff8, 0x4270, { 18, 14, 11}}, - {m68k_op_clr_32_d , 0xfff8, 0x4280, { 6, 6, 2}}, - {m68k_op_clr_32_ai , 0xfff8, 0x4290, { 20, 12, 8}}, - {m68k_op_clr_32_pi , 0xfff8, 0x4298, { 20, 12, 8}}, - {m68k_op_clr_32_pd , 0xfff8, 0x42a0, { 22, 14, 9}}, - {m68k_op_clr_32_di , 0xfff8, 0x42a8, { 24, 16, 9}}, - {m68k_op_clr_32_ix , 0xfff8, 0x42b0, { 26, 20, 11}}, - {m68k_op_move_16_frc_d , 0xfff8, 0x42c0, { 0, 4, 4}}, - {m68k_op_move_16_frc_ai , 0xfff8, 0x42d0, { 0, 12, 8}}, - {m68k_op_move_16_frc_pi , 0xfff8, 0x42d8, { 0, 12, 8}}, - {m68k_op_move_16_frc_pd , 0xfff8, 0x42e0, { 0, 14, 9}}, - {m68k_op_move_16_frc_di , 0xfff8, 0x42e8, { 0, 16, 9}}, - {m68k_op_move_16_frc_ix , 0xfff8, 0x42f0, { 0, 18, 11}}, - {m68k_op_neg_8_d , 0xfff8, 0x4400, { 4, 4, 2}}, - {m68k_op_neg_8_ai , 0xfff8, 0x4410, { 12, 12, 8}}, - {m68k_op_neg_8_pi , 0xfff8, 0x4418, { 12, 12, 8}}, - {m68k_op_neg_8_pd , 0xfff8, 0x4420, { 14, 14, 9}}, - {m68k_op_neg_8_di , 0xfff8, 0x4428, { 16, 16, 9}}, - {m68k_op_neg_8_ix , 0xfff8, 0x4430, { 18, 18, 11}}, - {m68k_op_neg_16_d , 0xfff8, 0x4440, { 4, 4, 2}}, - {m68k_op_neg_16_ai , 0xfff8, 0x4450, { 12, 12, 8}}, - {m68k_op_neg_16_pi , 0xfff8, 0x4458, { 12, 12, 8}}, - {m68k_op_neg_16_pd , 0xfff8, 0x4460, { 14, 14, 9}}, - {m68k_op_neg_16_di , 0xfff8, 0x4468, { 16, 16, 9}}, - {m68k_op_neg_16_ix , 0xfff8, 0x4470, { 18, 18, 11}}, - {m68k_op_neg_32_d , 0xfff8, 0x4480, { 6, 6, 2}}, - {m68k_op_neg_32_ai , 0xfff8, 0x4490, { 20, 20, 8}}, - {m68k_op_neg_32_pi , 0xfff8, 0x4498, { 20, 20, 8}}, - {m68k_op_neg_32_pd , 0xfff8, 0x44a0, { 22, 22, 9}}, - {m68k_op_neg_32_di , 0xfff8, 0x44a8, { 24, 24, 9}}, - {m68k_op_neg_32_ix , 0xfff8, 0x44b0, { 26, 26, 11}}, - {m68k_op_move_16_toc_d , 0xfff8, 0x44c0, { 12, 12, 4}}, - {m68k_op_move_16_toc_ai , 0xfff8, 0x44d0, { 16, 16, 8}}, - {m68k_op_move_16_toc_pi , 0xfff8, 0x44d8, { 16, 16, 8}}, - {m68k_op_move_16_toc_pd , 0xfff8, 0x44e0, { 18, 18, 9}}, - {m68k_op_move_16_toc_di , 0xfff8, 0x44e8, { 20, 20, 9}}, - {m68k_op_move_16_toc_ix , 0xfff8, 0x44f0, { 22, 22, 11}}, - {m68k_op_not_8_d , 0xfff8, 0x4600, { 4, 4, 2}}, - {m68k_op_not_8_ai , 0xfff8, 0x4610, { 12, 12, 8}}, - {m68k_op_not_8_pi , 0xfff8, 0x4618, { 12, 12, 8}}, - {m68k_op_not_8_pd , 0xfff8, 0x4620, { 14, 14, 9}}, - {m68k_op_not_8_di , 0xfff8, 0x4628, { 16, 16, 9}}, - {m68k_op_not_8_ix , 0xfff8, 0x4630, { 18, 18, 11}}, - {m68k_op_not_16_d , 0xfff8, 0x4640, { 4, 4, 2}}, - {m68k_op_not_16_ai , 0xfff8, 0x4650, { 12, 12, 8}}, - {m68k_op_not_16_pi , 0xfff8, 0x4658, { 12, 12, 8}}, - {m68k_op_not_16_pd , 0xfff8, 0x4660, { 14, 14, 9}}, - {m68k_op_not_16_di , 0xfff8, 0x4668, { 16, 16, 9}}, - {m68k_op_not_16_ix , 0xfff8, 0x4670, { 18, 18, 11}}, - {m68k_op_not_32_d , 0xfff8, 0x4680, { 6, 6, 2}}, - {m68k_op_not_32_ai , 0xfff8, 0x4690, { 20, 20, 8}}, - {m68k_op_not_32_pi , 0xfff8, 0x4698, { 20, 20, 8}}, - {m68k_op_not_32_pd , 0xfff8, 0x46a0, { 22, 22, 9}}, - {m68k_op_not_32_di , 0xfff8, 0x46a8, { 24, 24, 9}}, - {m68k_op_not_32_ix , 0xfff8, 0x46b0, { 26, 26, 11}}, - {m68k_op_move_16_tos_d , 0xfff8, 0x46c0, { 12, 12, 8}}, - {m68k_op_move_16_tos_ai , 0xfff8, 0x46d0, { 16, 16, 12}}, - {m68k_op_move_16_tos_pi , 0xfff8, 0x46d8, { 16, 16, 12}}, - {m68k_op_move_16_tos_pd , 0xfff8, 0x46e0, { 18, 18, 13}}, - {m68k_op_move_16_tos_di , 0xfff8, 0x46e8, { 20, 20, 13}}, - {m68k_op_move_16_tos_ix , 0xfff8, 0x46f0, { 22, 22, 15}}, - {m68k_op_nbcd_8_d , 0xfff8, 0x4800, { 6, 6, 6}}, - {m68k_op_link_32 , 0xfff8, 0x4808, { 0, 0, 6}}, - {m68k_op_nbcd_8_ai , 0xfff8, 0x4810, { 12, 12, 10}}, - {m68k_op_nbcd_8_pi , 0xfff8, 0x4818, { 12, 12, 10}}, - {m68k_op_nbcd_8_pd , 0xfff8, 0x4820, { 14, 14, 11}}, - {m68k_op_nbcd_8_di , 0xfff8, 0x4828, { 16, 16, 11}}, - {m68k_op_nbcd_8_ix , 0xfff8, 0x4830, { 18, 18, 13}}, - {m68k_op_swap_32 , 0xfff8, 0x4840, { 4, 4, 4}}, - {m68k_op_bkpt , 0xfff8, 0x4848, { 0, 10, 10}}, - {m68k_op_pea_32_ai , 0xfff8, 0x4850, { 10, 10, 9}}, - {m68k_op_pea_32_di , 0xfff8, 0x4868, { 16, 16, 10}}, - {m68k_op_pea_32_ix , 0xfff8, 0x4870, { 20, 20, 12}}, - {m68k_op_ext_16 , 0xfff8, 0x4880, { 4, 4, 4}}, - {m68k_op_movem_16_re_ai , 0xfff8, 0x4890, { 12, 12, 8}}, - {m68k_op_movem_16_re_pd , 0xfff8, 0x48a0, { 8, 8, 4}}, - {m68k_op_movem_16_re_di , 0xfff8, 0x48a8, { 16, 16, 9}}, - {m68k_op_movem_16_re_ix , 0xfff8, 0x48b0, { 18, 18, 11}}, - {m68k_op_ext_32 , 0xfff8, 0x48c0, { 4, 4, 4}}, - {m68k_op_movem_32_re_ai , 0xfff8, 0x48d0, { 16, 16, 8}}, - {m68k_op_movem_32_re_pd , 0xfff8, 0x48e0, { 8, 8, 4}}, - {m68k_op_movem_32_re_di , 0xfff8, 0x48e8, { 20, 20, 9}}, - {m68k_op_movem_32_re_ix , 0xfff8, 0x48f0, { 22, 22, 11}}, - {m68k_op_extb_32 , 0xfff8, 0x49c0, { 0, 0, 4}}, - {m68k_op_tst_8_d , 0xfff8, 0x4a00, { 4, 4, 2}}, - {m68k_op_tst_8_ai , 0xfff8, 0x4a10, { 8, 8, 6}}, - {m68k_op_tst_8_pi , 0xfff8, 0x4a18, { 8, 8, 6}}, - {m68k_op_tst_8_pd , 0xfff8, 0x4a20, { 10, 10, 7}}, - {m68k_op_tst_8_di , 0xfff8, 0x4a28, { 12, 12, 7}}, - {m68k_op_tst_8_ix , 0xfff8, 0x4a30, { 14, 14, 9}}, - {m68k_op_tst_16_d , 0xfff8, 0x4a40, { 4, 4, 2}}, - {m68k_op_tst_16_a , 0xfff8, 0x4a48, { 0, 0, 2}}, - {m68k_op_tst_16_ai , 0xfff8, 0x4a50, { 8, 8, 6}}, - {m68k_op_tst_16_pi , 0xfff8, 0x4a58, { 8, 8, 6}}, - {m68k_op_tst_16_pd , 0xfff8, 0x4a60, { 10, 10, 7}}, - {m68k_op_tst_16_di , 0xfff8, 0x4a68, { 12, 12, 7}}, - {m68k_op_tst_16_ix , 0xfff8, 0x4a70, { 14, 14, 9}}, - {m68k_op_tst_32_d , 0xfff8, 0x4a80, { 4, 4, 2}}, - {m68k_op_tst_32_a , 0xfff8, 0x4a88, { 0, 0, 2}}, - {m68k_op_tst_32_ai , 0xfff8, 0x4a90, { 12, 12, 6}}, - {m68k_op_tst_32_pi , 0xfff8, 0x4a98, { 12, 12, 6}}, - {m68k_op_tst_32_pd , 0xfff8, 0x4aa0, { 14, 14, 7}}, - {m68k_op_tst_32_di , 0xfff8, 0x4aa8, { 16, 16, 7}}, - {m68k_op_tst_32_ix , 0xfff8, 0x4ab0, { 18, 18, 9}}, - {m68k_op_tas_8_d , 0xfff8, 0x4ac0, { 4, 4, 4}}, - {m68k_op_tas_8_ai , 0xfff8, 0x4ad0, { 18, 18, 16}}, - {m68k_op_tas_8_pi , 0xfff8, 0x4ad8, { 18, 18, 16}}, - {m68k_op_tas_8_pd , 0xfff8, 0x4ae0, { 20, 20, 17}}, - {m68k_op_tas_8_di , 0xfff8, 0x4ae8, { 22, 22, 17}}, - {m68k_op_tas_8_ix , 0xfff8, 0x4af0, { 24, 24, 19}}, - {m68k_op_mull_32_d , 0xfff8, 0x4c00, { 0, 0, 43}}, - {m68k_op_mull_32_ai , 0xfff8, 0x4c10, { 0, 0, 47}}, - {m68k_op_mull_32_pi , 0xfff8, 0x4c18, { 0, 0, 47}}, - {m68k_op_mull_32_pd , 0xfff8, 0x4c20, { 0, 0, 48}}, - {m68k_op_mull_32_di , 0xfff8, 0x4c28, { 0, 0, 48}}, - {m68k_op_mull_32_ix , 0xfff8, 0x4c30, { 0, 0, 50}}, - {m68k_op_divl_32_d , 0xfff8, 0x4c40, { 0, 0, 84}}, - {m68k_op_divl_32_ai , 0xfff8, 0x4c50, { 0, 0, 88}}, - {m68k_op_divl_32_pi , 0xfff8, 0x4c58, { 0, 0, 88}}, - {m68k_op_divl_32_pd , 0xfff8, 0x4c60, { 0, 0, 89}}, - {m68k_op_divl_32_di , 0xfff8, 0x4c68, { 0, 0, 89}}, - {m68k_op_divl_32_ix , 0xfff8, 0x4c70, { 0, 0, 91}}, - {m68k_op_movem_16_er_ai , 0xfff8, 0x4c90, { 16, 16, 12}}, - {m68k_op_movem_16_er_pi , 0xfff8, 0x4c98, { 12, 12, 8}}, - {m68k_op_movem_16_er_di , 0xfff8, 0x4ca8, { 20, 20, 13}}, - {m68k_op_movem_16_er_ix , 0xfff8, 0x4cb0, { 22, 22, 15}}, - {m68k_op_movem_32_er_ai , 0xfff8, 0x4cd0, { 20, 20, 12}}, - {m68k_op_movem_32_er_pi , 0xfff8, 0x4cd8, { 12, 12, 8}}, - {m68k_op_movem_32_er_di , 0xfff8, 0x4ce8, { 24, 24, 13}}, - {m68k_op_movem_32_er_ix , 0xfff8, 0x4cf0, { 26, 26, 15}}, - {m68k_op_link_16 , 0xfff8, 0x4e50, { 16, 16, 5}}, - {m68k_op_unlk_32 , 0xfff8, 0x4e58, { 12, 12, 6}}, - {m68k_op_move_32_tou , 0xfff8, 0x4e60, { 4, 6, 2}}, - {m68k_op_move_32_fru , 0xfff8, 0x4e68, { 4, 6, 2}}, - {m68k_op_jsr_32_ai , 0xfff8, 0x4e90, { 16, 16, 4}}, - {m68k_op_jsr_32_di , 0xfff8, 0x4ea8, { 18, 18, 5}}, - {m68k_op_jsr_32_ix , 0xfff8, 0x4eb0, { 22, 22, 7}}, - {m68k_op_jmp_32_ai , 0xfff8, 0x4ed0, { 8, 8, 4}}, - {m68k_op_jmp_32_di , 0xfff8, 0x4ee8, { 10, 10, 5}}, - {m68k_op_jmp_32_ix , 0xfff8, 0x4ef0, { 12, 12, 7}}, - {m68k_op_st_8_d , 0xfff8, 0x50c0, { 6, 4, 4}}, - {m68k_op_dbt_16 , 0xfff8, 0x50c8, { 12, 12, 6}}, - {m68k_op_st_8_ai , 0xfff8, 0x50d0, { 12, 12, 10}}, - {m68k_op_st_8_pi , 0xfff8, 0x50d8, { 12, 12, 10}}, - {m68k_op_st_8_pd , 0xfff8, 0x50e0, { 14, 14, 11}}, - {m68k_op_st_8_di , 0xfff8, 0x50e8, { 16, 16, 11}}, - {m68k_op_st_8_ix , 0xfff8, 0x50f0, { 18, 18, 13}}, - {m68k_op_sf_8_d , 0xfff8, 0x51c0, { 4, 4, 4}}, - {m68k_op_dbf_16 , 0xfff8, 0x51c8, { 14, 14, 6}}, - {m68k_op_sf_8_ai , 0xfff8, 0x51d0, { 12, 12, 10}}, - {m68k_op_sf_8_pi , 0xfff8, 0x51d8, { 12, 12, 10}}, - {m68k_op_sf_8_pd , 0xfff8, 0x51e0, { 14, 14, 11}}, - {m68k_op_sf_8_di , 0xfff8, 0x51e8, { 16, 16, 11}}, - {m68k_op_sf_8_ix , 0xfff8, 0x51f0, { 18, 18, 13}}, - {m68k_op_shi_8_d , 0xfff8, 0x52c0, { 4, 4, 4}}, - {m68k_op_dbhi_16 , 0xfff8, 0x52c8, { 12, 12, 6}}, - {m68k_op_shi_8_ai , 0xfff8, 0x52d0, { 12, 12, 10}}, - {m68k_op_shi_8_pi , 0xfff8, 0x52d8, { 12, 12, 10}}, - {m68k_op_shi_8_pd , 0xfff8, 0x52e0, { 14, 14, 11}}, - {m68k_op_shi_8_di , 0xfff8, 0x52e8, { 16, 16, 11}}, - {m68k_op_shi_8_ix , 0xfff8, 0x52f0, { 18, 18, 13}}, - {m68k_op_sls_8_d , 0xfff8, 0x53c0, { 4, 4, 4}}, - {m68k_op_dbls_16 , 0xfff8, 0x53c8, { 12, 12, 6}}, - {m68k_op_sls_8_ai , 0xfff8, 0x53d0, { 12, 12, 10}}, - {m68k_op_sls_8_pi , 0xfff8, 0x53d8, { 12, 12, 10}}, - {m68k_op_sls_8_pd , 0xfff8, 0x53e0, { 14, 14, 11}}, - {m68k_op_sls_8_di , 0xfff8, 0x53e8, { 16, 16, 11}}, - {m68k_op_sls_8_ix , 0xfff8, 0x53f0, { 18, 18, 13}}, - {m68k_op_scc_8_d , 0xfff8, 0x54c0, { 4, 4, 4}}, - {m68k_op_dbcc_16 , 0xfff8, 0x54c8, { 12, 12, 6}}, - {m68k_op_scc_8_ai , 0xfff8, 0x54d0, { 12, 12, 10}}, - {m68k_op_scc_8_pi , 0xfff8, 0x54d8, { 12, 12, 10}}, - {m68k_op_scc_8_pd , 0xfff8, 0x54e0, { 14, 14, 11}}, - {m68k_op_scc_8_di , 0xfff8, 0x54e8, { 16, 16, 11}}, - {m68k_op_scc_8_ix , 0xfff8, 0x54f0, { 18, 18, 13}}, - {m68k_op_scs_8_d , 0xfff8, 0x55c0, { 4, 4, 4}}, - {m68k_op_dbcs_16 , 0xfff8, 0x55c8, { 12, 12, 6}}, - {m68k_op_scs_8_ai , 0xfff8, 0x55d0, { 12, 12, 10}}, - {m68k_op_scs_8_pi , 0xfff8, 0x55d8, { 12, 12, 10}}, - {m68k_op_scs_8_pd , 0xfff8, 0x55e0, { 14, 14, 11}}, - {m68k_op_scs_8_di , 0xfff8, 0x55e8, { 16, 16, 11}}, - {m68k_op_scs_8_ix , 0xfff8, 0x55f0, { 18, 18, 13}}, - {m68k_op_sne_8_d , 0xfff8, 0x56c0, { 4, 4, 4}}, - {m68k_op_dbne_16 , 0xfff8, 0x56c8, { 12, 12, 6}}, - {m68k_op_sne_8_ai , 0xfff8, 0x56d0, { 12, 12, 10}}, - {m68k_op_sne_8_pi , 0xfff8, 0x56d8, { 12, 12, 10}}, - {m68k_op_sne_8_pd , 0xfff8, 0x56e0, { 14, 14, 11}}, - {m68k_op_sne_8_di , 0xfff8, 0x56e8, { 16, 16, 11}}, - {m68k_op_sne_8_ix , 0xfff8, 0x56f0, { 18, 18, 13}}, - {m68k_op_seq_8_d , 0xfff8, 0x57c0, { 4, 4, 4}}, - {m68k_op_dbeq_16 , 0xfff8, 0x57c8, { 12, 12, 6}}, - {m68k_op_seq_8_ai , 0xfff8, 0x57d0, { 12, 12, 10}}, - {m68k_op_seq_8_pi , 0xfff8, 0x57d8, { 12, 12, 10}}, - {m68k_op_seq_8_pd , 0xfff8, 0x57e0, { 14, 14, 11}}, - {m68k_op_seq_8_di , 0xfff8, 0x57e8, { 16, 16, 11}}, - {m68k_op_seq_8_ix , 0xfff8, 0x57f0, { 18, 18, 13}}, - {m68k_op_svc_8_d , 0xfff8, 0x58c0, { 4, 4, 4}}, - {m68k_op_dbvc_16 , 0xfff8, 0x58c8, { 12, 12, 6}}, - {m68k_op_svc_8_ai , 0xfff8, 0x58d0, { 12, 12, 10}}, - {m68k_op_svc_8_pi , 0xfff8, 0x58d8, { 12, 12, 10}}, - {m68k_op_svc_8_pd , 0xfff8, 0x58e0, { 14, 14, 11}}, - {m68k_op_svc_8_di , 0xfff8, 0x58e8, { 16, 16, 11}}, - {m68k_op_svc_8_ix , 0xfff8, 0x58f0, { 18, 18, 13}}, - {m68k_op_svs_8_d , 0xfff8, 0x59c0, { 4, 4, 4}}, - {m68k_op_dbvs_16 , 0xfff8, 0x59c8, { 12, 12, 6}}, - {m68k_op_svs_8_ai , 0xfff8, 0x59d0, { 12, 12, 10}}, - {m68k_op_svs_8_pi , 0xfff8, 0x59d8, { 12, 12, 10}}, - {m68k_op_svs_8_pd , 0xfff8, 0x59e0, { 14, 14, 11}}, - {m68k_op_svs_8_di , 0xfff8, 0x59e8, { 16, 16, 11}}, - {m68k_op_svs_8_ix , 0xfff8, 0x59f0, { 18, 18, 13}}, - {m68k_op_spl_8_d , 0xfff8, 0x5ac0, { 4, 4, 4}}, - {m68k_op_dbpl_16 , 0xfff8, 0x5ac8, { 12, 12, 6}}, - {m68k_op_spl_8_ai , 0xfff8, 0x5ad0, { 12, 12, 10}}, - {m68k_op_spl_8_pi , 0xfff8, 0x5ad8, { 12, 12, 10}}, - {m68k_op_spl_8_pd , 0xfff8, 0x5ae0, { 14, 14, 11}}, - {m68k_op_spl_8_di , 0xfff8, 0x5ae8, { 16, 16, 11}}, - {m68k_op_spl_8_ix , 0xfff8, 0x5af0, { 18, 18, 13}}, - {m68k_op_smi_8_d , 0xfff8, 0x5bc0, { 4, 4, 4}}, - {m68k_op_dbmi_16 , 0xfff8, 0x5bc8, { 12, 12, 6}}, - {m68k_op_smi_8_ai , 0xfff8, 0x5bd0, { 12, 12, 10}}, - {m68k_op_smi_8_pi , 0xfff8, 0x5bd8, { 12, 12, 10}}, - {m68k_op_smi_8_pd , 0xfff8, 0x5be0, { 14, 14, 11}}, - {m68k_op_smi_8_di , 0xfff8, 0x5be8, { 16, 16, 11}}, - {m68k_op_smi_8_ix , 0xfff8, 0x5bf0, { 18, 18, 13}}, - {m68k_op_sge_8_d , 0xfff8, 0x5cc0, { 4, 4, 4}}, - {m68k_op_dbge_16 , 0xfff8, 0x5cc8, { 12, 12, 6}}, - {m68k_op_sge_8_ai , 0xfff8, 0x5cd0, { 12, 12, 10}}, - {m68k_op_sge_8_pi , 0xfff8, 0x5cd8, { 12, 12, 10}}, - {m68k_op_sge_8_pd , 0xfff8, 0x5ce0, { 14, 14, 11}}, - {m68k_op_sge_8_di , 0xfff8, 0x5ce8, { 16, 16, 11}}, - {m68k_op_sge_8_ix , 0xfff8, 0x5cf0, { 18, 18, 13}}, - {m68k_op_slt_8_d , 0xfff8, 0x5dc0, { 4, 4, 4}}, - {m68k_op_dblt_16 , 0xfff8, 0x5dc8, { 12, 12, 6}}, - {m68k_op_slt_8_ai , 0xfff8, 0x5dd0, { 12, 12, 10}}, - {m68k_op_slt_8_pi , 0xfff8, 0x5dd8, { 12, 12, 10}}, - {m68k_op_slt_8_pd , 0xfff8, 0x5de0, { 14, 14, 11}}, - {m68k_op_slt_8_di , 0xfff8, 0x5de8, { 16, 16, 11}}, - {m68k_op_slt_8_ix , 0xfff8, 0x5df0, { 18, 18, 13}}, - {m68k_op_sgt_8_d , 0xfff8, 0x5ec0, { 4, 4, 4}}, - {m68k_op_dbgt_16 , 0xfff8, 0x5ec8, { 12, 12, 6}}, - {m68k_op_sgt_8_ai , 0xfff8, 0x5ed0, { 12, 12, 10}}, - {m68k_op_sgt_8_pi , 0xfff8, 0x5ed8, { 12, 12, 10}}, - {m68k_op_sgt_8_pd , 0xfff8, 0x5ee0, { 14, 14, 11}}, - {m68k_op_sgt_8_di , 0xfff8, 0x5ee8, { 16, 16, 11}}, - {m68k_op_sgt_8_ix , 0xfff8, 0x5ef0, { 18, 18, 13}}, - {m68k_op_sle_8_d , 0xfff8, 0x5fc0, { 4, 4, 4}}, - {m68k_op_dble_16 , 0xfff8, 0x5fc8, { 12, 12, 6}}, - {m68k_op_sle_8_ai , 0xfff8, 0x5fd0, { 12, 12, 10}}, - {m68k_op_sle_8_pi , 0xfff8, 0x5fd8, { 12, 12, 10}}, - {m68k_op_sle_8_pd , 0xfff8, 0x5fe0, { 14, 14, 11}}, - {m68k_op_sle_8_di , 0xfff8, 0x5fe8, { 16, 16, 11}}, - {m68k_op_sle_8_ix , 0xfff8, 0x5ff0, { 18, 18, 13}}, - {m68k_op_sbcd_8_mm_ax7 , 0xfff8, 0x8f08, { 18, 18, 16}}, - {m68k_op_pack_16_mm_ax7 , 0xfff8, 0x8f48, { 0, 0, 13}}, - {m68k_op_unpk_16_mm_ax7 , 0xfff8, 0x8f88, { 0, 0, 13}}, - {m68k_op_subx_8_mm_ax7 , 0xfff8, 0x9f08, { 18, 18, 12}}, - {m68k_op_cmpm_8_ax7 , 0xfff8, 0xbf08, { 12, 12, 9}}, - {m68k_op_abcd_8_mm_ax7 , 0xfff8, 0xcf08, { 18, 18, 16}}, - {m68k_op_addx_8_mm_ax7 , 0xfff8, 0xdf08, { 18, 18, 12}}, - {m68k_op_asr_16_ai , 0xfff8, 0xe0d0, { 12, 12, 9}}, - {m68k_op_asr_16_pi , 0xfff8, 0xe0d8, { 12, 12, 9}}, - {m68k_op_asr_16_pd , 0xfff8, 0xe0e0, { 14, 14, 10}}, - {m68k_op_asr_16_di , 0xfff8, 0xe0e8, { 16, 16, 10}}, - {m68k_op_asr_16_ix , 0xfff8, 0xe0f0, { 18, 18, 12}}, - {m68k_op_asl_16_ai , 0xfff8, 0xe1d0, { 12, 12, 10}}, - {m68k_op_asl_16_pi , 0xfff8, 0xe1d8, { 12, 12, 10}}, - {m68k_op_asl_16_pd , 0xfff8, 0xe1e0, { 14, 14, 11}}, - {m68k_op_asl_16_di , 0xfff8, 0xe1e8, { 16, 16, 11}}, - {m68k_op_asl_16_ix , 0xfff8, 0xe1f0, { 18, 18, 13}}, - {m68k_op_lsr_16_ai , 0xfff8, 0xe2d0, { 12, 12, 9}}, - {m68k_op_lsr_16_pi , 0xfff8, 0xe2d8, { 12, 12, 9}}, - {m68k_op_lsr_16_pd , 0xfff8, 0xe2e0, { 14, 14, 10}}, - {m68k_op_lsr_16_di , 0xfff8, 0xe2e8, { 16, 16, 10}}, - {m68k_op_lsr_16_ix , 0xfff8, 0xe2f0, { 18, 18, 12}}, - {m68k_op_lsl_16_ai , 0xfff8, 0xe3d0, { 12, 12, 9}}, - {m68k_op_lsl_16_pi , 0xfff8, 0xe3d8, { 12, 12, 9}}, - {m68k_op_lsl_16_pd , 0xfff8, 0xe3e0, { 14, 14, 10}}, - {m68k_op_lsl_16_di , 0xfff8, 0xe3e8, { 16, 16, 10}}, - {m68k_op_lsl_16_ix , 0xfff8, 0xe3f0, { 18, 18, 12}}, - {m68k_op_roxr_16_ai , 0xfff8, 0xe4d0, { 12, 12, 9}}, - {m68k_op_roxr_16_pi , 0xfff8, 0xe4d8, { 12, 12, 9}}, - {m68k_op_roxr_16_pd , 0xfff8, 0xe4e0, { 14, 14, 10}}, - {m68k_op_roxr_16_di , 0xfff8, 0xe4e8, { 16, 16, 10}}, - {m68k_op_roxr_16_ix , 0xfff8, 0xe4f0, { 18, 18, 12}}, - {m68k_op_roxl_16_ai , 0xfff8, 0xe5d0, { 12, 12, 9}}, - {m68k_op_roxl_16_pi , 0xfff8, 0xe5d8, { 12, 12, 9}}, - {m68k_op_roxl_16_pd , 0xfff8, 0xe5e0, { 14, 14, 10}}, - {m68k_op_roxl_16_di , 0xfff8, 0xe5e8, { 16, 16, 10}}, - {m68k_op_roxl_16_ix , 0xfff8, 0xe5f0, { 18, 18, 12}}, - {m68k_op_ror_16_ai , 0xfff8, 0xe6d0, { 12, 12, 11}}, - {m68k_op_ror_16_pi , 0xfff8, 0xe6d8, { 12, 12, 11}}, - {m68k_op_ror_16_pd , 0xfff8, 0xe6e0, { 14, 14, 12}}, - {m68k_op_ror_16_di , 0xfff8, 0xe6e8, { 16, 16, 12}}, - {m68k_op_ror_16_ix , 0xfff8, 0xe6f0, { 18, 18, 14}}, - {m68k_op_rol_16_ai , 0xfff8, 0xe7d0, { 12, 12, 11}}, - {m68k_op_rol_16_pi , 0xfff8, 0xe7d8, { 12, 12, 11}}, - {m68k_op_rol_16_pd , 0xfff8, 0xe7e0, { 14, 14, 12}}, - {m68k_op_rol_16_di , 0xfff8, 0xe7e8, { 16, 16, 12}}, - {m68k_op_rol_16_ix , 0xfff8, 0xe7f0, { 18, 18, 14}}, - {m68k_op_bftst_32_d , 0xfff8, 0xe8c0, { 0, 0, 6}}, - {m68k_op_bftst_32_ai , 0xfff8, 0xe8d0, { 0, 0, 17}}, - {m68k_op_bftst_32_di , 0xfff8, 0xe8e8, { 0, 0, 18}}, - {m68k_op_bftst_32_ix , 0xfff8, 0xe8f0, { 0, 0, 20}}, - {m68k_op_bfextu_32_d , 0xfff8, 0xe9c0, { 0, 0, 8}}, - {m68k_op_bfextu_32_ai , 0xfff8, 0xe9d0, { 0, 0, 19}}, - {m68k_op_bfextu_32_di , 0xfff8, 0xe9e8, { 0, 0, 20}}, - {m68k_op_bfextu_32_ix , 0xfff8, 0xe9f0, { 0, 0, 22}}, - {m68k_op_bfchg_32_d , 0xfff8, 0xeac0, { 0, 0, 12}}, - {m68k_op_bfchg_32_ai , 0xfff8, 0xead0, { 0, 0, 24}}, - {m68k_op_bfchg_32_di , 0xfff8, 0xeae8, { 0, 0, 25}}, - {m68k_op_bfchg_32_ix , 0xfff8, 0xeaf0, { 0, 0, 27}}, - {m68k_op_bfexts_32_d , 0xfff8, 0xebc0, { 0, 0, 8}}, - {m68k_op_bfexts_32_ai , 0xfff8, 0xebd0, { 0, 0, 19}}, - {m68k_op_bfexts_32_di , 0xfff8, 0xebe8, { 0, 0, 20}}, - {m68k_op_bfexts_32_ix , 0xfff8, 0xebf0, { 0, 0, 22}}, - {m68k_op_bfclr_32_d , 0xfff8, 0xecc0, { 0, 0, 12}}, - {m68k_op_bfclr_32_ai , 0xfff8, 0xecd0, { 0, 0, 24}}, - {m68k_op_bfclr_32_di , 0xfff8, 0xece8, { 0, 0, 25}}, - {m68k_op_bfclr_32_ix , 0xfff8, 0xecf0, { 0, 0, 27}}, - {m68k_op_bfffo_32_d , 0xfff8, 0xedc0, { 0, 0, 18}}, - {m68k_op_bfffo_32_ai , 0xfff8, 0xedd0, { 0, 0, 32}}, - {m68k_op_bfffo_32_di , 0xfff8, 0xede8, { 0, 0, 33}}, - {m68k_op_bfffo_32_ix , 0xfff8, 0xedf0, { 0, 0, 35}}, - {m68k_op_bfset_32_d , 0xfff8, 0xeec0, { 0, 0, 12}}, - {m68k_op_bfset_32_ai , 0xfff8, 0xeed0, { 0, 0, 24}}, - {m68k_op_bfset_32_di , 0xfff8, 0xeee8, { 0, 0, 25}}, - {m68k_op_bfset_32_ix , 0xfff8, 0xeef0, { 0, 0, 27}}, - {m68k_op_bfins_32_d , 0xfff8, 0xefc0, { 0, 0, 10}}, - {m68k_op_bfins_32_ai , 0xfff8, 0xefd0, { 0, 0, 21}}, - {m68k_op_bfins_32_di , 0xfff8, 0xefe8, { 0, 0, 22}}, - {m68k_op_bfins_32_ix , 0xfff8, 0xeff0, { 0, 0, 24}}, - {m68k_op_ori_8_pi7 , 0xffff, 0x001f, { 16, 16, 8}}, - {m68k_op_ori_8_pd7 , 0xffff, 0x0027, { 18, 18, 9}}, - {m68k_op_ori_8_aw , 0xffff, 0x0038, { 20, 20, 8}}, - {m68k_op_ori_8_al , 0xffff, 0x0039, { 24, 24, 8}}, - {m68k_op_ori_16_toc , 0xffff, 0x003c, { 20, 16, 12}}, - {m68k_op_ori_16_aw , 0xffff, 0x0078, { 20, 20, 8}}, - {m68k_op_ori_16_al , 0xffff, 0x0079, { 24, 24, 8}}, - {m68k_op_ori_16_tos , 0xffff, 0x007c, { 20, 16, 12}}, - {m68k_op_ori_32_aw , 0xffff, 0x00b8, { 32, 32, 8}}, - {m68k_op_ori_32_al , 0xffff, 0x00b9, { 36, 36, 8}}, - {m68k_op_chk2cmp2_8_aw , 0xffff, 0x00f8, { 0, 0, 22}}, - {m68k_op_chk2cmp2_8_al , 0xffff, 0x00f9, { 0, 0, 22}}, - {m68k_op_chk2cmp2_8_pcdi , 0xffff, 0x00fa, { 0, 0, 23}}, - {m68k_op_chk2cmp2_8_pcix , 0xffff, 0x00fb, { 0, 0, 25}}, - {m68k_op_andi_8_pi7 , 0xffff, 0x021f, { 16, 16, 8}}, - {m68k_op_andi_8_pd7 , 0xffff, 0x0227, { 18, 18, 9}}, - {m68k_op_andi_8_aw , 0xffff, 0x0238, { 20, 20, 8}}, - {m68k_op_andi_8_al , 0xffff, 0x0239, { 24, 24, 8}}, - {m68k_op_andi_16_toc , 0xffff, 0x023c, { 20, 16, 12}}, - {m68k_op_andi_16_aw , 0xffff, 0x0278, { 20, 20, 8}}, - {m68k_op_andi_16_al , 0xffff, 0x0279, { 24, 24, 8}}, - {m68k_op_andi_16_tos , 0xffff, 0x027c, { 20, 16, 12}}, - {m68k_op_andi_32_aw , 0xffff, 0x02b8, { 32, 32, 8}}, - {m68k_op_andi_32_al , 0xffff, 0x02b9, { 36, 36, 8}}, - {m68k_op_chk2cmp2_16_aw , 0xffff, 0x02f8, { 0, 0, 22}}, - {m68k_op_chk2cmp2_16_al , 0xffff, 0x02f9, { 0, 0, 22}}, - {m68k_op_chk2cmp2_16_pcdi , 0xffff, 0x02fa, { 0, 0, 23}}, - {m68k_op_chk2cmp2_16_pcix , 0xffff, 0x02fb, { 0, 0, 25}}, - {m68k_op_subi_8_pi7 , 0xffff, 0x041f, { 16, 16, 8}}, - {m68k_op_subi_8_pd7 , 0xffff, 0x0427, { 18, 18, 9}}, - {m68k_op_subi_8_aw , 0xffff, 0x0438, { 20, 20, 8}}, - {m68k_op_subi_8_al , 0xffff, 0x0439, { 24, 24, 8}}, - {m68k_op_subi_16_aw , 0xffff, 0x0478, { 20, 20, 8}}, - {m68k_op_subi_16_al , 0xffff, 0x0479, { 24, 24, 8}}, - {m68k_op_subi_32_aw , 0xffff, 0x04b8, { 32, 32, 8}}, - {m68k_op_subi_32_al , 0xffff, 0x04b9, { 36, 36, 8}}, - {m68k_op_chk2cmp2_32_aw , 0xffff, 0x04f8, { 0, 0, 22}}, - {m68k_op_chk2cmp2_32_al , 0xffff, 0x04f9, { 0, 0, 22}}, - {m68k_op_chk2cmp2_32_pcdi , 0xffff, 0x04fa, { 0, 0, 23}}, - {m68k_op_chk2cmp2_32_pcix , 0xffff, 0x04fb, { 0, 0, 25}}, - {m68k_op_addi_8_pi7 , 0xffff, 0x061f, { 16, 16, 8}}, - {m68k_op_addi_8_pd7 , 0xffff, 0x0627, { 18, 18, 9}}, - {m68k_op_addi_8_aw , 0xffff, 0x0638, { 20, 20, 8}}, - {m68k_op_addi_8_al , 0xffff, 0x0639, { 24, 24, 8}}, - {m68k_op_addi_16_aw , 0xffff, 0x0678, { 20, 20, 8}}, - {m68k_op_addi_16_al , 0xffff, 0x0679, { 24, 24, 8}}, - {m68k_op_addi_32_aw , 0xffff, 0x06b8, { 32, 32, 8}}, - {m68k_op_addi_32_al , 0xffff, 0x06b9, { 36, 36, 8}}, - {m68k_op_callm_32_aw , 0xffff, 0x06f8, { 0, 0, 64}}, - {m68k_op_callm_32_al , 0xffff, 0x06f9, { 0, 0, 64}}, - {m68k_op_callm_32_pcdi , 0xffff, 0x06fa, { 0, 0, 65}}, - {m68k_op_callm_32_pcix , 0xffff, 0x06fb, { 0, 0, 67}}, - {m68k_op_btst_8_s_pi7 , 0xffff, 0x081f, { 12, 12, 8}}, - {m68k_op_btst_8_s_pd7 , 0xffff, 0x0827, { 14, 14, 9}}, - {m68k_op_btst_8_s_aw , 0xffff, 0x0838, { 16, 16, 8}}, - {m68k_op_btst_8_s_al , 0xffff, 0x0839, { 20, 20, 8}}, - {m68k_op_btst_8_s_pcdi , 0xffff, 0x083a, { 16, 16, 9}}, - {m68k_op_btst_8_s_pcix , 0xffff, 0x083b, { 18, 18, 11}}, - {m68k_op_bchg_8_s_pi7 , 0xffff, 0x085f, { 16, 16, 8}}, - {m68k_op_bchg_8_s_pd7 , 0xffff, 0x0867, { 18, 18, 9}}, - {m68k_op_bchg_8_s_aw , 0xffff, 0x0878, { 20, 20, 8}}, - {m68k_op_bchg_8_s_al , 0xffff, 0x0879, { 24, 24, 8}}, - {m68k_op_bclr_8_s_pi7 , 0xffff, 0x089f, { 16, 16, 8}}, - {m68k_op_bclr_8_s_pd7 , 0xffff, 0x08a7, { 18, 18, 9}}, - {m68k_op_bclr_8_s_aw , 0xffff, 0x08b8, { 20, 20, 8}}, - {m68k_op_bclr_8_s_al , 0xffff, 0x08b9, { 24, 24, 8}}, - {m68k_op_bset_8_s_pi7 , 0xffff, 0x08df, { 16, 16, 8}}, - {m68k_op_bset_8_s_pd7 , 0xffff, 0x08e7, { 18, 18, 9}}, - {m68k_op_bset_8_s_aw , 0xffff, 0x08f8, { 20, 20, 8}}, - {m68k_op_bset_8_s_al , 0xffff, 0x08f9, { 24, 24, 8}}, - {m68k_op_eori_8_pi7 , 0xffff, 0x0a1f, { 16, 16, 8}}, - {m68k_op_eori_8_pd7 , 0xffff, 0x0a27, { 18, 18, 9}}, - {m68k_op_eori_8_aw , 0xffff, 0x0a38, { 20, 20, 8}}, - {m68k_op_eori_8_al , 0xffff, 0x0a39, { 24, 24, 8}}, - {m68k_op_eori_16_toc , 0xffff, 0x0a3c, { 20, 16, 12}}, - {m68k_op_eori_16_aw , 0xffff, 0x0a78, { 20, 20, 8}}, - {m68k_op_eori_16_al , 0xffff, 0x0a79, { 24, 24, 8}}, - {m68k_op_eori_16_tos , 0xffff, 0x0a7c, { 20, 16, 12}}, - {m68k_op_eori_32_aw , 0xffff, 0x0ab8, { 32, 32, 8}}, - {m68k_op_eori_32_al , 0xffff, 0x0ab9, { 36, 36, 8}}, - {m68k_op_cas_8_pi7 , 0xffff, 0x0adf, { 0, 0, 16}}, - {m68k_op_cas_8_pd7 , 0xffff, 0x0ae7, { 0, 0, 17}}, - {m68k_op_cas_8_aw , 0xffff, 0x0af8, { 0, 0, 16}}, - {m68k_op_cas_8_al , 0xffff, 0x0af9, { 0, 0, 16}}, - {m68k_op_cmpi_8_pi7 , 0xffff, 0x0c1f, { 12, 12, 6}}, - {m68k_op_cmpi_8_pd7 , 0xffff, 0x0c27, { 14, 14, 7}}, - {m68k_op_cmpi_8_aw , 0xffff, 0x0c38, { 16, 16, 6}}, - {m68k_op_cmpi_8_al , 0xffff, 0x0c39, { 20, 20, 6}}, - {m68k_op_cmpi_8_pcdi , 0xffff, 0x0c3a, { 0, 0, 7}}, - {m68k_op_cmpi_8_pcix , 0xffff, 0x0c3b, { 0, 0, 9}}, - {m68k_op_cmpi_16_aw , 0xffff, 0x0c78, { 16, 16, 6}}, - {m68k_op_cmpi_16_al , 0xffff, 0x0c79, { 20, 20, 6}}, - {m68k_op_cmpi_16_pcdi , 0xffff, 0x0c7a, { 0, 0, 7}}, - {m68k_op_cmpi_16_pcix , 0xffff, 0x0c7b, { 0, 0, 9}}, - {m68k_op_cmpi_32_aw , 0xffff, 0x0cb8, { 24, 24, 6}}, - {m68k_op_cmpi_32_al , 0xffff, 0x0cb9, { 28, 28, 6}}, - {m68k_op_cmpi_32_pcdi , 0xffff, 0x0cba, { 0, 0, 7}}, - {m68k_op_cmpi_32_pcix , 0xffff, 0x0cbb, { 0, 0, 9}}, - {m68k_op_cas_16_aw , 0xffff, 0x0cf8, { 0, 0, 16}}, - {m68k_op_cas_16_al , 0xffff, 0x0cf9, { 0, 0, 16}}, - {m68k_op_cas2_16 , 0xffff, 0x0cfc, { 0, 0, 12}}, - {m68k_op_moves_8_pi7 , 0xffff, 0x0e1f, { 0, 18, 9}}, - {m68k_op_moves_8_pd7 , 0xffff, 0x0e27, { 0, 20, 10}}, - {m68k_op_moves_8_aw , 0xffff, 0x0e38, { 0, 26, 9}}, - {m68k_op_moves_8_al , 0xffff, 0x0e39, { 0, 30, 9}}, - {m68k_op_moves_16_aw , 0xffff, 0x0e78, { 0, 26, 9}}, - {m68k_op_moves_16_al , 0xffff, 0x0e79, { 0, 30, 9}}, - {m68k_op_moves_32_aw , 0xffff, 0x0eb8, { 0, 32, 9}}, - {m68k_op_moves_32_al , 0xffff, 0x0eb9, { 0, 36, 9}}, - {m68k_op_cas_32_aw , 0xffff, 0x0ef8, { 0, 0, 16}}, - {m68k_op_cas_32_al , 0xffff, 0x0ef9, { 0, 0, 16}}, - {m68k_op_cas2_32 , 0xffff, 0x0efc, { 0, 0, 12}}, - {m68k_op_move_8_aw_pi7 , 0xffff, 0x11df, { 16, 16, 8}}, - {m68k_op_move_8_aw_pd7 , 0xffff, 0x11e7, { 18, 18, 9}}, - {m68k_op_move_8_aw_aw , 0xffff, 0x11f8, { 20, 20, 8}}, - {m68k_op_move_8_aw_al , 0xffff, 0x11f9, { 24, 24, 8}}, - {m68k_op_move_8_aw_pcdi , 0xffff, 0x11fa, { 20, 20, 9}}, - {m68k_op_move_8_aw_pcix , 0xffff, 0x11fb, { 22, 22, 11}}, - {m68k_op_move_8_aw_i , 0xffff, 0x11fc, { 16, 16, 6}}, - {m68k_op_move_8_al_pi7 , 0xffff, 0x13df, { 20, 20, 10}}, - {m68k_op_move_8_al_pd7 , 0xffff, 0x13e7, { 22, 22, 11}}, - {m68k_op_move_8_al_aw , 0xffff, 0x13f8, { 24, 24, 10}}, - {m68k_op_move_8_al_al , 0xffff, 0x13f9, { 28, 28, 10}}, - {m68k_op_move_8_al_pcdi , 0xffff, 0x13fa, { 24, 24, 11}}, - {m68k_op_move_8_al_pcix , 0xffff, 0x13fb, { 26, 26, 13}}, - {m68k_op_move_8_al_i , 0xffff, 0x13fc, { 20, 20, 8}}, - {m68k_op_move_8_pi7_pi7 , 0xffff, 0x1edf, { 12, 12, 8}}, - {m68k_op_move_8_pi7_pd7 , 0xffff, 0x1ee7, { 14, 14, 9}}, - {m68k_op_move_8_pi7_aw , 0xffff, 0x1ef8, { 16, 16, 8}}, - {m68k_op_move_8_pi7_al , 0xffff, 0x1ef9, { 20, 20, 8}}, - {m68k_op_move_8_pi7_pcdi , 0xffff, 0x1efa, { 16, 16, 9}}, - {m68k_op_move_8_pi7_pcix , 0xffff, 0x1efb, { 18, 18, 11}}, - {m68k_op_move_8_pi7_i , 0xffff, 0x1efc, { 12, 12, 6}}, - {m68k_op_move_8_pd7_pi7 , 0xffff, 0x1f1f, { 12, 12, 9}}, - {m68k_op_move_8_pd7_pd7 , 0xffff, 0x1f27, { 14, 14, 10}}, - {m68k_op_move_8_pd7_aw , 0xffff, 0x1f38, { 16, 16, 9}}, - {m68k_op_move_8_pd7_al , 0xffff, 0x1f39, { 20, 20, 9}}, - {m68k_op_move_8_pd7_pcdi , 0xffff, 0x1f3a, { 16, 16, 10}}, - {m68k_op_move_8_pd7_pcix , 0xffff, 0x1f3b, { 18, 18, 12}}, - {m68k_op_move_8_pd7_i , 0xffff, 0x1f3c, { 12, 12, 7}}, - {m68k_op_move_32_aw_aw , 0xffff, 0x21f8, { 28, 28, 8}}, - {m68k_op_move_32_aw_al , 0xffff, 0x21f9, { 32, 32, 8}}, - {m68k_op_move_32_aw_pcdi , 0xffff, 0x21fa, { 28, 28, 9}}, - {m68k_op_move_32_aw_pcix , 0xffff, 0x21fb, { 30, 30, 11}}, - {m68k_op_move_32_aw_i , 0xffff, 0x21fc, { 24, 24, 8}}, - {m68k_op_move_32_al_aw , 0xffff, 0x23f8, { 32, 32, 10}}, - {m68k_op_move_32_al_al , 0xffff, 0x23f9, { 36, 36, 10}}, - {m68k_op_move_32_al_pcdi , 0xffff, 0x23fa, { 32, 32, 11}}, - {m68k_op_move_32_al_pcix , 0xffff, 0x23fb, { 34, 34, 13}}, - {m68k_op_move_32_al_i , 0xffff, 0x23fc, { 28, 28, 10}}, - {m68k_op_move_16_aw_aw , 0xffff, 0x31f8, { 20, 20, 8}}, - {m68k_op_move_16_aw_al , 0xffff, 0x31f9, { 24, 24, 8}}, - {m68k_op_move_16_aw_pcdi , 0xffff, 0x31fa, { 20, 20, 9}}, - {m68k_op_move_16_aw_pcix , 0xffff, 0x31fb, { 22, 22, 11}}, - {m68k_op_move_16_aw_i , 0xffff, 0x31fc, { 16, 16, 6}}, - {m68k_op_move_16_al_aw , 0xffff, 0x33f8, { 24, 24, 10}}, - {m68k_op_move_16_al_al , 0xffff, 0x33f9, { 28, 28, 10}}, - {m68k_op_move_16_al_pcdi , 0xffff, 0x33fa, { 24, 24, 11}}, - {m68k_op_move_16_al_pcix , 0xffff, 0x33fb, { 26, 26, 13}}, - {m68k_op_move_16_al_i , 0xffff, 0x33fc, { 20, 20, 8}}, - {m68k_op_negx_8_pi7 , 0xffff, 0x401f, { 12, 12, 8}}, - {m68k_op_negx_8_pd7 , 0xffff, 0x4027, { 14, 14, 9}}, - {m68k_op_negx_8_aw , 0xffff, 0x4038, { 16, 16, 8}}, - {m68k_op_negx_8_al , 0xffff, 0x4039, { 20, 20, 8}}, - {m68k_op_negx_16_aw , 0xffff, 0x4078, { 16, 16, 8}}, - {m68k_op_negx_16_al , 0xffff, 0x4079, { 20, 20, 8}}, - {m68k_op_negx_32_aw , 0xffff, 0x40b8, { 24, 24, 8}}, - {m68k_op_negx_32_al , 0xffff, 0x40b9, { 28, 28, 8}}, - {m68k_op_move_16_frs_aw , 0xffff, 0x40f8, { 16, 16, 12}}, - {m68k_op_move_16_frs_al , 0xffff, 0x40f9, { 20, 20, 12}}, - {m68k_op_clr_8_pi7 , 0xffff, 0x421f, { 12, 8, 8}}, - {m68k_op_clr_8_pd7 , 0xffff, 0x4227, { 14, 10, 9}}, - {m68k_op_clr_8_aw , 0xffff, 0x4238, { 16, 12, 8}}, - {m68k_op_clr_8_al , 0xffff, 0x4239, { 20, 14, 8}}, - {m68k_op_clr_16_aw , 0xffff, 0x4278, { 16, 12, 8}}, - {m68k_op_clr_16_al , 0xffff, 0x4279, { 20, 14, 8}}, - {m68k_op_clr_32_aw , 0xffff, 0x42b8, { 24, 16, 8}}, - {m68k_op_clr_32_al , 0xffff, 0x42b9, { 28, 20, 8}}, - {m68k_op_move_16_frc_aw , 0xffff, 0x42f8, { 0, 16, 8}}, - {m68k_op_move_16_frc_al , 0xffff, 0x42f9, { 0, 20, 8}}, - {m68k_op_neg_8_pi7 , 0xffff, 0x441f, { 12, 12, 8}}, - {m68k_op_neg_8_pd7 , 0xffff, 0x4427, { 14, 14, 9}}, - {m68k_op_neg_8_aw , 0xffff, 0x4438, { 16, 16, 8}}, - {m68k_op_neg_8_al , 0xffff, 0x4439, { 20, 20, 8}}, - {m68k_op_neg_16_aw , 0xffff, 0x4478, { 16, 16, 8}}, - {m68k_op_neg_16_al , 0xffff, 0x4479, { 20, 20, 8}}, - {m68k_op_neg_32_aw , 0xffff, 0x44b8, { 24, 24, 8}}, - {m68k_op_neg_32_al , 0xffff, 0x44b9, { 28, 28, 8}}, - {m68k_op_move_16_toc_aw , 0xffff, 0x44f8, { 20, 20, 8}}, - {m68k_op_move_16_toc_al , 0xffff, 0x44f9, { 24, 24, 8}}, - {m68k_op_move_16_toc_pcdi , 0xffff, 0x44fa, { 20, 20, 9}}, - {m68k_op_move_16_toc_pcix , 0xffff, 0x44fb, { 22, 22, 11}}, - {m68k_op_move_16_toc_i , 0xffff, 0x44fc, { 16, 16, 6}}, - {m68k_op_not_8_pi7 , 0xffff, 0x461f, { 12, 12, 8}}, - {m68k_op_not_8_pd7 , 0xffff, 0x4627, { 14, 14, 9}}, - {m68k_op_not_8_aw , 0xffff, 0x4638, { 16, 16, 8}}, - {m68k_op_not_8_al , 0xffff, 0x4639, { 20, 20, 8}}, - {m68k_op_not_16_aw , 0xffff, 0x4678, { 16, 16, 8}}, - {m68k_op_not_16_al , 0xffff, 0x4679, { 20, 20, 8}}, - {m68k_op_not_32_aw , 0xffff, 0x46b8, { 24, 24, 8}}, - {m68k_op_not_32_al , 0xffff, 0x46b9, { 28, 28, 8}}, - {m68k_op_move_16_tos_aw , 0xffff, 0x46f8, { 20, 20, 12}}, - {m68k_op_move_16_tos_al , 0xffff, 0x46f9, { 24, 24, 12}}, - {m68k_op_move_16_tos_pcdi , 0xffff, 0x46fa, { 20, 20, 13}}, - {m68k_op_move_16_tos_pcix , 0xffff, 0x46fb, { 22, 22, 15}}, - {m68k_op_move_16_tos_i , 0xffff, 0x46fc, { 16, 16, 10}}, - {m68k_op_link_32_a7 , 0xffff, 0x480f, { 0, 0, 6}}, - {m68k_op_nbcd_8_pi7 , 0xffff, 0x481f, { 12, 12, 10}}, - {m68k_op_nbcd_8_pd7 , 0xffff, 0x4827, { 14, 14, 11}}, - {m68k_op_nbcd_8_aw , 0xffff, 0x4838, { 16, 16, 10}}, - {m68k_op_nbcd_8_al , 0xffff, 0x4839, { 20, 20, 10}}, - {m68k_op_pea_32_aw , 0xffff, 0x4878, { 16, 16, 9}}, - {m68k_op_pea_32_al , 0xffff, 0x4879, { 20, 20, 9}}, - {m68k_op_pea_32_pcdi , 0xffff, 0x487a, { 16, 16, 10}}, - {m68k_op_pea_32_pcix , 0xffff, 0x487b, { 20, 20, 12}}, - {m68k_op_movem_16_re_aw , 0xffff, 0x48b8, { 16, 16, 8}}, - {m68k_op_movem_16_re_al , 0xffff, 0x48b9, { 20, 20, 8}}, - {m68k_op_movem_32_re_aw , 0xffff, 0x48f8, { 20, 20, 8}}, - {m68k_op_movem_32_re_al , 0xffff, 0x48f9, { 24, 24, 8}}, - {m68k_op_tst_8_pi7 , 0xffff, 0x4a1f, { 8, 8, 6}}, - {m68k_op_tst_8_pd7 , 0xffff, 0x4a27, { 10, 10, 7}}, - {m68k_op_tst_8_aw , 0xffff, 0x4a38, { 12, 12, 6}}, - {m68k_op_tst_8_al , 0xffff, 0x4a39, { 16, 16, 6}}, - {m68k_op_tst_8_pcdi , 0xffff, 0x4a3a, { 0, 0, 7}}, - {m68k_op_tst_8_pcix , 0xffff, 0x4a3b, { 0, 0, 9}}, - {m68k_op_tst_8_i , 0xffff, 0x4a3c, { 0, 0, 6}}, - {m68k_op_tst_16_aw , 0xffff, 0x4a78, { 12, 12, 6}}, - {m68k_op_tst_16_al , 0xffff, 0x4a79, { 16, 16, 6}}, - {m68k_op_tst_16_pcdi , 0xffff, 0x4a7a, { 0, 0, 7}}, - {m68k_op_tst_16_pcix , 0xffff, 0x4a7b, { 0, 0, 9}}, - {m68k_op_tst_16_i , 0xffff, 0x4a7c, { 0, 0, 6}}, - {m68k_op_tst_32_aw , 0xffff, 0x4ab8, { 16, 16, 6}}, - {m68k_op_tst_32_al , 0xffff, 0x4ab9, { 20, 20, 6}}, - {m68k_op_tst_32_pcdi , 0xffff, 0x4aba, { 0, 0, 7}}, - {m68k_op_tst_32_pcix , 0xffff, 0x4abb, { 0, 0, 9}}, - {m68k_op_tst_32_i , 0xffff, 0x4abc, { 0, 0, 6}}, - {m68k_op_tas_8_pi7 , 0xffff, 0x4adf, { 18, 18, 16}}, - {m68k_op_tas_8_pd7 , 0xffff, 0x4ae7, { 20, 20, 17}}, - {m68k_op_tas_8_aw , 0xffff, 0x4af8, { 22, 22, 16}}, - {m68k_op_tas_8_al , 0xffff, 0x4af9, { 26, 26, 16}}, - {m68k_op_illegal , 0xffff, 0x4afc, { 4, 4, 4}}, - {m68k_op_mull_32_aw , 0xffff, 0x4c38, { 0, 0, 47}}, - {m68k_op_mull_32_al , 0xffff, 0x4c39, { 0, 0, 47}}, - {m68k_op_mull_32_pcdi , 0xffff, 0x4c3a, { 0, 0, 48}}, - {m68k_op_mull_32_pcix , 0xffff, 0x4c3b, { 0, 0, 50}}, - {m68k_op_mull_32_i , 0xffff, 0x4c3c, { 0, 0, 47}}, - {m68k_op_divl_32_aw , 0xffff, 0x4c78, { 0, 0, 88}}, - {m68k_op_divl_32_al , 0xffff, 0x4c79, { 0, 0, 88}}, - {m68k_op_divl_32_pcdi , 0xffff, 0x4c7a, { 0, 0, 89}}, - {m68k_op_divl_32_pcix , 0xffff, 0x4c7b, { 0, 0, 91}}, - {m68k_op_divl_32_i , 0xffff, 0x4c7c, { 0, 0, 88}}, - {m68k_op_movem_16_er_aw , 0xffff, 0x4cb8, { 20, 20, 12}}, - {m68k_op_movem_16_er_al , 0xffff, 0x4cb9, { 24, 24, 12}}, - {m68k_op_movem_16_er_pcdi , 0xffff, 0x4cba, { 20, 20, 13}}, - {m68k_op_movem_16_er_pcix , 0xffff, 0x4cbb, { 22, 22, 15}}, - {m68k_op_movem_32_er_aw , 0xffff, 0x4cf8, { 24, 24, 12}}, - {m68k_op_movem_32_er_al , 0xffff, 0x4cf9, { 28, 28, 12}}, - {m68k_op_movem_32_er_pcdi , 0xffff, 0x4cfa, { 24, 24, 13}}, - {m68k_op_movem_32_er_pcix , 0xffff, 0x4cfb, { 26, 26, 15}}, - {m68k_op_link_16_a7 , 0xffff, 0x4e57, { 16, 16, 5}}, - {m68k_op_unlk_32_a7 , 0xffff, 0x4e5f, { 12, 12, 6}}, - {m68k_op_reset , 0xffff, 0x4e70, { 0, 0, 0}}, - {m68k_op_nop , 0xffff, 0x4e71, { 4, 4, 2}}, - {m68k_op_stop , 0xffff, 0x4e72, { 4, 4, 8}}, - {m68k_op_rte_32 , 0xffff, 0x4e73, { 20, 24, 20}}, - {m68k_op_rtd_32 , 0xffff, 0x4e74, { 0, 16, 10}}, - {m68k_op_rts_32 , 0xffff, 0x4e75, { 16, 16, 10}}, - {m68k_op_trapv , 0xffff, 0x4e76, { 4, 4, 4}}, - {m68k_op_rtr_32 , 0xffff, 0x4e77, { 20, 20, 14}}, - {m68k_op_movec_32_cr , 0xffff, 0x4e7a, { 0, 12, 6}}, - {m68k_op_movec_32_rc , 0xffff, 0x4e7b, { 0, 10, 12}}, - {m68k_op_jsr_32_aw , 0xffff, 0x4eb8, { 18, 18, 4}}, - {m68k_op_jsr_32_al , 0xffff, 0x4eb9, { 20, 20, 4}}, - {m68k_op_jsr_32_pcdi , 0xffff, 0x4eba, { 18, 18, 5}}, - {m68k_op_jsr_32_pcix , 0xffff, 0x4ebb, { 22, 22, 7}}, - {m68k_op_jmp_32_aw , 0xffff, 0x4ef8, { 10, 10, 4}}, - {m68k_op_jmp_32_al , 0xffff, 0x4ef9, { 12, 12, 4}}, - {m68k_op_jmp_32_pcdi , 0xffff, 0x4efa, { 10, 10, 5}}, - {m68k_op_jmp_32_pcix , 0xffff, 0x4efb, { 14, 14, 7}}, - {m68k_op_st_8_pi7 , 0xffff, 0x50df, { 12, 12, 10}}, - {m68k_op_st_8_pd7 , 0xffff, 0x50e7, { 14, 14, 11}}, - {m68k_op_st_8_aw , 0xffff, 0x50f8, { 16, 16, 10}}, - {m68k_op_st_8_al , 0xffff, 0x50f9, { 20, 20, 10}}, - {m68k_op_trapt_16 , 0xffff, 0x50fa, { 0, 0, 6}}, - {m68k_op_trapt_32 , 0xffff, 0x50fb, { 0, 0, 8}}, - {m68k_op_trapt , 0xffff, 0x50fc, { 0, 0, 4}}, - {m68k_op_sf_8_pi7 , 0xffff, 0x51df, { 12, 12, 10}}, - {m68k_op_sf_8_pd7 , 0xffff, 0x51e7, { 14, 14, 11}}, - {m68k_op_sf_8_aw , 0xffff, 0x51f8, { 16, 16, 10}}, - {m68k_op_sf_8_al , 0xffff, 0x51f9, { 20, 20, 10}}, - {m68k_op_trapf_16 , 0xffff, 0x51fa, { 0, 0, 6}}, - {m68k_op_trapf_32 , 0xffff, 0x51fb, { 0, 0, 8}}, - {m68k_op_trapf , 0xffff, 0x51fc, { 0, 0, 4}}, - {m68k_op_shi_8_pi7 , 0xffff, 0x52df, { 12, 12, 10}}, - {m68k_op_shi_8_pd7 , 0xffff, 0x52e7, { 14, 14, 11}}, - {m68k_op_shi_8_aw , 0xffff, 0x52f8, { 16, 16, 10}}, - {m68k_op_shi_8_al , 0xffff, 0x52f9, { 20, 20, 10}}, - {m68k_op_traphi_16 , 0xffff, 0x52fa, { 0, 0, 6}}, - {m68k_op_traphi_32 , 0xffff, 0x52fb, { 0, 0, 8}}, - {m68k_op_traphi , 0xffff, 0x52fc, { 0, 0, 4}}, - {m68k_op_sls_8_pi7 , 0xffff, 0x53df, { 12, 12, 10}}, - {m68k_op_sls_8_pd7 , 0xffff, 0x53e7, { 14, 14, 11}}, - {m68k_op_sls_8_aw , 0xffff, 0x53f8, { 16, 16, 10}}, - {m68k_op_sls_8_al , 0xffff, 0x53f9, { 20, 20, 10}}, - {m68k_op_trapls_16 , 0xffff, 0x53fa, { 0, 0, 6}}, - {m68k_op_trapls_32 , 0xffff, 0x53fb, { 0, 0, 8}}, - {m68k_op_trapls , 0xffff, 0x53fc, { 0, 0, 4}}, - {m68k_op_scc_8_pi7 , 0xffff, 0x54df, { 12, 12, 10}}, - {m68k_op_scc_8_pd7 , 0xffff, 0x54e7, { 14, 14, 11}}, - {m68k_op_scc_8_aw , 0xffff, 0x54f8, { 16, 16, 10}}, - {m68k_op_scc_8_al , 0xffff, 0x54f9, { 20, 20, 10}}, - {m68k_op_trapcc_16 , 0xffff, 0x54fa, { 0, 0, 6}}, - {m68k_op_trapcc_32 , 0xffff, 0x54fb, { 0, 0, 8}}, - {m68k_op_trapcc , 0xffff, 0x54fc, { 0, 0, 4}}, - {m68k_op_scs_8_pi7 , 0xffff, 0x55df, { 12, 12, 10}}, - {m68k_op_scs_8_pd7 , 0xffff, 0x55e7, { 14, 14, 11}}, - {m68k_op_scs_8_aw , 0xffff, 0x55f8, { 16, 16, 10}}, - {m68k_op_scs_8_al , 0xffff, 0x55f9, { 20, 20, 10}}, - {m68k_op_trapcs_16 , 0xffff, 0x55fa, { 0, 0, 6}}, - {m68k_op_trapcs_32 , 0xffff, 0x55fb, { 0, 0, 8}}, - {m68k_op_trapcs , 0xffff, 0x55fc, { 0, 0, 4}}, - {m68k_op_sne_8_pi7 , 0xffff, 0x56df, { 12, 12, 10}}, - {m68k_op_sne_8_pd7 , 0xffff, 0x56e7, { 14, 14, 11}}, - {m68k_op_sne_8_aw , 0xffff, 0x56f8, { 16, 16, 10}}, - {m68k_op_sne_8_al , 0xffff, 0x56f9, { 20, 20, 10}}, - {m68k_op_trapne_16 , 0xffff, 0x56fa, { 0, 0, 6}}, - {m68k_op_trapne_32 , 0xffff, 0x56fb, { 0, 0, 8}}, - {m68k_op_trapne , 0xffff, 0x56fc, { 0, 0, 4}}, - {m68k_op_seq_8_pi7 , 0xffff, 0x57df, { 12, 12, 10}}, - {m68k_op_seq_8_pd7 , 0xffff, 0x57e7, { 14, 14, 11}}, - {m68k_op_seq_8_aw , 0xffff, 0x57f8, { 16, 16, 10}}, - {m68k_op_seq_8_al , 0xffff, 0x57f9, { 20, 20, 10}}, - {m68k_op_trapeq_16 , 0xffff, 0x57fa, { 0, 0, 6}}, - {m68k_op_trapeq_32 , 0xffff, 0x57fb, { 0, 0, 8}}, - {m68k_op_trapeq , 0xffff, 0x57fc, { 0, 0, 4}}, - {m68k_op_svc_8_pi7 , 0xffff, 0x58df, { 12, 12, 10}}, - {m68k_op_svc_8_pd7 , 0xffff, 0x58e7, { 14, 14, 11}}, - {m68k_op_svc_8_aw , 0xffff, 0x58f8, { 16, 16, 10}}, - {m68k_op_svc_8_al , 0xffff, 0x58f9, { 20, 20, 10}}, - {m68k_op_trapvc_16 , 0xffff, 0x58fa, { 0, 0, 6}}, - {m68k_op_trapvc_32 , 0xffff, 0x58fb, { 0, 0, 8}}, - {m68k_op_trapvc , 0xffff, 0x58fc, { 0, 0, 4}}, - {m68k_op_svs_8_pi7 , 0xffff, 0x59df, { 12, 12, 10}}, - {m68k_op_svs_8_pd7 , 0xffff, 0x59e7, { 14, 14, 11}}, - {m68k_op_svs_8_aw , 0xffff, 0x59f8, { 16, 16, 10}}, - {m68k_op_svs_8_al , 0xffff, 0x59f9, { 20, 20, 10}}, - {m68k_op_trapvs_16 , 0xffff, 0x59fa, { 0, 0, 6}}, - {m68k_op_trapvs_32 , 0xffff, 0x59fb, { 0, 0, 8}}, - {m68k_op_trapvs , 0xffff, 0x59fc, { 0, 0, 4}}, - {m68k_op_spl_8_pi7 , 0xffff, 0x5adf, { 12, 12, 10}}, - {m68k_op_spl_8_pd7 , 0xffff, 0x5ae7, { 14, 14, 11}}, - {m68k_op_spl_8_aw , 0xffff, 0x5af8, { 16, 16, 10}}, - {m68k_op_spl_8_al , 0xffff, 0x5af9, { 20, 20, 10}}, - {m68k_op_trappl_16 , 0xffff, 0x5afa, { 0, 0, 6}}, - {m68k_op_trappl_32 , 0xffff, 0x5afb, { 0, 0, 8}}, - {m68k_op_trappl , 0xffff, 0x5afc, { 0, 0, 4}}, - {m68k_op_smi_8_pi7 , 0xffff, 0x5bdf, { 12, 12, 10}}, - {m68k_op_smi_8_pd7 , 0xffff, 0x5be7, { 14, 14, 11}}, - {m68k_op_smi_8_aw , 0xffff, 0x5bf8, { 16, 16, 10}}, - {m68k_op_smi_8_al , 0xffff, 0x5bf9, { 20, 20, 10}}, - {m68k_op_trapmi_16 , 0xffff, 0x5bfa, { 0, 0, 6}}, - {m68k_op_trapmi_32 , 0xffff, 0x5bfb, { 0, 0, 8}}, - {m68k_op_trapmi , 0xffff, 0x5bfc, { 0, 0, 4}}, - {m68k_op_sge_8_pi7 , 0xffff, 0x5cdf, { 12, 12, 10}}, - {m68k_op_sge_8_pd7 , 0xffff, 0x5ce7, { 14, 14, 11}}, - {m68k_op_sge_8_aw , 0xffff, 0x5cf8, { 16, 16, 10}}, - {m68k_op_sge_8_al , 0xffff, 0x5cf9, { 20, 20, 10}}, - {m68k_op_trapge_16 , 0xffff, 0x5cfa, { 0, 0, 6}}, - {m68k_op_trapge_32 , 0xffff, 0x5cfb, { 0, 0, 8}}, - {m68k_op_trapge , 0xffff, 0x5cfc, { 0, 0, 4}}, - {m68k_op_slt_8_pi7 , 0xffff, 0x5ddf, { 12, 12, 10}}, - {m68k_op_slt_8_pd7 , 0xffff, 0x5de7, { 14, 14, 11}}, - {m68k_op_slt_8_aw , 0xffff, 0x5df8, { 16, 16, 10}}, - {m68k_op_slt_8_al , 0xffff, 0x5df9, { 20, 20, 10}}, - {m68k_op_traplt_16 , 0xffff, 0x5dfa, { 0, 0, 6}}, - {m68k_op_traplt_32 , 0xffff, 0x5dfb, { 0, 0, 8}}, - {m68k_op_traplt , 0xffff, 0x5dfc, { 0, 0, 4}}, - {m68k_op_sgt_8_pi7 , 0xffff, 0x5edf, { 12, 12, 10}}, - {m68k_op_sgt_8_pd7 , 0xffff, 0x5ee7, { 14, 14, 11}}, - {m68k_op_sgt_8_aw , 0xffff, 0x5ef8, { 16, 16, 10}}, - {m68k_op_sgt_8_al , 0xffff, 0x5ef9, { 20, 20, 10}}, - {m68k_op_trapgt_16 , 0xffff, 0x5efa, { 0, 0, 6}}, - {m68k_op_trapgt_32 , 0xffff, 0x5efb, { 0, 0, 8}}, - {m68k_op_trapgt , 0xffff, 0x5efc, { 0, 0, 4}}, - {m68k_op_sle_8_pi7 , 0xffff, 0x5fdf, { 12, 12, 10}}, - {m68k_op_sle_8_pd7 , 0xffff, 0x5fe7, { 14, 14, 11}}, - {m68k_op_sle_8_aw , 0xffff, 0x5ff8, { 16, 16, 10}}, - {m68k_op_sle_8_al , 0xffff, 0x5ff9, { 20, 20, 10}}, - {m68k_op_traple_16 , 0xffff, 0x5ffa, { 0, 0, 6}}, - {m68k_op_traple_32 , 0xffff, 0x5ffb, { 0, 0, 8}}, - {m68k_op_traple , 0xffff, 0x5ffc, { 0, 0, 4}}, - {m68k_op_bra_16 , 0xffff, 0x6000, { 10, 10, 10}}, - {m68k_op_bra_32 , 0xffff, 0x60ff, { 0, 0, 10}}, - {m68k_op_bsr_16 , 0xffff, 0x6100, { 18, 18, 7}}, - {m68k_op_bsr_32 , 0xffff, 0x61ff, { 0, 0, 7}}, - {m68k_op_bhi_16 , 0xffff, 0x6200, { 10, 10, 6}}, - {m68k_op_bhi_32 , 0xffff, 0x62ff, { 0, 0, 6}}, - {m68k_op_bls_16 , 0xffff, 0x6300, { 10, 10, 6}}, - {m68k_op_bls_32 , 0xffff, 0x63ff, { 0, 0, 6}}, - {m68k_op_bcc_16 , 0xffff, 0x6400, { 10, 10, 6}}, - {m68k_op_bcc_32 , 0xffff, 0x64ff, { 0, 0, 6}}, - {m68k_op_bcs_16 , 0xffff, 0x6500, { 10, 10, 6}}, - {m68k_op_bcs_32 , 0xffff, 0x65ff, { 0, 0, 6}}, - {m68k_op_bne_16 , 0xffff, 0x6600, { 10, 10, 6}}, - {m68k_op_bne_32 , 0xffff, 0x66ff, { 0, 0, 6}}, - {m68k_op_beq_16 , 0xffff, 0x6700, { 10, 10, 6}}, - {m68k_op_beq_32 , 0xffff, 0x67ff, { 0, 0, 6}}, - {m68k_op_bvc_16 , 0xffff, 0x6800, { 10, 10, 6}}, - {m68k_op_bvc_32 , 0xffff, 0x68ff, { 0, 0, 6}}, - {m68k_op_bvs_16 , 0xffff, 0x6900, { 10, 10, 6}}, - {m68k_op_bvs_32 , 0xffff, 0x69ff, { 0, 0, 6}}, - {m68k_op_bpl_16 , 0xffff, 0x6a00, { 10, 10, 6}}, - {m68k_op_bpl_32 , 0xffff, 0x6aff, { 0, 0, 6}}, - {m68k_op_bmi_16 , 0xffff, 0x6b00, { 10, 10, 6}}, - {m68k_op_bmi_32 , 0xffff, 0x6bff, { 0, 0, 6}}, - {m68k_op_bge_16 , 0xffff, 0x6c00, { 10, 10, 6}}, - {m68k_op_bge_32 , 0xffff, 0x6cff, { 0, 0, 6}}, - {m68k_op_blt_16 , 0xffff, 0x6d00, { 10, 10, 6}}, - {m68k_op_blt_32 , 0xffff, 0x6dff, { 0, 0, 6}}, - {m68k_op_bgt_16 , 0xffff, 0x6e00, { 10, 10, 6}}, - {m68k_op_bgt_32 , 0xffff, 0x6eff, { 0, 0, 6}}, - {m68k_op_ble_16 , 0xffff, 0x6f00, { 10, 10, 6}}, - {m68k_op_ble_32 , 0xffff, 0x6fff, { 0, 0, 6}}, - {m68k_op_sbcd_8_mm_axy7 , 0xffff, 0x8f0f, { 18, 18, 16}}, - {m68k_op_pack_16_mm_axy7 , 0xffff, 0x8f4f, { 0, 0, 13}}, - {m68k_op_unpk_16_mm_axy7 , 0xffff, 0x8f8f, { 0, 0, 13}}, - {m68k_op_subx_8_mm_axy7 , 0xffff, 0x9f0f, { 18, 18, 12}}, - {m68k_op_cmpm_8_axy7 , 0xffff, 0xbf0f, { 12, 12, 9}}, - {m68k_op_abcd_8_mm_axy7 , 0xffff, 0xcf0f, { 18, 18, 16}}, - {m68k_op_addx_8_mm_axy7 , 0xffff, 0xdf0f, { 18, 18, 12}}, - {m68k_op_asr_16_aw , 0xffff, 0xe0f8, { 16, 16, 9}}, - {m68k_op_asr_16_al , 0xffff, 0xe0f9, { 20, 20, 9}}, - {m68k_op_asl_16_aw , 0xffff, 0xe1f8, { 16, 16, 10}}, - {m68k_op_asl_16_al , 0xffff, 0xe1f9, { 20, 20, 10}}, - {m68k_op_lsr_16_aw , 0xffff, 0xe2f8, { 16, 16, 9}}, - {m68k_op_lsr_16_al , 0xffff, 0xe2f9, { 20, 20, 9}}, - {m68k_op_lsl_16_aw , 0xffff, 0xe3f8, { 16, 16, 9}}, - {m68k_op_lsl_16_al , 0xffff, 0xe3f9, { 20, 20, 9}}, - {m68k_op_roxr_16_aw , 0xffff, 0xe4f8, { 16, 16, 9}}, - {m68k_op_roxr_16_al , 0xffff, 0xe4f9, { 20, 20, 9}}, - {m68k_op_roxl_16_aw , 0xffff, 0xe5f8, { 16, 16, 9}}, - {m68k_op_roxl_16_al , 0xffff, 0xe5f9, { 20, 20, 9}}, - {m68k_op_ror_16_aw , 0xffff, 0xe6f8, { 16, 16, 11}}, - {m68k_op_ror_16_al , 0xffff, 0xe6f9, { 20, 20, 11}}, - {m68k_op_rol_16_aw , 0xffff, 0xe7f8, { 16, 16, 11}}, - {m68k_op_rol_16_al , 0xffff, 0xe7f9, { 20, 20, 11}}, - {m68k_op_bftst_32_aw , 0xffff, 0xe8f8, { 0, 0, 17}}, - {m68k_op_bftst_32_al , 0xffff, 0xe8f9, { 0, 0, 17}}, - {m68k_op_bftst_32_pcdi , 0xffff, 0xe8fa, { 0, 0, 18}}, - {m68k_op_bftst_32_pcix , 0xffff, 0xe8fb, { 0, 0, 20}}, - {m68k_op_bfextu_32_aw , 0xffff, 0xe9f8, { 0, 0, 19}}, - {m68k_op_bfextu_32_al , 0xffff, 0xe9f9, { 0, 0, 19}}, - {m68k_op_bfextu_32_pcdi , 0xffff, 0xe9fa, { 0, 0, 20}}, - {m68k_op_bfextu_32_pcix , 0xffff, 0xe9fb, { 0, 0, 22}}, - {m68k_op_bfchg_32_aw , 0xffff, 0xeaf8, { 0, 0, 24}}, - {m68k_op_bfchg_32_al , 0xffff, 0xeaf9, { 0, 0, 24}}, - {m68k_op_bfexts_32_aw , 0xffff, 0xebf8, { 0, 0, 19}}, - {m68k_op_bfexts_32_al , 0xffff, 0xebf9, { 0, 0, 19}}, - {m68k_op_bfexts_32_pcdi , 0xffff, 0xebfa, { 0, 0, 20}}, - {m68k_op_bfexts_32_pcix , 0xffff, 0xebfb, { 0, 0, 22}}, - {m68k_op_bfclr_32_aw , 0xffff, 0xecf8, { 0, 0, 24}}, - {m68k_op_bfclr_32_al , 0xffff, 0xecf9, { 0, 0, 24}}, - {m68k_op_bfffo_32_aw , 0xffff, 0xedf8, { 0, 0, 32}}, - {m68k_op_bfffo_32_al , 0xffff, 0xedf9, { 0, 0, 32}}, - {m68k_op_bfffo_32_pcdi , 0xffff, 0xedfa, { 0, 0, 33}}, - {m68k_op_bfffo_32_pcix , 0xffff, 0xedfb, { 0, 0, 35}}, - {m68k_op_bfset_32_aw , 0xffff, 0xeef8, { 0, 0, 24}}, - {m68k_op_bfset_32_al , 0xffff, 0xeef9, { 0, 0, 24}}, - {m68k_op_bfins_32_aw , 0xffff, 0xeff8, { 0, 0, 21}}, - {m68k_op_bfins_32_al , 0xffff, 0xeff9, { 0, 0, 21}}, - {0, 0, 0, {0, 0, 0}} -}; - - -/* Build the opcode handler jump table */ -void m68ki_build_opcode_table(void) -{ - opcode_handler_struct *ostruct; - int instr; - int i; - int j; - int k; - - for(i = 0; i < 0x10000; i++) - { - /* default to illegal */ - m68ki_instruction_jump_table[i] = m68k_op_illegal; - for(k=0;kmask != 0xff00) - { - for(i = 0;i < 0x10000;i++) - { - if((i & ostruct->mask) == ostruct->match) - { - m68ki_instruction_jump_table[i] = ostruct->opcode_handler; - for(k=0;kcycles[k]; - } - } - ostruct++; - } - while(ostruct->mask == 0xff00) - { - for(i = 0;i <= 0xff;i++) - { - m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler; - for(k=0;kmatch | i] = ostruct->cycles[k]; - } - ostruct++; - } - while(ostruct->mask == 0xf1f8) - { - for(i = 0;i < 8;i++) - { - for(j = 0;j < 8;j++) - { - instr = ostruct->match | (i << 9) | j; - m68ki_instruction_jump_table[instr] = ostruct->opcode_handler; - for(k=0;kcycles[k]; - if((instr & 0xf000) == 0xe000 && (!(instr & 0x20))) - m68ki_cycles[0][instr] = m68ki_cycles[1][instr] = ostruct->cycles[k] + ((((j-1)&7)+1)<<1); - } - } - ostruct++; - } - while(ostruct->mask == 0xfff0) - { - for(i = 0;i <= 0x0f;i++) - { - m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler; - for(k=0;kmatch | i] = ostruct->cycles[k]; - } - ostruct++; - } - while(ostruct->mask == 0xf1ff) - { - for(i = 0;i <= 0x07;i++) - { - m68ki_instruction_jump_table[ostruct->match | (i << 9)] = ostruct->opcode_handler; - for(k=0;kmatch | (i << 9)] = ostruct->cycles[k]; - } - ostruct++; - } - while(ostruct->mask == 0xfff8) - { - for(i = 0;i <= 0x07;i++) - { - m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler; - for(k=0;kmatch | i] = ostruct->cycles[k]; - } - ostruct++; - } - while(ostruct->mask == 0xffff) - { - m68ki_instruction_jump_table[ostruct->match] = ostruct->opcode_handler; - for(k=0;kmatch] = ostruct->cycles[k]; - ostruct++; - } -} - - -/* ======================================================================== */ -/* ============================== END OF FILE ============================= */ -/* ======================================================================== */ - - +#include "m68kcpu.h" +extern void m68040_fpu_op0(void); +extern void m68040_fpu_op1(void); + +/* ======================================================================== */ +/* ========================= INSTRUCTION HANDLERS ========================= */ +/* ======================================================================== */ + + +static void m68k_op_1010(void) +{ + m68ki_exception_1010(); +} + + +static void m68k_op_1111(void) +{ + m68ki_exception_1111(); +} + + +static void m68k_op_040fpu0_32(void) +{ + if(CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + m68040_fpu_op0(); + return; + } + m68ki_exception_1111(); +} + + +static void m68k_op_040fpu1_32(void) +{ + if(CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + m68040_fpu_op1(); + return; + } + m68ki_exception_1111(); +} + + +static void m68k_op_abcd_8_rr(void) +{ + uint* r_dst = &DX; + uint src = DY; + uint dst = *r_dst; + uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); + + FLAG_V = ~res; /* Undefined V behavior */ + + if(res > 9) + res += 6; + res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); + FLAG_X = FLAG_C = (res > 0x99) << 8; + if(FLAG_C) + res -= 0xa0; + + FLAG_V &= res; /* Undefined V behavior part II */ + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; +} + + +static void m68k_op_abcd_8_mm_ax7(void) +{ + uint src = OPER_AY_PD_8(); + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); + + FLAG_V = ~res; /* Undefined V behavior */ + + if(res > 9) + res += 6; + res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); + FLAG_X = FLAG_C = (res > 0x99) << 8; + if(FLAG_C) + res -= 0xa0; + + FLAG_V &= res; /* Undefined V behavior part II */ + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_abcd_8_mm_ay7(void) +{ + uint src = OPER_A7_PD_8(); + uint ea = EA_AX_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); + + FLAG_V = ~res; /* Undefined V behavior */ + + if(res > 9) + res += 6; + res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); + FLAG_X = FLAG_C = (res > 0x99) << 8; + if(FLAG_C) + res -= 0xa0; + + FLAG_V &= res; /* Undefined V behavior part II */ + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_abcd_8_mm_axy7(void) +{ + uint src = OPER_A7_PD_8(); + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); + + FLAG_V = ~res; /* Undefined V behavior */ + + if(res > 9) + res += 6; + res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); + FLAG_X = FLAG_C = (res > 0x99) << 8; + if(FLAG_C) + res -= 0xa0; + + FLAG_V &= res; /* Undefined V behavior part II */ + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_abcd_8_mm(void) +{ + uint src = OPER_AY_PD_8(); + uint ea = EA_AX_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); + + FLAG_V = ~res; /* Undefined V behavior */ + + if(res > 9) + res += 6; + res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); + FLAG_X = FLAG_C = (res > 0x99) << 8; + if(FLAG_C) + res -= 0xa0; + + FLAG_V &= res; /* Undefined V behavior part II */ + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_add_8_er_d(void) +{ + uint* r_dst = &DX; + uint src = MASK_OUT_ABOVE_8(DY); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_8_er_ai(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_AI_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_8_er_pi(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PI_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_8_er_pi7(void) +{ + uint* r_dst = &DX; + uint src = OPER_A7_PI_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_8_er_pd(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PD_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_8_er_pd7(void) +{ + uint* r_dst = &DX; + uint src = OPER_A7_PD_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_8_er_di(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_DI_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_8_er_ix(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_IX_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_8_er_aw(void) +{ + uint* r_dst = &DX; + uint src = OPER_AW_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_8_er_al(void) +{ + uint* r_dst = &DX; + uint src = OPER_AL_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_8_er_pcdi(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCDI_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_8_er_pcix(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCIX_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_8_er_i(void) +{ + uint* r_dst = &DX; + uint src = OPER_I_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_16_er_d(void) +{ + uint* r_dst = &DX; + uint src = MASK_OUT_ABOVE_16(DY); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_16_er_a(void) +{ + uint* r_dst = &DX; + uint src = MASK_OUT_ABOVE_16(AY); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_16_er_ai(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_AI_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_16_er_pi(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PI_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_16_er_pd(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PD_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_16_er_di(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_DI_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_16_er_ix(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_IX_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_16_er_aw(void) +{ + uint* r_dst = &DX; + uint src = OPER_AW_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_16_er_al(void) +{ + uint* r_dst = &DX; + uint src = OPER_AL_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_16_er_pcdi(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCDI_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_16_er_pcix(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCIX_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_16_er_i(void) +{ + uint* r_dst = &DX; + uint src = OPER_I_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_add_32_er_d(void) +{ + uint* r_dst = &DX; + uint src = DY; + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_add_32_er_a(void) +{ + uint* r_dst = &DX; + uint src = AY; + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_add_32_er_ai(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_AI_32(); + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_add_32_er_pi(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PI_32(); + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_add_32_er_pd(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PD_32(); + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_add_32_er_di(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_DI_32(); + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_add_32_er_ix(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_IX_32(); + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_add_32_er_aw(void) +{ + uint* r_dst = &DX; + uint src = OPER_AW_32(); + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_add_32_er_al(void) +{ + uint* r_dst = &DX; + uint src = OPER_AL_32(); + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_add_32_er_pcdi(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCDI_32(); + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_add_32_er_pcix(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCIX_32(); + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_add_32_er_i(void) +{ + uint* r_dst = &DX; + uint src = OPER_I_32(); + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_add_8_re_ai(void) +{ + uint ea = EA_AY_AI_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_add_8_re_pi(void) +{ + uint ea = EA_AY_PI_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_add_8_re_pi7(void) +{ + uint ea = EA_A7_PI_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_add_8_re_pd(void) +{ + uint ea = EA_AY_PD_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_add_8_re_pd7(void) +{ + uint ea = EA_A7_PD_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_add_8_re_di(void) +{ + uint ea = EA_AY_DI_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_add_8_re_ix(void) +{ + uint ea = EA_AY_IX_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_add_8_re_aw(void) +{ + uint ea = EA_AW_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_add_8_re_al(void) +{ + uint ea = EA_AL_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_add_16_re_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_add_16_re_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_add_16_re_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_add_16_re_di(void) +{ + uint ea = EA_AY_DI_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_add_16_re_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_add_16_re_aw(void) +{ + uint ea = EA_AW_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_add_16_re_al(void) +{ + uint ea = EA_AL_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_add_32_re_ai(void) +{ + uint ea = EA_AY_AI_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_add_32_re_pi(void) +{ + uint ea = EA_AY_PI_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_add_32_re_pd(void) +{ + uint ea = EA_AY_PD_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_add_32_re_di(void) +{ + uint ea = EA_AY_DI_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_add_32_re_ix(void) +{ + uint ea = EA_AY_IX_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_add_32_re_aw(void) +{ + uint ea = EA_AW_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_add_32_re_al(void) +{ + uint ea = EA_AL_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_adda_16_d(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(DY)); +} + + +static void m68k_op_adda_16_a(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(AY)); +} + + +static void m68k_op_adda_16_ai(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AY_AI_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_pi(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AY_PI_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_pd(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AY_PD_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_di(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AY_DI_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_ix(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AY_IX_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_aw(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AW_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_al(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AL_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_pcdi(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_PCDI_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_pcix(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_PCIX_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_i(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_I_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_32_d(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + DY); +} + + +static void m68k_op_adda_32_a(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + AY); +} + + +static void m68k_op_adda_32_ai(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(OPER_AY_AI_32() + *r_dst); +} + + +static void m68k_op_adda_32_pi(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(OPER_AY_PI_32() + *r_dst); +} + + +static void m68k_op_adda_32_pd(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(OPER_AY_PD_32() + *r_dst); +} + + +static void m68k_op_adda_32_di(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(OPER_AY_DI_32() + *r_dst); +} + + +static void m68k_op_adda_32_ix(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(OPER_AY_IX_32() + *r_dst); +} + + +static void m68k_op_adda_32_aw(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(OPER_AW_32() + *r_dst); +} + + +static void m68k_op_adda_32_al(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(OPER_AL_32() + *r_dst); +} + + +static void m68k_op_adda_32_pcdi(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(OPER_PCDI_32() + *r_dst); +} + + +static void m68k_op_adda_32_pcix(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(OPER_PCIX_32() + *r_dst); +} + + +static void m68k_op_adda_32_i(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(OPER_I_32() + *r_dst); +} + + +static void m68k_op_addi_8_d(void) +{ + uint* r_dst = &DY; + uint src = OPER_I_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_addi_8_ai(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_AI_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addi_8_pi(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_PI_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addi_8_pi7(void) +{ + uint src = OPER_I_8(); + uint ea = EA_A7_PI_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addi_8_pd(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addi_8_pd7(void) +{ + uint src = OPER_I_8(); + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addi_8_di(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_DI_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addi_8_ix(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_IX_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addi_8_aw(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AW_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addi_8_al(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AL_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addi_16_d(void) +{ + uint* r_dst = &DY; + uint src = OPER_I_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_addi_16_ai(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_AI_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addi_16_pi(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_PI_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addi_16_pd(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_PD_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addi_16_di(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_DI_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addi_16_ix(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_IX_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addi_16_aw(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AW_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addi_16_al(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AL_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addi_32_d(void) +{ + uint* r_dst = &DY; + uint src = OPER_I_32(); + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_addi_32_ai(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_AI_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addi_32_pi(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_PI_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addi_32_pd(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_PD_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addi_32_di(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_DI_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addi_32_ix(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_IX_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addi_32_aw(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AW_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addi_32_al(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AL_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addq_8_d(void) +{ + uint* r_dst = &DY; + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_addq_8_ai(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_AI_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addq_8_pi(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_PI_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addq_8_pi7(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_A7_PI_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addq_8_pd(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addq_8_pd7(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addq_8_di(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_DI_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addq_8_ix(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_IX_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addq_8_aw(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AW_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addq_8_al(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AL_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst; + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_addq_16_d(void) +{ + uint* r_dst = &DY; + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_addq_16_a(void) +{ + uint* r_dst = &AY; + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1); +} + + +static void m68k_op_addq_16_ai(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_AI_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addq_16_pi(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_PI_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addq_16_pd(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_PD_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addq_16_di(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_DI_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addq_16_ix(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_IX_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addq_16_aw(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AW_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addq_16_al(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AL_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst; + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_addq_32_d(void) +{ + uint* r_dst = &DY; + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint dst = *r_dst; + uint res = src + dst; + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_addq_32_a(void) +{ + uint* r_dst = &AY; + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1); +} + + +static void m68k_op_addq_32_ai(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_AI_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addq_32_pi(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_PI_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addq_32_pd(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_PD_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addq_32_di(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_DI_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addq_32_ix(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_IX_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addq_32_aw(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AW_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addq_32_al(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AL_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst; + + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_addx_8_rr(void) +{ + uint* r_dst = &DX; + uint src = MASK_OUT_ABOVE_8(DY); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = src + dst + XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; +} + + +static void m68k_op_addx_16_rr(void) +{ + uint* r_dst = &DX; + uint src = MASK_OUT_ABOVE_16(DY); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = src + dst + XFLAG_AS_1(); + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + + res = MASK_OUT_ABOVE_16(res); + FLAG_Z |= res; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; +} + + +static void m68k_op_addx_32_rr(void) +{ + uint* r_dst = &DX; + uint src = DY; + uint dst = *r_dst; + uint res = src + dst + XFLAG_AS_1(); + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + + res = MASK_OUT_ABOVE_32(res); + FLAG_Z |= res; + + *r_dst = res; +} + + +static void m68k_op_addx_8_mm_ax7(void) +{ + uint src = OPER_AY_PD_8(); + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst + XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_addx_8_mm_ay7(void) +{ + uint src = OPER_A7_PD_8(); + uint ea = EA_AX_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst + XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_addx_8_mm_axy7(void) +{ + uint src = OPER_A7_PD_8(); + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst + XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_addx_8_mm(void) +{ + uint src = OPER_AY_PD_8(); + uint ea = EA_AX_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = src + dst + XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_V = VFLAG_ADD_8(src, dst, res); + FLAG_X = FLAG_C = CFLAG_8(res); + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_addx_16_mm(void) +{ + uint src = OPER_AY_PD_16(); + uint ea = EA_AX_PD_16(); + uint dst = m68ki_read_16(ea); + uint res = src + dst + XFLAG_AS_1(); + + FLAG_N = NFLAG_16(res); + FLAG_V = VFLAG_ADD_16(src, dst, res); + FLAG_X = FLAG_C = CFLAG_16(res); + + res = MASK_OUT_ABOVE_16(res); + FLAG_Z |= res; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_addx_32_mm(void) +{ + uint src = OPER_AY_PD_32(); + uint ea = EA_AX_PD_32(); + uint dst = m68ki_read_32(ea); + uint res = src + dst + XFLAG_AS_1(); + + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_ADD_32(src, dst, res); + FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); + + res = MASK_OUT_ABOVE_32(res); + FLAG_Z |= res; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_and_8_er_d(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DX &= (DY | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_ai(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_AI_8() | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_pi(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_PI_8() | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_pi7(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_A7_PI_8() | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_pd(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_PD_8() | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_pd7(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_A7_PD_8() | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_di(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_DI_8() | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_ix(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_IX_8() | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_aw(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AW_8() | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_al(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AL_8() | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_pcdi(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_PCDI_8() | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_pcix(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_PCIX_8() | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_i(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_I_8() | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_d(void) +{ + FLAG_Z = MASK_OUT_ABOVE_16(DX &= (DY | 0xffff0000)); + + FLAG_N = NFLAG_16(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_ai(void) +{ + FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_AI_16() | 0xffff0000)); + + FLAG_N = NFLAG_16(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_pi(void) +{ + FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_PI_16() | 0xffff0000)); + + FLAG_N = NFLAG_16(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_pd(void) +{ + FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_PD_16() | 0xffff0000)); + + FLAG_N = NFLAG_16(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_di(void) +{ + FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_DI_16() | 0xffff0000)); + + FLAG_N = NFLAG_16(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_ix(void) +{ + FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_IX_16() | 0xffff0000)); + + FLAG_N = NFLAG_16(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_aw(void) +{ + FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AW_16() | 0xffff0000)); + + FLAG_N = NFLAG_16(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_al(void) +{ + FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AL_16() | 0xffff0000)); + + FLAG_N = NFLAG_16(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_pcdi(void) +{ + FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_PCDI_16() | 0xffff0000)); + + FLAG_N = NFLAG_16(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_pcix(void) +{ + FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_PCIX_16() | 0xffff0000)); + + FLAG_N = NFLAG_16(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_i(void) +{ + FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_I_16() | 0xffff0000)); + + FLAG_N = NFLAG_16(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_d(void) +{ + FLAG_Z = DX &= DY; + + FLAG_N = NFLAG_32(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_ai(void) +{ + FLAG_Z = DX &= OPER_AY_AI_32(); + + FLAG_N = NFLAG_32(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_pi(void) +{ + FLAG_Z = DX &= OPER_AY_PI_32(); + + FLAG_N = NFLAG_32(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_pd(void) +{ + FLAG_Z = DX &= OPER_AY_PD_32(); + + FLAG_N = NFLAG_32(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_di(void) +{ + FLAG_Z = DX &= OPER_AY_DI_32(); + + FLAG_N = NFLAG_32(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_ix(void) +{ + FLAG_Z = DX &= OPER_AY_IX_32(); + + FLAG_N = NFLAG_32(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_aw(void) +{ + FLAG_Z = DX &= OPER_AW_32(); + + FLAG_N = NFLAG_32(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_al(void) +{ + FLAG_Z = DX &= OPER_AL_32(); + + FLAG_N = NFLAG_32(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_pcdi(void) +{ + FLAG_Z = DX &= OPER_PCDI_32(); + + FLAG_N = NFLAG_32(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_pcix(void) +{ + FLAG_Z = DX &= OPER_PCIX_32(); + + FLAG_N = NFLAG_32(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_i(void) +{ + FLAG_Z = DX &= OPER_I_32(); + + FLAG_N = NFLAG_32(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_re_ai(void) +{ + uint ea = EA_AY_AI_8(); + uint res = DX & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_and_8_re_pi(void) +{ + uint ea = EA_AY_PI_8(); + uint res = DX & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_and_8_re_pi7(void) +{ + uint ea = EA_A7_PI_8(); + uint res = DX & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_and_8_re_pd(void) +{ + uint ea = EA_AY_PD_8(); + uint res = DX & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_and_8_re_pd7(void) +{ + uint ea = EA_A7_PD_8(); + uint res = DX & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_and_8_re_di(void) +{ + uint ea = EA_AY_DI_8(); + uint res = DX & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_and_8_re_ix(void) +{ + uint ea = EA_AY_IX_8(); + uint res = DX & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_and_8_re_aw(void) +{ + uint ea = EA_AW_8(); + uint res = DX & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_and_8_re_al(void) +{ + uint ea = EA_AL_8(); + uint res = DX & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_and_16_re_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint res = DX & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_and_16_re_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint res = DX & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_and_16_re_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint res = DX & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_and_16_re_di(void) +{ + uint ea = EA_AY_DI_16(); + uint res = DX & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_and_16_re_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint res = DX & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_and_16_re_aw(void) +{ + uint ea = EA_AW_16(); + uint res = DX & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_and_16_re_al(void) +{ + uint ea = EA_AL_16(); + uint res = DX & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_and_32_re_ai(void) +{ + uint ea = EA_AY_AI_32(); + uint res = DX & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_and_32_re_pi(void) +{ + uint ea = EA_AY_PI_32(); + uint res = DX & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_and_32_re_pd(void) +{ + uint ea = EA_AY_PD_32(); + uint res = DX & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_and_32_re_di(void) +{ + uint ea = EA_AY_DI_32(); + uint res = DX & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_and_32_re_ix(void) +{ + uint ea = EA_AY_IX_32(); + uint res = DX & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_and_32_re_aw(void) +{ + uint ea = EA_AW_32(); + uint res = DX & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_and_32_re_al(void) +{ + uint ea = EA_AL_32(); + uint res = DX & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_andi_8_d(void) +{ + FLAG_Z = MASK_OUT_ABOVE_8(DY &= (OPER_I_8() | 0xffffff00)); + + FLAG_N = NFLAG_8(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_andi_8_ai(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_AI_8(); + uint res = src & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_andi_8_pi(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_PI_8(); + uint res = src & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_andi_8_pi7(void) +{ + uint src = OPER_I_8(); + uint ea = EA_A7_PI_8(); + uint res = src & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_andi_8_pd(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_PD_8(); + uint res = src & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_andi_8_pd7(void) +{ + uint src = OPER_I_8(); + uint ea = EA_A7_PD_8(); + uint res = src & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_andi_8_di(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_DI_8(); + uint res = src & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_andi_8_ix(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_IX_8(); + uint res = src & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_andi_8_aw(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AW_8(); + uint res = src & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_andi_8_al(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AL_8(); + uint res = src & m68ki_read_8(ea); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_andi_16_d(void) +{ + FLAG_Z = MASK_OUT_ABOVE_16(DY &= (OPER_I_16() | 0xffff0000)); + + FLAG_N = NFLAG_16(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_andi_16_ai(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_AI_16(); + uint res = src & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_andi_16_pi(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_PI_16(); + uint res = src & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_andi_16_pd(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_PD_16(); + uint res = src & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_andi_16_di(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_DI_16(); + uint res = src & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_andi_16_ix(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_IX_16(); + uint res = src & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_andi_16_aw(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AW_16(); + uint res = src & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_andi_16_al(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AL_16(); + uint res = src & m68ki_read_16(ea); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_andi_32_d(void) +{ + FLAG_Z = DY &= (OPER_I_32()); + + FLAG_N = NFLAG_32(FLAG_Z); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_andi_32_ai(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_AI_32(); + uint res = src & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_andi_32_pi(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_PI_32(); + uint res = src & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_andi_32_pd(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_PD_32(); + uint res = src & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_andi_32_di(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_DI_32(); + uint res = src & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_andi_32_ix(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_IX_32(); + uint res = src & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_andi_32_aw(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AW_32(); + uint res = src & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_andi_32_al(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AL_32(); + uint res = src & m68ki_read_32(ea); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_andi_16_toc(void) +{ + m68ki_set_ccr(m68ki_get_ccr() & OPER_I_16()); +} + + +static void m68k_op_andi_16_tos(void) +{ + if(FLAG_S) + { + uint src = OPER_I_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr(m68ki_get_sr() & src); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_asr_8_s(void) +{ + uint* r_dst = &DY; + uint shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_8(*r_dst); + uint res = src >> shift; + + if(shift != 0) + USE_CYCLES(shift<> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_16(*r_dst); + uint res = src >> shift; + + if(shift != 0) + USE_CYCLES(shift<> 9) - 1) & 7) + 1; + uint src = *r_dst; + uint res = src >> shift; + + if(shift != 0) + USE_CYCLES(shift<> shift; + + if(shift != 0) + { + USE_CYCLES(shift<> shift; + + if(shift != 0) + { + USE_CYCLES(shift<> (shift - 1))<<8; + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + + if(GET_MSB_16(src)) + { + *r_dst |= 0xffff; + FLAG_C = CFLAG_SET; + FLAG_X = XFLAG_SET; + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + return; + } + + *r_dst &= 0xffff0000; + FLAG_C = CFLAG_CLEAR; + FLAG_X = XFLAG_CLEAR; + FLAG_N = NFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_16(src); + FLAG_Z = src; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_asr_32_r(void) +{ + uint* r_dst = &DY; + uint shift = DX & 0x3f; + uint src = *r_dst; + uint res = src >> shift; + + if(shift != 0) + { + USE_CYCLES(shift<> (shift - 1))<<8; + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + + if(GET_MSB_32(src)) + { + *r_dst = 0xffffffff; + FLAG_C = CFLAG_SET; + FLAG_X = XFLAG_SET; + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + return; + } + + *r_dst = 0; + FLAG_C = CFLAG_CLEAR; + FLAG_X = XFLAG_CLEAR; + FLAG_N = NFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_32(src); + FLAG_Z = src; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_asr_16_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = FLAG_X = src << 8; +} + + +static void m68k_op_asr_16_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = FLAG_X = src << 8; +} + + +static void m68k_op_asr_16_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = FLAG_X = src << 8; +} + + +static void m68k_op_asr_16_di(void) +{ + uint ea = EA_AY_DI_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = FLAG_X = src << 8; +} + + +static void m68k_op_asr_16_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = FLAG_X = src << 8; +} + + +static void m68k_op_asr_16_aw(void) +{ + uint ea = EA_AW_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = FLAG_X = src << 8; +} + + +static void m68k_op_asr_16_al(void) +{ + uint ea = EA_AL_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = FLAG_X = src << 8; +} + + +static void m68k_op_asl_8_s(void) +{ + uint* r_dst = &DY; + uint shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_8(*r_dst); + uint res = MASK_OUT_ABOVE_8(src << shift); + + if(shift != 0) + USE_CYCLES(shift<> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_16(*r_dst); + uint res = MASK_OUT_ABOVE_16(src << shift); + + if(shift != 0) + USE_CYCLES(shift<> (8-shift); + src &= m68ki_shift_16_table[shift + 1]; + FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7; +} + + +static void m68k_op_asl_32_s(void) +{ + uint* r_dst = &DY; + uint shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint src = *r_dst; + uint res = MASK_OUT_ABOVE_32(src << shift); + + if(shift != 0) + USE_CYCLES(shift<> (24-shift); + src &= m68ki_shift_32_table[shift + 1]; + FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7; +} + + +static void m68k_op_asl_8_r(void) +{ + uint* r_dst = &DY; + uint shift = DX & 0x3f; + uint src = MASK_OUT_ABOVE_8(*r_dst); + uint res = MASK_OUT_ABOVE_8(src << shift); + + if(shift != 0) + { + USE_CYCLES(shift<> 8; + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + src &= m68ki_shift_16_table[shift + 1]; + FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7; + return; + } + + *r_dst &= 0xffff0000; + FLAG_X = FLAG_C = ((shift == 16 ? src & 1 : 0))<<8; + FLAG_N = NFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; + FLAG_V = (!(src == 0))<<7; + return; + } + + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_16(src); + FLAG_Z = src; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_asl_32_r(void) +{ + uint* r_dst = &DY; + uint shift = DX & 0x3f; + uint src = *r_dst; + uint res = MASK_OUT_ABOVE_32(src << shift); + + if(shift != 0) + { + USE_CYCLES(shift<> (32 - shift)) << 8; + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + src &= m68ki_shift_32_table[shift + 1]; + FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7; + return; + } + + *r_dst = 0; + FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8; + FLAG_N = NFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; + FLAG_V = (!(src == 0))<<7; + return; + } + + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_32(src); + FLAG_Z = src; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_asl_16_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + src &= 0xc000; + FLAG_V = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_asl_16_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + src &= 0xc000; + FLAG_V = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_asl_16_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + src &= 0xc000; + FLAG_V = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_asl_16_di(void) +{ + uint ea = EA_AY_DI_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + src &= 0xc000; + FLAG_V = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_asl_16_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + src &= 0xc000; + FLAG_V = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_asl_16_aw(void) +{ + uint ea = EA_AW_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + src &= 0xc000; + FLAG_V = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_asl_16_al(void) +{ + uint ea = EA_AL_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + src &= 0xc000; + FLAG_V = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_bhi_8(void) +{ + if(COND_HI()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_bls_8(void) +{ + if(COND_LS()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_bcc_8(void) +{ + if(COND_CC()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_bcs_8(void) +{ + if(COND_CS()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_bne_8(void) +{ + if(COND_NE()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_beq_8(void) +{ + if(COND_EQ()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_bvc_8(void) +{ + if(COND_VC()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_bvs_8(void) +{ + if(COND_VS()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_bpl_8(void) +{ + if(COND_PL()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_bmi_8(void) +{ + if(COND_MI()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_bge_8(void) +{ + if(COND_GE()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_blt_8(void) +{ + if(COND_LT()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_bgt_8(void) +{ + if(COND_GT()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_ble_8(void) +{ + if(COND_LE()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); +} + + +static void m68k_op_bhi_16(void) +{ + if(COND_HI()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_bls_16(void) +{ + if(COND_LS()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_bcc_16(void) +{ + if(COND_CC()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_bcs_16(void) +{ + if(COND_CS()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_bne_16(void) +{ + if(COND_NE()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_beq_16(void) +{ + if(COND_EQ()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_bvc_16(void) +{ + if(COND_VC()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_bvs_16(void) +{ + if(COND_VS()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_bpl_16(void) +{ + if(COND_PL()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_bmi_16(void) +{ + if(COND_MI()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_bge_16(void) +{ + if(COND_GE()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_blt_16(void) +{ + if(COND_LT()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_bgt_16(void) +{ + if(COND_GT()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_ble_16(void) +{ + if(COND_LE()) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_BCC_NOTAKE_W); +} + + +static void m68k_op_bhi_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_HI()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_HI()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_bls_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_LS()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_LS()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_bcc_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_CC()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_CC()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_bcs_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_CS()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_CS()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_bne_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_NE()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_NE()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_beq_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_EQ()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_EQ()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_bvc_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_VC()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_VC()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_bvs_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_VS()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_VS()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_bpl_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_PL()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_PL()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_bmi_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_MI()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_MI()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_bge_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_GE()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_GE()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_blt_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_LT()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_LT()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_bgt_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_GT()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_GT()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_ble_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_LE()) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + return; + } + REG_PC += 4; + return; + } + else + { + if(COND_LE()) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + return; + } + USE_CYCLES(CYC_BCC_NOTAKE_B); + } +} + + +static void m68k_op_bchg_32_r_d(void) +{ + uint* r_dst = &DY; + uint mask = 1 << (DX & 0x1f); + + FLAG_Z = *r_dst & mask; + *r_dst ^= mask; +} + + +static void m68k_op_bchg_8_r_ai(void) +{ + uint ea = EA_AY_AI_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_pi(void) +{ + uint ea = EA_AY_PI_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_pi7(void) +{ + uint ea = EA_A7_PI_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_pd(void) +{ + uint ea = EA_AY_PD_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_pd7(void) +{ + uint ea = EA_A7_PD_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_di(void) +{ + uint ea = EA_AY_DI_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_ix(void) +{ + uint ea = EA_AY_IX_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_aw(void) +{ + uint ea = EA_AW_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_al(void) +{ + uint ea = EA_AL_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_32_s_d(void) +{ + uint* r_dst = &DY; + uint mask = 1 << (OPER_I_8() & 0x1f); + + FLAG_Z = *r_dst & mask; + *r_dst ^= mask; +} + + +static void m68k_op_bchg_8_s_ai(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_AI_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_pi(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_PI_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_pi7(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_A7_PI_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_pd(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_PD_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_pd7(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_A7_PD_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_di(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_DI_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_ix(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_IX_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_aw(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AW_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_al(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AL_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src ^ mask); +} + + +static void m68k_op_bclr_32_r_d(void) +{ + uint* r_dst = &DY; + uint mask = 1 << (DX & 0x1f); + + FLAG_Z = *r_dst & mask; + *r_dst &= ~mask; +} + + +static void m68k_op_bclr_8_r_ai(void) +{ + uint ea = EA_AY_AI_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_pi(void) +{ + uint ea = EA_AY_PI_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_pi7(void) +{ + uint ea = EA_A7_PI_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_pd(void) +{ + uint ea = EA_AY_PD_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_pd7(void) +{ + uint ea = EA_A7_PD_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_di(void) +{ + uint ea = EA_AY_DI_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_ix(void) +{ + uint ea = EA_AY_IX_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_aw(void) +{ + uint ea = EA_AW_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_al(void) +{ + uint ea = EA_AL_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_32_s_d(void) +{ + uint* r_dst = &DY; + uint mask = 1 << (OPER_I_8() & 0x1f); + + FLAG_Z = *r_dst & mask; + *r_dst &= ~mask; +} + + +static void m68k_op_bclr_8_s_ai(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_AI_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_pi(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_PI_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_pi7(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_A7_PI_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_pd(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_PD_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_pd7(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_A7_PD_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_di(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_DI_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_ix(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_IX_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_aw(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AW_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_al(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AL_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src & ~mask); +} + + +static void m68k_op_bfchg_32_d(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint offset = (word2>>6)&31; + uint width = word2; + uint* data = &DY; + uint64 mask; + + + if(BIT_B(word2)) + offset = REG_D[offset&7]; + if(BIT_5(word2)) + width = REG_D[width&7]; + + offset &= 31; + width = ((width-1) & 31) + 1; + + mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask = ROR_32(mask, offset); + + FLAG_N = NFLAG_32(*data<>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_AI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long ^ mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte ^ mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfchg_32_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_DI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long ^ mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte ^ mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfchg_32_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_IX_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long ^ mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte ^ mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfchg_32_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AW_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long ^ mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte ^ mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfchg_32_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AL_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long ^ mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte ^ mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfclr_32_d(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint offset = (word2>>6)&31; + uint width = word2; + uint* data = &DY; + uint64 mask; + + + if(BIT_B(word2)) + offset = REG_D[offset&7]; + if(BIT_5(word2)) + width = REG_D[width&7]; + + + offset &= 31; + width = ((width-1) & 31) + 1; + + + mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask = ROR_32(mask, offset); + + FLAG_N = NFLAG_32(*data<>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_AI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long & ~mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte & ~mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfclr_32_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_DI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long & ~mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte & ~mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfclr_32_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_IX_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long & ~mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte & ~mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfclr_32_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AW_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long & ~mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte & ~mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfclr_32_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AL_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long & ~mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte & ~mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfexts_32_d(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint offset = (word2>>6)&31; + uint width = word2; + uint64 data = DY; + + + if(BIT_B(word2)) + offset = REG_D[offset&7]; + if(BIT_5(word2)) + width = REG_D[width&7]; + + offset &= 31; + width = ((width-1) & 31) + 1; + + data = ROL_32(data, offset); + FLAG_N = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2>>12)&7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfexts_32_ai(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_AY_AI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfexts_32_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_AY_DI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfexts_32_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_AY_IX_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfexts_32_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_AW_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfexts_32_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_AL_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfexts_32_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_PCDI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfexts_32_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_PCIX_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfextu_32_d(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint offset = (word2>>6)&31; + uint width = word2; + uint64 data = DY; + + + if(BIT_B(word2)) + offset = REG_D[offset&7]; + if(BIT_5(word2)) + width = REG_D[width&7]; + + offset &= 31; + width = ((width-1) & 31) + 1; + + data = ROL_32(data, offset); + FLAG_N = NFLAG_32(data); + data >>= 32 - width; + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2>>12)&7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfextu_32_ai(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_AY_AI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfextu_32_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_AY_DI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfextu_32_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_AY_IX_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfextu_32_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_AW_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfextu_32_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_AL_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfextu_32_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_PCDI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfextu_32_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint data; + uint ea = EA_PCIX_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + REG_D[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfffo_32_d(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint offset = (word2>>6)&31; + uint width = word2; + uint64 data = DY; + uint bit; + + + if(BIT_B(word2)) + offset = REG_D[offset&7]; + if(BIT_5(word2)) + width = REG_D[width&7]; + + offset &= 31; + width = ((width-1) & 31) + 1; + + data = ROL_32(data, offset); + FLAG_N = NFLAG_32(data); + data >>= 32 - width; + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfffo_32_ai(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + sint local_offset; + uint width = word2; + uint data; + uint bit; + uint ea = EA_AY_AI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + local_offset = offset % 8; + if(local_offset < 0) + { + local_offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << local_offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfffo_32_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + sint local_offset; + uint width = word2; + uint data; + uint bit; + uint ea = EA_AY_DI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + local_offset = offset % 8; + if(local_offset < 0) + { + local_offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << local_offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfffo_32_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + sint local_offset; + uint width = word2; + uint data; + uint bit; + uint ea = EA_AY_IX_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + local_offset = offset % 8; + if(local_offset < 0) + { + local_offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << local_offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfffo_32_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + sint local_offset; + uint width = word2; + uint data; + uint bit; + uint ea = EA_AW_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + local_offset = offset % 8; + if(local_offset < 0) + { + local_offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << local_offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfffo_32_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + sint local_offset; + uint width = word2; + uint data; + uint bit; + uint ea = EA_AL_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + local_offset = offset % 8; + if(local_offset < 0) + { + local_offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << local_offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfffo_32_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + sint local_offset; + uint width = word2; + uint data; + uint bit; + uint ea = EA_PCDI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + local_offset = offset % 8; + if(local_offset < 0) + { + local_offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << local_offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfffo_32_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + sint local_offset; + uint width = word2; + uint data; + uint bit; + uint ea = EA_PCIX_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + local_offset = offset % 8; + if(local_offset < 0) + { + local_offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + data = m68ki_read_32(ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8(ea+4) << local_offset) >> 8; + + FLAG_N = NFLAG_32(data); + data >>= (32 - width); + + FLAG_Z = data; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfins_32_d(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint offset = (word2>>6)&31; + uint width = word2; + uint* data = &DY; + uint64 mask; + uint64 insert = REG_D[(word2>>12)&7]; + + + if(BIT_B(word2)) + offset = REG_D[offset&7]; + if(BIT_5(word2)) + width = REG_D[width&7]; + + + offset &= 31; + width = ((width-1) & 31) + 1; + + + mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask = ROR_32(mask, offset); + + insert = MASK_OUT_ABOVE_32(insert << (32 - width)); + FLAG_N = NFLAG_32(insert); + FLAG_Z = insert; + insert = ROR_32(insert, offset); + + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + *data &= ~mask; + *data |= insert; + + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfins_32_ai(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint insert_base = REG_D[(word2>>12)&7]; + uint insert_long; + uint insert_byte; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_AI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width)); + FLAG_N = NFLAG_32(insert_base); + FLAG_Z = insert_base; + insert_long = insert_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, (data_long & ~mask_long) | insert_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + insert_byte = MASK_OUT_ABOVE_8(insert_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfins_32_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint insert_base = REG_D[(word2>>12)&7]; + uint insert_long; + uint insert_byte; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_DI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width)); + FLAG_N = NFLAG_32(insert_base); + FLAG_Z = insert_base; + insert_long = insert_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, (data_long & ~mask_long) | insert_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + insert_byte = MASK_OUT_ABOVE_8(insert_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfins_32_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint insert_base = REG_D[(word2>>12)&7]; + uint insert_long; + uint insert_byte; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_IX_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width)); + FLAG_N = NFLAG_32(insert_base); + FLAG_Z = insert_base; + insert_long = insert_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, (data_long & ~mask_long) | insert_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + insert_byte = MASK_OUT_ABOVE_8(insert_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfins_32_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint insert_base = REG_D[(word2>>12)&7]; + uint insert_long; + uint insert_byte; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AW_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width)); + FLAG_N = NFLAG_32(insert_base); + FLAG_Z = insert_base; + insert_long = insert_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, (data_long & ~mask_long) | insert_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + insert_byte = MASK_OUT_ABOVE_8(insert_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfins_32_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint insert_base = REG_D[(word2>>12)&7]; + uint insert_long; + uint insert_byte; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AL_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width)); + FLAG_N = NFLAG_32(insert_base); + FLAG_Z = insert_base; + insert_long = insert_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, (data_long & ~mask_long) | insert_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + insert_byte = MASK_OUT_ABOVE_8(insert_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfset_32_d(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint offset = (word2>>6)&31; + uint width = word2; + uint* data = &DY; + uint64 mask; + + + if(BIT_B(word2)) + offset = REG_D[offset&7]; + if(BIT_5(word2)) + width = REG_D[width&7]; + + + offset &= 31; + width = ((width-1) & 31) + 1; + + + mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask = ROR_32(mask, offset); + + FLAG_N = NFLAG_32(*data<>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_AI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long | mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte | mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfset_32_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_DI_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long | mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte | mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfset_32_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_IX_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long | mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte | mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfset_32_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AW_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long | mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte | mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bfset_32_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AL_8(); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = NFLAG_32(data_long << offset); + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + m68ki_write_32(ea, data_long | mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + m68ki_write_8(ea+4, data_byte | mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bftst_32_d(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint offset = (word2>>6)&31; + uint width = word2; + uint* data = &DY; + uint64 mask; + + + if(BIT_B(word2)) + offset = REG_D[offset&7]; + if(BIT_5(word2)) + width = REG_D[width&7]; + + + offset &= 31; + width = ((width-1) & 31) + 1; + + + mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask = ROR_32(mask, offset); + + FLAG_N = NFLAG_32(*data<>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_AI_8(); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = ((data_long & (0x80000000 >> offset))<>24; + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bftst_32_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_DI_8(); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = ((data_long & (0x80000000 >> offset))<>24; + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bftst_32_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AY_IX_8(); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = ((data_long & (0x80000000 >> offset))<>24; + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bftst_32_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AW_8(); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = ((data_long & (0x80000000 >> offset))<>24; + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bftst_32_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_AL_8(); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = ((data_long & (0x80000000 >> offset))<>24; + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bftst_32_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_PCDI_8(); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = ((data_long & (0x80000000 >> offset))<>24; + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bftst_32_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + sint offset = (word2>>6)&31; + uint width = word2; + uint mask_base; + uint data_long; + uint mask_long; + uint data_byte = 0; + uint mask_byte = 0; + uint ea = EA_PCIX_8(); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D[offset&7]); + if(BIT_5(word2)) + width = REG_D[width&7]; + + /* Offset is signed so we have to use ugly math =( */ + ea += offset / 8; + offset %= 8; + if(offset < 0) + { + offset += 8; + ea--; + } + width = ((width-1) & 31) + 1; + + + mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask_long = mask_base >> offset; + + data_long = m68ki_read_32(ea); + FLAG_N = ((data_long & (0x80000000 >> offset))<>24; + FLAG_Z = data_long & mask_long; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base); + data_byte = m68ki_read_8(ea+4); + FLAG_Z |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bkpt(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + m68ki_bkpt_ack(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE) ? REG_IR & 7 : 0); /* auto-disable (see m68kcpu.h) */ + } + m68ki_exception_illegal(); +} + + +static void m68k_op_bra_8(void) +{ + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + if(REG_PC == REG_PPC) + USE_ALL_CYCLES(); +} + + +static void m68k_op_bra_16(void) +{ + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + if(REG_PC == REG_PPC) + USE_ALL_CYCLES(); +} + + +static void m68k_op_bra_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint offset = OPER_I_32(); + REG_PC -= 4; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32(offset); + if(REG_PC == REG_PPC) + USE_ALL_CYCLES(); + return; + } + else + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + if(REG_PC == REG_PPC) + USE_ALL_CYCLES(); + } +} + + +static void m68k_op_bset_32_r_d(void) +{ + uint* r_dst = &DY; + uint mask = 1 << (DX & 0x1f); + + FLAG_Z = *r_dst & mask; + *r_dst |= mask; +} + + +static void m68k_op_bset_8_r_ai(void) +{ + uint ea = EA_AY_AI_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_r_pi(void) +{ + uint ea = EA_AY_PI_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_r_pi7(void) +{ + uint ea = EA_A7_PI_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_r_pd(void) +{ + uint ea = EA_AY_PD_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_r_pd7(void) +{ + uint ea = EA_A7_PD_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_r_di(void) +{ + uint ea = EA_AY_DI_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_r_ix(void) +{ + uint ea = EA_AY_IX_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_r_aw(void) +{ + uint ea = EA_AW_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_r_al(void) +{ + uint ea = EA_AL_8(); + uint src = m68ki_read_8(ea); + uint mask = 1 << (DX & 7); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_32_s_d(void) +{ + uint* r_dst = &DY; + uint mask = 1 << (OPER_I_8() & 0x1f); + + FLAG_Z = *r_dst & mask; + *r_dst |= mask; +} + + +static void m68k_op_bset_8_s_ai(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_AI_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_s_pi(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_PI_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_s_pi7(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_A7_PI_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_s_pd(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_PD_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_s_pd7(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_A7_PD_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_s_di(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_DI_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_s_ix(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AY_IX_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_s_aw(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AW_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bset_8_s_al(void) +{ + uint mask = 1 << (OPER_I_8() & 7); + uint ea = EA_AL_8(); + uint src = m68ki_read_8(ea); + + FLAG_Z = src & mask; + m68ki_write_8(ea, src | mask); +} + + +static void m68k_op_bsr_8(void) +{ + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32(REG_PC); + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); +} + + +static void m68k_op_bsr_16(void) +{ + uint offset = OPER_I_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32(REG_PC); + REG_PC -= 2; + m68ki_branch_16(offset); +} + + +static void m68k_op_bsr_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint offset = OPER_I_32(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32(REG_PC); + REG_PC -= 4; + m68ki_branch_32(offset); + return; + } + else + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32(REG_PC); + m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); + } +} + + +static void m68k_op_btst_32_r_d(void) +{ + FLAG_Z = DY & (1 << (DX & 0x1f)); +} + + +static void m68k_op_btst_8_r_ai(void) +{ + FLAG_Z = OPER_AY_AI_8() & (1 << (DX & 7)); +} + + +static void m68k_op_btst_8_r_pi(void) +{ + FLAG_Z = OPER_AY_PI_8() & (1 << (DX & 7)); +} + + +static void m68k_op_btst_8_r_pi7(void) +{ + FLAG_Z = OPER_A7_PI_8() & (1 << (DX & 7)); +} + + +static void m68k_op_btst_8_r_pd(void) +{ + FLAG_Z = OPER_AY_PD_8() & (1 << (DX & 7)); +} + + +static void m68k_op_btst_8_r_pd7(void) +{ + FLAG_Z = OPER_A7_PD_8() & (1 << (DX & 7)); +} + + +static void m68k_op_btst_8_r_di(void) +{ + FLAG_Z = OPER_AY_DI_8() & (1 << (DX & 7)); +} + + +static void m68k_op_btst_8_r_ix(void) +{ + FLAG_Z = OPER_AY_IX_8() & (1 << (DX & 7)); +} + + +static void m68k_op_btst_8_r_aw(void) +{ + FLAG_Z = OPER_AW_8() & (1 << (DX & 7)); +} + + +static void m68k_op_btst_8_r_al(void) +{ + FLAG_Z = OPER_AL_8() & (1 << (DX & 7)); +} + + +static void m68k_op_btst_8_r_pcdi(void) +{ + FLAG_Z = OPER_PCDI_8() & (1 << (DX & 7)); +} + + +static void m68k_op_btst_8_r_pcix(void) +{ + FLAG_Z = OPER_PCIX_8() & (1 << (DX & 7)); +} + + +static void m68k_op_btst_8_r_i(void) +{ + FLAG_Z = OPER_I_8() & (1 << (DX & 7)); +} + + +static void m68k_op_btst_32_s_d(void) +{ + FLAG_Z = DY & (1 << (OPER_I_8() & 0x1f)); +} + + +static void m68k_op_btst_8_s_ai(void) +{ + uint bit = OPER_I_8() & 7; + + FLAG_Z = OPER_AY_AI_8() & (1 << bit); +} + + +static void m68k_op_btst_8_s_pi(void) +{ + uint bit = OPER_I_8() & 7; + + FLAG_Z = OPER_AY_PI_8() & (1 << bit); +} + + +static void m68k_op_btst_8_s_pi7(void) +{ + uint bit = OPER_I_8() & 7; + + FLAG_Z = OPER_A7_PI_8() & (1 << bit); +} + + +static void m68k_op_btst_8_s_pd(void) +{ + uint bit = OPER_I_8() & 7; + + FLAG_Z = OPER_AY_PD_8() & (1 << bit); +} + + +static void m68k_op_btst_8_s_pd7(void) +{ + uint bit = OPER_I_8() & 7; + + FLAG_Z = OPER_A7_PD_8() & (1 << bit); +} + + +static void m68k_op_btst_8_s_di(void) +{ + uint bit = OPER_I_8() & 7; + + FLAG_Z = OPER_AY_DI_8() & (1 << bit); +} + + +static void m68k_op_btst_8_s_ix(void) +{ + uint bit = OPER_I_8() & 7; + + FLAG_Z = OPER_AY_IX_8() & (1 << bit); +} + + +static void m68k_op_btst_8_s_aw(void) +{ + uint bit = OPER_I_8() & 7; + + FLAG_Z = OPER_AW_8() & (1 << bit); +} + + +static void m68k_op_btst_8_s_al(void) +{ + uint bit = OPER_I_8() & 7; + + FLAG_Z = OPER_AL_8() & (1 << bit); +} + + +static void m68k_op_btst_8_s_pcdi(void) +{ + uint bit = OPER_I_8() & 7; + + FLAG_Z = OPER_PCDI_8() & (1 << bit); +} + + +static void m68k_op_btst_8_s_pcix(void) +{ + uint bit = OPER_I_8() & 7; + + FLAG_Z = OPER_PCIX_8() & (1 << bit); +} + + +static void m68k_op_callm_32_ai(void) +{ + /* note: watch out for pcrelative modes */ + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + { + uint ea = EA_AY_AI_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + REG_PC += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, + m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_callm_32_di(void) +{ + /* note: watch out for pcrelative modes */ + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + { + uint ea = EA_AY_DI_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + REG_PC += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, + m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_callm_32_ix(void) +{ + /* note: watch out for pcrelative modes */ + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + { + uint ea = EA_AY_IX_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + REG_PC += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, + m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_callm_32_aw(void) +{ + /* note: watch out for pcrelative modes */ + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + { + uint ea = EA_AW_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + REG_PC += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, + m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_callm_32_al(void) +{ + /* note: watch out for pcrelative modes */ + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + { + uint ea = EA_AL_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + REG_PC += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, + m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_callm_32_pcdi(void) +{ + /* note: watch out for pcrelative modes */ + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + { + uint ea = EA_PCDI_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + REG_PC += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, + m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_callm_32_pcix(void) +{ + /* note: watch out for pcrelative modes */ + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + { + uint ea = EA_PCIX_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + REG_PC += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, + m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_8_ai(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_AI_8(); + uint dest = m68ki_read_8(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(*compare, dest, res); + FLAG_C = CFLAG_8(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_8_pi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_PI_8(); + uint dest = m68ki_read_8(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(*compare, dest, res); + FLAG_C = CFLAG_8(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_8_pi7(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_A7_PI_8(); + uint dest = m68ki_read_8(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(*compare, dest, res); + FLAG_C = CFLAG_8(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_8_pd(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_PD_8(); + uint dest = m68ki_read_8(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(*compare, dest, res); + FLAG_C = CFLAG_8(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_8_pd7(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_A7_PD_8(); + uint dest = m68ki_read_8(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(*compare, dest, res); + FLAG_C = CFLAG_8(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_8_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_DI_8(); + uint dest = m68ki_read_8(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(*compare, dest, res); + FLAG_C = CFLAG_8(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_8_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_IX_8(); + uint dest = m68ki_read_8(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(*compare, dest, res); + FLAG_C = CFLAG_8(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_8_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AW_8(); + uint dest = m68ki_read_8(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(*compare, dest, res); + FLAG_C = CFLAG_8(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_8_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AL_8(); + uint dest = m68ki_read_8(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(*compare, dest, res); + FLAG_C = CFLAG_8(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_16_ai(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_AI_16(); + uint dest = m68ki_read_16(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(*compare, dest, res); + FLAG_C = CFLAG_16(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_16_pi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_PI_16(); + uint dest = m68ki_read_16(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(*compare, dest, res); + FLAG_C = CFLAG_16(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_16_pd(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_PD_16(); + uint dest = m68ki_read_16(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(*compare, dest, res); + FLAG_C = CFLAG_16(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_16_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_DI_16(); + uint dest = m68ki_read_16(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(*compare, dest, res); + FLAG_C = CFLAG_16(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_16_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_IX_16(); + uint dest = m68ki_read_16(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(*compare, dest, res); + FLAG_C = CFLAG_16(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_16_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AW_16(); + uint dest = m68ki_read_16(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(*compare, dest, res); + FLAG_C = CFLAG_16(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_16_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AL_16(); + uint dest = m68ki_read_16(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(*compare, dest, res); + FLAG_C = CFLAG_16(res); + + if(COND_NE()) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + USE_CYCLES(3); + m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_32_ai(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_AI_32(); + uint dest = m68ki_read_32(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - *compare; + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(*compare, dest, res); + FLAG_C = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE()) + *compare = dest; + else + { + USE_CYCLES(3); + m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_32_pi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_PI_32(); + uint dest = m68ki_read_32(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - *compare; + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(*compare, dest, res); + FLAG_C = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE()) + *compare = dest; + else + { + USE_CYCLES(3); + m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_32_pd(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_PD_32(); + uint dest = m68ki_read_32(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - *compare; + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(*compare, dest, res); + FLAG_C = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE()) + *compare = dest; + else + { + USE_CYCLES(3); + m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_32_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_DI_32(); + uint dest = m68ki_read_32(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - *compare; + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(*compare, dest, res); + FLAG_C = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE()) + *compare = dest; + else + { + USE_CYCLES(3); + m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_32_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_IX_32(); + uint dest = m68ki_read_32(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - *compare; + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(*compare, dest, res); + FLAG_C = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE()) + *compare = dest; + else + { + USE_CYCLES(3); + m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_32_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AW_32(); + uint dest = m68ki_read_32(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - *compare; + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(*compare, dest, res); + FLAG_C = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE()) + *compare = dest; + else + { + USE_CYCLES(3); + m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas_32_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint ea = EA_AL_32(); + uint dest = m68ki_read_32(ea); + uint* compare = ®_D[word2 & 7]; + uint res = dest - *compare; + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(*compare, dest, res); + FLAG_C = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE()) + *compare = dest; + else + { + USE_CYCLES(3); + m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas2_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_32(); + uint* compare1 = ®_D[(word2 >> 16) & 7]; + uint ea1 = REG_DA[(word2 >> 28) & 15]; + uint dest1 = m68ki_read_16(ea1); + uint res1 = dest1 - MASK_OUT_ABOVE_16(*compare1); + uint* compare2 = ®_D[word2 & 7]; + uint ea2 = REG_DA[(word2 >> 12) & 15]; + uint dest2 = m68ki_read_16(ea2); + uint res2; + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_16(res1); + FLAG_Z = MASK_OUT_ABOVE_16(res1); + FLAG_V = VFLAG_SUB_16(*compare1, dest1, res1); + FLAG_C = CFLAG_16(res1); + + if(COND_EQ()) + { + res2 = dest2 - MASK_OUT_ABOVE_16(*compare2); + + FLAG_N = NFLAG_16(res2); + FLAG_Z = MASK_OUT_ABOVE_16(res2); + FLAG_V = VFLAG_SUB_16(*compare2, dest2, res2); + FLAG_C = CFLAG_16(res2); + + if(COND_EQ()) + { + USE_CYCLES(3); + m68ki_write_16(ea1, REG_D[(word2 >> 22) & 7]); + m68ki_write_16(ea2, REG_D[(word2 >> 6) & 7]); + return; + } + } + *compare1 = BIT_1F(word2) ? MAKE_INT_16(dest1) : MASK_OUT_BELOW_16(*compare1) | dest1; + *compare2 = BIT_F(word2) ? MAKE_INT_16(dest2) : MASK_OUT_BELOW_16(*compare2) | dest2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cas2_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_32(); + uint* compare1 = ®_D[(word2 >> 16) & 7]; + uint ea1 = REG_DA[(word2 >> 28) & 15]; + uint dest1 = m68ki_read_32(ea1); + uint res1 = dest1 - *compare1; + uint* compare2 = ®_D[word2 & 7]; + uint ea2 = REG_DA[(word2 >> 12) & 15]; + uint dest2 = m68ki_read_32(ea2); + uint res2; + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + FLAG_N = NFLAG_32(res1); + FLAG_Z = MASK_OUT_ABOVE_32(res1); + FLAG_V = VFLAG_SUB_32(*compare1, dest1, res1); + FLAG_C = CFLAG_SUB_32(*compare1, dest1, res1); + + if(COND_EQ()) + { + res2 = dest2 - *compare2; + + FLAG_N = NFLAG_32(res2); + FLAG_Z = MASK_OUT_ABOVE_32(res2); + FLAG_V = VFLAG_SUB_32(*compare2, dest2, res2); + FLAG_C = CFLAG_SUB_32(*compare2, dest2, res2); + + if(COND_EQ()) + { + USE_CYCLES(3); + m68ki_write_32(ea1, REG_D[(word2 >> 22) & 7]); + m68ki_write_32(ea2, REG_D[(word2 >> 6) & 7]); + return; + } + } + *compare1 = dest1; + *compare2 = dest2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk_16_d(void) +{ + sint src = MAKE_INT_16(DX); + sint bound = MAKE_INT_16(DY); + + FLAG_Z = ZFLAG_16(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_ai(void) +{ + sint src = MAKE_INT_16(DX); + sint bound = MAKE_INT_16(OPER_AY_AI_16()); + + FLAG_Z = ZFLAG_16(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_pi(void) +{ + sint src = MAKE_INT_16(DX); + sint bound = MAKE_INT_16(OPER_AY_PI_16()); + + FLAG_Z = ZFLAG_16(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_pd(void) +{ + sint src = MAKE_INT_16(DX); + sint bound = MAKE_INT_16(OPER_AY_PD_16()); + + FLAG_Z = ZFLAG_16(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_di(void) +{ + sint src = MAKE_INT_16(DX); + sint bound = MAKE_INT_16(OPER_AY_DI_16()); + + FLAG_Z = ZFLAG_16(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_ix(void) +{ + sint src = MAKE_INT_16(DX); + sint bound = MAKE_INT_16(OPER_AY_IX_16()); + + FLAG_Z = ZFLAG_16(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_aw(void) +{ + sint src = MAKE_INT_16(DX); + sint bound = MAKE_INT_16(OPER_AW_16()); + + FLAG_Z = ZFLAG_16(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_al(void) +{ + sint src = MAKE_INT_16(DX); + sint bound = MAKE_INT_16(OPER_AL_16()); + + FLAG_Z = ZFLAG_16(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_pcdi(void) +{ + sint src = MAKE_INT_16(DX); + sint bound = MAKE_INT_16(OPER_PCDI_16()); + + FLAG_Z = ZFLAG_16(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_pcix(void) +{ + sint src = MAKE_INT_16(DX); + sint bound = MAKE_INT_16(OPER_PCIX_16()); + + FLAG_Z = ZFLAG_16(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_i(void) +{ + sint src = MAKE_INT_16(DX); + sint bound = MAKE_INT_16(OPER_I_16()); + + FLAG_Z = ZFLAG_16(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); +} + + +static void m68k_op_chk_32_d(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + sint src = MAKE_INT_32(DX); + sint bound = MAKE_INT_32(DY); + + FLAG_Z = ZFLAG_32(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk_32_ai(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + sint src = MAKE_INT_32(DX); + sint bound = MAKE_INT_32(OPER_AY_AI_32()); + + FLAG_Z = ZFLAG_32(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk_32_pi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + sint src = MAKE_INT_32(DX); + sint bound = MAKE_INT_32(OPER_AY_PI_32()); + + FLAG_Z = ZFLAG_32(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk_32_pd(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + sint src = MAKE_INT_32(DX); + sint bound = MAKE_INT_32(OPER_AY_PD_32()); + + FLAG_Z = ZFLAG_32(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk_32_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + sint src = MAKE_INT_32(DX); + sint bound = MAKE_INT_32(OPER_AY_DI_32()); + + FLAG_Z = ZFLAG_32(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk_32_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + sint src = MAKE_INT_32(DX); + sint bound = MAKE_INT_32(OPER_AY_IX_32()); + + FLAG_Z = ZFLAG_32(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk_32_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + sint src = MAKE_INT_32(DX); + sint bound = MAKE_INT_32(OPER_AW_32()); + + FLAG_Z = ZFLAG_32(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk_32_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + sint src = MAKE_INT_32(DX); + sint bound = MAKE_INT_32(OPER_AL_32()); + + FLAG_Z = ZFLAG_32(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk_32_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + sint src = MAKE_INT_32(DX); + sint bound = MAKE_INT_32(OPER_PCDI_32()); + + FLAG_Z = ZFLAG_32(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk_32_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + sint src = MAKE_INT_32(DX); + sint bound = MAKE_INT_32(OPER_PCIX_32()); + + FLAG_Z = ZFLAG_32(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk_32_i(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + sint src = MAKE_INT_32(DX); + sint bound = MAKE_INT_32(OPER_I_32()); + + FLAG_Z = ZFLAG_32(src); /* Undocumented */ + FLAG_V = VFLAG_CLEAR; /* Undocumented */ + FLAG_C = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + FLAG_N = (src < 0)<<7; + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_8_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xff; + uint ea = EA_PCDI_8(); + uint lower_bound = m68ki_read_pcrel_8(ea); + uint upper_bound = m68ki_read_pcrel_8(ea + 1); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_8_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xff; + uint ea = EA_PCIX_8(); + uint lower_bound = m68ki_read_pcrel_8(ea); + uint upper_bound = m68ki_read_pcrel_8(ea + 1); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_8_ai(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xff; + uint ea = EA_AY_AI_8(); + uint lower_bound = m68ki_read_8(ea); + uint upper_bound = m68ki_read_8(ea + 1); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_8_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xff; + uint ea = EA_AY_DI_8(); + uint lower_bound = m68ki_read_8(ea); + uint upper_bound = m68ki_read_8(ea + 1); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_8_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xff; + uint ea = EA_AY_IX_8(); + uint lower_bound = m68ki_read_8(ea); + uint upper_bound = m68ki_read_8(ea + 1); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_8_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xff; + uint ea = EA_AW_8(); + uint lower_bound = m68ki_read_8(ea); + uint upper_bound = m68ki_read_8(ea + 1); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_8_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xff; + uint ea = EA_AL_8(); + uint lower_bound = m68ki_read_8(ea); + uint upper_bound = m68ki_read_8(ea + 1); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_16_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xffff; + uint ea = EA_PCDI_16(); + uint lower_bound = m68ki_read_pcrel_16(ea); + uint upper_bound = m68ki_read_pcrel_16(ea + 2); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + FLAG_C = upper_bound - compare; + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_16_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xffff; + uint ea = EA_PCIX_16(); + uint lower_bound = m68ki_read_pcrel_16(ea); + uint upper_bound = m68ki_read_pcrel_16(ea + 2); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + FLAG_C = upper_bound - compare; + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_16_ai(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xffff; + uint ea = EA_AY_AI_16(); + uint lower_bound = m68ki_read_16(ea); + uint upper_bound = m68ki_read_16(ea + 2); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + FLAG_C = compare - lower_bound; + + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + FLAG_C = upper_bound - compare; + + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_16_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xffff; + uint ea = EA_AY_DI_16(); + uint lower_bound = m68ki_read_16(ea); + uint upper_bound = m68ki_read_16(ea + 2); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + FLAG_C = compare - lower_bound; + + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + FLAG_C = upper_bound - compare; + + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_16_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xffff; + uint ea = EA_AY_IX_16(); + uint lower_bound = m68ki_read_16(ea); + uint upper_bound = m68ki_read_16(ea + 2); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + FLAG_C = compare - lower_bound; + + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + FLAG_C = upper_bound - compare; + + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_16_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xffff; + uint ea = EA_AW_16(); + uint lower_bound = m68ki_read_16(ea); + uint upper_bound = m68ki_read_16(ea + 2); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + FLAG_C = compare - lower_bound; + + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + FLAG_C = upper_bound - compare; + + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_16_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]&0xffff; + uint ea = EA_AL_16(); + uint lower_bound = m68ki_read_16(ea); + uint upper_bound = m68ki_read_16(ea + 2); + + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + FLAG_C = compare - lower_bound; + + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + if(!BIT_F(word2)) + FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + FLAG_C = upper_bound - compare; + + FLAG_C = CFLAG_16(FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_32_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]; + uint ea = EA_PCDI_32(); + uint lower_bound = m68ki_read_pcrel_32(ea); + uint upper_bound = m68ki_read_pcrel_32(ea + 4); + + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_32_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]; + uint ea = EA_PCIX_32(); + uint lower_bound = m68ki_read_pcrel_32(ea); + uint upper_bound = m68ki_read_pcrel_32(ea + 4); + + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_32_ai(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]; + uint ea = EA_AY_AI_32(); + uint lower_bound = m68ki_read_32(ea); + uint upper_bound = m68ki_read_32(ea + 4); + + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_32_di(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]; + uint ea = EA_AY_DI_32(); + uint lower_bound = m68ki_read_32(ea); + uint upper_bound = m68ki_read_32(ea + 4); + + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_32_ix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]; + uint ea = EA_AY_IX_32(); + uint lower_bound = m68ki_read_32(ea); + uint upper_bound = m68ki_read_32(ea + 4); + + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_32_aw(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]; + uint ea = EA_AW_32(); + uint lower_bound = m68ki_read_32(ea); + uint upper_bound = m68ki_read_32(ea + 4); + + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_chk2cmp2_32_al(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint compare = REG_DA[(word2 >> 12) & 15]; + uint ea = EA_AL_32(); + uint lower_bound = m68ki_read_32(ea); + uint upper_bound = m68ki_read_32(ea + 4); + + FLAG_C = compare - lower_bound; + FLAG_Z = !((upper_bound==compare) | (lower_bound==compare)); + FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C); + if(COND_CS()) + { + if(BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + + FLAG_C = upper_bound - compare; + FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C); + if(COND_CS() && BIT_B(word2)) + m68ki_exception_trap(EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_clr_8_d(void) +{ + DY &= 0xffffff00; + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_8_al(void) +{ + m68ki_write_8(EA_AL_8(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_16_d(void) +{ + DY &= 0xffff0000; + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_16_ai(void) +{ + m68ki_write_16(EA_AY_AI_16(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_16_pi(void) +{ + m68ki_write_16(EA_AY_PI_16(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_16_pd(void) +{ + m68ki_write_16(EA_AY_PD_16(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_16_di(void) +{ + m68ki_write_16(EA_AY_DI_16(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_16_ix(void) +{ + m68ki_write_16(EA_AY_IX_16(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_16_aw(void) +{ + m68ki_write_16(EA_AW_16(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_16_al(void) +{ + m68ki_write_16(EA_AL_16(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_32_d(void) +{ + DY = 0; + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_32_ai(void) +{ + m68ki_write_32(EA_AY_AI_32(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_32_pi(void) +{ + m68ki_write_32(EA_AY_PI_32(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_32_pd(void) +{ + m68ki_write_32(EA_AY_PD_32(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_32_di(void) +{ + m68ki_write_32(EA_AY_DI_32(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_32_ix(void) +{ + m68ki_write_32(EA_AY_IX_32(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_32_aw(void) +{ + m68ki_write_32(EA_AW_32(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_clr_32_al(void) +{ + m68ki_write_32(EA_AL_32(), 0); + + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; +} + + +static void m68k_op_cmp_8_d(void) +{ + uint src = MASK_OUT_ABOVE_8(DY); + uint dst = MASK_OUT_ABOVE_8(DX); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_ai(void) +{ + uint src = OPER_AY_AI_8(); + uint dst = MASK_OUT_ABOVE_8(DX); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_pi(void) +{ + uint src = OPER_AY_PI_8(); + uint dst = MASK_OUT_ABOVE_8(DX); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_pi7(void) +{ + uint src = OPER_A7_PI_8(); + uint dst = MASK_OUT_ABOVE_8(DX); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_pd(void) +{ + uint src = OPER_AY_PD_8(); + uint dst = MASK_OUT_ABOVE_8(DX); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_pd7(void) +{ + uint src = OPER_A7_PD_8(); + uint dst = MASK_OUT_ABOVE_8(DX); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_di(void) +{ + uint src = OPER_AY_DI_8(); + uint dst = MASK_OUT_ABOVE_8(DX); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_ix(void) +{ + uint src = OPER_AY_IX_8(); + uint dst = MASK_OUT_ABOVE_8(DX); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_aw(void) +{ + uint src = OPER_AW_8(); + uint dst = MASK_OUT_ABOVE_8(DX); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_al(void) +{ + uint src = OPER_AL_8(); + uint dst = MASK_OUT_ABOVE_8(DX); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_pcdi(void) +{ + uint src = OPER_PCDI_8(); + uint dst = MASK_OUT_ABOVE_8(DX); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_pcix(void) +{ + uint src = OPER_PCIX_8(); + uint dst = MASK_OUT_ABOVE_8(DX); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_i(void) +{ + uint src = OPER_I_8(); + uint dst = MASK_OUT_ABOVE_8(DX); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmp_16_d(void) +{ + uint src = MASK_OUT_ABOVE_16(DY); + uint dst = MASK_OUT_ABOVE_16(DX); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_a(void) +{ + uint src = MASK_OUT_ABOVE_16(AY); + uint dst = MASK_OUT_ABOVE_16(DX); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_ai(void) +{ + uint src = OPER_AY_AI_16(); + uint dst = MASK_OUT_ABOVE_16(DX); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_pi(void) +{ + uint src = OPER_AY_PI_16(); + uint dst = MASK_OUT_ABOVE_16(DX); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_pd(void) +{ + uint src = OPER_AY_PD_16(); + uint dst = MASK_OUT_ABOVE_16(DX); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_di(void) +{ + uint src = OPER_AY_DI_16(); + uint dst = MASK_OUT_ABOVE_16(DX); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_ix(void) +{ + uint src = OPER_AY_IX_16(); + uint dst = MASK_OUT_ABOVE_16(DX); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_aw(void) +{ + uint src = OPER_AW_16(); + uint dst = MASK_OUT_ABOVE_16(DX); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_al(void) +{ + uint src = OPER_AL_16(); + uint dst = MASK_OUT_ABOVE_16(DX); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_pcdi(void) +{ + uint src = OPER_PCDI_16(); + uint dst = MASK_OUT_ABOVE_16(DX); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_pcix(void) +{ + uint src = OPER_PCIX_16(); + uint dst = MASK_OUT_ABOVE_16(DX); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_i(void) +{ + uint src = OPER_I_16(); + uint dst = MASK_OUT_ABOVE_16(DX); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmp_32_d(void) +{ + uint src = DY; + uint dst = DX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_a(void) +{ + uint src = AY; + uint dst = DX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_ai(void) +{ + uint src = OPER_AY_AI_32(); + uint dst = DX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_pi(void) +{ + uint src = OPER_AY_PI_32(); + uint dst = DX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_pd(void) +{ + uint src = OPER_AY_PD_32(); + uint dst = DX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_di(void) +{ + uint src = OPER_AY_DI_32(); + uint dst = DX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_ix(void) +{ + uint src = OPER_AY_IX_32(); + uint dst = DX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_aw(void) +{ + uint src = OPER_AW_32(); + uint dst = DX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_al(void) +{ + uint src = OPER_AL_32(); + uint dst = DX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_pcdi(void) +{ + uint src = OPER_PCDI_32(); + uint dst = DX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_pcix(void) +{ + uint src = OPER_PCIX_32(); + uint dst = DX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_i(void) +{ + uint src = OPER_I_32(); + uint dst = DX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_d(void) +{ + uint src = MAKE_INT_16(DY); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_a(void) +{ + uint src = MAKE_INT_16(AY); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_ai(void) +{ + uint src = MAKE_INT_16(OPER_AY_AI_16()); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_pi(void) +{ + uint src = MAKE_INT_16(OPER_AY_PI_16()); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_pd(void) +{ + uint src = MAKE_INT_16(OPER_AY_PD_16()); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_di(void) +{ + uint src = MAKE_INT_16(OPER_AY_DI_16()); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_ix(void) +{ + uint src = MAKE_INT_16(OPER_AY_IX_16()); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_aw(void) +{ + uint src = MAKE_INT_16(OPER_AW_16()); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_al(void) +{ + uint src = MAKE_INT_16(OPER_AL_16()); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_pcdi(void) +{ + uint src = MAKE_INT_16(OPER_PCDI_16()); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_pcix(void) +{ + uint src = MAKE_INT_16(OPER_PCIX_16()); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_i(void) +{ + uint src = MAKE_INT_16(OPER_I_16()); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_d(void) +{ + uint src = DY; + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_a(void) +{ + uint src = AY; + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_ai(void) +{ + uint src = OPER_AY_AI_32(); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_pi(void) +{ + uint src = OPER_AY_PI_32(); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_pd(void) +{ + uint src = OPER_AY_PD_32(); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_di(void) +{ + uint src = OPER_AY_DI_32(); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_ix(void) +{ + uint src = OPER_AY_IX_32(); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_aw(void) +{ + uint src = OPER_AW_32(); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_al(void) +{ + uint src = OPER_AL_32(); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_pcdi(void) +{ + uint src = OPER_PCDI_32(); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_pcix(void) +{ + uint src = OPER_PCIX_32(); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_i(void) +{ + uint src = OPER_I_32(); + uint dst = AX; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_8_d(void) +{ + uint src = OPER_I_8(); + uint dst = MASK_OUT_ABOVE_8(DY); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_ai(void) +{ + uint src = OPER_I_8(); + uint dst = OPER_AY_AI_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_pi(void) +{ + uint src = OPER_I_8(); + uint dst = OPER_AY_PI_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_pi7(void) +{ + uint src = OPER_I_8(); + uint dst = OPER_A7_PI_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_pd(void) +{ + uint src = OPER_I_8(); + uint dst = OPER_AY_PD_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_pd7(void) +{ + uint src = OPER_I_8(); + uint dst = OPER_A7_PD_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_di(void) +{ + uint src = OPER_I_8(); + uint dst = OPER_AY_DI_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_ix(void) +{ + uint src = OPER_I_8(); + uint dst = OPER_AY_IX_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_aw(void) +{ + uint src = OPER_I_8(); + uint dst = OPER_AW_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_al(void) +{ + uint src = OPER_I_8(); + uint dst = OPER_AL_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint src = OPER_I_8(); + uint dst = OPER_PCDI_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cmpi_8_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint src = OPER_I_8(); + uint dst = OPER_PCIX_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cmpi_16_d(void) +{ + uint src = OPER_I_16(); + uint dst = MASK_OUT_ABOVE_16(DY); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_ai(void) +{ + uint src = OPER_I_16(); + uint dst = OPER_AY_AI_16(); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_pi(void) +{ + uint src = OPER_I_16(); + uint dst = OPER_AY_PI_16(); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_pd(void) +{ + uint src = OPER_I_16(); + uint dst = OPER_AY_PD_16(); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_di(void) +{ + uint src = OPER_I_16(); + uint dst = OPER_AY_DI_16(); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_ix(void) +{ + uint src = OPER_I_16(); + uint dst = OPER_AY_IX_16(); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_aw(void) +{ + uint src = OPER_I_16(); + uint dst = OPER_AW_16(); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_al(void) +{ + uint src = OPER_I_16(); + uint dst = OPER_AL_16(); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint src = OPER_I_16(); + uint dst = OPER_PCDI_16(); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cmpi_16_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint src = OPER_I_16(); + uint dst = OPER_PCIX_16(); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cmpi_32_d(void) +{ + uint src = OPER_I_32(); + uint dst = DY; + uint res = dst - src; + + m68ki_cmpild_callback(src, REG_IR & 7); /* auto-disable (see m68kcpu.h) */ + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_ai(void) +{ + uint src = OPER_I_32(); + uint dst = OPER_AY_AI_32(); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_pi(void) +{ + uint src = OPER_I_32(); + uint dst = OPER_AY_PI_32(); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_pd(void) +{ + uint src = OPER_I_32(); + uint dst = OPER_AY_PD_32(); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_di(void) +{ + uint src = OPER_I_32(); + uint dst = OPER_AY_DI_32(); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_ix(void) +{ + uint src = OPER_I_32(); + uint dst = OPER_AY_IX_32(); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_aw(void) +{ + uint src = OPER_I_32(); + uint dst = OPER_AW_32(); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_al(void) +{ + uint src = OPER_I_32(); + uint dst = OPER_AL_32(); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint src = OPER_I_32(); + uint dst = OPER_PCDI_32(); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cmpi_32_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint src = OPER_I_32(); + uint dst = OPER_PCIX_32(); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_cmpm_8_ax7(void) +{ + uint src = OPER_AY_PI_8(); + uint dst = OPER_A7_PI_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpm_8_ay7(void) +{ + uint src = OPER_A7_PI_8(); + uint dst = OPER_AX_PI_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpm_8_axy7(void) +{ + uint src = OPER_A7_PI_8(); + uint dst = OPER_A7_PI_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpm_8(void) +{ + uint src = OPER_AY_PI_8(); + uint dst = OPER_AX_PI_8(); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_C = CFLAG_8(res); +} + + +static void m68k_op_cmpm_16(void) +{ + uint src = OPER_AY_PI_16(); + uint dst = OPER_AX_PI_16(); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_C = CFLAG_16(res); +} + + +static void m68k_op_cmpm_32(void) +{ + uint src = OPER_AY_PI_32(); + uint dst = OPER_AX_PI_32(); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_C = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cpbcc_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, + m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); + return; + } + m68ki_exception_1111(); +} + + +static void m68k_op_cpdbcc_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, + m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); + return; + } + m68ki_exception_1111(); +} + + +static void m68k_op_cpgen_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, + m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); + return; + } + m68ki_exception_1111(); +} + + +static void m68k_op_cpscc_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, + m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); + return; + } + m68ki_exception_1111(); +} + + +static void m68k_op_cptrapcc_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, + m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); + return; + } + m68ki_exception_1111(); +} + + +static void m68k_op_dbt_16(void) +{ + REG_PC += 2; +} + + +static void m68k_op_dbf_16(void) +{ + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); +} + + +static void m68k_op_dbhi_16(void) +{ + if(COND_NOT_HI()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_dbls_16(void) +{ + if(COND_NOT_LS()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_dbcc_16(void) +{ + if(COND_NOT_CC()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_dbcs_16(void) +{ + if(COND_NOT_CS()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_dbne_16(void) +{ + if(COND_NOT_NE()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_dbeq_16(void) +{ + if(COND_NOT_EQ()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_dbvc_16(void) +{ + if(COND_NOT_VC()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_dbvs_16(void) +{ + if(COND_NOT_VS()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_dbpl_16(void) +{ + if(COND_NOT_PL()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_dbmi_16(void) +{ + if(COND_NOT_MI()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_dbge_16(void) +{ + if(COND_NOT_GE()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_dblt_16(void) +{ + if(COND_NOT_LT()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_dbgt_16(void) +{ + if(COND_NOT_GT()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_dble_16(void) +{ + if(COND_NOT_LE()) + { + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint offset = OPER_I_16(); + REG_PC -= 2; + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16(offset); + USE_CYCLES(CYC_DBCC_F_NOEXP); + return; + } + REG_PC += 2; + USE_CYCLES(CYC_DBCC_F_EXP); + return; + } + REG_PC += 2; +} + + +static void m68k_op_divs_16_d(void) +{ + uint* r_dst = &DX; + sint src = MAKE_INT_16(DY); + sint quotient; + sint remainder; + + if(src != 0) + { + if((uint32)*r_dst == 0x80000000 && src == -1) + { + FLAG_Z = 0; + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = 0; + return; + } + + quotient = MAKE_INT_32(*r_dst) / src; + remainder = MAKE_INT_32(*r_dst) % src; + + if(quotient == MAKE_INT_16(quotient)) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_ai(void) +{ + uint* r_dst = &DX; + sint src = MAKE_INT_16(OPER_AY_AI_16()); + sint quotient; + sint remainder; + + if(src != 0) + { + if((uint32)*r_dst == 0x80000000 && src == -1) + { + FLAG_Z = 0; + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = 0; + return; + } + + quotient = MAKE_INT_32(*r_dst) / src; + remainder = MAKE_INT_32(*r_dst) % src; + + if(quotient == MAKE_INT_16(quotient)) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_pi(void) +{ + uint* r_dst = &DX; + sint src = MAKE_INT_16(OPER_AY_PI_16()); + sint quotient; + sint remainder; + + if(src != 0) + { + if((uint32)*r_dst == 0x80000000 && src == -1) + { + FLAG_Z = 0; + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = 0; + return; + } + + quotient = MAKE_INT_32(*r_dst) / src; + remainder = MAKE_INT_32(*r_dst) % src; + + if(quotient == MAKE_INT_16(quotient)) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_pd(void) +{ + uint* r_dst = &DX; + sint src = MAKE_INT_16(OPER_AY_PD_16()); + sint quotient; + sint remainder; + + if(src != 0) + { + if((uint32)*r_dst == 0x80000000 && src == -1) + { + FLAG_Z = 0; + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = 0; + return; + } + + quotient = MAKE_INT_32(*r_dst) / src; + remainder = MAKE_INT_32(*r_dst) % src; + + if(quotient == MAKE_INT_16(quotient)) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_di(void) +{ + uint* r_dst = &DX; + sint src = MAKE_INT_16(OPER_AY_DI_16()); + sint quotient; + sint remainder; + + if(src != 0) + { + if((uint32)*r_dst == 0x80000000 && src == -1) + { + FLAG_Z = 0; + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = 0; + return; + } + + quotient = MAKE_INT_32(*r_dst) / src; + remainder = MAKE_INT_32(*r_dst) % src; + + if(quotient == MAKE_INT_16(quotient)) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_ix(void) +{ + uint* r_dst = &DX; + sint src = MAKE_INT_16(OPER_AY_IX_16()); + sint quotient; + sint remainder; + + if(src != 0) + { + if((uint32)*r_dst == 0x80000000 && src == -1) + { + FLAG_Z = 0; + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = 0; + return; + } + + quotient = MAKE_INT_32(*r_dst) / src; + remainder = MAKE_INT_32(*r_dst) % src; + + if(quotient == MAKE_INT_16(quotient)) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_aw(void) +{ + uint* r_dst = &DX; + sint src = MAKE_INT_16(OPER_AW_16()); + sint quotient; + sint remainder; + + if(src != 0) + { + if((uint32)*r_dst == 0x80000000 && src == -1) + { + FLAG_Z = 0; + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = 0; + return; + } + + quotient = MAKE_INT_32(*r_dst) / src; + remainder = MAKE_INT_32(*r_dst) % src; + + if(quotient == MAKE_INT_16(quotient)) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_al(void) +{ + uint* r_dst = &DX; + sint src = MAKE_INT_16(OPER_AL_16()); + sint quotient; + sint remainder; + + if(src != 0) + { + if((uint32)*r_dst == 0x80000000 && src == -1) + { + FLAG_Z = 0; + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = 0; + return; + } + + quotient = MAKE_INT_32(*r_dst) / src; + remainder = MAKE_INT_32(*r_dst) % src; + + if(quotient == MAKE_INT_16(quotient)) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_pcdi(void) +{ + uint* r_dst = &DX; + sint src = MAKE_INT_16(OPER_PCDI_16()); + sint quotient; + sint remainder; + + if(src != 0) + { + if((uint32)*r_dst == 0x80000000 && src == -1) + { + FLAG_Z = 0; + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = 0; + return; + } + + quotient = MAKE_INT_32(*r_dst) / src; + remainder = MAKE_INT_32(*r_dst) % src; + + if(quotient == MAKE_INT_16(quotient)) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_pcix(void) +{ + uint* r_dst = &DX; + sint src = MAKE_INT_16(OPER_PCIX_16()); + sint quotient; + sint remainder; + + if(src != 0) + { + if((uint32)*r_dst == 0x80000000 && src == -1) + { + FLAG_Z = 0; + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = 0; + return; + } + + quotient = MAKE_INT_32(*r_dst) / src; + remainder = MAKE_INT_32(*r_dst) % src; + + if(quotient == MAKE_INT_16(quotient)) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_i(void) +{ + uint* r_dst = &DX; + sint src = MAKE_INT_16(OPER_I_16()); + sint quotient; + sint remainder; + + if(src != 0) + { + if((uint32)*r_dst == 0x80000000 && src == -1) + { + FLAG_Z = 0; + FLAG_N = NFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = 0; + return; + } + + quotient = MAKE_INT_32(*r_dst) / src; + remainder = MAKE_INT_32(*r_dst) % src; + + if(quotient == MAKE_INT_16(quotient)) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_d(void) +{ + uint* r_dst = &DX; + uint src = MASK_OUT_ABOVE_16(DY); + + if(src != 0) + { + uint quotient = *r_dst / src; + uint remainder = *r_dst % src; + + if(quotient < 0x10000) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_ai(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_AI_16(); + + if(src != 0) + { + uint quotient = *r_dst / src; + uint remainder = *r_dst % src; + + if(quotient < 0x10000) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_pi(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PI_16(); + + if(src != 0) + { + uint quotient = *r_dst / src; + uint remainder = *r_dst % src; + + if(quotient < 0x10000) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_pd(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PD_16(); + + if(src != 0) + { + uint quotient = *r_dst / src; + uint remainder = *r_dst % src; + + if(quotient < 0x10000) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_di(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_DI_16(); + + if(src != 0) + { + uint quotient = *r_dst / src; + uint remainder = *r_dst % src; + + if(quotient < 0x10000) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_ix(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_IX_16(); + + if(src != 0) + { + uint quotient = *r_dst / src; + uint remainder = *r_dst % src; + + if(quotient < 0x10000) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_aw(void) +{ + uint* r_dst = &DX; + uint src = OPER_AW_16(); + + if(src != 0) + { + uint quotient = *r_dst / src; + uint remainder = *r_dst % src; + + if(quotient < 0x10000) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_al(void) +{ + uint* r_dst = &DX; + uint src = OPER_AL_16(); + + if(src != 0) + { + uint quotient = *r_dst / src; + uint remainder = *r_dst % src; + + if(quotient < 0x10000) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_pcdi(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCDI_16(); + + if(src != 0) + { + uint quotient = *r_dst / src; + uint remainder = *r_dst % src; + + if(quotient < 0x10000) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_pcix(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCIX_16(); + + if(src != 0) + { + uint quotient = *r_dst / src; + uint remainder = *r_dst % src; + + if(quotient < 0x10000) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_i(void) +{ + uint* r_dst = &DX; + uint src = OPER_I_16(); + + if(src != 0) + { + uint quotient = *r_dst / src; + uint remainder = *r_dst % src; + + if(quotient < 0x10000) + { + FLAG_Z = quotient; + FLAG_N = NFLAG_16(quotient); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + FLAG_V = VFLAG_SET; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divl_32_d(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 divisor = DY; + uint64 dividend = 0; + uint64 quotient = 0; + uint64 remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D[word2 & 7]; + dividend <<= 32; + dividend |= REG_D[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); + if((sint64)quotient != (sint64)((sint32)quotient)) + { + FLAG_V = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + FLAG_V = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint divisor = DY; + uint dividend_hi = REG_D[word2 & 7]; + uint dividend_lo = REG_D[(word2 >> 12) & 7]; + uint quotient = 0; + uint remainder = 0; + uint dividend_neg = 0; + uint divisor_neg = 0; + sint i; + uint overflow; + + if(divisor != 0) + { + /* quad / long : long quotient, long remainder */ + if(BIT_A(word2)) + { + if(BIT_B(word2)) /* signed */ + { + /* special case in signed divide */ + if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + REG_D[word2 & 7] = 0; + REG_D[(word2 >> 12) & 7] = 0x80000000; + + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + if(GET_MSB_32(dividend_hi)) + { + dividend_neg = 1; + dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); + dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); + } + if(GET_MSB_32(divisor)) + { + divisor_neg = 1; + divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); + + } + } + + /* if the upper long is greater than the divisor, we're overflowing. */ + if(dividend_hi >= divisor) + { + FLAG_V = VFLAG_SET; + return; + } + + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + remainder = (remainder << 1) + ((dividend_hi >> i) & 1); + if(remainder >= divisor) + { + remainder -= divisor; + quotient++; + } + } + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + overflow = GET_MSB_32(remainder); + remainder = (remainder << 1) + ((dividend_lo >> i) & 1); + if(remainder >= divisor || overflow) + { + remainder -= divisor; + quotient++; + } + } + + if(BIT_B(word2)) /* signed */ + { + if(quotient > 0x7fffffff) + { + FLAG_V = VFLAG_SET; + return; + } + if(dividend_neg) + { + remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + if(divisor_neg) + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + + /* long / long: long quotient, maybe long remainder */ + if(BIT_B(word2)) /* signed */ + { + /* Special case in divide */ + if(dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + REG_D[(word2 >> 12) & 7] = 0x80000000; + REG_D[word2 & 7] = 0; + return; + } + REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); + } + else + { + REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); + } + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_divl_32_ai(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 divisor = OPER_AY_AI_32(); + uint64 dividend = 0; + uint64 quotient = 0; + uint64 remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D[word2 & 7]; + dividend <<= 32; + dividend |= REG_D[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); + if((sint64)quotient != (sint64)((sint32)quotient)) + { + FLAG_V = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + FLAG_V = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint divisor = OPER_AY_AI_32(); + uint dividend_hi = REG_D[word2 & 7]; + uint dividend_lo = REG_D[(word2 >> 12) & 7]; + uint quotient = 0; + uint remainder = 0; + uint dividend_neg = 0; + uint divisor_neg = 0; + sint i; + uint overflow; + + if(divisor != 0) + { + /* quad / long : long quotient, long remainder */ + if(BIT_A(word2)) + { + if(BIT_B(word2)) /* signed */ + { + /* special case in signed divide */ + if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + REG_D[word2 & 7] = 0; + REG_D[(word2 >> 12) & 7] = 0x80000000; + + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + if(GET_MSB_32(dividend_hi)) + { + dividend_neg = 1; + dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); + dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); + } + if(GET_MSB_32(divisor)) + { + divisor_neg = 1; + divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); + + } + } + + /* if the upper long is greater than the divisor, we're overflowing. */ + if(dividend_hi >= divisor) + { + FLAG_V = VFLAG_SET; + return; + } + + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + remainder = (remainder << 1) + ((dividend_hi >> i) & 1); + if(remainder >= divisor) + { + remainder -= divisor; + quotient++; + } + } + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + overflow = GET_MSB_32(remainder); + remainder = (remainder << 1) + ((dividend_lo >> i) & 1); + if(remainder >= divisor || overflow) + { + remainder -= divisor; + quotient++; + } + } + + if(BIT_B(word2)) /* signed */ + { + if(quotient > 0x7fffffff) + { + FLAG_V = VFLAG_SET; + return; + } + if(dividend_neg) + { + remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + if(divisor_neg) + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + + /* long / long: long quotient, maybe long remainder */ + if(BIT_B(word2)) /* signed */ + { + /* Special case in divide */ + if(dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + REG_D[(word2 >> 12) & 7] = 0x80000000; + REG_D[word2 & 7] = 0; + return; + } + REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); + } + else + { + REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); + } + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_divl_32_pi(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 divisor = OPER_AY_PI_32(); + uint64 dividend = 0; + uint64 quotient = 0; + uint64 remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D[word2 & 7]; + dividend <<= 32; + dividend |= REG_D[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); + if((sint64)quotient != (sint64)((sint32)quotient)) + { + FLAG_V = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + FLAG_V = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint divisor = OPER_AY_PI_32(); + uint dividend_hi = REG_D[word2 & 7]; + uint dividend_lo = REG_D[(word2 >> 12) & 7]; + uint quotient = 0; + uint remainder = 0; + uint dividend_neg = 0; + uint divisor_neg = 0; + sint i; + uint overflow; + + if(divisor != 0) + { + /* quad / long : long quotient, long remainder */ + if(BIT_A(word2)) + { + if(BIT_B(word2)) /* signed */ + { + /* special case in signed divide */ + if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + REG_D[word2 & 7] = 0; + REG_D[(word2 >> 12) & 7] = 0x80000000; + + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + if(GET_MSB_32(dividend_hi)) + { + dividend_neg = 1; + dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); + dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); + } + if(GET_MSB_32(divisor)) + { + divisor_neg = 1; + divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); + + } + } + + /* if the upper long is greater than the divisor, we're overflowing. */ + if(dividend_hi >= divisor) + { + FLAG_V = VFLAG_SET; + return; + } + + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + remainder = (remainder << 1) + ((dividend_hi >> i) & 1); + if(remainder >= divisor) + { + remainder -= divisor; + quotient++; + } + } + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + overflow = GET_MSB_32(remainder); + remainder = (remainder << 1) + ((dividend_lo >> i) & 1); + if(remainder >= divisor || overflow) + { + remainder -= divisor; + quotient++; + } + } + + if(BIT_B(word2)) /* signed */ + { + if(quotient > 0x7fffffff) + { + FLAG_V = VFLAG_SET; + return; + } + if(dividend_neg) + { + remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + if(divisor_neg) + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + + /* long / long: long quotient, maybe long remainder */ + if(BIT_B(word2)) /* signed */ + { + /* Special case in divide */ + if(dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + REG_D[(word2 >> 12) & 7] = 0x80000000; + REG_D[word2 & 7] = 0; + return; + } + REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); + } + else + { + REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); + } + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_divl_32_pd(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 divisor = OPER_AY_PD_32(); + uint64 dividend = 0; + uint64 quotient = 0; + uint64 remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D[word2 & 7]; + dividend <<= 32; + dividend |= REG_D[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); + if((sint64)quotient != (sint64)((sint32)quotient)) + { + FLAG_V = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + FLAG_V = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint divisor = OPER_AY_PD_32(); + uint dividend_hi = REG_D[word2 & 7]; + uint dividend_lo = REG_D[(word2 >> 12) & 7]; + uint quotient = 0; + uint remainder = 0; + uint dividend_neg = 0; + uint divisor_neg = 0; + sint i; + uint overflow; + + if(divisor != 0) + { + /* quad / long : long quotient, long remainder */ + if(BIT_A(word2)) + { + if(BIT_B(word2)) /* signed */ + { + /* special case in signed divide */ + if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + REG_D[word2 & 7] = 0; + REG_D[(word2 >> 12) & 7] = 0x80000000; + + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + if(GET_MSB_32(dividend_hi)) + { + dividend_neg = 1; + dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); + dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); + } + if(GET_MSB_32(divisor)) + { + divisor_neg = 1; + divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); + + } + } + + /* if the upper long is greater than the divisor, we're overflowing. */ + if(dividend_hi >= divisor) + { + FLAG_V = VFLAG_SET; + return; + } + + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + remainder = (remainder << 1) + ((dividend_hi >> i) & 1); + if(remainder >= divisor) + { + remainder -= divisor; + quotient++; + } + } + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + overflow = GET_MSB_32(remainder); + remainder = (remainder << 1) + ((dividend_lo >> i) & 1); + if(remainder >= divisor || overflow) + { + remainder -= divisor; + quotient++; + } + } + + if(BIT_B(word2)) /* signed */ + { + if(quotient > 0x7fffffff) + { + FLAG_V = VFLAG_SET; + return; + } + if(dividend_neg) + { + remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + if(divisor_neg) + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + + /* long / long: long quotient, maybe long remainder */ + if(BIT_B(word2)) /* signed */ + { + /* Special case in divide */ + if(dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + REG_D[(word2 >> 12) & 7] = 0x80000000; + REG_D[word2 & 7] = 0; + return; + } + REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); + } + else + { + REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); + } + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_divl_32_di(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 divisor = OPER_AY_DI_32(); + uint64 dividend = 0; + uint64 quotient = 0; + uint64 remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D[word2 & 7]; + dividend <<= 32; + dividend |= REG_D[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); + if((sint64)quotient != (sint64)((sint32)quotient)) + { + FLAG_V = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + FLAG_V = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint divisor = OPER_AY_DI_32(); + uint dividend_hi = REG_D[word2 & 7]; + uint dividend_lo = REG_D[(word2 >> 12) & 7]; + uint quotient = 0; + uint remainder = 0; + uint dividend_neg = 0; + uint divisor_neg = 0; + sint i; + uint overflow; + + if(divisor != 0) + { + /* quad / long : long quotient, long remainder */ + if(BIT_A(word2)) + { + if(BIT_B(word2)) /* signed */ + { + /* special case in signed divide */ + if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + REG_D[word2 & 7] = 0; + REG_D[(word2 >> 12) & 7] = 0x80000000; + + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + if(GET_MSB_32(dividend_hi)) + { + dividend_neg = 1; + dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); + dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); + } + if(GET_MSB_32(divisor)) + { + divisor_neg = 1; + divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); + + } + } + + /* if the upper long is greater than the divisor, we're overflowing. */ + if(dividend_hi >= divisor) + { + FLAG_V = VFLAG_SET; + return; + } + + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + remainder = (remainder << 1) + ((dividend_hi >> i) & 1); + if(remainder >= divisor) + { + remainder -= divisor; + quotient++; + } + } + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + overflow = GET_MSB_32(remainder); + remainder = (remainder << 1) + ((dividend_lo >> i) & 1); + if(remainder >= divisor || overflow) + { + remainder -= divisor; + quotient++; + } + } + + if(BIT_B(word2)) /* signed */ + { + if(quotient > 0x7fffffff) + { + FLAG_V = VFLAG_SET; + return; + } + if(dividend_neg) + { + remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + if(divisor_neg) + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + + /* long / long: long quotient, maybe long remainder */ + if(BIT_B(word2)) /* signed */ + { + /* Special case in divide */ + if(dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + REG_D[(word2 >> 12) & 7] = 0x80000000; + REG_D[word2 & 7] = 0; + return; + } + REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); + } + else + { + REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); + } + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_divl_32_ix(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 divisor = OPER_AY_IX_32(); + uint64 dividend = 0; + uint64 quotient = 0; + uint64 remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D[word2 & 7]; + dividend <<= 32; + dividend |= REG_D[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); + if((sint64)quotient != (sint64)((sint32)quotient)) + { + FLAG_V = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + FLAG_V = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint divisor = OPER_AY_IX_32(); + uint dividend_hi = REG_D[word2 & 7]; + uint dividend_lo = REG_D[(word2 >> 12) & 7]; + uint quotient = 0; + uint remainder = 0; + uint dividend_neg = 0; + uint divisor_neg = 0; + sint i; + uint overflow; + + if(divisor != 0) + { + /* quad / long : long quotient, long remainder */ + if(BIT_A(word2)) + { + if(BIT_B(word2)) /* signed */ + { + /* special case in signed divide */ + if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + REG_D[word2 & 7] = 0; + REG_D[(word2 >> 12) & 7] = 0x80000000; + + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + if(GET_MSB_32(dividend_hi)) + { + dividend_neg = 1; + dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); + dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); + } + if(GET_MSB_32(divisor)) + { + divisor_neg = 1; + divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); + + } + } + + /* if the upper long is greater than the divisor, we're overflowing. */ + if(dividend_hi >= divisor) + { + FLAG_V = VFLAG_SET; + return; + } + + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + remainder = (remainder << 1) + ((dividend_hi >> i) & 1); + if(remainder >= divisor) + { + remainder -= divisor; + quotient++; + } + } + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + overflow = GET_MSB_32(remainder); + remainder = (remainder << 1) + ((dividend_lo >> i) & 1); + if(remainder >= divisor || overflow) + { + remainder -= divisor; + quotient++; + } + } + + if(BIT_B(word2)) /* signed */ + { + if(quotient > 0x7fffffff) + { + FLAG_V = VFLAG_SET; + return; + } + if(dividend_neg) + { + remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + if(divisor_neg) + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + + /* long / long: long quotient, maybe long remainder */ + if(BIT_B(word2)) /* signed */ + { + /* Special case in divide */ + if(dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + REG_D[(word2 >> 12) & 7] = 0x80000000; + REG_D[word2 & 7] = 0; + return; + } + REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); + } + else + { + REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); + } + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_divl_32_aw(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 divisor = OPER_AW_32(); + uint64 dividend = 0; + uint64 quotient = 0; + uint64 remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D[word2 & 7]; + dividend <<= 32; + dividend |= REG_D[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); + if((sint64)quotient != (sint64)((sint32)quotient)) + { + FLAG_V = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + FLAG_V = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint divisor = OPER_AW_32(); + uint dividend_hi = REG_D[word2 & 7]; + uint dividend_lo = REG_D[(word2 >> 12) & 7]; + uint quotient = 0; + uint remainder = 0; + uint dividend_neg = 0; + uint divisor_neg = 0; + sint i; + uint overflow; + + if(divisor != 0) + { + /* quad / long : long quotient, long remainder */ + if(BIT_A(word2)) + { + if(BIT_B(word2)) /* signed */ + { + /* special case in signed divide */ + if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + REG_D[word2 & 7] = 0; + REG_D[(word2 >> 12) & 7] = 0x80000000; + + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + if(GET_MSB_32(dividend_hi)) + { + dividend_neg = 1; + dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); + dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); + } + if(GET_MSB_32(divisor)) + { + divisor_neg = 1; + divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); + + } + } + + /* if the upper long is greater than the divisor, we're overflowing. */ + if(dividend_hi >= divisor) + { + FLAG_V = VFLAG_SET; + return; + } + + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + remainder = (remainder << 1) + ((dividend_hi >> i) & 1); + if(remainder >= divisor) + { + remainder -= divisor; + quotient++; + } + } + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + overflow = GET_MSB_32(remainder); + remainder = (remainder << 1) + ((dividend_lo >> i) & 1); + if(remainder >= divisor || overflow) + { + remainder -= divisor; + quotient++; + } + } + + if(BIT_B(word2)) /* signed */ + { + if(quotient > 0x7fffffff) + { + FLAG_V = VFLAG_SET; + return; + } + if(dividend_neg) + { + remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + if(divisor_neg) + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + + /* long / long: long quotient, maybe long remainder */ + if(BIT_B(word2)) /* signed */ + { + /* Special case in divide */ + if(dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + REG_D[(word2 >> 12) & 7] = 0x80000000; + REG_D[word2 & 7] = 0; + return; + } + REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); + } + else + { + REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); + } + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_divl_32_al(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 divisor = OPER_AL_32(); + uint64 dividend = 0; + uint64 quotient = 0; + uint64 remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D[word2 & 7]; + dividend <<= 32; + dividend |= REG_D[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); + if((sint64)quotient != (sint64)((sint32)quotient)) + { + FLAG_V = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + FLAG_V = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint divisor = OPER_AL_32(); + uint dividend_hi = REG_D[word2 & 7]; + uint dividend_lo = REG_D[(word2 >> 12) & 7]; + uint quotient = 0; + uint remainder = 0; + uint dividend_neg = 0; + uint divisor_neg = 0; + sint i; + uint overflow; + + if(divisor != 0) + { + /* quad / long : long quotient, long remainder */ + if(BIT_A(word2)) + { + if(BIT_B(word2)) /* signed */ + { + /* special case in signed divide */ + if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + REG_D[word2 & 7] = 0; + REG_D[(word2 >> 12) & 7] = 0x80000000; + + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + if(GET_MSB_32(dividend_hi)) + { + dividend_neg = 1; + dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); + dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); + } + if(GET_MSB_32(divisor)) + { + divisor_neg = 1; + divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); + + } + } + + /* if the upper long is greater than the divisor, we're overflowing. */ + if(dividend_hi >= divisor) + { + FLAG_V = VFLAG_SET; + return; + } + + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + remainder = (remainder << 1) + ((dividend_hi >> i) & 1); + if(remainder >= divisor) + { + remainder -= divisor; + quotient++; + } + } + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + overflow = GET_MSB_32(remainder); + remainder = (remainder << 1) + ((dividend_lo >> i) & 1); + if(remainder >= divisor || overflow) + { + remainder -= divisor; + quotient++; + } + } + + if(BIT_B(word2)) /* signed */ + { + if(quotient > 0x7fffffff) + { + FLAG_V = VFLAG_SET; + return; + } + if(dividend_neg) + { + remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + if(divisor_neg) + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + + /* long / long: long quotient, maybe long remainder */ + if(BIT_B(word2)) /* signed */ + { + /* Special case in divide */ + if(dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + REG_D[(word2 >> 12) & 7] = 0x80000000; + REG_D[word2 & 7] = 0; + return; + } + REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); + } + else + { + REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); + } + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_divl_32_pcdi(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 divisor = OPER_PCDI_32(); + uint64 dividend = 0; + uint64 quotient = 0; + uint64 remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D[word2 & 7]; + dividend <<= 32; + dividend |= REG_D[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); + if((sint64)quotient != (sint64)((sint32)quotient)) + { + FLAG_V = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + FLAG_V = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint divisor = OPER_PCDI_32(); + uint dividend_hi = REG_D[word2 & 7]; + uint dividend_lo = REG_D[(word2 >> 12) & 7]; + uint quotient = 0; + uint remainder = 0; + uint dividend_neg = 0; + uint divisor_neg = 0; + sint i; + uint overflow; + + if(divisor != 0) + { + /* quad / long : long quotient, long remainder */ + if(BIT_A(word2)) + { + if(BIT_B(word2)) /* signed */ + { + /* special case in signed divide */ + if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + REG_D[word2 & 7] = 0; + REG_D[(word2 >> 12) & 7] = 0x80000000; + + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + if(GET_MSB_32(dividend_hi)) + { + dividend_neg = 1; + dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); + dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); + } + if(GET_MSB_32(divisor)) + { + divisor_neg = 1; + divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); + + } + } + + /* if the upper long is greater than the divisor, we're overflowing. */ + if(dividend_hi >= divisor) + { + FLAG_V = VFLAG_SET; + return; + } + + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + remainder = (remainder << 1) + ((dividend_hi >> i) & 1); + if(remainder >= divisor) + { + remainder -= divisor; + quotient++; + } + } + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + overflow = GET_MSB_32(remainder); + remainder = (remainder << 1) + ((dividend_lo >> i) & 1); + if(remainder >= divisor || overflow) + { + remainder -= divisor; + quotient++; + } + } + + if(BIT_B(word2)) /* signed */ + { + if(quotient > 0x7fffffff) + { + FLAG_V = VFLAG_SET; + return; + } + if(dividend_neg) + { + remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + if(divisor_neg) + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + + /* long / long: long quotient, maybe long remainder */ + if(BIT_B(word2)) /* signed */ + { + /* Special case in divide */ + if(dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + REG_D[(word2 >> 12) & 7] = 0x80000000; + REG_D[word2 & 7] = 0; + return; + } + REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); + } + else + { + REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); + } + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_divl_32_pcix(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 divisor = OPER_PCIX_32(); + uint64 dividend = 0; + uint64 quotient = 0; + uint64 remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D[word2 & 7]; + dividend <<= 32; + dividend |= REG_D[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); + if((sint64)quotient != (sint64)((sint32)quotient)) + { + FLAG_V = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + FLAG_V = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint divisor = OPER_PCIX_32(); + uint dividend_hi = REG_D[word2 & 7]; + uint dividend_lo = REG_D[(word2 >> 12) & 7]; + uint quotient = 0; + uint remainder = 0; + uint dividend_neg = 0; + uint divisor_neg = 0; + sint i; + uint overflow; + + if(divisor != 0) + { + /* quad / long : long quotient, long remainder */ + if(BIT_A(word2)) + { + if(BIT_B(word2)) /* signed */ + { + /* special case in signed divide */ + if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + REG_D[word2 & 7] = 0; + REG_D[(word2 >> 12) & 7] = 0x80000000; + + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + if(GET_MSB_32(dividend_hi)) + { + dividend_neg = 1; + dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); + dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); + } + if(GET_MSB_32(divisor)) + { + divisor_neg = 1; + divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); + + } + } + + /* if the upper long is greater than the divisor, we're overflowing. */ + if(dividend_hi >= divisor) + { + FLAG_V = VFLAG_SET; + return; + } + + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + remainder = (remainder << 1) + ((dividend_hi >> i) & 1); + if(remainder >= divisor) + { + remainder -= divisor; + quotient++; + } + } + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + overflow = GET_MSB_32(remainder); + remainder = (remainder << 1) + ((dividend_lo >> i) & 1); + if(remainder >= divisor || overflow) + { + remainder -= divisor; + quotient++; + } + } + + if(BIT_B(word2)) /* signed */ + { + if(quotient > 0x7fffffff) + { + FLAG_V = VFLAG_SET; + return; + } + if(dividend_neg) + { + remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + if(divisor_neg) + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + + /* long / long: long quotient, maybe long remainder */ + if(BIT_B(word2)) /* signed */ + { + /* Special case in divide */ + if(dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + REG_D[(word2 >> 12) & 7] = 0x80000000; + REG_D[word2 & 7] = 0; + return; + } + REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); + } + else + { + REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); + } + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_divl_32_i(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 divisor = OPER_I_32(); + uint64 dividend = 0; + uint64 quotient = 0; + uint64 remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D[word2 & 7]; + dividend <<= 32; + dividend |= REG_D[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor)); + if((sint64)quotient != (sint64)((sint32)quotient)) + { + FLAG_V = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + FLAG_V = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor)); + remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint divisor = OPER_I_32(); + uint dividend_hi = REG_D[word2 & 7]; + uint dividend_lo = REG_D[(word2 >> 12) & 7]; + uint quotient = 0; + uint remainder = 0; + uint dividend_neg = 0; + uint divisor_neg = 0; + sint i; + uint overflow; + + if(divisor != 0) + { + /* quad / long : long quotient, long remainder */ + if(BIT_A(word2)) + { + if(BIT_B(word2)) /* signed */ + { + /* special case in signed divide */ + if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + REG_D[word2 & 7] = 0; + REG_D[(word2 >> 12) & 7] = 0x80000000; + + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + if(GET_MSB_32(dividend_hi)) + { + dividend_neg = 1; + dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0)); + dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo); + } + if(GET_MSB_32(divisor)) + { + divisor_neg = 1; + divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor); + + } + } + + /* if the upper long is greater than the divisor, we're overflowing. */ + if(dividend_hi >= divisor) + { + FLAG_V = VFLAG_SET; + return; + } + + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + remainder = (remainder << 1) + ((dividend_hi >> i) & 1); + if(remainder >= divisor) + { + remainder -= divisor; + quotient++; + } + } + for(i = 31; i >= 0; i--) + { + quotient <<= 1; + overflow = GET_MSB_32(remainder); + remainder = (remainder << 1) + ((dividend_lo >> i) & 1); + if(remainder >= divisor || overflow) + { + remainder -= divisor; + quotient++; + } + } + + if(BIT_B(word2)) /* signed */ + { + if(quotient > 0x7fffffff) + { + FLAG_V = VFLAG_SET; + return; + } + if(dividend_neg) + { + remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder); + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + if(divisor_neg) + quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient); + } + + REG_D[word2 & 7] = remainder; + REG_D[(word2 >> 12) & 7] = quotient; + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + + /* long / long: long quotient, maybe long remainder */ + if(BIT_B(word2)) /* signed */ + { + /* Special case in divide */ + if(dividend_lo == 0x80000000 && divisor == 0xffffffff) + { + FLAG_N = NFLAG_SET; + FLAG_Z = ZFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + REG_D[(word2 >> 12) & 7] = 0x80000000; + REG_D[word2 & 7] = 0; + return; + } + REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor); + } + else + { + REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor); + quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor); + } + + FLAG_N = NFLAG_32(quotient); + FLAG_Z = quotient; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_eor_8_d(void) +{ + uint res = MASK_OUT_ABOVE_8(DY ^= MASK_OUT_ABOVE_8(DX)); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_ai(void) +{ + uint ea = EA_AY_AI_8(); + uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_pi(void) +{ + uint ea = EA_AY_PI_8(); + uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_pi7(void) +{ + uint ea = EA_A7_PI_8(); + uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_pd(void) +{ + uint ea = EA_AY_PD_8(); + uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_pd7(void) +{ + uint ea = EA_A7_PD_8(); + uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_di(void) +{ + uint ea = EA_AY_DI_8(); + uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_ix(void) +{ + uint ea = EA_AY_IX_8(); + uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_aw(void) +{ + uint ea = EA_AW_8(); + uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_al(void) +{ + uint ea = EA_AL_8(); + uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_d(void) +{ + uint res = MASK_OUT_ABOVE_16(DY ^= MASK_OUT_ABOVE_16(DX)); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_di(void) +{ + uint ea = EA_AY_DI_16(); + uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_aw(void) +{ + uint ea = EA_AW_16(); + uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_al(void) +{ + uint ea = EA_AL_16(); + uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_d(void) +{ + uint res = DY ^= DX; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_ai(void) +{ + uint ea = EA_AY_AI_32(); + uint res = DX ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_pi(void) +{ + uint ea = EA_AY_PI_32(); + uint res = DX ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_pd(void) +{ + uint ea = EA_AY_PD_32(); + uint res = DX ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_di(void) +{ + uint ea = EA_AY_DI_32(); + uint res = DX ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_ix(void) +{ + uint ea = EA_AY_IX_32(); + uint res = DX ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_aw(void) +{ + uint ea = EA_AW_32(); + uint res = DX ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_al(void) +{ + uint ea = EA_AL_32(); + uint res = DX ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_d(void) +{ + uint res = MASK_OUT_ABOVE_8(DY ^= OPER_I_8()); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_ai(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_AI_8(); + uint res = src ^ m68ki_read_8(ea); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_pi(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_PI_8(); + uint res = src ^ m68ki_read_8(ea); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_pi7(void) +{ + uint src = OPER_I_8(); + uint ea = EA_A7_PI_8(); + uint res = src ^ m68ki_read_8(ea); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_pd(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_PD_8(); + uint res = src ^ m68ki_read_8(ea); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_pd7(void) +{ + uint src = OPER_I_8(); + uint ea = EA_A7_PD_8(); + uint res = src ^ m68ki_read_8(ea); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_di(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_DI_8(); + uint res = src ^ m68ki_read_8(ea); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_ix(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_IX_8(); + uint res = src ^ m68ki_read_8(ea); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_aw(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AW_8(); + uint res = src ^ m68ki_read_8(ea); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_al(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AL_8(); + uint res = src ^ m68ki_read_8(ea); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_d(void) +{ + uint res = MASK_OUT_ABOVE_16(DY ^= OPER_I_16()); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_ai(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_AI_16(); + uint res = src ^ m68ki_read_16(ea); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_pi(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_PI_16(); + uint res = src ^ m68ki_read_16(ea); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_pd(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_PD_16(); + uint res = src ^ m68ki_read_16(ea); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_di(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_DI_16(); + uint res = src ^ m68ki_read_16(ea); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_ix(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_IX_16(); + uint res = src ^ m68ki_read_16(ea); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_aw(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AW_16(); + uint res = src ^ m68ki_read_16(ea); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_al(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AL_16(); + uint res = src ^ m68ki_read_16(ea); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_d(void) +{ + uint res = DY ^= OPER_I_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_ai(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_AI_32(); + uint res = src ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_pi(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_PI_32(); + uint res = src ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_pd(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_PD_32(); + uint res = src ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_di(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_DI_32(); + uint res = src ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_ix(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_IX_32(); + uint res = src ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_aw(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AW_32(); + uint res = src ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_al(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AL_32(); + uint res = src ^ m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_toc(void) +{ + m68ki_set_ccr(m68ki_get_ccr() ^ OPER_I_16()); +} + + +static void m68k_op_eori_16_tos(void) +{ + if(FLAG_S) + { + uint src = OPER_I_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr(m68ki_get_sr() ^ src); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_exg_32_dd(void) +{ + uint* reg_a = &DX; + uint* reg_b = &DY; + uint tmp = *reg_a; + *reg_a = *reg_b; + *reg_b = tmp; +} + + +static void m68k_op_exg_32_aa(void) +{ + uint* reg_a = &AX; + uint* reg_b = &AY; + uint tmp = *reg_a; + *reg_a = *reg_b; + *reg_b = tmp; +} + + +static void m68k_op_exg_32_da(void) +{ + uint* reg_a = &DX; + uint* reg_b = &AY; + uint tmp = *reg_a; + *reg_a = *reg_b; + *reg_b = tmp; +} + + +static void m68k_op_ext_16(void) +{ + uint* r_dst = &DY; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xff00 : 0); + + FLAG_N = NFLAG_16(*r_dst); + FLAG_Z = MASK_OUT_ABOVE_16(*r_dst); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_ext_32(void) +{ + uint* r_dst = &DY; + + *r_dst = MASK_OUT_ABOVE_16(*r_dst) | (GET_MSB_16(*r_dst) ? 0xffff0000 : 0); + + FLAG_N = NFLAG_32(*r_dst); + FLAG_Z = *r_dst; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_extb_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint* r_dst = &DY; + + *r_dst = MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xffffff00 : 0); + + FLAG_N = NFLAG_32(*r_dst); + FLAG_Z = *r_dst; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_illegal(void) +{ + m68ki_exception_illegal(); +} + + +static void m68k_op_jmp_32_ai(void) +{ + m68ki_jump(EA_AY_AI_32()); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(REG_PC == REG_PPC) + USE_ALL_CYCLES(); +} + + +static void m68k_op_jmp_32_di(void) +{ + m68ki_jump(EA_AY_DI_32()); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(REG_PC == REG_PPC) + USE_ALL_CYCLES(); +} + + +static void m68k_op_jmp_32_ix(void) +{ + m68ki_jump(EA_AY_IX_32()); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(REG_PC == REG_PPC) + USE_ALL_CYCLES(); +} + + +static void m68k_op_jmp_32_aw(void) +{ + m68ki_jump(EA_AW_32()); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(REG_PC == REG_PPC) + USE_ALL_CYCLES(); +} + + +static void m68k_op_jmp_32_al(void) +{ + m68ki_jump(EA_AL_32()); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(REG_PC == REG_PPC) + USE_ALL_CYCLES(); +} + + +static void m68k_op_jmp_32_pcdi(void) +{ + m68ki_jump(EA_PCDI_32()); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(REG_PC == REG_PPC) + USE_ALL_CYCLES(); +} + + +static void m68k_op_jmp_32_pcix(void) +{ + m68ki_jump(EA_PCIX_32()); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(REG_PC == REG_PPC) + USE_ALL_CYCLES(); +} + + +static void m68k_op_jsr_32_ai(void) +{ + uint ea = EA_AY_AI_32(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32(REG_PC); + m68ki_jump(ea); +} + + +static void m68k_op_jsr_32_di(void) +{ + uint ea = EA_AY_DI_32(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32(REG_PC); + m68ki_jump(ea); +} + + +static void m68k_op_jsr_32_ix(void) +{ + uint ea = EA_AY_IX_32(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32(REG_PC); + m68ki_jump(ea); +} + + +static void m68k_op_jsr_32_aw(void) +{ + uint ea = EA_AW_32(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32(REG_PC); + m68ki_jump(ea); +} + + +static void m68k_op_jsr_32_al(void) +{ + uint ea = EA_AL_32(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32(REG_PC); + m68ki_jump(ea); +} + + +static void m68k_op_jsr_32_pcdi(void) +{ + uint ea = EA_PCDI_32(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32(REG_PC); + m68ki_jump(ea); +} + + +static void m68k_op_jsr_32_pcix(void) +{ + uint ea = EA_PCIX_32(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32(REG_PC); + m68ki_jump(ea); +} + + +static void m68k_op_lea_32_ai(void) +{ + AX = EA_AY_AI_32(); +} + + +static void m68k_op_lea_32_di(void) +{ + AX = EA_AY_DI_32(); +} + + +static void m68k_op_lea_32_ix(void) +{ + AX = EA_AY_IX_32(); +} + + +static void m68k_op_lea_32_aw(void) +{ + AX = EA_AW_32(); +} + + +static void m68k_op_lea_32_al(void) +{ + AX = EA_AL_32(); +} + + +static void m68k_op_lea_32_pcdi(void) +{ + AX = EA_PCDI_32(); +} + + +static void m68k_op_lea_32_pcix(void) +{ + AX = EA_PCIX_32(); +} + + +static void m68k_op_link_16_a7(void) +{ + REG_A[7] -= 4; + m68ki_write_32(REG_A[7], REG_A[7]); + REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16())); +} + + +static void m68k_op_link_16(void) +{ + uint* r_dst = &AY; + + m68ki_push_32(*r_dst); + *r_dst = REG_A[7]; + REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16())); +} + + +static void m68k_op_link_32_a7(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + REG_A[7] -= 4; + m68ki_write_32(REG_A[7], REG_A[7]); + REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32()); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_link_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint* r_dst = &AY; + + m68ki_push_32(*r_dst); + *r_dst = REG_A[7]; + REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32()); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_lsr_8_s(void) +{ + uint* r_dst = &DY; + uint shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_8(*r_dst); + uint res = src >> shift; + + if(shift != 0) + USE_CYCLES(shift<> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_16(*r_dst); + uint res = src >> shift; + + if(shift != 0) + USE_CYCLES(shift<> 9) - 1) & 7) + 1; + uint src = *r_dst; + uint res = src >> shift; + + if(shift != 0) + USE_CYCLES(shift<> shift; + + if(shift != 0) + { + USE_CYCLES(shift<> shift; + + if(shift != 0) + { + USE_CYCLES(shift<> (shift - 1))<<8; + FLAG_N = NFLAG_CLEAR; + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + + *r_dst &= 0xffff0000; + FLAG_X = XFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_16(src); + FLAG_Z = src; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_32_r(void) +{ + uint* r_dst = &DY; + uint shift = DX & 0x3f; + uint src = *r_dst; + uint res = src >> shift; + + if(shift != 0) + { + USE_CYCLES(shift<> (shift - 1))<<8; + FLAG_N = NFLAG_CLEAR; + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + + *r_dst = 0; + FLAG_X = FLAG_C = (shift == 32 ? GET_MSB_32(src)>>23 : 0); + FLAG_N = NFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_32(src); + FLAG_Z = src; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_CLEAR; + FLAG_Z = res; + FLAG_C = FLAG_X = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_CLEAR; + FLAG_Z = res; + FLAG_C = FLAG_X = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_CLEAR; + FLAG_Z = res; + FLAG_C = FLAG_X = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_di(void) +{ + uint ea = EA_AY_DI_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_CLEAR; + FLAG_Z = res; + FLAG_C = FLAG_X = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_CLEAR; + FLAG_Z = res; + FLAG_C = FLAG_X = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_aw(void) +{ + uint ea = EA_AW_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_CLEAR; + FLAG_Z = res; + FLAG_C = FLAG_X = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_al(void) +{ + uint ea = EA_AL_16(); + uint src = m68ki_read_16(ea); + uint res = src >> 1; + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_CLEAR; + FLAG_Z = res; + FLAG_C = FLAG_X = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_8_s(void) +{ + uint* r_dst = &DY; + uint shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_8(*r_dst); + uint res = MASK_OUT_ABOVE_8(src << shift); + + if(shift != 0) + USE_CYCLES(shift<> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_16(*r_dst); + uint res = MASK_OUT_ABOVE_16(src << shift); + + if(shift != 0) + USE_CYCLES(shift<> (8-shift); + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_32_s(void) +{ + uint* r_dst = &DY; + uint shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint src = *r_dst; + uint res = MASK_OUT_ABOVE_32(src << shift); + + if(shift != 0) + USE_CYCLES(shift<> (24-shift); + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_8_r(void) +{ + uint* r_dst = &DY; + uint shift = DX & 0x3f; + uint src = MASK_OUT_ABOVE_8(*r_dst); + uint res = MASK_OUT_ABOVE_8(src << shift); + + if(shift != 0) + { + USE_CYCLES(shift<> 8; + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + + *r_dst &= 0xffff0000; + FLAG_X = XFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_16(src); + FLAG_Z = src; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_32_r(void) +{ + uint* r_dst = &DY; + uint shift = DX & 0x3f; + uint src = *r_dst; + uint res = MASK_OUT_ABOVE_32(src << shift); + + if(shift != 0) + { + USE_CYCLES(shift<> (32 - shift)) << 8; + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + + *r_dst = 0; + FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8; + FLAG_N = NFLAG_CLEAR; + FLAG_Z = ZFLAG_SET; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_32(src); + FLAG_Z = src; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_di(void) +{ + uint ea = EA_AY_DI_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_aw(void) +{ + uint ea = EA_AW_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_al(void) +{ + uint ea = EA_AL_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_X = FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_d(void) +{ + uint res = MASK_OUT_ABOVE_8(DY); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_ai(void) +{ + uint res = OPER_AY_AI_8(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_pi(void) +{ + uint res = OPER_AY_PI_8(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_pi7(void) +{ + uint res = OPER_A7_PI_8(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_pd(void) +{ + uint res = OPER_AY_PD_8(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_pd7(void) +{ + uint res = OPER_A7_PD_8(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_di(void) +{ + uint res = OPER_AY_DI_8(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_ix(void) +{ + uint res = OPER_AY_IX_8(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_aw(void) +{ + uint res = OPER_AW_8(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_al(void) +{ + uint res = OPER_AL_8(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_pcdi(void) +{ + uint res = OPER_PCDI_8(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_pcix(void) +{ + uint res = OPER_PCIX_8(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_i(void) +{ + uint res = OPER_I_8(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_d(void) +{ + uint res = MASK_OUT_ABOVE_8(DY); + uint ea = EA_AX_AI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_ai(void) +{ + uint res = OPER_AY_AI_8(); + uint ea = EA_AX_AI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_pi(void) +{ + uint res = OPER_AY_PI_8(); + uint ea = EA_AX_AI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_pi7(void) +{ + uint res = OPER_A7_PI_8(); + uint ea = EA_AX_AI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_pd(void) +{ + uint res = OPER_AY_PD_8(); + uint ea = EA_AX_AI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_pd7(void) +{ + uint res = OPER_A7_PD_8(); + uint ea = EA_AX_AI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_di(void) +{ + uint res = OPER_AY_DI_8(); + uint ea = EA_AX_AI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_ix(void) +{ + uint res = OPER_AY_IX_8(); + uint ea = EA_AX_AI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_aw(void) +{ + uint res = OPER_AW_8(); + uint ea = EA_AX_AI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_al(void) +{ + uint res = OPER_AL_8(); + uint ea = EA_AX_AI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_pcdi(void) +{ + uint res = OPER_PCDI_8(); + uint ea = EA_AX_AI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_pcix(void) +{ + uint res = OPER_PCIX_8(); + uint ea = EA_AX_AI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_i(void) +{ + uint res = OPER_I_8(); + uint ea = EA_AX_AI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_d(void) +{ + uint res = MASK_OUT_ABOVE_8(DY); + uint ea = EA_A7_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_d(void) +{ + uint res = MASK_OUT_ABOVE_8(DY); + uint ea = EA_AX_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_ai(void) +{ + uint res = OPER_AY_AI_8(); + uint ea = EA_A7_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_pi(void) +{ + uint res = OPER_AY_PI_8(); + uint ea = EA_A7_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_pi7(void) +{ + uint res = OPER_A7_PI_8(); + uint ea = EA_A7_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_pd(void) +{ + uint res = OPER_AY_PD_8(); + uint ea = EA_A7_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_pd7(void) +{ + uint res = OPER_A7_PD_8(); + uint ea = EA_A7_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_di(void) +{ + uint res = OPER_AY_DI_8(); + uint ea = EA_A7_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_ix(void) +{ + uint res = OPER_AY_IX_8(); + uint ea = EA_A7_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_aw(void) +{ + uint res = OPER_AW_8(); + uint ea = EA_A7_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_al(void) +{ + uint res = OPER_AL_8(); + uint ea = EA_A7_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_pcdi(void) +{ + uint res = OPER_PCDI_8(); + uint ea = EA_A7_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_pcix(void) +{ + uint res = OPER_PCIX_8(); + uint ea = EA_A7_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_i(void) +{ + uint res = OPER_I_8(); + uint ea = EA_A7_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_ai(void) +{ + uint res = OPER_AY_AI_8(); + uint ea = EA_AX_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_pi(void) +{ + uint res = OPER_AY_PI_8(); + uint ea = EA_AX_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_pi7(void) +{ + uint res = OPER_A7_PI_8(); + uint ea = EA_AX_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_pd(void) +{ + uint res = OPER_AY_PD_8(); + uint ea = EA_AX_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_pd7(void) +{ + uint res = OPER_A7_PD_8(); + uint ea = EA_AX_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_di(void) +{ + uint res = OPER_AY_DI_8(); + uint ea = EA_AX_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_ix(void) +{ + uint res = OPER_AY_IX_8(); + uint ea = EA_AX_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_aw(void) +{ + uint res = OPER_AW_8(); + uint ea = EA_AX_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_al(void) +{ + uint res = OPER_AL_8(); + uint ea = EA_AX_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_pcdi(void) +{ + uint res = OPER_PCDI_8(); + uint ea = EA_AX_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_pcix(void) +{ + uint res = OPER_PCIX_8(); + uint ea = EA_AX_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_i(void) +{ + uint res = OPER_I_8(); + uint ea = EA_AX_PI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_d(void) +{ + uint res = MASK_OUT_ABOVE_8(DY); + uint ea = EA_A7_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_d(void) +{ + uint res = MASK_OUT_ABOVE_8(DY); + uint ea = EA_AX_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_ai(void) +{ + uint res = OPER_AY_AI_8(); + uint ea = EA_A7_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_pi(void) +{ + uint res = OPER_AY_PI_8(); + uint ea = EA_A7_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_pi7(void) +{ + uint res = OPER_A7_PI_8(); + uint ea = EA_A7_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_pd(void) +{ + uint res = OPER_AY_PD_8(); + uint ea = EA_A7_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_pd7(void) +{ + uint res = OPER_A7_PD_8(); + uint ea = EA_A7_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_di(void) +{ + uint res = OPER_AY_DI_8(); + uint ea = EA_A7_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_ix(void) +{ + uint res = OPER_AY_IX_8(); + uint ea = EA_A7_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_aw(void) +{ + uint res = OPER_AW_8(); + uint ea = EA_A7_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_al(void) +{ + uint res = OPER_AL_8(); + uint ea = EA_A7_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_pcdi(void) +{ + uint res = OPER_PCDI_8(); + uint ea = EA_A7_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_pcix(void) +{ + uint res = OPER_PCIX_8(); + uint ea = EA_A7_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_i(void) +{ + uint res = OPER_I_8(); + uint ea = EA_A7_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_ai(void) +{ + uint res = OPER_AY_AI_8(); + uint ea = EA_AX_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_pi(void) +{ + uint res = OPER_AY_PI_8(); + uint ea = EA_AX_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_pi7(void) +{ + uint res = OPER_A7_PI_8(); + uint ea = EA_AX_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_pd(void) +{ + uint res = OPER_AY_PD_8(); + uint ea = EA_AX_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_pd7(void) +{ + uint res = OPER_A7_PD_8(); + uint ea = EA_AX_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_di(void) +{ + uint res = OPER_AY_DI_8(); + uint ea = EA_AX_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_ix(void) +{ + uint res = OPER_AY_IX_8(); + uint ea = EA_AX_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_aw(void) +{ + uint res = OPER_AW_8(); + uint ea = EA_AX_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_al(void) +{ + uint res = OPER_AL_8(); + uint ea = EA_AX_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_pcdi(void) +{ + uint res = OPER_PCDI_8(); + uint ea = EA_AX_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_pcix(void) +{ + uint res = OPER_PCIX_8(); + uint ea = EA_AX_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_i(void) +{ + uint res = OPER_I_8(); + uint ea = EA_AX_PD_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_d(void) +{ + uint res = MASK_OUT_ABOVE_8(DY); + uint ea = EA_AX_DI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_ai(void) +{ + uint res = OPER_AY_AI_8(); + uint ea = EA_AX_DI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_pi(void) +{ + uint res = OPER_AY_PI_8(); + uint ea = EA_AX_DI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_pi7(void) +{ + uint res = OPER_A7_PI_8(); + uint ea = EA_AX_DI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_pd(void) +{ + uint res = OPER_AY_PD_8(); + uint ea = EA_AX_DI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_pd7(void) +{ + uint res = OPER_A7_PD_8(); + uint ea = EA_AX_DI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_di(void) +{ + uint res = OPER_AY_DI_8(); + uint ea = EA_AX_DI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_ix(void) +{ + uint res = OPER_AY_IX_8(); + uint ea = EA_AX_DI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_aw(void) +{ + uint res = OPER_AW_8(); + uint ea = EA_AX_DI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_al(void) +{ + uint res = OPER_AL_8(); + uint ea = EA_AX_DI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_pcdi(void) +{ + uint res = OPER_PCDI_8(); + uint ea = EA_AX_DI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_pcix(void) +{ + uint res = OPER_PCIX_8(); + uint ea = EA_AX_DI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_i(void) +{ + uint res = OPER_I_8(); + uint ea = EA_AX_DI_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_d(void) +{ + uint res = MASK_OUT_ABOVE_8(DY); + uint ea = EA_AX_IX_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_ai(void) +{ + uint res = OPER_AY_AI_8(); + uint ea = EA_AX_IX_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_pi(void) +{ + uint res = OPER_AY_PI_8(); + uint ea = EA_AX_IX_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_pi7(void) +{ + uint res = OPER_A7_PI_8(); + uint ea = EA_AX_IX_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_pd(void) +{ + uint res = OPER_AY_PD_8(); + uint ea = EA_AX_IX_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_pd7(void) +{ + uint res = OPER_A7_PD_8(); + uint ea = EA_AX_IX_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_di(void) +{ + uint res = OPER_AY_DI_8(); + uint ea = EA_AX_IX_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_ix(void) +{ + uint res = OPER_AY_IX_8(); + uint ea = EA_AX_IX_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_aw(void) +{ + uint res = OPER_AW_8(); + uint ea = EA_AX_IX_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_al(void) +{ + uint res = OPER_AL_8(); + uint ea = EA_AX_IX_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_pcdi(void) +{ + uint res = OPER_PCDI_8(); + uint ea = EA_AX_IX_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_pcix(void) +{ + uint res = OPER_PCIX_8(); + uint ea = EA_AX_IX_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_i(void) +{ + uint res = OPER_I_8(); + uint ea = EA_AX_IX_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_d(void) +{ + uint res = MASK_OUT_ABOVE_8(DY); + uint ea = EA_AW_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_ai(void) +{ + uint res = OPER_AY_AI_8(); + uint ea = EA_AW_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_pi(void) +{ + uint res = OPER_AY_PI_8(); + uint ea = EA_AW_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_pi7(void) +{ + uint res = OPER_A7_PI_8(); + uint ea = EA_AW_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_pd(void) +{ + uint res = OPER_AY_PD_8(); + uint ea = EA_AW_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_pd7(void) +{ + uint res = OPER_A7_PD_8(); + uint ea = EA_AW_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_di(void) +{ + uint res = OPER_AY_DI_8(); + uint ea = EA_AW_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_ix(void) +{ + uint res = OPER_AY_IX_8(); + uint ea = EA_AW_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_aw(void) +{ + uint res = OPER_AW_8(); + uint ea = EA_AW_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_al(void) +{ + uint res = OPER_AL_8(); + uint ea = EA_AW_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_pcdi(void) +{ + uint res = OPER_PCDI_8(); + uint ea = EA_AW_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_pcix(void) +{ + uint res = OPER_PCIX_8(); + uint ea = EA_AW_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_i(void) +{ + uint res = OPER_I_8(); + uint ea = EA_AW_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_d(void) +{ + uint res = MASK_OUT_ABOVE_8(DY); + uint ea = EA_AL_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_ai(void) +{ + uint res = OPER_AY_AI_8(); + uint ea = EA_AL_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_pi(void) +{ + uint res = OPER_AY_PI_8(); + uint ea = EA_AL_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_pi7(void) +{ + uint res = OPER_A7_PI_8(); + uint ea = EA_AL_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_pd(void) +{ + uint res = OPER_AY_PD_8(); + uint ea = EA_AL_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_pd7(void) +{ + uint res = OPER_A7_PD_8(); + uint ea = EA_AL_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_di(void) +{ + uint res = OPER_AY_DI_8(); + uint ea = EA_AL_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_ix(void) +{ + uint res = OPER_AY_IX_8(); + uint ea = EA_AL_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_aw(void) +{ + uint res = OPER_AW_8(); + uint ea = EA_AL_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_al(void) +{ + uint res = OPER_AL_8(); + uint ea = EA_AL_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_pcdi(void) +{ + uint res = OPER_PCDI_8(); + uint ea = EA_AL_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_pcix(void) +{ + uint res = OPER_PCIX_8(); + uint ea = EA_AL_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_i(void) +{ + uint res = OPER_I_8(); + uint ea = EA_AL_8(); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_d(void) +{ + uint res = MASK_OUT_ABOVE_16(DY); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_a(void) +{ + uint res = MASK_OUT_ABOVE_16(AY); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_ai(void) +{ + uint res = OPER_AY_AI_16(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_pi(void) +{ + uint res = OPER_AY_PI_16(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_pd(void) +{ + uint res = OPER_AY_PD_16(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_di(void) +{ + uint res = OPER_AY_DI_16(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_ix(void) +{ + uint res = OPER_AY_IX_16(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_aw(void) +{ + uint res = OPER_AW_16(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_al(void) +{ + uint res = OPER_AL_16(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_pcdi(void) +{ + uint res = OPER_PCDI_16(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_pcix(void) +{ + uint res = OPER_PCIX_16(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_i(void) +{ + uint res = OPER_I_16(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_d(void) +{ + uint res = MASK_OUT_ABOVE_16(DY); + uint ea = EA_AX_AI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_a(void) +{ + uint res = MASK_OUT_ABOVE_16(AY); + uint ea = EA_AX_AI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_ai(void) +{ + uint res = OPER_AY_AI_16(); + uint ea = EA_AX_AI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_pi(void) +{ + uint res = OPER_AY_PI_16(); + uint ea = EA_AX_AI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_pd(void) +{ + uint res = OPER_AY_PD_16(); + uint ea = EA_AX_AI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_di(void) +{ + uint res = OPER_AY_DI_16(); + uint ea = EA_AX_AI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_ix(void) +{ + uint res = OPER_AY_IX_16(); + uint ea = EA_AX_AI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_aw(void) +{ + uint res = OPER_AW_16(); + uint ea = EA_AX_AI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_al(void) +{ + uint res = OPER_AL_16(); + uint ea = EA_AX_AI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_pcdi(void) +{ + uint res = OPER_PCDI_16(); + uint ea = EA_AX_AI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_pcix(void) +{ + uint res = OPER_PCIX_16(); + uint ea = EA_AX_AI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_i(void) +{ + uint res = OPER_I_16(); + uint ea = EA_AX_AI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_d(void) +{ + uint res = MASK_OUT_ABOVE_16(DY); + uint ea = EA_AX_PI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_a(void) +{ + uint res = MASK_OUT_ABOVE_16(AY); + uint ea = EA_AX_PI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_ai(void) +{ + uint res = OPER_AY_AI_16(); + uint ea = EA_AX_PI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_pi(void) +{ + uint res = OPER_AY_PI_16(); + uint ea = EA_AX_PI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_pd(void) +{ + uint res = OPER_AY_PD_16(); + uint ea = EA_AX_PI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_di(void) +{ + uint res = OPER_AY_DI_16(); + uint ea = EA_AX_PI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_ix(void) +{ + uint res = OPER_AY_IX_16(); + uint ea = EA_AX_PI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_aw(void) +{ + uint res = OPER_AW_16(); + uint ea = EA_AX_PI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_al(void) +{ + uint res = OPER_AL_16(); + uint ea = EA_AX_PI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_pcdi(void) +{ + uint res = OPER_PCDI_16(); + uint ea = EA_AX_PI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_pcix(void) +{ + uint res = OPER_PCIX_16(); + uint ea = EA_AX_PI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_i(void) +{ + uint res = OPER_I_16(); + uint ea = EA_AX_PI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_d(void) +{ + uint res = MASK_OUT_ABOVE_16(DY); + uint ea = EA_AX_PD_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_a(void) +{ + uint res = MASK_OUT_ABOVE_16(AY); + uint ea = EA_AX_PD_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_ai(void) +{ + uint res = OPER_AY_AI_16(); + uint ea = EA_AX_PD_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_pi(void) +{ + uint res = OPER_AY_PI_16(); + uint ea = EA_AX_PD_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_pd(void) +{ + uint res = OPER_AY_PD_16(); + uint ea = EA_AX_PD_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_di(void) +{ + uint res = OPER_AY_DI_16(); + uint ea = EA_AX_PD_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_ix(void) +{ + uint res = OPER_AY_IX_16(); + uint ea = EA_AX_PD_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_aw(void) +{ + uint res = OPER_AW_16(); + uint ea = EA_AX_PD_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_al(void) +{ + uint res = OPER_AL_16(); + uint ea = EA_AX_PD_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_pcdi(void) +{ + uint res = OPER_PCDI_16(); + uint ea = EA_AX_PD_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_pcix(void) +{ + uint res = OPER_PCIX_16(); + uint ea = EA_AX_PD_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_i(void) +{ + uint res = OPER_I_16(); + uint ea = EA_AX_PD_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_d(void) +{ + uint res = MASK_OUT_ABOVE_16(DY); + uint ea = EA_AX_DI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_a(void) +{ + uint res = MASK_OUT_ABOVE_16(AY); + uint ea = EA_AX_DI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_ai(void) +{ + uint res = OPER_AY_AI_16(); + uint ea = EA_AX_DI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_pi(void) +{ + uint res = OPER_AY_PI_16(); + uint ea = EA_AX_DI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_pd(void) +{ + uint res = OPER_AY_PD_16(); + uint ea = EA_AX_DI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_di(void) +{ + uint res = OPER_AY_DI_16(); + uint ea = EA_AX_DI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_ix(void) +{ + uint res = OPER_AY_IX_16(); + uint ea = EA_AX_DI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_aw(void) +{ + uint res = OPER_AW_16(); + uint ea = EA_AX_DI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_al(void) +{ + uint res = OPER_AL_16(); + uint ea = EA_AX_DI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_pcdi(void) +{ + uint res = OPER_PCDI_16(); + uint ea = EA_AX_DI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_pcix(void) +{ + uint res = OPER_PCIX_16(); + uint ea = EA_AX_DI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_i(void) +{ + uint res = OPER_I_16(); + uint ea = EA_AX_DI_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_d(void) +{ + uint res = MASK_OUT_ABOVE_16(DY); + uint ea = EA_AX_IX_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_a(void) +{ + uint res = MASK_OUT_ABOVE_16(AY); + uint ea = EA_AX_IX_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_ai(void) +{ + uint res = OPER_AY_AI_16(); + uint ea = EA_AX_IX_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_pi(void) +{ + uint res = OPER_AY_PI_16(); + uint ea = EA_AX_IX_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_pd(void) +{ + uint res = OPER_AY_PD_16(); + uint ea = EA_AX_IX_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_di(void) +{ + uint res = OPER_AY_DI_16(); + uint ea = EA_AX_IX_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_ix(void) +{ + uint res = OPER_AY_IX_16(); + uint ea = EA_AX_IX_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_aw(void) +{ + uint res = OPER_AW_16(); + uint ea = EA_AX_IX_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_al(void) +{ + uint res = OPER_AL_16(); + uint ea = EA_AX_IX_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_pcdi(void) +{ + uint res = OPER_PCDI_16(); + uint ea = EA_AX_IX_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_pcix(void) +{ + uint res = OPER_PCIX_16(); + uint ea = EA_AX_IX_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_i(void) +{ + uint res = OPER_I_16(); + uint ea = EA_AX_IX_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_d(void) +{ + uint res = MASK_OUT_ABOVE_16(DY); + uint ea = EA_AW_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_a(void) +{ + uint res = MASK_OUT_ABOVE_16(AY); + uint ea = EA_AW_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_ai(void) +{ + uint res = OPER_AY_AI_16(); + uint ea = EA_AW_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_pi(void) +{ + uint res = OPER_AY_PI_16(); + uint ea = EA_AW_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_pd(void) +{ + uint res = OPER_AY_PD_16(); + uint ea = EA_AW_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_di(void) +{ + uint res = OPER_AY_DI_16(); + uint ea = EA_AW_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_ix(void) +{ + uint res = OPER_AY_IX_16(); + uint ea = EA_AW_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_aw(void) +{ + uint res = OPER_AW_16(); + uint ea = EA_AW_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_al(void) +{ + uint res = OPER_AL_16(); + uint ea = EA_AW_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_pcdi(void) +{ + uint res = OPER_PCDI_16(); + uint ea = EA_AW_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_pcix(void) +{ + uint res = OPER_PCIX_16(); + uint ea = EA_AW_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_i(void) +{ + uint res = OPER_I_16(); + uint ea = EA_AW_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_d(void) +{ + uint res = MASK_OUT_ABOVE_16(DY); + uint ea = EA_AL_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_a(void) +{ + uint res = MASK_OUT_ABOVE_16(AY); + uint ea = EA_AL_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_ai(void) +{ + uint res = OPER_AY_AI_16(); + uint ea = EA_AL_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_pi(void) +{ + uint res = OPER_AY_PI_16(); + uint ea = EA_AL_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_pd(void) +{ + uint res = OPER_AY_PD_16(); + uint ea = EA_AL_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_di(void) +{ + uint res = OPER_AY_DI_16(); + uint ea = EA_AL_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_ix(void) +{ + uint res = OPER_AY_IX_16(); + uint ea = EA_AL_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_aw(void) +{ + uint res = OPER_AW_16(); + uint ea = EA_AL_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_al(void) +{ + uint res = OPER_AL_16(); + uint ea = EA_AL_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_pcdi(void) +{ + uint res = OPER_PCDI_16(); + uint ea = EA_AL_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_pcix(void) +{ + uint res = OPER_PCIX_16(); + uint ea = EA_AL_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_i(void) +{ + uint res = OPER_I_16(); + uint ea = EA_AL_16(); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_d(void) +{ + uint res = DY; + uint* r_dst = &DX; + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_a(void) +{ + uint res = AY; + uint* r_dst = &DX; + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_ai(void) +{ + uint res = OPER_AY_AI_32(); + uint* r_dst = &DX; + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_pi(void) +{ + uint res = OPER_AY_PI_32(); + uint* r_dst = &DX; + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_pd(void) +{ + uint res = OPER_AY_PD_32(); + uint* r_dst = &DX; + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_di(void) +{ + uint res = OPER_AY_DI_32(); + uint* r_dst = &DX; + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_ix(void) +{ + uint res = OPER_AY_IX_32(); + uint* r_dst = &DX; + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_aw(void) +{ + uint res = OPER_AW_32(); + uint* r_dst = &DX; + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_al(void) +{ + uint res = OPER_AL_32(); + uint* r_dst = &DX; + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_pcdi(void) +{ + uint res = OPER_PCDI_32(); + uint* r_dst = &DX; + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_pcix(void) +{ + uint res = OPER_PCIX_32(); + uint* r_dst = &DX; + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_i(void) +{ + uint res = OPER_I_32(); + uint* r_dst = &DX; + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_d(void) +{ + uint res = DY; + uint ea = EA_AX_AI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_a(void) +{ + uint res = AY; + uint ea = EA_AX_AI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_ai(void) +{ + uint res = OPER_AY_AI_32(); + uint ea = EA_AX_AI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_pi(void) +{ + uint res = OPER_AY_PI_32(); + uint ea = EA_AX_AI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_pd(void) +{ + uint res = OPER_AY_PD_32(); + uint ea = EA_AX_AI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_di(void) +{ + uint res = OPER_AY_DI_32(); + uint ea = EA_AX_AI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_ix(void) +{ + uint res = OPER_AY_IX_32(); + uint ea = EA_AX_AI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_aw(void) +{ + uint res = OPER_AW_32(); + uint ea = EA_AX_AI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_al(void) +{ + uint res = OPER_AL_32(); + uint ea = EA_AX_AI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_pcdi(void) +{ + uint res = OPER_PCDI_32(); + uint ea = EA_AX_AI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_pcix(void) +{ + uint res = OPER_PCIX_32(); + uint ea = EA_AX_AI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_i(void) +{ + uint res = OPER_I_32(); + uint ea = EA_AX_AI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_d(void) +{ + uint res = DY; + uint ea = EA_AX_PI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_a(void) +{ + uint res = AY; + uint ea = EA_AX_PI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_ai(void) +{ + uint res = OPER_AY_AI_32(); + uint ea = EA_AX_PI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_pi(void) +{ + uint res = OPER_AY_PI_32(); + uint ea = EA_AX_PI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_pd(void) +{ + uint res = OPER_AY_PD_32(); + uint ea = EA_AX_PI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_di(void) +{ + uint res = OPER_AY_DI_32(); + uint ea = EA_AX_PI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_ix(void) +{ + uint res = OPER_AY_IX_32(); + uint ea = EA_AX_PI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_aw(void) +{ + uint res = OPER_AW_32(); + uint ea = EA_AX_PI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_al(void) +{ + uint res = OPER_AL_32(); + uint ea = EA_AX_PI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_pcdi(void) +{ + uint res = OPER_PCDI_32(); + uint ea = EA_AX_PI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_pcix(void) +{ + uint res = OPER_PCIX_32(); + uint ea = EA_AX_PI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_i(void) +{ + uint res = OPER_I_32(); + uint ea = EA_AX_PI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_d(void) +{ + uint res = DY; + uint ea = EA_AX_PD_32(); + + m68ki_write_16(ea+2, res & 0xFFFF ); + m68ki_write_16(ea, (res >> 16) & 0xFFFF ); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_a(void) +{ + uint res = AY; + uint ea = EA_AX_PD_32(); + + m68ki_write_16(ea+2, res & 0xFFFF ); + m68ki_write_16(ea, (res >> 16) & 0xFFFF ); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_ai(void) +{ + uint res = OPER_AY_AI_32(); + uint ea = EA_AX_PD_32(); + + m68ki_write_16(ea+2, res & 0xFFFF ); + m68ki_write_16(ea, (res >> 16) & 0xFFFF ); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_pi(void) +{ + uint res = OPER_AY_PI_32(); + uint ea = EA_AX_PD_32(); + + m68ki_write_16(ea+2, res & 0xFFFF ); + m68ki_write_16(ea, (res >> 16) & 0xFFFF ); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_pd(void) +{ + uint res = OPER_AY_PD_32(); + uint ea = EA_AX_PD_32(); + + m68ki_write_16(ea+2, res & 0xFFFF ); + m68ki_write_16(ea, (res >> 16) & 0xFFFF ); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_di(void) +{ + uint res = OPER_AY_DI_32(); + uint ea = EA_AX_PD_32(); + + m68ki_write_16(ea+2, res & 0xFFFF ); + m68ki_write_16(ea, (res >> 16) & 0xFFFF ); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_ix(void) +{ + uint res = OPER_AY_IX_32(); + uint ea = EA_AX_PD_32(); + + m68ki_write_16(ea+2, res & 0xFFFF ); + m68ki_write_16(ea, (res >> 16) & 0xFFFF ); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_aw(void) +{ + uint res = OPER_AW_32(); + uint ea = EA_AX_PD_32(); + + m68ki_write_16(ea+2, res & 0xFFFF ); + m68ki_write_16(ea, (res >> 16) & 0xFFFF ); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_al(void) +{ + uint res = OPER_AL_32(); + uint ea = EA_AX_PD_32(); + + m68ki_write_16(ea+2, res & 0xFFFF ); + m68ki_write_16(ea, (res >> 16) & 0xFFFF ); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_pcdi(void) +{ + uint res = OPER_PCDI_32(); + uint ea = EA_AX_PD_32(); + + m68ki_write_16(ea+2, res & 0xFFFF ); + m68ki_write_16(ea, (res >> 16) & 0xFFFF ); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_pcix(void) +{ + uint res = OPER_PCIX_32(); + uint ea = EA_AX_PD_32(); + + m68ki_write_16(ea+2, res & 0xFFFF ); + m68ki_write_16(ea, (res >> 16) & 0xFFFF ); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_i(void) +{ + uint res = OPER_I_32(); + uint ea = EA_AX_PD_32(); + + m68ki_write_16(ea+2, res & 0xFFFF ); + m68ki_write_16(ea, (res >> 16) & 0xFFFF ); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_d(void) +{ + uint res = DY; + uint ea = EA_AX_DI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_a(void) +{ + uint res = AY; + uint ea = EA_AX_DI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_ai(void) +{ + uint res = OPER_AY_AI_32(); + uint ea = EA_AX_DI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_pi(void) +{ + uint res = OPER_AY_PI_32(); + uint ea = EA_AX_DI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_pd(void) +{ + uint res = OPER_AY_PD_32(); + uint ea = EA_AX_DI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_di(void) +{ + uint res = OPER_AY_DI_32(); + uint ea = EA_AX_DI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_ix(void) +{ + uint res = OPER_AY_IX_32(); + uint ea = EA_AX_DI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_aw(void) +{ + uint res = OPER_AW_32(); + uint ea = EA_AX_DI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_al(void) +{ + uint res = OPER_AL_32(); + uint ea = EA_AX_DI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_pcdi(void) +{ + uint res = OPER_PCDI_32(); + uint ea = EA_AX_DI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_pcix(void) +{ + uint res = OPER_PCIX_32(); + uint ea = EA_AX_DI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_i(void) +{ + uint res = OPER_I_32(); + uint ea = EA_AX_DI_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_d(void) +{ + uint res = DY; + uint ea = EA_AX_IX_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_a(void) +{ + uint res = AY; + uint ea = EA_AX_IX_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_ai(void) +{ + uint res = OPER_AY_AI_32(); + uint ea = EA_AX_IX_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_pi(void) +{ + uint res = OPER_AY_PI_32(); + uint ea = EA_AX_IX_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_pd(void) +{ + uint res = OPER_AY_PD_32(); + uint ea = EA_AX_IX_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_di(void) +{ + uint res = OPER_AY_DI_32(); + uint ea = EA_AX_IX_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_ix(void) +{ + uint res = OPER_AY_IX_32(); + uint ea = EA_AX_IX_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_aw(void) +{ + uint res = OPER_AW_32(); + uint ea = EA_AX_IX_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_al(void) +{ + uint res = OPER_AL_32(); + uint ea = EA_AX_IX_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_pcdi(void) +{ + uint res = OPER_PCDI_32(); + uint ea = EA_AX_IX_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_pcix(void) +{ + uint res = OPER_PCIX_32(); + uint ea = EA_AX_IX_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_i(void) +{ + uint res = OPER_I_32(); + uint ea = EA_AX_IX_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_d(void) +{ + uint res = DY; + uint ea = EA_AW_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_a(void) +{ + uint res = AY; + uint ea = EA_AW_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_ai(void) +{ + uint res = OPER_AY_AI_32(); + uint ea = EA_AW_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_pi(void) +{ + uint res = OPER_AY_PI_32(); + uint ea = EA_AW_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_pd(void) +{ + uint res = OPER_AY_PD_32(); + uint ea = EA_AW_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_di(void) +{ + uint res = OPER_AY_DI_32(); + uint ea = EA_AW_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_ix(void) +{ + uint res = OPER_AY_IX_32(); + uint ea = EA_AW_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_aw(void) +{ + uint res = OPER_AW_32(); + uint ea = EA_AW_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_al(void) +{ + uint res = OPER_AL_32(); + uint ea = EA_AW_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_pcdi(void) +{ + uint res = OPER_PCDI_32(); + uint ea = EA_AW_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_pcix(void) +{ + uint res = OPER_PCIX_32(); + uint ea = EA_AW_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_i(void) +{ + uint res = OPER_I_32(); + uint ea = EA_AW_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_d(void) +{ + uint res = DY; + uint ea = EA_AL_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_a(void) +{ + uint res = AY; + uint ea = EA_AL_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_ai(void) +{ + uint res = OPER_AY_AI_32(); + uint ea = EA_AL_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_pi(void) +{ + uint res = OPER_AY_PI_32(); + uint ea = EA_AL_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_pd(void) +{ + uint res = OPER_AY_PD_32(); + uint ea = EA_AL_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_di(void) +{ + uint res = OPER_AY_DI_32(); + uint ea = EA_AL_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_ix(void) +{ + uint res = OPER_AY_IX_32(); + uint ea = EA_AL_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_aw(void) +{ + uint res = OPER_AW_32(); + uint ea = EA_AL_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_al(void) +{ + uint res = OPER_AL_32(); + uint ea = EA_AL_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_pcdi(void) +{ + uint res = OPER_PCDI_32(); + uint ea = EA_AL_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_pcix(void) +{ + uint res = OPER_PCIX_32(); + uint ea = EA_AL_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_i(void) +{ + uint res = OPER_I_32(); + uint ea = EA_AL_32(); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_movea_16_d(void) +{ + AX = MAKE_INT_16(DY); +} + + +static void m68k_op_movea_16_a(void) +{ + AX = MAKE_INT_16(AY); +} + + +static void m68k_op_movea_16_ai(void) +{ + AX = MAKE_INT_16(OPER_AY_AI_16()); +} + + +static void m68k_op_movea_16_pi(void) +{ + AX = MAKE_INT_16(OPER_AY_PI_16()); +} + + +static void m68k_op_movea_16_pd(void) +{ + AX = MAKE_INT_16(OPER_AY_PD_16()); +} + + +static void m68k_op_movea_16_di(void) +{ + AX = MAKE_INT_16(OPER_AY_DI_16()); +} + + +static void m68k_op_movea_16_ix(void) +{ + AX = MAKE_INT_16(OPER_AY_IX_16()); +} + + +static void m68k_op_movea_16_aw(void) +{ + AX = MAKE_INT_16(OPER_AW_16()); +} + + +static void m68k_op_movea_16_al(void) +{ + AX = MAKE_INT_16(OPER_AL_16()); +} + + +static void m68k_op_movea_16_pcdi(void) +{ + AX = MAKE_INT_16(OPER_PCDI_16()); +} + + +static void m68k_op_movea_16_pcix(void) +{ + AX = MAKE_INT_16(OPER_PCIX_16()); +} + + +static void m68k_op_movea_16_i(void) +{ + AX = MAKE_INT_16(OPER_I_16()); +} + + +static void m68k_op_movea_32_d(void) +{ + AX = DY; +} + + +static void m68k_op_movea_32_a(void) +{ + AX = AY; +} + + +static void m68k_op_movea_32_ai(void) +{ + AX = OPER_AY_AI_32(); +} + + +static void m68k_op_movea_32_pi(void) +{ + AX = OPER_AY_PI_32(); +} + + +static void m68k_op_movea_32_pd(void) +{ + AX = OPER_AY_PD_32(); +} + + +static void m68k_op_movea_32_di(void) +{ + AX = OPER_AY_DI_32(); +} + + +static void m68k_op_movea_32_ix(void) +{ + AX = OPER_AY_IX_32(); +} + + +static void m68k_op_movea_32_aw(void) +{ + AX = OPER_AW_32(); +} + + +static void m68k_op_movea_32_al(void) +{ + AX = OPER_AL_32(); +} + + +static void m68k_op_movea_32_pcdi(void) +{ + AX = OPER_PCDI_32(); +} + + +static void m68k_op_movea_32_pcix(void) +{ + AX = OPER_PCIX_32(); +} + + +static void m68k_op_movea_32_i(void) +{ + AX = OPER_I_32(); +} + + +static void m68k_op_move_16_frc_d(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + DY = MASK_OUT_BELOW_16(DY) | m68ki_get_ccr(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_move_16_frc_ai(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + m68ki_write_16(EA_AY_AI_16(), m68ki_get_ccr()); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_move_16_frc_pi(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + m68ki_write_16(EA_AY_PI_16(), m68ki_get_ccr()); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_move_16_frc_pd(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + m68ki_write_16(EA_AY_PD_16(), m68ki_get_ccr()); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_move_16_frc_di(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + m68ki_write_16(EA_AY_DI_16(), m68ki_get_ccr()); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_move_16_frc_ix(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + m68ki_write_16(EA_AY_IX_16(), m68ki_get_ccr()); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_move_16_frc_aw(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + m68ki_write_16(EA_AW_16(), m68ki_get_ccr()); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_move_16_frc_al(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + m68ki_write_16(EA_AL_16(), m68ki_get_ccr()); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_move_16_toc_d(void) +{ + m68ki_set_ccr(DY); +} + + +static void m68k_op_move_16_toc_ai(void) +{ + m68ki_set_ccr(OPER_AY_AI_16()); +} + + +static void m68k_op_move_16_toc_pi(void) +{ + m68ki_set_ccr(OPER_AY_PI_16()); +} + + +static void m68k_op_move_16_toc_pd(void) +{ + m68ki_set_ccr(OPER_AY_PD_16()); +} + + +static void m68k_op_move_16_toc_di(void) +{ + m68ki_set_ccr(OPER_AY_DI_16()); +} + + +static void m68k_op_move_16_toc_ix(void) +{ + m68ki_set_ccr(OPER_AY_IX_16()); +} + + +static void m68k_op_move_16_toc_aw(void) +{ + m68ki_set_ccr(OPER_AW_16()); +} + + +static void m68k_op_move_16_toc_al(void) +{ + m68ki_set_ccr(OPER_AL_16()); +} + + +static void m68k_op_move_16_toc_pcdi(void) +{ + m68ki_set_ccr(OPER_PCDI_16()); +} + + +static void m68k_op_move_16_toc_pcix(void) +{ + m68ki_set_ccr(OPER_PCIX_16()); +} + + +static void m68k_op_move_16_toc_i(void) +{ + m68ki_set_ccr(OPER_I_16()); +} + + +static void m68k_op_move_16_frs_d(void) +{ + if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ + { + DY = MASK_OUT_BELOW_16(DY) | m68ki_get_sr(); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_frs_ai(void) +{ + if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ + { + uint ea = EA_AY_AI_16(); + m68ki_write_16(ea, m68ki_get_sr()); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_frs_pi(void) +{ + if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ + { + uint ea = EA_AY_PI_16(); + m68ki_write_16(ea, m68ki_get_sr()); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_frs_pd(void) +{ + if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ + { + uint ea = EA_AY_PD_16(); + m68ki_write_16(ea, m68ki_get_sr()); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_frs_di(void) +{ + if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ + { + uint ea = EA_AY_DI_16(); + m68ki_write_16(ea, m68ki_get_sr()); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_frs_ix(void) +{ + if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ + { + uint ea = EA_AY_IX_16(); + m68ki_write_16(ea, m68ki_get_sr()); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_frs_aw(void) +{ + if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ + { + uint ea = EA_AW_16(); + m68ki_write_16(ea, m68ki_get_sr()); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_frs_al(void) +{ + if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */ + { + uint ea = EA_AL_16(); + m68ki_write_16(ea, m68ki_get_sr()); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_tos_d(void) +{ + if(FLAG_S) + { + m68ki_set_sr(DY); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_tos_ai(void) +{ + if(FLAG_S) + { + uint new_sr = OPER_AY_AI_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr(new_sr); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_tos_pi(void) +{ + if(FLAG_S) + { + uint new_sr = OPER_AY_PI_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr(new_sr); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_tos_pd(void) +{ + if(FLAG_S) + { + uint new_sr = OPER_AY_PD_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr(new_sr); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_tos_di(void) +{ + if(FLAG_S) + { + uint new_sr = OPER_AY_DI_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr(new_sr); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_tos_ix(void) +{ + if(FLAG_S) + { + uint new_sr = OPER_AY_IX_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr(new_sr); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_tos_aw(void) +{ + if(FLAG_S) + { + uint new_sr = OPER_AW_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr(new_sr); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_tos_al(void) +{ + if(FLAG_S) + { + uint new_sr = OPER_AL_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr(new_sr); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_tos_pcdi(void) +{ + if(FLAG_S) + { + uint new_sr = OPER_PCDI_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr(new_sr); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_tos_pcix(void) +{ + if(FLAG_S) + { + uint new_sr = OPER_PCIX_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr(new_sr); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_16_tos_i(void) +{ + if(FLAG_S) + { + uint new_sr = OPER_I_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr(new_sr); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_32_fru(void) +{ + if(FLAG_S) + { + AY = REG_USP; + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_move_32_tou(void) +{ + if(FLAG_S) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + REG_USP = AY; + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_movec_32_cr(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + switch (word2 & 0xfff) + { + case 0x000: /* SFC */ + REG_DA[(word2 >> 12) & 15] = REG_SFC; + return; + case 0x001: /* DFC */ + REG_DA[(word2 >> 12) & 15] = REG_DFC; + return; + case 0x002: /* CACR */ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + REG_DA[(word2 >> 12) & 15] = REG_CACR; + return; + } + return; + case 0x800: /* USP */ + REG_DA[(word2 >> 12) & 15] = REG_USP; + return; + case 0x801: /* VBR */ + REG_DA[(word2 >> 12) & 15] = REG_VBR; + return; + case 0x802: /* CAAR */ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + REG_DA[(word2 >> 12) & 15] = REG_CAAR; + return; + } + m68ki_exception_illegal(); + break; + case 0x803: /* MSP */ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_SP : REG_MSP; + return; + } + m68ki_exception_illegal(); + return; + case 0x804: /* ISP */ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_ISP : REG_SP; + return; + } + m68ki_exception_illegal(); + return; + case 0x003: /* TC */ + if(CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x004: /* ITT0 */ + if(CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x005: /* ITT1 */ + if(CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x006: /* DTT0 */ + if(CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x007: /* DTT1 */ + if(CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x805: /* MMUSR */ + if(CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x806: /* URP */ + if(CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x807: /* SRP */ + if(CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + default: + m68ki_exception_illegal(); + return; + } + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_movec_32_rc(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + switch (word2 & 0xfff) + { + case 0x000: /* SFC */ + REG_SFC = REG_DA[(word2 >> 12) & 15] & 7; + return; + case 0x001: /* DFC */ + REG_DFC = REG_DA[(word2 >> 12) & 15] & 7; + return; + case 0x002: /* CACR */ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if (CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + REG_CACR = REG_DA[(word2 >> 12) & 15]; + } + else + { + /* non 68040 can only set the lower 4 bits (C,CE,F,E) */ + REG_CACR = REG_DA[(word2 >> 12) & 15] & 0x0f; + } + return; + } + m68ki_exception_illegal(); + return; + case 0x800: /* USP */ + REG_USP = REG_DA[(word2 >> 12) & 15]; + return; + case 0x801: /* VBR */ + REG_VBR = REG_DA[(word2 >> 12) & 15]; + return; + case 0x802: /* CAAR */ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + REG_CAAR = REG_DA[(word2 >> 12) & 15]; + return; + } + m68ki_exception_illegal(); + return; + case 0x803: /* MSP */ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + /* we are in supervisor mode so just check for M flag */ + if(!FLAG_M) + { + REG_MSP = REG_DA[(word2 >> 12) & 15]; + return; + } + REG_SP = REG_DA[(word2 >> 12) & 15]; + return; + } + m68ki_exception_illegal(); + return; + case 0x804: /* ISP */ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(!FLAG_M) + { + REG_SP = REG_DA[(word2 >> 12) & 15]; + return; + } + REG_ISP = REG_DA[(word2 >> 12) & 15]; + return; + } + m68ki_exception_illegal(); + return; + case 0x003: /* TC */ + if (CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x004: /* ITT0 */ + if (CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x005: /* ITT1 */ + if (CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x006: /* DTT0 */ + if (CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x007: /* DTT1 */ + if (CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x805: /* MMUSR */ + if (CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x806: /* URP */ + if (CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + case 0x807: /* SRP */ + if (CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(); + return; + default: + m68ki_exception_illegal(); + return; + } + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_movem_16_re_pd(void) +{ + uint i = 0; + uint register_list = OPER_I_16(); + uint ea = AY; + uint count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + ea -= 2; + m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[15-i])); + count++; + } + AY = ea; + + USE_CYCLES(count<> 16) & 0xFFFF ); + count++; + } + AY = ea; + + USE_CYCLES(count<> 8)); + m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src)); +} + + +static void m68k_op_movep_32_re(void) +{ + uint ea = EA_AY_DI_32(); + uint src = DX; + + m68ki_write_8(ea, MASK_OUT_ABOVE_8(src >> 24)); + m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 16)); + m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 8)); + m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src)); +} + + +static void m68k_op_movep_16_er(void) +{ + uint ea = EA_AY_DI_16(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | ((m68ki_read_8(ea) << 8) + m68ki_read_8(ea + 2)); +} + + +static void m68k_op_movep_32_er(void) +{ + uint ea = EA_AY_DI_32(); + + DX = (m68ki_read_8(ea) << 24) + (m68ki_read_8(ea + 2) << 16) + + (m68ki_read_8(ea + 4) << 8) + m68ki_read_8(ea + 6); +} + + +static void m68k_op_moves_8_ai(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_AI_8(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_8_pi(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_PI_8(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_8_pi7(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_A7_PI_8(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_8_pd(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_PD_8(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_8_pd7(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_A7_PD_8(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_8_di(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_DI_8(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_8_ix(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_IX_8(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_8_aw(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AW_8(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_8_al(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AL_8(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_16_ai(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_AI_16(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_16_pi(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_PI_16(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_16_pd(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_PD_16(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_16_di(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_DI_16(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_16_ix(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_IX_16(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_16_aw(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AW_16(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_16_al(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AL_16(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC)); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to data register */ + REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_32_ai(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_AI_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to register */ + REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_32_pi(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_PI_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to register */ + REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_32_pd(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_PD_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to register */ + REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_32_di(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_DI_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to register */ + REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_32_ix(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AY_IX_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to register */ + REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_32_aw(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AW_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to register */ + REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moves_32_al(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + if(FLAG_S) + { + uint word2 = OPER_I_16(); + uint ea = EA_AL_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + /* Memory to register */ + REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC); + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + USE_CYCLES(2); + return; + } + m68ki_exception_privilege_violation(); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_moveq_32(void) +{ + uint res = DX = MAKE_INT_8(MASK_OUT_ABOVE_8(REG_IR)); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_move16_32(void) +{ + uint16 w2 = OPER_I_16(); + int ax = REG_IR & 7; + int ay = (w2 >> 12) & 7; + + m68ki_write_32(REG_A[ay], m68ki_read_32(REG_A[ax])); + m68ki_write_32(REG_A[ay]+4, m68ki_read_32(REG_A[ax]+4)); + m68ki_write_32(REG_A[ay]+8, m68ki_read_32(REG_A[ax]+8)); + m68ki_write_32(REG_A[ay]+12, m68ki_read_32(REG_A[ax]+12)); + + REG_A[ax] += 16; + REG_A[ay] += 16; +} + + +static void m68k_op_muls_16_d(void) +{ + uint* r_dst = &DX; + uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(DY) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_ai(void) +{ + uint* r_dst = &DX; + uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_AI_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_pi(void) +{ + uint* r_dst = &DX; + uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_PI_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_pd(void) +{ + uint* r_dst = &DX; + uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_PD_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_di(void) +{ + uint* r_dst = &DX; + uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_DI_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_ix(void) +{ + uint* r_dst = &DX; + uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_IX_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_aw(void) +{ + uint* r_dst = &DX; + uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AW_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_al(void) +{ + uint* r_dst = &DX; + uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AL_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_pcdi(void) +{ + uint* r_dst = &DX; + uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_PCDI_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_pcix(void) +{ + uint* r_dst = &DX; + uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_PCIX_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_i(void) +{ + uint* r_dst = &DX; + uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_I_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_d(void) +{ + uint* r_dst = &DX; + uint res = MASK_OUT_ABOVE_16(DY) * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_ai(void) +{ + uint* r_dst = &DX; + uint res = OPER_AY_AI_16() * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_pi(void) +{ + uint* r_dst = &DX; + uint res = OPER_AY_PI_16() * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_pd(void) +{ + uint* r_dst = &DX; + uint res = OPER_AY_PD_16() * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_di(void) +{ + uint* r_dst = &DX; + uint res = OPER_AY_DI_16() * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_ix(void) +{ + uint* r_dst = &DX; + uint res = OPER_AY_IX_16() * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_aw(void) +{ + uint* r_dst = &DX; + uint res = OPER_AW_16() * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_al(void) +{ + uint* r_dst = &DX; + uint res = OPER_AL_16() * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_pcdi(void) +{ + uint* r_dst = &DX; + uint res = OPER_PCDI_16() * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_pcix(void) +{ + uint* r_dst = &DX; + uint res = OPER_PCIX_16() * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_i(void) +{ + uint* r_dst = &DX; + uint res = OPER_I_16() * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + FLAG_Z = res; + FLAG_N = NFLAG_32(res); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_mull_32_d(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 src = DY; + uint64 dst = REG_D[(word2 >> 12) & 7]; + uint64 res; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (sint64)((sint32)src) * (sint64)((sint32)dst); + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = ((sint64)res != (sint32)res)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = (res > 0xffffffff)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint src = DY; + uint dst = REG_D[(word2 >> 12) & 7]; + uint neg = GET_MSB_32(src ^ dst); + uint src1; + uint src2; + uint dst1; + uint dst2; + uint r1; + uint r2; + uint r3; + uint r4; + uint lo; + uint hi; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + if(GET_MSB_32(src)) + src = (uint)MASK_OUT_ABOVE_32(-(sint)src); + if(GET_MSB_32(dst)) + dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); + } + + src1 = MASK_OUT_ABOVE_16(src); + src2 = src>>16; + dst1 = MASK_OUT_ABOVE_16(dst); + dst2 = dst>>16; + + + r1 = src1 * dst1; + r2 = src1 * dst2; + r3 = src2 * dst1; + r4 = src2 * dst2; + + lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); + hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); + + if(BIT_B(word2) && neg) + { + hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); + lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); + } + + if(BIT_A(word2)) + { + REG_D[word2 & 7] = hi; + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(hi); + FLAG_Z = hi | lo; + FLAG_V = VFLAG_CLEAR; + return; + } + + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(lo); + FLAG_Z = lo; + if(BIT_B(word2)) + FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; + else + FLAG_V = (hi != 0) << 7; + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_mull_32_ai(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 src = OPER_AY_AI_32(); + uint64 dst = REG_D[(word2 >> 12) & 7]; + uint64 res; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (sint64)((sint32)src) * (sint64)((sint32)dst); + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = ((sint64)res != (sint32)res)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = (res > 0xffffffff)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint src = OPER_AY_AI_32(); + uint dst = REG_D[(word2 >> 12) & 7]; + uint neg = GET_MSB_32(src ^ dst); + uint src1; + uint src2; + uint dst1; + uint dst2; + uint r1; + uint r2; + uint r3; + uint r4; + uint lo; + uint hi; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + if(GET_MSB_32(src)) + src = (uint)MASK_OUT_ABOVE_32(-(sint)src); + if(GET_MSB_32(dst)) + dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); + } + + src1 = MASK_OUT_ABOVE_16(src); + src2 = src>>16; + dst1 = MASK_OUT_ABOVE_16(dst); + dst2 = dst>>16; + + + r1 = src1 * dst1; + r2 = src1 * dst2; + r3 = src2 * dst1; + r4 = src2 * dst2; + + lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); + hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); + + if(BIT_B(word2) && neg) + { + hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); + lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); + } + + if(BIT_A(word2)) + { + REG_D[word2 & 7] = hi; + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(hi); + FLAG_Z = hi | lo; + FLAG_V = VFLAG_CLEAR; + return; + } + + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(lo); + FLAG_Z = lo; + if(BIT_B(word2)) + FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; + else + FLAG_V = (hi != 0) << 7; + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_mull_32_pi(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 src = OPER_AY_PI_32(); + uint64 dst = REG_D[(word2 >> 12) & 7]; + uint64 res; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (sint64)((sint32)src) * (sint64)((sint32)dst); + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = ((sint64)res != (sint32)res)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = (res > 0xffffffff)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint src = OPER_AY_PI_32(); + uint dst = REG_D[(word2 >> 12) & 7]; + uint neg = GET_MSB_32(src ^ dst); + uint src1; + uint src2; + uint dst1; + uint dst2; + uint r1; + uint r2; + uint r3; + uint r4; + uint lo; + uint hi; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + if(GET_MSB_32(src)) + src = (uint)MASK_OUT_ABOVE_32(-(sint)src); + if(GET_MSB_32(dst)) + dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); + } + + src1 = MASK_OUT_ABOVE_16(src); + src2 = src>>16; + dst1 = MASK_OUT_ABOVE_16(dst); + dst2 = dst>>16; + + + r1 = src1 * dst1; + r2 = src1 * dst2; + r3 = src2 * dst1; + r4 = src2 * dst2; + + lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); + hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); + + if(BIT_B(word2) && neg) + { + hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); + lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); + } + + if(BIT_A(word2)) + { + REG_D[word2 & 7] = hi; + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(hi); + FLAG_Z = hi | lo; + FLAG_V = VFLAG_CLEAR; + return; + } + + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(lo); + FLAG_Z = lo; + if(BIT_B(word2)) + FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; + else + FLAG_V = (hi != 0) << 7; + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_mull_32_pd(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 src = OPER_AY_PD_32(); + uint64 dst = REG_D[(word2 >> 12) & 7]; + uint64 res; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (sint64)((sint32)src) * (sint64)((sint32)dst); + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = ((sint64)res != (sint32)res)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = (res > 0xffffffff)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint src = OPER_AY_PD_32(); + uint dst = REG_D[(word2 >> 12) & 7]; + uint neg = GET_MSB_32(src ^ dst); + uint src1; + uint src2; + uint dst1; + uint dst2; + uint r1; + uint r2; + uint r3; + uint r4; + uint lo; + uint hi; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + if(GET_MSB_32(src)) + src = (uint)MASK_OUT_ABOVE_32(-(sint)src); + if(GET_MSB_32(dst)) + dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); + } + + src1 = MASK_OUT_ABOVE_16(src); + src2 = src>>16; + dst1 = MASK_OUT_ABOVE_16(dst); + dst2 = dst>>16; + + + r1 = src1 * dst1; + r2 = src1 * dst2; + r3 = src2 * dst1; + r4 = src2 * dst2; + + lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); + hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); + + if(BIT_B(word2) && neg) + { + hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); + lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); + } + + if(BIT_A(word2)) + { + REG_D[word2 & 7] = hi; + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(hi); + FLAG_Z = hi | lo; + FLAG_V = VFLAG_CLEAR; + return; + } + + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(lo); + FLAG_Z = lo; + if(BIT_B(word2)) + FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; + else + FLAG_V = (hi != 0) << 7; + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_mull_32_di(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 src = OPER_AY_DI_32(); + uint64 dst = REG_D[(word2 >> 12) & 7]; + uint64 res; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (sint64)((sint32)src) * (sint64)((sint32)dst); + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = ((sint64)res != (sint32)res)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = (res > 0xffffffff)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint src = OPER_AY_DI_32(); + uint dst = REG_D[(word2 >> 12) & 7]; + uint neg = GET_MSB_32(src ^ dst); + uint src1; + uint src2; + uint dst1; + uint dst2; + uint r1; + uint r2; + uint r3; + uint r4; + uint lo; + uint hi; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + if(GET_MSB_32(src)) + src = (uint)MASK_OUT_ABOVE_32(-(sint)src); + if(GET_MSB_32(dst)) + dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); + } + + src1 = MASK_OUT_ABOVE_16(src); + src2 = src>>16; + dst1 = MASK_OUT_ABOVE_16(dst); + dst2 = dst>>16; + + + r1 = src1 * dst1; + r2 = src1 * dst2; + r3 = src2 * dst1; + r4 = src2 * dst2; + + lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); + hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); + + if(BIT_B(word2) && neg) + { + hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); + lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); + } + + if(BIT_A(word2)) + { + REG_D[word2 & 7] = hi; + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(hi); + FLAG_Z = hi | lo; + FLAG_V = VFLAG_CLEAR; + return; + } + + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(lo); + FLAG_Z = lo; + if(BIT_B(word2)) + FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; + else + FLAG_V = (hi != 0) << 7; + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_mull_32_ix(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 src = OPER_AY_IX_32(); + uint64 dst = REG_D[(word2 >> 12) & 7]; + uint64 res; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (sint64)((sint32)src) * (sint64)((sint32)dst); + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = ((sint64)res != (sint32)res)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = (res > 0xffffffff)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint src = OPER_AY_IX_32(); + uint dst = REG_D[(word2 >> 12) & 7]; + uint neg = GET_MSB_32(src ^ dst); + uint src1; + uint src2; + uint dst1; + uint dst2; + uint r1; + uint r2; + uint r3; + uint r4; + uint lo; + uint hi; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + if(GET_MSB_32(src)) + src = (uint)MASK_OUT_ABOVE_32(-(sint)src); + if(GET_MSB_32(dst)) + dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); + } + + src1 = MASK_OUT_ABOVE_16(src); + src2 = src>>16; + dst1 = MASK_OUT_ABOVE_16(dst); + dst2 = dst>>16; + + + r1 = src1 * dst1; + r2 = src1 * dst2; + r3 = src2 * dst1; + r4 = src2 * dst2; + + lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); + hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); + + if(BIT_B(word2) && neg) + { + hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); + lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); + } + + if(BIT_A(word2)) + { + REG_D[word2 & 7] = hi; + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(hi); + FLAG_Z = hi | lo; + FLAG_V = VFLAG_CLEAR; + return; + } + + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(lo); + FLAG_Z = lo; + if(BIT_B(word2)) + FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; + else + FLAG_V = (hi != 0) << 7; + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_mull_32_aw(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 src = OPER_AW_32(); + uint64 dst = REG_D[(word2 >> 12) & 7]; + uint64 res; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (sint64)((sint32)src) * (sint64)((sint32)dst); + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = ((sint64)res != (sint32)res)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = (res > 0xffffffff)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint src = OPER_AW_32(); + uint dst = REG_D[(word2 >> 12) & 7]; + uint neg = GET_MSB_32(src ^ dst); + uint src1; + uint src2; + uint dst1; + uint dst2; + uint r1; + uint r2; + uint r3; + uint r4; + uint lo; + uint hi; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + if(GET_MSB_32(src)) + src = (uint)MASK_OUT_ABOVE_32(-(sint)src); + if(GET_MSB_32(dst)) + dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); + } + + src1 = MASK_OUT_ABOVE_16(src); + src2 = src>>16; + dst1 = MASK_OUT_ABOVE_16(dst); + dst2 = dst>>16; + + + r1 = src1 * dst1; + r2 = src1 * dst2; + r3 = src2 * dst1; + r4 = src2 * dst2; + + lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); + hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); + + if(BIT_B(word2) && neg) + { + hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); + lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); + } + + if(BIT_A(word2)) + { + REG_D[word2 & 7] = hi; + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(hi); + FLAG_Z = hi | lo; + FLAG_V = VFLAG_CLEAR; + return; + } + + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(lo); + FLAG_Z = lo; + if(BIT_B(word2)) + FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; + else + FLAG_V = (hi != 0) << 7; + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_mull_32_al(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 src = OPER_AL_32(); + uint64 dst = REG_D[(word2 >> 12) & 7]; + uint64 res; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (sint64)((sint32)src) * (sint64)((sint32)dst); + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = ((sint64)res != (sint32)res)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = (res > 0xffffffff)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint src = OPER_AL_32(); + uint dst = REG_D[(word2 >> 12) & 7]; + uint neg = GET_MSB_32(src ^ dst); + uint src1; + uint src2; + uint dst1; + uint dst2; + uint r1; + uint r2; + uint r3; + uint r4; + uint lo; + uint hi; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + if(GET_MSB_32(src)) + src = (uint)MASK_OUT_ABOVE_32(-(sint)src); + if(GET_MSB_32(dst)) + dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); + } + + src1 = MASK_OUT_ABOVE_16(src); + src2 = src>>16; + dst1 = MASK_OUT_ABOVE_16(dst); + dst2 = dst>>16; + + + r1 = src1 * dst1; + r2 = src1 * dst2; + r3 = src2 * dst1; + r4 = src2 * dst2; + + lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); + hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); + + if(BIT_B(word2) && neg) + { + hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); + lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); + } + + if(BIT_A(word2)) + { + REG_D[word2 & 7] = hi; + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(hi); + FLAG_Z = hi | lo; + FLAG_V = VFLAG_CLEAR; + return; + } + + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(lo); + FLAG_Z = lo; + if(BIT_B(word2)) + FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; + else + FLAG_V = (hi != 0) << 7; + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_mull_32_pcdi(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 src = OPER_PCDI_32(); + uint64 dst = REG_D[(word2 >> 12) & 7]; + uint64 res; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (sint64)((sint32)src) * (sint64)((sint32)dst); + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = ((sint64)res != (sint32)res)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = (res > 0xffffffff)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint src = OPER_PCDI_32(); + uint dst = REG_D[(word2 >> 12) & 7]; + uint neg = GET_MSB_32(src ^ dst); + uint src1; + uint src2; + uint dst1; + uint dst2; + uint r1; + uint r2; + uint r3; + uint r4; + uint lo; + uint hi; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + if(GET_MSB_32(src)) + src = (uint)MASK_OUT_ABOVE_32(-(sint)src); + if(GET_MSB_32(dst)) + dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); + } + + src1 = MASK_OUT_ABOVE_16(src); + src2 = src>>16; + dst1 = MASK_OUT_ABOVE_16(dst); + dst2 = dst>>16; + + + r1 = src1 * dst1; + r2 = src1 * dst2; + r3 = src2 * dst1; + r4 = src2 * dst2; + + lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); + hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); + + if(BIT_B(word2) && neg) + { + hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); + lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); + } + + if(BIT_A(word2)) + { + REG_D[word2 & 7] = hi; + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(hi); + FLAG_Z = hi | lo; + FLAG_V = VFLAG_CLEAR; + return; + } + + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(lo); + FLAG_Z = lo; + if(BIT_B(word2)) + FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; + else + FLAG_V = (hi != 0) << 7; + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_mull_32_pcix(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 src = OPER_PCIX_32(); + uint64 dst = REG_D[(word2 >> 12) & 7]; + uint64 res; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (sint64)((sint32)src) * (sint64)((sint32)dst); + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = ((sint64)res != (sint32)res)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = (res > 0xffffffff)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint src = OPER_PCIX_32(); + uint dst = REG_D[(word2 >> 12) & 7]; + uint neg = GET_MSB_32(src ^ dst); + uint src1; + uint src2; + uint dst1; + uint dst2; + uint r1; + uint r2; + uint r3; + uint r4; + uint lo; + uint hi; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + if(GET_MSB_32(src)) + src = (uint)MASK_OUT_ABOVE_32(-(sint)src); + if(GET_MSB_32(dst)) + dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); + } + + src1 = MASK_OUT_ABOVE_16(src); + src2 = src>>16; + dst1 = MASK_OUT_ABOVE_16(dst); + dst2 = dst>>16; + + + r1 = src1 * dst1; + r2 = src1 * dst2; + r3 = src2 * dst1; + r4 = src2 * dst2; + + lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); + hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); + + if(BIT_B(word2) && neg) + { + hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); + lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); + } + + if(BIT_A(word2)) + { + REG_D[word2 & 7] = hi; + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(hi); + FLAG_Z = hi | lo; + FLAG_V = VFLAG_CLEAR; + return; + } + + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(lo); + FLAG_Z = lo; + if(BIT_B(word2)) + FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; + else + FLAG_V = (hi != 0) << 7; + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_mull_32_i(void) +{ +#if M68K_USE_64_BIT + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint64 src = OPER_I_32(); + uint64 dst = REG_D[(word2 >> 12) & 7]; + uint64 res; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (sint64)((sint32)src) * (sint64)((sint32)dst); + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = ((sint64)res != (sint32)res)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_N = NFLAG_32(res); + FLAG_V = (res > 0xffffffff)<<7; + REG_D[(word2 >> 12) & 7] = FLAG_Z; + return; + } + FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32); + FLAG_N = NFLAG_64(res); + FLAG_V = VFLAG_CLEAR; + REG_D[word2 & 7] = (res >> 32); + REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(); + +#else + + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint word2 = OPER_I_16(); + uint src = OPER_I_32(); + uint dst = REG_D[(word2 >> 12) & 7]; + uint neg = GET_MSB_32(src ^ dst); + uint src1; + uint src2; + uint dst1; + uint dst2; + uint r1; + uint r2; + uint r3; + uint r4; + uint lo; + uint hi; + + FLAG_C = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + if(GET_MSB_32(src)) + src = (uint)MASK_OUT_ABOVE_32(-(sint)src); + if(GET_MSB_32(dst)) + dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst); + } + + src1 = MASK_OUT_ABOVE_16(src); + src2 = src>>16; + dst1 = MASK_OUT_ABOVE_16(dst); + dst2 = dst>>16; + + + r1 = src1 * dst1; + r2 = src1 * dst2; + r3 = src2 * dst1; + r4 = src2 * dst2; + + lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16); + hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16); + + if(BIT_B(word2) && neg) + { + hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0)); + lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo); + } + + if(BIT_A(word2)) + { + REG_D[word2 & 7] = hi; + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(hi); + FLAG_Z = hi | lo; + FLAG_V = VFLAG_CLEAR; + return; + } + + REG_D[(word2 >> 12) & 7] = lo; + FLAG_N = NFLAG_32(lo); + FLAG_Z = lo; + if(BIT_B(word2)) + FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7; + else + FLAG_V = (hi != 0) << 7; + return; + } + m68ki_exception_illegal(); + +#endif +} + + +static void m68k_op_nbcd_8_d(void) +{ + uint* r_dst = &DY; + uint dst = *r_dst; + uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); + + if(res != 0x9a) + { + FLAG_V = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + FLAG_V &= res; /* Undefined V behavior part II */ + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_Z |= res; + FLAG_C = CFLAG_SET; + FLAG_X = XFLAG_SET; + } + else + { + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_X = XFLAG_CLEAR; + } + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_ai(void) +{ + uint ea = EA_AY_AI_8(); + uint dst = m68ki_read_8(ea); + uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); + + if(res != 0x9a) + { + FLAG_V = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + FLAG_V &= res; /* Undefined V behavior part II */ + + m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); + + FLAG_Z |= res; + FLAG_C = CFLAG_SET; + FLAG_X = XFLAG_SET; + } + else + { + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_X = XFLAG_CLEAR; + } + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_pi(void) +{ + uint ea = EA_AY_PI_8(); + uint dst = m68ki_read_8(ea); + uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); + + if(res != 0x9a) + { + FLAG_V = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + FLAG_V &= res; /* Undefined V behavior part II */ + + m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); + + FLAG_Z |= res; + FLAG_C = CFLAG_SET; + FLAG_X = XFLAG_SET; + } + else + { + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_X = XFLAG_CLEAR; + } + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_pi7(void) +{ + uint ea = EA_A7_PI_8(); + uint dst = m68ki_read_8(ea); + uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); + + if(res != 0x9a) + { + FLAG_V = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + FLAG_V &= res; /* Undefined V behavior part II */ + + m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); + + FLAG_Z |= res; + FLAG_C = CFLAG_SET; + FLAG_X = XFLAG_SET; + } + else + { + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_X = XFLAG_CLEAR; + } + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_pd(void) +{ + uint ea = EA_AY_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); + + if(res != 0x9a) + { + FLAG_V = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + FLAG_V &= res; /* Undefined V behavior part II */ + + m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); + + FLAG_Z |= res; + FLAG_C = CFLAG_SET; + FLAG_X = XFLAG_SET; + } + else + { + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_X = XFLAG_CLEAR; + } + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_pd7(void) +{ + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); + + if(res != 0x9a) + { + FLAG_V = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + FLAG_V &= res; /* Undefined V behavior part II */ + + m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); + + FLAG_Z |= res; + FLAG_C = CFLAG_SET; + FLAG_X = XFLAG_SET; + } + else + { + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_X = XFLAG_CLEAR; + } + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_di(void) +{ + uint ea = EA_AY_DI_8(); + uint dst = m68ki_read_8(ea); + uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); + + if(res != 0x9a) + { + FLAG_V = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + FLAG_V &= res; /* Undefined V behavior part II */ + + m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); + + FLAG_Z |= res; + FLAG_C = CFLAG_SET; + FLAG_X = XFLAG_SET; + } + else + { + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_X = XFLAG_CLEAR; + } + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_ix(void) +{ + uint ea = EA_AY_IX_8(); + uint dst = m68ki_read_8(ea); + uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); + + if(res != 0x9a) + { + FLAG_V = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + FLAG_V &= res; /* Undefined V behavior part II */ + + m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); + + FLAG_Z |= res; + FLAG_C = CFLAG_SET; + FLAG_X = XFLAG_SET; + } + else + { + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_X = XFLAG_CLEAR; + } + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_aw(void) +{ + uint ea = EA_AW_8(); + uint dst = m68ki_read_8(ea); + uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); + + if(res != 0x9a) + { + FLAG_V = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + FLAG_V &= res; /* Undefined V behavior part II */ + + m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); + + FLAG_Z |= res; + FLAG_C = CFLAG_SET; + FLAG_X = XFLAG_SET; + } + else + { + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_X = XFLAG_CLEAR; + } + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_al(void) +{ + uint ea = EA_AL_8(); + uint dst = m68ki_read_8(ea); + uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); + + if(res != 0x9a) + { + FLAG_V = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + FLAG_V &= res; /* Undefined V behavior part II */ + + m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); + + FLAG_Z |= res; + FLAG_C = CFLAG_SET; + FLAG_X = XFLAG_SET; + } + else + { + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + FLAG_X = XFLAG_CLEAR; + } + FLAG_N = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_neg_8_d(void) +{ + uint* r_dst = &DY; + uint res = 0 - MASK_OUT_ABOVE_8(*r_dst); + + FLAG_N = NFLAG_8(res); + FLAG_C = FLAG_X = CFLAG_8(res); + FLAG_V = *r_dst & res; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_neg_8_ai(void) +{ + uint ea = EA_AY_AI_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_8(res); + FLAG_C = FLAG_X = CFLAG_8(res); + FLAG_V = src & res; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_neg_8_pi(void) +{ + uint ea = EA_AY_PI_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_8(res); + FLAG_C = FLAG_X = CFLAG_8(res); + FLAG_V = src & res; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_neg_8_pi7(void) +{ + uint ea = EA_A7_PI_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_8(res); + FLAG_C = FLAG_X = CFLAG_8(res); + FLAG_V = src & res; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_neg_8_pd(void) +{ + uint ea = EA_AY_PD_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_8(res); + FLAG_C = FLAG_X = CFLAG_8(res); + FLAG_V = src & res; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_neg_8_pd7(void) +{ + uint ea = EA_A7_PD_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_8(res); + FLAG_C = FLAG_X = CFLAG_8(res); + FLAG_V = src & res; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_neg_8_di(void) +{ + uint ea = EA_AY_DI_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_8(res); + FLAG_C = FLAG_X = CFLAG_8(res); + FLAG_V = src & res; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_neg_8_ix(void) +{ + uint ea = EA_AY_IX_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_8(res); + FLAG_C = FLAG_X = CFLAG_8(res); + FLAG_V = src & res; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_neg_8_aw(void) +{ + uint ea = EA_AW_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_8(res); + FLAG_C = FLAG_X = CFLAG_8(res); + FLAG_V = src & res; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_neg_8_al(void) +{ + uint ea = EA_AL_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_8(res); + FLAG_C = FLAG_X = CFLAG_8(res); + FLAG_V = src & res; + FLAG_Z = MASK_OUT_ABOVE_8(res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_neg_16_d(void) +{ + uint* r_dst = &DY; + uint res = 0 - MASK_OUT_ABOVE_16(*r_dst); + + FLAG_N = NFLAG_16(res); + FLAG_C = FLAG_X = CFLAG_16(res); + FLAG_V = (*r_dst & res)>>8; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_neg_16_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_16(res); + FLAG_C = FLAG_X = CFLAG_16(res); + FLAG_V = (src & res)>>8; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_neg_16_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_16(res); + FLAG_C = FLAG_X = CFLAG_16(res); + FLAG_V = (src & res)>>8; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_neg_16_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_16(res); + FLAG_C = FLAG_X = CFLAG_16(res); + FLAG_V = (src & res)>>8; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_neg_16_di(void) +{ + uint ea = EA_AY_DI_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_16(res); + FLAG_C = FLAG_X = CFLAG_16(res); + FLAG_V = (src & res)>>8; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_neg_16_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_16(res); + FLAG_C = FLAG_X = CFLAG_16(res); + FLAG_V = (src & res)>>8; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_neg_16_aw(void) +{ + uint ea = EA_AW_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_16(res); + FLAG_C = FLAG_X = CFLAG_16(res); + FLAG_V = (src & res)>>8; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_neg_16_al(void) +{ + uint ea = EA_AL_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_16(res); + FLAG_C = FLAG_X = CFLAG_16(res); + FLAG_V = (src & res)>>8; + FLAG_Z = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_neg_32_d(void) +{ + uint* r_dst = &DY; + uint res = 0 - *r_dst; + + FLAG_N = NFLAG_32(res); + FLAG_C = FLAG_X = CFLAG_SUB_32(*r_dst, 0, res); + FLAG_V = (*r_dst & res)>>24; + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_neg_32_ai(void) +{ + uint ea = EA_AY_AI_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_32(res); + FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_neg_32_pi(void) +{ + uint ea = EA_AY_PI_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_32(res); + FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_neg_32_pd(void) +{ + uint ea = EA_AY_PD_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_32(res); + FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_neg_32_di(void) +{ + uint ea = EA_AY_DI_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_32(res); + FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_neg_32_ix(void) +{ + uint ea = EA_AY_IX_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_32(res); + FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_neg_32_aw(void) +{ + uint ea = EA_AW_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_32(res); + FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_neg_32_al(void) +{ + uint ea = EA_AL_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - src; + + FLAG_N = NFLAG_32(res); + FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + FLAG_Z = MASK_OUT_ABOVE_32(res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_negx_8_d(void) +{ + uint* r_dst = &DY; + uint res = 0 - MASK_OUT_ABOVE_8(*r_dst) - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = *r_dst & res; + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; +} + + +static void m68k_op_negx_8_ai(void) +{ + uint ea = EA_AY_AI_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = src & res; + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_negx_8_pi(void) +{ + uint ea = EA_AY_PI_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = src & res; + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_negx_8_pi7(void) +{ + uint ea = EA_A7_PI_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = src & res; + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_negx_8_pd(void) +{ + uint ea = EA_AY_PD_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = src & res; + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_negx_8_pd7(void) +{ + uint ea = EA_A7_PD_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = src & res; + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_negx_8_di(void) +{ + uint ea = EA_AY_DI_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = src & res; + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_negx_8_ix(void) +{ + uint ea = EA_AY_IX_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = src & res; + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_negx_8_aw(void) +{ + uint ea = EA_AW_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = src & res; + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_negx_8_al(void) +{ + uint ea = EA_AL_8(); + uint src = m68ki_read_8(ea); + uint res = 0 - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = src & res; + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_negx_16_d(void) +{ + uint* r_dst = &DY; + uint res = 0 - MASK_OUT_ABOVE_16(*r_dst) - XFLAG_AS_1(); + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = (*r_dst & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + FLAG_Z |= res; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; +} + + +static void m68k_op_negx_16_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + FLAG_Z |= res; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_negx_16_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + FLAG_Z |= res; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_negx_16_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + FLAG_Z |= res; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_negx_16_di(void) +{ + uint ea = EA_AY_DI_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + FLAG_Z |= res; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_negx_16_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + FLAG_Z |= res; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_negx_16_aw(void) +{ + uint ea = EA_AW_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + FLAG_Z |= res; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_negx_16_al(void) +{ + uint ea = EA_AL_16(); + uint src = m68ki_read_16(ea); + uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + FLAG_Z |= res; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_negx_32_d(void) +{ + uint* r_dst = &DY; + uint res = 0 - MASK_OUT_ABOVE_32(*r_dst) - XFLAG_AS_1(); + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(*r_dst, 0, res); + FLAG_V = (*r_dst & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + FLAG_Z |= res; + + *r_dst = res; +} + + +static void m68k_op_negx_32_ai(void) +{ + uint ea = EA_AY_AI_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + FLAG_Z |= res; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_negx_32_pi(void) +{ + uint ea = EA_AY_PI_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + FLAG_Z |= res; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_negx_32_pd(void) +{ + uint ea = EA_AY_PD_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + FLAG_Z |= res; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_negx_32_di(void) +{ + uint ea = EA_AY_DI_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + FLAG_Z |= res; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_negx_32_ix(void) +{ + uint ea = EA_AY_IX_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + FLAG_Z |= res; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_negx_32_aw(void) +{ + uint ea = EA_AW_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + FLAG_Z |= res; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_negx_32_al(void) +{ + uint ea = EA_AL_32(); + uint src = m68ki_read_32(ea); + uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); + FLAG_V = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + FLAG_Z |= res; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_nop(void) +{ + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ +} + + +static void m68k_op_not_8_d(void) +{ + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_8(~*r_dst); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_ai(void) +{ + uint ea = EA_AY_AI_8(); + uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_pi(void) +{ + uint ea = EA_AY_PI_8(); + uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_pi7(void) +{ + uint ea = EA_A7_PI_8(); + uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_pd(void) +{ + uint ea = EA_AY_PD_8(); + uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_pd7(void) +{ + uint ea = EA_A7_PD_8(); + uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_di(void) +{ + uint ea = EA_AY_DI_8(); + uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_ix(void) +{ + uint ea = EA_AY_IX_8(); + uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_aw(void) +{ + uint ea = EA_AW_8(); + uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_al(void) +{ + uint ea = EA_AL_8(); + uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_d(void) +{ + uint* r_dst = &DY; + uint res = MASK_OUT_ABOVE_16(~*r_dst); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_di(void) +{ + uint ea = EA_AY_DI_16(); + uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_aw(void) +{ + uint ea = EA_AW_16(); + uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_al(void) +{ + uint ea = EA_AL_16(); + uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_d(void) +{ + uint* r_dst = &DY; + uint res = *r_dst = MASK_OUT_ABOVE_32(~*r_dst); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_ai(void) +{ + uint ea = EA_AY_AI_32(); + uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_pi(void) +{ + uint ea = EA_AY_PI_32(); + uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_pd(void) +{ + uint ea = EA_AY_PD_32(); + uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_di(void) +{ + uint ea = EA_AY_DI_32(); + uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_ix(void) +{ + uint ea = EA_AY_IX_32(); + uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_aw(void) +{ + uint ea = EA_AW_32(); + uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_al(void) +{ + uint ea = EA_AL_32(); + uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_d(void) +{ + uint res = MASK_OUT_ABOVE_8((DX |= MASK_OUT_ABOVE_8(DY))); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_ai(void) +{ + uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_AI_8())); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_pi(void) +{ + uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_PI_8())); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_pi7(void) +{ + uint res = MASK_OUT_ABOVE_8((DX |= OPER_A7_PI_8())); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_pd(void) +{ + uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_PD_8())); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_pd7(void) +{ + uint res = MASK_OUT_ABOVE_8((DX |= OPER_A7_PD_8())); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_di(void) +{ + uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_DI_8())); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_ix(void) +{ + uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_IX_8())); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_aw(void) +{ + uint res = MASK_OUT_ABOVE_8((DX |= OPER_AW_8())); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_al(void) +{ + uint res = MASK_OUT_ABOVE_8((DX |= OPER_AL_8())); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_pcdi(void) +{ + uint res = MASK_OUT_ABOVE_8((DX |= OPER_PCDI_8())); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_pcix(void) +{ + uint res = MASK_OUT_ABOVE_8((DX |= OPER_PCIX_8())); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_i(void) +{ + uint res = MASK_OUT_ABOVE_8((DX |= OPER_I_8())); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_d(void) +{ + uint res = MASK_OUT_ABOVE_16((DX |= MASK_OUT_ABOVE_16(DY))); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_ai(void) +{ + uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_AI_16())); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_pi(void) +{ + uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_PI_16())); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_pd(void) +{ + uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_PD_16())); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_di(void) +{ + uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_DI_16())); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_ix(void) +{ + uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_IX_16())); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_aw(void) +{ + uint res = MASK_OUT_ABOVE_16((DX |= OPER_AW_16())); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_al(void) +{ + uint res = MASK_OUT_ABOVE_16((DX |= OPER_AL_16())); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_pcdi(void) +{ + uint res = MASK_OUT_ABOVE_16((DX |= OPER_PCDI_16())); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_pcix(void) +{ + uint res = MASK_OUT_ABOVE_16((DX |= OPER_PCIX_16())); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_i(void) +{ + uint res = MASK_OUT_ABOVE_16((DX |= OPER_I_16())); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_d(void) +{ + uint res = DX |= DY; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_ai(void) +{ + uint res = DX |= OPER_AY_AI_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_pi(void) +{ + uint res = DX |= OPER_AY_PI_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_pd(void) +{ + uint res = DX |= OPER_AY_PD_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_di(void) +{ + uint res = DX |= OPER_AY_DI_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_ix(void) +{ + uint res = DX |= OPER_AY_IX_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_aw(void) +{ + uint res = DX |= OPER_AW_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_al(void) +{ + uint res = DX |= OPER_AL_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_pcdi(void) +{ + uint res = DX |= OPER_PCDI_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_pcix(void) +{ + uint res = DX |= OPER_PCIX_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_i(void) +{ + uint res = DX |= OPER_I_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_ai(void) +{ + uint ea = EA_AY_AI_8(); + uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_pi(void) +{ + uint ea = EA_AY_PI_8(); + uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_pi7(void) +{ + uint ea = EA_A7_PI_8(); + uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_pd(void) +{ + uint ea = EA_AY_PD_8(); + uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_pd7(void) +{ + uint ea = EA_A7_PD_8(); + uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_di(void) +{ + uint ea = EA_AY_DI_8(); + uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_ix(void) +{ + uint ea = EA_AY_IX_8(); + uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_aw(void) +{ + uint ea = EA_AW_8(); + uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_al(void) +{ + uint ea = EA_AL_8(); + uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_di(void) +{ + uint ea = EA_AY_DI_16(); + uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_aw(void) +{ + uint ea = EA_AW_16(); + uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_al(void) +{ + uint ea = EA_AL_16(); + uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_ai(void) +{ + uint ea = EA_AY_AI_32(); + uint res = DX | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_pi(void) +{ + uint ea = EA_AY_PI_32(); + uint res = DX | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_pd(void) +{ + uint ea = EA_AY_PD_32(); + uint res = DX | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_di(void) +{ + uint ea = EA_AY_DI_32(); + uint res = DX | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_ix(void) +{ + uint ea = EA_AY_IX_32(); + uint res = DX | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_aw(void) +{ + uint ea = EA_AW_32(); + uint res = DX | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_al(void) +{ + uint ea = EA_AL_32(); + uint res = DX | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_d(void) +{ + uint res = MASK_OUT_ABOVE_8((DY |= OPER_I_8())); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_ai(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_AI_8(); + uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_pi(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_PI_8(); + uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_pi7(void) +{ + uint src = OPER_I_8(); + uint ea = EA_A7_PI_8(); + uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_pd(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_PD_8(); + uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_pd7(void) +{ + uint src = OPER_I_8(); + uint ea = EA_A7_PD_8(); + uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_di(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_DI_8(); + uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_ix(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_IX_8(); + uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_aw(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AW_8(); + uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_al(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AL_8(); + uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); + + m68ki_write_8(ea, res); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_d(void) +{ + uint res = MASK_OUT_ABOVE_16(DY |= OPER_I_16()); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_ai(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_AI_16(); + uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_pi(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_PI_16(); + uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_pd(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_PD_16(); + uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_di(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_DI_16(); + uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_ix(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_IX_16(); + uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_aw(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AW_16(); + uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_al(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AL_16(); + uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_d(void) +{ + uint res = DY |= OPER_I_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_ai(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_AI_32(); + uint res = src | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_pi(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_PI_32(); + uint res = src | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_pd(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_PD_32(); + uint res = src | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_di(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_DI_32(); + uint res = src | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_ix(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_IX_32(); + uint res = src | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_aw(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AW_32(); + uint res = src | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_al(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AL_32(); + uint res = src | m68ki_read_32(ea); + + m68ki_write_32(ea, res); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_toc(void) +{ + m68ki_set_ccr(m68ki_get_ccr() | OPER_I_16()); +} + + +static void m68k_op_ori_16_tos(void) +{ + if(FLAG_S) + { + uint src = OPER_I_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr(m68ki_get_sr() | src); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_pack_16_rr(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + /* Note: DX and DY are reversed in Motorola's docs */ + uint src = DY + OPER_I_16(); + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | ((src >> 4) & 0x00f0) | (src & 0x000f); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_pack_16_mm_ax7(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + /* Note: AX and AY are reversed in Motorola's docs */ + uint ea_src = EA_AY_PD_8(); + uint src = m68ki_read_8(ea_src); + ea_src = EA_AY_PD_8(); + src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16(); + + m68ki_write_8(EA_A7_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f)); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_pack_16_mm_ay7(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + /* Note: AX and AY are reversed in Motorola's docs */ + uint ea_src = EA_A7_PD_8(); + uint src = m68ki_read_8(ea_src); + ea_src = EA_A7_PD_8(); + src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16(); + + m68ki_write_8(EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f)); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_pack_16_mm_axy7(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint ea_src = EA_A7_PD_8(); + uint src = m68ki_read_8(ea_src); + ea_src = EA_A7_PD_8(); + src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16(); + + m68ki_write_8(EA_A7_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f)); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_pack_16_mm(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + /* Note: AX and AY are reversed in Motorola's docs */ + uint ea_src = EA_AY_PD_8(); + uint src = m68ki_read_8(ea_src); + ea_src = EA_AY_PD_8(); + src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16(); + + m68ki_write_8(EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f)); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_pea_32_ai(void) +{ + uint ea = EA_AY_AI_32(); + + m68ki_push_32(ea); +} + + +static void m68k_op_pea_32_di(void) +{ + uint ea = EA_AY_DI_32(); + + m68ki_push_32(ea); +} + + +static void m68k_op_pea_32_ix(void) +{ + uint ea = EA_AY_IX_32(); + + m68ki_push_32(ea); +} + + +static void m68k_op_pea_32_aw(void) +{ + uint ea = EA_AW_32(); + + m68ki_push_32(ea); +} + + +static void m68k_op_pea_32_al(void) +{ + uint ea = EA_AL_32(); + + m68ki_push_32(ea); +} + + +static void m68k_op_pea_32_pcdi(void) +{ + uint ea = EA_PCDI_32(); + + m68ki_push_32(ea); +} + + +static void m68k_op_pea_32_pcix(void) +{ + uint ea = EA_PCIX_32(); + + m68ki_push_32(ea); +} + + +static void m68k_op_pflush_32(void) +{ + if(CPU_TYPE_IS_040_PLUS(CPU_TYPE)) + { + // Nothing to do, unless address translation cache is emulated + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_reset(void) +{ + if(FLAG_S) + { + m68ki_output_reset(); /* auto-disable (see m68kcpu.h) */ + USE_CYCLES(CYC_RESET); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_ror_8_s(void) +{ + uint* r_dst = &DY; + uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint shift = orig_shift & 7; + uint src = MASK_OUT_ABOVE_8(*r_dst); + uint res = ROR_8(src, shift); + + if(orig_shift != 0) + USE_CYCLES(orig_shift<> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_16(*r_dst); + uint res = ROR_16(src, shift); + + if(shift != 0) + USE_CYCLES(shift<> 9) - 1) & 7) + 1; + uint64 src = *r_dst; + uint res = ROR_32(src, shift); + + if(shift != 0) + USE_CYCLES(shift<> ((shift - 1) & 15)) << 8; + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_16(src); + FLAG_Z = src; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ror_32_r(void) +{ + uint* r_dst = &DY; + uint orig_shift = DX & 0x3f; + uint shift = orig_shift & 31; + uint64 src = *r_dst; + uint res = ROR_32(src, shift); + + if(orig_shift != 0) + { + USE_CYCLES(orig_shift<> ((shift - 1) & 31)) << 8; + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_32(src); + FLAG_Z = src; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint src = m68ki_read_16(ea); + uint res = ROR_16(src, 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint src = m68ki_read_16(ea); + uint res = ROR_16(src, 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint src = m68ki_read_16(ea); + uint res = ROR_16(src, 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_di(void) +{ + uint ea = EA_AY_DI_16(); + uint src = m68ki_read_16(ea); + uint res = ROR_16(src, 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint src = m68ki_read_16(ea); + uint res = ROR_16(src, 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_aw(void) +{ + uint ea = EA_AW_16(); + uint src = m68ki_read_16(ea); + uint res = ROR_16(src, 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_al(void) +{ + uint ea = EA_AL_16(); + uint src = m68ki_read_16(ea); + uint res = ROR_16(src, 1); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src << 8; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_rol_8_s(void) +{ + uint* r_dst = &DY; + uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint shift = orig_shift & 7; + uint src = MASK_OUT_ABOVE_8(*r_dst); + uint res = ROL_8(src, shift); + + if(orig_shift != 0) + USE_CYCLES(orig_shift<> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_16(*r_dst); + uint res = ROL_16(src, shift); + + if(shift != 0) + USE_CYCLES(shift<> (8-shift); + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_rol_32_s(void) +{ + uint* r_dst = &DY; + uint shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint64 src = *r_dst; + uint res = ROL_32(src, shift); + + if(shift != 0) + USE_CYCLES(shift<> (24-shift); + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_rol_8_r(void) +{ + uint* r_dst = &DY; + uint orig_shift = DX & 0x3f; + uint shift = orig_shift & 7; + uint src = MASK_OUT_ABOVE_8(*r_dst); + uint res = ROL_8(src, shift); + + if(orig_shift != 0) + { + USE_CYCLES(orig_shift<> 8; + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + FLAG_C = (src & 1)<<8; + FLAG_N = NFLAG_16(src); + FLAG_Z = src; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_16(src); + FLAG_Z = src; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_rol_32_r(void) +{ + uint* r_dst = &DY; + uint orig_shift = DX & 0x3f; + uint shift = orig_shift & 31; + uint64 src = *r_dst; + uint res = ROL_32(src, shift); + + if(orig_shift != 0) + { + USE_CYCLES(orig_shift<> ((32 - shift) & 0x1f)) << 8; + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = CFLAG_CLEAR; + FLAG_N = NFLAG_32(src); + FLAG_Z = src; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_di(void) +{ + uint ea = EA_AY_DI_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_aw(void) +{ + uint ea = EA_AW_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_al(void) +{ + uint ea = EA_AL_16(); + uint src = m68ki_read_16(ea); + uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_C = src >> 7; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_8_s(void) +{ + uint* r_dst = &DY; + uint shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_8(*r_dst); + uint res = ROR_9(src | (XFLAG_AS_1() << 8), shift); + + if(shift != 0) + USE_CYCLES(shift<> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_16(*r_dst); + uint res = ROR_17(src | (XFLAG_AS_1() << 16), shift); + + if(shift != 0) + USE_CYCLES(shift<> 8; + res = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_32_s(void) +{ +#if M68K_USE_64_BIT + + uint* r_dst = &DY; + uint shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint64 src = *r_dst; + uint64 res = src | (((uint64)XFLAG_AS_1()) << 32); + + if(shift != 0) + USE_CYCLES(shift<> 24; + res = MASK_OUT_ABOVE_32(res); + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + +#else + + uint* r_dst = &DY; + uint shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint src = *r_dst; + uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift))); + uint new_x_flag = src & (1 << (shift - 1)); + + if(shift != 0) + USE_CYCLES(shift<> 8; + res = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = FLAG_X; + FLAG_N = NFLAG_16(*r_dst); + FLAG_Z = MASK_OUT_ABOVE_16(*r_dst); + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_32_r(void) +{ +#if M68K_USE_64_BIT + + uint* r_dst = &DY; + uint orig_shift = DX & 0x3f; + + if(orig_shift != 0) + { + uint shift = orig_shift % 33; + uint64 src = *r_dst; + uint64 res = src | (((uint64)XFLAG_AS_1()) << 32); + + res = ROR_33_64(res, shift); + + USE_CYCLES(orig_shift<> 24; + res = MASK_OUT_ABOVE_32(res); + + *r_dst = res; + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = FLAG_X; + FLAG_N = NFLAG_32(*r_dst); + FLAG_Z = *r_dst; + FLAG_V = VFLAG_CLEAR; + +#else + + uint* r_dst = &DY; + uint orig_shift = DX & 0x3f; + uint shift = orig_shift % 33; + uint src = *r_dst; + uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift))); + uint new_x_flag = src & (1 << (shift - 1)); + + if(orig_shift != 0) + USE_CYCLES(orig_shift<> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint src = m68ki_read_16(ea); + uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); + + FLAG_C = FLAG_X = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint src = m68ki_read_16(ea); + uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); + + FLAG_C = FLAG_X = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_di(void) +{ + uint ea = EA_AY_DI_16(); + uint src = m68ki_read_16(ea); + uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); + + FLAG_C = FLAG_X = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint src = m68ki_read_16(ea); + uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); + + FLAG_C = FLAG_X = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_aw(void) +{ + uint ea = EA_AW_16(); + uint src = m68ki_read_16(ea); + uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); + + FLAG_C = FLAG_X = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_al(void) +{ + uint ea = EA_AL_16(); + uint src = m68ki_read_16(ea); + uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); + + FLAG_C = FLAG_X = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_8_s(void) +{ + uint* r_dst = &DY; + uint shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_8(*r_dst); + uint res = ROL_9(src | (XFLAG_AS_1() << 8), shift); + + if(shift != 0) + USE_CYCLES(shift<> 9) - 1) & 7) + 1; + uint src = MASK_OUT_ABOVE_16(*r_dst); + uint res = ROL_17(src | (XFLAG_AS_1() << 16), shift); + + if(shift != 0) + USE_CYCLES(shift<> 8; + res = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_32_s(void) +{ +#if M68K_USE_64_BIT + + uint* r_dst = &DY; + uint shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint64 src = *r_dst; + uint64 res = src | (((uint64)XFLAG_AS_1()) << 32); + + if(shift != 0) + USE_CYCLES(shift<> 24; + res = MASK_OUT_ABOVE_32(res); + + *r_dst = res; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + +#else + + uint* r_dst = &DY; + uint shift = (((REG_IR >> 9) - 1) & 7) + 1; + uint src = *r_dst; + uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1))); + uint new_x_flag = src & (1 << (32 - shift)); + + if(shift != 0) + USE_CYCLES(shift<> 8; + res = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = FLAG_X; + FLAG_N = NFLAG_16(*r_dst); + FLAG_Z = MASK_OUT_ABOVE_16(*r_dst); + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_32_r(void) +{ +#if M68K_USE_64_BIT + + uint* r_dst = &DY; + uint orig_shift = DX & 0x3f; + + if(orig_shift != 0) + { + uint shift = orig_shift % 33; + uint64 src = *r_dst; + uint64 res = src | (((uint64)XFLAG_AS_1()) << 32); + + res = ROL_33_64(res, shift); + + USE_CYCLES(orig_shift<> 24; + res = MASK_OUT_ABOVE_32(res); + + *r_dst = res; + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + return; + } + + FLAG_C = FLAG_X; + FLAG_N = NFLAG_32(*r_dst); + FLAG_Z = *r_dst; + FLAG_V = VFLAG_CLEAR; + +#else + + uint* r_dst = &DY; + uint orig_shift = DX & 0x3f; + uint shift = orig_shift % 33; + uint src = *r_dst; + uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1))); + uint new_x_flag = src & (1 << (32 - shift)); + + if(orig_shift != 0) + USE_CYCLES(orig_shift<> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint src = m68ki_read_16(ea); + uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); + + FLAG_C = FLAG_X = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint src = m68ki_read_16(ea); + uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); + + FLAG_C = FLAG_X = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_di(void) +{ + uint ea = EA_AY_DI_16(); + uint src = m68ki_read_16(ea); + uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); + + FLAG_C = FLAG_X = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint src = m68ki_read_16(ea); + uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); + + FLAG_C = FLAG_X = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_aw(void) +{ + uint ea = EA_AW_16(); + uint src = m68ki_read_16(ea); + uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); + + FLAG_C = FLAG_X = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_al(void) +{ + uint ea = EA_AL_16(); + uint src = m68ki_read_16(ea); + uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); + + FLAG_C = FLAG_X = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16(ea, res); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_rtd_32(void) +{ + if(CPU_TYPE_IS_010_PLUS(CPU_TYPE)) + { + uint new_pc = m68ki_pull_32(); + + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16())); + m68ki_jump(new_pc); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_rte_32(void) +{ + if(FLAG_S) + { + uint new_sr; + uint new_pc; + uint format_word; + + m68ki_rte_callback(); /* auto-disable (see m68kcpu.h) */ + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + + if(CPU_TYPE_IS_000(CPU_TYPE)) + { + new_sr = m68ki_pull_16(); + new_pc = m68ki_pull_32(); + m68ki_jump(new_pc); + m68ki_set_sr(new_sr); + + CPU_INSTR_MODE = INSTRUCTION_YES; + CPU_RUN_MODE = RUN_MODE_NORMAL; + + return; + } + + if(CPU_TYPE_IS_010(CPU_TYPE)) + { + format_word = m68ki_read_16(REG_A[7]+6) >> 12; + if(format_word == 0) + { + new_sr = m68ki_pull_16(); + new_pc = m68ki_pull_32(); + m68ki_fake_pull_16(); /* format word */ + m68ki_jump(new_pc); + m68ki_set_sr(new_sr); + CPU_INSTR_MODE = INSTRUCTION_YES; + CPU_RUN_MODE = RUN_MODE_NORMAL; + return; + } + CPU_INSTR_MODE = INSTRUCTION_YES; + CPU_RUN_MODE = RUN_MODE_NORMAL; + /* Not handling bus fault (9) */ + m68ki_exception_format_error(); + return; + } + + /* Otherwise it's 020 */ +rte_loop: + format_word = m68ki_read_16(REG_A[7]+6) >> 12; + switch(format_word) + { + case 0: /* Normal */ + new_sr = m68ki_pull_16(); + new_pc = m68ki_pull_32(); + m68ki_fake_pull_16(); /* format word */ + m68ki_jump(new_pc); + m68ki_set_sr(new_sr); + CPU_INSTR_MODE = INSTRUCTION_YES; + CPU_RUN_MODE = RUN_MODE_NORMAL; + return; + case 1: /* Throwaway */ + new_sr = m68ki_pull_16(); + m68ki_fake_pull_32(); /* program counter */ + m68ki_fake_pull_16(); /* format word */ + m68ki_set_sr_noint(new_sr); + goto rte_loop; + case 2: /* Trap */ + new_sr = m68ki_pull_16(); + new_pc = m68ki_pull_32(); + m68ki_fake_pull_16(); /* format word */ + m68ki_fake_pull_32(); /* address */ + m68ki_jump(new_pc); + m68ki_set_sr(new_sr); + CPU_INSTR_MODE = INSTRUCTION_YES; + CPU_RUN_MODE = RUN_MODE_NORMAL; + return; + } + /* Not handling long or short bus fault */ + CPU_INSTR_MODE = INSTRUCTION_YES; + CPU_RUN_MODE = RUN_MODE_NORMAL; + m68ki_exception_format_error(); + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_rtm_32(void) +{ + if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE)) + { + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", + m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR, + m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2)))); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_rtr_32(void) +{ + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_set_ccr(m68ki_pull_16()); + m68ki_jump(m68ki_pull_32()); +} + + +static void m68k_op_rts_32(void) +{ + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + m68ki_jump(m68ki_pull_32()); +} + + +static void m68k_op_sbcd_8_rr(void) +{ + uint* r_dst = &DX; + uint src = DY; + uint dst = *r_dst; + uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); + +// FLAG_V = ~res; /* Undefined V behavior */ + FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to assume cleared. */ + + if(res > 9) + res -= 6; + res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); + if(res > 0x99) + { + res += 0xa0; + FLAG_X = FLAG_C = CFLAG_SET; + FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ + } + else + FLAG_N = FLAG_X = FLAG_C = 0; + + res = MASK_OUT_ABOVE_8(res); + +// FLAG_V &= res; /* Undefined V behavior part II */ +// FLAG_N = NFLAG_8(res); /* Undefined N behavior */ + FLAG_Z |= res; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; +} + + +static void m68k_op_sbcd_8_mm_ax7(void) +{ + uint src = OPER_AY_PD_8(); + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); + +// FLAG_V = ~res; /* Undefined V behavior */ + FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ + + if(res > 9) + res -= 6; + res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); + if(res > 0x99) + { + res += 0xa0; + FLAG_X = FLAG_C = CFLAG_SET; + FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ + } + else + FLAG_N = FLAG_X = FLAG_C = 0; + + res = MASK_OUT_ABOVE_8(res); + +// FLAG_V &= res; /* Undefined V behavior part II */ +// FLAG_N = NFLAG_8(res); /* Undefined N behavior */ + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_sbcd_8_mm_ay7(void) +{ + uint src = OPER_A7_PD_8(); + uint ea = EA_AX_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); + +// FLAG_V = ~res; /* Undefined V behavior */ + FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ + + if(res > 9) + res -= 6; + res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); + if(res > 0x99) + { + res += 0xa0; + FLAG_X = FLAG_C = CFLAG_SET; + FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ + } + else + FLAG_N = FLAG_X = FLAG_C = 0; + + res = MASK_OUT_ABOVE_8(res); + +// FLAG_V &= res; /* Undefined V behavior part II */ +// FLAG_N = NFLAG_8(res); /* Undefined N behavior */ + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_sbcd_8_mm_axy7(void) +{ + uint src = OPER_A7_PD_8(); + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); + +// FLAG_V = ~res; /* Undefined V behavior */ + FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ + + if(res > 9) + res -= 6; + res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); + if(res > 0x99) + { + res += 0xa0; + FLAG_X = FLAG_C = CFLAG_SET; + FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ + } + else + FLAG_N = FLAG_X = FLAG_C = 0; + + res = MASK_OUT_ABOVE_8(res); + +// FLAG_V &= res; /* Undefined V behavior part II */ +// FLAG_N = NFLAG_8(res); /* Undefined N behavior */ + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_sbcd_8_mm(void) +{ + uint src = OPER_AY_PD_8(); + uint ea = EA_AX_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); + +// FLAG_V = ~res; /* Undefined V behavior */ + FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ + + if(res > 9) + res -= 6; + res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); + if(res > 0x99) + { + res += 0xa0; + FLAG_X = FLAG_C = CFLAG_SET; + FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ + } + else + FLAG_N = FLAG_X = FLAG_C = 0; + + res = MASK_OUT_ABOVE_8(res); + +// FLAG_V &= res; /* Undefined V behavior part II */ +// FLAG_N = NFLAG_8(res); /* Undefined N behavior */ + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_st_8_d(void) +{ + DY |= 0xff; +} + + +static void m68k_op_st_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), 0xff); +} + + +static void m68k_op_st_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), 0xff); +} + + +static void m68k_op_st_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), 0xff); +} + + +static void m68k_op_st_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), 0xff); +} + + +static void m68k_op_st_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), 0xff); +} + + +static void m68k_op_st_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), 0xff); +} + + +static void m68k_op_st_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), 0xff); +} + + +static void m68k_op_st_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), 0xff); +} + + +static void m68k_op_st_8_al(void) +{ + m68ki_write_8(EA_AL_8(), 0xff); +} + + +static void m68k_op_sf_8_d(void) +{ + DY &= 0xffffff00; +} + + +static void m68k_op_sf_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), 0); +} + + +static void m68k_op_sf_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), 0); +} + + +static void m68k_op_sf_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), 0); +} + + +static void m68k_op_sf_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), 0); +} + + +static void m68k_op_sf_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), 0); +} + + +static void m68k_op_sf_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), 0); +} + + +static void m68k_op_sf_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), 0); +} + + +static void m68k_op_sf_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), 0); +} + + +static void m68k_op_sf_8_al(void) +{ + m68ki_write_8(EA_AL_8(), 0); +} + + +static void m68k_op_shi_8_d(void) +{ + if(COND_HI()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_sls_8_d(void) +{ + if(COND_LS()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_scc_8_d(void) +{ + if(COND_CC()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_scs_8_d(void) +{ + if(COND_CS()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_sne_8_d(void) +{ + if(COND_NE()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_seq_8_d(void) +{ + if(COND_EQ()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_svc_8_d(void) +{ + if(COND_VC()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_svs_8_d(void) +{ + if(COND_VS()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_spl_8_d(void) +{ + if(COND_PL()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_smi_8_d(void) +{ + if(COND_MI()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_sge_8_d(void) +{ + if(COND_GE()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_slt_8_d(void) +{ + if(COND_LT()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_sgt_8_d(void) +{ + if(COND_GT()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_sle_8_d(void) +{ + if(COND_LE()) + { + DY |= 0xff; + USE_CYCLES(CYC_SCC_R_TRUE); + return; + } + DY &= 0xffffff00; +} + + +static void m68k_op_shi_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_HI() ? 0xff : 0); +} + + +static void m68k_op_shi_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_HI() ? 0xff : 0); +} + + +static void m68k_op_shi_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_HI() ? 0xff : 0); +} + + +static void m68k_op_shi_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_HI() ? 0xff : 0); +} + + +static void m68k_op_shi_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_HI() ? 0xff : 0); +} + + +static void m68k_op_shi_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_HI() ? 0xff : 0); +} + + +static void m68k_op_shi_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_HI() ? 0xff : 0); +} + + +static void m68k_op_shi_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_HI() ? 0xff : 0); +} + + +static void m68k_op_shi_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_HI() ? 0xff : 0); +} + + +static void m68k_op_sls_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_LS() ? 0xff : 0); +} + + +static void m68k_op_sls_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_LS() ? 0xff : 0); +} + + +static void m68k_op_sls_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_LS() ? 0xff : 0); +} + + +static void m68k_op_sls_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_LS() ? 0xff : 0); +} + + +static void m68k_op_sls_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_LS() ? 0xff : 0); +} + + +static void m68k_op_sls_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_LS() ? 0xff : 0); +} + + +static void m68k_op_sls_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_LS() ? 0xff : 0); +} + + +static void m68k_op_sls_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_LS() ? 0xff : 0); +} + + +static void m68k_op_sls_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_LS() ? 0xff : 0); +} + + +static void m68k_op_scc_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_CC() ? 0xff : 0); +} + + +static void m68k_op_scc_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_CC() ? 0xff : 0); +} + + +static void m68k_op_scc_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_CC() ? 0xff : 0); +} + + +static void m68k_op_scc_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_CC() ? 0xff : 0); +} + + +static void m68k_op_scc_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_CC() ? 0xff : 0); +} + + +static void m68k_op_scc_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_CC() ? 0xff : 0); +} + + +static void m68k_op_scc_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_CC() ? 0xff : 0); +} + + +static void m68k_op_scc_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_CC() ? 0xff : 0); +} + + +static void m68k_op_scc_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_CC() ? 0xff : 0); +} + + +static void m68k_op_scs_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_CS() ? 0xff : 0); +} + + +static void m68k_op_scs_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_CS() ? 0xff : 0); +} + + +static void m68k_op_scs_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_CS() ? 0xff : 0); +} + + +static void m68k_op_scs_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_CS() ? 0xff : 0); +} + + +static void m68k_op_scs_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_CS() ? 0xff : 0); +} + + +static void m68k_op_scs_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_CS() ? 0xff : 0); +} + + +static void m68k_op_scs_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_CS() ? 0xff : 0); +} + + +static void m68k_op_scs_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_CS() ? 0xff : 0); +} + + +static void m68k_op_scs_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_CS() ? 0xff : 0); +} + + +static void m68k_op_sne_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_NE() ? 0xff : 0); +} + + +static void m68k_op_sne_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_NE() ? 0xff : 0); +} + + +static void m68k_op_sne_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_NE() ? 0xff : 0); +} + + +static void m68k_op_sne_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_NE() ? 0xff : 0); +} + + +static void m68k_op_sne_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_NE() ? 0xff : 0); +} + + +static void m68k_op_sne_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_NE() ? 0xff : 0); +} + + +static void m68k_op_sne_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_NE() ? 0xff : 0); +} + + +static void m68k_op_sne_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_NE() ? 0xff : 0); +} + + +static void m68k_op_sne_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_NE() ? 0xff : 0); +} + + +static void m68k_op_seq_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_EQ() ? 0xff : 0); +} + + +static void m68k_op_seq_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_EQ() ? 0xff : 0); +} + + +static void m68k_op_seq_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_EQ() ? 0xff : 0); +} + + +static void m68k_op_seq_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_EQ() ? 0xff : 0); +} + + +static void m68k_op_seq_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_EQ() ? 0xff : 0); +} + + +static void m68k_op_seq_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_EQ() ? 0xff : 0); +} + + +static void m68k_op_seq_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_EQ() ? 0xff : 0); +} + + +static void m68k_op_seq_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_EQ() ? 0xff : 0); +} + + +static void m68k_op_seq_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_EQ() ? 0xff : 0); +} + + +static void m68k_op_svc_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_VC() ? 0xff : 0); +} + + +static void m68k_op_svc_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_VC() ? 0xff : 0); +} + + +static void m68k_op_svc_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_VC() ? 0xff : 0); +} + + +static void m68k_op_svc_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_VC() ? 0xff : 0); +} + + +static void m68k_op_svc_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_VC() ? 0xff : 0); +} + + +static void m68k_op_svc_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_VC() ? 0xff : 0); +} + + +static void m68k_op_svc_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_VC() ? 0xff : 0); +} + + +static void m68k_op_svc_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_VC() ? 0xff : 0); +} + + +static void m68k_op_svc_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_VC() ? 0xff : 0); +} + + +static void m68k_op_svs_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_VS() ? 0xff : 0); +} + + +static void m68k_op_svs_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_VS() ? 0xff : 0); +} + + +static void m68k_op_svs_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_VS() ? 0xff : 0); +} + + +static void m68k_op_svs_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_VS() ? 0xff : 0); +} + + +static void m68k_op_svs_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_VS() ? 0xff : 0); +} + + +static void m68k_op_svs_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_VS() ? 0xff : 0); +} + + +static void m68k_op_svs_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_VS() ? 0xff : 0); +} + + +static void m68k_op_svs_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_VS() ? 0xff : 0); +} + + +static void m68k_op_svs_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_VS() ? 0xff : 0); +} + + +static void m68k_op_spl_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_PL() ? 0xff : 0); +} + + +static void m68k_op_spl_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_PL() ? 0xff : 0); +} + + +static void m68k_op_spl_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_PL() ? 0xff : 0); +} + + +static void m68k_op_spl_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_PL() ? 0xff : 0); +} + + +static void m68k_op_spl_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_PL() ? 0xff : 0); +} + + +static void m68k_op_spl_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_PL() ? 0xff : 0); +} + + +static void m68k_op_spl_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_PL() ? 0xff : 0); +} + + +static void m68k_op_spl_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_PL() ? 0xff : 0); +} + + +static void m68k_op_spl_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_PL() ? 0xff : 0); +} + + +static void m68k_op_smi_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_MI() ? 0xff : 0); +} + + +static void m68k_op_smi_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_MI() ? 0xff : 0); +} + + +static void m68k_op_smi_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_MI() ? 0xff : 0); +} + + +static void m68k_op_smi_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_MI() ? 0xff : 0); +} + + +static void m68k_op_smi_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_MI() ? 0xff : 0); +} + + +static void m68k_op_smi_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_MI() ? 0xff : 0); +} + + +static void m68k_op_smi_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_MI() ? 0xff : 0); +} + + +static void m68k_op_smi_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_MI() ? 0xff : 0); +} + + +static void m68k_op_smi_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_MI() ? 0xff : 0); +} + + +static void m68k_op_sge_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_GE() ? 0xff : 0); +} + + +static void m68k_op_sge_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_GE() ? 0xff : 0); +} + + +static void m68k_op_sge_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_GE() ? 0xff : 0); +} + + +static void m68k_op_sge_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_GE() ? 0xff : 0); +} + + +static void m68k_op_sge_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_GE() ? 0xff : 0); +} + + +static void m68k_op_sge_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_GE() ? 0xff : 0); +} + + +static void m68k_op_sge_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_GE() ? 0xff : 0); +} + + +static void m68k_op_sge_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_GE() ? 0xff : 0); +} + + +static void m68k_op_sge_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_GE() ? 0xff : 0); +} + + +static void m68k_op_slt_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_LT() ? 0xff : 0); +} + + +static void m68k_op_slt_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_LT() ? 0xff : 0); +} + + +static void m68k_op_slt_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_LT() ? 0xff : 0); +} + + +static void m68k_op_slt_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_LT() ? 0xff : 0); +} + + +static void m68k_op_slt_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_LT() ? 0xff : 0); +} + + +static void m68k_op_slt_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_LT() ? 0xff : 0); +} + + +static void m68k_op_slt_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_LT() ? 0xff : 0); +} + + +static void m68k_op_slt_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_LT() ? 0xff : 0); +} + + +static void m68k_op_slt_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_LT() ? 0xff : 0); +} + + +static void m68k_op_sgt_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_GT() ? 0xff : 0); +} + + +static void m68k_op_sgt_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_GT() ? 0xff : 0); +} + + +static void m68k_op_sgt_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_GT() ? 0xff : 0); +} + + +static void m68k_op_sgt_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_GT() ? 0xff : 0); +} + + +static void m68k_op_sgt_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_GT() ? 0xff : 0); +} + + +static void m68k_op_sgt_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_GT() ? 0xff : 0); +} + + +static void m68k_op_sgt_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_GT() ? 0xff : 0); +} + + +static void m68k_op_sgt_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_GT() ? 0xff : 0); +} + + +static void m68k_op_sgt_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_GT() ? 0xff : 0); +} + + +static void m68k_op_sle_8_ai(void) +{ + m68ki_write_8(EA_AY_AI_8(), COND_LE() ? 0xff : 0); +} + + +static void m68k_op_sle_8_pi(void) +{ + m68ki_write_8(EA_AY_PI_8(), COND_LE() ? 0xff : 0); +} + + +static void m68k_op_sle_8_pi7(void) +{ + m68ki_write_8(EA_A7_PI_8(), COND_LE() ? 0xff : 0); +} + + +static void m68k_op_sle_8_pd(void) +{ + m68ki_write_8(EA_AY_PD_8(), COND_LE() ? 0xff : 0); +} + + +static void m68k_op_sle_8_pd7(void) +{ + m68ki_write_8(EA_A7_PD_8(), COND_LE() ? 0xff : 0); +} + + +static void m68k_op_sle_8_di(void) +{ + m68ki_write_8(EA_AY_DI_8(), COND_LE() ? 0xff : 0); +} + + +static void m68k_op_sle_8_ix(void) +{ + m68ki_write_8(EA_AY_IX_8(), COND_LE() ? 0xff : 0); +} + + +static void m68k_op_sle_8_aw(void) +{ + m68ki_write_8(EA_AW_8(), COND_LE() ? 0xff : 0); +} + + +static void m68k_op_sle_8_al(void) +{ + m68ki_write_8(EA_AL_8(), COND_LE() ? 0xff : 0); +} + + +static void m68k_op_stop(void) +{ + if(FLAG_S) + { + uint new_sr = OPER_I_16(); + m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ + CPU_STOPPED |= STOP_LEVEL_STOP; + m68ki_set_sr(new_sr); + m68ki_remaining_cycles = 0; + return; + } + m68ki_exception_privilege_violation(); +} + + +static void m68k_op_sub_8_er_d(void) +{ + uint* r_dst = &DX; + uint src = MASK_OUT_ABOVE_8(DY); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_8_er_ai(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_AI_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_8_er_pi(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PI_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_8_er_pi7(void) +{ + uint* r_dst = &DX; + uint src = OPER_A7_PI_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_8_er_pd(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PD_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_8_er_pd7(void) +{ + uint* r_dst = &DX; + uint src = OPER_A7_PD_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_8_er_di(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_DI_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_8_er_ix(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_IX_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_8_er_aw(void) +{ + uint* r_dst = &DX; + uint src = OPER_AW_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_8_er_al(void) +{ + uint* r_dst = &DX; + uint src = OPER_AL_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_8_er_pcdi(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCDI_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_8_er_pcix(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCIX_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_8_er_i(void) +{ + uint* r_dst = &DX; + uint src = OPER_I_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_16_er_d(void) +{ + uint* r_dst = &DX; + uint src = MASK_OUT_ABOVE_16(DY); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_16_er_a(void) +{ + uint* r_dst = &DX; + uint src = MASK_OUT_ABOVE_16(AY); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_16_er_ai(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_AI_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_16_er_pi(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PI_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_16_er_pd(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PD_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_16_er_di(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_DI_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_16_er_ix(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_IX_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_16_er_aw(void) +{ + uint* r_dst = &DX; + uint src = OPER_AW_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_16_er_al(void) +{ + uint* r_dst = &DX; + uint src = OPER_AL_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_16_er_pcdi(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCDI_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_16_er_pcix(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCIX_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_16_er_i(void) +{ + uint* r_dst = &DX; + uint src = OPER_I_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_sub_32_er_d(void) +{ + uint* r_dst = &DX; + uint src = DY; + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_sub_32_er_a(void) +{ + uint* r_dst = &DX; + uint src = AY; + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_sub_32_er_ai(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_AI_32(); + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_sub_32_er_pi(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PI_32(); + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_sub_32_er_pd(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_PD_32(); + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_sub_32_er_di(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_DI_32(); + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_sub_32_er_ix(void) +{ + uint* r_dst = &DX; + uint src = OPER_AY_IX_32(); + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_sub_32_er_aw(void) +{ + uint* r_dst = &DX; + uint src = OPER_AW_32(); + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_sub_32_er_al(void) +{ + uint* r_dst = &DX; + uint src = OPER_AL_32(); + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_sub_32_er_pcdi(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCDI_32(); + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_sub_32_er_pcix(void) +{ + uint* r_dst = &DX; + uint src = OPER_PCIX_32(); + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_sub_32_er_i(void) +{ + uint* r_dst = &DX; + uint src = OPER_I_32(); + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_sub_8_re_ai(void) +{ + uint ea = EA_AY_AI_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_sub_8_re_pi(void) +{ + uint ea = EA_AY_PI_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_sub_8_re_pi7(void) +{ + uint ea = EA_A7_PI_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_sub_8_re_pd(void) +{ + uint ea = EA_AY_PD_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_sub_8_re_pd7(void) +{ + uint ea = EA_A7_PD_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_sub_8_re_di(void) +{ + uint ea = EA_AY_DI_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_sub_8_re_ix(void) +{ + uint ea = EA_AY_IX_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_sub_8_re_aw(void) +{ + uint ea = EA_AW_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_sub_8_re_al(void) +{ + uint ea = EA_AL_8(); + uint src = MASK_OUT_ABOVE_8(DX); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_sub_16_re_ai(void) +{ + uint ea = EA_AY_AI_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_sub_16_re_pi(void) +{ + uint ea = EA_AY_PI_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_sub_16_re_pd(void) +{ + uint ea = EA_AY_PD_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_sub_16_re_di(void) +{ + uint ea = EA_AY_DI_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_sub_16_re_ix(void) +{ + uint ea = EA_AY_IX_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_sub_16_re_aw(void) +{ + uint ea = EA_AW_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_sub_16_re_al(void) +{ + uint ea = EA_AL_16(); + uint src = MASK_OUT_ABOVE_16(DX); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_sub_32_re_ai(void) +{ + uint ea = EA_AY_AI_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_sub_32_re_pi(void) +{ + uint ea = EA_AY_PI_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_sub_32_re_pd(void) +{ + uint ea = EA_AY_PD_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_sub_32_re_di(void) +{ + uint ea = EA_AY_DI_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_sub_32_re_ix(void) +{ + uint ea = EA_AY_IX_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_sub_32_re_aw(void) +{ + uint ea = EA_AW_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_sub_32_re_al(void) +{ + uint ea = EA_AL_32(); + uint src = DX; + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_suba_16_d(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(DY)); +} + + +static void m68k_op_suba_16_a(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(AY)); +} + + +static void m68k_op_suba_16_ai(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AY_AI_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_pi(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AY_PI_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_pd(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AY_PD_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_di(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AY_DI_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_ix(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AY_IX_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_aw(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AW_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_al(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_AL_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_pcdi(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_PCDI_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_pcix(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_PCIX_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_i(void) +{ + uint* r_dst = &AX; + uint src = MAKE_INT_16(OPER_I_16()); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_d(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - DY); +} + + +static void m68k_op_suba_32_a(void) +{ + uint* r_dst = &AX; + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - AY); +} + + +static void m68k_op_suba_32_ai(void) +{ + uint* r_dst = &AX; + uint src = OPER_AY_AI_32(); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_pi(void) +{ + uint* r_dst = &AX; + uint src = OPER_AY_PI_32(); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_pd(void) +{ + uint* r_dst = &AX; + uint src = OPER_AY_PD_32(); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_di(void) +{ + uint* r_dst = &AX; + uint src = OPER_AY_DI_32(); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_ix(void) +{ + uint* r_dst = &AX; + uint src = OPER_AY_IX_32(); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_aw(void) +{ + uint* r_dst = &AX; + uint src = OPER_AW_32(); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_al(void) +{ + uint* r_dst = &AX; + uint src = OPER_AL_32(); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_pcdi(void) +{ + uint* r_dst = &AX; + uint src = OPER_PCDI_32(); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_pcix(void) +{ + uint* r_dst = &AX; + uint src = OPER_PCIX_32(); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_i(void) +{ + uint* r_dst = &AX; + uint src = OPER_I_32(); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_subi_8_d(void) +{ + uint* r_dst = &DY; + uint src = OPER_I_8(); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_subi_8_ai(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_AI_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subi_8_pi(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_PI_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subi_8_pi7(void) +{ + uint src = OPER_I_8(); + uint ea = EA_A7_PI_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subi_8_pd(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subi_8_pd7(void) +{ + uint src = OPER_I_8(); + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subi_8_di(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_DI_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subi_8_ix(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AY_IX_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subi_8_aw(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AW_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subi_8_al(void) +{ + uint src = OPER_I_8(); + uint ea = EA_AL_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subi_16_d(void) +{ + uint* r_dst = &DY; + uint src = OPER_I_16(); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_subi_16_ai(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_AI_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subi_16_pi(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_PI_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subi_16_pd(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_PD_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subi_16_di(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_DI_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subi_16_ix(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AY_IX_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subi_16_aw(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AW_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subi_16_al(void) +{ + uint src = OPER_I_16(); + uint ea = EA_AL_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subi_32_d(void) +{ + uint* r_dst = &DY; + uint src = OPER_I_32(); + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_subi_32_ai(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_AI_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subi_32_pi(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_PI_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subi_32_pd(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_PD_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subi_32_di(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_DI_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subi_32_ix(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AY_IX_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subi_32_aw(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AW_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subi_32_al(void) +{ + uint src = OPER_I_32(); + uint ea = EA_AL_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subq_8_d(void) +{ + uint* r_dst = &DY; + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; +} + + +static void m68k_op_subq_8_ai(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_AI_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subq_8_pi(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_PI_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subq_8_pi7(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_A7_PI_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subq_8_pd(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subq_8_pd7(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subq_8_di(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_DI_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subq_8_ix(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_IX_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subq_8_aw(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AW_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subq_8_al(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AL_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src; + + FLAG_N = NFLAG_8(res); + FLAG_Z = MASK_OUT_ABOVE_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8(ea, FLAG_Z); +} + + +static void m68k_op_subq_16_d(void) +{ + uint* r_dst = &DY; + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; +} + + +static void m68k_op_subq_16_a(void) +{ + uint* r_dst = &AY; + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1)); +} + + +static void m68k_op_subq_16_ai(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_AI_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subq_16_pi(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_PI_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subq_16_pd(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_PD_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subq_16_di(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_DI_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subq_16_ix(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_IX_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subq_16_aw(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AW_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subq_16_al(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AL_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src; + + FLAG_N = NFLAG_16(res); + FLAG_Z = MASK_OUT_ABOVE_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16(ea, FLAG_Z); +} + + +static void m68k_op_subq_32_d(void) +{ + uint* r_dst = &DY; + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint dst = *r_dst; + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + *r_dst = FLAG_Z; +} + + +static void m68k_op_subq_32_a(void) +{ + uint* r_dst = &AY; + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1)); +} + + +static void m68k_op_subq_32_ai(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_AI_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subq_32_pi(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_PI_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subq_32_pd(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_PD_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subq_32_di(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_DI_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subq_32_ix(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AY_IX_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subq_32_aw(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AW_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subq_32_al(void) +{ + uint src = (((REG_IR >> 9) - 1) & 7) + 1; + uint ea = EA_AL_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src; + + FLAG_N = NFLAG_32(res); + FLAG_Z = MASK_OUT_ABOVE_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32(ea, FLAG_Z); +} + + +static void m68k_op_subx_8_rr(void) +{ + uint* r_dst = &DX; + uint src = MASK_OUT_ABOVE_8(DY); + uint dst = MASK_OUT_ABOVE_8(*r_dst); + uint res = dst - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; +} + + +static void m68k_op_subx_16_rr(void) +{ + uint* r_dst = &DX; + uint src = MASK_OUT_ABOVE_16(DY); + uint dst = MASK_OUT_ABOVE_16(*r_dst); + uint res = dst - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + res = MASK_OUT_ABOVE_16(res); + FLAG_Z |= res; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; +} + + +static void m68k_op_subx_32_rr(void) +{ + uint* r_dst = &DX; + uint src = DY; + uint dst = *r_dst; + uint res = dst - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + res = MASK_OUT_ABOVE_32(res); + FLAG_Z |= res; + + *r_dst = res; +} + + +static void m68k_op_subx_8_mm_ax7(void) +{ + uint src = OPER_AY_PD_8(); + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_subx_8_mm_ay7(void) +{ + uint src = OPER_A7_PD_8(); + uint ea = EA_AX_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_subx_8_mm_axy7(void) +{ + uint src = OPER_A7_PD_8(); + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_subx_8_mm(void) +{ + uint src = OPER_AY_PD_8(); + uint ea = EA_AX_PD_8(); + uint dst = m68ki_read_8(ea); + uint res = dst - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_8(res); + FLAG_X = FLAG_C = CFLAG_8(res); + FLAG_V = VFLAG_SUB_8(src, dst, res); + + res = MASK_OUT_ABOVE_8(res); + FLAG_Z |= res; + + m68ki_write_8(ea, res); +} + + +static void m68k_op_subx_16_mm(void) +{ + uint src = OPER_AY_PD_16(); + uint ea = EA_AX_PD_16(); + uint dst = m68ki_read_16(ea); + uint res = dst - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_16(res); + FLAG_X = FLAG_C = CFLAG_16(res); + FLAG_V = VFLAG_SUB_16(src, dst, res); + + res = MASK_OUT_ABOVE_16(res); + FLAG_Z |= res; + + m68ki_write_16(ea, res); +} + + +static void m68k_op_subx_32_mm(void) +{ + uint src = OPER_AY_PD_32(); + uint ea = EA_AX_PD_32(); + uint dst = m68ki_read_32(ea); + uint res = dst - src - XFLAG_AS_1(); + + FLAG_N = NFLAG_32(res); + FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); + FLAG_V = VFLAG_SUB_32(src, dst, res); + + res = MASK_OUT_ABOVE_32(res); + FLAG_Z |= res; + + m68ki_write_32(ea, res); +} + + +static void m68k_op_swap_32(void) +{ + uint* r_dst = &DY; + + FLAG_Z = MASK_OUT_ABOVE_32(*r_dst<<16); + *r_dst = (*r_dst>>16) | FLAG_Z; + + FLAG_Z = *r_dst; + FLAG_N = NFLAG_32(*r_dst); + FLAG_C = CFLAG_CLEAR; + FLAG_V = VFLAG_CLEAR; +} + + +static void m68k_op_tas_8_d(void) +{ + uint* r_dst = &DY; + + FLAG_Z = MASK_OUT_ABOVE_8(*r_dst); + FLAG_N = NFLAG_8(*r_dst); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + *r_dst |= 0x80; +} + + +static void m68k_op_tas_8_ai(void) +{ + uint ea = EA_AY_AI_8(); + uint dst = m68ki_read_8(ea); + uint allow_writeback; + + FLAG_Z = dst; + FLAG_N = NFLAG_8(dst); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback + disabled in order to function properly. Some Amiga software may also rely + on this, but only when accessing specific addresses so additional functionality + will be needed. */ + allow_writeback = m68ki_tas_callback(); + + if (allow_writeback==1) m68ki_write_8(ea, dst | 0x80); +} + + +static void m68k_op_tas_8_pi(void) +{ + uint ea = EA_AY_PI_8(); + uint dst = m68ki_read_8(ea); + uint allow_writeback; + + FLAG_Z = dst; + FLAG_N = NFLAG_8(dst); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback + disabled in order to function properly. Some Amiga software may also rely + on this, but only when accessing specific addresses so additional functionality + will be needed. */ + allow_writeback = m68ki_tas_callback(); + + if (allow_writeback==1) m68ki_write_8(ea, dst | 0x80); +} + + +static void m68k_op_tas_8_pi7(void) +{ + uint ea = EA_A7_PI_8(); + uint dst = m68ki_read_8(ea); + uint allow_writeback; + + FLAG_Z = dst; + FLAG_N = NFLAG_8(dst); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback + disabled in order to function properly. Some Amiga software may also rely + on this, but only when accessing specific addresses so additional functionality + will be needed. */ + allow_writeback = m68ki_tas_callback(); + + if (allow_writeback==1) m68ki_write_8(ea, dst | 0x80); +} + + +static void m68k_op_tas_8_pd(void) +{ + uint ea = EA_AY_PD_8(); + uint dst = m68ki_read_8(ea); + uint allow_writeback; + + FLAG_Z = dst; + FLAG_N = NFLAG_8(dst); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback + disabled in order to function properly. Some Amiga software may also rely + on this, but only when accessing specific addresses so additional functionality + will be needed. */ + allow_writeback = m68ki_tas_callback(); + + if (allow_writeback==1) m68ki_write_8(ea, dst | 0x80); +} + + +static void m68k_op_tas_8_pd7(void) +{ + uint ea = EA_A7_PD_8(); + uint dst = m68ki_read_8(ea); + uint allow_writeback; + + FLAG_Z = dst; + FLAG_N = NFLAG_8(dst); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback + disabled in order to function properly. Some Amiga software may also rely + on this, but only when accessing specific addresses so additional functionality + will be needed. */ + allow_writeback = m68ki_tas_callback(); + + if (allow_writeback==1) m68ki_write_8(ea, dst | 0x80); +} + + +static void m68k_op_tas_8_di(void) +{ + uint ea = EA_AY_DI_8(); + uint dst = m68ki_read_8(ea); + uint allow_writeback; + + FLAG_Z = dst; + FLAG_N = NFLAG_8(dst); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback + disabled in order to function properly. Some Amiga software may also rely + on this, but only when accessing specific addresses so additional functionality + will be needed. */ + allow_writeback = m68ki_tas_callback(); + + if (allow_writeback==1) m68ki_write_8(ea, dst | 0x80); +} + + +static void m68k_op_tas_8_ix(void) +{ + uint ea = EA_AY_IX_8(); + uint dst = m68ki_read_8(ea); + uint allow_writeback; + + FLAG_Z = dst; + FLAG_N = NFLAG_8(dst); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback + disabled in order to function properly. Some Amiga software may also rely + on this, but only when accessing specific addresses so additional functionality + will be needed. */ + allow_writeback = m68ki_tas_callback(); + + if (allow_writeback==1) m68ki_write_8(ea, dst | 0x80); +} + + +static void m68k_op_tas_8_aw(void) +{ + uint ea = EA_AW_8(); + uint dst = m68ki_read_8(ea); + uint allow_writeback; + + FLAG_Z = dst; + FLAG_N = NFLAG_8(dst); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback + disabled in order to function properly. Some Amiga software may also rely + on this, but only when accessing specific addresses so additional functionality + will be needed. */ + allow_writeback = m68ki_tas_callback(); + + if (allow_writeback==1) m68ki_write_8(ea, dst | 0x80); +} + + +static void m68k_op_tas_8_al(void) +{ + uint ea = EA_AL_8(); + uint dst = m68ki_read_8(ea); + uint allow_writeback; + + FLAG_Z = dst; + FLAG_N = NFLAG_8(dst); + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + + /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback + disabled in order to function properly. Some Amiga software may also rely + on this, but only when accessing specific addresses so additional functionality + will be needed. */ + allow_writeback = m68ki_tas_callback(); + + if (allow_writeback==1) m68ki_write_8(ea, dst | 0x80); +} + + +static void m68k_op_trap(void) +{ + /* Trap#n stacks exception frame type 0 */ + m68ki_exception_trapN(EXCEPTION_TRAP_BASE + (REG_IR & 0xf)); /* HJB 990403 */ +} + + +static void m68k_op_trapt(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapt_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapt_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapf(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapf_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapf_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_traphi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_HI()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapls(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_LS()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapcc(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_CC()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapcs(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_CS()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapne(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_NE()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapeq(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_EQ()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapvc(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_VC()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapvs(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_VS()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trappl(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_PL()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapmi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_MI()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapge(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_GE()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_traplt(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_LT()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapgt(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_GT()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_traple(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_LE()) + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_traphi_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_HI()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapls_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_LS()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapcc_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_CC()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapcs_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_CS()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapne_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_NE()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapeq_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_EQ()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapvc_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_VC()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapvs_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_VS()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trappl_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_PL()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapmi_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_MI()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapge_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_GE()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_traplt_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_LT()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapgt_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_GT()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_traple_16(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_LE()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 2; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_traphi_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_HI()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapls_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_LS()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapcc_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_CC()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapcs_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_CS()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapne_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_NE()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapeq_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_EQ()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapvc_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_VC()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapvs_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_VS()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trappl_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_PL()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapmi_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_MI()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapge_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_GE()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_traplt_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_LT()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapgt_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_GT()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_traple_32(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + if(COND_LE()) + { + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC += 4; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_trapv(void) +{ + if(COND_VC()) + { + return; + } + m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ +} + + +static void m68k_op_tst_8_d(void) +{ + uint res = MASK_OUT_ABOVE_8(DY); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_ai(void) +{ + uint res = OPER_AY_AI_8(); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_pi(void) +{ + uint res = OPER_AY_PI_8(); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_pi7(void) +{ + uint res = OPER_A7_PI_8(); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_pd(void) +{ + uint res = OPER_AY_PD_8(); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_pd7(void) +{ + uint res = OPER_A7_PD_8(); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_di(void) +{ + uint res = OPER_AY_DI_8(); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_ix(void) +{ + uint res = OPER_AY_IX_8(); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_aw(void) +{ + uint res = OPER_AW_8(); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_al(void) +{ + uint res = OPER_AL_8(); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint res = OPER_PCDI_8(); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_tst_8_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint res = OPER_PCIX_8(); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_tst_8_i(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint res = OPER_I_8(); + + FLAG_N = NFLAG_8(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_tst_16_d(void) +{ + uint res = MASK_OUT_ABOVE_16(DY); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_a(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint res = MAKE_INT_16(AY); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_tst_16_ai(void) +{ + uint res = OPER_AY_AI_16(); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_pi(void) +{ + uint res = OPER_AY_PI_16(); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_pd(void) +{ + uint res = OPER_AY_PD_16(); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_di(void) +{ + uint res = OPER_AY_DI_16(); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_ix(void) +{ + uint res = OPER_AY_IX_16(); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_aw(void) +{ + uint res = OPER_AW_16(); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_al(void) +{ + uint res = OPER_AL_16(); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint res = OPER_PCDI_16(); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_tst_16_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint res = OPER_PCIX_16(); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_tst_16_i(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint res = OPER_I_16(); + + FLAG_N = NFLAG_16(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_tst_32_d(void) +{ + uint res = DY; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_a(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint res = AY; + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_tst_32_ai(void) +{ + uint res = OPER_AY_AI_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_pi(void) +{ + uint res = OPER_AY_PI_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_pd(void) +{ + uint res = OPER_AY_PD_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_di(void) +{ + uint res = OPER_AY_DI_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_ix(void) +{ + uint res = OPER_AY_IX_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_aw(void) +{ + uint res = OPER_AW_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_al(void) +{ + uint res = OPER_AL_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_pcdi(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint res = OPER_PCDI_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_tst_32_pcix(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint res = OPER_PCIX_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_tst_32_i(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint res = OPER_I_32(); + + FLAG_N = NFLAG_32(res); + FLAG_Z = res; + FLAG_V = VFLAG_CLEAR; + FLAG_C = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_unlk_32_a7(void) +{ + REG_A[7] = m68ki_read_32(REG_A[7]); +} + + +static void m68k_op_unlk_32(void) +{ + uint* r_dst = &AY; + + REG_A[7] = *r_dst; + *r_dst = m68ki_pull_32(); +} + + +static void m68k_op_unpk_16_rr(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + /* Note: DX and DY are reversed in Motorola's docs */ + uint src = DY; + uint* r_dst = &DX; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (((((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16()) & 0xffff); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_unpk_16_mm_ax7(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + /* Note: AX and AY are reversed in Motorola's docs */ + uint src = OPER_AY_PD_8(); + uint ea_dst; + + src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(); + ea_dst = EA_A7_PD_8(); + m68ki_write_8(ea_dst, (src >> 8) & 0xff); + ea_dst = EA_A7_PD_8(); + m68ki_write_8(ea_dst, src & 0xff); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_unpk_16_mm_ay7(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + /* Note: AX and AY are reversed in Motorola's docs */ + uint src = OPER_A7_PD_8(); + uint ea_dst; + + src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(); + ea_dst = EA_AX_PD_8(); + m68ki_write_8(ea_dst, (src >> 8) & 0xff); + ea_dst = EA_AX_PD_8(); + m68ki_write_8(ea_dst, src & 0xff); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_unpk_16_mm_axy7(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + uint src = OPER_A7_PD_8(); + uint ea_dst; + + src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(); + ea_dst = EA_A7_PD_8(); + m68ki_write_8(ea_dst, (src >> 8) & 0xff); + ea_dst = EA_A7_PD_8(); + m68ki_write_8(ea_dst, src & 0xff); + return; + } + m68ki_exception_illegal(); +} + + +static void m68k_op_unpk_16_mm(void) +{ + if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) + { + /* Note: AX and AY are reversed in Motorola's docs */ + uint src = OPER_AY_PD_8(); + uint ea_dst; + + src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(); + ea_dst = EA_AX_PD_8(); + m68ki_write_8(ea_dst, (src >> 8) & 0xff); + ea_dst = EA_AX_PD_8(); + m68ki_write_8(ea_dst, src & 0xff); + return; + } + m68ki_exception_illegal(); +} + + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ + + +/* ======================================================================== */ +/* ========================= OPCODE TABLE BUILDER ========================= */ +/* ======================================================================== */ + +#include "m68kops.h" + +#define NUM_CPU_TYPES 4 + +void (*m68ki_instruction_jump_table[0x10000])(void); /* opcode handler jump table */ +unsigned char m68ki_cycles[NUM_CPU_TYPES][0x10000]; /* Cycles used by CPU type */ + +/* This is used to generate the opcode handler jump table */ +typedef struct +{ + void (*opcode_handler)(void); /* handler function */ + unsigned int mask; /* mask on opcode */ + unsigned int match; /* what to match after masking */ + unsigned char cycles[NUM_CPU_TYPES]; /* cycles each cpu type takes */ +} opcode_handler_struct; + + +/* Opcode handler table */ +static const opcode_handler_struct m68k_opcode_handler_table[] = +{ +/* function mask match 000 010 020 040 */ + + + {m68k_op_1010 , 0xf000, 0xa000, { 4, 4, 4, 4}}, + {m68k_op_1111 , 0xf000, 0xf000, { 4, 4, 4, 4}}, + {m68k_op_moveq_32 , 0xf100, 0x7000, { 4, 4, 2, 2}}, + {m68k_op_cpbcc_32 , 0xf180, 0xf080, { 0, 0, 4, 0}}, + {m68k_op_cpgen_32 , 0xf1c0, 0xf000, { 0, 0, 4, 0}}, + {m68k_op_cpscc_32 , 0xf1c0, 0xf040, { 0, 0, 4, 0}}, + {m68k_op_bra_8 , 0xff00, 0x6000, { 10, 10, 10, 10}}, + {m68k_op_bsr_8 , 0xff00, 0x6100, { 18, 18, 7, 7}}, + {m68k_op_bhi_8 , 0xff00, 0x6200, { 10, 10, 6, 6}}, + {m68k_op_bls_8 , 0xff00, 0x6300, { 10, 10, 6, 6}}, + {m68k_op_bcc_8 , 0xff00, 0x6400, { 10, 10, 6, 6}}, + {m68k_op_bcs_8 , 0xff00, 0x6500, { 10, 10, 6, 6}}, + {m68k_op_bne_8 , 0xff00, 0x6600, { 10, 10, 6, 6}}, + {m68k_op_beq_8 , 0xff00, 0x6700, { 10, 10, 6, 6}}, + {m68k_op_bvc_8 , 0xff00, 0x6800, { 10, 10, 6, 6}}, + {m68k_op_bvs_8 , 0xff00, 0x6900, { 10, 10, 6, 6}}, + {m68k_op_bpl_8 , 0xff00, 0x6a00, { 10, 10, 6, 6}}, + {m68k_op_bmi_8 , 0xff00, 0x6b00, { 10, 10, 6, 6}}, + {m68k_op_bge_8 , 0xff00, 0x6c00, { 10, 10, 6, 6}}, + {m68k_op_blt_8 , 0xff00, 0x6d00, { 10, 10, 6, 6}}, + {m68k_op_bgt_8 , 0xff00, 0x6e00, { 10, 10, 6, 6}}, + {m68k_op_ble_8 , 0xff00, 0x6f00, { 10, 10, 6, 6}}, + {m68k_op_040fpu0_32 , 0xff00, 0xf200, { 0, 0, 0, 0}}, + {m68k_op_040fpu1_32 , 0xff00, 0xf300, { 0, 0, 0, 0}}, + {m68k_op_btst_32_r_d , 0xf1f8, 0x0100, { 6, 6, 4, 4}}, + {m68k_op_movep_16_er , 0xf1f8, 0x0108, { 16, 16, 12, 12}}, + {m68k_op_btst_8_r_ai , 0xf1f8, 0x0110, { 8, 8, 8, 8}}, + {m68k_op_btst_8_r_pi , 0xf1f8, 0x0118, { 8, 8, 8, 8}}, + {m68k_op_btst_8_r_pd , 0xf1f8, 0x0120, { 10, 10, 9, 9}}, + {m68k_op_btst_8_r_di , 0xf1f8, 0x0128, { 12, 12, 9, 9}}, + {m68k_op_btst_8_r_ix , 0xf1f8, 0x0130, { 14, 14, 11, 11}}, + {m68k_op_bchg_32_r_d , 0xf1f8, 0x0140, { 8, 8, 4, 4}}, + {m68k_op_movep_32_er , 0xf1f8, 0x0148, { 24, 24, 18, 18}}, + {m68k_op_bchg_8_r_ai , 0xf1f8, 0x0150, { 12, 12, 8, 8}}, + {m68k_op_bchg_8_r_pi , 0xf1f8, 0x0158, { 12, 12, 8, 8}}, + {m68k_op_bchg_8_r_pd , 0xf1f8, 0x0160, { 14, 14, 9, 9}}, + {m68k_op_bchg_8_r_di , 0xf1f8, 0x0168, { 16, 16, 9, 9}}, + {m68k_op_bchg_8_r_ix , 0xf1f8, 0x0170, { 18, 18, 11, 11}}, + {m68k_op_bclr_32_r_d , 0xf1f8, 0x0180, { 10, 10, 4, 4}}, + {m68k_op_movep_16_re , 0xf1f8, 0x0188, { 16, 16, 11, 11}}, + {m68k_op_bclr_8_r_ai , 0xf1f8, 0x0190, { 12, 14, 8, 8}}, + {m68k_op_bclr_8_r_pi , 0xf1f8, 0x0198, { 12, 14, 8, 8}}, + {m68k_op_bclr_8_r_pd , 0xf1f8, 0x01a0, { 14, 16, 9, 9}}, + {m68k_op_bclr_8_r_di , 0xf1f8, 0x01a8, { 16, 18, 9, 9}}, + {m68k_op_bclr_8_r_ix , 0xf1f8, 0x01b0, { 18, 20, 11, 11}}, + {m68k_op_bset_32_r_d , 0xf1f8, 0x01c0, { 8, 8, 4, 4}}, + {m68k_op_movep_32_re , 0xf1f8, 0x01c8, { 24, 24, 17, 17}}, + {m68k_op_bset_8_r_ai , 0xf1f8, 0x01d0, { 12, 12, 8, 8}}, + {m68k_op_bset_8_r_pi , 0xf1f8, 0x01d8, { 12, 12, 8, 8}}, + {m68k_op_bset_8_r_pd , 0xf1f8, 0x01e0, { 14, 14, 9, 9}}, + {m68k_op_bset_8_r_di , 0xf1f8, 0x01e8, { 16, 16, 9, 9}}, + {m68k_op_bset_8_r_ix , 0xf1f8, 0x01f0, { 18, 18, 11, 11}}, + {m68k_op_move_8_d_d , 0xf1f8, 0x1000, { 4, 4, 2, 2}}, + {m68k_op_move_8_d_ai , 0xf1f8, 0x1010, { 8, 8, 6, 6}}, + {m68k_op_move_8_d_pi , 0xf1f8, 0x1018, { 8, 8, 6, 6}}, + {m68k_op_move_8_d_pd , 0xf1f8, 0x1020, { 10, 10, 7, 7}}, + {m68k_op_move_8_d_di , 0xf1f8, 0x1028, { 12, 12, 7, 7}}, + {m68k_op_move_8_d_ix , 0xf1f8, 0x1030, { 14, 14, 9, 9}}, + {m68k_op_move_8_ai_d , 0xf1f8, 0x1080, { 8, 8, 4, 4}}, + {m68k_op_move_8_ai_ai , 0xf1f8, 0x1090, { 12, 12, 8, 8}}, + {m68k_op_move_8_ai_pi , 0xf1f8, 0x1098, { 12, 12, 8, 8}}, + {m68k_op_move_8_ai_pd , 0xf1f8, 0x10a0, { 14, 14, 9, 9}}, + {m68k_op_move_8_ai_di , 0xf1f8, 0x10a8, { 16, 16, 9, 9}}, + {m68k_op_move_8_ai_ix , 0xf1f8, 0x10b0, { 18, 18, 11, 11}}, + {m68k_op_move_8_pi_d , 0xf1f8, 0x10c0, { 8, 8, 4, 4}}, + {m68k_op_move_8_pi_ai , 0xf1f8, 0x10d0, { 12, 12, 8, 8}}, + {m68k_op_move_8_pi_pi , 0xf1f8, 0x10d8, { 12, 12, 8, 8}}, + {m68k_op_move_8_pi_pd , 0xf1f8, 0x10e0, { 14, 14, 9, 9}}, + {m68k_op_move_8_pi_di , 0xf1f8, 0x10e8, { 16, 16, 9, 9}}, + {m68k_op_move_8_pi_ix , 0xf1f8, 0x10f0, { 18, 18, 11, 11}}, + {m68k_op_move_8_pd_d , 0xf1f8, 0x1100, { 8, 8, 5, 5}}, + {m68k_op_move_8_pd_ai , 0xf1f8, 0x1110, { 12, 12, 9, 9}}, + {m68k_op_move_8_pd_pi , 0xf1f8, 0x1118, { 12, 12, 9, 9}}, + {m68k_op_move_8_pd_pd , 0xf1f8, 0x1120, { 14, 14, 10, 10}}, + {m68k_op_move_8_pd_di , 0xf1f8, 0x1128, { 16, 16, 10, 10}}, + {m68k_op_move_8_pd_ix , 0xf1f8, 0x1130, { 18, 18, 12, 12}}, + {m68k_op_move_8_di_d , 0xf1f8, 0x1140, { 12, 12, 5, 5}}, + {m68k_op_move_8_di_ai , 0xf1f8, 0x1150, { 16, 16, 9, 9}}, + {m68k_op_move_8_di_pi , 0xf1f8, 0x1158, { 16, 16, 9, 9}}, + {m68k_op_move_8_di_pd , 0xf1f8, 0x1160, { 18, 18, 10, 10}}, + {m68k_op_move_8_di_di , 0xf1f8, 0x1168, { 20, 20, 10, 10}}, + {m68k_op_move_8_di_ix , 0xf1f8, 0x1170, { 22, 22, 12, 12}}, + {m68k_op_move_8_ix_d , 0xf1f8, 0x1180, { 14, 14, 7, 7}}, + {m68k_op_move_8_ix_ai , 0xf1f8, 0x1190, { 18, 18, 11, 11}}, + {m68k_op_move_8_ix_pi , 0xf1f8, 0x1198, { 18, 18, 11, 11}}, + {m68k_op_move_8_ix_pd , 0xf1f8, 0x11a0, { 20, 20, 12, 12}}, + {m68k_op_move_8_ix_di , 0xf1f8, 0x11a8, { 22, 22, 12, 12}}, + {m68k_op_move_8_ix_ix , 0xf1f8, 0x11b0, { 24, 24, 14, 14}}, + {m68k_op_move_32_d_d , 0xf1f8, 0x2000, { 4, 4, 2, 2}}, + {m68k_op_move_32_d_a , 0xf1f8, 0x2008, { 4, 4, 2, 2}}, + {m68k_op_move_32_d_ai , 0xf1f8, 0x2010, { 12, 12, 6, 6}}, + {m68k_op_move_32_d_pi , 0xf1f8, 0x2018, { 12, 12, 6, 6}}, + {m68k_op_move_32_d_pd , 0xf1f8, 0x2020, { 14, 14, 7, 7}}, + {m68k_op_move_32_d_di , 0xf1f8, 0x2028, { 16, 16, 7, 7}}, + {m68k_op_move_32_d_ix , 0xf1f8, 0x2030, { 18, 18, 9, 9}}, + {m68k_op_movea_32_d , 0xf1f8, 0x2040, { 4, 4, 2, 2}}, + {m68k_op_movea_32_a , 0xf1f8, 0x2048, { 4, 4, 2, 2}}, + {m68k_op_movea_32_ai , 0xf1f8, 0x2050, { 12, 12, 6, 6}}, + {m68k_op_movea_32_pi , 0xf1f8, 0x2058, { 12, 12, 6, 6}}, + {m68k_op_movea_32_pd , 0xf1f8, 0x2060, { 14, 14, 7, 7}}, + {m68k_op_movea_32_di , 0xf1f8, 0x2068, { 16, 16, 7, 7}}, + {m68k_op_movea_32_ix , 0xf1f8, 0x2070, { 18, 18, 9, 9}}, + {m68k_op_move_32_ai_d , 0xf1f8, 0x2080, { 12, 12, 4, 4}}, + {m68k_op_move_32_ai_a , 0xf1f8, 0x2088, { 12, 12, 4, 4}}, + {m68k_op_move_32_ai_ai , 0xf1f8, 0x2090, { 20, 20, 8, 8}}, + {m68k_op_move_32_ai_pi , 0xf1f8, 0x2098, { 20, 20, 8, 8}}, + {m68k_op_move_32_ai_pd , 0xf1f8, 0x20a0, { 22, 22, 9, 9}}, + {m68k_op_move_32_ai_di , 0xf1f8, 0x20a8, { 24, 24, 9, 9}}, + {m68k_op_move_32_ai_ix , 0xf1f8, 0x20b0, { 26, 26, 11, 11}}, + {m68k_op_move_32_pi_d , 0xf1f8, 0x20c0, { 12, 12, 4, 4}}, + {m68k_op_move_32_pi_a , 0xf1f8, 0x20c8, { 12, 12, 4, 4}}, + {m68k_op_move_32_pi_ai , 0xf1f8, 0x20d0, { 20, 20, 8, 8}}, + {m68k_op_move_32_pi_pi , 0xf1f8, 0x20d8, { 20, 20, 8, 8}}, + {m68k_op_move_32_pi_pd , 0xf1f8, 0x20e0, { 22, 22, 9, 9}}, + {m68k_op_move_32_pi_di , 0xf1f8, 0x20e8, { 24, 24, 9, 9}}, + {m68k_op_move_32_pi_ix , 0xf1f8, 0x20f0, { 26, 26, 11, 11}}, + {m68k_op_move_32_pd_d , 0xf1f8, 0x2100, { 12, 14, 5, 5}}, + {m68k_op_move_32_pd_a , 0xf1f8, 0x2108, { 12, 14, 5, 5}}, + {m68k_op_move_32_pd_ai , 0xf1f8, 0x2110, { 20, 22, 9, 9}}, + {m68k_op_move_32_pd_pi , 0xf1f8, 0x2118, { 20, 22, 9, 9}}, + {m68k_op_move_32_pd_pd , 0xf1f8, 0x2120, { 22, 24, 10, 10}}, + {m68k_op_move_32_pd_di , 0xf1f8, 0x2128, { 24, 26, 10, 10}}, + {m68k_op_move_32_pd_ix , 0xf1f8, 0x2130, { 26, 28, 12, 12}}, + {m68k_op_move_32_di_d , 0xf1f8, 0x2140, { 16, 16, 5, 5}}, + {m68k_op_move_32_di_a , 0xf1f8, 0x2148, { 16, 16, 5, 5}}, + {m68k_op_move_32_di_ai , 0xf1f8, 0x2150, { 24, 24, 9, 9}}, + {m68k_op_move_32_di_pi , 0xf1f8, 0x2158, { 24, 24, 9, 9}}, + {m68k_op_move_32_di_pd , 0xf1f8, 0x2160, { 26, 26, 10, 10}}, + {m68k_op_move_32_di_di , 0xf1f8, 0x2168, { 28, 28, 10, 10}}, + {m68k_op_move_32_di_ix , 0xf1f8, 0x2170, { 30, 30, 12, 12}}, + {m68k_op_move_32_ix_d , 0xf1f8, 0x2180, { 18, 18, 7, 7}}, + {m68k_op_move_32_ix_a , 0xf1f8, 0x2188, { 18, 18, 7, 7}}, + {m68k_op_move_32_ix_ai , 0xf1f8, 0x2190, { 26, 26, 11, 11}}, + {m68k_op_move_32_ix_pi , 0xf1f8, 0x2198, { 26, 26, 11, 11}}, + {m68k_op_move_32_ix_pd , 0xf1f8, 0x21a0, { 28, 28, 12, 12}}, + {m68k_op_move_32_ix_di , 0xf1f8, 0x21a8, { 30, 30, 12, 12}}, + {m68k_op_move_32_ix_ix , 0xf1f8, 0x21b0, { 32, 32, 14, 14}}, + {m68k_op_move_16_d_d , 0xf1f8, 0x3000, { 4, 4, 2, 2}}, + {m68k_op_move_16_d_a , 0xf1f8, 0x3008, { 4, 4, 2, 2}}, + {m68k_op_move_16_d_ai , 0xf1f8, 0x3010, { 8, 8, 6, 6}}, + {m68k_op_move_16_d_pi , 0xf1f8, 0x3018, { 8, 8, 6, 6}}, + {m68k_op_move_16_d_pd , 0xf1f8, 0x3020, { 10, 10, 7, 7}}, + {m68k_op_move_16_d_di , 0xf1f8, 0x3028, { 12, 12, 7, 7}}, + {m68k_op_move_16_d_ix , 0xf1f8, 0x3030, { 14, 14, 9, 9}}, + {m68k_op_movea_16_d , 0xf1f8, 0x3040, { 4, 4, 2, 2}}, + {m68k_op_movea_16_a , 0xf1f8, 0x3048, { 4, 4, 2, 2}}, + {m68k_op_movea_16_ai , 0xf1f8, 0x3050, { 8, 8, 6, 6}}, + {m68k_op_movea_16_pi , 0xf1f8, 0x3058, { 8, 8, 6, 6}}, + {m68k_op_movea_16_pd , 0xf1f8, 0x3060, { 10, 10, 7, 7}}, + {m68k_op_movea_16_di , 0xf1f8, 0x3068, { 12, 12, 7, 7}}, + {m68k_op_movea_16_ix , 0xf1f8, 0x3070, { 14, 14, 9, 9}}, + {m68k_op_move_16_ai_d , 0xf1f8, 0x3080, { 8, 8, 4, 4}}, + {m68k_op_move_16_ai_a , 0xf1f8, 0x3088, { 8, 8, 4, 4}}, + {m68k_op_move_16_ai_ai , 0xf1f8, 0x3090, { 12, 12, 8, 8}}, + {m68k_op_move_16_ai_pi , 0xf1f8, 0x3098, { 12, 12, 8, 8}}, + {m68k_op_move_16_ai_pd , 0xf1f8, 0x30a0, { 14, 14, 9, 9}}, + {m68k_op_move_16_ai_di , 0xf1f8, 0x30a8, { 16, 16, 9, 9}}, + {m68k_op_move_16_ai_ix , 0xf1f8, 0x30b0, { 18, 18, 11, 11}}, + {m68k_op_move_16_pi_d , 0xf1f8, 0x30c0, { 8, 8, 4, 4}}, + {m68k_op_move_16_pi_a , 0xf1f8, 0x30c8, { 8, 8, 4, 4}}, + {m68k_op_move_16_pi_ai , 0xf1f8, 0x30d0, { 12, 12, 8, 8}}, + {m68k_op_move_16_pi_pi , 0xf1f8, 0x30d8, { 12, 12, 8, 8}}, + {m68k_op_move_16_pi_pd , 0xf1f8, 0x30e0, { 14, 14, 9, 9}}, + {m68k_op_move_16_pi_di , 0xf1f8, 0x30e8, { 16, 16, 9, 9}}, + {m68k_op_move_16_pi_ix , 0xf1f8, 0x30f0, { 18, 18, 11, 11}}, + {m68k_op_move_16_pd_d , 0xf1f8, 0x3100, { 8, 8, 5, 5}}, + {m68k_op_move_16_pd_a , 0xf1f8, 0x3108, { 8, 8, 5, 5}}, + {m68k_op_move_16_pd_ai , 0xf1f8, 0x3110, { 12, 12, 9, 9}}, + {m68k_op_move_16_pd_pi , 0xf1f8, 0x3118, { 12, 12, 9, 9}}, + {m68k_op_move_16_pd_pd , 0xf1f8, 0x3120, { 14, 14, 10, 10}}, + {m68k_op_move_16_pd_di , 0xf1f8, 0x3128, { 16, 16, 10, 10}}, + {m68k_op_move_16_pd_ix , 0xf1f8, 0x3130, { 18, 18, 12, 12}}, + {m68k_op_move_16_di_d , 0xf1f8, 0x3140, { 12, 12, 5, 5}}, + {m68k_op_move_16_di_a , 0xf1f8, 0x3148, { 12, 12, 5, 5}}, + {m68k_op_move_16_di_ai , 0xf1f8, 0x3150, { 16, 16, 9, 9}}, + {m68k_op_move_16_di_pi , 0xf1f8, 0x3158, { 16, 16, 9, 9}}, + {m68k_op_move_16_di_pd , 0xf1f8, 0x3160, { 18, 18, 10, 10}}, + {m68k_op_move_16_di_di , 0xf1f8, 0x3168, { 20, 20, 10, 10}}, + {m68k_op_move_16_di_ix , 0xf1f8, 0x3170, { 22, 22, 12, 12}}, + {m68k_op_move_16_ix_d , 0xf1f8, 0x3180, { 14, 14, 7, 7}}, + {m68k_op_move_16_ix_a , 0xf1f8, 0x3188, { 14, 14, 7, 7}}, + {m68k_op_move_16_ix_ai , 0xf1f8, 0x3190, { 18, 18, 11, 11}}, + {m68k_op_move_16_ix_pi , 0xf1f8, 0x3198, { 18, 18, 11, 11}}, + {m68k_op_move_16_ix_pd , 0xf1f8, 0x31a0, { 20, 20, 12, 12}}, + {m68k_op_move_16_ix_di , 0xf1f8, 0x31a8, { 22, 22, 12, 12}}, + {m68k_op_move_16_ix_ix , 0xf1f8, 0x31b0, { 24, 24, 14, 14}}, + {m68k_op_chk_32_d , 0xf1f8, 0x4100, { 0, 0, 8, 8}}, + {m68k_op_chk_32_ai , 0xf1f8, 0x4110, { 0, 0, 12, 12}}, + {m68k_op_chk_32_pi , 0xf1f8, 0x4118, { 0, 0, 12, 12}}, + {m68k_op_chk_32_pd , 0xf1f8, 0x4120, { 0, 0, 13, 13}}, + {m68k_op_chk_32_di , 0xf1f8, 0x4128, { 0, 0, 13, 13}}, + {m68k_op_chk_32_ix , 0xf1f8, 0x4130, { 0, 0, 15, 15}}, + {m68k_op_chk_16_d , 0xf1f8, 0x4180, { 10, 8, 8, 8}}, + {m68k_op_chk_16_ai , 0xf1f8, 0x4190, { 14, 12, 12, 12}}, + {m68k_op_chk_16_pi , 0xf1f8, 0x4198, { 14, 12, 12, 12}}, + {m68k_op_chk_16_pd , 0xf1f8, 0x41a0, { 16, 14, 13, 13}}, + {m68k_op_chk_16_di , 0xf1f8, 0x41a8, { 18, 16, 13, 13}}, + {m68k_op_chk_16_ix , 0xf1f8, 0x41b0, { 20, 18, 15, 15}}, + {m68k_op_lea_32_ai , 0xf1f8, 0x41d0, { 4, 4, 6, 6}}, + {m68k_op_lea_32_di , 0xf1f8, 0x41e8, { 8, 8, 7, 7}}, + {m68k_op_lea_32_ix , 0xf1f8, 0x41f0, { 12, 12, 9, 9}}, + {m68k_op_addq_8_d , 0xf1f8, 0x5000, { 4, 4, 2, 2}}, + {m68k_op_addq_8_ai , 0xf1f8, 0x5010, { 12, 12, 8, 8}}, + {m68k_op_addq_8_pi , 0xf1f8, 0x5018, { 12, 12, 8, 8}}, + {m68k_op_addq_8_pd , 0xf1f8, 0x5020, { 14, 14, 9, 9}}, + {m68k_op_addq_8_di , 0xf1f8, 0x5028, { 16, 16, 9, 9}}, + {m68k_op_addq_8_ix , 0xf1f8, 0x5030, { 18, 18, 11, 11}}, + {m68k_op_addq_16_d , 0xf1f8, 0x5040, { 4, 4, 2, 2}}, + {m68k_op_addq_16_a , 0xf1f8, 0x5048, { 4, 4, 2, 2}}, + {m68k_op_addq_16_ai , 0xf1f8, 0x5050, { 12, 12, 8, 8}}, + {m68k_op_addq_16_pi , 0xf1f8, 0x5058, { 12, 12, 8, 8}}, + {m68k_op_addq_16_pd , 0xf1f8, 0x5060, { 14, 14, 9, 9}}, + {m68k_op_addq_16_di , 0xf1f8, 0x5068, { 16, 16, 9, 9}}, + {m68k_op_addq_16_ix , 0xf1f8, 0x5070, { 18, 18, 11, 11}}, + {m68k_op_addq_32_d , 0xf1f8, 0x5080, { 8, 8, 2, 2}}, + {m68k_op_addq_32_a , 0xf1f8, 0x5088, { 8, 8, 2, 2}}, + {m68k_op_addq_32_ai , 0xf1f8, 0x5090, { 20, 20, 8, 8}}, + {m68k_op_addq_32_pi , 0xf1f8, 0x5098, { 20, 20, 8, 8}}, + {m68k_op_addq_32_pd , 0xf1f8, 0x50a0, { 22, 22, 9, 9}}, + {m68k_op_addq_32_di , 0xf1f8, 0x50a8, { 24, 24, 9, 9}}, + {m68k_op_addq_32_ix , 0xf1f8, 0x50b0, { 26, 26, 11, 11}}, + {m68k_op_subq_8_d , 0xf1f8, 0x5100, { 4, 4, 2, 2}}, + {m68k_op_subq_8_ai , 0xf1f8, 0x5110, { 12, 12, 8, 8}}, + {m68k_op_subq_8_pi , 0xf1f8, 0x5118, { 12, 12, 8, 8}}, + {m68k_op_subq_8_pd , 0xf1f8, 0x5120, { 14, 14, 9, 9}}, + {m68k_op_subq_8_di , 0xf1f8, 0x5128, { 16, 16, 9, 9}}, + {m68k_op_subq_8_ix , 0xf1f8, 0x5130, { 18, 18, 11, 11}}, + {m68k_op_subq_16_d , 0xf1f8, 0x5140, { 4, 4, 2, 2}}, + {m68k_op_subq_16_a , 0xf1f8, 0x5148, { 8, 4, 2, 2}}, + {m68k_op_subq_16_ai , 0xf1f8, 0x5150, { 12, 12, 8, 8}}, + {m68k_op_subq_16_pi , 0xf1f8, 0x5158, { 12, 12, 8, 8}}, + {m68k_op_subq_16_pd , 0xf1f8, 0x5160, { 14, 14, 9, 9}}, + {m68k_op_subq_16_di , 0xf1f8, 0x5168, { 16, 16, 9, 9}}, + {m68k_op_subq_16_ix , 0xf1f8, 0x5170, { 18, 18, 11, 11}}, + {m68k_op_subq_32_d , 0xf1f8, 0x5180, { 8, 8, 2, 2}}, + {m68k_op_subq_32_a , 0xf1f8, 0x5188, { 8, 8, 2, 2}}, + {m68k_op_subq_32_ai , 0xf1f8, 0x5190, { 20, 20, 8, 8}}, + {m68k_op_subq_32_pi , 0xf1f8, 0x5198, { 20, 20, 8, 8}}, + {m68k_op_subq_32_pd , 0xf1f8, 0x51a0, { 22, 22, 9, 9}}, + {m68k_op_subq_32_di , 0xf1f8, 0x51a8, { 24, 24, 9, 9}}, + {m68k_op_subq_32_ix , 0xf1f8, 0x51b0, { 26, 26, 11, 11}}, + {m68k_op_or_8_er_d , 0xf1f8, 0x8000, { 4, 4, 2, 2}}, + {m68k_op_or_8_er_ai , 0xf1f8, 0x8010, { 8, 8, 6, 6}}, + {m68k_op_or_8_er_pi , 0xf1f8, 0x8018, { 8, 8, 6, 6}}, + {m68k_op_or_8_er_pd , 0xf1f8, 0x8020, { 10, 10, 7, 7}}, + {m68k_op_or_8_er_di , 0xf1f8, 0x8028, { 12, 12, 7, 7}}, + {m68k_op_or_8_er_ix , 0xf1f8, 0x8030, { 14, 14, 9, 9}}, + {m68k_op_or_16_er_d , 0xf1f8, 0x8040, { 4, 4, 2, 2}}, + {m68k_op_or_16_er_ai , 0xf1f8, 0x8050, { 8, 8, 6, 6}}, + {m68k_op_or_16_er_pi , 0xf1f8, 0x8058, { 8, 8, 6, 6}}, + {m68k_op_or_16_er_pd , 0xf1f8, 0x8060, { 10, 10, 7, 7}}, + {m68k_op_or_16_er_di , 0xf1f8, 0x8068, { 12, 12, 7, 7}}, + {m68k_op_or_16_er_ix , 0xf1f8, 0x8070, { 14, 14, 9, 9}}, + {m68k_op_or_32_er_d , 0xf1f8, 0x8080, { 8, 6, 2, 2}}, + {m68k_op_or_32_er_ai , 0xf1f8, 0x8090, { 14, 14, 6, 6}}, + {m68k_op_or_32_er_pi , 0xf1f8, 0x8098, { 14, 14, 6, 6}}, + {m68k_op_or_32_er_pd , 0xf1f8, 0x80a0, { 16, 16, 7, 7}}, + {m68k_op_or_32_er_di , 0xf1f8, 0x80a8, { 18, 18, 7, 7}}, + {m68k_op_or_32_er_ix , 0xf1f8, 0x80b0, { 20, 20, 9, 9}}, + {m68k_op_divu_16_d , 0xf1f8, 0x80c0, {140, 108, 44, 44}}, + {m68k_op_divu_16_ai , 0xf1f8, 0x80d0, {144, 112, 48, 48}}, + {m68k_op_divu_16_pi , 0xf1f8, 0x80d8, {144, 112, 48, 48}}, + {m68k_op_divu_16_pd , 0xf1f8, 0x80e0, {146, 114, 49, 49}}, + {m68k_op_divu_16_di , 0xf1f8, 0x80e8, {148, 116, 49, 49}}, + {m68k_op_divu_16_ix , 0xf1f8, 0x80f0, {150, 118, 51, 51}}, + {m68k_op_sbcd_8_rr , 0xf1f8, 0x8100, { 6, 6, 4, 4}}, + {m68k_op_sbcd_8_mm , 0xf1f8, 0x8108, { 18, 18, 16, 16}}, + {m68k_op_or_8_re_ai , 0xf1f8, 0x8110, { 12, 12, 8, 8}}, + {m68k_op_or_8_re_pi , 0xf1f8, 0x8118, { 12, 12, 8, 8}}, + {m68k_op_or_8_re_pd , 0xf1f8, 0x8120, { 14, 14, 9, 9}}, + {m68k_op_or_8_re_di , 0xf1f8, 0x8128, { 16, 16, 9, 9}}, + {m68k_op_or_8_re_ix , 0xf1f8, 0x8130, { 18, 18, 11, 11}}, + {m68k_op_pack_16_rr , 0xf1f8, 0x8140, { 0, 0, 6, 6}}, + {m68k_op_pack_16_mm , 0xf1f8, 0x8148, { 0, 0, 13, 13}}, + {m68k_op_or_16_re_ai , 0xf1f8, 0x8150, { 12, 12, 8, 8}}, + {m68k_op_or_16_re_pi , 0xf1f8, 0x8158, { 12, 12, 8, 8}}, + {m68k_op_or_16_re_pd , 0xf1f8, 0x8160, { 14, 14, 9, 9}}, + {m68k_op_or_16_re_di , 0xf1f8, 0x8168, { 16, 16, 9, 9}}, + {m68k_op_or_16_re_ix , 0xf1f8, 0x8170, { 18, 18, 11, 11}}, + {m68k_op_unpk_16_rr , 0xf1f8, 0x8180, { 0, 0, 8, 8}}, + {m68k_op_unpk_16_mm , 0xf1f8, 0x8188, { 0, 0, 13, 13}}, + {m68k_op_or_32_re_ai , 0xf1f8, 0x8190, { 20, 20, 8, 8}}, + {m68k_op_or_32_re_pi , 0xf1f8, 0x8198, { 20, 20, 8, 8}}, + {m68k_op_or_32_re_pd , 0xf1f8, 0x81a0, { 22, 22, 9, 9}}, + {m68k_op_or_32_re_di , 0xf1f8, 0x81a8, { 24, 24, 9, 9}}, + {m68k_op_or_32_re_ix , 0xf1f8, 0x81b0, { 26, 26, 11, 11}}, + {m68k_op_divs_16_d , 0xf1f8, 0x81c0, {158, 122, 56, 56}}, + {m68k_op_divs_16_ai , 0xf1f8, 0x81d0, {162, 126, 60, 60}}, + {m68k_op_divs_16_pi , 0xf1f8, 0x81d8, {162, 126, 60, 60}}, + {m68k_op_divs_16_pd , 0xf1f8, 0x81e0, {164, 128, 61, 61}}, + {m68k_op_divs_16_di , 0xf1f8, 0x81e8, {166, 130, 61, 61}}, + {m68k_op_divs_16_ix , 0xf1f8, 0x81f0, {168, 132, 63, 63}}, + {m68k_op_sub_8_er_d , 0xf1f8, 0x9000, { 4, 4, 2, 2}}, + {m68k_op_sub_8_er_ai , 0xf1f8, 0x9010, { 8, 8, 6, 6}}, + {m68k_op_sub_8_er_pi , 0xf1f8, 0x9018, { 8, 8, 6, 6}}, + {m68k_op_sub_8_er_pd , 0xf1f8, 0x9020, { 10, 10, 7, 7}}, + {m68k_op_sub_8_er_di , 0xf1f8, 0x9028, { 12, 12, 7, 7}}, + {m68k_op_sub_8_er_ix , 0xf1f8, 0x9030, { 14, 14, 9, 9}}, + {m68k_op_sub_16_er_d , 0xf1f8, 0x9040, { 4, 4, 2, 2}}, + {m68k_op_sub_16_er_a , 0xf1f8, 0x9048, { 4, 4, 2, 2}}, + {m68k_op_sub_16_er_ai , 0xf1f8, 0x9050, { 8, 8, 6, 6}}, + {m68k_op_sub_16_er_pi , 0xf1f8, 0x9058, { 8, 8, 6, 6}}, + {m68k_op_sub_16_er_pd , 0xf1f8, 0x9060, { 10, 10, 7, 7}}, + {m68k_op_sub_16_er_di , 0xf1f8, 0x9068, { 12, 12, 7, 7}}, + {m68k_op_sub_16_er_ix , 0xf1f8, 0x9070, { 14, 14, 9, 9}}, + {m68k_op_sub_32_er_d , 0xf1f8, 0x9080, { 8, 6, 2, 2}}, + {m68k_op_sub_32_er_a , 0xf1f8, 0x9088, { 8, 6, 2, 2}}, + {m68k_op_sub_32_er_ai , 0xf1f8, 0x9090, { 14, 14, 6, 6}}, + {m68k_op_sub_32_er_pi , 0xf1f8, 0x9098, { 14, 14, 6, 6}}, + {m68k_op_sub_32_er_pd , 0xf1f8, 0x90a0, { 16, 16, 7, 7}}, + {m68k_op_sub_32_er_di , 0xf1f8, 0x90a8, { 18, 18, 7, 7}}, + {m68k_op_sub_32_er_ix , 0xf1f8, 0x90b0, { 20, 20, 9, 9}}, + {m68k_op_suba_16_d , 0xf1f8, 0x90c0, { 8, 8, 2, 2}}, + {m68k_op_suba_16_a , 0xf1f8, 0x90c8, { 8, 8, 2, 2}}, + {m68k_op_suba_16_ai , 0xf1f8, 0x90d0, { 12, 12, 6, 6}}, + {m68k_op_suba_16_pi , 0xf1f8, 0x90d8, { 12, 12, 6, 6}}, + {m68k_op_suba_16_pd , 0xf1f8, 0x90e0, { 14, 14, 7, 7}}, + {m68k_op_suba_16_di , 0xf1f8, 0x90e8, { 16, 16, 7, 7}}, + {m68k_op_suba_16_ix , 0xf1f8, 0x90f0, { 18, 18, 9, 9}}, + {m68k_op_subx_8_rr , 0xf1f8, 0x9100, { 4, 4, 2, 2}}, + {m68k_op_subx_8_mm , 0xf1f8, 0x9108, { 18, 18, 12, 12}}, + {m68k_op_sub_8_re_ai , 0xf1f8, 0x9110, { 12, 12, 8, 8}}, + {m68k_op_sub_8_re_pi , 0xf1f8, 0x9118, { 12, 12, 8, 8}}, + {m68k_op_sub_8_re_pd , 0xf1f8, 0x9120, { 14, 14, 9, 9}}, + {m68k_op_sub_8_re_di , 0xf1f8, 0x9128, { 16, 16, 9, 9}}, + {m68k_op_sub_8_re_ix , 0xf1f8, 0x9130, { 18, 18, 11, 11}}, + {m68k_op_subx_16_rr , 0xf1f8, 0x9140, { 4, 4, 2, 2}}, + {m68k_op_subx_16_mm , 0xf1f8, 0x9148, { 18, 18, 12, 12}}, + {m68k_op_sub_16_re_ai , 0xf1f8, 0x9150, { 12, 12, 8, 8}}, + {m68k_op_sub_16_re_pi , 0xf1f8, 0x9158, { 12, 12, 8, 8}}, + {m68k_op_sub_16_re_pd , 0xf1f8, 0x9160, { 14, 14, 9, 9}}, + {m68k_op_sub_16_re_di , 0xf1f8, 0x9168, { 16, 16, 9, 9}}, + {m68k_op_sub_16_re_ix , 0xf1f8, 0x9170, { 18, 18, 11, 11}}, + {m68k_op_subx_32_rr , 0xf1f8, 0x9180, { 8, 6, 2, 2}}, + {m68k_op_subx_32_mm , 0xf1f8, 0x9188, { 30, 30, 12, 12}}, + {m68k_op_sub_32_re_ai , 0xf1f8, 0x9190, { 20, 20, 8, 8}}, + {m68k_op_sub_32_re_pi , 0xf1f8, 0x9198, { 20, 20, 8, 8}}, + {m68k_op_sub_32_re_pd , 0xf1f8, 0x91a0, { 22, 22, 9, 9}}, + {m68k_op_sub_32_re_di , 0xf1f8, 0x91a8, { 24, 24, 9, 9}}, + {m68k_op_sub_32_re_ix , 0xf1f8, 0x91b0, { 26, 26, 11, 11}}, + {m68k_op_suba_32_d , 0xf1f8, 0x91c0, { 8, 6, 2, 2}}, + {m68k_op_suba_32_a , 0xf1f8, 0x91c8, { 8, 6, 2, 2}}, + {m68k_op_suba_32_ai , 0xf1f8, 0x91d0, { 14, 14, 6, 6}}, + {m68k_op_suba_32_pi , 0xf1f8, 0x91d8, { 14, 14, 6, 6}}, + {m68k_op_suba_32_pd , 0xf1f8, 0x91e0, { 16, 16, 7, 7}}, + {m68k_op_suba_32_di , 0xf1f8, 0x91e8, { 18, 18, 7, 7}}, + {m68k_op_suba_32_ix , 0xf1f8, 0x91f0, { 20, 20, 9, 9}}, + {m68k_op_cmp_8_d , 0xf1f8, 0xb000, { 4, 4, 2, 2}}, + {m68k_op_cmp_8_ai , 0xf1f8, 0xb010, { 8, 8, 6, 6}}, + {m68k_op_cmp_8_pi , 0xf1f8, 0xb018, { 8, 8, 6, 6}}, + {m68k_op_cmp_8_pd , 0xf1f8, 0xb020, { 10, 10, 7, 7}}, + {m68k_op_cmp_8_di , 0xf1f8, 0xb028, { 12, 12, 7, 7}}, + {m68k_op_cmp_8_ix , 0xf1f8, 0xb030, { 14, 14, 9, 9}}, + {m68k_op_cmp_16_d , 0xf1f8, 0xb040, { 4, 4, 2, 2}}, + {m68k_op_cmp_16_a , 0xf1f8, 0xb048, { 4, 4, 2, 2}}, + {m68k_op_cmp_16_ai , 0xf1f8, 0xb050, { 8, 8, 6, 6}}, + {m68k_op_cmp_16_pi , 0xf1f8, 0xb058, { 8, 8, 6, 6}}, + {m68k_op_cmp_16_pd , 0xf1f8, 0xb060, { 10, 10, 7, 7}}, + {m68k_op_cmp_16_di , 0xf1f8, 0xb068, { 12, 12, 7, 7}}, + {m68k_op_cmp_16_ix , 0xf1f8, 0xb070, { 14, 14, 9, 9}}, + {m68k_op_cmp_32_d , 0xf1f8, 0xb080, { 6, 6, 2, 2}}, + {m68k_op_cmp_32_a , 0xf1f8, 0xb088, { 6, 6, 2, 2}}, + {m68k_op_cmp_32_ai , 0xf1f8, 0xb090, { 14, 14, 6, 6}}, + {m68k_op_cmp_32_pi , 0xf1f8, 0xb098, { 14, 14, 6, 6}}, + {m68k_op_cmp_32_pd , 0xf1f8, 0xb0a0, { 16, 16, 7, 7}}, + {m68k_op_cmp_32_di , 0xf1f8, 0xb0a8, { 18, 18, 7, 7}}, + {m68k_op_cmp_32_ix , 0xf1f8, 0xb0b0, { 20, 20, 9, 9}}, + {m68k_op_cmpa_16_d , 0xf1f8, 0xb0c0, { 6, 6, 4, 4}}, + {m68k_op_cmpa_16_a , 0xf1f8, 0xb0c8, { 6, 6, 4, 4}}, + {m68k_op_cmpa_16_ai , 0xf1f8, 0xb0d0, { 10, 10, 8, 8}}, + {m68k_op_cmpa_16_pi , 0xf1f8, 0xb0d8, { 10, 10, 8, 8}}, + {m68k_op_cmpa_16_pd , 0xf1f8, 0xb0e0, { 12, 12, 9, 9}}, + {m68k_op_cmpa_16_di , 0xf1f8, 0xb0e8, { 14, 14, 9, 9}}, + {m68k_op_cmpa_16_ix , 0xf1f8, 0xb0f0, { 16, 16, 11, 11}}, + {m68k_op_eor_8_d , 0xf1f8, 0xb100, { 4, 4, 2, 2}}, + {m68k_op_cmpm_8 , 0xf1f8, 0xb108, { 12, 12, 9, 9}}, + {m68k_op_eor_8_ai , 0xf1f8, 0xb110, { 12, 12, 8, 8}}, + {m68k_op_eor_8_pi , 0xf1f8, 0xb118, { 12, 12, 8, 8}}, + {m68k_op_eor_8_pd , 0xf1f8, 0xb120, { 14, 14, 9, 9}}, + {m68k_op_eor_8_di , 0xf1f8, 0xb128, { 16, 16, 9, 9}}, + {m68k_op_eor_8_ix , 0xf1f8, 0xb130, { 18, 18, 11, 11}}, + {m68k_op_eor_16_d , 0xf1f8, 0xb140, { 4, 4, 2, 2}}, + {m68k_op_cmpm_16 , 0xf1f8, 0xb148, { 12, 12, 9, 9}}, + {m68k_op_eor_16_ai , 0xf1f8, 0xb150, { 12, 12, 8, 8}}, + {m68k_op_eor_16_pi , 0xf1f8, 0xb158, { 12, 12, 8, 8}}, + {m68k_op_eor_16_pd , 0xf1f8, 0xb160, { 14, 14, 9, 9}}, + {m68k_op_eor_16_di , 0xf1f8, 0xb168, { 16, 16, 9, 9}}, + {m68k_op_eor_16_ix , 0xf1f8, 0xb170, { 18, 18, 11, 11}}, + {m68k_op_eor_32_d , 0xf1f8, 0xb180, { 8, 6, 2, 2}}, + {m68k_op_cmpm_32 , 0xf1f8, 0xb188, { 20, 20, 9, 9}}, + {m68k_op_eor_32_ai , 0xf1f8, 0xb190, { 20, 20, 8, 8}}, + {m68k_op_eor_32_pi , 0xf1f8, 0xb198, { 20, 20, 8, 8}}, + {m68k_op_eor_32_pd , 0xf1f8, 0xb1a0, { 22, 22, 9, 9}}, + {m68k_op_eor_32_di , 0xf1f8, 0xb1a8, { 24, 24, 9, 9}}, + {m68k_op_eor_32_ix , 0xf1f8, 0xb1b0, { 26, 26, 11, 11}}, + {m68k_op_cmpa_32_d , 0xf1f8, 0xb1c0, { 6, 6, 4, 4}}, + {m68k_op_cmpa_32_a , 0xf1f8, 0xb1c8, { 6, 6, 4, 4}}, + {m68k_op_cmpa_32_ai , 0xf1f8, 0xb1d0, { 14, 14, 8, 8}}, + {m68k_op_cmpa_32_pi , 0xf1f8, 0xb1d8, { 14, 14, 8, 8}}, + {m68k_op_cmpa_32_pd , 0xf1f8, 0xb1e0, { 16, 16, 9, 9}}, + {m68k_op_cmpa_32_di , 0xf1f8, 0xb1e8, { 18, 18, 9, 9}}, + {m68k_op_cmpa_32_ix , 0xf1f8, 0xb1f0, { 20, 20, 11, 11}}, + {m68k_op_and_8_er_d , 0xf1f8, 0xc000, { 4, 4, 2, 2}}, + {m68k_op_and_8_er_ai , 0xf1f8, 0xc010, { 8, 8, 6, 6}}, + {m68k_op_and_8_er_pi , 0xf1f8, 0xc018, { 8, 8, 6, 6}}, + {m68k_op_and_8_er_pd , 0xf1f8, 0xc020, { 10, 10, 7, 7}}, + {m68k_op_and_8_er_di , 0xf1f8, 0xc028, { 12, 12, 7, 7}}, + {m68k_op_and_8_er_ix , 0xf1f8, 0xc030, { 14, 14, 9, 9}}, + {m68k_op_and_16_er_d , 0xf1f8, 0xc040, { 4, 4, 2, 2}}, + {m68k_op_and_16_er_ai , 0xf1f8, 0xc050, { 8, 8, 6, 6}}, + {m68k_op_and_16_er_pi , 0xf1f8, 0xc058, { 8, 8, 6, 6}}, + {m68k_op_and_16_er_pd , 0xf1f8, 0xc060, { 10, 10, 7, 7}}, + {m68k_op_and_16_er_di , 0xf1f8, 0xc068, { 12, 12, 7, 7}}, + {m68k_op_and_16_er_ix , 0xf1f8, 0xc070, { 14, 14, 9, 9}}, + {m68k_op_and_32_er_d , 0xf1f8, 0xc080, { 8, 6, 2, 2}}, + {m68k_op_and_32_er_ai , 0xf1f8, 0xc090, { 14, 14, 6, 6}}, + {m68k_op_and_32_er_pi , 0xf1f8, 0xc098, { 14, 14, 6, 6}}, + {m68k_op_and_32_er_pd , 0xf1f8, 0xc0a0, { 16, 16, 7, 7}}, + {m68k_op_and_32_er_di , 0xf1f8, 0xc0a8, { 18, 18, 7, 7}}, + {m68k_op_and_32_er_ix , 0xf1f8, 0xc0b0, { 20, 20, 9, 9}}, + {m68k_op_mulu_16_d , 0xf1f8, 0xc0c0, { 54, 30, 27, 27}}, + {m68k_op_mulu_16_ai , 0xf1f8, 0xc0d0, { 58, 34, 31, 31}}, + {m68k_op_mulu_16_pi , 0xf1f8, 0xc0d8, { 58, 34, 31, 31}}, + {m68k_op_mulu_16_pd , 0xf1f8, 0xc0e0, { 60, 36, 32, 32}}, + {m68k_op_mulu_16_di , 0xf1f8, 0xc0e8, { 62, 38, 32, 32}}, + {m68k_op_mulu_16_ix , 0xf1f8, 0xc0f0, { 64, 40, 34, 34}}, + {m68k_op_abcd_8_rr , 0xf1f8, 0xc100, { 6, 6, 4, 4}}, + {m68k_op_abcd_8_mm , 0xf1f8, 0xc108, { 18, 18, 16, 16}}, + {m68k_op_and_8_re_ai , 0xf1f8, 0xc110, { 12, 12, 8, 8}}, + {m68k_op_and_8_re_pi , 0xf1f8, 0xc118, { 12, 12, 8, 8}}, + {m68k_op_and_8_re_pd , 0xf1f8, 0xc120, { 14, 14, 9, 9}}, + {m68k_op_and_8_re_di , 0xf1f8, 0xc128, { 16, 16, 9, 9}}, + {m68k_op_and_8_re_ix , 0xf1f8, 0xc130, { 18, 18, 11, 11}}, + {m68k_op_exg_32_dd , 0xf1f8, 0xc140, { 6, 6, 2, 2}}, + {m68k_op_exg_32_aa , 0xf1f8, 0xc148, { 6, 6, 2, 2}}, + {m68k_op_and_16_re_ai , 0xf1f8, 0xc150, { 12, 12, 8, 8}}, + {m68k_op_and_16_re_pi , 0xf1f8, 0xc158, { 12, 12, 8, 8}}, + {m68k_op_and_16_re_pd , 0xf1f8, 0xc160, { 14, 14, 9, 9}}, + {m68k_op_and_16_re_di , 0xf1f8, 0xc168, { 16, 16, 9, 9}}, + {m68k_op_and_16_re_ix , 0xf1f8, 0xc170, { 18, 18, 11, 11}}, + {m68k_op_exg_32_da , 0xf1f8, 0xc188, { 6, 6, 2, 2}}, + {m68k_op_and_32_re_ai , 0xf1f8, 0xc190, { 20, 20, 8, 8}}, + {m68k_op_and_32_re_pi , 0xf1f8, 0xc198, { 20, 20, 8, 8}}, + {m68k_op_and_32_re_pd , 0xf1f8, 0xc1a0, { 22, 22, 9, 9}}, + {m68k_op_and_32_re_di , 0xf1f8, 0xc1a8, { 24, 24, 9, 9}}, + {m68k_op_and_32_re_ix , 0xf1f8, 0xc1b0, { 26, 26, 11, 11}}, + {m68k_op_muls_16_d , 0xf1f8, 0xc1c0, { 54, 32, 27, 27}}, + {m68k_op_muls_16_ai , 0xf1f8, 0xc1d0, { 58, 36, 31, 31}}, + {m68k_op_muls_16_pi , 0xf1f8, 0xc1d8, { 58, 36, 31, 31}}, + {m68k_op_muls_16_pd , 0xf1f8, 0xc1e0, { 60, 38, 32, 32}}, + {m68k_op_muls_16_di , 0xf1f8, 0xc1e8, { 62, 40, 32, 32}}, + {m68k_op_muls_16_ix , 0xf1f8, 0xc1f0, { 64, 42, 34, 34}}, + {m68k_op_add_8_er_d , 0xf1f8, 0xd000, { 4, 4, 2, 2}}, + {m68k_op_add_8_er_ai , 0xf1f8, 0xd010, { 8, 8, 6, 6}}, + {m68k_op_add_8_er_pi , 0xf1f8, 0xd018, { 8, 8, 6, 6}}, + {m68k_op_add_8_er_pd , 0xf1f8, 0xd020, { 10, 10, 7, 7}}, + {m68k_op_add_8_er_di , 0xf1f8, 0xd028, { 12, 12, 7, 7}}, + {m68k_op_add_8_er_ix , 0xf1f8, 0xd030, { 14, 14, 9, 9}}, + {m68k_op_add_16_er_d , 0xf1f8, 0xd040, { 4, 4, 2, 2}}, + {m68k_op_add_16_er_a , 0xf1f8, 0xd048, { 4, 4, 2, 2}}, + {m68k_op_add_16_er_ai , 0xf1f8, 0xd050, { 8, 8, 6, 6}}, + {m68k_op_add_16_er_pi , 0xf1f8, 0xd058, { 8, 8, 6, 6}}, + {m68k_op_add_16_er_pd , 0xf1f8, 0xd060, { 10, 10, 7, 7}}, + {m68k_op_add_16_er_di , 0xf1f8, 0xd068, { 12, 12, 7, 7}}, + {m68k_op_add_16_er_ix , 0xf1f8, 0xd070, { 14, 14, 9, 9}}, + {m68k_op_add_32_er_d , 0xf1f8, 0xd080, { 8, 6, 2, 2}}, + {m68k_op_add_32_er_a , 0xf1f8, 0xd088, { 8, 6, 2, 2}}, + {m68k_op_add_32_er_ai , 0xf1f8, 0xd090, { 14, 14, 6, 6}}, + {m68k_op_add_32_er_pi , 0xf1f8, 0xd098, { 14, 14, 6, 6}}, + {m68k_op_add_32_er_pd , 0xf1f8, 0xd0a0, { 16, 16, 7, 7}}, + {m68k_op_add_32_er_di , 0xf1f8, 0xd0a8, { 18, 18, 7, 7}}, + {m68k_op_add_32_er_ix , 0xf1f8, 0xd0b0, { 20, 20, 9, 9}}, + {m68k_op_adda_16_d , 0xf1f8, 0xd0c0, { 8, 8, 2, 2}}, + {m68k_op_adda_16_a , 0xf1f8, 0xd0c8, { 8, 8, 2, 2}}, + {m68k_op_adda_16_ai , 0xf1f8, 0xd0d0, { 12, 12, 6, 6}}, + {m68k_op_adda_16_pi , 0xf1f8, 0xd0d8, { 12, 12, 6, 6}}, + {m68k_op_adda_16_pd , 0xf1f8, 0xd0e0, { 14, 14, 7, 7}}, + {m68k_op_adda_16_di , 0xf1f8, 0xd0e8, { 16, 16, 7, 7}}, + {m68k_op_adda_16_ix , 0xf1f8, 0xd0f0, { 18, 18, 9, 9}}, + {m68k_op_addx_8_rr , 0xf1f8, 0xd100, { 4, 4, 2, 2}}, + {m68k_op_addx_8_mm , 0xf1f8, 0xd108, { 18, 18, 12, 12}}, + {m68k_op_add_8_re_ai , 0xf1f8, 0xd110, { 12, 12, 8, 8}}, + {m68k_op_add_8_re_pi , 0xf1f8, 0xd118, { 12, 12, 8, 8}}, + {m68k_op_add_8_re_pd , 0xf1f8, 0xd120, { 14, 14, 9, 9}}, + {m68k_op_add_8_re_di , 0xf1f8, 0xd128, { 16, 16, 9, 9}}, + {m68k_op_add_8_re_ix , 0xf1f8, 0xd130, { 18, 18, 11, 11}}, + {m68k_op_addx_16_rr , 0xf1f8, 0xd140, { 4, 4, 2, 2}}, + {m68k_op_addx_16_mm , 0xf1f8, 0xd148, { 18, 18, 12, 12}}, + {m68k_op_add_16_re_ai , 0xf1f8, 0xd150, { 12, 12, 8, 8}}, + {m68k_op_add_16_re_pi , 0xf1f8, 0xd158, { 12, 12, 8, 8}}, + {m68k_op_add_16_re_pd , 0xf1f8, 0xd160, { 14, 14, 9, 9}}, + {m68k_op_add_16_re_di , 0xf1f8, 0xd168, { 16, 16, 9, 9}}, + {m68k_op_add_16_re_ix , 0xf1f8, 0xd170, { 18, 18, 11, 11}}, + {m68k_op_addx_32_rr , 0xf1f8, 0xd180, { 8, 6, 2, 2}}, + {m68k_op_addx_32_mm , 0xf1f8, 0xd188, { 30, 30, 12, 12}}, + {m68k_op_add_32_re_ai , 0xf1f8, 0xd190, { 20, 20, 8, 8}}, + {m68k_op_add_32_re_pi , 0xf1f8, 0xd198, { 20, 20, 8, 8}}, + {m68k_op_add_32_re_pd , 0xf1f8, 0xd1a0, { 22, 22, 9, 9}}, + {m68k_op_add_32_re_di , 0xf1f8, 0xd1a8, { 24, 24, 9, 9}}, + {m68k_op_add_32_re_ix , 0xf1f8, 0xd1b0, { 26, 26, 11, 11}}, + {m68k_op_adda_32_d , 0xf1f8, 0xd1c0, { 8, 6, 2, 2}}, + {m68k_op_adda_32_a , 0xf1f8, 0xd1c8, { 8, 6, 2, 2}}, + {m68k_op_adda_32_ai , 0xf1f8, 0xd1d0, { 14, 14, 6, 6}}, + {m68k_op_adda_32_pi , 0xf1f8, 0xd1d8, { 14, 14, 6, 6}}, + {m68k_op_adda_32_pd , 0xf1f8, 0xd1e0, { 16, 16, 7, 7}}, + {m68k_op_adda_32_di , 0xf1f8, 0xd1e8, { 18, 18, 7, 7}}, + {m68k_op_adda_32_ix , 0xf1f8, 0xd1f0, { 20, 20, 9, 9}}, + {m68k_op_asr_8_s , 0xf1f8, 0xe000, { 6, 6, 6, 6}}, + {m68k_op_lsr_8_s , 0xf1f8, 0xe008, { 6, 6, 4, 4}}, + {m68k_op_roxr_8_s , 0xf1f8, 0xe010, { 6, 6, 12, 12}}, + {m68k_op_ror_8_s , 0xf1f8, 0xe018, { 6, 6, 8, 8}}, + {m68k_op_asr_8_r , 0xf1f8, 0xe020, { 6, 6, 6, 6}}, + {m68k_op_lsr_8_r , 0xf1f8, 0xe028, { 6, 6, 6, 6}}, + {m68k_op_roxr_8_r , 0xf1f8, 0xe030, { 6, 6, 12, 12}}, + {m68k_op_ror_8_r , 0xf1f8, 0xe038, { 6, 6, 8, 8}}, + {m68k_op_asr_16_s , 0xf1f8, 0xe040, { 6, 6, 6, 6}}, + {m68k_op_lsr_16_s , 0xf1f8, 0xe048, { 6, 6, 4, 4}}, + {m68k_op_roxr_16_s , 0xf1f8, 0xe050, { 6, 6, 12, 12}}, + {m68k_op_ror_16_s , 0xf1f8, 0xe058, { 6, 6, 8, 8}}, + {m68k_op_asr_16_r , 0xf1f8, 0xe060, { 6, 6, 6, 6}}, + {m68k_op_lsr_16_r , 0xf1f8, 0xe068, { 6, 6, 6, 6}}, + {m68k_op_roxr_16_r , 0xf1f8, 0xe070, { 6, 6, 12, 12}}, + {m68k_op_ror_16_r , 0xf1f8, 0xe078, { 6, 6, 8, 8}}, + {m68k_op_asr_32_s , 0xf1f8, 0xe080, { 8, 8, 6, 6}}, + {m68k_op_lsr_32_s , 0xf1f8, 0xe088, { 8, 8, 4, 4}}, + {m68k_op_roxr_32_s , 0xf1f8, 0xe090, { 8, 8, 12, 12}}, + {m68k_op_ror_32_s , 0xf1f8, 0xe098, { 8, 8, 8, 8}}, + {m68k_op_asr_32_r , 0xf1f8, 0xe0a0, { 8, 8, 6, 6}}, + {m68k_op_lsr_32_r , 0xf1f8, 0xe0a8, { 8, 8, 6, 6}}, + {m68k_op_roxr_32_r , 0xf1f8, 0xe0b0, { 8, 8, 12, 12}}, + {m68k_op_ror_32_r , 0xf1f8, 0xe0b8, { 8, 8, 8, 8}}, + {m68k_op_asl_8_s , 0xf1f8, 0xe100, { 6, 6, 8, 8}}, + {m68k_op_lsl_8_s , 0xf1f8, 0xe108, { 6, 6, 4, 4}}, + {m68k_op_roxl_8_s , 0xf1f8, 0xe110, { 6, 6, 12, 12}}, + {m68k_op_rol_8_s , 0xf1f8, 0xe118, { 6, 6, 8, 8}}, + {m68k_op_asl_8_r , 0xf1f8, 0xe120, { 6, 6, 8, 8}}, + {m68k_op_lsl_8_r , 0xf1f8, 0xe128, { 6, 6, 6, 6}}, + {m68k_op_roxl_8_r , 0xf1f8, 0xe130, { 6, 6, 12, 12}}, + {m68k_op_rol_8_r , 0xf1f8, 0xe138, { 6, 6, 8, 8}}, + {m68k_op_asl_16_s , 0xf1f8, 0xe140, { 6, 6, 8, 8}}, + {m68k_op_lsl_16_s , 0xf1f8, 0xe148, { 6, 6, 4, 4}}, + {m68k_op_roxl_16_s , 0xf1f8, 0xe150, { 6, 6, 12, 12}}, + {m68k_op_rol_16_s , 0xf1f8, 0xe158, { 6, 6, 8, 8}}, + {m68k_op_asl_16_r , 0xf1f8, 0xe160, { 6, 6, 8, 8}}, + {m68k_op_lsl_16_r , 0xf1f8, 0xe168, { 6, 6, 6, 6}}, + {m68k_op_roxl_16_r , 0xf1f8, 0xe170, { 6, 6, 12, 12}}, + {m68k_op_rol_16_r , 0xf1f8, 0xe178, { 6, 6, 8, 8}}, + {m68k_op_asl_32_s , 0xf1f8, 0xe180, { 8, 8, 8, 8}}, + {m68k_op_lsl_32_s , 0xf1f8, 0xe188, { 8, 8, 4, 4}}, + {m68k_op_roxl_32_s , 0xf1f8, 0xe190, { 8, 8, 12, 12}}, + {m68k_op_rol_32_s , 0xf1f8, 0xe198, { 8, 8, 8, 8}}, + {m68k_op_asl_32_r , 0xf1f8, 0xe1a0, { 8, 8, 8, 8}}, + {m68k_op_lsl_32_r , 0xf1f8, 0xe1a8, { 8, 8, 6, 6}}, + {m68k_op_roxl_32_r , 0xf1f8, 0xe1b0, { 8, 8, 12, 12}}, + {m68k_op_rol_32_r , 0xf1f8, 0xe1b8, { 8, 8, 8, 8}}, + {m68k_op_cpdbcc_32 , 0xf1f8, 0xf048, { 0, 0, 4, 0}}, + {m68k_op_cptrapcc_32 , 0xf1f8, 0xf078, { 0, 0, 4, 0}}, + {m68k_op_rtm_32 , 0xfff0, 0x06c0, { 0, 0, 19, 19}}, + {m68k_op_trap , 0xfff0, 0x4e40, { 4, 4, 4, 4}}, + {m68k_op_btst_8_r_pi7 , 0xf1ff, 0x011f, { 8, 8, 8, 8}}, + {m68k_op_btst_8_r_pd7 , 0xf1ff, 0x0127, { 10, 10, 9, 9}}, + {m68k_op_btst_8_r_aw , 0xf1ff, 0x0138, { 12, 12, 8, 8}}, + {m68k_op_btst_8_r_al , 0xf1ff, 0x0139, { 16, 16, 8, 8}}, + {m68k_op_btst_8_r_pcdi , 0xf1ff, 0x013a, { 12, 12, 9, 9}}, + {m68k_op_btst_8_r_pcix , 0xf1ff, 0x013b, { 14, 14, 11, 11}}, + {m68k_op_btst_8_r_i , 0xf1ff, 0x013c, { 8, 8, 6, 6}}, + {m68k_op_bchg_8_r_pi7 , 0xf1ff, 0x015f, { 12, 12, 8, 8}}, + {m68k_op_bchg_8_r_pd7 , 0xf1ff, 0x0167, { 14, 14, 9, 9}}, + {m68k_op_bchg_8_r_aw , 0xf1ff, 0x0178, { 16, 16, 8, 8}}, + {m68k_op_bchg_8_r_al , 0xf1ff, 0x0179, { 20, 20, 8, 8}}, + {m68k_op_bclr_8_r_pi7 , 0xf1ff, 0x019f, { 12, 14, 8, 8}}, + {m68k_op_bclr_8_r_pd7 , 0xf1ff, 0x01a7, { 14, 16, 9, 9}}, + {m68k_op_bclr_8_r_aw , 0xf1ff, 0x01b8, { 16, 18, 8, 8}}, + {m68k_op_bclr_8_r_al , 0xf1ff, 0x01b9, { 20, 22, 8, 8}}, + {m68k_op_bset_8_r_pi7 , 0xf1ff, 0x01df, { 12, 12, 8, 8}}, + {m68k_op_bset_8_r_pd7 , 0xf1ff, 0x01e7, { 14, 14, 9, 9}}, + {m68k_op_bset_8_r_aw , 0xf1ff, 0x01f8, { 16, 16, 8, 8}}, + {m68k_op_bset_8_r_al , 0xf1ff, 0x01f9, { 20, 20, 8, 8}}, + {m68k_op_move_8_d_pi7 , 0xf1ff, 0x101f, { 8, 8, 6, 6}}, + {m68k_op_move_8_d_pd7 , 0xf1ff, 0x1027, { 10, 10, 7, 7}}, + {m68k_op_move_8_d_aw , 0xf1ff, 0x1038, { 12, 12, 6, 6}}, + {m68k_op_move_8_d_al , 0xf1ff, 0x1039, { 16, 16, 6, 6}}, + {m68k_op_move_8_d_pcdi , 0xf1ff, 0x103a, { 12, 12, 7, 7}}, + {m68k_op_move_8_d_pcix , 0xf1ff, 0x103b, { 14, 14, 9, 9}}, + {m68k_op_move_8_d_i , 0xf1ff, 0x103c, { 8, 8, 4, 4}}, + {m68k_op_move_8_ai_pi7 , 0xf1ff, 0x109f, { 12, 12, 8, 8}}, + {m68k_op_move_8_ai_pd7 , 0xf1ff, 0x10a7, { 14, 14, 9, 9}}, + {m68k_op_move_8_ai_aw , 0xf1ff, 0x10b8, { 16, 16, 8, 8}}, + {m68k_op_move_8_ai_al , 0xf1ff, 0x10b9, { 20, 20, 8, 8}}, + {m68k_op_move_8_ai_pcdi , 0xf1ff, 0x10ba, { 16, 16, 9, 9}}, + {m68k_op_move_8_ai_pcix , 0xf1ff, 0x10bb, { 18, 18, 11, 11}}, + {m68k_op_move_8_ai_i , 0xf1ff, 0x10bc, { 12, 12, 6, 6}}, + {m68k_op_move_8_pi_pi7 , 0xf1ff, 0x10df, { 12, 12, 8, 8}}, + {m68k_op_move_8_pi_pd7 , 0xf1ff, 0x10e7, { 14, 14, 9, 9}}, + {m68k_op_move_8_pi_aw , 0xf1ff, 0x10f8, { 16, 16, 8, 8}}, + {m68k_op_move_8_pi_al , 0xf1ff, 0x10f9, { 20, 20, 8, 8}}, + {m68k_op_move_8_pi_pcdi , 0xf1ff, 0x10fa, { 16, 16, 9, 9}}, + {m68k_op_move_8_pi_pcix , 0xf1ff, 0x10fb, { 18, 18, 11, 11}}, + {m68k_op_move_8_pi_i , 0xf1ff, 0x10fc, { 12, 12, 6, 6}}, + {m68k_op_move_8_pd_pi7 , 0xf1ff, 0x111f, { 12, 12, 9, 9}}, + {m68k_op_move_8_pd_pd7 , 0xf1ff, 0x1127, { 14, 14, 10, 10}}, + {m68k_op_move_8_pd_aw , 0xf1ff, 0x1138, { 16, 16, 9, 9}}, + {m68k_op_move_8_pd_al , 0xf1ff, 0x1139, { 20, 20, 9, 9}}, + {m68k_op_move_8_pd_pcdi , 0xf1ff, 0x113a, { 16, 16, 10, 10}}, + {m68k_op_move_8_pd_pcix , 0xf1ff, 0x113b, { 18, 18, 12, 12}}, + {m68k_op_move_8_pd_i , 0xf1ff, 0x113c, { 12, 12, 7, 7}}, + {m68k_op_move_8_di_pi7 , 0xf1ff, 0x115f, { 16, 16, 9, 9}}, + {m68k_op_move_8_di_pd7 , 0xf1ff, 0x1167, { 18, 18, 10, 10}}, + {m68k_op_move_8_di_aw , 0xf1ff, 0x1178, { 20, 20, 9, 9}}, + {m68k_op_move_8_di_al , 0xf1ff, 0x1179, { 24, 24, 9, 9}}, + {m68k_op_move_8_di_pcdi , 0xf1ff, 0x117a, { 20, 20, 10, 10}}, + {m68k_op_move_8_di_pcix , 0xf1ff, 0x117b, { 22, 22, 12, 12}}, + {m68k_op_move_8_di_i , 0xf1ff, 0x117c, { 16, 16, 7, 7}}, + {m68k_op_move_8_ix_pi7 , 0xf1ff, 0x119f, { 18, 18, 11, 11}}, + {m68k_op_move_8_ix_pd7 , 0xf1ff, 0x11a7, { 20, 20, 12, 12}}, + {m68k_op_move_8_ix_aw , 0xf1ff, 0x11b8, { 22, 22, 11, 11}}, + {m68k_op_move_8_ix_al , 0xf1ff, 0x11b9, { 26, 26, 11, 11}}, + {m68k_op_move_8_ix_pcdi , 0xf1ff, 0x11ba, { 22, 22, 12, 12}}, + {m68k_op_move_8_ix_pcix , 0xf1ff, 0x11bb, { 24, 24, 14, 14}}, + {m68k_op_move_8_ix_i , 0xf1ff, 0x11bc, { 18, 18, 9, 9}}, + {m68k_op_move_32_d_aw , 0xf1ff, 0x2038, { 16, 16, 6, 6}}, + {m68k_op_move_32_d_al , 0xf1ff, 0x2039, { 20, 20, 6, 6}}, + {m68k_op_move_32_d_pcdi , 0xf1ff, 0x203a, { 16, 16, 7, 7}}, + {m68k_op_move_32_d_pcix , 0xf1ff, 0x203b, { 18, 18, 9, 9}}, + {m68k_op_move_32_d_i , 0xf1ff, 0x203c, { 12, 12, 6, 6}}, + {m68k_op_movea_32_aw , 0xf1ff, 0x2078, { 16, 16, 6, 6}}, + {m68k_op_movea_32_al , 0xf1ff, 0x2079, { 20, 20, 6, 6}}, + {m68k_op_movea_32_pcdi , 0xf1ff, 0x207a, { 16, 16, 7, 7}}, + {m68k_op_movea_32_pcix , 0xf1ff, 0x207b, { 18, 18, 9, 9}}, + {m68k_op_movea_32_i , 0xf1ff, 0x207c, { 12, 12, 6, 6}}, + {m68k_op_move_32_ai_aw , 0xf1ff, 0x20b8, { 24, 24, 8, 8}}, + {m68k_op_move_32_ai_al , 0xf1ff, 0x20b9, { 28, 28, 8, 8}}, + {m68k_op_move_32_ai_pcdi , 0xf1ff, 0x20ba, { 24, 24, 9, 9}}, + {m68k_op_move_32_ai_pcix , 0xf1ff, 0x20bb, { 26, 26, 11, 11}}, + {m68k_op_move_32_ai_i , 0xf1ff, 0x20bc, { 20, 20, 8, 8}}, + {m68k_op_move_32_pi_aw , 0xf1ff, 0x20f8, { 24, 24, 8, 8}}, + {m68k_op_move_32_pi_al , 0xf1ff, 0x20f9, { 28, 28, 8, 8}}, + {m68k_op_move_32_pi_pcdi , 0xf1ff, 0x20fa, { 24, 24, 9, 9}}, + {m68k_op_move_32_pi_pcix , 0xf1ff, 0x20fb, { 26, 26, 11, 11}}, + {m68k_op_move_32_pi_i , 0xf1ff, 0x20fc, { 20, 20, 8, 8}}, + {m68k_op_move_32_pd_aw , 0xf1ff, 0x2138, { 24, 26, 9, 9}}, + {m68k_op_move_32_pd_al , 0xf1ff, 0x2139, { 28, 30, 9, 9}}, + {m68k_op_move_32_pd_pcdi , 0xf1ff, 0x213a, { 24, 26, 10, 10}}, + {m68k_op_move_32_pd_pcix , 0xf1ff, 0x213b, { 26, 28, 12, 12}}, + {m68k_op_move_32_pd_i , 0xf1ff, 0x213c, { 20, 22, 9, 9}}, + {m68k_op_move_32_di_aw , 0xf1ff, 0x2178, { 28, 28, 9, 9}}, + {m68k_op_move_32_di_al , 0xf1ff, 0x2179, { 32, 32, 9, 9}}, + {m68k_op_move_32_di_pcdi , 0xf1ff, 0x217a, { 28, 28, 10, 10}}, + {m68k_op_move_32_di_pcix , 0xf1ff, 0x217b, { 30, 30, 12, 12}}, + {m68k_op_move_32_di_i , 0xf1ff, 0x217c, { 24, 24, 9, 9}}, + {m68k_op_move_32_ix_aw , 0xf1ff, 0x21b8, { 30, 30, 11, 11}}, + {m68k_op_move_32_ix_al , 0xf1ff, 0x21b9, { 34, 34, 11, 11}}, + {m68k_op_move_32_ix_pcdi , 0xf1ff, 0x21ba, { 30, 30, 12, 12}}, + {m68k_op_move_32_ix_pcix , 0xf1ff, 0x21bb, { 32, 32, 14, 14}}, + {m68k_op_move_32_ix_i , 0xf1ff, 0x21bc, { 26, 26, 11, 11}}, + {m68k_op_move_16_d_aw , 0xf1ff, 0x3038, { 12, 12, 6, 6}}, + {m68k_op_move_16_d_al , 0xf1ff, 0x3039, { 16, 16, 6, 6}}, + {m68k_op_move_16_d_pcdi , 0xf1ff, 0x303a, { 12, 12, 7, 7}}, + {m68k_op_move_16_d_pcix , 0xf1ff, 0x303b, { 14, 14, 9, 9}}, + {m68k_op_move_16_d_i , 0xf1ff, 0x303c, { 8, 8, 4, 4}}, + {m68k_op_movea_16_aw , 0xf1ff, 0x3078, { 12, 12, 6, 6}}, + {m68k_op_movea_16_al , 0xf1ff, 0x3079, { 16, 16, 6, 6}}, + {m68k_op_movea_16_pcdi , 0xf1ff, 0x307a, { 12, 12, 7, 7}}, + {m68k_op_movea_16_pcix , 0xf1ff, 0x307b, { 14, 14, 9, 9}}, + {m68k_op_movea_16_i , 0xf1ff, 0x307c, { 8, 8, 4, 4}}, + {m68k_op_move_16_ai_aw , 0xf1ff, 0x30b8, { 16, 16, 8, 8}}, + {m68k_op_move_16_ai_al , 0xf1ff, 0x30b9, { 20, 20, 8, 8}}, + {m68k_op_move_16_ai_pcdi , 0xf1ff, 0x30ba, { 16, 16, 9, 9}}, + {m68k_op_move_16_ai_pcix , 0xf1ff, 0x30bb, { 18, 18, 11, 11}}, + {m68k_op_move_16_ai_i , 0xf1ff, 0x30bc, { 12, 12, 6, 6}}, + {m68k_op_move_16_pi_aw , 0xf1ff, 0x30f8, { 16, 16, 8, 8}}, + {m68k_op_move_16_pi_al , 0xf1ff, 0x30f9, { 20, 20, 8, 8}}, + {m68k_op_move_16_pi_pcdi , 0xf1ff, 0x30fa, { 16, 16, 9, 9}}, + {m68k_op_move_16_pi_pcix , 0xf1ff, 0x30fb, { 18, 18, 11, 11}}, + {m68k_op_move_16_pi_i , 0xf1ff, 0x30fc, { 12, 12, 6, 6}}, + {m68k_op_move_16_pd_aw , 0xf1ff, 0x3138, { 16, 16, 9, 9}}, + {m68k_op_move_16_pd_al , 0xf1ff, 0x3139, { 20, 20, 9, 9}}, + {m68k_op_move_16_pd_pcdi , 0xf1ff, 0x313a, { 16, 16, 10, 10}}, + {m68k_op_move_16_pd_pcix , 0xf1ff, 0x313b, { 18, 18, 12, 12}}, + {m68k_op_move_16_pd_i , 0xf1ff, 0x313c, { 12, 12, 7, 7}}, + {m68k_op_move_16_di_aw , 0xf1ff, 0x3178, { 20, 20, 9, 9}}, + {m68k_op_move_16_di_al , 0xf1ff, 0x3179, { 24, 24, 9, 9}}, + {m68k_op_move_16_di_pcdi , 0xf1ff, 0x317a, { 20, 20, 10, 10}}, + {m68k_op_move_16_di_pcix , 0xf1ff, 0x317b, { 22, 22, 12, 12}}, + {m68k_op_move_16_di_i , 0xf1ff, 0x317c, { 16, 16, 7, 7}}, + {m68k_op_move_16_ix_aw , 0xf1ff, 0x31b8, { 22, 22, 11, 11}}, + {m68k_op_move_16_ix_al , 0xf1ff, 0x31b9, { 26, 26, 11, 11}}, + {m68k_op_move_16_ix_pcdi , 0xf1ff, 0x31ba, { 22, 22, 12, 12}}, + {m68k_op_move_16_ix_pcix , 0xf1ff, 0x31bb, { 24, 24, 14, 14}}, + {m68k_op_move_16_ix_i , 0xf1ff, 0x31bc, { 18, 18, 9, 9}}, + {m68k_op_chk_32_aw , 0xf1ff, 0x4138, { 0, 0, 12, 12}}, + {m68k_op_chk_32_al , 0xf1ff, 0x4139, { 0, 0, 12, 12}}, + {m68k_op_chk_32_pcdi , 0xf1ff, 0x413a, { 0, 0, 13, 13}}, + {m68k_op_chk_32_pcix , 0xf1ff, 0x413b, { 0, 0, 15, 15}}, + {m68k_op_chk_32_i , 0xf1ff, 0x413c, { 0, 0, 12, 12}}, + {m68k_op_chk_16_aw , 0xf1ff, 0x41b8, { 18, 16, 12, 12}}, + {m68k_op_chk_16_al , 0xf1ff, 0x41b9, { 22, 20, 12, 12}}, + {m68k_op_chk_16_pcdi , 0xf1ff, 0x41ba, { 18, 16, 13, 13}}, + {m68k_op_chk_16_pcix , 0xf1ff, 0x41bb, { 20, 18, 15, 15}}, + {m68k_op_chk_16_i , 0xf1ff, 0x41bc, { 14, 12, 10, 10}}, + {m68k_op_lea_32_aw , 0xf1ff, 0x41f8, { 8, 8, 6, 6}}, + {m68k_op_lea_32_al , 0xf1ff, 0x41f9, { 12, 12, 6, 6}}, + {m68k_op_lea_32_pcdi , 0xf1ff, 0x41fa, { 8, 8, 7, 7}}, + {m68k_op_lea_32_pcix , 0xf1ff, 0x41fb, { 12, 12, 9, 9}}, + {m68k_op_addq_8_pi7 , 0xf1ff, 0x501f, { 12, 12, 8, 8}}, + {m68k_op_addq_8_pd7 , 0xf1ff, 0x5027, { 14, 14, 9, 9}}, + {m68k_op_addq_8_aw , 0xf1ff, 0x5038, { 16, 16, 8, 8}}, + {m68k_op_addq_8_al , 0xf1ff, 0x5039, { 20, 20, 8, 8}}, + {m68k_op_addq_16_aw , 0xf1ff, 0x5078, { 16, 16, 8, 8}}, + {m68k_op_addq_16_al , 0xf1ff, 0x5079, { 20, 20, 8, 8}}, + {m68k_op_addq_32_aw , 0xf1ff, 0x50b8, { 24, 24, 8, 8}}, + {m68k_op_addq_32_al , 0xf1ff, 0x50b9, { 28, 28, 8, 8}}, + {m68k_op_subq_8_pi7 , 0xf1ff, 0x511f, { 12, 12, 8, 8}}, + {m68k_op_subq_8_pd7 , 0xf1ff, 0x5127, { 14, 14, 9, 9}}, + {m68k_op_subq_8_aw , 0xf1ff, 0x5138, { 16, 16, 8, 8}}, + {m68k_op_subq_8_al , 0xf1ff, 0x5139, { 20, 20, 8, 8}}, + {m68k_op_subq_16_aw , 0xf1ff, 0x5178, { 16, 16, 8, 8}}, + {m68k_op_subq_16_al , 0xf1ff, 0x5179, { 20, 20, 8, 8}}, + {m68k_op_subq_32_aw , 0xf1ff, 0x51b8, { 24, 24, 8, 8}}, + {m68k_op_subq_32_al , 0xf1ff, 0x51b9, { 28, 28, 8, 8}}, + {m68k_op_or_8_er_pi7 , 0xf1ff, 0x801f, { 8, 8, 6, 6}}, + {m68k_op_or_8_er_pd7 , 0xf1ff, 0x8027, { 10, 10, 7, 7}}, + {m68k_op_or_8_er_aw , 0xf1ff, 0x8038, { 12, 12, 6, 6}}, + {m68k_op_or_8_er_al , 0xf1ff, 0x8039, { 16, 16, 6, 6}}, + {m68k_op_or_8_er_pcdi , 0xf1ff, 0x803a, { 12, 12, 7, 7}}, + {m68k_op_or_8_er_pcix , 0xf1ff, 0x803b, { 14, 14, 9, 9}}, + {m68k_op_or_8_er_i , 0xf1ff, 0x803c, { 8, 8, 4, 4}}, + {m68k_op_or_16_er_aw , 0xf1ff, 0x8078, { 12, 12, 6, 6}}, + {m68k_op_or_16_er_al , 0xf1ff, 0x8079, { 16, 16, 6, 6}}, + {m68k_op_or_16_er_pcdi , 0xf1ff, 0x807a, { 12, 12, 7, 7}}, + {m68k_op_or_16_er_pcix , 0xf1ff, 0x807b, { 14, 14, 9, 9}}, + {m68k_op_or_16_er_i , 0xf1ff, 0x807c, { 8, 8, 4, 4}}, + {m68k_op_or_32_er_aw , 0xf1ff, 0x80b8, { 18, 18, 6, 6}}, + {m68k_op_or_32_er_al , 0xf1ff, 0x80b9, { 22, 22, 6, 6}}, + {m68k_op_or_32_er_pcdi , 0xf1ff, 0x80ba, { 18, 18, 7, 7}}, + {m68k_op_or_32_er_pcix , 0xf1ff, 0x80bb, { 20, 20, 9, 9}}, + {m68k_op_or_32_er_i , 0xf1ff, 0x80bc, { 16, 14, 6, 6}}, + {m68k_op_divu_16_aw , 0xf1ff, 0x80f8, {148, 116, 48, 48}}, + {m68k_op_divu_16_al , 0xf1ff, 0x80f9, {152, 120, 48, 48}}, + {m68k_op_divu_16_pcdi , 0xf1ff, 0x80fa, {148, 116, 49, 49}}, + {m68k_op_divu_16_pcix , 0xf1ff, 0x80fb, {150, 118, 51, 51}}, + {m68k_op_divu_16_i , 0xf1ff, 0x80fc, {144, 112, 46, 46}}, + {m68k_op_sbcd_8_mm_ay7 , 0xf1ff, 0x810f, { 18, 18, 16, 16}}, + {m68k_op_or_8_re_pi7 , 0xf1ff, 0x811f, { 12, 12, 8, 8}}, + {m68k_op_or_8_re_pd7 , 0xf1ff, 0x8127, { 14, 14, 9, 9}}, + {m68k_op_or_8_re_aw , 0xf1ff, 0x8138, { 16, 16, 8, 8}}, + {m68k_op_or_8_re_al , 0xf1ff, 0x8139, { 20, 20, 8, 8}}, + {m68k_op_pack_16_mm_ay7 , 0xf1ff, 0x814f, { 0, 0, 13, 13}}, + {m68k_op_or_16_re_aw , 0xf1ff, 0x8178, { 16, 16, 8, 8}}, + {m68k_op_or_16_re_al , 0xf1ff, 0x8179, { 20, 20, 8, 8}}, + {m68k_op_unpk_16_mm_ay7 , 0xf1ff, 0x818f, { 0, 0, 13, 13}}, + {m68k_op_or_32_re_aw , 0xf1ff, 0x81b8, { 24, 24, 8, 8}}, + {m68k_op_or_32_re_al , 0xf1ff, 0x81b9, { 28, 28, 8, 8}}, + {m68k_op_divs_16_aw , 0xf1ff, 0x81f8, {166, 130, 60, 60}}, + {m68k_op_divs_16_al , 0xf1ff, 0x81f9, {170, 134, 60, 60}}, + {m68k_op_divs_16_pcdi , 0xf1ff, 0x81fa, {166, 130, 61, 61}}, + {m68k_op_divs_16_pcix , 0xf1ff, 0x81fb, {168, 132, 63, 63}}, + {m68k_op_divs_16_i , 0xf1ff, 0x81fc, {162, 126, 58, 58}}, + {m68k_op_sub_8_er_pi7 , 0xf1ff, 0x901f, { 8, 8, 6, 6}}, + {m68k_op_sub_8_er_pd7 , 0xf1ff, 0x9027, { 10, 10, 7, 7}}, + {m68k_op_sub_8_er_aw , 0xf1ff, 0x9038, { 12, 12, 6, 6}}, + {m68k_op_sub_8_er_al , 0xf1ff, 0x9039, { 16, 16, 6, 6}}, + {m68k_op_sub_8_er_pcdi , 0xf1ff, 0x903a, { 12, 12, 7, 7}}, + {m68k_op_sub_8_er_pcix , 0xf1ff, 0x903b, { 14, 14, 9, 9}}, + {m68k_op_sub_8_er_i , 0xf1ff, 0x903c, { 8, 8, 4, 4}}, + {m68k_op_sub_16_er_aw , 0xf1ff, 0x9078, { 12, 12, 6, 6}}, + {m68k_op_sub_16_er_al , 0xf1ff, 0x9079, { 16, 16, 6, 6}}, + {m68k_op_sub_16_er_pcdi , 0xf1ff, 0x907a, { 12, 12, 7, 7}}, + {m68k_op_sub_16_er_pcix , 0xf1ff, 0x907b, { 14, 14, 9, 9}}, + {m68k_op_sub_16_er_i , 0xf1ff, 0x907c, { 8, 8, 4, 4}}, + {m68k_op_sub_32_er_aw , 0xf1ff, 0x90b8, { 18, 18, 6, 6}}, + {m68k_op_sub_32_er_al , 0xf1ff, 0x90b9, { 22, 22, 6, 6}}, + {m68k_op_sub_32_er_pcdi , 0xf1ff, 0x90ba, { 18, 18, 7, 7}}, + {m68k_op_sub_32_er_pcix , 0xf1ff, 0x90bb, { 20, 20, 9, 9}}, + {m68k_op_sub_32_er_i , 0xf1ff, 0x90bc, { 16, 14, 6, 6}}, + {m68k_op_suba_16_aw , 0xf1ff, 0x90f8, { 16, 16, 6, 6}}, + {m68k_op_suba_16_al , 0xf1ff, 0x90f9, { 20, 20, 6, 6}}, + {m68k_op_suba_16_pcdi , 0xf1ff, 0x90fa, { 16, 16, 7, 7}}, + {m68k_op_suba_16_pcix , 0xf1ff, 0x90fb, { 18, 18, 9, 9}}, + {m68k_op_suba_16_i , 0xf1ff, 0x90fc, { 12, 12, 4, 4}}, + {m68k_op_subx_8_mm_ay7 , 0xf1ff, 0x910f, { 18, 18, 12, 12}}, + {m68k_op_sub_8_re_pi7 , 0xf1ff, 0x911f, { 12, 12, 8, 8}}, + {m68k_op_sub_8_re_pd7 , 0xf1ff, 0x9127, { 14, 14, 9, 9}}, + {m68k_op_sub_8_re_aw , 0xf1ff, 0x9138, { 16, 16, 8, 8}}, + {m68k_op_sub_8_re_al , 0xf1ff, 0x9139, { 20, 20, 8, 8}}, + {m68k_op_sub_16_re_aw , 0xf1ff, 0x9178, { 16, 16, 8, 8}}, + {m68k_op_sub_16_re_al , 0xf1ff, 0x9179, { 20, 20, 8, 8}}, + {m68k_op_sub_32_re_aw , 0xf1ff, 0x91b8, { 24, 24, 8, 8}}, + {m68k_op_sub_32_re_al , 0xf1ff, 0x91b9, { 28, 28, 8, 8}}, + {m68k_op_suba_32_aw , 0xf1ff, 0x91f8, { 18, 18, 6, 6}}, + {m68k_op_suba_32_al , 0xf1ff, 0x91f9, { 22, 22, 6, 6}}, + {m68k_op_suba_32_pcdi , 0xf1ff, 0x91fa, { 18, 18, 7, 7}}, + {m68k_op_suba_32_pcix , 0xf1ff, 0x91fb, { 20, 20, 9, 9}}, + {m68k_op_suba_32_i , 0xf1ff, 0x91fc, { 16, 14, 6, 6}}, + {m68k_op_cmp_8_pi7 , 0xf1ff, 0xb01f, { 8, 8, 6, 6}}, + {m68k_op_cmp_8_pd7 , 0xf1ff, 0xb027, { 10, 10, 7, 7}}, + {m68k_op_cmp_8_aw , 0xf1ff, 0xb038, { 12, 12, 6, 6}}, + {m68k_op_cmp_8_al , 0xf1ff, 0xb039, { 16, 16, 6, 6}}, + {m68k_op_cmp_8_pcdi , 0xf1ff, 0xb03a, { 12, 12, 7, 7}}, + {m68k_op_cmp_8_pcix , 0xf1ff, 0xb03b, { 14, 14, 9, 9}}, + {m68k_op_cmp_8_i , 0xf1ff, 0xb03c, { 8, 8, 4, 4}}, + {m68k_op_cmp_16_aw , 0xf1ff, 0xb078, { 12, 12, 6, 6}}, + {m68k_op_cmp_16_al , 0xf1ff, 0xb079, { 16, 16, 6, 6}}, + {m68k_op_cmp_16_pcdi , 0xf1ff, 0xb07a, { 12, 12, 7, 7}}, + {m68k_op_cmp_16_pcix , 0xf1ff, 0xb07b, { 14, 14, 9, 9}}, + {m68k_op_cmp_16_i , 0xf1ff, 0xb07c, { 8, 8, 4, 4}}, + {m68k_op_cmp_32_aw , 0xf1ff, 0xb0b8, { 18, 18, 6, 6}}, + {m68k_op_cmp_32_al , 0xf1ff, 0xb0b9, { 22, 22, 6, 6}}, + {m68k_op_cmp_32_pcdi , 0xf1ff, 0xb0ba, { 18, 18, 7, 7}}, + {m68k_op_cmp_32_pcix , 0xf1ff, 0xb0bb, { 20, 20, 9, 9}}, + {m68k_op_cmp_32_i , 0xf1ff, 0xb0bc, { 14, 14, 6, 6}}, + {m68k_op_cmpa_16_aw , 0xf1ff, 0xb0f8, { 14, 14, 8, 8}}, + {m68k_op_cmpa_16_al , 0xf1ff, 0xb0f9, { 18, 18, 8, 8}}, + {m68k_op_cmpa_16_pcdi , 0xf1ff, 0xb0fa, { 14, 14, 9, 9}}, + {m68k_op_cmpa_16_pcix , 0xf1ff, 0xb0fb, { 16, 16, 11, 11}}, + {m68k_op_cmpa_16_i , 0xf1ff, 0xb0fc, { 10, 10, 6, 6}}, + {m68k_op_cmpm_8_ay7 , 0xf1ff, 0xb10f, { 12, 12, 9, 9}}, + {m68k_op_eor_8_pi7 , 0xf1ff, 0xb11f, { 12, 12, 8, 8}}, + {m68k_op_eor_8_pd7 , 0xf1ff, 0xb127, { 14, 14, 9, 9}}, + {m68k_op_eor_8_aw , 0xf1ff, 0xb138, { 16, 16, 8, 8}}, + {m68k_op_eor_8_al , 0xf1ff, 0xb139, { 20, 20, 8, 8}}, + {m68k_op_eor_16_aw , 0xf1ff, 0xb178, { 16, 16, 8, 8}}, + {m68k_op_eor_16_al , 0xf1ff, 0xb179, { 20, 20, 8, 8}}, + {m68k_op_eor_32_aw , 0xf1ff, 0xb1b8, { 24, 24, 8, 8}}, + {m68k_op_eor_32_al , 0xf1ff, 0xb1b9, { 28, 28, 8, 8}}, + {m68k_op_cmpa_32_aw , 0xf1ff, 0xb1f8, { 18, 18, 8, 8}}, + {m68k_op_cmpa_32_al , 0xf1ff, 0xb1f9, { 22, 22, 8, 8}}, + {m68k_op_cmpa_32_pcdi , 0xf1ff, 0xb1fa, { 18, 18, 9, 9}}, + {m68k_op_cmpa_32_pcix , 0xf1ff, 0xb1fb, { 20, 20, 11, 11}}, + {m68k_op_cmpa_32_i , 0xf1ff, 0xb1fc, { 14, 14, 8, 8}}, + {m68k_op_and_8_er_pi7 , 0xf1ff, 0xc01f, { 8, 8, 6, 6}}, + {m68k_op_and_8_er_pd7 , 0xf1ff, 0xc027, { 10, 10, 7, 7}}, + {m68k_op_and_8_er_aw , 0xf1ff, 0xc038, { 12, 12, 6, 6}}, + {m68k_op_and_8_er_al , 0xf1ff, 0xc039, { 16, 16, 6, 6}}, + {m68k_op_and_8_er_pcdi , 0xf1ff, 0xc03a, { 12, 12, 7, 7}}, + {m68k_op_and_8_er_pcix , 0xf1ff, 0xc03b, { 14, 14, 9, 9}}, + {m68k_op_and_8_er_i , 0xf1ff, 0xc03c, { 8, 8, 4, 4}}, + {m68k_op_and_16_er_aw , 0xf1ff, 0xc078, { 12, 12, 6, 6}}, + {m68k_op_and_16_er_al , 0xf1ff, 0xc079, { 16, 16, 6, 6}}, + {m68k_op_and_16_er_pcdi , 0xf1ff, 0xc07a, { 12, 12, 7, 7}}, + {m68k_op_and_16_er_pcix , 0xf1ff, 0xc07b, { 14, 14, 9, 9}}, + {m68k_op_and_16_er_i , 0xf1ff, 0xc07c, { 8, 8, 4, 4}}, + {m68k_op_and_32_er_aw , 0xf1ff, 0xc0b8, { 18, 18, 6, 6}}, + {m68k_op_and_32_er_al , 0xf1ff, 0xc0b9, { 22, 22, 6, 6}}, + {m68k_op_and_32_er_pcdi , 0xf1ff, 0xc0ba, { 18, 18, 7, 7}}, + {m68k_op_and_32_er_pcix , 0xf1ff, 0xc0bb, { 20, 20, 9, 9}}, + {m68k_op_and_32_er_i , 0xf1ff, 0xc0bc, { 16, 14, 6, 6}}, + {m68k_op_mulu_16_aw , 0xf1ff, 0xc0f8, { 62, 38, 31, 31}}, + {m68k_op_mulu_16_al , 0xf1ff, 0xc0f9, { 66, 42, 31, 31}}, + {m68k_op_mulu_16_pcdi , 0xf1ff, 0xc0fa, { 62, 38, 32, 32}}, + {m68k_op_mulu_16_pcix , 0xf1ff, 0xc0fb, { 64, 40, 34, 34}}, + {m68k_op_mulu_16_i , 0xf1ff, 0xc0fc, { 58, 34, 29, 29}}, + {m68k_op_abcd_8_mm_ay7 , 0xf1ff, 0xc10f, { 18, 18, 16, 16}}, + {m68k_op_and_8_re_pi7 , 0xf1ff, 0xc11f, { 12, 12, 8, 8}}, + {m68k_op_and_8_re_pd7 , 0xf1ff, 0xc127, { 14, 14, 9, 9}}, + {m68k_op_and_8_re_aw , 0xf1ff, 0xc138, { 16, 16, 8, 8}}, + {m68k_op_and_8_re_al , 0xf1ff, 0xc139, { 20, 20, 8, 8}}, + {m68k_op_and_16_re_aw , 0xf1ff, 0xc178, { 16, 16, 8, 8}}, + {m68k_op_and_16_re_al , 0xf1ff, 0xc179, { 20, 20, 8, 8}}, + {m68k_op_and_32_re_aw , 0xf1ff, 0xc1b8, { 24, 24, 8, 8}}, + {m68k_op_and_32_re_al , 0xf1ff, 0xc1b9, { 28, 28, 8, 8}}, + {m68k_op_muls_16_aw , 0xf1ff, 0xc1f8, { 62, 40, 31, 31}}, + {m68k_op_muls_16_al , 0xf1ff, 0xc1f9, { 66, 44, 31, 31}}, + {m68k_op_muls_16_pcdi , 0xf1ff, 0xc1fa, { 62, 40, 32, 32}}, + {m68k_op_muls_16_pcix , 0xf1ff, 0xc1fb, { 64, 42, 34, 34}}, + {m68k_op_muls_16_i , 0xf1ff, 0xc1fc, { 58, 36, 29, 29}}, + {m68k_op_add_8_er_pi7 , 0xf1ff, 0xd01f, { 8, 8, 6, 6}}, + {m68k_op_add_8_er_pd7 , 0xf1ff, 0xd027, { 10, 10, 7, 7}}, + {m68k_op_add_8_er_aw , 0xf1ff, 0xd038, { 12, 12, 6, 6}}, + {m68k_op_add_8_er_al , 0xf1ff, 0xd039, { 16, 16, 6, 6}}, + {m68k_op_add_8_er_pcdi , 0xf1ff, 0xd03a, { 12, 12, 7, 7}}, + {m68k_op_add_8_er_pcix , 0xf1ff, 0xd03b, { 14, 14, 9, 9}}, + {m68k_op_add_8_er_i , 0xf1ff, 0xd03c, { 8, 8, 4, 4}}, + {m68k_op_add_16_er_aw , 0xf1ff, 0xd078, { 12, 12, 6, 6}}, + {m68k_op_add_16_er_al , 0xf1ff, 0xd079, { 16, 16, 6, 6}}, + {m68k_op_add_16_er_pcdi , 0xf1ff, 0xd07a, { 12, 12, 7, 7}}, + {m68k_op_add_16_er_pcix , 0xf1ff, 0xd07b, { 14, 14, 9, 9}}, + {m68k_op_add_16_er_i , 0xf1ff, 0xd07c, { 8, 8, 4, 4}}, + {m68k_op_add_32_er_aw , 0xf1ff, 0xd0b8, { 18, 18, 6, 6}}, + {m68k_op_add_32_er_al , 0xf1ff, 0xd0b9, { 22, 22, 6, 6}}, + {m68k_op_add_32_er_pcdi , 0xf1ff, 0xd0ba, { 18, 18, 7, 7}}, + {m68k_op_add_32_er_pcix , 0xf1ff, 0xd0bb, { 20, 20, 9, 9}}, + {m68k_op_add_32_er_i , 0xf1ff, 0xd0bc, { 16, 14, 6, 6}}, + {m68k_op_adda_16_aw , 0xf1ff, 0xd0f8, { 16, 16, 6, 6}}, + {m68k_op_adda_16_al , 0xf1ff, 0xd0f9, { 20, 20, 6, 6}}, + {m68k_op_adda_16_pcdi , 0xf1ff, 0xd0fa, { 16, 16, 7, 7}}, + {m68k_op_adda_16_pcix , 0xf1ff, 0xd0fb, { 18, 18, 9, 9}}, + {m68k_op_adda_16_i , 0xf1ff, 0xd0fc, { 12, 12, 4, 4}}, + {m68k_op_addx_8_mm_ay7 , 0xf1ff, 0xd10f, { 18, 18, 12, 12}}, + {m68k_op_add_8_re_pi7 , 0xf1ff, 0xd11f, { 12, 12, 8, 8}}, + {m68k_op_add_8_re_pd7 , 0xf1ff, 0xd127, { 14, 14, 9, 9}}, + {m68k_op_add_8_re_aw , 0xf1ff, 0xd138, { 16, 16, 8, 8}}, + {m68k_op_add_8_re_al , 0xf1ff, 0xd139, { 20, 20, 8, 8}}, + {m68k_op_add_16_re_aw , 0xf1ff, 0xd178, { 16, 16, 8, 8}}, + {m68k_op_add_16_re_al , 0xf1ff, 0xd179, { 20, 20, 8, 8}}, + {m68k_op_add_32_re_aw , 0xf1ff, 0xd1b8, { 24, 24, 8, 8}}, + {m68k_op_add_32_re_al , 0xf1ff, 0xd1b9, { 28, 28, 8, 8}}, + {m68k_op_adda_32_aw , 0xf1ff, 0xd1f8, { 18, 18, 6, 6}}, + {m68k_op_adda_32_al , 0xf1ff, 0xd1f9, { 22, 22, 6, 6}}, + {m68k_op_adda_32_pcdi , 0xf1ff, 0xd1fa, { 18, 18, 7, 7}}, + {m68k_op_adda_32_pcix , 0xf1ff, 0xd1fb, { 20, 20, 9, 9}}, + {m68k_op_adda_32_i , 0xf1ff, 0xd1fc, { 16, 14, 6, 6}}, + {m68k_op_ori_8_d , 0xfff8, 0x0000, { 8, 8, 2, 2}}, + {m68k_op_ori_8_ai , 0xfff8, 0x0010, { 16, 16, 8, 8}}, + {m68k_op_ori_8_pi , 0xfff8, 0x0018, { 16, 16, 8, 8}}, + {m68k_op_ori_8_pd , 0xfff8, 0x0020, { 18, 18, 9, 9}}, + {m68k_op_ori_8_di , 0xfff8, 0x0028, { 20, 20, 9, 9}}, + {m68k_op_ori_8_ix , 0xfff8, 0x0030, { 22, 22, 11, 11}}, + {m68k_op_ori_16_d , 0xfff8, 0x0040, { 8, 8, 2, 2}}, + {m68k_op_ori_16_ai , 0xfff8, 0x0050, { 16, 16, 8, 8}}, + {m68k_op_ori_16_pi , 0xfff8, 0x0058, { 16, 16, 8, 8}}, + {m68k_op_ori_16_pd , 0xfff8, 0x0060, { 18, 18, 9, 9}}, + {m68k_op_ori_16_di , 0xfff8, 0x0068, { 20, 20, 9, 9}}, + {m68k_op_ori_16_ix , 0xfff8, 0x0070, { 22, 22, 11, 11}}, + {m68k_op_ori_32_d , 0xfff8, 0x0080, { 16, 14, 2, 2}}, + {m68k_op_ori_32_ai , 0xfff8, 0x0090, { 28, 28, 8, 8}}, + {m68k_op_ori_32_pi , 0xfff8, 0x0098, { 28, 28, 8, 8}}, + {m68k_op_ori_32_pd , 0xfff8, 0x00a0, { 30, 30, 9, 9}}, + {m68k_op_ori_32_di , 0xfff8, 0x00a8, { 32, 32, 9, 9}}, + {m68k_op_ori_32_ix , 0xfff8, 0x00b0, { 34, 34, 11, 11}}, + {m68k_op_chk2cmp2_8_ai , 0xfff8, 0x00d0, { 0, 0, 22, 22}}, + {m68k_op_chk2cmp2_8_di , 0xfff8, 0x00e8, { 0, 0, 23, 23}}, + {m68k_op_chk2cmp2_8_ix , 0xfff8, 0x00f0, { 0, 0, 25, 25}}, + {m68k_op_andi_8_d , 0xfff8, 0x0200, { 8, 8, 2, 2}}, + {m68k_op_andi_8_ai , 0xfff8, 0x0210, { 16, 16, 8, 8}}, + {m68k_op_andi_8_pi , 0xfff8, 0x0218, { 16, 16, 8, 8}}, + {m68k_op_andi_8_pd , 0xfff8, 0x0220, { 18, 18, 9, 9}}, + {m68k_op_andi_8_di , 0xfff8, 0x0228, { 20, 20, 9, 9}}, + {m68k_op_andi_8_ix , 0xfff8, 0x0230, { 22, 22, 11, 11}}, + {m68k_op_andi_16_d , 0xfff8, 0x0240, { 8, 8, 2, 2}}, + {m68k_op_andi_16_ai , 0xfff8, 0x0250, { 16, 16, 8, 8}}, + {m68k_op_andi_16_pi , 0xfff8, 0x0258, { 16, 16, 8, 8}}, + {m68k_op_andi_16_pd , 0xfff8, 0x0260, { 18, 18, 9, 9}}, + {m68k_op_andi_16_di , 0xfff8, 0x0268, { 20, 20, 9, 9}}, + {m68k_op_andi_16_ix , 0xfff8, 0x0270, { 22, 22, 11, 11}}, + {m68k_op_andi_32_d , 0xfff8, 0x0280, { 14, 14, 2, 2}}, + {m68k_op_andi_32_ai , 0xfff8, 0x0290, { 28, 28, 8, 8}}, + {m68k_op_andi_32_pi , 0xfff8, 0x0298, { 28, 28, 8, 8}}, + {m68k_op_andi_32_pd , 0xfff8, 0x02a0, { 30, 30, 9, 9}}, + {m68k_op_andi_32_di , 0xfff8, 0x02a8, { 32, 32, 9, 9}}, + {m68k_op_andi_32_ix , 0xfff8, 0x02b0, { 34, 34, 11, 11}}, + {m68k_op_chk2cmp2_16_ai , 0xfff8, 0x02d0, { 0, 0, 22, 22}}, + {m68k_op_chk2cmp2_16_di , 0xfff8, 0x02e8, { 0, 0, 23, 23}}, + {m68k_op_chk2cmp2_16_ix , 0xfff8, 0x02f0, { 0, 0, 25, 25}}, + {m68k_op_subi_8_d , 0xfff8, 0x0400, { 8, 8, 2, 2}}, + {m68k_op_subi_8_ai , 0xfff8, 0x0410, { 16, 16, 8, 8}}, + {m68k_op_subi_8_pi , 0xfff8, 0x0418, { 16, 16, 8, 8}}, + {m68k_op_subi_8_pd , 0xfff8, 0x0420, { 18, 18, 9, 9}}, + {m68k_op_subi_8_di , 0xfff8, 0x0428, { 20, 20, 9, 9}}, + {m68k_op_subi_8_ix , 0xfff8, 0x0430, { 22, 22, 11, 11}}, + {m68k_op_subi_16_d , 0xfff8, 0x0440, { 8, 8, 2, 2}}, + {m68k_op_subi_16_ai , 0xfff8, 0x0450, { 16, 16, 8, 8}}, + {m68k_op_subi_16_pi , 0xfff8, 0x0458, { 16, 16, 8, 8}}, + {m68k_op_subi_16_pd , 0xfff8, 0x0460, { 18, 18, 9, 9}}, + {m68k_op_subi_16_di , 0xfff8, 0x0468, { 20, 20, 9, 9}}, + {m68k_op_subi_16_ix , 0xfff8, 0x0470, { 22, 22, 11, 11}}, + {m68k_op_subi_32_d , 0xfff8, 0x0480, { 16, 14, 2, 2}}, + {m68k_op_subi_32_ai , 0xfff8, 0x0490, { 28, 28, 8, 8}}, + {m68k_op_subi_32_pi , 0xfff8, 0x0498, { 28, 28, 8, 8}}, + {m68k_op_subi_32_pd , 0xfff8, 0x04a0, { 30, 30, 9, 9}}, + {m68k_op_subi_32_di , 0xfff8, 0x04a8, { 32, 32, 9, 9}}, + {m68k_op_subi_32_ix , 0xfff8, 0x04b0, { 34, 34, 11, 11}}, + {m68k_op_chk2cmp2_32_ai , 0xfff8, 0x04d0, { 0, 0, 22, 22}}, + {m68k_op_chk2cmp2_32_di , 0xfff8, 0x04e8, { 0, 0, 23, 23}}, + {m68k_op_chk2cmp2_32_ix , 0xfff8, 0x04f0, { 0, 0, 25, 25}}, + {m68k_op_addi_8_d , 0xfff8, 0x0600, { 8, 8, 2, 2}}, + {m68k_op_addi_8_ai , 0xfff8, 0x0610, { 16, 16, 8, 8}}, + {m68k_op_addi_8_pi , 0xfff8, 0x0618, { 16, 16, 8, 8}}, + {m68k_op_addi_8_pd , 0xfff8, 0x0620, { 18, 18, 9, 9}}, + {m68k_op_addi_8_di , 0xfff8, 0x0628, { 20, 20, 9, 9}}, + {m68k_op_addi_8_ix , 0xfff8, 0x0630, { 22, 22, 11, 11}}, + {m68k_op_addi_16_d , 0xfff8, 0x0640, { 8, 8, 2, 2}}, + {m68k_op_addi_16_ai , 0xfff8, 0x0650, { 16, 16, 8, 8}}, + {m68k_op_addi_16_pi , 0xfff8, 0x0658, { 16, 16, 8, 8}}, + {m68k_op_addi_16_pd , 0xfff8, 0x0660, { 18, 18, 9, 9}}, + {m68k_op_addi_16_di , 0xfff8, 0x0668, { 20, 20, 9, 9}}, + {m68k_op_addi_16_ix , 0xfff8, 0x0670, { 22, 22, 11, 11}}, + {m68k_op_addi_32_d , 0xfff8, 0x0680, { 16, 14, 2, 2}}, + {m68k_op_addi_32_ai , 0xfff8, 0x0690, { 28, 28, 8, 8}}, + {m68k_op_addi_32_pi , 0xfff8, 0x0698, { 28, 28, 8, 8}}, + {m68k_op_addi_32_pd , 0xfff8, 0x06a0, { 30, 30, 9, 9}}, + {m68k_op_addi_32_di , 0xfff8, 0x06a8, { 32, 32, 9, 9}}, + {m68k_op_addi_32_ix , 0xfff8, 0x06b0, { 34, 34, 11, 11}}, + {m68k_op_callm_32_ai , 0xfff8, 0x06d0, { 0, 0, 64, 64}}, + {m68k_op_callm_32_di , 0xfff8, 0x06e8, { 0, 0, 65, 65}}, + {m68k_op_callm_32_ix , 0xfff8, 0x06f0, { 0, 0, 67, 67}}, + {m68k_op_btst_32_s_d , 0xfff8, 0x0800, { 10, 10, 4, 4}}, + {m68k_op_btst_8_s_ai , 0xfff8, 0x0810, { 12, 12, 8, 8}}, + {m68k_op_btst_8_s_pi , 0xfff8, 0x0818, { 12, 12, 8, 8}}, + {m68k_op_btst_8_s_pd , 0xfff8, 0x0820, { 14, 14, 9, 9}}, + {m68k_op_btst_8_s_di , 0xfff8, 0x0828, { 16, 16, 9, 9}}, + {m68k_op_btst_8_s_ix , 0xfff8, 0x0830, { 18, 18, 11, 11}}, + {m68k_op_bchg_32_s_d , 0xfff8, 0x0840, { 12, 12, 4, 4}}, + {m68k_op_bchg_8_s_ai , 0xfff8, 0x0850, { 16, 16, 8, 8}}, + {m68k_op_bchg_8_s_pi , 0xfff8, 0x0858, { 16, 16, 8, 8}}, + {m68k_op_bchg_8_s_pd , 0xfff8, 0x0860, { 18, 18, 9, 9}}, + {m68k_op_bchg_8_s_di , 0xfff8, 0x0868, { 20, 20, 9, 9}}, + {m68k_op_bchg_8_s_ix , 0xfff8, 0x0870, { 22, 22, 11, 11}}, + {m68k_op_bclr_32_s_d , 0xfff8, 0x0880, { 14, 14, 4, 4}}, + {m68k_op_bclr_8_s_ai , 0xfff8, 0x0890, { 16, 16, 8, 8}}, + {m68k_op_bclr_8_s_pi , 0xfff8, 0x0898, { 16, 16, 8, 8}}, + {m68k_op_bclr_8_s_pd , 0xfff8, 0x08a0, { 18, 18, 9, 9}}, + {m68k_op_bclr_8_s_di , 0xfff8, 0x08a8, { 20, 20, 9, 9}}, + {m68k_op_bclr_8_s_ix , 0xfff8, 0x08b0, { 22, 22, 11, 11}}, + {m68k_op_bset_32_s_d , 0xfff8, 0x08c0, { 12, 12, 4, 4}}, + {m68k_op_bset_8_s_ai , 0xfff8, 0x08d0, { 16, 16, 8, 8}}, + {m68k_op_bset_8_s_pi , 0xfff8, 0x08d8, { 16, 16, 8, 8}}, + {m68k_op_bset_8_s_pd , 0xfff8, 0x08e0, { 18, 18, 9, 9}}, + {m68k_op_bset_8_s_di , 0xfff8, 0x08e8, { 20, 20, 9, 9}}, + {m68k_op_bset_8_s_ix , 0xfff8, 0x08f0, { 22, 22, 11, 11}}, + {m68k_op_eori_8_d , 0xfff8, 0x0a00, { 8, 8, 2, 2}}, + {m68k_op_eori_8_ai , 0xfff8, 0x0a10, { 16, 16, 8, 8}}, + {m68k_op_eori_8_pi , 0xfff8, 0x0a18, { 16, 16, 8, 8}}, + {m68k_op_eori_8_pd , 0xfff8, 0x0a20, { 18, 18, 9, 9}}, + {m68k_op_eori_8_di , 0xfff8, 0x0a28, { 20, 20, 9, 9}}, + {m68k_op_eori_8_ix , 0xfff8, 0x0a30, { 22, 22, 11, 11}}, + {m68k_op_eori_16_d , 0xfff8, 0x0a40, { 8, 8, 2, 2}}, + {m68k_op_eori_16_ai , 0xfff8, 0x0a50, { 16, 16, 8, 8}}, + {m68k_op_eori_16_pi , 0xfff8, 0x0a58, { 16, 16, 8, 8}}, + {m68k_op_eori_16_pd , 0xfff8, 0x0a60, { 18, 18, 9, 9}}, + {m68k_op_eori_16_di , 0xfff8, 0x0a68, { 20, 20, 9, 9}}, + {m68k_op_eori_16_ix , 0xfff8, 0x0a70, { 22, 22, 11, 11}}, + {m68k_op_eori_32_d , 0xfff8, 0x0a80, { 16, 14, 2, 2}}, + {m68k_op_eori_32_ai , 0xfff8, 0x0a90, { 28, 28, 8, 8}}, + {m68k_op_eori_32_pi , 0xfff8, 0x0a98, { 28, 28, 8, 8}}, + {m68k_op_eori_32_pd , 0xfff8, 0x0aa0, { 30, 30, 9, 9}}, + {m68k_op_eori_32_di , 0xfff8, 0x0aa8, { 32, 32, 9, 9}}, + {m68k_op_eori_32_ix , 0xfff8, 0x0ab0, { 34, 34, 11, 11}}, + {m68k_op_cas_8_ai , 0xfff8, 0x0ad0, { 0, 0, 16, 16}}, + {m68k_op_cas_8_pi , 0xfff8, 0x0ad8, { 0, 0, 16, 16}}, + {m68k_op_cas_8_pd , 0xfff8, 0x0ae0, { 0, 0, 17, 17}}, + {m68k_op_cas_8_di , 0xfff8, 0x0ae8, { 0, 0, 17, 17}}, + {m68k_op_cas_8_ix , 0xfff8, 0x0af0, { 0, 0, 19, 19}}, + {m68k_op_cmpi_8_d , 0xfff8, 0x0c00, { 8, 8, 2, 2}}, + {m68k_op_cmpi_8_ai , 0xfff8, 0x0c10, { 12, 12, 6, 6}}, + {m68k_op_cmpi_8_pi , 0xfff8, 0x0c18, { 12, 12, 6, 6}}, + {m68k_op_cmpi_8_pd , 0xfff8, 0x0c20, { 14, 14, 7, 7}}, + {m68k_op_cmpi_8_di , 0xfff8, 0x0c28, { 16, 16, 7, 7}}, + {m68k_op_cmpi_8_ix , 0xfff8, 0x0c30, { 18, 18, 9, 9}}, + {m68k_op_cmpi_16_d , 0xfff8, 0x0c40, { 8, 8, 2, 2}}, + {m68k_op_cmpi_16_ai , 0xfff8, 0x0c50, { 12, 12, 6, 6}}, + {m68k_op_cmpi_16_pi , 0xfff8, 0x0c58, { 12, 12, 6, 6}}, + {m68k_op_cmpi_16_pd , 0xfff8, 0x0c60, { 14, 14, 7, 7}}, + {m68k_op_cmpi_16_di , 0xfff8, 0x0c68, { 16, 16, 7, 7}}, + {m68k_op_cmpi_16_ix , 0xfff8, 0x0c70, { 18, 18, 9, 9}}, + {m68k_op_cmpi_32_d , 0xfff8, 0x0c80, { 14, 12, 2, 2}}, + {m68k_op_cmpi_32_ai , 0xfff8, 0x0c90, { 20, 20, 6, 6}}, + {m68k_op_cmpi_32_pi , 0xfff8, 0x0c98, { 20, 20, 6, 6}}, + {m68k_op_cmpi_32_pd , 0xfff8, 0x0ca0, { 22, 22, 7, 7}}, + {m68k_op_cmpi_32_di , 0xfff8, 0x0ca8, { 24, 24, 7, 7}}, + {m68k_op_cmpi_32_ix , 0xfff8, 0x0cb0, { 26, 26, 9, 9}}, + {m68k_op_cas_16_ai , 0xfff8, 0x0cd0, { 0, 0, 16, 16}}, + {m68k_op_cas_16_pi , 0xfff8, 0x0cd8, { 0, 0, 16, 16}}, + {m68k_op_cas_16_pd , 0xfff8, 0x0ce0, { 0, 0, 17, 17}}, + {m68k_op_cas_16_di , 0xfff8, 0x0ce8, { 0, 0, 17, 17}}, + {m68k_op_cas_16_ix , 0xfff8, 0x0cf0, { 0, 0, 19, 19}}, + {m68k_op_moves_8_ai , 0xfff8, 0x0e10, { 0, 18, 9, 9}}, + {m68k_op_moves_8_pi , 0xfff8, 0x0e18, { 0, 18, 9, 9}}, + {m68k_op_moves_8_pd , 0xfff8, 0x0e20, { 0, 20, 10, 10}}, + {m68k_op_moves_8_di , 0xfff8, 0x0e28, { 0, 26, 10, 10}}, + {m68k_op_moves_8_ix , 0xfff8, 0x0e30, { 0, 30, 12, 12}}, + {m68k_op_moves_16_ai , 0xfff8, 0x0e50, { 0, 18, 9, 9}}, + {m68k_op_moves_16_pi , 0xfff8, 0x0e58, { 0, 18, 9, 9}}, + {m68k_op_moves_16_pd , 0xfff8, 0x0e60, { 0, 20, 10, 10}}, + {m68k_op_moves_16_di , 0xfff8, 0x0e68, { 0, 26, 10, 10}}, + {m68k_op_moves_16_ix , 0xfff8, 0x0e70, { 0, 30, 12, 12}}, + {m68k_op_moves_32_ai , 0xfff8, 0x0e90, { 0, 22, 9, 9}}, + {m68k_op_moves_32_pi , 0xfff8, 0x0e98, { 0, 22, 9, 9}}, + {m68k_op_moves_32_pd , 0xfff8, 0x0ea0, { 0, 28, 10, 10}}, + {m68k_op_moves_32_di , 0xfff8, 0x0ea8, { 0, 32, 10, 10}}, + {m68k_op_moves_32_ix , 0xfff8, 0x0eb0, { 0, 36, 12, 12}}, + {m68k_op_cas_32_ai , 0xfff8, 0x0ed0, { 0, 0, 16, 16}}, + {m68k_op_cas_32_pi , 0xfff8, 0x0ed8, { 0, 0, 16, 16}}, + {m68k_op_cas_32_pd , 0xfff8, 0x0ee0, { 0, 0, 17, 17}}, + {m68k_op_cas_32_di , 0xfff8, 0x0ee8, { 0, 0, 17, 17}}, + {m68k_op_cas_32_ix , 0xfff8, 0x0ef0, { 0, 0, 19, 19}}, + {m68k_op_move_8_aw_d , 0xfff8, 0x11c0, { 12, 12, 4, 4}}, + {m68k_op_move_8_aw_ai , 0xfff8, 0x11d0, { 16, 16, 8, 8}}, + {m68k_op_move_8_aw_pi , 0xfff8, 0x11d8, { 16, 16, 8, 8}}, + {m68k_op_move_8_aw_pd , 0xfff8, 0x11e0, { 18, 18, 9, 9}}, + {m68k_op_move_8_aw_di , 0xfff8, 0x11e8, { 20, 20, 9, 9}}, + {m68k_op_move_8_aw_ix , 0xfff8, 0x11f0, { 22, 22, 11, 11}}, + {m68k_op_move_8_al_d , 0xfff8, 0x13c0, { 16, 16, 6, 6}}, + {m68k_op_move_8_al_ai , 0xfff8, 0x13d0, { 20, 20, 10, 10}}, + {m68k_op_move_8_al_pi , 0xfff8, 0x13d8, { 20, 20, 10, 10}}, + {m68k_op_move_8_al_pd , 0xfff8, 0x13e0, { 22, 22, 11, 11}}, + {m68k_op_move_8_al_di , 0xfff8, 0x13e8, { 24, 24, 11, 11}}, + {m68k_op_move_8_al_ix , 0xfff8, 0x13f0, { 26, 26, 13, 13}}, + {m68k_op_move_8_pi7_d , 0xfff8, 0x1ec0, { 8, 8, 4, 4}}, + {m68k_op_move_8_pi7_ai , 0xfff8, 0x1ed0, { 12, 12, 8, 8}}, + {m68k_op_move_8_pi7_pi , 0xfff8, 0x1ed8, { 12, 12, 8, 8}}, + {m68k_op_move_8_pi7_pd , 0xfff8, 0x1ee0, { 14, 14, 9, 9}}, + {m68k_op_move_8_pi7_di , 0xfff8, 0x1ee8, { 16, 16, 9, 9}}, + {m68k_op_move_8_pi7_ix , 0xfff8, 0x1ef0, { 18, 18, 11, 11}}, + {m68k_op_move_8_pd7_d , 0xfff8, 0x1f00, { 8, 8, 5, 5}}, + {m68k_op_move_8_pd7_ai , 0xfff8, 0x1f10, { 12, 12, 9, 9}}, + {m68k_op_move_8_pd7_pi , 0xfff8, 0x1f18, { 12, 12, 9, 9}}, + {m68k_op_move_8_pd7_pd , 0xfff8, 0x1f20, { 14, 14, 10, 10}}, + {m68k_op_move_8_pd7_di , 0xfff8, 0x1f28, { 16, 16, 10, 10}}, + {m68k_op_move_8_pd7_ix , 0xfff8, 0x1f30, { 18, 18, 12, 12}}, + {m68k_op_move_32_aw_d , 0xfff8, 0x21c0, { 16, 16, 4, 4}}, + {m68k_op_move_32_aw_a , 0xfff8, 0x21c8, { 16, 16, 4, 4}}, + {m68k_op_move_32_aw_ai , 0xfff8, 0x21d0, { 24, 24, 8, 8}}, + {m68k_op_move_32_aw_pi , 0xfff8, 0x21d8, { 24, 24, 8, 8}}, + {m68k_op_move_32_aw_pd , 0xfff8, 0x21e0, { 26, 26, 9, 9}}, + {m68k_op_move_32_aw_di , 0xfff8, 0x21e8, { 28, 28, 9, 9}}, + {m68k_op_move_32_aw_ix , 0xfff8, 0x21f0, { 30, 30, 11, 11}}, + {m68k_op_move_32_al_d , 0xfff8, 0x23c0, { 20, 20, 6, 6}}, + {m68k_op_move_32_al_a , 0xfff8, 0x23c8, { 20, 20, 6, 6}}, + {m68k_op_move_32_al_ai , 0xfff8, 0x23d0, { 28, 28, 10, 10}}, + {m68k_op_move_32_al_pi , 0xfff8, 0x23d8, { 28, 28, 10, 10}}, + {m68k_op_move_32_al_pd , 0xfff8, 0x23e0, { 30, 30, 11, 11}}, + {m68k_op_move_32_al_di , 0xfff8, 0x23e8, { 32, 32, 11, 11}}, + {m68k_op_move_32_al_ix , 0xfff8, 0x23f0, { 34, 34, 13, 13}}, + {m68k_op_move_16_aw_d , 0xfff8, 0x31c0, { 12, 12, 4, 4}}, + {m68k_op_move_16_aw_a , 0xfff8, 0x31c8, { 12, 12, 4, 4}}, + {m68k_op_move_16_aw_ai , 0xfff8, 0x31d0, { 16, 16, 8, 8}}, + {m68k_op_move_16_aw_pi , 0xfff8, 0x31d8, { 16, 16, 8, 8}}, + {m68k_op_move_16_aw_pd , 0xfff8, 0x31e0, { 18, 18, 9, 9}}, + {m68k_op_move_16_aw_di , 0xfff8, 0x31e8, { 20, 20, 9, 9}}, + {m68k_op_move_16_aw_ix , 0xfff8, 0x31f0, { 22, 22, 11, 11}}, + {m68k_op_move_16_al_d , 0xfff8, 0x33c0, { 16, 16, 6, 6}}, + {m68k_op_move_16_al_a , 0xfff8, 0x33c8, { 16, 16, 6, 6}}, + {m68k_op_move_16_al_ai , 0xfff8, 0x33d0, { 20, 20, 10, 10}}, + {m68k_op_move_16_al_pi , 0xfff8, 0x33d8, { 20, 20, 10, 10}}, + {m68k_op_move_16_al_pd , 0xfff8, 0x33e0, { 22, 22, 11, 11}}, + {m68k_op_move_16_al_di , 0xfff8, 0x33e8, { 24, 24, 11, 11}}, + {m68k_op_move_16_al_ix , 0xfff8, 0x33f0, { 26, 26, 13, 13}}, + {m68k_op_negx_8_d , 0xfff8, 0x4000, { 4, 4, 2, 2}}, + {m68k_op_negx_8_ai , 0xfff8, 0x4010, { 12, 12, 8, 8}}, + {m68k_op_negx_8_pi , 0xfff8, 0x4018, { 12, 12, 8, 8}}, + {m68k_op_negx_8_pd , 0xfff8, 0x4020, { 14, 14, 9, 9}}, + {m68k_op_negx_8_di , 0xfff8, 0x4028, { 16, 16, 9, 9}}, + {m68k_op_negx_8_ix , 0xfff8, 0x4030, { 18, 18, 11, 11}}, + {m68k_op_negx_16_d , 0xfff8, 0x4040, { 4, 4, 2, 2}}, + {m68k_op_negx_16_ai , 0xfff8, 0x4050, { 12, 12, 8, 8}}, + {m68k_op_negx_16_pi , 0xfff8, 0x4058, { 12, 12, 8, 8}}, + {m68k_op_negx_16_pd , 0xfff8, 0x4060, { 14, 14, 9, 9}}, + {m68k_op_negx_16_di , 0xfff8, 0x4068, { 16, 16, 9, 9}}, + {m68k_op_negx_16_ix , 0xfff8, 0x4070, { 18, 18, 11, 11}}, + {m68k_op_negx_32_d , 0xfff8, 0x4080, { 6, 6, 2, 2}}, + {m68k_op_negx_32_ai , 0xfff8, 0x4090, { 20, 20, 8, 8}}, + {m68k_op_negx_32_pi , 0xfff8, 0x4098, { 20, 20, 8, 8}}, + {m68k_op_negx_32_pd , 0xfff8, 0x40a0, { 22, 22, 9, 9}}, + {m68k_op_negx_32_di , 0xfff8, 0x40a8, { 24, 24, 9, 9}}, + {m68k_op_negx_32_ix , 0xfff8, 0x40b0, { 26, 26, 11, 11}}, + {m68k_op_move_16_frs_d , 0xfff8, 0x40c0, { 6, 4, 8, 8}}, + {m68k_op_move_16_frs_ai , 0xfff8, 0x40d0, { 12, 12, 12, 12}}, + {m68k_op_move_16_frs_pi , 0xfff8, 0x40d8, { 12, 12, 12, 12}}, + {m68k_op_move_16_frs_pd , 0xfff8, 0x40e0, { 14, 14, 13, 13}}, + {m68k_op_move_16_frs_di , 0xfff8, 0x40e8, { 16, 16, 13, 13}}, + {m68k_op_move_16_frs_ix , 0xfff8, 0x40f0, { 18, 18, 15, 15}}, + {m68k_op_clr_8_d , 0xfff8, 0x4200, { 4, 4, 2, 2}}, + {m68k_op_clr_8_ai , 0xfff8, 0x4210, { 12, 8, 8, 8}}, + {m68k_op_clr_8_pi , 0xfff8, 0x4218, { 12, 8, 8, 8}}, + {m68k_op_clr_8_pd , 0xfff8, 0x4220, { 14, 10, 9, 9}}, + {m68k_op_clr_8_di , 0xfff8, 0x4228, { 16, 12, 9, 9}}, + {m68k_op_clr_8_ix , 0xfff8, 0x4230, { 18, 14, 11, 11}}, + {m68k_op_clr_16_d , 0xfff8, 0x4240, { 4, 4, 2, 2}}, + {m68k_op_clr_16_ai , 0xfff8, 0x4250, { 12, 8, 8, 8}}, + {m68k_op_clr_16_pi , 0xfff8, 0x4258, { 12, 8, 8, 8}}, + {m68k_op_clr_16_pd , 0xfff8, 0x4260, { 14, 10, 9, 9}}, + {m68k_op_clr_16_di , 0xfff8, 0x4268, { 16, 12, 9, 9}}, + {m68k_op_clr_16_ix , 0xfff8, 0x4270, { 18, 14, 11, 11}}, + {m68k_op_clr_32_d , 0xfff8, 0x4280, { 6, 6, 2, 2}}, + {m68k_op_clr_32_ai , 0xfff8, 0x4290, { 20, 12, 8, 8}}, + {m68k_op_clr_32_pi , 0xfff8, 0x4298, { 20, 12, 8, 8}}, + {m68k_op_clr_32_pd , 0xfff8, 0x42a0, { 22, 14, 9, 9}}, + {m68k_op_clr_32_di , 0xfff8, 0x42a8, { 24, 16, 9, 9}}, + {m68k_op_clr_32_ix , 0xfff8, 0x42b0, { 26, 20, 11, 11}}, + {m68k_op_move_16_frc_d , 0xfff8, 0x42c0, { 0, 4, 4, 4}}, + {m68k_op_move_16_frc_ai , 0xfff8, 0x42d0, { 0, 12, 8, 8}}, + {m68k_op_move_16_frc_pi , 0xfff8, 0x42d8, { 0, 12, 8, 8}}, + {m68k_op_move_16_frc_pd , 0xfff8, 0x42e0, { 0, 14, 9, 9}}, + {m68k_op_move_16_frc_di , 0xfff8, 0x42e8, { 0, 16, 9, 9}}, + {m68k_op_move_16_frc_ix , 0xfff8, 0x42f0, { 0, 18, 11, 11}}, + {m68k_op_neg_8_d , 0xfff8, 0x4400, { 4, 4, 2, 2}}, + {m68k_op_neg_8_ai , 0xfff8, 0x4410, { 12, 12, 8, 8}}, + {m68k_op_neg_8_pi , 0xfff8, 0x4418, { 12, 12, 8, 8}}, + {m68k_op_neg_8_pd , 0xfff8, 0x4420, { 14, 14, 9, 9}}, + {m68k_op_neg_8_di , 0xfff8, 0x4428, { 16, 16, 9, 9}}, + {m68k_op_neg_8_ix , 0xfff8, 0x4430, { 18, 18, 11, 11}}, + {m68k_op_neg_16_d , 0xfff8, 0x4440, { 4, 4, 2, 2}}, + {m68k_op_neg_16_ai , 0xfff8, 0x4450, { 12, 12, 8, 8}}, + {m68k_op_neg_16_pi , 0xfff8, 0x4458, { 12, 12, 8, 8}}, + {m68k_op_neg_16_pd , 0xfff8, 0x4460, { 14, 14, 9, 9}}, + {m68k_op_neg_16_di , 0xfff8, 0x4468, { 16, 16, 9, 9}}, + {m68k_op_neg_16_ix , 0xfff8, 0x4470, { 18, 18, 11, 11}}, + {m68k_op_neg_32_d , 0xfff8, 0x4480, { 6, 6, 2, 2}}, + {m68k_op_neg_32_ai , 0xfff8, 0x4490, { 20, 20, 8, 8}}, + {m68k_op_neg_32_pi , 0xfff8, 0x4498, { 20, 20, 8, 8}}, + {m68k_op_neg_32_pd , 0xfff8, 0x44a0, { 22, 22, 9, 9}}, + {m68k_op_neg_32_di , 0xfff8, 0x44a8, { 24, 24, 9, 9}}, + {m68k_op_neg_32_ix , 0xfff8, 0x44b0, { 26, 26, 11, 11}}, + {m68k_op_move_16_toc_d , 0xfff8, 0x44c0, { 12, 12, 4, 4}}, + {m68k_op_move_16_toc_ai , 0xfff8, 0x44d0, { 16, 16, 8, 8}}, + {m68k_op_move_16_toc_pi , 0xfff8, 0x44d8, { 16, 16, 8, 8}}, + {m68k_op_move_16_toc_pd , 0xfff8, 0x44e0, { 18, 18, 9, 9}}, + {m68k_op_move_16_toc_di , 0xfff8, 0x44e8, { 20, 20, 9, 9}}, + {m68k_op_move_16_toc_ix , 0xfff8, 0x44f0, { 22, 22, 11, 11}}, + {m68k_op_not_8_d , 0xfff8, 0x4600, { 4, 4, 2, 2}}, + {m68k_op_not_8_ai , 0xfff8, 0x4610, { 12, 12, 8, 8}}, + {m68k_op_not_8_pi , 0xfff8, 0x4618, { 12, 12, 8, 8}}, + {m68k_op_not_8_pd , 0xfff8, 0x4620, { 14, 14, 9, 9}}, + {m68k_op_not_8_di , 0xfff8, 0x4628, { 16, 16, 9, 9}}, + {m68k_op_not_8_ix , 0xfff8, 0x4630, { 18, 18, 11, 11}}, + {m68k_op_not_16_d , 0xfff8, 0x4640, { 4, 4, 2, 2}}, + {m68k_op_not_16_ai , 0xfff8, 0x4650, { 12, 12, 8, 8}}, + {m68k_op_not_16_pi , 0xfff8, 0x4658, { 12, 12, 8, 8}}, + {m68k_op_not_16_pd , 0xfff8, 0x4660, { 14, 14, 9, 9}}, + {m68k_op_not_16_di , 0xfff8, 0x4668, { 16, 16, 9, 9}}, + {m68k_op_not_16_ix , 0xfff8, 0x4670, { 18, 18, 11, 11}}, + {m68k_op_not_32_d , 0xfff8, 0x4680, { 6, 6, 2, 2}}, + {m68k_op_not_32_ai , 0xfff8, 0x4690, { 20, 20, 8, 8}}, + {m68k_op_not_32_pi , 0xfff8, 0x4698, { 20, 20, 8, 8}}, + {m68k_op_not_32_pd , 0xfff8, 0x46a0, { 22, 22, 9, 9}}, + {m68k_op_not_32_di , 0xfff8, 0x46a8, { 24, 24, 9, 9}}, + {m68k_op_not_32_ix , 0xfff8, 0x46b0, { 26, 26, 11, 11}}, + {m68k_op_move_16_tos_d , 0xfff8, 0x46c0, { 12, 12, 8, 8}}, + {m68k_op_move_16_tos_ai , 0xfff8, 0x46d0, { 16, 16, 12, 12}}, + {m68k_op_move_16_tos_pi , 0xfff8, 0x46d8, { 16, 16, 12, 12}}, + {m68k_op_move_16_tos_pd , 0xfff8, 0x46e0, { 18, 18, 13, 13}}, + {m68k_op_move_16_tos_di , 0xfff8, 0x46e8, { 20, 20, 13, 13}}, + {m68k_op_move_16_tos_ix , 0xfff8, 0x46f0, { 22, 22, 15, 15}}, + {m68k_op_nbcd_8_d , 0xfff8, 0x4800, { 6, 6, 6, 6}}, + {m68k_op_link_32 , 0xfff8, 0x4808, { 0, 0, 6, 6}}, + {m68k_op_nbcd_8_ai , 0xfff8, 0x4810, { 12, 12, 10, 10}}, + {m68k_op_nbcd_8_pi , 0xfff8, 0x4818, { 12, 12, 10, 10}}, + {m68k_op_nbcd_8_pd , 0xfff8, 0x4820, { 14, 14, 11, 11}}, + {m68k_op_nbcd_8_di , 0xfff8, 0x4828, { 16, 16, 11, 11}}, + {m68k_op_nbcd_8_ix , 0xfff8, 0x4830, { 18, 18, 13, 13}}, + {m68k_op_swap_32 , 0xfff8, 0x4840, { 4, 4, 4, 4}}, + {m68k_op_bkpt , 0xfff8, 0x4848, { 0, 10, 10, 10}}, + {m68k_op_pea_32_ai , 0xfff8, 0x4850, { 12, 12, 9, 9}}, + {m68k_op_pea_32_di , 0xfff8, 0x4868, { 16, 16, 10, 10}}, + {m68k_op_pea_32_ix , 0xfff8, 0x4870, { 20, 20, 12, 12}}, + {m68k_op_ext_16 , 0xfff8, 0x4880, { 4, 4, 4, 4}}, + {m68k_op_movem_16_re_ai , 0xfff8, 0x4890, { 8, 8, 8, 8}}, + {m68k_op_movem_16_re_pd , 0xfff8, 0x48a0, { 8, 8, 4, 4}}, + {m68k_op_movem_16_re_di , 0xfff8, 0x48a8, { 12, 12, 9, 9}}, + {m68k_op_movem_16_re_ix , 0xfff8, 0x48b0, { 14, 14, 11, 11}}, + {m68k_op_ext_32 , 0xfff8, 0x48c0, { 4, 4, 4, 4}}, + {m68k_op_movem_32_re_ai , 0xfff8, 0x48d0, { 8, 8, 8, 8}}, + {m68k_op_movem_32_re_pd , 0xfff8, 0x48e0, { 8, 8, 4, 4}}, + {m68k_op_movem_32_re_di , 0xfff8, 0x48e8, { 12, 12, 9, 9}}, + {m68k_op_movem_32_re_ix , 0xfff8, 0x48f0, { 14, 14, 11, 11}}, + {m68k_op_extb_32 , 0xfff8, 0x49c0, { 0, 0, 4, 4}}, + {m68k_op_tst_8_d , 0xfff8, 0x4a00, { 4, 4, 2, 2}}, + {m68k_op_tst_8_ai , 0xfff8, 0x4a10, { 8, 8, 6, 6}}, + {m68k_op_tst_8_pi , 0xfff8, 0x4a18, { 8, 8, 6, 6}}, + {m68k_op_tst_8_pd , 0xfff8, 0x4a20, { 10, 10, 7, 7}}, + {m68k_op_tst_8_di , 0xfff8, 0x4a28, { 12, 12, 7, 7}}, + {m68k_op_tst_8_ix , 0xfff8, 0x4a30, { 14, 14, 9, 9}}, + {m68k_op_tst_16_d , 0xfff8, 0x4a40, { 4, 4, 2, 2}}, + {m68k_op_tst_16_a , 0xfff8, 0x4a48, { 0, 0, 2, 2}}, + {m68k_op_tst_16_ai , 0xfff8, 0x4a50, { 8, 8, 6, 6}}, + {m68k_op_tst_16_pi , 0xfff8, 0x4a58, { 8, 8, 6, 6}}, + {m68k_op_tst_16_pd , 0xfff8, 0x4a60, { 10, 10, 7, 7}}, + {m68k_op_tst_16_di , 0xfff8, 0x4a68, { 12, 12, 7, 7}}, + {m68k_op_tst_16_ix , 0xfff8, 0x4a70, { 14, 14, 9, 9}}, + {m68k_op_tst_32_d , 0xfff8, 0x4a80, { 4, 4, 2, 2}}, + {m68k_op_tst_32_a , 0xfff8, 0x4a88, { 0, 0, 2, 2}}, + {m68k_op_tst_32_ai , 0xfff8, 0x4a90, { 12, 12, 6, 6}}, + {m68k_op_tst_32_pi , 0xfff8, 0x4a98, { 12, 12, 6, 6}}, + {m68k_op_tst_32_pd , 0xfff8, 0x4aa0, { 14, 14, 7, 7}}, + {m68k_op_tst_32_di , 0xfff8, 0x4aa8, { 16, 16, 7, 7}}, + {m68k_op_tst_32_ix , 0xfff8, 0x4ab0, { 18, 18, 9, 9}}, + {m68k_op_tas_8_d , 0xfff8, 0x4ac0, { 4, 4, 4, 4}}, + {m68k_op_tas_8_ai , 0xfff8, 0x4ad0, { 18, 18, 16, 16}}, + {m68k_op_tas_8_pi , 0xfff8, 0x4ad8, { 18, 18, 16, 16}}, + {m68k_op_tas_8_pd , 0xfff8, 0x4ae0, { 20, 20, 17, 17}}, + {m68k_op_tas_8_di , 0xfff8, 0x4ae8, { 22, 22, 17, 17}}, + {m68k_op_tas_8_ix , 0xfff8, 0x4af0, { 24, 24, 19, 19}}, + {m68k_op_mull_32_d , 0xfff8, 0x4c00, { 0, 0, 43, 43}}, + {m68k_op_mull_32_ai , 0xfff8, 0x4c10, { 0, 0, 47, 47}}, + {m68k_op_mull_32_pi , 0xfff8, 0x4c18, { 0, 0, 47, 47}}, + {m68k_op_mull_32_pd , 0xfff8, 0x4c20, { 0, 0, 48, 48}}, + {m68k_op_mull_32_di , 0xfff8, 0x4c28, { 0, 0, 48, 48}}, + {m68k_op_mull_32_ix , 0xfff8, 0x4c30, { 0, 0, 50, 50}}, + {m68k_op_divl_32_d , 0xfff8, 0x4c40, { 0, 0, 84, 84}}, + {m68k_op_divl_32_ai , 0xfff8, 0x4c50, { 0, 0, 88, 88}}, + {m68k_op_divl_32_pi , 0xfff8, 0x4c58, { 0, 0, 88, 88}}, + {m68k_op_divl_32_pd , 0xfff8, 0x4c60, { 0, 0, 89, 89}}, + {m68k_op_divl_32_di , 0xfff8, 0x4c68, { 0, 0, 89, 89}}, + {m68k_op_divl_32_ix , 0xfff8, 0x4c70, { 0, 0, 91, 91}}, + {m68k_op_movem_16_er_ai , 0xfff8, 0x4c90, { 12, 12, 12, 12}}, + {m68k_op_movem_16_er_pi , 0xfff8, 0x4c98, { 12, 12, 8, 8}}, + {m68k_op_movem_16_er_di , 0xfff8, 0x4ca8, { 16, 16, 13, 13}}, + {m68k_op_movem_16_er_ix , 0xfff8, 0x4cb0, { 18, 18, 15, 15}}, + {m68k_op_movem_32_er_ai , 0xfff8, 0x4cd0, { 12, 12, 12, 12}}, + {m68k_op_movem_32_er_pi , 0xfff8, 0x4cd8, { 12, 12, 8, 8}}, + {m68k_op_movem_32_er_di , 0xfff8, 0x4ce8, { 16, 16, 13, 13}}, + {m68k_op_movem_32_er_ix , 0xfff8, 0x4cf0, { 18, 18, 15, 15}}, + {m68k_op_link_16 , 0xfff8, 0x4e50, { 16, 16, 5, 5}}, + {m68k_op_unlk_32 , 0xfff8, 0x4e58, { 12, 12, 6, 6}}, + {m68k_op_move_32_tou , 0xfff8, 0x4e60, { 4, 6, 2, 2}}, + {m68k_op_move_32_fru , 0xfff8, 0x4e68, { 4, 6, 2, 2}}, + {m68k_op_jsr_32_ai , 0xfff8, 0x4e90, { 16, 16, 4, 4}}, + {m68k_op_jsr_32_di , 0xfff8, 0x4ea8, { 18, 18, 5, 5}}, + {m68k_op_jsr_32_ix , 0xfff8, 0x4eb0, { 22, 22, 7, 7}}, + {m68k_op_jmp_32_ai , 0xfff8, 0x4ed0, { 8, 8, 4, 4}}, + {m68k_op_jmp_32_di , 0xfff8, 0x4ee8, { 10, 10, 5, 5}}, + {m68k_op_jmp_32_ix , 0xfff8, 0x4ef0, { 14, 14, 7, 7}}, + {m68k_op_st_8_d , 0xfff8, 0x50c0, { 6, 4, 4, 4}}, + {m68k_op_dbt_16 , 0xfff8, 0x50c8, { 12, 12, 6, 6}}, + {m68k_op_st_8_ai , 0xfff8, 0x50d0, { 12, 12, 10, 10}}, + {m68k_op_st_8_pi , 0xfff8, 0x50d8, { 12, 12, 10, 10}}, + {m68k_op_st_8_pd , 0xfff8, 0x50e0, { 14, 14, 11, 11}}, + {m68k_op_st_8_di , 0xfff8, 0x50e8, { 16, 16, 11, 11}}, + {m68k_op_st_8_ix , 0xfff8, 0x50f0, { 18, 18, 13, 13}}, + {m68k_op_sf_8_d , 0xfff8, 0x51c0, { 4, 4, 4, 4}}, + {m68k_op_dbf_16 , 0xfff8, 0x51c8, { 12, 12, 6, 6}}, + {m68k_op_sf_8_ai , 0xfff8, 0x51d0, { 12, 12, 10, 10}}, + {m68k_op_sf_8_pi , 0xfff8, 0x51d8, { 12, 12, 10, 10}}, + {m68k_op_sf_8_pd , 0xfff8, 0x51e0, { 14, 14, 11, 11}}, + {m68k_op_sf_8_di , 0xfff8, 0x51e8, { 16, 16, 11, 11}}, + {m68k_op_sf_8_ix , 0xfff8, 0x51f0, { 18, 18, 13, 13}}, + {m68k_op_shi_8_d , 0xfff8, 0x52c0, { 4, 4, 4, 4}}, + {m68k_op_dbhi_16 , 0xfff8, 0x52c8, { 12, 12, 6, 6}}, + {m68k_op_shi_8_ai , 0xfff8, 0x52d0, { 12, 12, 10, 10}}, + {m68k_op_shi_8_pi , 0xfff8, 0x52d8, { 12, 12, 10, 10}}, + {m68k_op_shi_8_pd , 0xfff8, 0x52e0, { 14, 14, 11, 11}}, + {m68k_op_shi_8_di , 0xfff8, 0x52e8, { 16, 16, 11, 11}}, + {m68k_op_shi_8_ix , 0xfff8, 0x52f0, { 18, 18, 13, 13}}, + {m68k_op_sls_8_d , 0xfff8, 0x53c0, { 4, 4, 4, 4}}, + {m68k_op_dbls_16 , 0xfff8, 0x53c8, { 12, 12, 6, 6}}, + {m68k_op_sls_8_ai , 0xfff8, 0x53d0, { 12, 12, 10, 10}}, + {m68k_op_sls_8_pi , 0xfff8, 0x53d8, { 12, 12, 10, 10}}, + {m68k_op_sls_8_pd , 0xfff8, 0x53e0, { 14, 14, 11, 11}}, + {m68k_op_sls_8_di , 0xfff8, 0x53e8, { 16, 16, 11, 11}}, + {m68k_op_sls_8_ix , 0xfff8, 0x53f0, { 18, 18, 13, 13}}, + {m68k_op_scc_8_d , 0xfff8, 0x54c0, { 4, 4, 4, 4}}, + {m68k_op_dbcc_16 , 0xfff8, 0x54c8, { 12, 12, 6, 6}}, + {m68k_op_scc_8_ai , 0xfff8, 0x54d0, { 12, 12, 10, 10}}, + {m68k_op_scc_8_pi , 0xfff8, 0x54d8, { 12, 12, 10, 10}}, + {m68k_op_scc_8_pd , 0xfff8, 0x54e0, { 14, 14, 11, 11}}, + {m68k_op_scc_8_di , 0xfff8, 0x54e8, { 16, 16, 11, 11}}, + {m68k_op_scc_8_ix , 0xfff8, 0x54f0, { 18, 18, 13, 13}}, + {m68k_op_scs_8_d , 0xfff8, 0x55c0, { 4, 4, 4, 4}}, + {m68k_op_dbcs_16 , 0xfff8, 0x55c8, { 12, 12, 6, 6}}, + {m68k_op_scs_8_ai , 0xfff8, 0x55d0, { 12, 12, 10, 10}}, + {m68k_op_scs_8_pi , 0xfff8, 0x55d8, { 12, 12, 10, 10}}, + {m68k_op_scs_8_pd , 0xfff8, 0x55e0, { 14, 14, 11, 11}}, + {m68k_op_scs_8_di , 0xfff8, 0x55e8, { 16, 16, 11, 11}}, + {m68k_op_scs_8_ix , 0xfff8, 0x55f0, { 18, 18, 13, 13}}, + {m68k_op_sne_8_d , 0xfff8, 0x56c0, { 4, 4, 4, 4}}, + {m68k_op_dbne_16 , 0xfff8, 0x56c8, { 12, 12, 6, 6}}, + {m68k_op_sne_8_ai , 0xfff8, 0x56d0, { 12, 12, 10, 10}}, + {m68k_op_sne_8_pi , 0xfff8, 0x56d8, { 12, 12, 10, 10}}, + {m68k_op_sne_8_pd , 0xfff8, 0x56e0, { 14, 14, 11, 11}}, + {m68k_op_sne_8_di , 0xfff8, 0x56e8, { 16, 16, 11, 11}}, + {m68k_op_sne_8_ix , 0xfff8, 0x56f0, { 18, 18, 13, 13}}, + {m68k_op_seq_8_d , 0xfff8, 0x57c0, { 4, 4, 4, 4}}, + {m68k_op_dbeq_16 , 0xfff8, 0x57c8, { 12, 12, 6, 6}}, + {m68k_op_seq_8_ai , 0xfff8, 0x57d0, { 12, 12, 10, 10}}, + {m68k_op_seq_8_pi , 0xfff8, 0x57d8, { 12, 12, 10, 10}}, + {m68k_op_seq_8_pd , 0xfff8, 0x57e0, { 14, 14, 11, 11}}, + {m68k_op_seq_8_di , 0xfff8, 0x57e8, { 16, 16, 11, 11}}, + {m68k_op_seq_8_ix , 0xfff8, 0x57f0, { 18, 18, 13, 13}}, + {m68k_op_svc_8_d , 0xfff8, 0x58c0, { 4, 4, 4, 4}}, + {m68k_op_dbvc_16 , 0xfff8, 0x58c8, { 12, 12, 6, 6}}, + {m68k_op_svc_8_ai , 0xfff8, 0x58d0, { 12, 12, 10, 10}}, + {m68k_op_svc_8_pi , 0xfff8, 0x58d8, { 12, 12, 10, 10}}, + {m68k_op_svc_8_pd , 0xfff8, 0x58e0, { 14, 14, 11, 11}}, + {m68k_op_svc_8_di , 0xfff8, 0x58e8, { 16, 16, 11, 11}}, + {m68k_op_svc_8_ix , 0xfff8, 0x58f0, { 18, 18, 13, 13}}, + {m68k_op_svs_8_d , 0xfff8, 0x59c0, { 4, 4, 4, 4}}, + {m68k_op_dbvs_16 , 0xfff8, 0x59c8, { 12, 12, 6, 6}}, + {m68k_op_svs_8_ai , 0xfff8, 0x59d0, { 12, 12, 10, 10}}, + {m68k_op_svs_8_pi , 0xfff8, 0x59d8, { 12, 12, 10, 10}}, + {m68k_op_svs_8_pd , 0xfff8, 0x59e0, { 14, 14, 11, 11}}, + {m68k_op_svs_8_di , 0xfff8, 0x59e8, { 16, 16, 11, 11}}, + {m68k_op_svs_8_ix , 0xfff8, 0x59f0, { 18, 18, 13, 13}}, + {m68k_op_spl_8_d , 0xfff8, 0x5ac0, { 4, 4, 4, 4}}, + {m68k_op_dbpl_16 , 0xfff8, 0x5ac8, { 12, 12, 6, 6}}, + {m68k_op_spl_8_ai , 0xfff8, 0x5ad0, { 12, 12, 10, 10}}, + {m68k_op_spl_8_pi , 0xfff8, 0x5ad8, { 12, 12, 10, 10}}, + {m68k_op_spl_8_pd , 0xfff8, 0x5ae0, { 14, 14, 11, 11}}, + {m68k_op_spl_8_di , 0xfff8, 0x5ae8, { 16, 16, 11, 11}}, + {m68k_op_spl_8_ix , 0xfff8, 0x5af0, { 18, 18, 13, 13}}, + {m68k_op_smi_8_d , 0xfff8, 0x5bc0, { 4, 4, 4, 4}}, + {m68k_op_dbmi_16 , 0xfff8, 0x5bc8, { 12, 12, 6, 6}}, + {m68k_op_smi_8_ai , 0xfff8, 0x5bd0, { 12, 12, 10, 10}}, + {m68k_op_smi_8_pi , 0xfff8, 0x5bd8, { 12, 12, 10, 10}}, + {m68k_op_smi_8_pd , 0xfff8, 0x5be0, { 14, 14, 11, 11}}, + {m68k_op_smi_8_di , 0xfff8, 0x5be8, { 16, 16, 11, 11}}, + {m68k_op_smi_8_ix , 0xfff8, 0x5bf0, { 18, 18, 13, 13}}, + {m68k_op_sge_8_d , 0xfff8, 0x5cc0, { 4, 4, 4, 4}}, + {m68k_op_dbge_16 , 0xfff8, 0x5cc8, { 12, 12, 6, 6}}, + {m68k_op_sge_8_ai , 0xfff8, 0x5cd0, { 12, 12, 10, 10}}, + {m68k_op_sge_8_pi , 0xfff8, 0x5cd8, { 12, 12, 10, 10}}, + {m68k_op_sge_8_pd , 0xfff8, 0x5ce0, { 14, 14, 11, 11}}, + {m68k_op_sge_8_di , 0xfff8, 0x5ce8, { 16, 16, 11, 11}}, + {m68k_op_sge_8_ix , 0xfff8, 0x5cf0, { 18, 18, 13, 13}}, + {m68k_op_slt_8_d , 0xfff8, 0x5dc0, { 4, 4, 4, 4}}, + {m68k_op_dblt_16 , 0xfff8, 0x5dc8, { 12, 12, 6, 6}}, + {m68k_op_slt_8_ai , 0xfff8, 0x5dd0, { 12, 12, 10, 10}}, + {m68k_op_slt_8_pi , 0xfff8, 0x5dd8, { 12, 12, 10, 10}}, + {m68k_op_slt_8_pd , 0xfff8, 0x5de0, { 14, 14, 11, 11}}, + {m68k_op_slt_8_di , 0xfff8, 0x5de8, { 16, 16, 11, 11}}, + {m68k_op_slt_8_ix , 0xfff8, 0x5df0, { 18, 18, 13, 13}}, + {m68k_op_sgt_8_d , 0xfff8, 0x5ec0, { 4, 4, 4, 4}}, + {m68k_op_dbgt_16 , 0xfff8, 0x5ec8, { 12, 12, 6, 6}}, + {m68k_op_sgt_8_ai , 0xfff8, 0x5ed0, { 12, 12, 10, 10}}, + {m68k_op_sgt_8_pi , 0xfff8, 0x5ed8, { 12, 12, 10, 10}}, + {m68k_op_sgt_8_pd , 0xfff8, 0x5ee0, { 14, 14, 11, 11}}, + {m68k_op_sgt_8_di , 0xfff8, 0x5ee8, { 16, 16, 11, 11}}, + {m68k_op_sgt_8_ix , 0xfff8, 0x5ef0, { 18, 18, 13, 13}}, + {m68k_op_sle_8_d , 0xfff8, 0x5fc0, { 4, 4, 4, 4}}, + {m68k_op_dble_16 , 0xfff8, 0x5fc8, { 12, 12, 6, 6}}, + {m68k_op_sle_8_ai , 0xfff8, 0x5fd0, { 12, 12, 10, 10}}, + {m68k_op_sle_8_pi , 0xfff8, 0x5fd8, { 12, 12, 10, 10}}, + {m68k_op_sle_8_pd , 0xfff8, 0x5fe0, { 14, 14, 11, 11}}, + {m68k_op_sle_8_di , 0xfff8, 0x5fe8, { 16, 16, 11, 11}}, + {m68k_op_sle_8_ix , 0xfff8, 0x5ff0, { 18, 18, 13, 13}}, + {m68k_op_sbcd_8_mm_ax7 , 0xfff8, 0x8f08, { 18, 18, 16, 16}}, + {m68k_op_pack_16_mm_ax7 , 0xfff8, 0x8f48, { 0, 0, 13, 13}}, + {m68k_op_unpk_16_mm_ax7 , 0xfff8, 0x8f88, { 0, 0, 13, 13}}, + {m68k_op_subx_8_mm_ax7 , 0xfff8, 0x9f08, { 18, 18, 12, 12}}, + {m68k_op_cmpm_8_ax7 , 0xfff8, 0xbf08, { 12, 12, 9, 9}}, + {m68k_op_abcd_8_mm_ax7 , 0xfff8, 0xcf08, { 18, 18, 16, 16}}, + {m68k_op_addx_8_mm_ax7 , 0xfff8, 0xdf08, { 18, 18, 12, 12}}, + {m68k_op_asr_16_ai , 0xfff8, 0xe0d0, { 12, 12, 9, 9}}, + {m68k_op_asr_16_pi , 0xfff8, 0xe0d8, { 12, 12, 9, 9}}, + {m68k_op_asr_16_pd , 0xfff8, 0xe0e0, { 14, 14, 10, 10}}, + {m68k_op_asr_16_di , 0xfff8, 0xe0e8, { 16, 16, 10, 10}}, + {m68k_op_asr_16_ix , 0xfff8, 0xe0f0, { 18, 18, 12, 12}}, + {m68k_op_asl_16_ai , 0xfff8, 0xe1d0, { 12, 12, 10, 10}}, + {m68k_op_asl_16_pi , 0xfff8, 0xe1d8, { 12, 12, 10, 10}}, + {m68k_op_asl_16_pd , 0xfff8, 0xe1e0, { 14, 14, 11, 11}}, + {m68k_op_asl_16_di , 0xfff8, 0xe1e8, { 16, 16, 11, 11}}, + {m68k_op_asl_16_ix , 0xfff8, 0xe1f0, { 18, 18, 13, 13}}, + {m68k_op_lsr_16_ai , 0xfff8, 0xe2d0, { 12, 12, 9, 9}}, + {m68k_op_lsr_16_pi , 0xfff8, 0xe2d8, { 12, 12, 9, 9}}, + {m68k_op_lsr_16_pd , 0xfff8, 0xe2e0, { 14, 14, 10, 10}}, + {m68k_op_lsr_16_di , 0xfff8, 0xe2e8, { 16, 16, 10, 10}}, + {m68k_op_lsr_16_ix , 0xfff8, 0xe2f0, { 18, 18, 12, 12}}, + {m68k_op_lsl_16_ai , 0xfff8, 0xe3d0, { 12, 12, 9, 9}}, + {m68k_op_lsl_16_pi , 0xfff8, 0xe3d8, { 12, 12, 9, 9}}, + {m68k_op_lsl_16_pd , 0xfff8, 0xe3e0, { 14, 14, 10, 10}}, + {m68k_op_lsl_16_di , 0xfff8, 0xe3e8, { 16, 16, 10, 10}}, + {m68k_op_lsl_16_ix , 0xfff8, 0xe3f0, { 18, 18, 12, 12}}, + {m68k_op_roxr_16_ai , 0xfff8, 0xe4d0, { 12, 12, 9, 9}}, + {m68k_op_roxr_16_pi , 0xfff8, 0xe4d8, { 12, 12, 9, 9}}, + {m68k_op_roxr_16_pd , 0xfff8, 0xe4e0, { 14, 14, 10, 10}}, + {m68k_op_roxr_16_di , 0xfff8, 0xe4e8, { 16, 16, 10, 10}}, + {m68k_op_roxr_16_ix , 0xfff8, 0xe4f0, { 18, 18, 12, 12}}, + {m68k_op_roxl_16_ai , 0xfff8, 0xe5d0, { 12, 12, 9, 9}}, + {m68k_op_roxl_16_pi , 0xfff8, 0xe5d8, { 12, 12, 9, 9}}, + {m68k_op_roxl_16_pd , 0xfff8, 0xe5e0, { 14, 14, 10, 10}}, + {m68k_op_roxl_16_di , 0xfff8, 0xe5e8, { 16, 16, 10, 10}}, + {m68k_op_roxl_16_ix , 0xfff8, 0xe5f0, { 18, 18, 12, 12}}, + {m68k_op_ror_16_ai , 0xfff8, 0xe6d0, { 12, 12, 11, 11}}, + {m68k_op_ror_16_pi , 0xfff8, 0xe6d8, { 12, 12, 11, 11}}, + {m68k_op_ror_16_pd , 0xfff8, 0xe6e0, { 14, 14, 12, 12}}, + {m68k_op_ror_16_di , 0xfff8, 0xe6e8, { 16, 16, 12, 12}}, + {m68k_op_ror_16_ix , 0xfff8, 0xe6f0, { 18, 18, 14, 14}}, + {m68k_op_rol_16_ai , 0xfff8, 0xe7d0, { 12, 12, 11, 11}}, + {m68k_op_rol_16_pi , 0xfff8, 0xe7d8, { 12, 12, 11, 11}}, + {m68k_op_rol_16_pd , 0xfff8, 0xe7e0, { 14, 14, 12, 12}}, + {m68k_op_rol_16_di , 0xfff8, 0xe7e8, { 16, 16, 12, 12}}, + {m68k_op_rol_16_ix , 0xfff8, 0xe7f0, { 18, 18, 14, 14}}, + {m68k_op_bftst_32_d , 0xfff8, 0xe8c0, { 0, 0, 6, 6}}, + {m68k_op_bftst_32_ai , 0xfff8, 0xe8d0, { 0, 0, 17, 17}}, + {m68k_op_bftst_32_di , 0xfff8, 0xe8e8, { 0, 0, 18, 18}}, + {m68k_op_bftst_32_ix , 0xfff8, 0xe8f0, { 0, 0, 20, 20}}, + {m68k_op_bfextu_32_d , 0xfff8, 0xe9c0, { 0, 0, 8, 8}}, + {m68k_op_bfextu_32_ai , 0xfff8, 0xe9d0, { 0, 0, 19, 19}}, + {m68k_op_bfextu_32_di , 0xfff8, 0xe9e8, { 0, 0, 20, 20}}, + {m68k_op_bfextu_32_ix , 0xfff8, 0xe9f0, { 0, 0, 22, 22}}, + {m68k_op_bfchg_32_d , 0xfff8, 0xeac0, { 0, 0, 12, 12}}, + {m68k_op_bfchg_32_ai , 0xfff8, 0xead0, { 0, 0, 24, 24}}, + {m68k_op_bfchg_32_di , 0xfff8, 0xeae8, { 0, 0, 25, 25}}, + {m68k_op_bfchg_32_ix , 0xfff8, 0xeaf0, { 0, 0, 27, 27}}, + {m68k_op_bfexts_32_d , 0xfff8, 0xebc0, { 0, 0, 8, 8}}, + {m68k_op_bfexts_32_ai , 0xfff8, 0xebd0, { 0, 0, 19, 19}}, + {m68k_op_bfexts_32_di , 0xfff8, 0xebe8, { 0, 0, 20, 20}}, + {m68k_op_bfexts_32_ix , 0xfff8, 0xebf0, { 0, 0, 22, 22}}, + {m68k_op_bfclr_32_d , 0xfff8, 0xecc0, { 0, 0, 12, 12}}, + {m68k_op_bfclr_32_ai , 0xfff8, 0xecd0, { 0, 0, 24, 24}}, + {m68k_op_bfclr_32_di , 0xfff8, 0xece8, { 0, 0, 25, 25}}, + {m68k_op_bfclr_32_ix , 0xfff8, 0xecf0, { 0, 0, 27, 27}}, + {m68k_op_bfffo_32_d , 0xfff8, 0xedc0, { 0, 0, 18, 18}}, + {m68k_op_bfffo_32_ai , 0xfff8, 0xedd0, { 0, 0, 32, 32}}, + {m68k_op_bfffo_32_di , 0xfff8, 0xede8, { 0, 0, 33, 33}}, + {m68k_op_bfffo_32_ix , 0xfff8, 0xedf0, { 0, 0, 35, 35}}, + {m68k_op_bfset_32_d , 0xfff8, 0xeec0, { 0, 0, 12, 12}}, + {m68k_op_bfset_32_ai , 0xfff8, 0xeed0, { 0, 0, 24, 24}}, + {m68k_op_bfset_32_di , 0xfff8, 0xeee8, { 0, 0, 25, 25}}, + {m68k_op_bfset_32_ix , 0xfff8, 0xeef0, { 0, 0, 27, 27}}, + {m68k_op_bfins_32_d , 0xfff8, 0xefc0, { 0, 0, 10, 10}}, + {m68k_op_bfins_32_ai , 0xfff8, 0xefd0, { 0, 0, 21, 21}}, + {m68k_op_bfins_32_di , 0xfff8, 0xefe8, { 0, 0, 22, 22}}, + {m68k_op_bfins_32_ix , 0xfff8, 0xeff0, { 0, 0, 24, 24}}, + {m68k_op_move16_32 , 0xfff8, 0xf620, { 0, 0, 0, 4}}, + {m68k_op_ori_8_pi7 , 0xffff, 0x001f, { 16, 16, 8, 8}}, + {m68k_op_ori_8_pd7 , 0xffff, 0x0027, { 18, 18, 9, 9}}, + {m68k_op_ori_8_aw , 0xffff, 0x0038, { 20, 20, 8, 8}}, + {m68k_op_ori_8_al , 0xffff, 0x0039, { 24, 24, 8, 8}}, + {m68k_op_ori_16_toc , 0xffff, 0x003c, { 20, 16, 12, 12}}, + {m68k_op_ori_16_aw , 0xffff, 0x0078, { 20, 20, 8, 8}}, + {m68k_op_ori_16_al , 0xffff, 0x0079, { 24, 24, 8, 8}}, + {m68k_op_ori_16_tos , 0xffff, 0x007c, { 20, 16, 12, 12}}, + {m68k_op_ori_32_aw , 0xffff, 0x00b8, { 32, 32, 8, 8}}, + {m68k_op_ori_32_al , 0xffff, 0x00b9, { 36, 36, 8, 8}}, + {m68k_op_chk2cmp2_8_aw , 0xffff, 0x00f8, { 0, 0, 22, 22}}, + {m68k_op_chk2cmp2_8_al , 0xffff, 0x00f9, { 0, 0, 22, 22}}, + {m68k_op_chk2cmp2_8_pcdi , 0xffff, 0x00fa, { 0, 0, 23, 23}}, + {m68k_op_chk2cmp2_8_pcix , 0xffff, 0x00fb, { 0, 0, 23, 23}}, + {m68k_op_andi_8_pi7 , 0xffff, 0x021f, { 16, 16, 8, 8}}, + {m68k_op_andi_8_pd7 , 0xffff, 0x0227, { 18, 18, 9, 9}}, + {m68k_op_andi_8_aw , 0xffff, 0x0238, { 20, 20, 8, 8}}, + {m68k_op_andi_8_al , 0xffff, 0x0239, { 24, 24, 8, 8}}, + {m68k_op_andi_16_toc , 0xffff, 0x023c, { 20, 16, 12, 12}}, + {m68k_op_andi_16_aw , 0xffff, 0x0278, { 20, 20, 8, 8}}, + {m68k_op_andi_16_al , 0xffff, 0x0279, { 24, 24, 8, 8}}, + {m68k_op_andi_16_tos , 0xffff, 0x027c, { 20, 16, 12, 12}}, + {m68k_op_andi_32_aw , 0xffff, 0x02b8, { 32, 32, 8, 8}}, + {m68k_op_andi_32_al , 0xffff, 0x02b9, { 36, 36, 8, 8}}, + {m68k_op_chk2cmp2_16_aw , 0xffff, 0x02f8, { 0, 0, 22, 22}}, + {m68k_op_chk2cmp2_16_al , 0xffff, 0x02f9, { 0, 0, 22, 22}}, + {m68k_op_chk2cmp2_16_pcdi , 0xffff, 0x02fa, { 0, 0, 23, 23}}, + {m68k_op_chk2cmp2_16_pcix , 0xffff, 0x02fb, { 0, 0, 23, 23}}, + {m68k_op_subi_8_pi7 , 0xffff, 0x041f, { 16, 16, 8, 8}}, + {m68k_op_subi_8_pd7 , 0xffff, 0x0427, { 18, 18, 9, 9}}, + {m68k_op_subi_8_aw , 0xffff, 0x0438, { 20, 20, 8, 8}}, + {m68k_op_subi_8_al , 0xffff, 0x0439, { 24, 24, 8, 8}}, + {m68k_op_subi_16_aw , 0xffff, 0x0478, { 20, 20, 8, 8}}, + {m68k_op_subi_16_al , 0xffff, 0x0479, { 24, 24, 8, 8}}, + {m68k_op_subi_32_aw , 0xffff, 0x04b8, { 32, 32, 8, 8}}, + {m68k_op_subi_32_al , 0xffff, 0x04b9, { 36, 36, 8, 8}}, + {m68k_op_chk2cmp2_32_aw , 0xffff, 0x04f8, { 0, 0, 22, 22}}, + {m68k_op_chk2cmp2_32_al , 0xffff, 0x04f9, { 0, 0, 22, 22}}, + {m68k_op_chk2cmp2_32_pcdi , 0xffff, 0x04fa, { 0, 0, 23, 23}}, + {m68k_op_chk2cmp2_32_pcix , 0xffff, 0x04fb, { 0, 0, 23, 23}}, + {m68k_op_addi_8_pi7 , 0xffff, 0x061f, { 16, 16, 8, 8}}, + {m68k_op_addi_8_pd7 , 0xffff, 0x0627, { 18, 18, 9, 9}}, + {m68k_op_addi_8_aw , 0xffff, 0x0638, { 20, 20, 8, 8}}, + {m68k_op_addi_8_al , 0xffff, 0x0639, { 24, 24, 8, 8}}, + {m68k_op_addi_16_aw , 0xffff, 0x0678, { 20, 20, 8, 8}}, + {m68k_op_addi_16_al , 0xffff, 0x0679, { 24, 24, 8, 8}}, + {m68k_op_addi_32_aw , 0xffff, 0x06b8, { 32, 32, 8, 8}}, + {m68k_op_addi_32_al , 0xffff, 0x06b9, { 36, 36, 8, 8}}, + {m68k_op_callm_32_aw , 0xffff, 0x06f8, { 0, 0, 64, 64}}, + {m68k_op_callm_32_al , 0xffff, 0x06f9, { 0, 0, 64, 64}}, + {m68k_op_callm_32_pcdi , 0xffff, 0x06fa, { 0, 0, 65, 65}}, + {m68k_op_callm_32_pcix , 0xffff, 0x06fb, { 0, 0, 67, 67}}, + {m68k_op_btst_8_s_pi7 , 0xffff, 0x081f, { 12, 12, 8, 8}}, + {m68k_op_btst_8_s_pd7 , 0xffff, 0x0827, { 14, 14, 9, 9}}, + {m68k_op_btst_8_s_aw , 0xffff, 0x0838, { 16, 16, 8, 8}}, + {m68k_op_btst_8_s_al , 0xffff, 0x0839, { 20, 20, 8, 8}}, + {m68k_op_btst_8_s_pcdi , 0xffff, 0x083a, { 16, 16, 9, 9}}, + {m68k_op_btst_8_s_pcix , 0xffff, 0x083b, { 18, 18, 11, 11}}, + {m68k_op_bchg_8_s_pi7 , 0xffff, 0x085f, { 16, 16, 8, 8}}, + {m68k_op_bchg_8_s_pd7 , 0xffff, 0x0867, { 18, 18, 9, 9}}, + {m68k_op_bchg_8_s_aw , 0xffff, 0x0878, { 20, 20, 8, 8}}, + {m68k_op_bchg_8_s_al , 0xffff, 0x0879, { 24, 24, 8, 8}}, + {m68k_op_bclr_8_s_pi7 , 0xffff, 0x089f, { 16, 16, 8, 8}}, + {m68k_op_bclr_8_s_pd7 , 0xffff, 0x08a7, { 18, 18, 9, 9}}, + {m68k_op_bclr_8_s_aw , 0xffff, 0x08b8, { 20, 20, 8, 8}}, + {m68k_op_bclr_8_s_al , 0xffff, 0x08b9, { 24, 24, 8, 8}}, + {m68k_op_bset_8_s_pi7 , 0xffff, 0x08df, { 16, 16, 8, 8}}, + {m68k_op_bset_8_s_pd7 , 0xffff, 0x08e7, { 18, 18, 9, 9}}, + {m68k_op_bset_8_s_aw , 0xffff, 0x08f8, { 20, 20, 8, 8}}, + {m68k_op_bset_8_s_al , 0xffff, 0x08f9, { 24, 24, 8, 8}}, + {m68k_op_eori_8_pi7 , 0xffff, 0x0a1f, { 16, 16, 8, 8}}, + {m68k_op_eori_8_pd7 , 0xffff, 0x0a27, { 18, 18, 9, 9}}, + {m68k_op_eori_8_aw , 0xffff, 0x0a38, { 20, 20, 8, 8}}, + {m68k_op_eori_8_al , 0xffff, 0x0a39, { 24, 24, 8, 8}}, + {m68k_op_eori_16_toc , 0xffff, 0x0a3c, { 20, 16, 12, 12}}, + {m68k_op_eori_16_aw , 0xffff, 0x0a78, { 20, 20, 8, 8}}, + {m68k_op_eori_16_al , 0xffff, 0x0a79, { 24, 24, 8, 8}}, + {m68k_op_eori_16_tos , 0xffff, 0x0a7c, { 20, 16, 12, 12}}, + {m68k_op_eori_32_aw , 0xffff, 0x0ab8, { 32, 32, 8, 8}}, + {m68k_op_eori_32_al , 0xffff, 0x0ab9, { 36, 36, 8, 8}}, + {m68k_op_cas_8_pi7 , 0xffff, 0x0adf, { 0, 0, 16, 16}}, + {m68k_op_cas_8_pd7 , 0xffff, 0x0ae7, { 0, 0, 17, 17}}, + {m68k_op_cas_8_aw , 0xffff, 0x0af8, { 0, 0, 16, 16}}, + {m68k_op_cas_8_al , 0xffff, 0x0af9, { 0, 0, 16, 16}}, + {m68k_op_cmpi_8_pi7 , 0xffff, 0x0c1f, { 12, 12, 6, 6}}, + {m68k_op_cmpi_8_pd7 , 0xffff, 0x0c27, { 14, 14, 7, 7}}, + {m68k_op_cmpi_8_aw , 0xffff, 0x0c38, { 16, 16, 6, 6}}, + {m68k_op_cmpi_8_al , 0xffff, 0x0c39, { 20, 20, 6, 6}}, + {m68k_op_cmpi_8_pcdi , 0xffff, 0x0c3a, { 0, 0, 7, 7}}, + {m68k_op_cmpi_8_pcix , 0xffff, 0x0c3b, { 0, 0, 9, 9}}, + {m68k_op_cmpi_16_aw , 0xffff, 0x0c78, { 16, 16, 6, 6}}, + {m68k_op_cmpi_16_al , 0xffff, 0x0c79, { 20, 20, 6, 6}}, + {m68k_op_cmpi_16_pcdi , 0xffff, 0x0c7a, { 0, 0, 7, 7}}, + {m68k_op_cmpi_16_pcix , 0xffff, 0x0c7b, { 0, 0, 9, 9}}, + {m68k_op_cmpi_32_aw , 0xffff, 0x0cb8, { 24, 24, 6, 6}}, + {m68k_op_cmpi_32_al , 0xffff, 0x0cb9, { 28, 28, 6, 6}}, + {m68k_op_cmpi_32_pcdi , 0xffff, 0x0cba, { 0, 0, 7, 7}}, + {m68k_op_cmpi_32_pcix , 0xffff, 0x0cbb, { 0, 0, 9, 9}}, + {m68k_op_cas_16_aw , 0xffff, 0x0cf8, { 0, 0, 16, 16}}, + {m68k_op_cas_16_al , 0xffff, 0x0cf9, { 0, 0, 16, 16}}, + {m68k_op_cas2_16 , 0xffff, 0x0cfc, { 0, 0, 12, 12}}, + {m68k_op_moves_8_pi7 , 0xffff, 0x0e1f, { 0, 18, 9, 9}}, + {m68k_op_moves_8_pd7 , 0xffff, 0x0e27, { 0, 20, 10, 10}}, + {m68k_op_moves_8_aw , 0xffff, 0x0e38, { 0, 26, 9, 9}}, + {m68k_op_moves_8_al , 0xffff, 0x0e39, { 0, 30, 9, 9}}, + {m68k_op_moves_16_aw , 0xffff, 0x0e78, { 0, 26, 9, 9}}, + {m68k_op_moves_16_al , 0xffff, 0x0e79, { 0, 30, 9, 9}}, + {m68k_op_moves_32_aw , 0xffff, 0x0eb8, { 0, 32, 9, 9}}, + {m68k_op_moves_32_al , 0xffff, 0x0eb9, { 0, 36, 9, 9}}, + {m68k_op_cas_32_aw , 0xffff, 0x0ef8, { 0, 0, 16, 16}}, + {m68k_op_cas_32_al , 0xffff, 0x0ef9, { 0, 0, 16, 16}}, + {m68k_op_cas2_32 , 0xffff, 0x0efc, { 0, 0, 12, 12}}, + {m68k_op_move_8_aw_pi7 , 0xffff, 0x11df, { 16, 16, 8, 8}}, + {m68k_op_move_8_aw_pd7 , 0xffff, 0x11e7, { 18, 18, 9, 9}}, + {m68k_op_move_8_aw_aw , 0xffff, 0x11f8, { 20, 20, 8, 8}}, + {m68k_op_move_8_aw_al , 0xffff, 0x11f9, { 24, 24, 8, 8}}, + {m68k_op_move_8_aw_pcdi , 0xffff, 0x11fa, { 20, 20, 9, 9}}, + {m68k_op_move_8_aw_pcix , 0xffff, 0x11fb, { 22, 22, 11, 11}}, + {m68k_op_move_8_aw_i , 0xffff, 0x11fc, { 16, 16, 6, 6}}, + {m68k_op_move_8_al_pi7 , 0xffff, 0x13df, { 20, 20, 10, 10}}, + {m68k_op_move_8_al_pd7 , 0xffff, 0x13e7, { 22, 22, 11, 11}}, + {m68k_op_move_8_al_aw , 0xffff, 0x13f8, { 24, 24, 10, 10}}, + {m68k_op_move_8_al_al , 0xffff, 0x13f9, { 28, 28, 10, 10}}, + {m68k_op_move_8_al_pcdi , 0xffff, 0x13fa, { 24, 24, 11, 11}}, + {m68k_op_move_8_al_pcix , 0xffff, 0x13fb, { 26, 26, 13, 13}}, + {m68k_op_move_8_al_i , 0xffff, 0x13fc, { 20, 20, 8, 8}}, + {m68k_op_move_8_pi7_pi7 , 0xffff, 0x1edf, { 12, 12, 8, 8}}, + {m68k_op_move_8_pi7_pd7 , 0xffff, 0x1ee7, { 14, 14, 9, 9}}, + {m68k_op_move_8_pi7_aw , 0xffff, 0x1ef8, { 16, 16, 8, 8}}, + {m68k_op_move_8_pi7_al , 0xffff, 0x1ef9, { 20, 20, 8, 8}}, + {m68k_op_move_8_pi7_pcdi , 0xffff, 0x1efa, { 16, 16, 9, 9}}, + {m68k_op_move_8_pi7_pcix , 0xffff, 0x1efb, { 18, 18, 11, 11}}, + {m68k_op_move_8_pi7_i , 0xffff, 0x1efc, { 12, 12, 6, 6}}, + {m68k_op_move_8_pd7_pi7 , 0xffff, 0x1f1f, { 12, 12, 9, 9}}, + {m68k_op_move_8_pd7_pd7 , 0xffff, 0x1f27, { 14, 14, 10, 10}}, + {m68k_op_move_8_pd7_aw , 0xffff, 0x1f38, { 16, 16, 9, 9}}, + {m68k_op_move_8_pd7_al , 0xffff, 0x1f39, { 20, 20, 9, 9}}, + {m68k_op_move_8_pd7_pcdi , 0xffff, 0x1f3a, { 16, 16, 10, 10}}, + {m68k_op_move_8_pd7_pcix , 0xffff, 0x1f3b, { 18, 18, 12, 12}}, + {m68k_op_move_8_pd7_i , 0xffff, 0x1f3c, { 12, 12, 7, 7}}, + {m68k_op_move_32_aw_aw , 0xffff, 0x21f8, { 28, 28, 8, 8}}, + {m68k_op_move_32_aw_al , 0xffff, 0x21f9, { 32, 32, 8, 8}}, + {m68k_op_move_32_aw_pcdi , 0xffff, 0x21fa, { 28, 28, 9, 9}}, + {m68k_op_move_32_aw_pcix , 0xffff, 0x21fb, { 30, 30, 11, 11}}, + {m68k_op_move_32_aw_i , 0xffff, 0x21fc, { 24, 24, 8, 8}}, + {m68k_op_move_32_al_aw , 0xffff, 0x23f8, { 32, 32, 10, 10}}, + {m68k_op_move_32_al_al , 0xffff, 0x23f9, { 36, 36, 10, 10}}, + {m68k_op_move_32_al_pcdi , 0xffff, 0x23fa, { 32, 32, 11, 11}}, + {m68k_op_move_32_al_pcix , 0xffff, 0x23fb, { 34, 34, 13, 13}}, + {m68k_op_move_32_al_i , 0xffff, 0x23fc, { 28, 28, 10, 10}}, + {m68k_op_move_16_aw_aw , 0xffff, 0x31f8, { 20, 20, 8, 8}}, + {m68k_op_move_16_aw_al , 0xffff, 0x31f9, { 24, 24, 8, 8}}, + {m68k_op_move_16_aw_pcdi , 0xffff, 0x31fa, { 20, 20, 9, 9}}, + {m68k_op_move_16_aw_pcix , 0xffff, 0x31fb, { 22, 22, 11, 11}}, + {m68k_op_move_16_aw_i , 0xffff, 0x31fc, { 16, 16, 6, 6}}, + {m68k_op_move_16_al_aw , 0xffff, 0x33f8, { 24, 24, 10, 10}}, + {m68k_op_move_16_al_al , 0xffff, 0x33f9, { 28, 28, 10, 10}}, + {m68k_op_move_16_al_pcdi , 0xffff, 0x33fa, { 24, 24, 11, 11}}, + {m68k_op_move_16_al_pcix , 0xffff, 0x33fb, { 26, 26, 13, 13}}, + {m68k_op_move_16_al_i , 0xffff, 0x33fc, { 20, 20, 8, 8}}, + {m68k_op_negx_8_pi7 , 0xffff, 0x401f, { 12, 12, 8, 8}}, + {m68k_op_negx_8_pd7 , 0xffff, 0x4027, { 14, 14, 9, 9}}, + {m68k_op_negx_8_aw , 0xffff, 0x4038, { 16, 16, 8, 8}}, + {m68k_op_negx_8_al , 0xffff, 0x4039, { 20, 20, 8, 8}}, + {m68k_op_negx_16_aw , 0xffff, 0x4078, { 16, 16, 8, 8}}, + {m68k_op_negx_16_al , 0xffff, 0x4079, { 20, 20, 8, 8}}, + {m68k_op_negx_32_aw , 0xffff, 0x40b8, { 24, 24, 8, 8}}, + {m68k_op_negx_32_al , 0xffff, 0x40b9, { 28, 28, 8, 8}}, + {m68k_op_move_16_frs_aw , 0xffff, 0x40f8, { 16, 16, 12, 12}}, + {m68k_op_move_16_frs_al , 0xffff, 0x40f9, { 20, 20, 12, 12}}, + {m68k_op_clr_8_pi7 , 0xffff, 0x421f, { 12, 8, 8, 8}}, + {m68k_op_clr_8_pd7 , 0xffff, 0x4227, { 14, 10, 9, 9}}, + {m68k_op_clr_8_aw , 0xffff, 0x4238, { 16, 12, 8, 8}}, + {m68k_op_clr_8_al , 0xffff, 0x4239, { 20, 14, 8, 8}}, + {m68k_op_clr_16_aw , 0xffff, 0x4278, { 16, 12, 8, 8}}, + {m68k_op_clr_16_al , 0xffff, 0x4279, { 20, 14, 8, 8}}, + {m68k_op_clr_32_aw , 0xffff, 0x42b8, { 24, 16, 8, 8}}, + {m68k_op_clr_32_al , 0xffff, 0x42b9, { 28, 20, 8, 8}}, + {m68k_op_move_16_frc_aw , 0xffff, 0x42f8, { 0, 16, 8, 8}}, + {m68k_op_move_16_frc_al , 0xffff, 0x42f9, { 0, 20, 8, 8}}, + {m68k_op_neg_8_pi7 , 0xffff, 0x441f, { 12, 12, 8, 8}}, + {m68k_op_neg_8_pd7 , 0xffff, 0x4427, { 14, 14, 9, 9}}, + {m68k_op_neg_8_aw , 0xffff, 0x4438, { 16, 16, 8, 8}}, + {m68k_op_neg_8_al , 0xffff, 0x4439, { 20, 20, 8, 8}}, + {m68k_op_neg_16_aw , 0xffff, 0x4478, { 16, 16, 8, 8}}, + {m68k_op_neg_16_al , 0xffff, 0x4479, { 20, 20, 8, 8}}, + {m68k_op_neg_32_aw , 0xffff, 0x44b8, { 24, 24, 8, 8}}, + {m68k_op_neg_32_al , 0xffff, 0x44b9, { 28, 28, 8, 8}}, + {m68k_op_move_16_toc_aw , 0xffff, 0x44f8, { 20, 20, 8, 8}}, + {m68k_op_move_16_toc_al , 0xffff, 0x44f9, { 24, 24, 8, 8}}, + {m68k_op_move_16_toc_pcdi , 0xffff, 0x44fa, { 20, 20, 9, 9}}, + {m68k_op_move_16_toc_pcix , 0xffff, 0x44fb, { 22, 22, 11, 11}}, + {m68k_op_move_16_toc_i , 0xffff, 0x44fc, { 16, 16, 6, 6}}, + {m68k_op_not_8_pi7 , 0xffff, 0x461f, { 12, 12, 8, 8}}, + {m68k_op_not_8_pd7 , 0xffff, 0x4627, { 14, 14, 9, 9}}, + {m68k_op_not_8_aw , 0xffff, 0x4638, { 16, 16, 8, 8}}, + {m68k_op_not_8_al , 0xffff, 0x4639, { 20, 20, 8, 8}}, + {m68k_op_not_16_aw , 0xffff, 0x4678, { 16, 16, 8, 8}}, + {m68k_op_not_16_al , 0xffff, 0x4679, { 20, 20, 8, 8}}, + {m68k_op_not_32_aw , 0xffff, 0x46b8, { 24, 24, 8, 8}}, + {m68k_op_not_32_al , 0xffff, 0x46b9, { 28, 28, 8, 8}}, + {m68k_op_move_16_tos_aw , 0xffff, 0x46f8, { 20, 20, 12, 12}}, + {m68k_op_move_16_tos_al , 0xffff, 0x46f9, { 24, 24, 12, 12}}, + {m68k_op_move_16_tos_pcdi , 0xffff, 0x46fa, { 20, 20, 13, 13}}, + {m68k_op_move_16_tos_pcix , 0xffff, 0x46fb, { 22, 22, 15, 15}}, + {m68k_op_move_16_tos_i , 0xffff, 0x46fc, { 16, 16, 10, 10}}, + {m68k_op_link_32_a7 , 0xffff, 0x480f, { 0, 0, 6, 6}}, + {m68k_op_nbcd_8_pi7 , 0xffff, 0x481f, { 12, 12, 10, 10}}, + {m68k_op_nbcd_8_pd7 , 0xffff, 0x4827, { 14, 14, 11, 11}}, + {m68k_op_nbcd_8_aw , 0xffff, 0x4838, { 16, 16, 10, 10}}, + {m68k_op_nbcd_8_al , 0xffff, 0x4839, { 20, 20, 10, 10}}, + {m68k_op_pea_32_aw , 0xffff, 0x4878, { 16, 16, 9, 9}}, + {m68k_op_pea_32_al , 0xffff, 0x4879, { 20, 20, 9, 9}}, + {m68k_op_pea_32_pcdi , 0xffff, 0x487a, { 16, 16, 10, 10}}, + {m68k_op_pea_32_pcix , 0xffff, 0x487b, { 20, 20, 12, 12}}, + {m68k_op_movem_16_re_aw , 0xffff, 0x48b8, { 12, 12, 8, 8}}, + {m68k_op_movem_16_re_al , 0xffff, 0x48b9, { 16, 16, 8, 8}}, + {m68k_op_movem_32_re_aw , 0xffff, 0x48f8, { 12, 12, 8, 8}}, + {m68k_op_movem_32_re_al , 0xffff, 0x48f9, { 16, 16, 8, 8}}, + {m68k_op_tst_8_pi7 , 0xffff, 0x4a1f, { 8, 8, 6, 6}}, + {m68k_op_tst_8_pd7 , 0xffff, 0x4a27, { 10, 10, 7, 7}}, + {m68k_op_tst_8_aw , 0xffff, 0x4a38, { 12, 12, 6, 6}}, + {m68k_op_tst_8_al , 0xffff, 0x4a39, { 16, 16, 6, 6}}, + {m68k_op_tst_8_pcdi , 0xffff, 0x4a3a, { 0, 0, 7, 7}}, + {m68k_op_tst_8_pcix , 0xffff, 0x4a3b, { 0, 0, 9, 9}}, + {m68k_op_tst_8_i , 0xffff, 0x4a3c, { 0, 0, 6, 6}}, + {m68k_op_tst_16_aw , 0xffff, 0x4a78, { 12, 12, 6, 6}}, + {m68k_op_tst_16_al , 0xffff, 0x4a79, { 16, 16, 6, 6}}, + {m68k_op_tst_16_pcdi , 0xffff, 0x4a7a, { 0, 0, 7, 7}}, + {m68k_op_tst_16_pcix , 0xffff, 0x4a7b, { 0, 0, 9, 9}}, + {m68k_op_tst_16_i , 0xffff, 0x4a7c, { 0, 0, 6, 6}}, + {m68k_op_tst_32_aw , 0xffff, 0x4ab8, { 16, 16, 6, 6}}, + {m68k_op_tst_32_al , 0xffff, 0x4ab9, { 20, 20, 6, 6}}, + {m68k_op_tst_32_pcdi , 0xffff, 0x4aba, { 0, 0, 7, 7}}, + {m68k_op_tst_32_pcix , 0xffff, 0x4abb, { 0, 0, 9, 9}}, + {m68k_op_tst_32_i , 0xffff, 0x4abc, { 0, 0, 6, 6}}, + {m68k_op_tas_8_pi7 , 0xffff, 0x4adf, { 18, 18, 16, 16}}, + {m68k_op_tas_8_pd7 , 0xffff, 0x4ae7, { 20, 20, 17, 17}}, + {m68k_op_tas_8_aw , 0xffff, 0x4af8, { 22, 22, 16, 16}}, + {m68k_op_tas_8_al , 0xffff, 0x4af9, { 26, 26, 16, 16}}, + {m68k_op_illegal , 0xffff, 0x4afc, { 4, 4, 4, 4}}, + {m68k_op_mull_32_aw , 0xffff, 0x4c38, { 0, 0, 47, 47}}, + {m68k_op_mull_32_al , 0xffff, 0x4c39, { 0, 0, 47, 47}}, + {m68k_op_mull_32_pcdi , 0xffff, 0x4c3a, { 0, 0, 48, 48}}, + {m68k_op_mull_32_pcix , 0xffff, 0x4c3b, { 0, 0, 50, 50}}, + {m68k_op_mull_32_i , 0xffff, 0x4c3c, { 0, 0, 47, 47}}, + {m68k_op_divl_32_aw , 0xffff, 0x4c78, { 0, 0, 88, 88}}, + {m68k_op_divl_32_al , 0xffff, 0x4c79, { 0, 0, 88, 88}}, + {m68k_op_divl_32_pcdi , 0xffff, 0x4c7a, { 0, 0, 89, 89}}, + {m68k_op_divl_32_pcix , 0xffff, 0x4c7b, { 0, 0, 91, 91}}, + {m68k_op_divl_32_i , 0xffff, 0x4c7c, { 0, 0, 88, 88}}, + {m68k_op_movem_16_er_aw , 0xffff, 0x4cb8, { 16, 16, 12, 12}}, + {m68k_op_movem_16_er_al , 0xffff, 0x4cb9, { 20, 20, 12, 12}}, + {m68k_op_movem_16_er_pcdi , 0xffff, 0x4cba, { 16, 16, 9, 9}}, + {m68k_op_movem_16_er_pcix , 0xffff, 0x4cbb, { 18, 18, 11, 11}}, + {m68k_op_movem_32_er_aw , 0xffff, 0x4cf8, { 16, 16, 12, 12}}, + {m68k_op_movem_32_er_al , 0xffff, 0x4cf9, { 20, 20, 12, 12}}, + {m68k_op_movem_32_er_pcdi , 0xffff, 0x4cfa, { 16, 16, 9, 9}}, + {m68k_op_movem_32_er_pcix , 0xffff, 0x4cfb, { 18, 18, 11, 11}}, + {m68k_op_link_16_a7 , 0xffff, 0x4e57, { 16, 16, 5, 5}}, + {m68k_op_unlk_32_a7 , 0xffff, 0x4e5f, { 12, 12, 6, 6}}, + {m68k_op_reset , 0xffff, 0x4e70, { 0, 0, 0, 0}}, + {m68k_op_nop , 0xffff, 0x4e71, { 4, 4, 2, 2}}, + {m68k_op_stop , 0xffff, 0x4e72, { 4, 4, 8, 8}}, + {m68k_op_rte_32 , 0xffff, 0x4e73, { 20, 24, 20, 20}}, + {m68k_op_rtd_32 , 0xffff, 0x4e74, { 0, 16, 10, 10}}, + {m68k_op_rts_32 , 0xffff, 0x4e75, { 16, 16, 10, 10}}, + {m68k_op_trapv , 0xffff, 0x4e76, { 4, 4, 4, 4}}, + {m68k_op_rtr_32 , 0xffff, 0x4e77, { 20, 20, 14, 14}}, + {m68k_op_movec_32_cr , 0xffff, 0x4e7a, { 0, 12, 6, 6}}, + {m68k_op_movec_32_rc , 0xffff, 0x4e7b, { 0, 10, 12, 12}}, + {m68k_op_jsr_32_aw , 0xffff, 0x4eb8, { 18, 18, 4, 4}}, + {m68k_op_jsr_32_al , 0xffff, 0x4eb9, { 20, 20, 4, 4}}, + {m68k_op_jsr_32_pcdi , 0xffff, 0x4eba, { 18, 18, 5, 5}}, + {m68k_op_jsr_32_pcix , 0xffff, 0x4ebb, { 22, 22, 7, 7}}, + {m68k_op_jmp_32_aw , 0xffff, 0x4ef8, { 10, 10, 4, 4}}, + {m68k_op_jmp_32_al , 0xffff, 0x4ef9, { 12, 12, 4, 4}}, + {m68k_op_jmp_32_pcdi , 0xffff, 0x4efa, { 10, 10, 5, 5}}, + {m68k_op_jmp_32_pcix , 0xffff, 0x4efb, { 14, 14, 7, 7}}, + {m68k_op_st_8_pi7 , 0xffff, 0x50df, { 12, 12, 10, 10}}, + {m68k_op_st_8_pd7 , 0xffff, 0x50e7, { 14, 14, 11, 11}}, + {m68k_op_st_8_aw , 0xffff, 0x50f8, { 16, 16, 10, 10}}, + {m68k_op_st_8_al , 0xffff, 0x50f9, { 20, 20, 10, 10}}, + {m68k_op_trapt_16 , 0xffff, 0x50fa, { 0, 0, 6, 6}}, + {m68k_op_trapt_32 , 0xffff, 0x50fb, { 0, 0, 8, 8}}, + {m68k_op_trapt , 0xffff, 0x50fc, { 0, 0, 4, 4}}, + {m68k_op_sf_8_pi7 , 0xffff, 0x51df, { 12, 12, 10, 10}}, + {m68k_op_sf_8_pd7 , 0xffff, 0x51e7, { 14, 14, 11, 11}}, + {m68k_op_sf_8_aw , 0xffff, 0x51f8, { 16, 16, 10, 10}}, + {m68k_op_sf_8_al , 0xffff, 0x51f9, { 20, 20, 10, 10}}, + {m68k_op_trapf_16 , 0xffff, 0x51fa, { 0, 0, 6, 6}}, + {m68k_op_trapf_32 , 0xffff, 0x51fb, { 0, 0, 8, 8}}, + {m68k_op_trapf , 0xffff, 0x51fc, { 0, 0, 4, 4}}, + {m68k_op_shi_8_pi7 , 0xffff, 0x52df, { 12, 12, 10, 10}}, + {m68k_op_shi_8_pd7 , 0xffff, 0x52e7, { 14, 14, 11, 11}}, + {m68k_op_shi_8_aw , 0xffff, 0x52f8, { 16, 16, 10, 10}}, + {m68k_op_shi_8_al , 0xffff, 0x52f9, { 20, 20, 10, 10}}, + {m68k_op_traphi_16 , 0xffff, 0x52fa, { 0, 0, 6, 6}}, + {m68k_op_traphi_32 , 0xffff, 0x52fb, { 0, 0, 8, 8}}, + {m68k_op_traphi , 0xffff, 0x52fc, { 0, 0, 4, 4}}, + {m68k_op_sls_8_pi7 , 0xffff, 0x53df, { 12, 12, 10, 10}}, + {m68k_op_sls_8_pd7 , 0xffff, 0x53e7, { 14, 14, 11, 11}}, + {m68k_op_sls_8_aw , 0xffff, 0x53f8, { 16, 16, 10, 10}}, + {m68k_op_sls_8_al , 0xffff, 0x53f9, { 20, 20, 10, 10}}, + {m68k_op_trapls_16 , 0xffff, 0x53fa, { 0, 0, 6, 6}}, + {m68k_op_trapls_32 , 0xffff, 0x53fb, { 0, 0, 8, 8}}, + {m68k_op_trapls , 0xffff, 0x53fc, { 0, 0, 4, 4}}, + {m68k_op_scc_8_pi7 , 0xffff, 0x54df, { 12, 12, 10, 10}}, + {m68k_op_scc_8_pd7 , 0xffff, 0x54e7, { 14, 14, 11, 11}}, + {m68k_op_scc_8_aw , 0xffff, 0x54f8, { 16, 16, 10, 10}}, + {m68k_op_scc_8_al , 0xffff, 0x54f9, { 20, 20, 10, 10}}, + {m68k_op_trapcc_16 , 0xffff, 0x54fa, { 0, 0, 6, 6}}, + {m68k_op_trapcc_32 , 0xffff, 0x54fb, { 0, 0, 8, 8}}, + {m68k_op_trapcc , 0xffff, 0x54fc, { 0, 0, 4, 4}}, + {m68k_op_scs_8_pi7 , 0xffff, 0x55df, { 12, 12, 10, 10}}, + {m68k_op_scs_8_pd7 , 0xffff, 0x55e7, { 14, 14, 11, 11}}, + {m68k_op_scs_8_aw , 0xffff, 0x55f8, { 16, 16, 10, 10}}, + {m68k_op_scs_8_al , 0xffff, 0x55f9, { 20, 20, 10, 10}}, + {m68k_op_trapcs_16 , 0xffff, 0x55fa, { 0, 0, 6, 6}}, + {m68k_op_trapcs_32 , 0xffff, 0x55fb, { 0, 0, 8, 8}}, + {m68k_op_trapcs , 0xffff, 0x55fc, { 0, 0, 4, 4}}, + {m68k_op_sne_8_pi7 , 0xffff, 0x56df, { 12, 12, 10, 10}}, + {m68k_op_sne_8_pd7 , 0xffff, 0x56e7, { 14, 14, 11, 11}}, + {m68k_op_sne_8_aw , 0xffff, 0x56f8, { 16, 16, 10, 10}}, + {m68k_op_sne_8_al , 0xffff, 0x56f9, { 20, 20, 10, 10}}, + {m68k_op_trapne_16 , 0xffff, 0x56fa, { 0, 0, 6, 6}}, + {m68k_op_trapne_32 , 0xffff, 0x56fb, { 0, 0, 8, 8}}, + {m68k_op_trapne , 0xffff, 0x56fc, { 0, 0, 4, 4}}, + {m68k_op_seq_8_pi7 , 0xffff, 0x57df, { 12, 12, 10, 10}}, + {m68k_op_seq_8_pd7 , 0xffff, 0x57e7, { 14, 14, 11, 11}}, + {m68k_op_seq_8_aw , 0xffff, 0x57f8, { 16, 16, 10, 10}}, + {m68k_op_seq_8_al , 0xffff, 0x57f9, { 20, 20, 10, 10}}, + {m68k_op_trapeq_16 , 0xffff, 0x57fa, { 0, 0, 6, 6}}, + {m68k_op_trapeq_32 , 0xffff, 0x57fb, { 0, 0, 8, 8}}, + {m68k_op_trapeq , 0xffff, 0x57fc, { 0, 0, 4, 4}}, + {m68k_op_svc_8_pi7 , 0xffff, 0x58df, { 12, 12, 10, 10}}, + {m68k_op_svc_8_pd7 , 0xffff, 0x58e7, { 14, 14, 11, 11}}, + {m68k_op_svc_8_aw , 0xffff, 0x58f8, { 16, 16, 10, 10}}, + {m68k_op_svc_8_al , 0xffff, 0x58f9, { 20, 20, 10, 10}}, + {m68k_op_trapvc_16 , 0xffff, 0x58fa, { 0, 0, 6, 6}}, + {m68k_op_trapvc_32 , 0xffff, 0x58fb, { 0, 0, 8, 8}}, + {m68k_op_trapvc , 0xffff, 0x58fc, { 0, 0, 4, 4}}, + {m68k_op_svs_8_pi7 , 0xffff, 0x59df, { 12, 12, 10, 10}}, + {m68k_op_svs_8_pd7 , 0xffff, 0x59e7, { 14, 14, 11, 11}}, + {m68k_op_svs_8_aw , 0xffff, 0x59f8, { 16, 16, 10, 10}}, + {m68k_op_svs_8_al , 0xffff, 0x59f9, { 20, 20, 10, 10}}, + {m68k_op_trapvs_16 , 0xffff, 0x59fa, { 0, 0, 6, 6}}, + {m68k_op_trapvs_32 , 0xffff, 0x59fb, { 0, 0, 8, 8}}, + {m68k_op_trapvs , 0xffff, 0x59fc, { 0, 0, 4, 4}}, + {m68k_op_spl_8_pi7 , 0xffff, 0x5adf, { 12, 12, 10, 10}}, + {m68k_op_spl_8_pd7 , 0xffff, 0x5ae7, { 14, 14, 11, 11}}, + {m68k_op_spl_8_aw , 0xffff, 0x5af8, { 16, 16, 10, 10}}, + {m68k_op_spl_8_al , 0xffff, 0x5af9, { 20, 20, 10, 10}}, + {m68k_op_trappl_16 , 0xffff, 0x5afa, { 0, 0, 6, 6}}, + {m68k_op_trappl_32 , 0xffff, 0x5afb, { 0, 0, 8, 8}}, + {m68k_op_trappl , 0xffff, 0x5afc, { 0, 0, 4, 4}}, + {m68k_op_smi_8_pi7 , 0xffff, 0x5bdf, { 12, 12, 10, 10}}, + {m68k_op_smi_8_pd7 , 0xffff, 0x5be7, { 14, 14, 11, 11}}, + {m68k_op_smi_8_aw , 0xffff, 0x5bf8, { 16, 16, 10, 10}}, + {m68k_op_smi_8_al , 0xffff, 0x5bf9, { 20, 20, 10, 10}}, + {m68k_op_trapmi_16 , 0xffff, 0x5bfa, { 0, 0, 6, 6}}, + {m68k_op_trapmi_32 , 0xffff, 0x5bfb, { 0, 0, 8, 8}}, + {m68k_op_trapmi , 0xffff, 0x5bfc, { 0, 0, 4, 4}}, + {m68k_op_sge_8_pi7 , 0xffff, 0x5cdf, { 12, 12, 10, 10}}, + {m68k_op_sge_8_pd7 , 0xffff, 0x5ce7, { 14, 14, 11, 11}}, + {m68k_op_sge_8_aw , 0xffff, 0x5cf8, { 16, 16, 10, 10}}, + {m68k_op_sge_8_al , 0xffff, 0x5cf9, { 20, 20, 10, 10}}, + {m68k_op_trapge_16 , 0xffff, 0x5cfa, { 0, 0, 6, 6}}, + {m68k_op_trapge_32 , 0xffff, 0x5cfb, { 0, 0, 8, 8}}, + {m68k_op_trapge , 0xffff, 0x5cfc, { 0, 0, 4, 4}}, + {m68k_op_slt_8_pi7 , 0xffff, 0x5ddf, { 12, 12, 10, 10}}, + {m68k_op_slt_8_pd7 , 0xffff, 0x5de7, { 14, 14, 11, 11}}, + {m68k_op_slt_8_aw , 0xffff, 0x5df8, { 16, 16, 10, 10}}, + {m68k_op_slt_8_al , 0xffff, 0x5df9, { 20, 20, 10, 10}}, + {m68k_op_traplt_16 , 0xffff, 0x5dfa, { 0, 0, 6, 6}}, + {m68k_op_traplt_32 , 0xffff, 0x5dfb, { 0, 0, 8, 8}}, + {m68k_op_traplt , 0xffff, 0x5dfc, { 0, 0, 4, 4}}, + {m68k_op_sgt_8_pi7 , 0xffff, 0x5edf, { 12, 12, 10, 10}}, + {m68k_op_sgt_8_pd7 , 0xffff, 0x5ee7, { 14, 14, 11, 11}}, + {m68k_op_sgt_8_aw , 0xffff, 0x5ef8, { 16, 16, 10, 10}}, + {m68k_op_sgt_8_al , 0xffff, 0x5ef9, { 20, 20, 10, 10}}, + {m68k_op_trapgt_16 , 0xffff, 0x5efa, { 0, 0, 6, 6}}, + {m68k_op_trapgt_32 , 0xffff, 0x5efb, { 0, 0, 8, 8}}, + {m68k_op_trapgt , 0xffff, 0x5efc, { 0, 0, 4, 4}}, + {m68k_op_sle_8_pi7 , 0xffff, 0x5fdf, { 12, 12, 10, 10}}, + {m68k_op_sle_8_pd7 , 0xffff, 0x5fe7, { 14, 14, 11, 11}}, + {m68k_op_sle_8_aw , 0xffff, 0x5ff8, { 16, 16, 10, 10}}, + {m68k_op_sle_8_al , 0xffff, 0x5ff9, { 20, 20, 10, 10}}, + {m68k_op_traple_16 , 0xffff, 0x5ffa, { 0, 0, 6, 6}}, + {m68k_op_traple_32 , 0xffff, 0x5ffb, { 0, 0, 8, 8}}, + {m68k_op_traple , 0xffff, 0x5ffc, { 0, 0, 4, 4}}, + {m68k_op_bra_16 , 0xffff, 0x6000, { 10, 10, 10, 10}}, + {m68k_op_bra_32 , 0xffff, 0x60ff, { 10, 10, 10, 10}}, + {m68k_op_bsr_16 , 0xffff, 0x6100, { 18, 18, 7, 7}}, + {m68k_op_bsr_32 , 0xffff, 0x61ff, { 18, 18, 7, 7}}, + {m68k_op_bhi_16 , 0xffff, 0x6200, { 10, 10, 6, 6}}, + {m68k_op_bhi_32 , 0xffff, 0x62ff, { 10, 10, 6, 6}}, + {m68k_op_bls_16 , 0xffff, 0x6300, { 10, 10, 6, 6}}, + {m68k_op_bls_32 , 0xffff, 0x63ff, { 10, 10, 6, 6}}, + {m68k_op_bcc_16 , 0xffff, 0x6400, { 10, 10, 6, 6}}, + {m68k_op_bcc_32 , 0xffff, 0x64ff, { 10, 10, 6, 6}}, + {m68k_op_bcs_16 , 0xffff, 0x6500, { 10, 10, 6, 6}}, + {m68k_op_bcs_32 , 0xffff, 0x65ff, { 10, 10, 6, 6}}, + {m68k_op_bne_16 , 0xffff, 0x6600, { 10, 10, 6, 6}}, + {m68k_op_bne_32 , 0xffff, 0x66ff, { 10, 10, 6, 6}}, + {m68k_op_beq_16 , 0xffff, 0x6700, { 10, 10, 6, 6}}, + {m68k_op_beq_32 , 0xffff, 0x67ff, { 10, 10, 6, 6}}, + {m68k_op_bvc_16 , 0xffff, 0x6800, { 10, 10, 6, 6}}, + {m68k_op_bvc_32 , 0xffff, 0x68ff, { 10, 10, 6, 6}}, + {m68k_op_bvs_16 , 0xffff, 0x6900, { 10, 10, 6, 6}}, + {m68k_op_bvs_32 , 0xffff, 0x69ff, { 10, 10, 6, 6}}, + {m68k_op_bpl_16 , 0xffff, 0x6a00, { 10, 10, 6, 6}}, + {m68k_op_bpl_32 , 0xffff, 0x6aff, { 10, 10, 6, 6}}, + {m68k_op_bmi_16 , 0xffff, 0x6b00, { 10, 10, 6, 6}}, + {m68k_op_bmi_32 , 0xffff, 0x6bff, { 10, 10, 6, 6}}, + {m68k_op_bge_16 , 0xffff, 0x6c00, { 10, 10, 6, 6}}, + {m68k_op_bge_32 , 0xffff, 0x6cff, { 10, 10, 6, 6}}, + {m68k_op_blt_16 , 0xffff, 0x6d00, { 10, 10, 6, 6}}, + {m68k_op_blt_32 , 0xffff, 0x6dff, { 10, 10, 6, 6}}, + {m68k_op_bgt_16 , 0xffff, 0x6e00, { 10, 10, 6, 6}}, + {m68k_op_bgt_32 , 0xffff, 0x6eff, { 10, 10, 6, 6}}, + {m68k_op_ble_16 , 0xffff, 0x6f00, { 10, 10, 6, 6}}, + {m68k_op_ble_32 , 0xffff, 0x6fff, { 10, 10, 6, 6}}, + {m68k_op_sbcd_8_mm_axy7 , 0xffff, 0x8f0f, { 18, 18, 16, 16}}, + {m68k_op_pack_16_mm_axy7 , 0xffff, 0x8f4f, { 0, 0, 13, 13}}, + {m68k_op_unpk_16_mm_axy7 , 0xffff, 0x8f8f, { 0, 0, 13, 13}}, + {m68k_op_subx_8_mm_axy7 , 0xffff, 0x9f0f, { 18, 18, 12, 12}}, + {m68k_op_cmpm_8_axy7 , 0xffff, 0xbf0f, { 12, 12, 9, 9}}, + {m68k_op_abcd_8_mm_axy7 , 0xffff, 0xcf0f, { 18, 18, 16, 16}}, + {m68k_op_addx_8_mm_axy7 , 0xffff, 0xdf0f, { 18, 18, 12, 12}}, + {m68k_op_asr_16_aw , 0xffff, 0xe0f8, { 16, 16, 9, 9}}, + {m68k_op_asr_16_al , 0xffff, 0xe0f9, { 20, 20, 9, 9}}, + {m68k_op_asl_16_aw , 0xffff, 0xe1f8, { 16, 16, 10, 10}}, + {m68k_op_asl_16_al , 0xffff, 0xe1f9, { 20, 20, 10, 10}}, + {m68k_op_lsr_16_aw , 0xffff, 0xe2f8, { 16, 16, 9, 9}}, + {m68k_op_lsr_16_al , 0xffff, 0xe2f9, { 20, 20, 9, 9}}, + {m68k_op_lsl_16_aw , 0xffff, 0xe3f8, { 16, 16, 9, 9}}, + {m68k_op_lsl_16_al , 0xffff, 0xe3f9, { 20, 20, 9, 9}}, + {m68k_op_roxr_16_aw , 0xffff, 0xe4f8, { 16, 16, 9, 9}}, + {m68k_op_roxr_16_al , 0xffff, 0xe4f9, { 20, 20, 9, 9}}, + {m68k_op_roxl_16_aw , 0xffff, 0xe5f8, { 16, 16, 9, 9}}, + {m68k_op_roxl_16_al , 0xffff, 0xe5f9, { 20, 20, 9, 9}}, + {m68k_op_ror_16_aw , 0xffff, 0xe6f8, { 16, 16, 11, 11}}, + {m68k_op_ror_16_al , 0xffff, 0xe6f9, { 20, 20, 11, 11}}, + {m68k_op_rol_16_aw , 0xffff, 0xe7f8, { 16, 16, 11, 11}}, + {m68k_op_rol_16_al , 0xffff, 0xe7f9, { 20, 20, 11, 11}}, + {m68k_op_bftst_32_aw , 0xffff, 0xe8f8, { 0, 0, 17, 17}}, + {m68k_op_bftst_32_al , 0xffff, 0xe8f9, { 0, 0, 17, 17}}, + {m68k_op_bftst_32_pcdi , 0xffff, 0xe8fa, { 0, 0, 18, 18}}, + {m68k_op_bftst_32_pcix , 0xffff, 0xe8fb, { 0, 0, 20, 20}}, + {m68k_op_bfextu_32_aw , 0xffff, 0xe9f8, { 0, 0, 19, 19}}, + {m68k_op_bfextu_32_al , 0xffff, 0xe9f9, { 0, 0, 19, 19}}, + {m68k_op_bfextu_32_pcdi , 0xffff, 0xe9fa, { 0, 0, 20, 20}}, + {m68k_op_bfextu_32_pcix , 0xffff, 0xe9fb, { 0, 0, 22, 22}}, + {m68k_op_bfchg_32_aw , 0xffff, 0xeaf8, { 0, 0, 24, 24}}, + {m68k_op_bfchg_32_al , 0xffff, 0xeaf9, { 0, 0, 24, 24}}, + {m68k_op_bfexts_32_aw , 0xffff, 0xebf8, { 0, 0, 19, 19}}, + {m68k_op_bfexts_32_al , 0xffff, 0xebf9, { 0, 0, 19, 19}}, + {m68k_op_bfexts_32_pcdi , 0xffff, 0xebfa, { 0, 0, 20, 20}}, + {m68k_op_bfexts_32_pcix , 0xffff, 0xebfb, { 0, 0, 22, 22}}, + {m68k_op_bfclr_32_aw , 0xffff, 0xecf8, { 0, 0, 24, 24}}, + {m68k_op_bfclr_32_al , 0xffff, 0xecf9, { 0, 0, 24, 24}}, + {m68k_op_bfffo_32_aw , 0xffff, 0xedf8, { 0, 0, 32, 32}}, + {m68k_op_bfffo_32_al , 0xffff, 0xedf9, { 0, 0, 32, 32}}, + {m68k_op_bfffo_32_pcdi , 0xffff, 0xedfa, { 0, 0, 33, 33}}, + {m68k_op_bfffo_32_pcix , 0xffff, 0xedfb, { 0, 0, 35, 35}}, + {m68k_op_bfset_32_aw , 0xffff, 0xeef8, { 0, 0, 24, 24}}, + {m68k_op_bfset_32_al , 0xffff, 0xeef9, { 0, 0, 24, 24}}, + {m68k_op_bfins_32_aw , 0xffff, 0xeff8, { 0, 0, 21, 21}}, + {m68k_op_bfins_32_al , 0xffff, 0xeff9, { 0, 0, 21, 21}}, + {m68k_op_pflush_32 , 0xffff, 0xf518, { 0, 0, 0, 4}}, + {0, 0, 0, {0, 0, 0, 0}} +}; + + +/* Build the opcode handler jump table */ +void m68ki_build_opcode_table(void) +{ + const opcode_handler_struct *ostruct; + int instr; + int i; + int j; + int k; + + for(i = 0; i < 0x10000; i++) + { + /* default to illegal */ + m68ki_instruction_jump_table[i] = m68k_op_illegal; + for(k=0;kmask != 0xff00) + { + for(i = 0;i < 0x10000;i++) + { + if((i & ostruct->mask) == ostruct->match) + { + m68ki_instruction_jump_table[i] = ostruct->opcode_handler; + for(k=0;kcycles[k]; + } + } + ostruct++; + } + while(ostruct->mask == 0xff00) + { + for(i = 0;i <= 0xff;i++) + { + m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler; + for(k=0;kmatch | i] = ostruct->cycles[k]; + } + ostruct++; + } + while(ostruct->mask == 0xf1f8) + { + for(i = 0;i < 8;i++) + { + for(j = 0;j < 8;j++) + { + instr = ostruct->match | (i << 9) | j; + m68ki_instruction_jump_table[instr] = ostruct->opcode_handler; + for(k=0;kcycles[k]; + } + } + ostruct++; + } + while(ostruct->mask == 0xfff0) + { + for(i = 0;i <= 0x0f;i++) + { + m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler; + for(k=0;kmatch | i] = ostruct->cycles[k]; + } + ostruct++; + } + while(ostruct->mask == 0xf1ff) + { + for(i = 0;i <= 0x07;i++) + { + m68ki_instruction_jump_table[ostruct->match | (i << 9)] = ostruct->opcode_handler; + for(k=0;kmatch | (i << 9)] = ostruct->cycles[k]; + } + ostruct++; + } + while(ostruct->mask == 0xfff8) + { + for(i = 0;i <= 0x07;i++) + { + m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler; + for(k=0;kmatch | i] = ostruct->cycles[k]; + } + ostruct++; + } + while(ostruct->mask == 0xffff) + { + m68ki_instruction_jump_table[ostruct->match] = ostruct->opcode_handler; + for(k=0;kmatch] = ostruct->cycles[k]; + ostruct++; + } +} + + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ + + diff --git a/source/m68k/m68kops.h b/source/m68k/m68kops.h index d3c4e07..12bef88 100644 --- a/source/m68k/m68kops.h +++ b/source/m68k/m68kops.h @@ -1,1984 +1,22 @@ -#ifndef M68KOPS__HEADER -#define M68KOPS__HEADER - -/* ======================================================================== */ -/* ============================ OPCODE HANDLERS =========================== */ -/* ======================================================================== */ - - -void m68k_op_1010(void); -void m68k_op_1111(void); -void m68k_op_abcd_8_rr(void); -void m68k_op_abcd_8_mm_ax7(void); -void m68k_op_abcd_8_mm_ay7(void); -void m68k_op_abcd_8_mm_axy7(void); -void m68k_op_abcd_8_mm(void); -void m68k_op_add_8_er_d(void); -void m68k_op_add_8_er_ai(void); -void m68k_op_add_8_er_pi(void); -void m68k_op_add_8_er_pi7(void); -void m68k_op_add_8_er_pd(void); -void m68k_op_add_8_er_pd7(void); -void m68k_op_add_8_er_di(void); -void m68k_op_add_8_er_ix(void); -void m68k_op_add_8_er_aw(void); -void m68k_op_add_8_er_al(void); -void m68k_op_add_8_er_pcdi(void); -void m68k_op_add_8_er_pcix(void); -void m68k_op_add_8_er_i(void); -void m68k_op_add_16_er_d(void); -void m68k_op_add_16_er_a(void); -void m68k_op_add_16_er_ai(void); -void m68k_op_add_16_er_pi(void); -void m68k_op_add_16_er_pd(void); -void m68k_op_add_16_er_di(void); -void m68k_op_add_16_er_ix(void); -void m68k_op_add_16_er_aw(void); -void m68k_op_add_16_er_al(void); -void m68k_op_add_16_er_pcdi(void); -void m68k_op_add_16_er_pcix(void); -void m68k_op_add_16_er_i(void); -void m68k_op_add_32_er_d(void); -void m68k_op_add_32_er_a(void); -void m68k_op_add_32_er_ai(void); -void m68k_op_add_32_er_pi(void); -void m68k_op_add_32_er_pd(void); -void m68k_op_add_32_er_di(void); -void m68k_op_add_32_er_ix(void); -void m68k_op_add_32_er_aw(void); -void m68k_op_add_32_er_al(void); -void m68k_op_add_32_er_pcdi(void); -void m68k_op_add_32_er_pcix(void); -void m68k_op_add_32_er_i(void); -void m68k_op_add_8_re_ai(void); -void m68k_op_add_8_re_pi(void); -void m68k_op_add_8_re_pi7(void); -void m68k_op_add_8_re_pd(void); -void m68k_op_add_8_re_pd7(void); -void m68k_op_add_8_re_di(void); -void m68k_op_add_8_re_ix(void); -void m68k_op_add_8_re_aw(void); -void m68k_op_add_8_re_al(void); -void m68k_op_add_16_re_ai(void); -void m68k_op_add_16_re_pi(void); -void m68k_op_add_16_re_pd(void); -void m68k_op_add_16_re_di(void); -void m68k_op_add_16_re_ix(void); -void m68k_op_add_16_re_aw(void); -void m68k_op_add_16_re_al(void); -void m68k_op_add_32_re_ai(void); -void m68k_op_add_32_re_pi(void); -void m68k_op_add_32_re_pd(void); -void m68k_op_add_32_re_di(void); -void m68k_op_add_32_re_ix(void); -void m68k_op_add_32_re_aw(void); -void m68k_op_add_32_re_al(void); -void m68k_op_adda_16_d(void); -void m68k_op_adda_16_a(void); -void m68k_op_adda_16_ai(void); -void m68k_op_adda_16_pi(void); -void m68k_op_adda_16_pd(void); -void m68k_op_adda_16_di(void); -void m68k_op_adda_16_ix(void); -void m68k_op_adda_16_aw(void); -void m68k_op_adda_16_al(void); -void m68k_op_adda_16_pcdi(void); -void m68k_op_adda_16_pcix(void); -void m68k_op_adda_16_i(void); -void m68k_op_adda_32_d(void); -void m68k_op_adda_32_a(void); -void m68k_op_adda_32_ai(void); -void m68k_op_adda_32_pi(void); -void m68k_op_adda_32_pd(void); -void m68k_op_adda_32_di(void); -void m68k_op_adda_32_ix(void); -void m68k_op_adda_32_aw(void); -void m68k_op_adda_32_al(void); -void m68k_op_adda_32_pcdi(void); -void m68k_op_adda_32_pcix(void); -void m68k_op_adda_32_i(void); -void m68k_op_addi_8_d(void); -void m68k_op_addi_8_ai(void); -void m68k_op_addi_8_pi(void); -void m68k_op_addi_8_pi7(void); -void m68k_op_addi_8_pd(void); -void m68k_op_addi_8_pd7(void); -void m68k_op_addi_8_di(void); -void m68k_op_addi_8_ix(void); -void m68k_op_addi_8_aw(void); -void m68k_op_addi_8_al(void); -void m68k_op_addi_16_d(void); -void m68k_op_addi_16_ai(void); -void m68k_op_addi_16_pi(void); -void m68k_op_addi_16_pd(void); -void m68k_op_addi_16_di(void); -void m68k_op_addi_16_ix(void); -void m68k_op_addi_16_aw(void); -void m68k_op_addi_16_al(void); -void m68k_op_addi_32_d(void); -void m68k_op_addi_32_ai(void); -void m68k_op_addi_32_pi(void); -void m68k_op_addi_32_pd(void); -void m68k_op_addi_32_di(void); -void m68k_op_addi_32_ix(void); -void m68k_op_addi_32_aw(void); -void m68k_op_addi_32_al(void); -void m68k_op_addq_8_d(void); -void m68k_op_addq_8_ai(void); -void m68k_op_addq_8_pi(void); -void m68k_op_addq_8_pi7(void); -void m68k_op_addq_8_pd(void); -void m68k_op_addq_8_pd7(void); -void m68k_op_addq_8_di(void); -void m68k_op_addq_8_ix(void); -void m68k_op_addq_8_aw(void); -void m68k_op_addq_8_al(void); -void m68k_op_addq_16_d(void); -void m68k_op_addq_16_a(void); -void m68k_op_addq_16_ai(void); -void m68k_op_addq_16_pi(void); -void m68k_op_addq_16_pd(void); -void m68k_op_addq_16_di(void); -void m68k_op_addq_16_ix(void); -void m68k_op_addq_16_aw(void); -void m68k_op_addq_16_al(void); -void m68k_op_addq_32_d(void); -void m68k_op_addq_32_a(void); -void m68k_op_addq_32_ai(void); -void m68k_op_addq_32_pi(void); -void m68k_op_addq_32_pd(void); -void m68k_op_addq_32_di(void); -void m68k_op_addq_32_ix(void); -void m68k_op_addq_32_aw(void); -void m68k_op_addq_32_al(void); -void m68k_op_addx_8_rr(void); -void m68k_op_addx_16_rr(void); -void m68k_op_addx_32_rr(void); -void m68k_op_addx_8_mm_ax7(void); -void m68k_op_addx_8_mm_ay7(void); -void m68k_op_addx_8_mm_axy7(void); -void m68k_op_addx_8_mm(void); -void m68k_op_addx_16_mm(void); -void m68k_op_addx_32_mm(void); -void m68k_op_and_8_er_d(void); -void m68k_op_and_8_er_ai(void); -void m68k_op_and_8_er_pi(void); -void m68k_op_and_8_er_pi7(void); -void m68k_op_and_8_er_pd(void); -void m68k_op_and_8_er_pd7(void); -void m68k_op_and_8_er_di(void); -void m68k_op_and_8_er_ix(void); -void m68k_op_and_8_er_aw(void); -void m68k_op_and_8_er_al(void); -void m68k_op_and_8_er_pcdi(void); -void m68k_op_and_8_er_pcix(void); -void m68k_op_and_8_er_i(void); -void m68k_op_and_16_er_d(void); -void m68k_op_and_16_er_ai(void); -void m68k_op_and_16_er_pi(void); -void m68k_op_and_16_er_pd(void); -void m68k_op_and_16_er_di(void); -void m68k_op_and_16_er_ix(void); -void m68k_op_and_16_er_aw(void); -void m68k_op_and_16_er_al(void); -void m68k_op_and_16_er_pcdi(void); -void m68k_op_and_16_er_pcix(void); -void m68k_op_and_16_er_i(void); -void m68k_op_and_32_er_d(void); -void m68k_op_and_32_er_ai(void); -void m68k_op_and_32_er_pi(void); -void m68k_op_and_32_er_pd(void); -void m68k_op_and_32_er_di(void); -void m68k_op_and_32_er_ix(void); -void m68k_op_and_32_er_aw(void); -void m68k_op_and_32_er_al(void); -void m68k_op_and_32_er_pcdi(void); -void m68k_op_and_32_er_pcix(void); -void m68k_op_and_32_er_i(void); -void m68k_op_and_8_re_ai(void); -void m68k_op_and_8_re_pi(void); -void m68k_op_and_8_re_pi7(void); -void m68k_op_and_8_re_pd(void); -void m68k_op_and_8_re_pd7(void); -void m68k_op_and_8_re_di(void); -void m68k_op_and_8_re_ix(void); -void m68k_op_and_8_re_aw(void); -void m68k_op_and_8_re_al(void); -void m68k_op_and_16_re_ai(void); -void m68k_op_and_16_re_pi(void); -void m68k_op_and_16_re_pd(void); -void m68k_op_and_16_re_di(void); -void m68k_op_and_16_re_ix(void); -void m68k_op_and_16_re_aw(void); -void m68k_op_and_16_re_al(void); -void m68k_op_and_32_re_ai(void); -void m68k_op_and_32_re_pi(void); -void m68k_op_and_32_re_pd(void); -void m68k_op_and_32_re_di(void); -void m68k_op_and_32_re_ix(void); -void m68k_op_and_32_re_aw(void); -void m68k_op_and_32_re_al(void); -void m68k_op_andi_8_d(void); -void m68k_op_andi_8_ai(void); -void m68k_op_andi_8_pi(void); -void m68k_op_andi_8_pi7(void); -void m68k_op_andi_8_pd(void); -void m68k_op_andi_8_pd7(void); -void m68k_op_andi_8_di(void); -void m68k_op_andi_8_ix(void); -void m68k_op_andi_8_aw(void); -void m68k_op_andi_8_al(void); -void m68k_op_andi_16_d(void); -void m68k_op_andi_16_ai(void); -void m68k_op_andi_16_pi(void); -void m68k_op_andi_16_pd(void); -void m68k_op_andi_16_di(void); -void m68k_op_andi_16_ix(void); -void m68k_op_andi_16_aw(void); -void m68k_op_andi_16_al(void); -void m68k_op_andi_32_d(void); -void m68k_op_andi_32_ai(void); -void m68k_op_andi_32_pi(void); -void m68k_op_andi_32_pd(void); -void m68k_op_andi_32_di(void); -void m68k_op_andi_32_ix(void); -void m68k_op_andi_32_aw(void); -void m68k_op_andi_32_al(void); -void m68k_op_andi_16_toc(void); -void m68k_op_andi_16_tos(void); -void m68k_op_asr_8_s(void); -void m68k_op_asr_16_s(void); -void m68k_op_asr_32_s(void); -void m68k_op_asr_8_r(void); -void m68k_op_asr_16_r(void); -void m68k_op_asr_32_r(void); -void m68k_op_asr_16_ai(void); -void m68k_op_asr_16_pi(void); -void m68k_op_asr_16_pd(void); -void m68k_op_asr_16_di(void); -void m68k_op_asr_16_ix(void); -void m68k_op_asr_16_aw(void); -void m68k_op_asr_16_al(void); -void m68k_op_asl_8_s(void); -void m68k_op_asl_16_s(void); -void m68k_op_asl_32_s(void); -void m68k_op_asl_8_r(void); -void m68k_op_asl_16_r(void); -void m68k_op_asl_32_r(void); -void m68k_op_asl_16_ai(void); -void m68k_op_asl_16_pi(void); -void m68k_op_asl_16_pd(void); -void m68k_op_asl_16_di(void); -void m68k_op_asl_16_ix(void); -void m68k_op_asl_16_aw(void); -void m68k_op_asl_16_al(void); -void m68k_op_bhi_8(void); -void m68k_op_bls_8(void); -void m68k_op_bcc_8(void); -void m68k_op_bcs_8(void); -void m68k_op_bne_8(void); -void m68k_op_beq_8(void); -void m68k_op_bvc_8(void); -void m68k_op_bvs_8(void); -void m68k_op_bpl_8(void); -void m68k_op_bmi_8(void); -void m68k_op_bge_8(void); -void m68k_op_blt_8(void); -void m68k_op_bgt_8(void); -void m68k_op_ble_8(void); -void m68k_op_bhi_16(void); -void m68k_op_bls_16(void); -void m68k_op_bcc_16(void); -void m68k_op_bcs_16(void); -void m68k_op_bne_16(void); -void m68k_op_beq_16(void); -void m68k_op_bvc_16(void); -void m68k_op_bvs_16(void); -void m68k_op_bpl_16(void); -void m68k_op_bmi_16(void); -void m68k_op_bge_16(void); -void m68k_op_blt_16(void); -void m68k_op_bgt_16(void); -void m68k_op_ble_16(void); -void m68k_op_bhi_32(void); -void m68k_op_bls_32(void); -void m68k_op_bcc_32(void); -void m68k_op_bcs_32(void); -void m68k_op_bne_32(void); -void m68k_op_beq_32(void); -void m68k_op_bvc_32(void); -void m68k_op_bvs_32(void); -void m68k_op_bpl_32(void); -void m68k_op_bmi_32(void); -void m68k_op_bge_32(void); -void m68k_op_blt_32(void); -void m68k_op_bgt_32(void); -void m68k_op_ble_32(void); -void m68k_op_bchg_32_r_d(void); -void m68k_op_bchg_8_r_ai(void); -void m68k_op_bchg_8_r_pi(void); -void m68k_op_bchg_8_r_pi7(void); -void m68k_op_bchg_8_r_pd(void); -void m68k_op_bchg_8_r_pd7(void); -void m68k_op_bchg_8_r_di(void); -void m68k_op_bchg_8_r_ix(void); -void m68k_op_bchg_8_r_aw(void); -void m68k_op_bchg_8_r_al(void); -void m68k_op_bchg_32_s_d(void); -void m68k_op_bchg_8_s_ai(void); -void m68k_op_bchg_8_s_pi(void); -void m68k_op_bchg_8_s_pi7(void); -void m68k_op_bchg_8_s_pd(void); -void m68k_op_bchg_8_s_pd7(void); -void m68k_op_bchg_8_s_di(void); -void m68k_op_bchg_8_s_ix(void); -void m68k_op_bchg_8_s_aw(void); -void m68k_op_bchg_8_s_al(void); -void m68k_op_bclr_32_r_d(void); -void m68k_op_bclr_8_r_ai(void); -void m68k_op_bclr_8_r_pi(void); -void m68k_op_bclr_8_r_pi7(void); -void m68k_op_bclr_8_r_pd(void); -void m68k_op_bclr_8_r_pd7(void); -void m68k_op_bclr_8_r_di(void); -void m68k_op_bclr_8_r_ix(void); -void m68k_op_bclr_8_r_aw(void); -void m68k_op_bclr_8_r_al(void); -void m68k_op_bclr_32_s_d(void); -void m68k_op_bclr_8_s_ai(void); -void m68k_op_bclr_8_s_pi(void); -void m68k_op_bclr_8_s_pi7(void); -void m68k_op_bclr_8_s_pd(void); -void m68k_op_bclr_8_s_pd7(void); -void m68k_op_bclr_8_s_di(void); -void m68k_op_bclr_8_s_ix(void); -void m68k_op_bclr_8_s_aw(void); -void m68k_op_bclr_8_s_al(void); -void m68k_op_bfchg_32_d(void); -void m68k_op_bfchg_32_ai(void); -void m68k_op_bfchg_32_di(void); -void m68k_op_bfchg_32_ix(void); -void m68k_op_bfchg_32_aw(void); -void m68k_op_bfchg_32_al(void); -void m68k_op_bfclr_32_d(void); -void m68k_op_bfclr_32_ai(void); -void m68k_op_bfclr_32_di(void); -void m68k_op_bfclr_32_ix(void); -void m68k_op_bfclr_32_aw(void); -void m68k_op_bfclr_32_al(void); -void m68k_op_bfexts_32_d(void); -void m68k_op_bfexts_32_ai(void); -void m68k_op_bfexts_32_di(void); -void m68k_op_bfexts_32_ix(void); -void m68k_op_bfexts_32_aw(void); -void m68k_op_bfexts_32_al(void); -void m68k_op_bfexts_32_pcdi(void); -void m68k_op_bfexts_32_pcix(void); -void m68k_op_bfextu_32_d(void); -void m68k_op_bfextu_32_ai(void); -void m68k_op_bfextu_32_di(void); -void m68k_op_bfextu_32_ix(void); -void m68k_op_bfextu_32_aw(void); -void m68k_op_bfextu_32_al(void); -void m68k_op_bfextu_32_pcdi(void); -void m68k_op_bfextu_32_pcix(void); -void m68k_op_bfffo_32_d(void); -void m68k_op_bfffo_32_ai(void); -void m68k_op_bfffo_32_di(void); -void m68k_op_bfffo_32_ix(void); -void m68k_op_bfffo_32_aw(void); -void m68k_op_bfffo_32_al(void); -void m68k_op_bfffo_32_pcdi(void); -void m68k_op_bfffo_32_pcix(void); -void m68k_op_bfins_32_d(void); -void m68k_op_bfins_32_ai(void); -void m68k_op_bfins_32_di(void); -void m68k_op_bfins_32_ix(void); -void m68k_op_bfins_32_aw(void); -void m68k_op_bfins_32_al(void); -void m68k_op_bfset_32_d(void); -void m68k_op_bfset_32_ai(void); -void m68k_op_bfset_32_di(void); -void m68k_op_bfset_32_ix(void); -void m68k_op_bfset_32_aw(void); -void m68k_op_bfset_32_al(void); -void m68k_op_bftst_32_d(void); -void m68k_op_bftst_32_ai(void); -void m68k_op_bftst_32_di(void); -void m68k_op_bftst_32_ix(void); -void m68k_op_bftst_32_aw(void); -void m68k_op_bftst_32_al(void); -void m68k_op_bftst_32_pcdi(void); -void m68k_op_bftst_32_pcix(void); -void m68k_op_bkpt(void); -void m68k_op_bra_8(void); -void m68k_op_bra_16(void); -void m68k_op_bra_32(void); -void m68k_op_bset_32_r_d(void); -void m68k_op_bset_8_r_ai(void); -void m68k_op_bset_8_r_pi(void); -void m68k_op_bset_8_r_pi7(void); -void m68k_op_bset_8_r_pd(void); -void m68k_op_bset_8_r_pd7(void); -void m68k_op_bset_8_r_di(void); -void m68k_op_bset_8_r_ix(void); -void m68k_op_bset_8_r_aw(void); -void m68k_op_bset_8_r_al(void); -void m68k_op_bset_32_s_d(void); -void m68k_op_bset_8_s_ai(void); -void m68k_op_bset_8_s_pi(void); -void m68k_op_bset_8_s_pi7(void); -void m68k_op_bset_8_s_pd(void); -void m68k_op_bset_8_s_pd7(void); -void m68k_op_bset_8_s_di(void); -void m68k_op_bset_8_s_ix(void); -void m68k_op_bset_8_s_aw(void); -void m68k_op_bset_8_s_al(void); -void m68k_op_bsr_8(void); -void m68k_op_bsr_16(void); -void m68k_op_bsr_32(void); -void m68k_op_btst_32_r_d(void); -void m68k_op_btst_8_r_ai(void); -void m68k_op_btst_8_r_pi(void); -void m68k_op_btst_8_r_pi7(void); -void m68k_op_btst_8_r_pd(void); -void m68k_op_btst_8_r_pd7(void); -void m68k_op_btst_8_r_di(void); -void m68k_op_btst_8_r_ix(void); -void m68k_op_btst_8_r_aw(void); -void m68k_op_btst_8_r_al(void); -void m68k_op_btst_8_r_pcdi(void); -void m68k_op_btst_8_r_pcix(void); -void m68k_op_btst_8_r_i(void); -void m68k_op_btst_32_s_d(void); -void m68k_op_btst_8_s_ai(void); -void m68k_op_btst_8_s_pi(void); -void m68k_op_btst_8_s_pi7(void); -void m68k_op_btst_8_s_pd(void); -void m68k_op_btst_8_s_pd7(void); -void m68k_op_btst_8_s_di(void); -void m68k_op_btst_8_s_ix(void); -void m68k_op_btst_8_s_aw(void); -void m68k_op_btst_8_s_al(void); -void m68k_op_btst_8_s_pcdi(void); -void m68k_op_btst_8_s_pcix(void); -void m68k_op_callm_32_ai(void); -void m68k_op_callm_32_di(void); -void m68k_op_callm_32_ix(void); -void m68k_op_callm_32_aw(void); -void m68k_op_callm_32_al(void); -void m68k_op_callm_32_pcdi(void); -void m68k_op_callm_32_pcix(void); -void m68k_op_cas_8_ai(void); -void m68k_op_cas_8_pi(void); -void m68k_op_cas_8_pi7(void); -void m68k_op_cas_8_pd(void); -void m68k_op_cas_8_pd7(void); -void m68k_op_cas_8_di(void); -void m68k_op_cas_8_ix(void); -void m68k_op_cas_8_aw(void); -void m68k_op_cas_8_al(void); -void m68k_op_cas_16_ai(void); -void m68k_op_cas_16_pi(void); -void m68k_op_cas_16_pd(void); -void m68k_op_cas_16_di(void); -void m68k_op_cas_16_ix(void); -void m68k_op_cas_16_aw(void); -void m68k_op_cas_16_al(void); -void m68k_op_cas_32_ai(void); -void m68k_op_cas_32_pi(void); -void m68k_op_cas_32_pd(void); -void m68k_op_cas_32_di(void); -void m68k_op_cas_32_ix(void); -void m68k_op_cas_32_aw(void); -void m68k_op_cas_32_al(void); -void m68k_op_cas2_16(void); -void m68k_op_cas2_32(void); -void m68k_op_chk_16_d(void); -void m68k_op_chk_16_ai(void); -void m68k_op_chk_16_pi(void); -void m68k_op_chk_16_pd(void); -void m68k_op_chk_16_di(void); -void m68k_op_chk_16_ix(void); -void m68k_op_chk_16_aw(void); -void m68k_op_chk_16_al(void); -void m68k_op_chk_16_pcdi(void); -void m68k_op_chk_16_pcix(void); -void m68k_op_chk_16_i(void); -void m68k_op_chk_32_d(void); -void m68k_op_chk_32_ai(void); -void m68k_op_chk_32_pi(void); -void m68k_op_chk_32_pd(void); -void m68k_op_chk_32_di(void); -void m68k_op_chk_32_ix(void); -void m68k_op_chk_32_aw(void); -void m68k_op_chk_32_al(void); -void m68k_op_chk_32_pcdi(void); -void m68k_op_chk_32_pcix(void); -void m68k_op_chk_32_i(void); -void m68k_op_chk2cmp2_8_ai(void); -void m68k_op_chk2cmp2_8_di(void); -void m68k_op_chk2cmp2_8_ix(void); -void m68k_op_chk2cmp2_8_aw(void); -void m68k_op_chk2cmp2_8_al(void); -void m68k_op_chk2cmp2_8_pcdi(void); -void m68k_op_chk2cmp2_8_pcix(void); -void m68k_op_chk2cmp2_16_ai(void); -void m68k_op_chk2cmp2_16_di(void); -void m68k_op_chk2cmp2_16_ix(void); -void m68k_op_chk2cmp2_16_aw(void); -void m68k_op_chk2cmp2_16_al(void); -void m68k_op_chk2cmp2_16_pcdi(void); -void m68k_op_chk2cmp2_16_pcix(void); -void m68k_op_chk2cmp2_32_ai(void); -void m68k_op_chk2cmp2_32_di(void); -void m68k_op_chk2cmp2_32_ix(void); -void m68k_op_chk2cmp2_32_aw(void); -void m68k_op_chk2cmp2_32_al(void); -void m68k_op_chk2cmp2_32_pcdi(void); -void m68k_op_chk2cmp2_32_pcix(void); -void m68k_op_clr_8_d(void); -void m68k_op_clr_8_ai(void); -void m68k_op_clr_8_pi(void); -void m68k_op_clr_8_pi7(void); -void m68k_op_clr_8_pd(void); -void m68k_op_clr_8_pd7(void); -void m68k_op_clr_8_di(void); -void m68k_op_clr_8_ix(void); -void m68k_op_clr_8_aw(void); -void m68k_op_clr_8_al(void); -void m68k_op_clr_16_d(void); -void m68k_op_clr_16_ai(void); -void m68k_op_clr_16_pi(void); -void m68k_op_clr_16_pd(void); -void m68k_op_clr_16_di(void); -void m68k_op_clr_16_ix(void); -void m68k_op_clr_16_aw(void); -void m68k_op_clr_16_al(void); -void m68k_op_clr_32_d(void); -void m68k_op_clr_32_ai(void); -void m68k_op_clr_32_pi(void); -void m68k_op_clr_32_pd(void); -void m68k_op_clr_32_di(void); -void m68k_op_clr_32_ix(void); -void m68k_op_clr_32_aw(void); -void m68k_op_clr_32_al(void); -void m68k_op_cmp_8_d(void); -void m68k_op_cmp_8_ai(void); -void m68k_op_cmp_8_pi(void); -void m68k_op_cmp_8_pi7(void); -void m68k_op_cmp_8_pd(void); -void m68k_op_cmp_8_pd7(void); -void m68k_op_cmp_8_di(void); -void m68k_op_cmp_8_ix(void); -void m68k_op_cmp_8_aw(void); -void m68k_op_cmp_8_al(void); -void m68k_op_cmp_8_pcdi(void); -void m68k_op_cmp_8_pcix(void); -void m68k_op_cmp_8_i(void); -void m68k_op_cmp_16_d(void); -void m68k_op_cmp_16_a(void); -void m68k_op_cmp_16_ai(void); -void m68k_op_cmp_16_pi(void); -void m68k_op_cmp_16_pd(void); -void m68k_op_cmp_16_di(void); -void m68k_op_cmp_16_ix(void); -void m68k_op_cmp_16_aw(void); -void m68k_op_cmp_16_al(void); -void m68k_op_cmp_16_pcdi(void); -void m68k_op_cmp_16_pcix(void); -void m68k_op_cmp_16_i(void); -void m68k_op_cmp_32_d(void); -void m68k_op_cmp_32_a(void); -void m68k_op_cmp_32_ai(void); -void m68k_op_cmp_32_pi(void); -void m68k_op_cmp_32_pd(void); -void m68k_op_cmp_32_di(void); -void m68k_op_cmp_32_ix(void); -void m68k_op_cmp_32_aw(void); -void m68k_op_cmp_32_al(void); -void m68k_op_cmp_32_pcdi(void); -void m68k_op_cmp_32_pcix(void); -void m68k_op_cmp_32_i(void); -void m68k_op_cmpa_16_d(void); -void m68k_op_cmpa_16_a(void); -void m68k_op_cmpa_16_ai(void); -void m68k_op_cmpa_16_pi(void); -void m68k_op_cmpa_16_pd(void); -void m68k_op_cmpa_16_di(void); -void m68k_op_cmpa_16_ix(void); -void m68k_op_cmpa_16_aw(void); -void m68k_op_cmpa_16_al(void); -void m68k_op_cmpa_16_pcdi(void); -void m68k_op_cmpa_16_pcix(void); -void m68k_op_cmpa_16_i(void); -void m68k_op_cmpa_32_d(void); -void m68k_op_cmpa_32_a(void); -void m68k_op_cmpa_32_ai(void); -void m68k_op_cmpa_32_pi(void); -void m68k_op_cmpa_32_pd(void); -void m68k_op_cmpa_32_di(void); -void m68k_op_cmpa_32_ix(void); -void m68k_op_cmpa_32_aw(void); -void m68k_op_cmpa_32_al(void); -void m68k_op_cmpa_32_pcdi(void); -void m68k_op_cmpa_32_pcix(void); -void m68k_op_cmpa_32_i(void); -void m68k_op_cmpi_8_d(void); -void m68k_op_cmpi_8_ai(void); -void m68k_op_cmpi_8_pi(void); -void m68k_op_cmpi_8_pi7(void); -void m68k_op_cmpi_8_pd(void); -void m68k_op_cmpi_8_pd7(void); -void m68k_op_cmpi_8_di(void); -void m68k_op_cmpi_8_ix(void); -void m68k_op_cmpi_8_aw(void); -void m68k_op_cmpi_8_al(void); -void m68k_op_cmpi_8_pcdi(void); -void m68k_op_cmpi_8_pcix(void); -void m68k_op_cmpi_16_d(void); -void m68k_op_cmpi_16_ai(void); -void m68k_op_cmpi_16_pi(void); -void m68k_op_cmpi_16_pd(void); -void m68k_op_cmpi_16_di(void); -void m68k_op_cmpi_16_ix(void); -void m68k_op_cmpi_16_aw(void); -void m68k_op_cmpi_16_al(void); -void m68k_op_cmpi_16_pcdi(void); -void m68k_op_cmpi_16_pcix(void); -void m68k_op_cmpi_32_d(void); -void m68k_op_cmpi_32_ai(void); -void m68k_op_cmpi_32_pi(void); -void m68k_op_cmpi_32_pd(void); -void m68k_op_cmpi_32_di(void); -void m68k_op_cmpi_32_ix(void); -void m68k_op_cmpi_32_aw(void); -void m68k_op_cmpi_32_al(void); -void m68k_op_cmpi_32_pcdi(void); -void m68k_op_cmpi_32_pcix(void); -void m68k_op_cmpm_8_ax7(void); -void m68k_op_cmpm_8_ay7(void); -void m68k_op_cmpm_8_axy7(void); -void m68k_op_cmpm_8(void); -void m68k_op_cmpm_16(void); -void m68k_op_cmpm_32(void); -void m68k_op_cpbcc_32(void); -void m68k_op_cpdbcc_32(void); -void m68k_op_cpgen_32(void); -void m68k_op_cpscc_32(void); -void m68k_op_cptrapcc_32(void); -void m68k_op_dbt_16(void); -void m68k_op_dbf_16(void); -void m68k_op_dbhi_16(void); -void m68k_op_dbls_16(void); -void m68k_op_dbcc_16(void); -void m68k_op_dbcs_16(void); -void m68k_op_dbne_16(void); -void m68k_op_dbeq_16(void); -void m68k_op_dbvc_16(void); -void m68k_op_dbvs_16(void); -void m68k_op_dbpl_16(void); -void m68k_op_dbmi_16(void); -void m68k_op_dbge_16(void); -void m68k_op_dblt_16(void); -void m68k_op_dbgt_16(void); -void m68k_op_dble_16(void); -void m68k_op_divs_16_d(void); -void m68k_op_divs_16_ai(void); -void m68k_op_divs_16_pi(void); -void m68k_op_divs_16_pd(void); -void m68k_op_divs_16_di(void); -void m68k_op_divs_16_ix(void); -void m68k_op_divs_16_aw(void); -void m68k_op_divs_16_al(void); -void m68k_op_divs_16_pcdi(void); -void m68k_op_divs_16_pcix(void); -void m68k_op_divs_16_i(void); -void m68k_op_divu_16_d(void); -void m68k_op_divu_16_ai(void); -void m68k_op_divu_16_pi(void); -void m68k_op_divu_16_pd(void); -void m68k_op_divu_16_di(void); -void m68k_op_divu_16_ix(void); -void m68k_op_divu_16_aw(void); -void m68k_op_divu_16_al(void); -void m68k_op_divu_16_pcdi(void); -void m68k_op_divu_16_pcix(void); -void m68k_op_divu_16_i(void); -void m68k_op_divl_32_d(void); -void m68k_op_divl_32_ai(void); -void m68k_op_divl_32_pi(void); -void m68k_op_divl_32_pd(void); -void m68k_op_divl_32_di(void); -void m68k_op_divl_32_ix(void); -void m68k_op_divl_32_aw(void); -void m68k_op_divl_32_al(void); -void m68k_op_divl_32_pcdi(void); -void m68k_op_divl_32_pcix(void); -void m68k_op_divl_32_i(void); -void m68k_op_eor_8_d(void); -void m68k_op_eor_8_ai(void); -void m68k_op_eor_8_pi(void); -void m68k_op_eor_8_pi7(void); -void m68k_op_eor_8_pd(void); -void m68k_op_eor_8_pd7(void); -void m68k_op_eor_8_di(void); -void m68k_op_eor_8_ix(void); -void m68k_op_eor_8_aw(void); -void m68k_op_eor_8_al(void); -void m68k_op_eor_16_d(void); -void m68k_op_eor_16_ai(void); -void m68k_op_eor_16_pi(void); -void m68k_op_eor_16_pd(void); -void m68k_op_eor_16_di(void); -void m68k_op_eor_16_ix(void); -void m68k_op_eor_16_aw(void); -void m68k_op_eor_16_al(void); -void m68k_op_eor_32_d(void); -void m68k_op_eor_32_ai(void); -void m68k_op_eor_32_pi(void); -void m68k_op_eor_32_pd(void); -void m68k_op_eor_32_di(void); -void m68k_op_eor_32_ix(void); -void m68k_op_eor_32_aw(void); -void m68k_op_eor_32_al(void); -void m68k_op_eori_8_d(void); -void m68k_op_eori_8_ai(void); -void m68k_op_eori_8_pi(void); -void m68k_op_eori_8_pi7(void); -void m68k_op_eori_8_pd(void); -void m68k_op_eori_8_pd7(void); -void m68k_op_eori_8_di(void); -void m68k_op_eori_8_ix(void); -void m68k_op_eori_8_aw(void); -void m68k_op_eori_8_al(void); -void m68k_op_eori_16_d(void); -void m68k_op_eori_16_ai(void); -void m68k_op_eori_16_pi(void); -void m68k_op_eori_16_pd(void); -void m68k_op_eori_16_di(void); -void m68k_op_eori_16_ix(void); -void m68k_op_eori_16_aw(void); -void m68k_op_eori_16_al(void); -void m68k_op_eori_32_d(void); -void m68k_op_eori_32_ai(void); -void m68k_op_eori_32_pi(void); -void m68k_op_eori_32_pd(void); -void m68k_op_eori_32_di(void); -void m68k_op_eori_32_ix(void); -void m68k_op_eori_32_aw(void); -void m68k_op_eori_32_al(void); -void m68k_op_eori_16_toc(void); -void m68k_op_eori_16_tos(void); -void m68k_op_exg_32_dd(void); -void m68k_op_exg_32_aa(void); -void m68k_op_exg_32_da(void); -void m68k_op_ext_16(void); -void m68k_op_ext_32(void); -void m68k_op_extb_32(void); -void m68k_op_illegal(void); -void m68k_op_jmp_32_ai(void); -void m68k_op_jmp_32_di(void); -void m68k_op_jmp_32_ix(void); -void m68k_op_jmp_32_aw(void); -void m68k_op_jmp_32_al(void); -void m68k_op_jmp_32_pcdi(void); -void m68k_op_jmp_32_pcix(void); -void m68k_op_jsr_32_ai(void); -void m68k_op_jsr_32_di(void); -void m68k_op_jsr_32_ix(void); -void m68k_op_jsr_32_aw(void); -void m68k_op_jsr_32_al(void); -void m68k_op_jsr_32_pcdi(void); -void m68k_op_jsr_32_pcix(void); -void m68k_op_lea_32_ai(void); -void m68k_op_lea_32_di(void); -void m68k_op_lea_32_ix(void); -void m68k_op_lea_32_aw(void); -void m68k_op_lea_32_al(void); -void m68k_op_lea_32_pcdi(void); -void m68k_op_lea_32_pcix(void); -void m68k_op_link_16_a7(void); -void m68k_op_link_16(void); -void m68k_op_link_32_a7(void); -void m68k_op_link_32(void); -void m68k_op_lsr_8_s(void); -void m68k_op_lsr_16_s(void); -void m68k_op_lsr_32_s(void); -void m68k_op_lsr_8_r(void); -void m68k_op_lsr_16_r(void); -void m68k_op_lsr_32_r(void); -void m68k_op_lsr_16_ai(void); -void m68k_op_lsr_16_pi(void); -void m68k_op_lsr_16_pd(void); -void m68k_op_lsr_16_di(void); -void m68k_op_lsr_16_ix(void); -void m68k_op_lsr_16_aw(void); -void m68k_op_lsr_16_al(void); -void m68k_op_lsl_8_s(void); -void m68k_op_lsl_16_s(void); -void m68k_op_lsl_32_s(void); -void m68k_op_lsl_8_r(void); -void m68k_op_lsl_16_r(void); -void m68k_op_lsl_32_r(void); -void m68k_op_lsl_16_ai(void); -void m68k_op_lsl_16_pi(void); -void m68k_op_lsl_16_pd(void); -void m68k_op_lsl_16_di(void); -void m68k_op_lsl_16_ix(void); -void m68k_op_lsl_16_aw(void); -void m68k_op_lsl_16_al(void); -void m68k_op_move_8_d_d(void); -void m68k_op_move_8_d_ai(void); -void m68k_op_move_8_d_pi(void); -void m68k_op_move_8_d_pi7(void); -void m68k_op_move_8_d_pd(void); -void m68k_op_move_8_d_pd7(void); -void m68k_op_move_8_d_di(void); -void m68k_op_move_8_d_ix(void); -void m68k_op_move_8_d_aw(void); -void m68k_op_move_8_d_al(void); -void m68k_op_move_8_d_pcdi(void); -void m68k_op_move_8_d_pcix(void); -void m68k_op_move_8_d_i(void); -void m68k_op_move_8_ai_d(void); -void m68k_op_move_8_ai_ai(void); -void m68k_op_move_8_ai_pi(void); -void m68k_op_move_8_ai_pi7(void); -void m68k_op_move_8_ai_pd(void); -void m68k_op_move_8_ai_pd7(void); -void m68k_op_move_8_ai_di(void); -void m68k_op_move_8_ai_ix(void); -void m68k_op_move_8_ai_aw(void); -void m68k_op_move_8_ai_al(void); -void m68k_op_move_8_ai_pcdi(void); -void m68k_op_move_8_ai_pcix(void); -void m68k_op_move_8_ai_i(void); -void m68k_op_move_8_pi7_d(void); -void m68k_op_move_8_pi_d(void); -void m68k_op_move_8_pi7_ai(void); -void m68k_op_move_8_pi7_pi(void); -void m68k_op_move_8_pi7_pi7(void); -void m68k_op_move_8_pi7_pd(void); -void m68k_op_move_8_pi7_pd7(void); -void m68k_op_move_8_pi7_di(void); -void m68k_op_move_8_pi7_ix(void); -void m68k_op_move_8_pi7_aw(void); -void m68k_op_move_8_pi7_al(void); -void m68k_op_move_8_pi7_pcdi(void); -void m68k_op_move_8_pi7_pcix(void); -void m68k_op_move_8_pi7_i(void); -void m68k_op_move_8_pi_ai(void); -void m68k_op_move_8_pi_pi(void); -void m68k_op_move_8_pi_pi7(void); -void m68k_op_move_8_pi_pd(void); -void m68k_op_move_8_pi_pd7(void); -void m68k_op_move_8_pi_di(void); -void m68k_op_move_8_pi_ix(void); -void m68k_op_move_8_pi_aw(void); -void m68k_op_move_8_pi_al(void); -void m68k_op_move_8_pi_pcdi(void); -void m68k_op_move_8_pi_pcix(void); -void m68k_op_move_8_pi_i(void); -void m68k_op_move_8_pd7_d(void); -void m68k_op_move_8_pd_d(void); -void m68k_op_move_8_pd7_ai(void); -void m68k_op_move_8_pd7_pi(void); -void m68k_op_move_8_pd7_pi7(void); -void m68k_op_move_8_pd7_pd(void); -void m68k_op_move_8_pd7_pd7(void); -void m68k_op_move_8_pd7_di(void); -void m68k_op_move_8_pd7_ix(void); -void m68k_op_move_8_pd7_aw(void); -void m68k_op_move_8_pd7_al(void); -void m68k_op_move_8_pd7_pcdi(void); -void m68k_op_move_8_pd7_pcix(void); -void m68k_op_move_8_pd7_i(void); -void m68k_op_move_8_pd_ai(void); -void m68k_op_move_8_pd_pi(void); -void m68k_op_move_8_pd_pi7(void); -void m68k_op_move_8_pd_pd(void); -void m68k_op_move_8_pd_pd7(void); -void m68k_op_move_8_pd_di(void); -void m68k_op_move_8_pd_ix(void); -void m68k_op_move_8_pd_aw(void); -void m68k_op_move_8_pd_al(void); -void m68k_op_move_8_pd_pcdi(void); -void m68k_op_move_8_pd_pcix(void); -void m68k_op_move_8_pd_i(void); -void m68k_op_move_8_di_d(void); -void m68k_op_move_8_di_ai(void); -void m68k_op_move_8_di_pi(void); -void m68k_op_move_8_di_pi7(void); -void m68k_op_move_8_di_pd(void); -void m68k_op_move_8_di_pd7(void); -void m68k_op_move_8_di_di(void); -void m68k_op_move_8_di_ix(void); -void m68k_op_move_8_di_aw(void); -void m68k_op_move_8_di_al(void); -void m68k_op_move_8_di_pcdi(void); -void m68k_op_move_8_di_pcix(void); -void m68k_op_move_8_di_i(void); -void m68k_op_move_8_ix_d(void); -void m68k_op_move_8_ix_ai(void); -void m68k_op_move_8_ix_pi(void); -void m68k_op_move_8_ix_pi7(void); -void m68k_op_move_8_ix_pd(void); -void m68k_op_move_8_ix_pd7(void); -void m68k_op_move_8_ix_di(void); -void m68k_op_move_8_ix_ix(void); -void m68k_op_move_8_ix_aw(void); -void m68k_op_move_8_ix_al(void); -void m68k_op_move_8_ix_pcdi(void); -void m68k_op_move_8_ix_pcix(void); -void m68k_op_move_8_ix_i(void); -void m68k_op_move_8_aw_d(void); -void m68k_op_move_8_aw_ai(void); -void m68k_op_move_8_aw_pi(void); -void m68k_op_move_8_aw_pi7(void); -void m68k_op_move_8_aw_pd(void); -void m68k_op_move_8_aw_pd7(void); -void m68k_op_move_8_aw_di(void); -void m68k_op_move_8_aw_ix(void); -void m68k_op_move_8_aw_aw(void); -void m68k_op_move_8_aw_al(void); -void m68k_op_move_8_aw_pcdi(void); -void m68k_op_move_8_aw_pcix(void); -void m68k_op_move_8_aw_i(void); -void m68k_op_move_8_al_d(void); -void m68k_op_move_8_al_ai(void); -void m68k_op_move_8_al_pi(void); -void m68k_op_move_8_al_pi7(void); -void m68k_op_move_8_al_pd(void); -void m68k_op_move_8_al_pd7(void); -void m68k_op_move_8_al_di(void); -void m68k_op_move_8_al_ix(void); -void m68k_op_move_8_al_aw(void); -void m68k_op_move_8_al_al(void); -void m68k_op_move_8_al_pcdi(void); -void m68k_op_move_8_al_pcix(void); -void m68k_op_move_8_al_i(void); -void m68k_op_move_16_d_d(void); -void m68k_op_move_16_d_a(void); -void m68k_op_move_16_d_ai(void); -void m68k_op_move_16_d_pi(void); -void m68k_op_move_16_d_pd(void); -void m68k_op_move_16_d_di(void); -void m68k_op_move_16_d_ix(void); -void m68k_op_move_16_d_aw(void); -void m68k_op_move_16_d_al(void); -void m68k_op_move_16_d_pcdi(void); -void m68k_op_move_16_d_pcix(void); -void m68k_op_move_16_d_i(void); -void m68k_op_move_16_ai_d(void); -void m68k_op_move_16_ai_a(void); -void m68k_op_move_16_ai_ai(void); -void m68k_op_move_16_ai_pi(void); -void m68k_op_move_16_ai_pd(void); -void m68k_op_move_16_ai_di(void); -void m68k_op_move_16_ai_ix(void); -void m68k_op_move_16_ai_aw(void); -void m68k_op_move_16_ai_al(void); -void m68k_op_move_16_ai_pcdi(void); -void m68k_op_move_16_ai_pcix(void); -void m68k_op_move_16_ai_i(void); -void m68k_op_move_16_pi_d(void); -void m68k_op_move_16_pi_a(void); -void m68k_op_move_16_pi_ai(void); -void m68k_op_move_16_pi_pi(void); -void m68k_op_move_16_pi_pd(void); -void m68k_op_move_16_pi_di(void); -void m68k_op_move_16_pi_ix(void); -void m68k_op_move_16_pi_aw(void); -void m68k_op_move_16_pi_al(void); -void m68k_op_move_16_pi_pcdi(void); -void m68k_op_move_16_pi_pcix(void); -void m68k_op_move_16_pi_i(void); -void m68k_op_move_16_pd_d(void); -void m68k_op_move_16_pd_a(void); -void m68k_op_move_16_pd_ai(void); -void m68k_op_move_16_pd_pi(void); -void m68k_op_move_16_pd_pd(void); -void m68k_op_move_16_pd_di(void); -void m68k_op_move_16_pd_ix(void); -void m68k_op_move_16_pd_aw(void); -void m68k_op_move_16_pd_al(void); -void m68k_op_move_16_pd_pcdi(void); -void m68k_op_move_16_pd_pcix(void); -void m68k_op_move_16_pd_i(void); -void m68k_op_move_16_di_d(void); -void m68k_op_move_16_di_a(void); -void m68k_op_move_16_di_ai(void); -void m68k_op_move_16_di_pi(void); -void m68k_op_move_16_di_pd(void); -void m68k_op_move_16_di_di(void); -void m68k_op_move_16_di_ix(void); -void m68k_op_move_16_di_aw(void); -void m68k_op_move_16_di_al(void); -void m68k_op_move_16_di_pcdi(void); -void m68k_op_move_16_di_pcix(void); -void m68k_op_move_16_di_i(void); -void m68k_op_move_16_ix_d(void); -void m68k_op_move_16_ix_a(void); -void m68k_op_move_16_ix_ai(void); -void m68k_op_move_16_ix_pi(void); -void m68k_op_move_16_ix_pd(void); -void m68k_op_move_16_ix_di(void); -void m68k_op_move_16_ix_ix(void); -void m68k_op_move_16_ix_aw(void); -void m68k_op_move_16_ix_al(void); -void m68k_op_move_16_ix_pcdi(void); -void m68k_op_move_16_ix_pcix(void); -void m68k_op_move_16_ix_i(void); -void m68k_op_move_16_aw_d(void); -void m68k_op_move_16_aw_a(void); -void m68k_op_move_16_aw_ai(void); -void m68k_op_move_16_aw_pi(void); -void m68k_op_move_16_aw_pd(void); -void m68k_op_move_16_aw_di(void); -void m68k_op_move_16_aw_ix(void); -void m68k_op_move_16_aw_aw(void); -void m68k_op_move_16_aw_al(void); -void m68k_op_move_16_aw_pcdi(void); -void m68k_op_move_16_aw_pcix(void); -void m68k_op_move_16_aw_i(void); -void m68k_op_move_16_al_d(void); -void m68k_op_move_16_al_a(void); -void m68k_op_move_16_al_ai(void); -void m68k_op_move_16_al_pi(void); -void m68k_op_move_16_al_pd(void); -void m68k_op_move_16_al_di(void); -void m68k_op_move_16_al_ix(void); -void m68k_op_move_16_al_aw(void); -void m68k_op_move_16_al_al(void); -void m68k_op_move_16_al_pcdi(void); -void m68k_op_move_16_al_pcix(void); -void m68k_op_move_16_al_i(void); -void m68k_op_move_32_d_d(void); -void m68k_op_move_32_d_a(void); -void m68k_op_move_32_d_ai(void); -void m68k_op_move_32_d_pi(void); -void m68k_op_move_32_d_pd(void); -void m68k_op_move_32_d_di(void); -void m68k_op_move_32_d_ix(void); -void m68k_op_move_32_d_aw(void); -void m68k_op_move_32_d_al(void); -void m68k_op_move_32_d_pcdi(void); -void m68k_op_move_32_d_pcix(void); -void m68k_op_move_32_d_i(void); -void m68k_op_move_32_ai_d(void); -void m68k_op_move_32_ai_a(void); -void m68k_op_move_32_ai_ai(void); -void m68k_op_move_32_ai_pi(void); -void m68k_op_move_32_ai_pd(void); -void m68k_op_move_32_ai_di(void); -void m68k_op_move_32_ai_ix(void); -void m68k_op_move_32_ai_aw(void); -void m68k_op_move_32_ai_al(void); -void m68k_op_move_32_ai_pcdi(void); -void m68k_op_move_32_ai_pcix(void); -void m68k_op_move_32_ai_i(void); -void m68k_op_move_32_pi_d(void); -void m68k_op_move_32_pi_a(void); -void m68k_op_move_32_pi_ai(void); -void m68k_op_move_32_pi_pi(void); -void m68k_op_move_32_pi_pd(void); -void m68k_op_move_32_pi_di(void); -void m68k_op_move_32_pi_ix(void); -void m68k_op_move_32_pi_aw(void); -void m68k_op_move_32_pi_al(void); -void m68k_op_move_32_pi_pcdi(void); -void m68k_op_move_32_pi_pcix(void); -void m68k_op_move_32_pi_i(void); -void m68k_op_move_32_pd_d(void); -void m68k_op_move_32_pd_a(void); -void m68k_op_move_32_pd_ai(void); -void m68k_op_move_32_pd_pi(void); -void m68k_op_move_32_pd_pd(void); -void m68k_op_move_32_pd_di(void); -void m68k_op_move_32_pd_ix(void); -void m68k_op_move_32_pd_aw(void); -void m68k_op_move_32_pd_al(void); -void m68k_op_move_32_pd_pcdi(void); -void m68k_op_move_32_pd_pcix(void); -void m68k_op_move_32_pd_i(void); -void m68k_op_move_32_di_d(void); -void m68k_op_move_32_di_a(void); -void m68k_op_move_32_di_ai(void); -void m68k_op_move_32_di_pi(void); -void m68k_op_move_32_di_pd(void); -void m68k_op_move_32_di_di(void); -void m68k_op_move_32_di_ix(void); -void m68k_op_move_32_di_aw(void); -void m68k_op_move_32_di_al(void); -void m68k_op_move_32_di_pcdi(void); -void m68k_op_move_32_di_pcix(void); -void m68k_op_move_32_di_i(void); -void m68k_op_move_32_ix_d(void); -void m68k_op_move_32_ix_a(void); -void m68k_op_move_32_ix_ai(void); -void m68k_op_move_32_ix_pi(void); -void m68k_op_move_32_ix_pd(void); -void m68k_op_move_32_ix_di(void); -void m68k_op_move_32_ix_ix(void); -void m68k_op_move_32_ix_aw(void); -void m68k_op_move_32_ix_al(void); -void m68k_op_move_32_ix_pcdi(void); -void m68k_op_move_32_ix_pcix(void); -void m68k_op_move_32_ix_i(void); -void m68k_op_move_32_aw_d(void); -void m68k_op_move_32_aw_a(void); -void m68k_op_move_32_aw_ai(void); -void m68k_op_move_32_aw_pi(void); -void m68k_op_move_32_aw_pd(void); -void m68k_op_move_32_aw_di(void); -void m68k_op_move_32_aw_ix(void); -void m68k_op_move_32_aw_aw(void); -void m68k_op_move_32_aw_al(void); -void m68k_op_move_32_aw_pcdi(void); -void m68k_op_move_32_aw_pcix(void); -void m68k_op_move_32_aw_i(void); -void m68k_op_move_32_al_d(void); -void m68k_op_move_32_al_a(void); -void m68k_op_move_32_al_ai(void); -void m68k_op_move_32_al_pi(void); -void m68k_op_move_32_al_pd(void); -void m68k_op_move_32_al_di(void); -void m68k_op_move_32_al_ix(void); -void m68k_op_move_32_al_aw(void); -void m68k_op_move_32_al_al(void); -void m68k_op_move_32_al_pcdi(void); -void m68k_op_move_32_al_pcix(void); -void m68k_op_move_32_al_i(void); -void m68k_op_movea_16_d(void); -void m68k_op_movea_16_a(void); -void m68k_op_movea_16_ai(void); -void m68k_op_movea_16_pi(void); -void m68k_op_movea_16_pd(void); -void m68k_op_movea_16_di(void); -void m68k_op_movea_16_ix(void); -void m68k_op_movea_16_aw(void); -void m68k_op_movea_16_al(void); -void m68k_op_movea_16_pcdi(void); -void m68k_op_movea_16_pcix(void); -void m68k_op_movea_16_i(void); -void m68k_op_movea_32_d(void); -void m68k_op_movea_32_a(void); -void m68k_op_movea_32_ai(void); -void m68k_op_movea_32_pi(void); -void m68k_op_movea_32_pd(void); -void m68k_op_movea_32_di(void); -void m68k_op_movea_32_ix(void); -void m68k_op_movea_32_aw(void); -void m68k_op_movea_32_al(void); -void m68k_op_movea_32_pcdi(void); -void m68k_op_movea_32_pcix(void); -void m68k_op_movea_32_i(void); -void m68k_op_move_16_frc_d(void); -void m68k_op_move_16_frc_ai(void); -void m68k_op_move_16_frc_pi(void); -void m68k_op_move_16_frc_pd(void); -void m68k_op_move_16_frc_di(void); -void m68k_op_move_16_frc_ix(void); -void m68k_op_move_16_frc_aw(void); -void m68k_op_move_16_frc_al(void); -void m68k_op_move_16_toc_d(void); -void m68k_op_move_16_toc_ai(void); -void m68k_op_move_16_toc_pi(void); -void m68k_op_move_16_toc_pd(void); -void m68k_op_move_16_toc_di(void); -void m68k_op_move_16_toc_ix(void); -void m68k_op_move_16_toc_aw(void); -void m68k_op_move_16_toc_al(void); -void m68k_op_move_16_toc_pcdi(void); -void m68k_op_move_16_toc_pcix(void); -void m68k_op_move_16_toc_i(void); -void m68k_op_move_16_frs_d(void); -void m68k_op_move_16_frs_ai(void); -void m68k_op_move_16_frs_pi(void); -void m68k_op_move_16_frs_pd(void); -void m68k_op_move_16_frs_di(void); -void m68k_op_move_16_frs_ix(void); -void m68k_op_move_16_frs_aw(void); -void m68k_op_move_16_frs_al(void); -void m68k_op_move_16_tos_d(void); -void m68k_op_move_16_tos_ai(void); -void m68k_op_move_16_tos_pi(void); -void m68k_op_move_16_tos_pd(void); -void m68k_op_move_16_tos_di(void); -void m68k_op_move_16_tos_ix(void); -void m68k_op_move_16_tos_aw(void); -void m68k_op_move_16_tos_al(void); -void m68k_op_move_16_tos_pcdi(void); -void m68k_op_move_16_tos_pcix(void); -void m68k_op_move_16_tos_i(void); -void m68k_op_move_32_fru(void); -void m68k_op_move_32_tou(void); -void m68k_op_movec_32_cr(void); -void m68k_op_movec_32_rc(void); -void m68k_op_movem_16_re_pd(void); -void m68k_op_movem_16_re_ai(void); -void m68k_op_movem_16_re_di(void); -void m68k_op_movem_16_re_ix(void); -void m68k_op_movem_16_re_aw(void); -void m68k_op_movem_16_re_al(void); -void m68k_op_movem_32_re_pd(void); -void m68k_op_movem_32_re_ai(void); -void m68k_op_movem_32_re_di(void); -void m68k_op_movem_32_re_ix(void); -void m68k_op_movem_32_re_aw(void); -void m68k_op_movem_32_re_al(void); -void m68k_op_movem_16_er_pi(void); -void m68k_op_movem_16_er_ai(void); -void m68k_op_movem_16_er_di(void); -void m68k_op_movem_16_er_ix(void); -void m68k_op_movem_16_er_aw(void); -void m68k_op_movem_16_er_al(void); -void m68k_op_movem_16_er_pcdi(void); -void m68k_op_movem_16_er_pcix(void); -void m68k_op_movem_32_er_pi(void); -void m68k_op_movem_32_er_ai(void); -void m68k_op_movem_32_er_di(void); -void m68k_op_movem_32_er_ix(void); -void m68k_op_movem_32_er_aw(void); -void m68k_op_movem_32_er_al(void); -void m68k_op_movem_32_er_pcdi(void); -void m68k_op_movem_32_er_pcix(void); -void m68k_op_movep_16_re(void); -void m68k_op_movep_32_re(void); -void m68k_op_movep_16_er(void); -void m68k_op_movep_32_er(void); -void m68k_op_moves_8_ai(void); -void m68k_op_moves_8_pi(void); -void m68k_op_moves_8_pi7(void); -void m68k_op_moves_8_pd(void); -void m68k_op_moves_8_pd7(void); -void m68k_op_moves_8_di(void); -void m68k_op_moves_8_ix(void); -void m68k_op_moves_8_aw(void); -void m68k_op_moves_8_al(void); -void m68k_op_moves_16_ai(void); -void m68k_op_moves_16_pi(void); -void m68k_op_moves_16_pd(void); -void m68k_op_moves_16_di(void); -void m68k_op_moves_16_ix(void); -void m68k_op_moves_16_aw(void); -void m68k_op_moves_16_al(void); -void m68k_op_moves_32_ai(void); -void m68k_op_moves_32_pi(void); -void m68k_op_moves_32_pd(void); -void m68k_op_moves_32_di(void); -void m68k_op_moves_32_ix(void); -void m68k_op_moves_32_aw(void); -void m68k_op_moves_32_al(void); -void m68k_op_moveq_32(void); -void m68k_op_muls_16_d(void); -void m68k_op_muls_16_ai(void); -void m68k_op_muls_16_pi(void); -void m68k_op_muls_16_pd(void); -void m68k_op_muls_16_di(void); -void m68k_op_muls_16_ix(void); -void m68k_op_muls_16_aw(void); -void m68k_op_muls_16_al(void); -void m68k_op_muls_16_pcdi(void); -void m68k_op_muls_16_pcix(void); -void m68k_op_muls_16_i(void); -void m68k_op_mulu_16_d(void); -void m68k_op_mulu_16_ai(void); -void m68k_op_mulu_16_pi(void); -void m68k_op_mulu_16_pd(void); -void m68k_op_mulu_16_di(void); -void m68k_op_mulu_16_ix(void); -void m68k_op_mulu_16_aw(void); -void m68k_op_mulu_16_al(void); -void m68k_op_mulu_16_pcdi(void); -void m68k_op_mulu_16_pcix(void); -void m68k_op_mulu_16_i(void); -void m68k_op_mull_32_d(void); -void m68k_op_mull_32_ai(void); -void m68k_op_mull_32_pi(void); -void m68k_op_mull_32_pd(void); -void m68k_op_mull_32_di(void); -void m68k_op_mull_32_ix(void); -void m68k_op_mull_32_aw(void); -void m68k_op_mull_32_al(void); -void m68k_op_mull_32_pcdi(void); -void m68k_op_mull_32_pcix(void); -void m68k_op_mull_32_i(void); -void m68k_op_nbcd_8_d(void); -void m68k_op_nbcd_8_ai(void); -void m68k_op_nbcd_8_pi(void); -void m68k_op_nbcd_8_pi7(void); -void m68k_op_nbcd_8_pd(void); -void m68k_op_nbcd_8_pd7(void); -void m68k_op_nbcd_8_di(void); -void m68k_op_nbcd_8_ix(void); -void m68k_op_nbcd_8_aw(void); -void m68k_op_nbcd_8_al(void); -void m68k_op_neg_8_d(void); -void m68k_op_neg_8_ai(void); -void m68k_op_neg_8_pi(void); -void m68k_op_neg_8_pi7(void); -void m68k_op_neg_8_pd(void); -void m68k_op_neg_8_pd7(void); -void m68k_op_neg_8_di(void); -void m68k_op_neg_8_ix(void); -void m68k_op_neg_8_aw(void); -void m68k_op_neg_8_al(void); -void m68k_op_neg_16_d(void); -void m68k_op_neg_16_ai(void); -void m68k_op_neg_16_pi(void); -void m68k_op_neg_16_pd(void); -void m68k_op_neg_16_di(void); -void m68k_op_neg_16_ix(void); -void m68k_op_neg_16_aw(void); -void m68k_op_neg_16_al(void); -void m68k_op_neg_32_d(void); -void m68k_op_neg_32_ai(void); -void m68k_op_neg_32_pi(void); -void m68k_op_neg_32_pd(void); -void m68k_op_neg_32_di(void); -void m68k_op_neg_32_ix(void); -void m68k_op_neg_32_aw(void); -void m68k_op_neg_32_al(void); -void m68k_op_negx_8_d(void); -void m68k_op_negx_8_ai(void); -void m68k_op_negx_8_pi(void); -void m68k_op_negx_8_pi7(void); -void m68k_op_negx_8_pd(void); -void m68k_op_negx_8_pd7(void); -void m68k_op_negx_8_di(void); -void m68k_op_negx_8_ix(void); -void m68k_op_negx_8_aw(void); -void m68k_op_negx_8_al(void); -void m68k_op_negx_16_d(void); -void m68k_op_negx_16_ai(void); -void m68k_op_negx_16_pi(void); -void m68k_op_negx_16_pd(void); -void m68k_op_negx_16_di(void); -void m68k_op_negx_16_ix(void); -void m68k_op_negx_16_aw(void); -void m68k_op_negx_16_al(void); -void m68k_op_negx_32_d(void); -void m68k_op_negx_32_ai(void); -void m68k_op_negx_32_pi(void); -void m68k_op_negx_32_pd(void); -void m68k_op_negx_32_di(void); -void m68k_op_negx_32_ix(void); -void m68k_op_negx_32_aw(void); -void m68k_op_negx_32_al(void); -void m68k_op_nop(void); -void m68k_op_not_8_d(void); -void m68k_op_not_8_ai(void); -void m68k_op_not_8_pi(void); -void m68k_op_not_8_pi7(void); -void m68k_op_not_8_pd(void); -void m68k_op_not_8_pd7(void); -void m68k_op_not_8_di(void); -void m68k_op_not_8_ix(void); -void m68k_op_not_8_aw(void); -void m68k_op_not_8_al(void); -void m68k_op_not_16_d(void); -void m68k_op_not_16_ai(void); -void m68k_op_not_16_pi(void); -void m68k_op_not_16_pd(void); -void m68k_op_not_16_di(void); -void m68k_op_not_16_ix(void); -void m68k_op_not_16_aw(void); -void m68k_op_not_16_al(void); -void m68k_op_not_32_d(void); -void m68k_op_not_32_ai(void); -void m68k_op_not_32_pi(void); -void m68k_op_not_32_pd(void); -void m68k_op_not_32_di(void); -void m68k_op_not_32_ix(void); -void m68k_op_not_32_aw(void); -void m68k_op_not_32_al(void); -void m68k_op_or_8_er_d(void); -void m68k_op_or_8_er_ai(void); -void m68k_op_or_8_er_pi(void); -void m68k_op_or_8_er_pi7(void); -void m68k_op_or_8_er_pd(void); -void m68k_op_or_8_er_pd7(void); -void m68k_op_or_8_er_di(void); -void m68k_op_or_8_er_ix(void); -void m68k_op_or_8_er_aw(void); -void m68k_op_or_8_er_al(void); -void m68k_op_or_8_er_pcdi(void); -void m68k_op_or_8_er_pcix(void); -void m68k_op_or_8_er_i(void); -void m68k_op_or_16_er_d(void); -void m68k_op_or_16_er_ai(void); -void m68k_op_or_16_er_pi(void); -void m68k_op_or_16_er_pd(void); -void m68k_op_or_16_er_di(void); -void m68k_op_or_16_er_ix(void); -void m68k_op_or_16_er_aw(void); -void m68k_op_or_16_er_al(void); -void m68k_op_or_16_er_pcdi(void); -void m68k_op_or_16_er_pcix(void); -void m68k_op_or_16_er_i(void); -void m68k_op_or_32_er_d(void); -void m68k_op_or_32_er_ai(void); -void m68k_op_or_32_er_pi(void); -void m68k_op_or_32_er_pd(void); -void m68k_op_or_32_er_di(void); -void m68k_op_or_32_er_ix(void); -void m68k_op_or_32_er_aw(void); -void m68k_op_or_32_er_al(void); -void m68k_op_or_32_er_pcdi(void); -void m68k_op_or_32_er_pcix(void); -void m68k_op_or_32_er_i(void); -void m68k_op_or_8_re_ai(void); -void m68k_op_or_8_re_pi(void); -void m68k_op_or_8_re_pi7(void); -void m68k_op_or_8_re_pd(void); -void m68k_op_or_8_re_pd7(void); -void m68k_op_or_8_re_di(void); -void m68k_op_or_8_re_ix(void); -void m68k_op_or_8_re_aw(void); -void m68k_op_or_8_re_al(void); -void m68k_op_or_16_re_ai(void); -void m68k_op_or_16_re_pi(void); -void m68k_op_or_16_re_pd(void); -void m68k_op_or_16_re_di(void); -void m68k_op_or_16_re_ix(void); -void m68k_op_or_16_re_aw(void); -void m68k_op_or_16_re_al(void); -void m68k_op_or_32_re_ai(void); -void m68k_op_or_32_re_pi(void); -void m68k_op_or_32_re_pd(void); -void m68k_op_or_32_re_di(void); -void m68k_op_or_32_re_ix(void); -void m68k_op_or_32_re_aw(void); -void m68k_op_or_32_re_al(void); -void m68k_op_ori_8_d(void); -void m68k_op_ori_8_ai(void); -void m68k_op_ori_8_pi(void); -void m68k_op_ori_8_pi7(void); -void m68k_op_ori_8_pd(void); -void m68k_op_ori_8_pd7(void); -void m68k_op_ori_8_di(void); -void m68k_op_ori_8_ix(void); -void m68k_op_ori_8_aw(void); -void m68k_op_ori_8_al(void); -void m68k_op_ori_16_d(void); -void m68k_op_ori_16_ai(void); -void m68k_op_ori_16_pi(void); -void m68k_op_ori_16_pd(void); -void m68k_op_ori_16_di(void); -void m68k_op_ori_16_ix(void); -void m68k_op_ori_16_aw(void); -void m68k_op_ori_16_al(void); -void m68k_op_ori_32_d(void); -void m68k_op_ori_32_ai(void); -void m68k_op_ori_32_pi(void); -void m68k_op_ori_32_pd(void); -void m68k_op_ori_32_di(void); -void m68k_op_ori_32_ix(void); -void m68k_op_ori_32_aw(void); -void m68k_op_ori_32_al(void); -void m68k_op_ori_16_toc(void); -void m68k_op_ori_16_tos(void); -void m68k_op_pack_16_rr(void); -void m68k_op_pack_16_mm_ax7(void); -void m68k_op_pack_16_mm_ay7(void); -void m68k_op_pack_16_mm_axy7(void); -void m68k_op_pack_16_mm(void); -void m68k_op_pea_32_ai(void); -void m68k_op_pea_32_di(void); -void m68k_op_pea_32_ix(void); -void m68k_op_pea_32_aw(void); -void m68k_op_pea_32_al(void); -void m68k_op_pea_32_pcdi(void); -void m68k_op_pea_32_pcix(void); -void m68k_op_reset(void); -void m68k_op_ror_8_s(void); -void m68k_op_ror_16_s(void); -void m68k_op_ror_32_s(void); -void m68k_op_ror_8_r(void); -void m68k_op_ror_16_r(void); -void m68k_op_ror_32_r(void); -void m68k_op_ror_16_ai(void); -void m68k_op_ror_16_pi(void); -void m68k_op_ror_16_pd(void); -void m68k_op_ror_16_di(void); -void m68k_op_ror_16_ix(void); -void m68k_op_ror_16_aw(void); -void m68k_op_ror_16_al(void); -void m68k_op_rol_8_s(void); -void m68k_op_rol_16_s(void); -void m68k_op_rol_32_s(void); -void m68k_op_rol_8_r(void); -void m68k_op_rol_16_r(void); -void m68k_op_rol_32_r(void); -void m68k_op_rol_16_ai(void); -void m68k_op_rol_16_pi(void); -void m68k_op_rol_16_pd(void); -void m68k_op_rol_16_di(void); -void m68k_op_rol_16_ix(void); -void m68k_op_rol_16_aw(void); -void m68k_op_rol_16_al(void); -void m68k_op_roxr_8_s(void); -void m68k_op_roxr_16_s(void); -void m68k_op_roxr_32_s(void); -void m68k_op_roxr_8_r(void); -void m68k_op_roxr_16_r(void); -void m68k_op_roxr_32_r(void); -void m68k_op_roxr_16_ai(void); -void m68k_op_roxr_16_pi(void); -void m68k_op_roxr_16_pd(void); -void m68k_op_roxr_16_di(void); -void m68k_op_roxr_16_ix(void); -void m68k_op_roxr_16_aw(void); -void m68k_op_roxr_16_al(void); -void m68k_op_roxl_8_s(void); -void m68k_op_roxl_16_s(void); -void m68k_op_roxl_32_s(void); -void m68k_op_roxl_8_r(void); -void m68k_op_roxl_16_r(void); -void m68k_op_roxl_32_r(void); -void m68k_op_roxl_16_ai(void); -void m68k_op_roxl_16_pi(void); -void m68k_op_roxl_16_pd(void); -void m68k_op_roxl_16_di(void); -void m68k_op_roxl_16_ix(void); -void m68k_op_roxl_16_aw(void); -void m68k_op_roxl_16_al(void); -void m68k_op_rtd_32(void); -void m68k_op_rte_32(void); -void m68k_op_rtm_32(void); -void m68k_op_rtr_32(void); -void m68k_op_rts_32(void); -void m68k_op_sbcd_8_rr(void); -void m68k_op_sbcd_8_mm_ax7(void); -void m68k_op_sbcd_8_mm_ay7(void); -void m68k_op_sbcd_8_mm_axy7(void); -void m68k_op_sbcd_8_mm(void); -void m68k_op_st_8_d(void); -void m68k_op_st_8_ai(void); -void m68k_op_st_8_pi(void); -void m68k_op_st_8_pi7(void); -void m68k_op_st_8_pd(void); -void m68k_op_st_8_pd7(void); -void m68k_op_st_8_di(void); -void m68k_op_st_8_ix(void); -void m68k_op_st_8_aw(void); -void m68k_op_st_8_al(void); -void m68k_op_sf_8_d(void); -void m68k_op_sf_8_ai(void); -void m68k_op_sf_8_pi(void); -void m68k_op_sf_8_pi7(void); -void m68k_op_sf_8_pd(void); -void m68k_op_sf_8_pd7(void); -void m68k_op_sf_8_di(void); -void m68k_op_sf_8_ix(void); -void m68k_op_sf_8_aw(void); -void m68k_op_sf_8_al(void); -void m68k_op_shi_8_d(void); -void m68k_op_sls_8_d(void); -void m68k_op_scc_8_d(void); -void m68k_op_scs_8_d(void); -void m68k_op_sne_8_d(void); -void m68k_op_seq_8_d(void); -void m68k_op_svc_8_d(void); -void m68k_op_svs_8_d(void); -void m68k_op_spl_8_d(void); -void m68k_op_smi_8_d(void); -void m68k_op_sge_8_d(void); -void m68k_op_slt_8_d(void); -void m68k_op_sgt_8_d(void); -void m68k_op_sle_8_d(void); -void m68k_op_shi_8_ai(void); -void m68k_op_shi_8_pi(void); -void m68k_op_shi_8_pi7(void); -void m68k_op_shi_8_pd(void); -void m68k_op_shi_8_pd7(void); -void m68k_op_shi_8_di(void); -void m68k_op_shi_8_ix(void); -void m68k_op_shi_8_aw(void); -void m68k_op_shi_8_al(void); -void m68k_op_sls_8_ai(void); -void m68k_op_sls_8_pi(void); -void m68k_op_sls_8_pi7(void); -void m68k_op_sls_8_pd(void); -void m68k_op_sls_8_pd7(void); -void m68k_op_sls_8_di(void); -void m68k_op_sls_8_ix(void); -void m68k_op_sls_8_aw(void); -void m68k_op_sls_8_al(void); -void m68k_op_scc_8_ai(void); -void m68k_op_scc_8_pi(void); -void m68k_op_scc_8_pi7(void); -void m68k_op_scc_8_pd(void); -void m68k_op_scc_8_pd7(void); -void m68k_op_scc_8_di(void); -void m68k_op_scc_8_ix(void); -void m68k_op_scc_8_aw(void); -void m68k_op_scc_8_al(void); -void m68k_op_scs_8_ai(void); -void m68k_op_scs_8_pi(void); -void m68k_op_scs_8_pi7(void); -void m68k_op_scs_8_pd(void); -void m68k_op_scs_8_pd7(void); -void m68k_op_scs_8_di(void); -void m68k_op_scs_8_ix(void); -void m68k_op_scs_8_aw(void); -void m68k_op_scs_8_al(void); -void m68k_op_sne_8_ai(void); -void m68k_op_sne_8_pi(void); -void m68k_op_sne_8_pi7(void); -void m68k_op_sne_8_pd(void); -void m68k_op_sne_8_pd7(void); -void m68k_op_sne_8_di(void); -void m68k_op_sne_8_ix(void); -void m68k_op_sne_8_aw(void); -void m68k_op_sne_8_al(void); -void m68k_op_seq_8_ai(void); -void m68k_op_seq_8_pi(void); -void m68k_op_seq_8_pi7(void); -void m68k_op_seq_8_pd(void); -void m68k_op_seq_8_pd7(void); -void m68k_op_seq_8_di(void); -void m68k_op_seq_8_ix(void); -void m68k_op_seq_8_aw(void); -void m68k_op_seq_8_al(void); -void m68k_op_svc_8_ai(void); -void m68k_op_svc_8_pi(void); -void m68k_op_svc_8_pi7(void); -void m68k_op_svc_8_pd(void); -void m68k_op_svc_8_pd7(void); -void m68k_op_svc_8_di(void); -void m68k_op_svc_8_ix(void); -void m68k_op_svc_8_aw(void); -void m68k_op_svc_8_al(void); -void m68k_op_svs_8_ai(void); -void m68k_op_svs_8_pi(void); -void m68k_op_svs_8_pi7(void); -void m68k_op_svs_8_pd(void); -void m68k_op_svs_8_pd7(void); -void m68k_op_svs_8_di(void); -void m68k_op_svs_8_ix(void); -void m68k_op_svs_8_aw(void); -void m68k_op_svs_8_al(void); -void m68k_op_spl_8_ai(void); -void m68k_op_spl_8_pi(void); -void m68k_op_spl_8_pi7(void); -void m68k_op_spl_8_pd(void); -void m68k_op_spl_8_pd7(void); -void m68k_op_spl_8_di(void); -void m68k_op_spl_8_ix(void); -void m68k_op_spl_8_aw(void); -void m68k_op_spl_8_al(void); -void m68k_op_smi_8_ai(void); -void m68k_op_smi_8_pi(void); -void m68k_op_smi_8_pi7(void); -void m68k_op_smi_8_pd(void); -void m68k_op_smi_8_pd7(void); -void m68k_op_smi_8_di(void); -void m68k_op_smi_8_ix(void); -void m68k_op_smi_8_aw(void); -void m68k_op_smi_8_al(void); -void m68k_op_sge_8_ai(void); -void m68k_op_sge_8_pi(void); -void m68k_op_sge_8_pi7(void); -void m68k_op_sge_8_pd(void); -void m68k_op_sge_8_pd7(void); -void m68k_op_sge_8_di(void); -void m68k_op_sge_8_ix(void); -void m68k_op_sge_8_aw(void); -void m68k_op_sge_8_al(void); -void m68k_op_slt_8_ai(void); -void m68k_op_slt_8_pi(void); -void m68k_op_slt_8_pi7(void); -void m68k_op_slt_8_pd(void); -void m68k_op_slt_8_pd7(void); -void m68k_op_slt_8_di(void); -void m68k_op_slt_8_ix(void); -void m68k_op_slt_8_aw(void); -void m68k_op_slt_8_al(void); -void m68k_op_sgt_8_ai(void); -void m68k_op_sgt_8_pi(void); -void m68k_op_sgt_8_pi7(void); -void m68k_op_sgt_8_pd(void); -void m68k_op_sgt_8_pd7(void); -void m68k_op_sgt_8_di(void); -void m68k_op_sgt_8_ix(void); -void m68k_op_sgt_8_aw(void); -void m68k_op_sgt_8_al(void); -void m68k_op_sle_8_ai(void); -void m68k_op_sle_8_pi(void); -void m68k_op_sle_8_pi7(void); -void m68k_op_sle_8_pd(void); -void m68k_op_sle_8_pd7(void); -void m68k_op_sle_8_di(void); -void m68k_op_sle_8_ix(void); -void m68k_op_sle_8_aw(void); -void m68k_op_sle_8_al(void); -void m68k_op_stop(void); -void m68k_op_sub_8_er_d(void); -void m68k_op_sub_8_er_ai(void); -void m68k_op_sub_8_er_pi(void); -void m68k_op_sub_8_er_pi7(void); -void m68k_op_sub_8_er_pd(void); -void m68k_op_sub_8_er_pd7(void); -void m68k_op_sub_8_er_di(void); -void m68k_op_sub_8_er_ix(void); -void m68k_op_sub_8_er_aw(void); -void m68k_op_sub_8_er_al(void); -void m68k_op_sub_8_er_pcdi(void); -void m68k_op_sub_8_er_pcix(void); -void m68k_op_sub_8_er_i(void); -void m68k_op_sub_16_er_d(void); -void m68k_op_sub_16_er_a(void); -void m68k_op_sub_16_er_ai(void); -void m68k_op_sub_16_er_pi(void); -void m68k_op_sub_16_er_pd(void); -void m68k_op_sub_16_er_di(void); -void m68k_op_sub_16_er_ix(void); -void m68k_op_sub_16_er_aw(void); -void m68k_op_sub_16_er_al(void); -void m68k_op_sub_16_er_pcdi(void); -void m68k_op_sub_16_er_pcix(void); -void m68k_op_sub_16_er_i(void); -void m68k_op_sub_32_er_d(void); -void m68k_op_sub_32_er_a(void); -void m68k_op_sub_32_er_ai(void); -void m68k_op_sub_32_er_pi(void); -void m68k_op_sub_32_er_pd(void); -void m68k_op_sub_32_er_di(void); -void m68k_op_sub_32_er_ix(void); -void m68k_op_sub_32_er_aw(void); -void m68k_op_sub_32_er_al(void); -void m68k_op_sub_32_er_pcdi(void); -void m68k_op_sub_32_er_pcix(void); -void m68k_op_sub_32_er_i(void); -void m68k_op_sub_8_re_ai(void); -void m68k_op_sub_8_re_pi(void); -void m68k_op_sub_8_re_pi7(void); -void m68k_op_sub_8_re_pd(void); -void m68k_op_sub_8_re_pd7(void); -void m68k_op_sub_8_re_di(void); -void m68k_op_sub_8_re_ix(void); -void m68k_op_sub_8_re_aw(void); -void m68k_op_sub_8_re_al(void); -void m68k_op_sub_16_re_ai(void); -void m68k_op_sub_16_re_pi(void); -void m68k_op_sub_16_re_pd(void); -void m68k_op_sub_16_re_di(void); -void m68k_op_sub_16_re_ix(void); -void m68k_op_sub_16_re_aw(void); -void m68k_op_sub_16_re_al(void); -void m68k_op_sub_32_re_ai(void); -void m68k_op_sub_32_re_pi(void); -void m68k_op_sub_32_re_pd(void); -void m68k_op_sub_32_re_di(void); -void m68k_op_sub_32_re_ix(void); -void m68k_op_sub_32_re_aw(void); -void m68k_op_sub_32_re_al(void); -void m68k_op_suba_16_d(void); -void m68k_op_suba_16_a(void); -void m68k_op_suba_16_ai(void); -void m68k_op_suba_16_pi(void); -void m68k_op_suba_16_pd(void); -void m68k_op_suba_16_di(void); -void m68k_op_suba_16_ix(void); -void m68k_op_suba_16_aw(void); -void m68k_op_suba_16_al(void); -void m68k_op_suba_16_pcdi(void); -void m68k_op_suba_16_pcix(void); -void m68k_op_suba_16_i(void); -void m68k_op_suba_32_d(void); -void m68k_op_suba_32_a(void); -void m68k_op_suba_32_ai(void); -void m68k_op_suba_32_pi(void); -void m68k_op_suba_32_pd(void); -void m68k_op_suba_32_di(void); -void m68k_op_suba_32_ix(void); -void m68k_op_suba_32_aw(void); -void m68k_op_suba_32_al(void); -void m68k_op_suba_32_pcdi(void); -void m68k_op_suba_32_pcix(void); -void m68k_op_suba_32_i(void); -void m68k_op_subi_8_d(void); -void m68k_op_subi_8_ai(void); -void m68k_op_subi_8_pi(void); -void m68k_op_subi_8_pi7(void); -void m68k_op_subi_8_pd(void); -void m68k_op_subi_8_pd7(void); -void m68k_op_subi_8_di(void); -void m68k_op_subi_8_ix(void); -void m68k_op_subi_8_aw(void); -void m68k_op_subi_8_al(void); -void m68k_op_subi_16_d(void); -void m68k_op_subi_16_ai(void); -void m68k_op_subi_16_pi(void); -void m68k_op_subi_16_pd(void); -void m68k_op_subi_16_di(void); -void m68k_op_subi_16_ix(void); -void m68k_op_subi_16_aw(void); -void m68k_op_subi_16_al(void); -void m68k_op_subi_32_d(void); -void m68k_op_subi_32_ai(void); -void m68k_op_subi_32_pi(void); -void m68k_op_subi_32_pd(void); -void m68k_op_subi_32_di(void); -void m68k_op_subi_32_ix(void); -void m68k_op_subi_32_aw(void); -void m68k_op_subi_32_al(void); -void m68k_op_subq_8_d(void); -void m68k_op_subq_8_ai(void); -void m68k_op_subq_8_pi(void); -void m68k_op_subq_8_pi7(void); -void m68k_op_subq_8_pd(void); -void m68k_op_subq_8_pd7(void); -void m68k_op_subq_8_di(void); -void m68k_op_subq_8_ix(void); -void m68k_op_subq_8_aw(void); -void m68k_op_subq_8_al(void); -void m68k_op_subq_16_d(void); -void m68k_op_subq_16_a(void); -void m68k_op_subq_16_ai(void); -void m68k_op_subq_16_pi(void); -void m68k_op_subq_16_pd(void); -void m68k_op_subq_16_di(void); -void m68k_op_subq_16_ix(void); -void m68k_op_subq_16_aw(void); -void m68k_op_subq_16_al(void); -void m68k_op_subq_32_d(void); -void m68k_op_subq_32_a(void); -void m68k_op_subq_32_ai(void); -void m68k_op_subq_32_pi(void); -void m68k_op_subq_32_pd(void); -void m68k_op_subq_32_di(void); -void m68k_op_subq_32_ix(void); -void m68k_op_subq_32_aw(void); -void m68k_op_subq_32_al(void); -void m68k_op_subx_8_rr(void); -void m68k_op_subx_16_rr(void); -void m68k_op_subx_32_rr(void); -void m68k_op_subx_8_mm_ax7(void); -void m68k_op_subx_8_mm_ay7(void); -void m68k_op_subx_8_mm_axy7(void); -void m68k_op_subx_8_mm(void); -void m68k_op_subx_16_mm(void); -void m68k_op_subx_32_mm(void); -void m68k_op_swap_32(void); -void m68k_op_tas_8_d(void); -void m68k_op_tas_8_ai(void); -void m68k_op_tas_8_pi(void); -void m68k_op_tas_8_pi7(void); -void m68k_op_tas_8_pd(void); -void m68k_op_tas_8_pd7(void); -void m68k_op_tas_8_di(void); -void m68k_op_tas_8_ix(void); -void m68k_op_tas_8_aw(void); -void m68k_op_tas_8_al(void); -void m68k_op_trap(void); -void m68k_op_trapt(void); -void m68k_op_trapt_16(void); -void m68k_op_trapt_32(void); -void m68k_op_trapf(void); -void m68k_op_trapf_16(void); -void m68k_op_trapf_32(void); -void m68k_op_traphi(void); -void m68k_op_trapls(void); -void m68k_op_trapcc(void); -void m68k_op_trapcs(void); -void m68k_op_trapne(void); -void m68k_op_trapeq(void); -void m68k_op_trapvc(void); -void m68k_op_trapvs(void); -void m68k_op_trappl(void); -void m68k_op_trapmi(void); -void m68k_op_trapge(void); -void m68k_op_traplt(void); -void m68k_op_trapgt(void); -void m68k_op_traple(void); -void m68k_op_traphi_16(void); -void m68k_op_trapls_16(void); -void m68k_op_trapcc_16(void); -void m68k_op_trapcs_16(void); -void m68k_op_trapne_16(void); -void m68k_op_trapeq_16(void); -void m68k_op_trapvc_16(void); -void m68k_op_trapvs_16(void); -void m68k_op_trappl_16(void); -void m68k_op_trapmi_16(void); -void m68k_op_trapge_16(void); -void m68k_op_traplt_16(void); -void m68k_op_trapgt_16(void); -void m68k_op_traple_16(void); -void m68k_op_traphi_32(void); -void m68k_op_trapls_32(void); -void m68k_op_trapcc_32(void); -void m68k_op_trapcs_32(void); -void m68k_op_trapne_32(void); -void m68k_op_trapeq_32(void); -void m68k_op_trapvc_32(void); -void m68k_op_trapvs_32(void); -void m68k_op_trappl_32(void); -void m68k_op_trapmi_32(void); -void m68k_op_trapge_32(void); -void m68k_op_traplt_32(void); -void m68k_op_trapgt_32(void); -void m68k_op_traple_32(void); -void m68k_op_trapv(void); -void m68k_op_tst_8_d(void); -void m68k_op_tst_8_ai(void); -void m68k_op_tst_8_pi(void); -void m68k_op_tst_8_pi7(void); -void m68k_op_tst_8_pd(void); -void m68k_op_tst_8_pd7(void); -void m68k_op_tst_8_di(void); -void m68k_op_tst_8_ix(void); -void m68k_op_tst_8_aw(void); -void m68k_op_tst_8_al(void); -void m68k_op_tst_8_pcdi(void); -void m68k_op_tst_8_pcix(void); -void m68k_op_tst_8_i(void); -void m68k_op_tst_16_d(void); -void m68k_op_tst_16_a(void); -void m68k_op_tst_16_ai(void); -void m68k_op_tst_16_pi(void); -void m68k_op_tst_16_pd(void); -void m68k_op_tst_16_di(void); -void m68k_op_tst_16_ix(void); -void m68k_op_tst_16_aw(void); -void m68k_op_tst_16_al(void); -void m68k_op_tst_16_pcdi(void); -void m68k_op_tst_16_pcix(void); -void m68k_op_tst_16_i(void); -void m68k_op_tst_32_d(void); -void m68k_op_tst_32_a(void); -void m68k_op_tst_32_ai(void); -void m68k_op_tst_32_pi(void); -void m68k_op_tst_32_pd(void); -void m68k_op_tst_32_di(void); -void m68k_op_tst_32_ix(void); -void m68k_op_tst_32_aw(void); -void m68k_op_tst_32_al(void); -void m68k_op_tst_32_pcdi(void); -void m68k_op_tst_32_pcix(void); -void m68k_op_tst_32_i(void); -void m68k_op_unlk_32_a7(void); -void m68k_op_unlk_32(void); -void m68k_op_unpk_16_rr(void); -void m68k_op_unpk_16_mm_ax7(void); -void m68k_op_unpk_16_mm_ay7(void); -void m68k_op_unpk_16_mm_axy7(void); -void m68k_op_unpk_16_mm(void); -/* Build the opcode handler table */ -void m68ki_build_opcode_table(void); - -extern void (*m68ki_instruction_jump_table[0x10000])(void); /* opcode handler jump table */ -extern unsigned char m68ki_cycles[][0x10000]; - - -/* ======================================================================== */ -/* ============================== END OF FILE ============================= */ -/* ======================================================================== */ - -#endif /* M68KOPS__HEADER */ - - +#ifndef M68KOPS__HEADER +#define M68KOPS__HEADER + +/* ======================================================================== */ +/* ============================ OPCODE HANDLERS =========================== */ +/* ======================================================================== */ + + +/* Build the opcode handler table */ +void m68ki_build_opcode_table(void); + +extern void (*m68ki_instruction_jump_table[0x10000])(void); /* opcode handler jump table */ +extern unsigned char m68ki_cycles[][0x10000]; + + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ + +#endif /* M68KOPS__HEADER */ + + diff --git a/source/macros.h b/source/macros.h index 7f45920..e4d9c6f 100644 --- a/source/macros.h +++ b/source/macros.h @@ -1,34 +1,33 @@ - -#ifndef _MACROS_H_ -#define _MACROS_H_ - -#ifdef LSB_FIRST - -#define READ_BYTE(BASE, ADDR) (BASE)[(ADDR)^1] -#define READ_WORD(BASE, ADDR) (((BASE)[ADDR]<<8) | \ - (BASE)[(ADDR)+1]) -#define READ_WORD_LONG(BASE, ADDR) (((BASE)[ADDR]<<24) | \ - ((BASE)[(ADDR)+1]<<16) | \ - ((BASE)[(ADDR)+2]<<8) | \ - (BASE)[(ADDR)+3]) - -#define WRITE_BYTE(BASE, ADDR, VAL) (BASE)[(ADDR)^1] = (VAL)&0xff -#define WRITE_WORD(BASE, ADDR, VAL) (BASE)[ADDR] = ((VAL)>>8) & 0xff; \ - (BASE)[(ADDR)+1] = (VAL)&0xff -#define WRITE_WORD_LONG(BASE, ADDR, VAL) (BASE)[(ADDR] = ((VAL)>>24) & 0xff; \ - (BASE)[(ADDR)+1] = ((VAL)>>16)&0xff; \ - (BASE)[(ADDR)+2] = ((VAL)>>8)&0xff; \ - (BASE)[(ADDR)+3] = (VAL)&0xff - -#else - -#define READ_BYTE(BASE, ADDR) (BASE)[ADDR] -#define READ_WORD(BASE, ADDR) *(uint16 *)((BASE) + (ADDR)); -#define READ_WORD_LONG(BASE, ADDR) *(uint32 *)((BASE) + (ADDR)); -#define WRITE_BYTE(BASE, ADDR, VAL) (BASE)[ADDR] = VAL & 0xff -#define WRITE_WORD(BASE, ADDR, VAL) *(uint16 *)((BASE) + (ADDR)) = VAL & 0xffff -#define WRITE_WORD_LONG(BASE, ADDR, VAL) *(uint32 *)((BASE) + (ADDR)) = VAL & 0xffffffff -#endif - - -#endif /* _MACROS_H_ */ +#ifndef _MACROS_H_ +#define _MACROS_H_ + +#ifdef LSB_FIRST + +#define READ_BYTE(BASE, ADDR) (BASE)[(ADDR)^1] +#define READ_WORD(BASE, ADDR) (((BASE)[ADDR]<<8) | \ + (BASE)[(ADDR)+1]) +#define READ_WORD_LONG(BASE, ADDR) (((BASE)[ADDR]<<24) | \ + ((BASE)[(ADDR)+1]<<16) | \ + ((BASE)[(ADDR)+2]<<8) | \ + (BASE)[(ADDR)+3]) + +#define WRITE_BYTE(BASE, ADDR, VAL) (BASE)[(ADDR)^1] = (VAL)&0xff +#define WRITE_WORD(BASE, ADDR, VAL) (BASE)[ADDR] = ((VAL)>>8) & 0xff; \ + (BASE)[(ADDR)+1] = (VAL)&0xff +#define WRITE_WORD_LONG(BASE, ADDR, VAL) (BASE)[(ADDR] = ((VAL)>>24) & 0xff; \ + (BASE)[(ADDR)+1] = ((VAL)>>16)&0xff; \ + (BASE)[(ADDR)+2] = ((VAL)>>8)&0xff; \ + (BASE)[(ADDR)+3] = (VAL)&0xff + +#else + +#define READ_BYTE(BASE, ADDR) (BASE)[ADDR] +#define READ_WORD(BASE, ADDR) *(uint16 *)((BASE) + (ADDR)); +#define READ_WORD_LONG(BASE, ADDR) *(uint32 *)((BASE) + (ADDR)); +#define WRITE_BYTE(BASE, ADDR, VAL) (BASE)[ADDR] = VAL & 0xff +#define WRITE_WORD(BASE, ADDR, VAL) *(uint16 *)((BASE) + (ADDR)) = VAL & 0xffff +#define WRITE_WORD_LONG(BASE, ADDR, VAL) *(uint32 *)((BASE) + (ADDR)) = VAL & 0xffffffff +#endif + + +#endif /* _MACROS_H_ */ diff --git a/source/mem68k.c b/source/mem68k.c index 6ee65ed..2a707e9 100644 --- a/source/mem68k.c +++ b/source/mem68k.c @@ -1,778 +1,1031 @@ -#include "shared.h" - -static uint16 next_int = 1; -static uint8 prot_bytes[2]; /* simple protection faking (from Picodrive) */ - -unsigned int m68k_read_bus_8(unsigned int address) -{ - uint16 temp = m68k_read_bus_16(address); - return ((address & 1) ? (temp & 0xFF) : (temp >> 8)); -} - -unsigned int m68k_read_bus_16(unsigned int address) -{ - next_int ^= 0xFFFF; - return next_int; -} - - -void m68k_unused_w (unsigned int address, unsigned int value) -{ - error("Unused 3 %08X = %08X \n", address, value); -} - -void m68k_unused_8_w (unsigned int address, unsigned int value) -{ - error("Unused 2 %08X = %02X \n", address, value); -} - -void m68k_unused_16_w (unsigned int address, unsigned int value) -{ - error("Unused 1 %08X = %04X \n", address, value); -} - -/* - Functions to handle memory accesses which cause the Genesis to halt - either temporarily (press RESET button to restart) or unrecoverably - (cycle power to restart). -*/ - -void m68k_lockup_w_8 (unsigned int address, unsigned int value) -{ - error ("Lockup %08X = %02X (%08X)\n", address, value, m68k_get_reg (NULL, M68K_REG_PC)); - gen_running = 0; - m68k_end_timeslice (); -} - -void m68k_lockup_w_16 (unsigned int address, unsigned int value) -{ - error ("Lockup %08X = %04X (%08X)\n", address, value, m68k_get_reg (NULL, M68K_REG_PC)); - gen_running = 0; - m68k_end_timeslice (); -} - -unsigned int m68k_lockup_r_8 (unsigned int address) -{ - error ("Lockup %08X.b (%08X)\n", address, m68k_get_reg (NULL, M68K_REG_PC)); - gen_running = 0; - m68k_end_timeslice (); - return -1; -} - -unsigned int m68k_lockup_r_16 (unsigned int address) -{ - error ("Lockup %08X.w (%08X)\n", address, m68k_get_reg (NULL, M68K_REG_PC)); - gen_running = 0; - m68k_end_timeslice (); - return -1; -} - - -/*--------------------------------------------------------------------------*/ -/* 68000 memory handlers */ -/*--------------------------------------------------------------------------*/ - -unsigned int m68k_read_memory_8 (unsigned int address) -{ - switch ((address >> 21) & 7) - { - case 0: /* ROM Cartridge*/ - case 1: - /* SRAM */ - if (sram.on) - { - if (address >= sram.start && address <= sram.end) - { - if (sram.custom) return (EEPROM_Read(address)&0xffff); - return READ_BYTE(sram.sram, (address - sram.start) & 0xffff); - } - } - - /* ROM data */ - if (address < genromsize) return READ_BYTE(cart_rom, address); - - /* default */ - return 0x00; - - case 7: /* RAM */ - return READ_BYTE(work_ram, address & 0xFFFF); - - case 5: /* Z80 & I/O */ - if (address <= 0xA0FFFF) /* Z80 area */ - { - /* Z80 controls Z bus */ - if (zbusack == 1) return (m68k_read_bus_8 (address)); - else - { - /* Read data from Z bus */ - switch (address & 0x6000) - { - case 0x0000: /* RAM */ - case 0x2000: - return (zram[(address & 0x1FFF)]); - - case 0x4000: /* YM2612 */ - return (fm_read (address & 3)); - - case 0x6000: /* Unused */ - switch (address & 0xFF00) - { - case 0x7F00: /* VDP */ - m68k_lockup_r_8 (address); - - default: /* Unused */ - return (0xFF); - } - break; - } - } - } - else if (address <= 0xA1001F) - { - /* I/O */ - return (io_read((address >> 1) & 0x0F)); - } - else if (address <= 0xA1FFFF) /* CONTROL */ - { - switch ((address >> 8) & 0xFF) - { - case 0x11: /* BUSACK */ - if ((address & 1) == 0) return (gen_busack_r () | (m68k_read_bus_8 (address) & 0xFE)); - else return (m68k_read_bus_8 (address)); - - case 0x00: /* UNKNOWN (BallZ) */ - case 0x10: /* MEMORY MODE */ - case 0x12: /* RESET */ - case 0x20: /* MEGA-CD */ - case 0x40: /* TMSS */ - case 0x41: /* BOOTROM */ - case 0x50: /* SVP REGISTERS */ - case 0x30: /* TIME */ - return (m68k_read_bus_8 (address)); - - default: /* Unused */ - return (m68k_lockup_r_8 (address)); - } - } - else - { - /* Unused */ - return (m68k_lockup_r_8 (address)); - } - - break; - - case 6: /* VDP */ - if ((address & 0xE700E0) == 0xC00000) - { - switch (address & 0x1F) - { - case 0x00: /* DATA */ - case 0x02: - return (vdp_data_r () >> 8); - - case 0x01: /* DATA */ - case 0x03: - return (vdp_data_r () & 0xFF); - - case 0x04: /* CTRL */ - case 0x06: - return ((m68k_read_bus_8 (address) & 0xFC) | (vdp_ctrl_r () >> 8)); - - case 0x05: /* CTRL */ - case 0x07: - return (vdp_ctrl_r () & 0xFF); - - case 0x08: /* HVC */ - case 0x0A: - case 0x0C: - case 0x0E: - return (vdp_hvc_r () >> 8); - - case 0x09: /* HVC */ - case 0x0B: - case 0x0D: - case 0x0F: - return (vdp_hvc_r () & 0xFF); - - case 0x10: /* PSG */ - case 0x11: - case 0x12: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - return (m68k_lockup_r_8 (address)); - - case 0x18: /* Unused */ - case 0x19: - case 0x1A: - case 0x1B: - case 0x1C: - case 0x1D: - case 0x1E: - case 0x1F: - return (m68k_read_bus_8 (address)); - } - } - else - { - /* Unused */ - return (m68k_lockup_r_8 (address)); - } - break; - - case 2: /* Unused */ - /* Some unlicensed games have a simple protection device mapped here */ - return prot_bytes[(address>>2)&1]; - - case 3: /* Unused */ - return (m68k_read_bus_8 (address)); - - case 4: /* Unused */ - return (m68k_lockup_r_8 (address)); - } - - return -1; -} - - -unsigned int m68k_read_memory_16 (unsigned int address) -{ - switch ((address >> 21) & 7) - { - case 0: /* ROM Cartridge */ - case 1: - /* SRAM */ - if (sram.on) - { - if (address >= sram.start && address <= sram.end) - { - if (sram.custom) return (EEPROM_Read(address) & 0xffff); - return *(uint16 *)(sram.sram + ((address - sram.start) & 0xffff)); - } - } - - /* ROM Data */ - if (address < genromsize) return *(uint16 *)(cart_rom + address); - - /* j-CART */ - if (j_cart && ((address == 0x3FFFFE) || (address == 0x38FFFE))) - return (gamepad_read(5) | (gamepad_read(6) << 8)); - - /* Virtua Racing SVP */ - if (address == 0x30fe02) return 0x01; - - /* default */ - return 0x00; - - case 7: /* RAM */ - return *(uint16 *)(work_ram + (address & 0xffff)); - - case 5: /* Z80 & I/O */ - if (address <= 0xA0FFFF) /* Z80 area */ - { - if (zbusack == 1) return (m68k_read_bus_16 (address)); - else - { - uint8 temp; - switch (address & 0x6000) - { - case 0x0000: /* RAM */ - case 0x2000: - temp = zram[address & 0x1FFF]; - return (temp << 8 | temp); - - case 0x4000: /* YM2612 */ - temp = fm_read (address & 3); - return (temp << 8 | temp); - - case 0x6000: - switch (address & 0xFF00) - { - case 0x7F00: /* VDP */ - m68k_lockup_r_16 (address); - - default: /* Unused */ - return (0xFFFF); - } - break; - } - } - } - else if (address <= 0xA1001F) /* I/O */ - { - uint8 temp = io_read ((address >> 1) & 0x0F); - return (temp << 8 | temp); - } - else if (address <= 0xA1FFFF) /* CONTROL */ - { - switch ((address >> 8) & 0xFF) - { - case 0x11: /* BUSACK */ - return ((m68k_read_bus_16 (address) & 0xFEFF) | (gen_busack_r () << 8)); - - case 0x00: /* UNKNOWN (BallZ) */ - case 0x10: /* MEMORY MODE */ - case 0x12: /* RESET */ - case 0x20: /* MEGA-CD */ - case 0x40: /* TMSS */ - case 0x41: /* BOOTROM */ - case 0x50: /* SVP REGISTERS */ - case 0x30: /* TIME */ - return (m68k_read_bus_16 (address)); - - default: /* Unused */ - return (m68k_lockup_r_16 (address)); - } - } - else - { - /* Unused */ - return (m68k_lockup_r_16 (address)); - } - - break; - - case 6: /* VDP */ - if ((address & 0xE700E0) == 0xC00000) - { - switch (address & 0x1F) - { - case 0x00: /* DATA */ - case 0x02: - return (vdp_data_r ()); - - case 0x04: /* CTRL */ - case 0x06: - return (vdp_ctrl_r () | (m68k_read_bus_16 (address) & 0xFC00)); - - case 0x08: /* HVC */ - case 0x0A: - case 0x0C: - case 0x0E: - return (vdp_hvc_r ()); - - case 0x10: /* PSG */ - case 0x12: - case 0x14: - case 0x16: - return (m68k_lockup_r_16 (address)); - - case 0x18: /* Unused */ - case 0x1A: - case 0x1C: - case 0x1E: - return (m68k_read_bus_16 (address)); - } - } - else - { - return (m68k_lockup_r_16 (address)); - } - break; - - case 2: - case 3: - return (m68k_read_bus_16 (address)); - - case 4: - return (m68k_lockup_r_16 (address)); - } - - return (0xA5A5); -} - - -unsigned int m68k_read_memory_32 (unsigned int address) -{ - /* Split into 2 reads */ - return (m68k_read_memory_16 (address + 0) << 16 | - m68k_read_memory_16 (address + 2)); -} - - -void m68k_write_memory_8 (unsigned int address, unsigned int value) -{ - switch ((address >> 21) & 7) - { - case 7: /* RAM */ - WRITE_BYTE(work_ram, address & 0xFFFF, value); - return; - - case 6: /* VDP */ - if ((address & 0xE700E0) == 0xC00000) - { - switch (address & 0x1F) - { - case 0x00: /* DATA */ - case 0x01: - case 0x02: - case 0x03: - vdp_data_w (value << 8 | value); - return; - - case 0x04: /* CTRL */ - case 0x05: - case 0x06: - case 0x07: - vdp_ctrl_w (value << 8 | value); - return; - - case 0x08: /* HVC */ - case 0x09: - case 0x0A: - case 0x0B: - case 0x0C: - case 0x0D: - case 0x0E: - case 0x0F: - m68k_lockup_w_8 (address, value); - return; - - case 0x10: /* PSG */ - case 0x12: - case 0x14: - case 0x16: - m68k_unused_8_w (address, value); - return; - - case 0x11: /* PSG */ - case 0x13: - case 0x15: - case 0x17: - psg_write (0, value); - return; - - case 0x18: /* Unused */ - case 0x19: - case 0x1A: - case 0x1B: - case 0x1C: - case 0x1D: - case 0x1E: - case 0x1F: - m68k_unused_8_w (address, value); - return; - } - } - else - { - m68k_lockup_w_8 (address, value); - return; - } - - case 5: /* Z80 & IO */ - if (address <= 0xA0FFFF) /* Z80 area */ - { - if (zbusack == 1) - { - m68k_unused_8_w (address, value); - return; - } - else - { - switch (address & 0x6000) - { - case 0x0000: - case 0x2000: - zram[(address & 0x1FFF)] = value; - return; - - case 0x4000: - fm_write (0, address & 3, value); - return; - - case 0x6000: - switch (address & 0xFF00) - { - case 0x6000: /* BANK */ - gen_bank_w (value & 1); - return; - - case 0x7F00: /* VDP */ - m68k_lockup_w_8 (address, value); - return; - - default: /* Unused */ - m68k_unused_8_w (address, value); - return; - } - break; - } - } - } - else if (address <= 0xA1001F) /* I/O */ - { - /* I/O chip only gets /LWR */ - if (address & 1) io_write ((address >> 1) & 0x0F, value); - return; - } - else if (address <= 0xA1FFFF) /* CONTROL */ - { - switch ((address >> 8) & 0xFF) - { - case 0x11: /* BUSREQ */ - if ((address & 1) == 0) gen_busreq_w (value & 1); - else m68k_unused_8_w (address, value); - return; - - case 0x12: /* RESET */ - gen_reset_w (value & 1); - return; - - case 0x30: /* TIME */ - if (SSF2TNC) ssf2bankrom (address, value & 0xf); /* banked ROM */ - else if (address == 0xA130F1) /* banked SRAM */ - { - sram.on = value & 1; - sram.write = (value & 2) ? 0 : 1; - } - else m68k_unused_8_w (address, value); - return; - - case 0x10: /* MEMORY MODE */ - case 0x20: /* MEGA-CD */ - case 0x40: /* TMSS */ - case 0x41: /* BOOTROM */ - case 0x50: /* SVP REGISTERS */ - m68k_unused_8_w (address, value); - return; - - default: - m68k_lockup_w_8 (address, value); - return; - } - } - else - { - /* Unused */ - m68k_lockup_w_8 (address, value); - return; - } - break; - - case 0: /* ROM Cartridge */ - case 1: - - /* external SRAM */ - if (sram.on && sram.write) - { - if (address >= sram.start && address <= sram.end) - { - /* serial EEPROM */ - if (sram.custom) - { - EEPROM_Write(address, value); - return; - } - - /* normal SRAM */ - WRITE_BYTE(sram.sram, (address - sram.start) & 0xffff, value & 0xff); - return; - } - } - m68k_unused_8_w (address, value); - return; - - case 2: /* Unused */ - /* Some unlicensed games have a simple protection device mapped here */ - prot_bytes[(address>>2)&1] = value; - return; - case 3: - m68k_unused_8_w (address, value); - return; - - case 4: /* Unused */ - m68k_lockup_w_8 (address, value); - return; - } -} - - -void m68k_write_memory_16 (unsigned int address, unsigned int value) -{ - switch ((address >> 21) & 7) - { - case 7: /* Work RAM */ - *(uint16 *)(work_ram + (address& 0xFFFF)) = value & 0xffff; - return; - - case 6: /* VDP */ - if ((address & 0xE700E0) == 0xC00000) - { - switch (address & 0x1C) - { - case 0x00: /* DATA */ - vdp_data_w (value); - return; - - case 0x04: /* CTRL */ - vdp_ctrl_w (value); - return; - - case 0x08: /* HV counter */ - case 0x0C: /* HV counter */ - m68k_lockup_w_16 (address, value); - return; - - case 0x10: /* PSG */ - case 0x14: /* PSG */ - psg_write (0, value & 0xFF); - return; - - case 0x18: /* Unused */ - case 0x1C: /* Unused */ - m68k_unused_8_w (address, value); - return; - } - } - else - { - /* Invalid address */ - m68k_lockup_w_16 (address, value); - } - break; - - case 5: /* Z80 area, I/O chip, miscellaneous. */ - if (address <= 0xA0FFFF) /* Z80 area */ - { - /* Writes are ignored when the Z80 hogs the Z-bus */ - if (zbusack == 1) - { - m68k_unused_8_w (address, value); - return; - } - - /* Write into Z80 address space */ - switch (address & 0x6000) - { - case 0x0000: /* Work RAM */ - case 0x2000: /* Work RAM */ - zram[(address & 0x1FFF)] = (value >> 8) & 0xFF; - return; - - case 0x4000: /* YM2612 */ - fm_write (0, address & 3, (value >> 8) & 0xFF); - return; - - case 0x6000: /* Bank register and VDP */ - switch (address & 0x7F00) - { - case 0x6000: /* Bank register */ - gen_bank_w ((value >> 8) & 1); - return; - - case 0x7F00: /* VDP registers */ - m68k_lockup_w_16 (address, value); - return; - - default: /* Unused */ - m68k_unused_8_w (address, value); - return; - } - break; - } - } - else if (address <= 0xA1001F) /* I/O */ - { - io_write ((address >> 1) & 0x0F, value & 0x00FF); - return; - } - else if (address <= 0xA1FFFF) /* CONTROL */ - { - switch ((address >> 8) & 0xFF) - { - case 0x11: /* BUSREQ */ - gen_busreq_w ((value >> 8) & 1); - return; - - case 0x12: /* RESET */ - gen_reset_w ((value >> 8) & 1); - return; - - case 0x30: /* TIME */ - if (SSF2TNC) ssf2bankrom (address, value & 0xf); /* banked ROM */ - else if (address == 0xA130F1) /* banked SRAM */ - { - sram.on = value & 1; - sram.write = (value & 2) ? 0 : 1; - } - else m68k_unused_16_w (address, value); - return; - - case 0x10: /* MEMORY MODE */ - case 0x20: /* MEGA-CD */ - case 0x40: /* TMSS */ - case 0x41: /* BOOTROM */ - case 0x50: /* SVP REGISTERS */ - m68k_unused_16_w (address, value); - return; - - default: /* Unused */ - m68k_lockup_w_16 (address, value); - return; - } - } - else - { - m68k_lockup_w_16 (address, value); - return; - } - - break; - - case 0: /* Cartridge ROM */ - case 1: - /* J-CART extension (TH signal) */ - if ((address == 0x3FFFFE) || (address == 0x38FFFE)) - { - if (!j_cart) - { - j_cart = 1; - input_reset(pad_type); - } - gamepad_write(5, (value&1) <<6 ); - gamepad_write(6, (value&1) <<6); - return; - } - - /* external SRAM */ - if (sram.on && sram.write) - { - if (address >= sram.start && address <= sram.end) - { - /* serial EEPROM */ - if (sram.custom) - { - EEPROM_Write(address, value); - return; - } - - /* normal SRAM */ - *(uint16 *)(sram.sram + ((address - sram.start) & 0xffff)) = value & 0xffff; - return; - } - } - m68k_unused_16_w (address, value); - return; - - case 2: /* Unused */ - case 3: - m68k_unused_16_w (address, value); - return; - - case 4: /* Unused */ - m68k_lockup_w_16 (address, value); - return; - } -} - - -void m68k_write_memory_32 (unsigned int address, unsigned int value) -{ - /* Split into 2 writes */ - m68k_write_memory_16 (address, (value >> 16) & 0xFFFF); - m68k_write_memory_16 (address + 2, value & 0xFFFF); -} +/*************************************************************************************** + * Genesis Plus 1.2a + * 68k memory handlers + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#include "m68kcpu.h" +#include "shared.h" + +uint8 m68k_readmap_8[32]; +uint8 m68k_readmap_16[32]; +uint8 m68k_writemap_8[32]; +uint8 m68k_writemap_16[32]; + + +uint8 pico_current; +static uint8 pico_page[7] = {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F}; + + +static inline unsigned int m68k_read_bus_8(unsigned int address) +{ +#ifdef LOGERROR + if ((address != 0xa11100) && (address != 0xc00004) && (address != 0xc00006)) + { + error("Unused read8 %08X (%08X)\n", address, m68k_get_reg (NULL, M68K_REG_PC)); + error("D0 = %x \n", m68k_get_reg (NULL, M68K_REG_D0)); + error("D1 = %x \n", m68k_get_reg (NULL, M68K_REG_D1)); + error("D2 = %x \n", m68k_get_reg (NULL, M68K_REG_D2)); + error("D3 = %x \n", m68k_get_reg (NULL, M68K_REG_D3)); + error("D4 = %x \n", m68k_get_reg (NULL, M68K_REG_D4)); + error("D5 = %x \n", m68k_get_reg (NULL, M68K_REG_D5)); + error("D6 = %x \n", m68k_get_reg (NULL, M68K_REG_D6)); + error("D7 = %x \n", m68k_get_reg (NULL, M68K_REG_D7)); + error("A0 = %x \n", m68k_get_reg (NULL, M68K_REG_A0)); + error("A1 = %x \n", m68k_get_reg (NULL, M68K_REG_A1)); + error("A2 = %x \n", m68k_get_reg (NULL, M68K_REG_A2)); + error("A3 = %x \n", m68k_get_reg (NULL, M68K_REG_A3)); + error("A4 = %x \n", m68k_get_reg (NULL, M68K_REG_A4)); + error("A5 = %x \n", m68k_get_reg (NULL, M68K_REG_A5)); + error("A6 = %x \n", m68k_get_reg (NULL, M68K_REG_A6)); + error("A7 = %x \n", m68k_get_reg (NULL, M68K_REG_A7)); + } +#endif + int bus_addr = (REG_PC & 0xffffe) | (address & 1); + int offset = bus_addr >> 19; + + if (offset > 8) return READ_BYTE(work_ram, bus_addr & 0xffff); + else return READ_BYTE(rom_readmap[offset], bus_addr & 0x7ffff); +} + +static inline unsigned int m68k_read_bus_16(unsigned int address) +{ +#ifdef LOGERROR + if ((address != 0xa11100) && (address != 0xc00004) && (address != 0xc00006)) + { + error("Unused read16 %08X (%08X)\n", address, m68k_get_reg (NULL, M68K_REG_PC)); + error("D0 = %x \n", m68k_get_reg (NULL, M68K_REG_D0)); + error("D1 = %x \n", m68k_get_reg (NULL, M68K_REG_D1)); + error("D2 = %x \n", m68k_get_reg (NULL, M68K_REG_D2)); + error("D3 = %x \n", m68k_get_reg (NULL, M68K_REG_D3)); + error("D4 = %x \n", m68k_get_reg (NULL, M68K_REG_D4)); + error("D5 = %x \n", m68k_get_reg (NULL, M68K_REG_D5)); + error("D6 = %x \n", m68k_get_reg (NULL, M68K_REG_D6)); + error("D7 = %x \n", m68k_get_reg (NULL, M68K_REG_D7)); + error("A0 = %x \n", m68k_get_reg (NULL, M68K_REG_A0)); + error("A1 = %x \n", m68k_get_reg (NULL, M68K_REG_A1)); + error("A2 = %x \n", m68k_get_reg (NULL, M68K_REG_A2)); + error("A3 = %x \n", m68k_get_reg (NULL, M68K_REG_A3)); + error("A4 = %x \n", m68k_get_reg (NULL, M68K_REG_A4)); + error("A5 = %x \n", m68k_get_reg (NULL, M68K_REG_A5)); + error("A6 = %x \n", m68k_get_reg (NULL, M68K_REG_A6)); + error("A7 = %x \n", m68k_get_reg (NULL, M68K_REG_A7)); + } +#endif + int bus_addr = REG_PC & 0xfffffe; + int offset = bus_addr >> 19; + + if (offset > 8) return *(uint16 *)(work_ram + (bus_addr & 0xffff)); + else return *(uint16 *)(rom_readmap[offset] + (bus_addr & 0x7ffff)); +} + + +static inline void m68k_unused_8_w (unsigned int address, unsigned int value) +{ +#ifdef LOGERROR + error("Unused write8 %08X = %02X (%08X)\n", address, value, m68k_get_reg (NULL, M68K_REG_PC)); +#endif +} + +static inline void m68k_unused_16_w (unsigned int address, unsigned int value) +{ +#ifdef LOGERROR + error("Unused write16 %08X = %04X (%08X)\n", address, value, m68k_get_reg (NULL, M68K_REG_PC)); +#endif +} + +/* + Functions to handle memory accesses which cause the Genesis to halt + either temporarily (press RESET button to restart) or unrecoverably + (cycle power to restart). +*/ + +static inline void m68k_lockup_w_8 (unsigned int address, unsigned int value) +{ +#ifdef LOGERROR + error ("Lockup %08X = %02X (%08X)\n", address, value, m68k_get_reg (NULL, M68K_REG_PC)); +#endif + gen_running = config.force_dtack; + if (!gen_running) m68k_end_timeslice (); +} + +static inline void m68k_lockup_w_16 (unsigned int address, unsigned int value) +{ +#ifdef LOGERROR + error ("Lockup %08X = %04X (%08X)\n", address, value, m68k_get_reg (NULL, M68K_REG_PC)); +#endif + gen_running = config.force_dtack; + if (!gen_running) m68k_end_timeslice (); +} + +static inline unsigned int m68k_lockup_r_8 (unsigned int address) +{ +#ifdef LOGERROR + error ("Lockup %08X.b (%08X)\n", address, m68k_get_reg (NULL, M68K_REG_PC)); +#endif + gen_running = config.force_dtack; + if (!gen_running) m68k_end_timeslice (); + return -1; +} + +static inline unsigned int m68k_lockup_r_16 (unsigned int address) +{ +#ifdef LOGERROR + error ("Lockup %08X.w (%08X)\n", address, m68k_get_reg (NULL, M68K_REG_PC)); +#endif + gen_running = config.force_dtack; + if (!gen_running) m68k_end_timeslice (); + return -1; +} + +/*--------------------------------------------------------------------------*/ +/* 68000 memory handlers */ +/*--------------------------------------------------------------------------*/ +unsigned int m68k_read_memory_8(unsigned int address) +{ + int offset = address >> 19; + + switch (m68k_readmap_8[offset]) + { + case WRAM: + return READ_BYTE(work_ram, address & 0xffff); + + case SYSTEM_IO: + { + unsigned int base = address >> 8; + + /* Z80 */ + if (base <= 0xa0ff) + { + /* Z80 controls Z bus ? */ + if (zbusack) return m68k_read_bus_8(address); + + /* Read data from Z bus */ + switch (base & 0x60) + { + case 0x40: /* YM2612 */ + return fm_read(0, address & 3); + + case 0x60: /* VDP */ + if (base == 0xa07f) return m68k_lockup_r_8(address); + return (m68k_read_bus_8(address) | 0xff); + + default: /* ZRAM */ + return zram[address & 0x1fff]; + } + } + + /* I/O & CONTROL registers */ + if (base <= 0xa1ff) + { + switch (base & 0xff) + { + case 0x00: /* I/O chip */ + if (address & 0xe0) return m68k_read_bus_8(address); + return (io_read((address >> 1) & 0x0f)); + + case 0x11: /* BUSACK */ + return (zbusack | (address & 1) | (m68k_read_bus_8(address) & 0xFE)); + + case 0x30: /* TIME */ + if (cart_hw.time_r) return cart_hw.time_r(address); + else return m68k_read_bus_8(address); + + case 0x10: /* MEMORY MODE */ + case 0x12: /* RESET */ + case 0x20: /* MEGA-CD */ + case 0x40: /* TMSS */ + case 0x41: /* BOOTROM */ + case 0x44: /* RADICA */ + case 0x50: /* SVP REGISTERS */ + return m68k_read_bus_8(address); + + default: /* Invalid address */ + return m68k_lockup_r_8(address); + } + } + + /* Invalid address */ + return m68k_lockup_r_8(address); + } + + case VDP: + + /* Valid VDP addresses */ + if (((address >> 16) & 0x07) == 0) + { + switch (address & 0xff) + { + case 0x00: /* DATA */ + case 0x02: + return (vdp_data_r() >> 8); + + case 0x01: /* DATA */ + case 0x03: + return (vdp_data_r() & 0xff); + + case 0x04: /* CTRL */ + case 0x06: + return ((m68k_read_bus_8(address) & 0xfc) | ((vdp_ctrl_r() >> 8) & 3)); + + case 0x05: /* CTRL */ + case 0x07: + return (vdp_ctrl_r() & 0xff); + + case 0x08: /* HVC */ + case 0x0a: + case 0x0c: + case 0x0e: + return (vdp_hvc_r() >> 8); + + case 0x09: /* HVC */ + case 0x0b: + case 0x0d: + case 0x0f: + return (vdp_hvc_r() & 0xff); + + case 0x18: + case 0x19: + case 0x1a: + case 0x1b: + case 0x1c: + case 0x1d: + case 0x1e: + case 0x1f: /* Unused */ + return m68k_read_bus_8(address); + + default: /* Invalid address */ + return m68k_lockup_r_8(address); + } + } + + /* Invalid address */ + return (m68k_lockup_r_8 (address)); + + case SRAM: + if (address <= sram.end) return READ_BYTE(sram.sram, address - sram.start); + return READ_BYTE(rom_readmap[offset], address & 0x7ffff); + + case EEPROM: + if (address == eeprom.type.sda_out_adr) return eeprom_read(address, 0); + return READ_BYTE(rom_readmap[offset], address & 0x7ffff); + + case CART_HW: + return cart_hw.regs_r(address); + + case UNUSED: + return m68k_read_bus_8(address); + + case ILLEGAL: + return m68k_lockup_r_8(address); + + case UMK3_HACK: + return READ_BYTE(&cart_rom[offset<<19], address & 0x7ffff); + + case PICO_HW: + switch (address & 0xff) + { + case 0x01: /* VERSION register */ + return (0x40); + + case 0x03: /* IO register */ + { + uint8 retval = 0xff; + if (input.pad[0] & INPUT_B) retval &= ~0x80; + if (input.pad[0] & INPUT_A) retval &= ~0x10; + if (input.pad[0] & INPUT_UP) retval &= ~0x01; + if (input.pad[0] & INPUT_DOWN) retval &= ~0x02; + if (input.pad[0] & INPUT_LEFT) retval &= ~0x04; + if (input.pad[0] & INPUT_RIGHT) retval &= ~0x08; + retval &= ~0x20; + retval &= ~0x40; + return retval; + } + + case 0x05: /* MSB PEN X coordinate */ + return (input.analog[0][0] >> 8); + + case 0x07: /* LSB PEN X coordinate */ + return (input.analog[0][0] & 0xff); + + case 0x09: /* MSB PEN Y coordinate */ + return (input.analog[0][1] >> 8); + + case 0x0b: /* LSB PEN Y coordinate */ + return (input.analog[0][1] & 0xff); + + case 0x0d: /* PAGE register */ + return pico_page[pico_current]; /* TODO */ + + case 0x10: /* PCM registers */ + case 0x11: + case 0x12: + case 0x13: + return 0x80; /* TODO */ + + default: + return m68k_read_bus_8(address); + } + + default: /* ROM */ + return READ_BYTE(rom_readmap[offset], address & 0x7ffff); + } +} + + +unsigned int m68k_read_memory_16 (unsigned int address) +{ + int offset = address >> 19; + + switch (m68k_readmap_16[offset]) + { + case WRAM: + return *(uint16 *)(work_ram + (address & 0xffff)); + + case SVP_DRAM: + return *(uint16 *)(svp->dram + (address & 0x1fffe)); + + case SVP_CELL: + switch (address >> 16) + { + case 0x39: + address >>= 1; + address = (address & 0x7001) | ((address & 0x3e) << 6) | ((address & 0xfc0) >> 5); + return *(uint16 *)(svp->dram + (address & 0x1fffe)); + + case 0x3A: + address >>= 1; + address = (address & 0x7801) | ((address & 0x1e) << 6) | ((address & 0x7e0) >> 4); + return *(uint16 *)(svp->dram + (address & 0x1fffe)); + + default: + return m68k_read_bus_16(address); + } + + case SYSTEM_IO: + { + unsigned int base = address >> 8; + + /* Z80 */ + if (base <= 0xa0ff) + { + /* Z80 controls Z bus ? */ + if (zbusack) return m68k_read_bus_16(address); + + /* Read data from Z bus */ + switch (base & 0x60) + { + case 0x40: /* YM2612 */ + { + int temp = fm_read(0, address & 3); + return (temp << 8 | temp); + } + + case 0x60: /* VDP */ + if (base == 0xa07f) return m68k_lockup_r_16(address); + return (m68k_read_bus_16(address) | 0xffff); + + default: /* ZRAM */ + { + int temp = zram[address & 0x1fff]; + return (temp << 8 | temp); + } + } + } + + /* CONTROL registers */ + if (base <= 0xa1ff) + { + switch (base & 0xff) + { + case 0x00: /* I/O chip */ + { + if (address & 0xe0) return m68k_read_bus_16(address); + int temp = io_read((address >> 1) & 0x0f); + return (temp << 8 | temp); + } + + case 0x11: /* BUSACK */ + return ((m68k_read_bus_16(address) & 0xfeff) | (zbusack << 8)); + + case 0x50: /* SVP */ + if (svp) + { + switch (address & 0xff) + { + case 0: + case 2: + return svp->ssp1601.gr[SSP_XST].h; + + case 4: + { + unsigned int temp = svp->ssp1601.gr[SSP_PM0].h; + svp->ssp1601.gr[SSP_PM0].h &= ~1; + return temp; + } + } + } + return m68k_read_bus_16(address); + + case 0x30: /* TIME */ + if (cart_hw.time_r) return cart_hw.time_r(address); + else return m68k_read_bus_16(address); + + case 0x10: /* MEMORY MODE */ + case 0x12: /* RESET */ + case 0x20: /* MEGA-CD */ + case 0x40: /* TMSS */ + case 0x41: /* BOOTROM */ + case 0x44: /* RADICA */ + return m68k_read_bus_16(address); + + default: /* Invalid address */ + return m68k_lockup_r_16(address); + } + } + + /* Invalid address */ + return m68k_lockup_r_16 (address); + } + + case VDP: + + /* Valid VDP addresses */ + if (((address >> 16) & 0x07) == 0) + { + switch (address & 0xfc) + { + case 0x00: /* DATA */ + return vdp_data_r(); + + case 0x04: /* CTRL */ + return ((vdp_ctrl_r() & 0x3FF) | (m68k_read_bus_16(address) & 0xFC00)); + + case 0x08: /* HVC */ + case 0x0c: + return vdp_hvc_r(); + + case 0x18: /* Unused */ + case 0x1c: + return m68k_read_bus_16(address); + + default: + return m68k_lockup_r_16(address); + } + } + + /* Invalid address */ + return m68k_lockup_r_16 (address); + + case SRAM: + if (address <= sram.end) return *(uint16 *)(sram.sram + (address - sram.start)); + return *(uint16 *)(rom_readmap[offset] + (address & 0x7ffff)); + + case EEPROM: + if (address == (eeprom.type.sda_out_adr & 0xfffffe)) return eeprom_read(address, 1); + return *(uint16 *)(rom_readmap[offset] + (address & 0x7ffff)); + + case J_CART: + return jcart_read(); + + case REALTEC_ROM: + return *(uint16 *)(&cart_rom[0x7e000] + (address & 0x1fff)); + + case UNUSED: + return m68k_read_bus_16(address); + + case ILLEGAL: + return m68k_lockup_r_16(address); + + case UMK3_HACK: + return *(uint16 *)(&cart_rom[offset << 19] + (address & 0x7ffff)); + + case PICO_HW: + switch (address & 0xff) + { + case 0x00: /* VERSION register */ + return (0x40); + + case 0x02: /* IO register */ + { + uint8 retval = 0xff; + if (input.pad[0] & INPUT_B) retval &= ~0x80; + if (input.pad[0] & INPUT_A) retval &= ~0x10; + if (input.pad[0] & INPUT_UP) retval &= ~0x01; + if (input.pad[0] & INPUT_DOWN) retval &= ~0x02; + if (input.pad[0] & INPUT_LEFT) retval &= ~0x04; + if (input.pad[0] & INPUT_RIGHT) retval &= ~0x08; + retval &= ~0x20; + retval &= ~0x40; + return retval; + } + + case 0x04: /* MSB PEN X coordinate */ + return (input.analog[0][0] >> 8); + + case 0x06: /* LSB PEN X coordinate */ + return (input.analog[0][0] & 0xff); + + case 0x08: /* MSB PEN Y coordinate */ + return (input.analog[0][1] >> 8); + + case 0x0a: /* LSB PEN Y coordinate */ + return (input.analog[0][1] & 0xff); + + case 0x0c: /* PAGE register */ + return pico_page[pico_current]; /* TODO */ + + case 0x10: /* PCM data register */ + return 0x8000; /* TODO */ + + case 0x12: /* PCM control registe */ + return 0x8000; /* TODO */ + + default: + return m68k_read_bus_16(address); + } + + default: /* ROM */ + return *(uint16 *)(rom_readmap[offset] + (address & 0x7ffff)); + } +} + + +unsigned int m68k_read_memory_32(unsigned int address) +{ + /* Split into 2 reads */ + return ((m68k_read_memory_16 (address) << 16) | + (m68k_read_memory_16 ((address+ 2)&0xffffff))); +} + + +void m68k_write_memory_8(unsigned int address, unsigned int value) +{ + int offset = address >> 19; + + switch (m68k_writemap_8[offset]) + { + case VDP: + /* Valid VDP addresses */ + if (((address >> 16) & 0x07) == 0) + { + switch (address & 0xff) + { + case 0x00: /* Data port */ + case 0x01: + case 0x02: + case 0x03: + vdp_data_w(value << 8 | value); + return; + + case 0x04: /* Control port */ + case 0x05: + case 0x06: + case 0x07: + vdp_ctrl_w(value << 8 | value); + return; + + case 0x10: /* Unused */ + case 0x12: + case 0x14: + case 0x16: + m68k_unused_8_w(address, value); + return; + + case 0x11: /* PSG */ + case 0x13: + case 0x15: + case 0x17: + psg_write(0, value); + return; + + case 0x18: /* Unused */ + case 0x19: + case 0x1a: + case 0x1b: + m68k_unused_8_w(address, value); + return; + + case 0x1c: /* Test register */ + case 0x1d: + case 0x1e: + case 0x1f: + vdp_test_w(value << 8 | value); + return; + + default: /* Invalid address */ + m68k_lockup_w_8(address, value); + return; + } + } + + /* Invalid address */ + m68k_lockup_w_8(address, value); + return; + + + case SYSTEM_IO: + { + unsigned int base = address >> 8; + + /* Z80 */ + if (base <= 0xa0ff) + { + /* Writes are ignored when the Z80 hogs the Z-bus */ + if (zbusack) + { + m68k_unused_8_w (address, value); + return; + } + + /* Read data from Z bus */ + switch (base & 0x60) + { + case 0x40: /* YM2612 */ + fm_write(0, address & 3, value); + return; + + case 0x60: + switch (base & 0x7f) + { + case 0x60: /* Bank register */ + gen_bank_w(value & 1); + return; + + case 0x7f: /* VDP */ + m68k_lockup_w_8(address, value); + return; + + default: + m68k_unused_8_w(address, value); + return; + } + + default: /* ZRAM */ + zram[address & 0x1fff] = value; + count_m68k ++; + return; + } + } + + /* CONTROL registers */ + if (base <= 0xa1ff) + { + switch (base & 0xff) + { + case 0x00: /* I/O chip (only gets /LWR) */ + if ((address & 0xe1) == 0x01) io_write((address >> 1) & 0x0f, value); + else m68k_unused_8_w(address, value); + return; + + case 0x11: /* BUSREQ */ + if (address & 1) m68k_unused_8_w(address, value); + else gen_busreq_w(value & 1); + return; + + case 0x12: /* RESET */ + if (address & 1) m68k_unused_8_w(address, value); + else gen_reset_w(value & 1); + return; + + case 0x30: /* TIME */ + if (cart_hw.time_w) cart_hw.time_w(address, value); + else m68k_unused_8_w(address, value); + return; + + case 0x41: /* BOOTROM */ + if (address & 1) + { + if (value & 1) + { + rom_readmap[0] = &cart_rom[0]; + rom_size = genromsize; + } + else + { + rom_readmap[0] = &bios_rom[0]; + rom_size = 0x800; + } + + if (!(config.bios_enabled & 2)) + { + config.bios_enabled |= 2; + memcpy(bios_rom, cart_rom, 0x800); + memset(cart_rom, 0, 0x500000); + } + } + else m68k_unused_8_w (address, value); + return; + + case 0x10: /* MEMORY MODE */ + case 0x20: /* MEGA-CD */ + case 0x40: /* TMSS */ + case 0x44: /* RADICA */ + case 0x50: /* SVP REGISTERS */ + m68k_unused_8_w(address, value); + return; + + default: /* Invalid address */ + m68k_lockup_w_8(address, value); + return; + } + } + + /* Invalid address */ + m68k_lockup_w_8(address, value); + return; + } + + case ROM: + WRITE_BYTE(rom_readmap[offset], address & 0x7ffff, value); + return; + + case SRAM: + if (address <= sram.end) WRITE_BYTE(sram.sram, address - sram.start, value); + else m68k_unused_8_w(address, value); + return; + + case EEPROM: + if ((address == eeprom.type.sda_in_adr) || (address == eeprom.type.scl_adr)) eeprom_write(address, value, 0); + else m68k_unused_8_w(address, value); + return; + + case CART_HW: + cart_hw.regs_w(address, value); + return; + + case UNUSED: + m68k_unused_8_w(address, value); + return; + + case ILLEGAL: + m68k_lockup_w_8(address, value); + return; + + case PICO_HW: + switch (address & 0xff) + { + case 0x19: + case 0x1b: + case 0x1d: + case 0x1f: /* TMSS register */ + return; + + default: + m68k_unused_8_w(address, value); + return; + } + + default: /* WRAM */ + WRITE_BYTE(work_ram, address & 0xffff, value); + return; + } +} + + +void m68k_write_memory_16 (unsigned int address, unsigned int value) +{ + int offset = address >> 19; + + switch (m68k_writemap_16[offset]) + { + case SVP_DRAM: + *(uint16 *)(svp->dram + (address & 0x1fffe)) = value; + if ((address == 0x30fe06) && value) svp->ssp1601.emu_status &= ~SSP_WAIT_30FE06; + if ((address == 0x30fe08) && value) svp->ssp1601.emu_status &= ~SSP_WAIT_30FE08; + return; + + case VDP: + /* Valid VDP addresses */ + if (((address >> 16) & 0x07) == 0) + { + switch (address & 0xfc) + { + case 0x00: /* DATA */ + vdp_data_w(value); + return; + + case 0x04: /* CTRL */ + vdp_ctrl_w(value); + return; + + case 0x10: /* PSG */ + case 0x14: + psg_write(0, value & 0xff); + return; + + case 0x18: /* Unused */ + m68k_unused_16_w(address, value); + return; + + case 0x1c: /* Test register */ + vdp_test_w(value); + return; + + default: /* Invalid address */ + m68k_lockup_w_16 (address, value); + return; + } + } + + /* Invalid address */ + m68k_lockup_w_16 (address, value); + return; + + + case SYSTEM_IO: + { + unsigned int base = address >> 8; + + /* Z80 */ + if (base <= 0xa0ff) + { + /* Writes are ignored when the Z80 hogs the Z-bus */ + if (zbusack) + { + m68k_unused_16_w (address, value); + return; + } + + /* Write into Z80 address space */ + switch (base & 0x60) + { + case 0x40: /* YM2612 */ + fm_write (0, address & 3, value >> 8); + return; + + case 0x60: + switch (base & 0x7f) + { + case 0x60: /* Bank register */ + gen_bank_w ((value >> 8) & 1); + return; + + case 0x7f: /* VDP */ + m68k_lockup_w_16(address, value); + return; + + default: + m68k_unused_16_w(address, value); + return; + } + + default: /* ZRAM */ + zram[address & 0x1fff] = value >> 8; + return; + } + } + + /* CONTROL registers */ + if (base <= 0xa1ff) + { + switch (base & 0xff) + { + case 0x00: /* I/O chip */ + if (address & 0xe0) m68k_unused_16_w (address, value); + else io_write ((address >> 1) & 0x0f, value & 0xff); + return; + + case 0x11: /* BUSREQ */ + gen_busreq_w ((value >> 8) & 1); + return; + + case 0x12: /* RESET */ + gen_reset_w ((value >> 8) & 1); + return; + + case 0x50: /* SVP REGISTERS */ + if (svp && ((address & 0xfd) == 0)) + { + /* just guessing here (Notaz) */ + svp->ssp1601.gr[SSP_XST].h = value; + svp->ssp1601.gr[SSP_PM0].h |= 2; + svp->ssp1601.emu_status &= ~SSP_WAIT_PM0; + return; + } + m68k_unused_16_w(address, value); + return; + + case 0x30: /* TIME */ + if (cart_hw.time_w) + { + cart_hw.time_w(address & 0xfe, value >> 8); + cart_hw.time_w(address, value & 0xff); + } + else m68k_unused_16_w (address, value); + return; + + case 0x41: /* BOOTROM */ + if (value & 1) + { + rom_readmap[0] = &cart_rom[0]; + rom_size = genromsize; + } + else + { + rom_readmap[0] = &bios_rom[0]; + rom_size = 0x800; + } + + if (!(config.bios_enabled & 2)) + { + config.bios_enabled |= 2; + memcpy(bios_rom, cart_rom, 0x800); + memset(cart_rom, 0, 0x500000); + } + return; + + case 0x10: /* MEMORY MODE */ + case 0x20: /* MEGA-CD */ + case 0x40: /* TMSS */ + case 0x44: /* RADICA */ + m68k_unused_16_w (address, value); + return; + + default: /* Unused */ + m68k_lockup_w_16 (address, value); + return; + } + } + + /* Invalid address */ + m68k_lockup_w_16 (address, value); + return; + } + + case ROM: + *(uint16 *)(rom_readmap[offset] + (address & 0x7ffff)) = value; + return; + + case SRAM: + if (address <= sram.end) *(uint16 *)(sram.sram + (address - sram.start)) = value; + else m68k_unused_16_w (address, value); + return; + + case EEPROM: + if ((address == (eeprom.type.sda_in_adr&0xfffffe)) || (address == (eeprom.type.scl_adr&0xfffffe))) + eeprom_write(address, value, 1); + else m68k_unused_16_w (address, value); + return; + + case J_CART: + jcart_write(value); + return; + + case UNUSED: + m68k_unused_16_w (address, value); + return; + + case ILLEGAL: + m68k_lockup_w_16 (address, value); + return; + + case PICO_HW: + switch (address & 0xff) + { + case 0x10: /* PCM data register */ + return; /* TODO */ + + case 0x12: /* PCM control resiter */ + return; /* TODO */ + + case 0x18: + case 0x1a: + case 0x1c: + case 0x1e: /* TMSS register */ + return; + + default: + m68k_unused_16_w(address, value); + return; + } + + default: /* WRAM */ + *(uint16 *)(work_ram + (address & 0xffff)) = value; + return; + } +} + +void m68k_write_memory_32 (unsigned int address, unsigned int value) +{ + /* Split into 2 writes */ + m68k_write_memory_16 (address, value >> 16); + m68k_write_memory_16 ((address+2) & 0xffffff, value & 0xffff); +} diff --git a/source/mem68k.h b/source/mem68k.h index af23e68..d6634e7 100644 --- a/source/mem68k.h +++ b/source/mem68k.h @@ -1,14 +1,51 @@ - -#ifndef _MEM68K_H_ -#define _MEM68K_H_ - -/* Function prototypes */ -unsigned int m68k_read_bus_8 (unsigned int address); -unsigned int m68k_read_bus_16 (unsigned int address); -void m68k_unused_w (unsigned int address, unsigned int value); -void m68k_lockup_w_8 (unsigned int address, unsigned int value); -void m68k_lockup_w_16 (unsigned int address, unsigned int value); -unsigned int m68k_lockup_r_8 (unsigned int address); -unsigned int m68k_lockup_r_16 (unsigned int address); - -#endif /* _MEM68K_H_ */ +/*************************************************************************************** + * Genesis Plus 1.2a + * 68k memory handlers + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#ifndef _MEM68K_H_ +#define _MEM68K_H_ + +enum { + SRAM, + EEPROM, + J_CART, + SVP_DRAM, + SVP_CELL, + CART_HW, + REALTEC_ROM, + VDP, + SYSTEM_IO, + UNUSED, + ILLEGAL, + WRAM, + UMK3_HACK, + PICO_HW, + ROM +}; + +extern uint8 m68k_readmap_8[32]; +extern uint8 m68k_readmap_16[32]; +extern uint8 m68k_writemap_8[32]; +extern uint8 m68k_writemap_16[32]; + + +#endif /* _MEM68K_H_ */ diff --git a/source/membnk.c b/source/membnk.c index 7be9a3e..93e3ab2 100644 --- a/source/membnk.c +++ b/source/membnk.c @@ -1,296 +1,366 @@ -/* - membnk.c -- - Memory handlers Z80 access to the banked V-bus address space. -*/ - -#include "shared.h" - - -void z80_write_banked_memory(unsigned int address, unsigned int data) -{ - switch((address >> 21) & 7) - { - case 0: /* Cartridge ROM */ - case 1: - z80bank_unused_w(address, data); - return; - - case 2: /* Unused */ - case 3: - z80bank_unused_w(address, data); - return; - - case 4: /* Unused (lockup) */ - z80bank_lockup_w(address, data); - return; - - case 5: /* Z80, I/O chip, etc. */ - if(address <= 0xA0FFFF) - { - z80bank_lockup_w(address, data); - return; - } - else - { - switch((address >> 8) & 0xFF) - { - case 0x00: /* I/O chip */ - if(address <= 0xA1001F) io_write((address >> 1) & 0x0F, data); - else z80bank_unused_w(address, data); - return; - - case 0x11: /* /BUSREQ */ - if (address & 1) z80bank_unused_w (address, data); - else gen_busreq_w (data & 1); - return; - - case 0x12: /* /RESET (w) */ - if (address & 1) z80bank_unused_w (address, data); - else gen_reset_w (data & 1); - return; - - case 0x10: /* MEMORY MODE */ - case 0x13: /* TIME */ - case 0x20: /* ? */ - case 0x30: /* ? */ - z80bank_unused_w(address, data); - return; - - default: /* Invalid */ - z80bank_lockup_w(address, data); - return; - } - } - return; - - case 6: /* VDP */ - z80bank_vdp_w(address, data); - return; - - case 7: /* Work RAM */ - WRITE_BYTE(work_ram, address & 0xFFFF, data); - return; - } -} - - -int z80_read_banked_memory(unsigned int address) -{ - switch((address >> 21) & 7) - { - case 0: /* Cartridge ROM */ - case 1: - return READ_BYTE(cart_rom, address); - - case 2: /* Unused */ - case 3: - return z80bank_unused_r(address); - - case 4: /* Unused (lockup) */ - return z80bank_lockup_r(address); - - case 5: /* Z80, I/O chip, etc.*/ - if (address <= 0xA0FFFF) return z80bank_lockup_r (address); - else - { - switch((address >> 8) & 0xFF) - { - case 0x00: /* I/O chip */ - if (address <= 0xA1001F) return io_read((address >> 1) & 0x0F); - else return z80bank_unused_r (address); - break; - - case 0x11: /* /BUSACK from Z80 */ - /* The Z80 can't read this bit (it would be halted - when the bit was zero) so we always return '1'. */ - return 0xFF; - - case 0x10: /* Unused */ - case 0x12: /* Unused */ - case 0x13: /* /TIME region */ - case 0x20: /* Unused */ - case 0x30: /* Unused */ - return z80bank_unused_r(address); - - default: /* Lockup */ - return z80bank_lockup_r(address); - } - } - break; - - case 6: /* VDP */ - return z80bank_vdp_r(address); - - case 7: /* Work RAM - can't be read on some Genesis models (!) */ - return 0xFF; - } - - return (-1); -} - - -void z80bank_vdp_w(int address, int data) -{ - if((address & 0xE700E0) == 0xC00000) - { - switch(address & 0x1F) - { - case 0x00: /* Data port */ - case 0x01: - case 0x02: - case 0x03: - vdp_data_w(data << 8 | data); - return; - - case 0x04: /* Control port */ - case 0x05: - case 0x06: - case 0x07: - vdp_ctrl_w(data << 8 | data); - return; - - case 0x08: /* Lockup (HVC) */ - case 0x09: - case 0x0A: - case 0x0B: - case 0x0C: - case 0x0D: - case 0x0E: - case 0x0F: - z80bank_lockup_w(address, data); - return; - - case 0x10: /* Unused */ - case 0x12: - case 0x14: - case 0x16: - z80bank_unused_w(address, data); - return; - - case 0x11: /* PSG */ - case 0x13: - case 0x15: - case 0x17: - psg_write(1, data); - return; - - case 0x18: /* Unused */ - case 0x19: - case 0x1A: - case 0x1B: - z80bank_unused_w(address, data); - return; - - case 0x1C: /* Test register */ - case 0x1D: - case 0x1E: - case 0x1F: - vdp_test_w(data << 8 | data); - return; - } - } - else - { - /* Invalid VDP address */ - z80bank_lockup_w(address, data); - return; - } -} - - -int z80bank_vdp_r(int address) -{ - if((address & 0xE700E0) == 0xC00000) - { - switch(address & 0x1F) - { - case 0x00: /* Data */ - case 0x02: - return (vdp_data_r() >> 8) & 0xFF; - - case 0x01: /* Data */ - case 0x03: - return vdp_data_r() & 0xFF; - - case 0x04: /* Control */ - case 0x06: - return (0xFC | (vdp_ctrl_r() >> 8)) & 0xFF; - - case 0x05: /* Control */ - case 0x07: - return vdp_ctrl_r() & 0xFF; - - case 0x08: /* HVC */ - case 0x0A: - case 0x0C: - case 0x0E: - return (vdp_hvc_r() >> 8) & 0xFF; - - case 0x09: /* HVC */ - case 0x0B: - case 0x0D: - case 0x0F: - return vdp_hvc_r() & 0xFF; - - case 0x10: /* Lockup */ - case 0x11: - case 0x12: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - return z80bank_lockup_r(address); - - case 0x18: /* Unused */ - case 0x19: - case 0x1A: - case 0x1B: - case 0x1C: - case 0x1D: - case 0x1E: - case 0x1F: - return (z80bank_unused_r(address) | 0xFF); - } - } - else - { - /* Invalid VDP address */ - return z80bank_lockup_r(address); - } - - return 0xFF; -} - - - - -/* - Handlers for access to unused addresses and those which make the - machine lock up. -*/ -void z80bank_unused_w(int address, int data) -{ - error("Z80 bank unused write %06X = %02X (%04X)\n", address, data, z80_get_reg(Z80_PC)); -} - -int z80bank_unused_r(int address) -{ - error("Z80 bank unused read %06X (%04X)\n", address, z80_get_reg(Z80_PC)); - return (address & 1) ? 0x00 : 0xFF; -} - -void z80bank_lockup_w(int address, int data) -{ - error("Z80 bank lockup write %06X = %02X (%04X)\n", address, data, z80_get_reg(Z80_PC)); - gen_running = 0; - z80_end_timeslice(); -} - -int z80bank_lockup_r(int address) -{ - error("Z80 bank lockup read %06X (%04X)\n", address, z80_get_reg(Z80_PC)); - gen_running = 0; - z80_end_timeslice(); - return 0xFF; -} +/*************************************************************************************** + * Genesis Plus 1.2a + * M68k Bank access from Z80 + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ +#include "shared.h" + +/* + Handlers for access to unused addresses and those which make the + machine lock up. +*/ +static inline void z80bank_unused_w(unsigned int address, unsigned int data) +{ +#ifdef LOGERROR + error("Z80 bank unused write %06X = %02X\n", address, data); +#endif +} + +static inline unsigned int z80bank_unused_r(unsigned int address) +{ +#ifdef LOGERROR + error("Z80 bank unused read %06X\n", address); +#endif + return (address & 1) ? 0x00 : 0xFF; +} + +static inline void z80bank_lockup_w(unsigned int address, unsigned int data) +{ +#ifdef LOGERROR + error("Z80 bank lockup write %06X = %02X\n", address, data); +#endif + gen_running = config.force_dtack; +} + +static inline unsigned int z80bank_lockup_r(unsigned int address) +{ +#ifdef LOGERROR + error("Z80 bank lockup read %06X\n", address); +#endif + gen_running = config.force_dtack; + return 0xFF; +} + +/* + Z80 memory handlers +*/ +void z80_write_banked_memory (unsigned int address, unsigned int data) +{ + int offset = address >> 19; + + switch (m68k_writemap_8[offset]) + { + case VDP: + /* Valid VDP addresses */ + if (((address >> 16) & 0x07) == 0) + { + switch (address & 0xff) + { + case 0x00: /* Data port */ + case 0x01: + case 0x02: + case 0x03: + vdp_data_w(data << 8 | data); + return; + + case 0x04: /* Control port */ + case 0x05: + case 0x06: + case 0x07: + vdp_ctrl_w(data << 8 | data); + return; + + case 0x10: /* Unused */ + case 0x12: + case 0x14: + case 0x16: + z80bank_unused_w(address, data); + return; + + case 0x11: /* PSG */ + case 0x13: + case 0x15: + case 0x17: + psg_write(0, data); + return; + + case 0x18: /* Unused */ + case 0x19: + case 0x1a: + case 0x1b: + z80bank_unused_w(address, data); + return; + + case 0x1c: /* Test register */ + case 0x1d: + case 0x1e: + case 0x1f: + vdp_test_w(data << 8 | data); + return; + + default: /* Invalid address */ + z80bank_lockup_w(address, data); + return; + } + } + + /* Invalid address */ + z80bank_lockup_w(address, data); + return; + + + case SYSTEM_IO: + { + unsigned int base = address >> 8; + + /* Z80 (access prohibited) */ + if (base <= 0xa0ff) + { + z80bank_lockup_w(address, data); + return; + } + + /* CONTROL registers */ + if (base <= 0xa1ff) + { + switch (base & 0xff) + { + case 0x00: /* I/O chip (only gets /LWR) */ + if ((address & 0xe1) == 0x01) io_write((address >> 1) & 0x0f, data); + else z80bank_unused_w(address, data); + return; + + case 0x11: /* BUSREQ */ + if (address & 1) z80bank_unused_w(address, data); + else gen_busreq_w(data & 1); + return; + + case 0x12: /* RESET */ + if (address & 1) z80bank_unused_w(address, data); + else gen_reset_w(data & 1); + return; + + case 0x30: /* TIME */ + if (cart_hw.time_w) return cart_hw.time_w(address, data); + else z80bank_unused_w(address, data); + return; + + case 0x41: /* BOOTROM */ + if (address & 1) + { + if (data & 1) + { + rom_readmap[0] = &cart_rom[0]; + rom_size = genromsize; + } + else + { + rom_readmap[0] = &bios_rom[0]; + rom_size = 0x800; + } + + if (!(config.bios_enabled & 2)) + { + config.bios_enabled |= 2; + memcpy(bios_rom, cart_rom, 0x800); + memset(cart_rom, 0, 0x500000); + } + } + else z80bank_unused_w (address, data); + return; + + case 0x10: /* MEMORY MODE */ + case 0x20: /* MEGA-CD */ + case 0x40: /* TMSS */ + case 0x44: /* RADICA */ + case 0x50: /* SVP REGISTERS */ + z80bank_unused_w(address, data); + return; + + default: /* Invalid address */ + z80bank_lockup_w(address, data); + return; + } + } + + /* Invalid address */ + z80bank_lockup_w(address, data); + return; + } + + case ROM: + WRITE_BYTE(rom_readmap[offset], address & 0x7ffff, data); + return; + + case SRAM: + if (address <= sram.end) WRITE_BYTE(sram.sram, address - sram.start, data); + else z80bank_unused_w(address, data); + return; + + case EEPROM: + if ((address == eeprom.type.sda_in_adr) || (address == eeprom.type.scl_adr)) eeprom_write(address, data); + else z80bank_unused_w(address, data); + return; + + case CART_HW: + cart_hw.regs_w(address, data); + return; + + case UNUSED: + z80bank_unused_w(address, data); + return; + + case ILLEGAL: + z80bank_lockup_w(address, data); + return; + + default: /* WRAM */ + z80bank_unused_w(address, data); + return; + } +} + +unsigned int z80_read_banked_memory(unsigned int address) +{ + int offset = address >> 19; + + switch (m68k_readmap_8[offset]) + { + case WRAM: /* NOTE: can't be read on some Genesis models (!)*/ + return z80bank_unused_r(address) | 0xff; + + case SYSTEM_IO: + { + unsigned int base = address >> 8; + + /* Z80 (access prohibited) */ + if (base <= 0xa0ff) return z80bank_lockup_r(address); + + /* I/O & CONTROL registers */ + if (base <= 0xa1ff) + { + switch (base & 0xff) + { + case 0x00: /* I/O chip */ + if (address & 0xe0) return z80bank_unused_r(address); + return (io_read((address >> 1) & 0x0f)); + + case 0x11: /* BUSACK */ + if (address & 0x01) return 0xff; + else return (zbusack | 0xfe); + + case 0x30: /* TIME */ + if (cart_hw.time_r) return cart_hw.time_r(address); + else z80bank_unused_r(address); + + case 0x10: /* MEMORY MODE */ + case 0x12: /* RESET */ + case 0x20: /* MEGA-CD */ + case 0x40: /* TMSS */ + case 0x41: /* BOOTROM */ + case 0x44: /* RADICA */ + case 0x50: /* SVP REGISTERS */ + return z80bank_unused_r(address); + + default: /* Invalid address */ + return z80bank_lockup_r(address); + } + } + + /* Invalid address */ + return z80bank_lockup_r(address); + } + + case VDP: + /* Valid VDP addresses */ + if (((address >> 16) & 0x07) == 0) + { + switch (address & 0xff) + { + case 0x00: /* DATA */ + case 0x02: + return (vdp_data_r() >> 8); + + case 0x01: /* DATA */ + case 0x03: + return (vdp_data_r() & 0xff); + + case 0x04: /* CTRL */ + case 0x06: + return (0xfc | ((vdp_ctrl_r() >> 8) & 3)); + + case 0x05: /* CTRL */ + case 0x07: + return (vdp_ctrl_r() & 0xff); + + case 0x08: /* HVC */ + case 0x0a: + case 0x0c: + case 0x0e: + return (vdp_hvc_r() >> 8); + + case 0x09: /* HVC */ + case 0x0b: + case 0x0d: + case 0x0f: + return (vdp_hvc_r() & 0xff); + + case 0x18: /* Unused */ + case 0x19: + case 0x1a: + case 0x1b: + case 0x1c: + case 0x1d: + case 0x1e: + case 0x1f: + return (z80bank_unused_r(address) | 0xff); + + default: /* Invalid address */ + return z80bank_lockup_r(address); + } + } + + /* Invalid address */ + return (z80bank_lockup_r (address)); + + case SRAM: + if (address <= sram.end) return READ_BYTE(sram.sram, address - sram.start); + return READ_BYTE(rom_readmap[offset], address & 0x7ffff); + + case EEPROM: + if (address == eeprom.type.sda_out_adr) return eeprom_read(address); + return READ_BYTE(rom_readmap[offset], address & 0x7ffff); + + case CART_HW: + return cart_hw.regs_r(address); + + case UNUSED: + return z80bank_unused_r(address); + + case ILLEGAL: + return z80bank_lockup_r(address); + + case UMK3_HACK: + return READ_BYTE(&cart_rom[offset<<19], address & 0x7ffff); + + default: /* ROM */ + return READ_BYTE(rom_readmap[offset], address & 0x7ffff); + } +} diff --git a/source/membnk.h b/source/membnk.h index 70e8e38..332a3b1 100644 --- a/source/membnk.h +++ b/source/membnk.h @@ -1,15 +1,30 @@ - -#ifndef _MEMBNK_H_ -#define _MEMBNK_H_ - -/* Function prototypes */ -void z80_write_banked_memory (unsigned int address, unsigned int data); -int z80_read_banked_memory (unsigned int address); -void z80bank_vdp_w (int address, int data); -int z80bank_vdp_r (int address); -void z80bank_unused_w (int address, int data); -int z80bank_unused_r (int address); -void z80bank_lockup_w (int address, int data); -int z80bank_lockup_r (int address); - -#endif /* _MEMBNK_H_ */ +/*************************************************************************************** + * Genesis Plus 1.2a + * M68k Bank access from Z80 + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ +#ifndef _MEMBNK_H_ +#define _MEMBNK_H_ + +/* Function prototypes */ +extern void z80_write_banked_memory(unsigned int address, unsigned int data); +extern unsigned int z80_read_banked_memory(unsigned int address); + +#endif /* _MEMBNK_H_ */ diff --git a/source/memvdp.c b/source/memvdp.c index a85fe35..1880d84 100644 --- a/source/memvdp.c +++ b/source/memvdp.c @@ -1,48 +1,94 @@ -/* - memvdp.c -- - Memory handlers for when the VDP reads the V-bus during DMA. -*/ - -#include "shared.h" - -unsigned int vdp_dma_r(unsigned int address) -{ - switch((address >> 21) & 7) - { - case 0: /* Cartridge ROM */ - case 1: - return *(uint16 *)(cart_rom + address); - - case 2: /* Unused */ - case 3: - return 0xFF00; - - case 4: /* Work RAM */ - case 6: - case 7: - return *(uint16 *)(work_ram + (address & 0xffff)); - - case 5: /* Z80 area and I/O chip */ - /* Z80 area always returns $FFFF */ - if(address <= 0xA0FFFF) - { - /* Return $FFFF only when the Z80 isn't hogging the Z-bus. - (e.g. Z80 isn't reset and 68000 has the bus) */ - return (zbusack == 0) ? 0xFFFF : *(uint16 *)(work_ram + (address & 0xffff)); - } - - /* The I/O chip and work RAM try to drive the data bus which - results in both values being combined in random ways when read. - We return the I/O chip values which seem to have precedence, */ - else if (address <= 0xA1001F) - { - uint8 temp = io_read((address >> 1) & 0x0F); - return (temp << 8 | temp); - } - /* All remaining locations access work RAM */ - else return *(uint16 *)(work_ram + (address & 0xffff)); - } - - return -1; -} - +/*************************************************************************************** + * Genesis Plus 1.2a + * 68k memory from VDP handler + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#include "shared.h" + +unsigned int vdp_dma_r(unsigned int address) +{ + int offset = address >> 19; + + switch (m68k_readmap_16[offset]) + { + case ROM: + if (svp) address -= 2; + return *(uint16 *)(rom_readmap[offset] + (address & 0x7ffff)); + + case UMK3_HACK: + return *(uint16 *)(&cart_rom[offset << 19] + (address & 0x7ffff)); + + case SVP_DRAM: + address -= 2; + return *(uint16 *)(svp->dram + (address & 0x1fffe)); + + case SVP_CELL: + address -= 2; + switch (address >> 16) + { + case 0x39: + address >>= 1; + address = (address & 0x7001) | ((address & 0x3e) << 6) | ((address & 0xfc0) >> 5); + return ((uint16 *)svp->dram)[address]; + + case 0x3A: + address >>= 1; + address = (address & 0x7801) | ((address & 0x1e) << 6) | ((address & 0x7e0) >> 4); + return ((uint16 *)svp->dram)[address]; + + default: + return 0xffff; + } + + case SYSTEM_IO: + /* Z80 area */ + /* Return $FFFF only when the Z80 isn't hogging the Z-bus. + (e.g. Z80 isn't reset and 68000 has the bus) */ + if (address <= 0xa0ffff) return (zbusack ? *(uint16 *)(work_ram + (address & 0xffff)) : 0xffff); + + /* The I/O chip and work RAM try to drive the data bus which + results in both values being combined in random ways when read. + We return the I/O chip values which seem to have precedence, */ + if (address <= 0xa1001f) + { + int temp = io_read((address >> 1) & 0x0f); + return (temp << 8 | temp); + } + + /* All remaining locations access work RAM */ + return *(uint16 *)(work_ram + (address & 0xffff)); + + case SRAM: + if (address <= sram.end) return *(uint16 *)(sram.sram + (address - sram.start)); + return *(uint16 *)(rom_readmap[address >> 19] + (address & 0x7ffff)); + + case EEPROM: + if (address == eeprom.type.sda_out_adr) return eeprom_read(address); + return *(uint16 *)(rom_readmap[address >> 19] + (address & 0x7ffff)); + + case J_CART: + if (address == eeprom.type.sda_out_adr) return eeprom_read(address); /* some games also have EEPROM mapped here */ + else return jcart_read(); + + default: + return *(uint16 *)(work_ram + (address & 0xffff)); + } +} diff --git a/source/memvdp.h b/source/memvdp.h index 365301f..5e6b237 100644 --- a/source/memvdp.h +++ b/source/memvdp.h @@ -1,8 +1,29 @@ - -#ifndef _MEMVDP_H_ -#define _MEMVDP_H_ - -/* Function prototypes */ -unsigned int vdp_dma_r (unsigned int address); - -#endif /* _MEMVDP_H_ */ +/*************************************************************************************** + * Genesis Plus 1.2a + * 68k memory from VDP handler + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ +#ifndef _MEMVDP_H_ +#define _MEMVDP_H_ + +/* Function prototypes */ +extern unsigned int vdp_dma_r(unsigned int address); + +#endif /* _MEMVDP_H_ */ diff --git a/source/memz80.c b/source/memz80.c index 00dd5ce..f081344 100644 --- a/source/memz80.c +++ b/source/memz80.c @@ -1,246 +1,263 @@ -/* - memz80.c -- - Memory handlers for Z80 memory and port access, and the Z80 to - VDP interface. -*/ - -#define LOG_PORT 0 /* 1= Log Z80 I/O port accesses */ - -#include "shared.h" - - -unsigned int cpu_readmem16(unsigned int address) -{ - switch((address >> 13) & 7) - { - case 0: /* Work RAM */ - case 1: - return zram[address & 0x1FFF]; - - case 2: /* YM2612 */ - return fm_read(address & 3); - - case 3: /* VDP */ - if ((address & 0xFF00) == 0x7F00) return z80_vdp_r (address); - return 0xFF; - - default: /* V-bus bank */ - return z80_read_banked_memory(zbank | (address & 0x7FFF)); - } - - return 0xFF; -} - - -void cpu_writemem16(unsigned int address, unsigned int data) -{ - switch((address >> 13) & 7) - { - case 0: /* Work RAM */ - case 1: - zram[address & 0x1FFF] = data; - return; - - case 2: /* YM2612 */ - fm_write(1, address & 3, data); - return; - - case 3: /* Bank register and VDP */ - switch(address & 0xFF00) - { - case 0x6000: - gen_bank_w(data & 1); - return; - - case 0x7F00: - z80_vdp_w(address, data); - return; - - default: - z80_unused_w(address, data); - return; - } - return; - - default: /* V-bus bank */ - z80_write_banked_memory(zbank | (address & 0x7FFF), data); - return; - } -} - - -int z80_vdp_r(int address) -{ - switch(address & 0xFF) - { - case 0x00: /* VDP data port */ - case 0x02: - return (vdp_data_r() >> 8) & 0xFF; - - case 0x01: /* VDP data port */ - case 0x03: - return (vdp_data_r() & 0xFF); - - case 0x04: /* VDP control port */ - case 0x06: - return (0xFF | ((vdp_ctrl_r() >> 8) & 3)); - - case 0x05: /* VDP control port */ - case 0x07: - return (vdp_ctrl_r() & 0xFF); - - case 0x08: /* HV counter */ - case 0x0A: - case 0x0C: - case 0x0E: - return (vdp_hvc_r() >> 8) & 0xFF; - - case 0x09: /* HV counter */ - case 0x0B: - case 0x0D: - case 0x0F: - return (vdp_hvc_r() & 0xFF); - - case 0x10: /* Unused (PSG) */ - case 0x11: - case 0x12: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - return z80_lockup_r(address); - - case 0x18: /* Unused */ - case 0x19: - case 0x1A: - case 0x1B: - return z80_unused_r(address); - - case 0x1C: /* Unused (test register) */ - case 0x1D: - case 0x1E: - case 0x1F: - return z80_unused_r(address); - - default: /* Invalid VDP addresses */ - return z80_lockup_r(address); - } - - return 0xFF; -} - - -void z80_vdp_w(int address, int data) -{ - switch(address & 0xFF) - { - case 0x00: /* VDP data port */ - case 0x01: - case 0x02: - case 0x03: - vdp_data_w(data << 8 | data); - return; - - case 0x04: /* VDP control port */ - case 0x05: - case 0x06: - case 0x07: - vdp_ctrl_w(data << 8 | data); - return; - - case 0x08: /* Unused (HV counter) */ - case 0x09: - case 0x0A: - case 0x0B: - case 0x0C: - case 0x0D: - case 0x0E: - case 0x0F: - z80_lockup_w(address, data); - return; - - case 0x11: /* PSG */ - case 0x13: - case 0x15: - case 0x17: - psg_write(1, data); - return; - - case 0x10: /* Unused */ - case 0x12: - case 0x14: - case 0x16: - case 0x18: - case 0x19: - case 0x1A: - case 0x1B: - z80_unused_w(address, data); - return; - - case 0x1C: /* Test register */ - case 0x1D: - case 0x1E: - case 0x1F: - vdp_test_w(data << 8 | data); - return; - - default: /* Invalid VDP addresses */ - z80_lockup_w(address, data); - return; - } -} - - -/* - Port handlers. Ports are unused when not in Mark III compatability mode. - - Games that access ports anyway: - - Thunder Force IV reads port $BF in it's interrupt handler. -*/ - -unsigned int cpu_readport16(unsigned int port) -{ -#if LOG_PORT - error("Z80 read port %04X (%04X)\n", port, z80_get_reg(Z80_PC)); -#endif - return 0xFF; -} - -void cpu_writeport16(unsigned int port, unsigned int data) -{ -#if LOG_PORT - error("Z80 write %02X to port %04X (%04X)\n", data, port, z80_get_reg(Z80_PC)); -#endif -} - - -/* - Handlers for access to unused addresses and those which make the - machine lock up. -*/ -void z80_unused_w(int address, int data) -{ - error("Z80 unused write %04X = %02X (%04X)\n", address, data, z80_get_reg(Z80_PC)); -} - -int z80_unused_r(int address) -{ - error("Z80 unused read %04X (%04X)\n", address, z80_get_reg(Z80_PC)); - return 0xFF; -} - -void z80_lockup_w(int address, int data) -{ - error("Z80 lockup write %04X = %02X (%04X)\n", address, data, z80_get_reg(Z80_PC)); - gen_running = 0; - z80_end_timeslice(); -} - -int z80_lockup_r(int address) -{ - error("Z80 lockup read %04X (%04X)\n", address, z80_get_reg(Z80_PC)); - gen_running = 0; - z80_end_timeslice(); - return 0xFF; -} +/*************************************************************************************** + * Genesis Plus 1.2a + * Z80 memory handler + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ +#include "shared.h" +#define LOG_PORT 0 /* 1= Log Z80 I/O port accesses */ + +/* + Handlers for access to unused addresses and those which make the + machine lock up. +*/ +static inline void z80_unused_w(unsigned int address, unsigned int data) +{ +#ifdef LOGERROR + error("Z80 unused write %04X = %02X\n", address, data); +#endif +} + +static inline unsigned int z80_unused_r(unsigned int address) +{ +#ifdef LOGERROR + error("Z80 unused read %04X\n", address); +#endif + return 0xff; +} + +static inline void z80_lockup_w(unsigned int address, unsigned int data) +{ +#ifdef LOGERROR + error("Z80 lockup write %04X = %02X\n", address, data); +#endif + gen_running = config.force_dtack; +} + +static inline unsigned int z80_lockup_r(unsigned int address) +{ +#ifdef LOGERROR + error("Z80 lockup read %04X\n", address); +#endif + gen_running = config.force_dtack; + return 0xff; +} +/* + VDP access +*/ +static inline unsigned int z80_vdp_r(unsigned int address) +{ + switch (address & 0xff) + { + case 0x00: /* VDP data port */ + case 0x02: + return (vdp_data_r() >> 8) & 0xff; + + case 0x01: /* VDP data port */ + case 0x03: + return (vdp_data_r() & 0xff); + + case 0x04: /* VDP control port */ + case 0x06: + return (0xfc | ((vdp_ctrl_r() >> 8) & 3)); + + case 0x05: /* VDP control port */ + case 0x07: + return (vdp_ctrl_r() & 0xff); + + case 0x08: /* HV counter */ + case 0x0a: + case 0x0c: + case 0x0e: + return (vdp_hvc_r() >> 8) & 0xff; + + case 0x09: /* HV counter */ + case 0x0b: + case 0x0d: + case 0x0f: + return (vdp_hvc_r() & 0xff); + + case 0x10: /* Unused (PSG) */ + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + return z80_lockup_r (address); + + case 0x18: /* Unused */ + case 0x19: + case 0x1a: + case 0x1b: + return z80_unused_r(address); + + case 0x1c: /* Unused (test register) */ + case 0x1d: + case 0x1e: + case 0x1f: + return z80_unused_r(address); + + default: /* Invalid VDP addresses */ + return z80_lockup_r(address); + } +} + +static inline void z80_vdp_w(unsigned int address, unsigned int data) +{ + switch (address & 0xff) + { + case 0x00: /* VDP data port */ + case 0x01: + case 0x02: + case 0x03: + vdp_data_w(data << 8 | data); + return; + + case 0x04: /* VDP control port */ + case 0x05: + case 0x06: + case 0x07: + vdp_ctrl_w(data << 8 | data); + return; + + case 0x08: /* Unused (HV counter) */ + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + z80_lockup_w(address, data); + return; + + case 0x11: /* PSG */ + case 0x13: + case 0x15: + case 0x17: + psg_write(1, data); + return; + + case 0x10: /* Unused */ + case 0x12: + case 0x14: + case 0x16: + case 0x18: + case 0x19: + case 0x1a: + case 0x1b: + z80_unused_w(address, data); + return; + + case 0x1c: /* Test register */ + case 0x1d: + case 0x1e: + case 0x1f: + vdp_test_w(data << 8 | data); + return; + + default: /* Invalid VDP addresses */ + z80_lockup_w(address, data); + return; + } +} + +/* + Z80 memory handlers +*/ +unsigned int cpu_readmem16(unsigned int address) +{ + switch((address >> 13) & 7) + { + case 0: /* Work RAM */ + case 1: + return zram[address & 0x1fff]; + + case 2: /* YM2612 */ + return fm_read(1, address & 3); + + case 3: /* VDP */ + if ((address & 0xff00) == 0x7f00) return z80_vdp_r (address); + return (z80_unused_r(address) | 0xff); + + default: /* V-bus bank */ + return z80_read_banked_memory(zbank | (address & 0x7fff)); + } +} + + +void cpu_writemem16(unsigned int address, unsigned int data) +{ + switch((address >> 13) & 7) + { + case 0: /* Work RAM */ + case 1: + zram[address & 0x1fff] = data; + return; + + case 2: /* YM2612 */ + fm_write(1, address & 3, data); + return; + + case 3: /* Bank register and VDP */ + switch(address & 0xff00) + { + case 0x6000: + gen_bank_w(data & 1); + return; + + case 0x7f00: + z80_vdp_w(address, data); + return; + + default: + z80_unused_w(address, data); + return; + } + return; + + default: /* V-bus bank */ + z80_write_banked_memory(zbank | (address & 0x7fff), data); + return; + } +} + +/* + Port handlers. Ports are unused when not in Mark III compatability mode. + + Games that access ports anyway: + - Thunder Force IV reads port $BF in it's interrupt handler. +*/ + +unsigned int cpu_readport16(unsigned int port) +{ +#if LOG_PORT + error("Z80 read port %04X\n", port); +#endif + return 0xFF; +} + +void cpu_writeport16(unsigned int port, unsigned int data) +{ +#if LOG_PORT + error("Z80 write %02X to port %04X\n", data, port); +#endif +} diff --git a/source/memz80.h b/source/memz80.h index 5c3ad0a..ff18629 100644 --- a/source/memz80.h +++ b/source/memz80.h @@ -1,17 +1,26 @@ - -#ifndef _MEMZ80_H_ -#define _MEMZ80_H_ - -/* Function prototypes */ -unsigned int cpu_readmem16 (unsigned int address); -void cpu_writemem16 (unsigned int address, unsigned int data); -unsigned int cpu_readport16 (unsigned int port); -void cpu_writeport16 (unsigned int port, unsigned int data); -void z80_unused_w (int address, int data); -int z80_unused_r (int address); -void z80_lockup_w (int address, int data); -int z80_lockup_r (int address); -int z80_vdp_r (int address); -void z80_vdp_w (int address, int data); - -#endif /* _MEMZ80_H_ */ +/*************************************************************************************** + * Genesis Plus 1.2a + * Z80 memory handler + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ +#ifndef _MEMZ80_H_ +#define _MEMZ80_H_ + +#endif /* _MEMZ80_H_ */ diff --git a/source/ngc/config.c b/source/ngc/config.c new file mode 100644 index 0000000..625c1ad --- /dev/null +++ b/source/ngc/config.c @@ -0,0 +1,68 @@ +#include "shared.h" +#include "font.h" + +#include +#include + +t_config config; + +void config_save() +{ + /* first check if directory exist */ + DIR_ITER *dir = diropen("/genplus"); + if (dir == NULL) mkdir("/genplus",S_IRWXU); + else dirclose(dir); + + /* open file for writing */ + FILE *fp = fopen("/genplus/genplus.ini", "wb"); + if (fp == NULL) return; + + /* save options */ + fwrite(&config, sizeof(config), 1, fp); + + fclose(fp); +} + +void config_load() +{ + /* open file for writing */ + FILE *fp = fopen("/genplus/genplus.ini", "rb"); + if (fp == NULL) return; + + /* read file */ + fread(&config, sizeof(config), 1, fp); + + fclose(fp); +} + +void set_config_defaults(void) +{ + /* sound options */ + config.psg_preamp = 1.5; + config.fm_preamp = 1.0; + config.boost = 1; + config.hq_fm = 1; + config.fm_core = 0; + config.ssg_enabled = 0; + + /* system options */ + config.freeze_auto = -1; + config.sram_auto = -1; + config.region_detect = 0; + config.force_dtack = 0; + config.bios_enabled = 0; + + /* display options */ + config.xshift = 0; + config.yshift = 0; + config.xscale = 0; + config.yscale = 0; + config.aspect = 1; + config.overscan = 1; + config.render = (vmode->viTVMode == VI_TVMODE_NTSC_PROG) ? 2 : 0; + + /* controllers options */ + ogc_input__set_defaults(); + config.crosshair = 0; +} + diff --git a/source/ngc/config.h b/source/ngc/config.h new file mode 100644 index 0000000..2f63e2a --- /dev/null +++ b/source/ngc/config.h @@ -0,0 +1,42 @@ + +#ifndef _CONFIG_H_ +#define _CONFIG_H_ + +/**************************************************************************** + * Config Option + * + ****************************************************************************/ +typedef struct +{ + double psg_preamp; + double fm_preamp; + uint8 boost; + uint8 hq_fm; + uint8 fm_core; + uint8 ssg_enabled; + int8 sram_auto; + int8 freeze_auto; + uint8 region_detect; + uint8 force_dtack; + uint8 bios_enabled; + int16 xshift; + int16 yshift; + int16 xscale; + int16 yscale; + uint8 tv_mode; + uint8 aspect; + uint8 overscan; + uint8 render; + uint16 pad_keymap[4][MAX_KEYS]; + uint32 wpad_keymap[4*3][MAX_KEYS]; + t_input_config input[MAX_DEVICES]; + uint8 crosshair; +} t_config; + +extern t_config config; +extern void config_save(); +extern void config_load(); +extern void set_config_defaults(void); + +#endif /* _CONFIG_H_ */ + diff --git a/source/ngc/gcaram.c b/source/ngc/gcaram.c index b29c1a0..680b8bf 100644 --- a/source/ngc/gcaram.c +++ b/source/ngc/gcaram.c @@ -1,85 +1,66 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - ***************************************************************************/ -#include "shared.h" - -#define ARAMSTART 0x8000 - -/** - * Nintendo GameCube ARAM Wrapper for libOGC aram.c - * - * This is an often overlooked area of ~16Mb extra RAM - * It's use in Genesis Plus is to shadow the ROM. - * Actually, only SSF2TNC needs shadowing, but it's always - * Good to know :) - */ - -#define ARAM_READ 1 -#define ARAM_WRITE 0 - -/** - * StartARAM - * This simply sets up the call to internal libOGC. - * Passing NULL for array list, and 0 items to allocate. - * Required so libOGC knows to handle any interrupts etc. - */ -void -StartARAM () -{ - AR_Init (NULL, 0); -} - -/** - * ARAMPut - * - * Move data from MAIN memory to ARAM - */ -void -ARAMPut (char *src, char *dst, int len) -{ - DCFlushRange (src, len); - AR_StartDMA( ARAM_WRITE, (u32)src, (u32)dst, len); - while (AR_GetDMAStatus()); -} - -/** - * ARAMFetch - * - * This function will move data from ARAM to MAIN memory - */ -void -ARAMFetch (char *dst, char *src, int len) -{ - DCInvalidateRange(dst, len); - AR_StartDMA( ARAM_READ, (u32) dst, (u32) src, len); - while (AR_GetDMAStatus()); -} - -/** - * ShadowROM - * Copy the rom from cart_rom into ARAM - * NB: libOGC appears to use the first 0x4000 bytes. - * As there's plenty left, all ARAM addresses are 0x8000 based. - * Here, the ROM is simply copied in one swift movement :) - */ -void -ShadowROM () -{ - ARAMPut (cart_rom, (void *) ARAMSTART, genromsize); -} +/** + * Nintendo GameCube ARAM Wrapper for libOGC aram.c + * + * This is an often overlooked area of ~16Mb extra RAM + * It's use in Genesis Plus is to shadow the ROM. + * Actually, only SSF2TNC needs shadowing, but it's always + * Good to know :) + */ +#include "shared.h" + +#define ARAMSTART 0x8000 + + +#define ARAM_READ 1 +#define ARAM_WRITE 0 + +/** + * StartARAM + * This simply sets up the call to internal libOGC. + * Passing NULL for array list, and 0 items to allocate. + * Required so libOGC knows to handle any interrupts etc. + */ +void +StartARAM () +{ + AR_Init (NULL, 0); +} + +/** + * ARAMPut + * + * Move data from MAIN memory to ARAM + */ +void +ARAMPut (char *src, char *dst, int len) +{ + DCFlushRange (src, len); + AR_StartDMA( ARAM_WRITE, (u32)src, (u32)dst, len); + while (AR_GetDMAStatus()); +} + +/** + * ARAMFetch + * + * This function will move data from ARAM to MAIN memory + */ +void +ARAMFetch (char *dst, char *src, int len) +{ + DCInvalidateRange(dst, len); + AR_StartDMA( ARAM_READ, (u32) dst, (u32) src, len); + while (AR_GetDMAStatus()); +} + +/** + * ShadowROM + * Copy the rom from cart_rom into ARAM + * NB: libOGC appears to use the first 0x4000 bytes. + * As there's plenty left, all ARAM addresses are 0x8000 based. + * Here, the ROM is simply copied in one swift movement :) + */ +void +ShadowROM () +{ + ARAMPut ((char *)cart_rom, (void *) ARAMSTART, genromsize); +} diff --git a/source/ngc/gcaram.h b/source/ngc/gcaram.h index b4cd8c0..277f8b6 100644 --- a/source/ngc/gcaram.h +++ b/source/ngc/gcaram.h @@ -1,25 +1,14 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - ***************************************************************************/ - -extern void StartARAM (); -void ShadowROM (); -void ARAMFetch (char *src, char *dst, int len); -void ARAMPut (char *src, char *dst, int len); - +/** + * Nintendo GameCube ARAM Wrapper for libOGC aram.c + * + * This is an often overlooked area of ~16Mb extra RAM + * It's use in Genesis Plus is to shadow the ROM. + * Actually, only SSF2TNC needs shadowing, but it's always + * Good to know :) + */ + +extern void StartARAM (); +void ShadowROM (); +void ARAMFetch (char *src, char *dst, int len); +void ARAMPut (char *src, char *dst, int len); + diff --git a/source/ngc/gui/confjoy.c b/source/ngc/gui/confjoy.c deleted file mode 100644 index 01fb9c3..0000000 --- a/source/ngc/gui/confjoy.c +++ /dev/null @@ -1,208 +0,0 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * NGC - Joypad Configuration - ***************************************************************************/ -#include - -extern int domenu (char items[][20], int maxitems); -extern unsigned short gcpadmap[]; -extern int menu; -extern char menutitle[]; -extern int padcal; -extern void reloadrom(); - -int configpadcount = 11; -char padmenu[11][20] = { - {"Genesis A - B"}, - {"Genesis B - A"}, - {"Genesis C - X"}, - {"Genesis X - TL"}, - {"Genesis Y - Y"}, - {"Genesis Z - TR"}, - {"Analog - 70"}, - {"Type - 3BUTTONS"}, - {"PortA - GAMEPAD"}, - {"PortB - GAMEPAD"}, - {" Exit Config "} -}; - -uint8 mpads[6] = {0, 1, 2, 3, 4, 5 }; /*** Default Mapping ***/ -uint8 sys_type[2] = {0,0}; -uint8 old_sys_type[2] = {0,0}; - -/**************************************************************************** - * UpdatePadMaps - ****************************************************************************/ -void UpdatePadMaps (uint8 padvalue, int padnum) -{ - padmenu[padnum][15] = ' '; - padmenu[padnum][16] = ' '; - switch (padvalue) - { - case 0: - gcpadmap[padnum] = PAD_BUTTON_B; - padmenu[padnum][16] = 'B'; - break; - - case 1: - gcpadmap[padnum] = PAD_BUTTON_A; - padmenu[padnum][16] = 'A'; - break; - - case 2: - gcpadmap[padnum] = PAD_BUTTON_X; - padmenu[padnum][16] = 'X'; - break; - - case 3: - gcpadmap[padnum] = PAD_TRIGGER_R; - padmenu[padnum][15] = 'T'; - padmenu[padnum][16] = 'R'; - break; - - case 4: - gcpadmap[padnum] = PAD_BUTTON_Y; - padmenu[padnum][16] = 'Y'; - break; - - case 5: - gcpadmap[padnum] = PAD_TRIGGER_L; - padmenu[padnum][15] = 'T'; - padmenu[padnum][16] = 'L'; - break; - } -} - -/**************************************************************************** - * ConfigureJoypads - ****************************************************************************/ -void ConfigureJoypads () -{ - int ret; - int quit = 0; - int prevmenu = menu; - - strcpy (menutitle, ""); - - if (pad_type) sprintf (padmenu[7], "Type - 6BUTTONS"); - else sprintf (padmenu[7], "Type - 3BUTTONS"); - - if (input.system[1] == SYSTEM_MENACER) sprintf (padmenu[8], "PortA - NONE"); - else if (sys_type[0] == 0) sprintf (padmenu[8], "PortA - GAMEPAD"); - else if (sys_type[0] == 1) sprintf (padmenu[8], "PortA - MULTITAP"); - else if (sys_type[0] == 2) sprintf (padmenu[8], "PortA - NONE"); - - if (input.system[1] == SYSTEM_MENACER) sprintf (padmenu[9], "PortB - MENACER"); - else if (sys_type[1] == 0) sprintf (padmenu[9], "PortB - GAMEPAD"); - else if (sys_type[1] == 1) sprintf (padmenu[9], "PortB - MULTITAP"); - else if (sys_type[1] == 2) sprintf (padmenu[9], "PortB - NONE"); - - menu = 0; - while (quit == 0) - { - ret = domenu (&padmenu[0], configpadcount); - switch (ret) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - mpads[ret]++; - if (mpads[ret] > 5) mpads[ret] = 0; - UpdatePadMaps (mpads[ret], ret); - break; - - case 6: /*** Pad calibrate analog ***/ - case -8: - if (ret>0) padcal += 2; - else padcal -= 2; - if (padcal > 90) padcal = 0; - if (padcal < 0) padcal = 90; - sprintf (padmenu[6], "Analog - %02d", padcal); - break; - - case 7: - pad_type ^= 1; - if (pad_type) sprintf (padmenu[7], "Type - 6BUTTONS"); - else sprintf (padmenu[7], "Type - 3BUTTONS"); - system_reset(); - break; - - case 8: - if (input.system[1] == SYSTEM_MENACER) break; - sys_type[0] ++; - if (sys_type[0] > 2) sys_type[0] = 0; - - if (sys_type[0] == 0) - { - input.system[0] = SYSTEM_GAMEPAD; - sprintf (padmenu[8], "PortA - GAMEPAD"); - } - else if (sys_type[0] == 1) - { - input.system[0] = SYSTEM_TEAMPLAYER; - sprintf (padmenu[8], "PortA - MULTITAP"); - } - else if (sys_type[0] == 2) - { - input.system[0] = NO_SYSTEM; - sprintf (padmenu[8], "PortA - NONE"); - } - break; - - case 9: - if (input.system[1] == SYSTEM_MENACER) break; - sys_type[1] ++; - if (sys_type[1] > 2) sys_type[1] = 0; - - if (sys_type[1] == 0) - { - input.system[1] = SYSTEM_GAMEPAD; - sprintf (padmenu[9], "PortB - GAMEPAD"); - } - else if (sys_type[1] == 1) - { - input.system[1] = SYSTEM_TEAMPLAYER; - sprintf (padmenu[9], "PortB - MULTITAP"); - } - else if (sys_type[1] == 2) - { - input.system[1] = NO_SYSTEM; - sprintf (padmenu[9], "PortB - NONE"); - } - break; - - case 10: - case -1: - if ((old_sys_type[0] != sys_type[0]) || (old_sys_type[1] != sys_type[1])) - { - old_sys_type[0] = sys_type[0]; - old_sys_type[1] = sys_type[1]; - system_reset(); - } - quit = 1; - break; - } - } - - menu = prevmenu; -} diff --git a/source/ngc/gui/dkpro.h b/source/ngc/gui/dkpro.h index fb9cf82..2da9321 100644 --- a/source/ngc/gui/dkpro.h +++ b/source/ngc/gui/dkpro.h @@ -1,877 +1,877 @@ -/******************************************************************* - * Image File : /public/dkpro.bmp - * Width : 218 - * Height : 65 - * - * This header contains a compressed Zip image. - * Use zlib1.2.3 uncompress function to restore. - *******************************************************************/ - -#define dkpro_RAW 28340 -#define dkpro_COMPRESSED 6887 -#define dkpro_WIDTH 218 -#define dkpro_HEIGHT 65 - -unsigned char dkpro[6887] = { - 0x78, 0xda, 0xed, 0x9c, 0x67, 0x70, 0x54, 0x57, 0x96, 0xc7, 0xf9, 0xb8, - 0xb5, 0x55, 0xbb, 0x55, - 0x53, 0xb5, 0xb5, 0xb3, 0x9e, 0x31, 0xc6, 0x98, 0x20, 0x31, 0xf6, 0x38, - 0x7b, 0xc6, 0x33, 0x0e, - 0xe3, 0x34, 0x60, 0x03, 0x36, 0xc9, 0x80, 0x49, 0xb6, 0x41, 0x42, 0x59, - 0x42, 0x39, 0x20, 0x75, - 0xbf, 0xd3, 0x92, 0x90, 0x84, 0x32, 0x41, 0x02, 0x11, 0xd4, 0x48, 0xe4, - 0x60, 0x72, 0x0e, 0x22, - 0x98, 0x8c, 0x8d, 0x04, 0x26, 0x83, 0x31, 0xe0, 0xec, 0x71, 0x06, 0xe7, - 0xa0, 0xfd, 0xdd, 0xdb, - 0xdd, 0xaf, 0x5f, 0xb7, 0xba, 0x07, 0x30, 0xc6, 0xf6, 0x87, 0xd6, 0xbf, - 0x1e, 0xb4, 0x6e, 0x38, - 0xf7, 0xe4, 0x7b, 0xee, 0x7b, 0x4f, 0xdd, 0x4e, 0xda, 0x5d, 0x1d, 0xaa, - 0xc3, 0x52, 0xba, 0x38, - 0x3b, 0x46, 0x75, 0x70, 0xb6, 0x8f, 0xbd, 0xb1, 0xfe, 0xc6, 0xf8, 0x3f, - 0x3a, 0x6f, 0x8c, 0x6f, - 0xef, 0xbc, 0x29, 0xb6, 0xa3, 0xb3, 0x53, 0x74, 0x57, 0x67, 0xb7, 0x88, - 0x76, 0x12, 0xc2, 0x6f, - 0x06, 0x55, 0xe1, 0xd8, 0xea, 0xe6, 0xa8, 0x3f, 0x38, 0xc3, 0x62, 0xfa, - 0xd5, 0x94, 0xc4, 0x2f, - 0x28, 0xdd, 0x91, 0x71, 0x74, 0xdc, 0xf9, 0xdc, 0x0b, 0x85, 0xa7, 0x72, - 0x0f, 0x8c, 0x5f, 0x95, - 0x59, 0x37, 0x29, 0x32, 0xf1, 0xfe, 0xfa, 0x3f, 0xc4, 0xb4, 0x77, 0x76, - 0x8a, 0x09, 0x9b, 0x15, - 0xb2, 0xdd, 0xaf, 0x6f, 0xaf, 0xb0, 0x94, 0x9b, 0x89, 0xa3, 0xbe, 0x93, - 0x9d, 0x09, 0xef, 0x39, - 0x5a, 0xed, 0xad, 0x12, 0x0c, 0x3f, 0xca, 0x8e, 0xca, 0x84, 0x94, 0xdb, - 0x9d, 0xed, 0xa3, 0xba, - 0x84, 0xec, 0xf6, 0x6b, 0xda, 0x2b, 0xf5, 0x26, 0x67, 0x58, 0x74, 0xe5, - 0xf8, 0x7f, 0x65, 0x6a, - 0xab, 0x18, 0xdf, 0x49, 0x50, 0x18, 0x3f, 0xb8, 0x6c, 0x37, 0x6e, 0x5d, - 0xee, 0xd3, 0x33, 0x6e, - 0x88, 0xeb, 0xec, 0xec, 0x16, 0x19, 0xd2, 0xe0, 0x2f, 0x9f, 0x0f, 0x3b, - 0xd4, 0xdf, 0x1b, 0x35, - 0xaf, 0xa8, 0x75, 0x6c, 0x2b, 0xf6, 0xf8, 0xc6, 0xf8, 0x46, 0x3c, 0xf8, - 0x9e, 0x98, 0xf2, 0x46, - 0xd7, 0x0f, 0xf2, 0xad, 0x78, 0xfb, 0xbe, 0x33, 0x68, 0xcd, 0x3f, 0x69, - 0x1b, 0x36, 0xfd, 0xa6, - 0xd8, 0x2e, 0xd5, 0xed, 0x52, 0x43, 0x9a, 0xfc, 0x85, 0x50, 0xdd, 0x2d, - 0xa5, 0xb3, 0xb3, 0x43, - 0x74, 0x69, 0x49, 0x6b, 0x76, 0xab, 0xf1, 0xb5, 0x7c, 0xa5, 0xa1, 0x6c, - 0xe5, 0xb2, 0xd3, 0x27, - 0x72, 0x52, 0xf6, 0xcb, 0x36, 0x69, 0x92, 0x5d, 0x72, 0x48, 0xde, 0x96, - 0x1f, 0xdc, 0xd6, 0xfb, - 0x56, 0xdc, 0x63, 0x0d, 0x6c, 0x5a, 0xb0, 0x3b, 0xef, 0xfe, 0xfa, 0x9b, - 0xa2, 0xc3, 0xab, 0xda, - 0xa5, 0x84, 0x34, 0x7a, 0xfd, 0xd1, 0xcd, 0xd9, 0x61, 0x74, 0x8f, 0xca, - 0x8f, 0x53, 0x5b, 0x8d, - 0xaf, 0xe4, 0x4b, 0x8d, 0x6f, 0xb0, 0xc9, 0xb7, 0x72, 0x5c, 0xe6, 0x48, - 0x86, 0x3c, 0x2b, 0x4f, - 0x4b, 0x5f, 0xe9, 0x2f, 0x03, 0x40, 0x7f, 0xe9, 0x27, 0x7d, 0xf8, 0x3d, - 0x5a, 0x2a, 0x65, 0x27, - 0xb6, 0x6c, 0xc5, 0xae, 0xae, 0x19, 0x5f, 0x2a, 0xbb, 0x95, 0x8c, 0xcf, - 0xea, 0xe8, 0x0c, 0x8b, - 0x0a, 0x69, 0xf4, 0x7a, 0xc7, 0x58, 0x58, 0xca, 0x1f, 0xa7, 0x94, 0x24, - 0xfd, 0x68, 0xff, 0x46, - 0x2e, 0x6a, 0x7c, 0x85, 0x25, 0x3e, 0x90, 0x06, 0x19, 0x8d, 0xb5, 0x06, - 0xcb, 0x70, 0x79, 0x41, - 0x5e, 0x6c, 0x83, 0x11, 0x32, 0x84, 0xde, 0x61, 0x32, 0x4e, 0x5e, 0xd5, - 0xd6, 0xbd, 0xa4, 0x67, - 0x5e, 0x22, 0x4f, 0x1e, 0x9a, 0x78, 0x4b, 0xca, 0xef, 0x9d, 0x37, 0x24, - 0xdd, 0xe0, 0xbc, 0x21, - 0x31, 0x74, 0x5d, 0xdb, 0xd5, 0xa1, 0xaa, 0x5d, 0x7a, 0x20, 0x9b, 0x85, - 0xcd, 0xea, 0x34, 0x7a, - 0x4d, 0x61, 0x6b, 0xee, 0xe7, 0xc6, 0x67, 0xf2, 0x99, 0x7c, 0x4e, 0xdc, - 0x9c, 0x93, 0x72, 0xe2, - 0x69, 0x08, 0x96, 0x19, 0x75, 0x19, 0x8c, 0xc4, 0x76, 0x03, 0x24, 0x81, - 0xac, 0xf9, 0x9d, 0x7c, - 0x21, 0x9f, 0x69, 0x7c, 0x65, 0x04, 0xaf, 0x34, 0x43, 0xb8, 0x3a, 0xac, - 0x99, 0xdc, 0x21, 0xb9, - 0x6d, 0xdd, 0xd1, 0x35, 0xb5, 0xc3, 0xc4, 0xe6, 0x94, 0xef, 0xed, 0x9f, - 0x88, 0xc2, 0x25, 0x62, - 0xac, 0x51, 0x86, 0x62, 0x89, 0xc8, 0xab, 0xc0, 0x48, 0x79, 0x4e, 0xc6, - 0xca, 0x19, 0xec, 0xf6, - 0xa9, 0x7c, 0x12, 0xc2, 0xcf, 0x05, 0xea, 0x8a, 0x39, 0x35, 0x1d, 0x92, - 0xda, 0xc6, 0x58, 0x97, - 0xc8, 0x23, 0xf2, 0x95, 0xfd, 0x43, 0x51, 0xf8, 0x42, 0x8e, 0x92, 0x0f, - 0x87, 0x73, 0x45, 0x5d, - 0x35, 0x46, 0x92, 0x45, 0x17, 0x90, 0x1d, 0x3f, 0x96, 0x0f, 0x43, 0xf8, - 0x79, 0x60, 0x7c, 0x21, - 0x8d, 0x35, 0x37, 0x27, 0xf9, 0xd7, 0xf6, 0xed, 0x27, 0xee, 0x4e, 0xbd, - 0x64, 0x7f, 0x5f, 0xde, - 0x67, 0xff, 0xfa, 0x5a, 0x56, 0x90, 0x0d, 0x47, 0x4b, 0xec, 0x4f, 0x44, - 0x8c, 0x3c, 0x2f, 0x42, - 0xa4, 0xaa, 0x5a, 0x32, 0x84, 0x6b, 0xc3, 0x87, 0x58, 0xe4, 0x7d, 0xe3, - 0x73, 0x69, 0xf0, 0xb3, - 0x99, 0xaa, 0x15, 0xe7, 0x17, 0x7c, 0x99, 0xf7, 0xae, 0xbc, 0x2b, 0xef, - 0x11, 0x8b, 0x33, 0x89, - 0xb0, 0x38, 0x89, 0xbf, 0x26, 0x44, 0x63, 0x37, 0xb5, 0xcb, 0x85, 0x70, - 0x2d, 0x18, 0x28, 0x47, - 0x88, 0xa1, 0x77, 0x8d, 0x4f, 0xc5, 0xe9, 0x67, 0xb3, 0x9b, 0xa7, 0x66, - 0xc4, 0x7d, 0x61, 0x7f, - 0xdb, 0xf1, 0x16, 0xe7, 0xad, 0xcf, 0x64, 0xaa, 0x44, 0x48, 0xa2, 0x24, - 0x5d, 0x33, 0x12, 0x43, - 0xb8, 0x66, 0x8c, 0x94, 0x63, 0xc4, 0xd1, 0x5b, 0xc6, 0x47, 0x52, 0x6f, - 0xb5, 0x59, 0x75, 0x97, - 0xd4, 0xbf, 0x95, 0x5f, 0x4c, 0xbf, 0x60, 0x9c, 0x97, 0xf3, 0xd8, 0x74, - 0x16, 0x95, 0x44, 0x4a, - 0x08, 0xbf, 0x11, 0x44, 0xc9, 0x6b, 0xf2, 0x96, 0x9c, 0x37, 0x3e, 0x90, - 0xe9, 0x35, 0x1d, 0x4d, - 0x9b, 0x85, 0x3b, 0x3b, 0x8e, 0xde, 0xe6, 0x78, 0xdb, 0x7e, 0x56, 0xce, - 0x62, 0xd1, 0xd5, 0xec, - 0x46, 0x69, 0x57, 0x81, 0x74, 0x13, 0x69, 0xd7, 0x1d, 0xe9, 0x57, 0xb9, - 0x5a, 0xaa, 0xbe, 0x52, - 0xaf, 0x61, 0x95, 0xf4, 0x5f, 0x54, 0xbe, 0x40, 0x88, 0x91, 0x43, 0x44, - 0xd2, 0x59, 0xe3, 0x5d, - 0x99, 0x66, 0xb1, 0xd9, 0x2d, 0x75, 0xa9, 0x71, 0x1f, 0xd8, 0x4f, 0x3b, - 0x4e, 0xcb, 0x1b, 0xd2, - 0xcc, 0xf9, 0x2a, 0x53, 0xb2, 0xae, 0x10, 0x99, 0x3e, 0x92, 0xa4, 0x4b, - 0xc6, 0x15, 0xcf, 0xbc, - 0x7a, 0x64, 0xfa, 0x69, 0x2d, 0xfd, 0xdf, 0xf2, 0x99, 0x89, 0xa5, 0xd4, - 0x8e, 0xea, 0xaa, 0x63, - 0xa3, 0xf1, 0xc3, 0x64, 0x66, 0x5c, 0xfd, 0x2a, 0x69, 0x7e, 0xf2, 0x65, - 0x5e, 0x47, 0x09, 0x03, - 0x23, 0x41, 0x0e, 0x12, 0x4b, 0xa7, 0x8d, 0x37, 0x65, 0xaa, 0xc7, 0x66, - 0xd4, 0x8b, 0xb7, 0x54, - 0x9d, 0x4d, 0x3f, 0x65, 0x9c, 0x90, 0x93, 0xf4, 0x8d, 0x83, 0xab, 0xb1, - 0x57, 0x88, 0x2c, 0x19, - 0x23, 0x2f, 0xc8, 0x30, 0xce, 0xdb, 0x0a, 0xc3, 0xa9, 0x33, 0xd3, 0x25, - 0xfb, 0x8a, 0x67, 0x5f, - 0x1d, 0x72, 0xd0, 0x57, 0x2c, 0x27, 0xc5, 0xa1, 0xe6, 0x6a, 0xa3, 0x69, - 0xc9, 0x09, 0x3a, 0x3e, - 0x93, 0x9d, 0x40, 0x5d, 0xb1, 0x54, 0x52, 0xb1, 0x58, 0x2f, 0x8d, 0x2c, - 0x93, 0xa6, 0xc7, 0xe7, - 0xc0, 0xa3, 0xb2, 0x4d, 0x86, 0x86, 0xb2, 0x81, 0x97, 0xe7, 0x6c, 0x2c, - 0xfd, 0xa2, 0x29, 0x91, - 0x15, 0x43, 0x59, 0xf1, 0x79, 0xf6, 0x0c, 0x65, 0xfb, 0x8c, 0xeb, 0x26, - 0x65, 0x20, 0x24, 0xcb, - 0x2b, 0x72, 0x5a, 0x4e, 0xb0, 0x6f, 0xd5, 0xd6, 0xba, 0x6c, 0xd6, 0x6d, - 0x56, 0xc7, 0x48, 0x5b, - 0xd1, 0xf9, 0x9c, 0x23, 0x54, 0x27, 0xa7, 0x39, 0x53, 0x65, 0x88, 0xed, - 0x8a, 0xa1, 0xfc, 0x6e, - 0xbf, 0x6c, 0x91, 0xcd, 0x1a, 0x4d, 0xf2, 0x2a, 0x3a, 0xcd, 0x11, 0xfb, - 0x55, 0x50, 0xb8, 0x72, - 0xe4, 0xa2, 0x77, 0xa7, 0xec, 0x34, 0x57, 0xdb, 0x2e, 0x6b, 0xa9, 0x93, - 0xc6, 0x06, 0x1d, 0x9f, - 0x49, 0x74, 0xf9, 0xde, 0x45, 0xa8, 0x46, 0xe3, 0x36, 0xb8, 0xcb, 0xc1, - 0xd3, 0x46, 0x70, 0xee, - 0x1f, 0xa4, 0x31, 0x84, 0x3d, 0x3e, 0x03, 0xea, 0x36, 0xdd, 0x97, 0xc9, - 0x2a, 0x07, 0x90, 0x64, - 0x73, 0x1b, 0x34, 0xc9, 0x4a, 0x99, 0x27, 0xe5, 0xd8, 0x7d, 0x04, 0x67, - 0xcf, 0x04, 0x2c, 0x9d, - 0x7b, 0x5d, 0xe4, 0x0c, 0xa4, 0xe5, 0xfd, 0x72, 0x5c, 0x8e, 0x18, 0x67, - 0x64, 0xb2, 0x3b, 0xce, - 0xc2, 0x9d, 0x5d, 0x22, 0x0f, 0x18, 0x47, 0x8c, 0x43, 0x72, 0x98, 0xbd, - 0x6e, 0xac, 0x18, 0x72, - 0xa5, 0x3f, 0x06, 0x3e, 0x99, 0xe2, 0xa7, 0x97, 0xdb, 0xd0, 0xc8, 0xf5, - 0xf9, 0xb1, 0xa1, 0xdb, - 0x26, 0x9f, 0xb5, 0xde, 0x94, 0x87, 0xd0, 0x72, 0xb0, 0x9f, 0x4c, 0xa2, - 0xe2, 0x0b, 0xf9, 0xc1, - 0x7c, 0xbe, 0xd7, 0x0a, 0xb7, 0x23, 0x34, 0xd7, 0x69, 0x52, 0x88, 0x77, - 0x36, 0xbb, 0x71, 0x48, - 0x5a, 0x88, 0x44, 0x97, 0xdc, 0x06, 0xd6, 0x7b, 0xfe, 0xb2, 0x77, 0x90, - 0xbe, 0xc6, 0xaa, 0xd1, - 0xc4, 0x62, 0x16, 0x3c, 0xfd, 0x12, 0x3f, 0x59, 0xb2, 0x07, 0xcb, 0x1c, - 0x32, 0x4e, 0xca, 0xc4, - 0x9a, 0x8e, 0x89, 0xca, 0x66, 0x9d, 0xa7, 0x45, 0xc4, 0xbe, 0x6e, 0x6f, - 0x76, 0x34, 0x13, 0x67, - 0x0d, 0x70, 0x5d, 0x70, 0x85, 0x28, 0xe4, 0x4a, 0xc3, 0x2b, 0x5b, 0x3d, - 0xf7, 0xf1, 0x41, 0xab, - 0xfc, 0x51, 0xf2, 0xe8, 0x29, 0xbc, 0x62, 0x2a, 0x57, 0xbe, 0x9a, 0x90, - 0xb3, 0x56, 0xc9, 0x8f, - 0xe6, 0x5a, 0xdf, 0xc9, 0x51, 0xb9, 0x5b, 0xf2, 0x03, 0xae, 0xa5, 0xda, - 0x72, 0xb0, 0xd0, 0xa7, - 0xe8, 0xd7, 0xcb, 0x9b, 0xca, 0xe3, 0xaa, 0x27, 0x85, 0x59, 0xea, 0xf9, - 0x83, 0x0b, 0xad, 0x9c, - 0xfb, 0x9f, 0xc0, 0x66, 0x8a, 0xeb, 0x7c, 0xf4, 0x33, 0xd8, 0x47, 0xa2, - 0x40, 0xf8, 0x5a, 0x3f, - 0x7b, 0x9a, 0x43, 0x8c, 0x8e, 0x15, 0xc7, 0xcf, 0x2e, 0x69, 0x5b, 0xe4, - 0xc9, 0x6e, 0xfc, 0xaa, - 0xd9, 0x38, 0x26, 0xd5, 0x6e, 0x9b, 0xdd, 0x34, 0x71, 0x69, 0x6a, 0x8b, - 0x71, 0x80, 0x9c, 0xb9, - 0x5f, 0x8a, 0xd8, 0xcd, 0x8a, 0x2e, 0x8b, 0x62, 0xa0, 0xfe, 0x1d, 0xa7, - 0x33, 0x49, 0xab, 0x7c, - 0x6e, 0xa2, 0x55, 0xda, 0xe3, 0xf9, 0x81, 0x66, 0x78, 0xe7, 0xfd, 0x34, - 0x14, 0xc3, 0xfb, 0x48, - 0x59, 0x21, 0xdf, 0x9a, 0x6b, 0x7d, 0x45, 0x5e, 0xb8, 0x87, 0xd6, 0x60, - 0x34, 0xf3, 0xc8, 0x9c, - 0x1f, 0x11, 0x69, 0x17, 0xdd, 0x50, 0x36, 0x8b, 0xd0, 0x12, 0xa6, 0xd0, - 0xe7, 0xe5, 0xfa, 0x12, - 0x67, 0x9b, 0xfb, 0x89, 0x98, 0x22, 0xdd, 0x97, 0x43, 0xae, 0xb4, 0x4a, - 0x14, 0x1c, 0xad, 0x64, - 0xea, 0x61, 0x78, 0xd2, 0xb8, 0x9f, 0x20, 0x4b, 0xb1, 0x45, 0x2b, 0x97, - 0x87, 0x21, 0x3b, 0xd8, - 0x75, 0x0e, 0x18, 0x87, 0xa5, 0xb2, 0x16, 0x9b, 0x55, 0x87, 0xa5, 0xdc, - 0x56, 0x71, 0x32, 0x75, - 0xaf, 0xec, 0x25, 0xde, 0x97, 0xb2, 0x7e, 0x69, 0x50, 0x94, 0x81, 0x52, - 0x19, 0x2f, 0x25, 0x7a, - 0xad, 0x12, 0x3e, 0x95, 0x92, 0xd1, 0x93, 0xd0, 0xa2, 0xf7, 0x9e, 0x58, - 0xab, 0x74, 0x44, 0x8b, - 0xae, 0x91, 0xbe, 0x33, 0xc6, 0xb9, 0x65, 0x73, 0xcd, 0xf3, 0x8c, 0x08, - 0xbe, 0x8e, 0xff, 0x88, - 0x32, 0x68, 0x44, 0xc1, 0xe1, 0x25, 0x73, 0xad, 0xcf, 0x90, 0xe3, 0x7e, - 0xe8, 0x05, 0xa3, 0x95, - 0x0f, 0x6f, 0xff, 0x72, 0x3f, 0x13, 0x72, 0xd9, 0x4c, 0xd5, 0x91, 0x6a, - 0x6c, 0x06, 0x36, 0xfb, - 0xc6, 0xa4, 0xf3, 0x09, 0x67, 0x9f, 0x07, 0xd0, 0xbd, 0x8b, 0x8a, 0x8d, - 0x4a, 0xe3, 0xfb, 0x2b, - 0xbc, 0x03, 0xf8, 0x23, 0xd6, 0xcf, 0x80, 0x83, 0xc0, 0x72, 0x28, 0xb9, - 0x95, 0xb4, 0xe3, 0x03, - 0x68, 0xa3, 0xc8, 0xad, 0x8f, 0x62, 0xb7, 0x36, 0x4a, 0xff, 0x8d, 0x3e, - 0x4a, 0x89, 0xff, 0x6d, - 0xb2, 0x4f, 0xf6, 0x1a, 0xcd, 0x52, 0xae, 0x6a, 0x90, 0xea, 0xce, 0xa9, - 0x11, 0x25, 0xcd, 0x59, - 0x3b, 0xd9, 0xdb, 0xf7, 0x4b, 0x0d, 0x3b, 0x6c, 0x45, 0x10, 0x54, 0x72, - 0x95, 0xb3, 0x82, 0x50, - 0x31, 0x25, 0xe3, 0xb1, 0x69, 0xd8, 0xab, 0x10, 0xaf, 0x4c, 0x42, 0x2b, - 0xef, 0x9a, 0xf8, 0x5e, - 0x6e, 0x81, 0x97, 0x4a, 0x0d, 0x35, 0xab, 0x4c, 0x7b, 0x49, 0x26, 0xe3, - 0xe3, 0x75, 0xed, 0x36, - 0x86, 0xdc, 0x63, 0xc0, 0x69, 0x99, 0x9b, 0x66, 0x39, 0x1c, 0x15, 0x61, - 0xe5, 0x7c, 0x33, 0xa7, - 0x95, 0x68, 0x1e, 0x5c, 0xab, 0x95, 0x40, 0xcb, 0xd3, 0x33, 0x8e, 0xbe, - 0x18, 0x59, 0x2c, 0x1f, - 0x9b, 0x6b, 0x7d, 0x88, 0x9f, 0xfd, 0x4d, 0x53, 0x2a, 0x63, 0x64, 0xa1, - 0x39, 0x32, 0x9f, 0xb1, - 0xc5, 0x9a, 0xd7, 0x6c, 0xe9, 0x21, 0x37, 0x49, 0x07, 0x8d, 0x9b, 0xc1, - 0x7d, 0xd8, 0x4a, 0x71, - 0xa4, 0xb8, 0xb8, 0x68, 0xd2, 0x79, 0x5f, 0xce, 0xc9, 0x5f, 0x90, 0x64, - 0x9c, 0x5e, 0x5b, 0xd8, - 0xcf, 0xbe, 0xb4, 0x48, 0xa4, 0x70, 0xc9, 0x8d, 0x4f, 0xf1, 0x01, 0x6b, - 0xfb, 0x47, 0xb2, 0x4b, - 0x06, 0x6a, 0x69, 0x8a, 0xcd, 0xf5, 0x0b, 0xa1, 0x5f, 0xaa, 0xa5, 0xb2, - 0xe9, 0x3a, 0x3d, 0x9f, - 0xcf, 0x15, 0xa6, 0x36, 0x4a, 0xdc, 0xfa, 0x8b, 0xd7, 0x77, 0x64, 0x93, - 0xa8, 0x2e, 0x6c, 0x3a, - 0x4e, 0xca, 0x4d, 0x8d, 0x05, 0x42, 0x09, 0x75, 0xd7, 0x2e, 0xd9, 0x49, - 0x2e, 0x2c, 0xad, 0xb9, - 0x25, 0x91, 0x9a, 0x71, 0x74, 0x4d, 0xc1, 0xee, 0xbc, 0xed, 0x54, 0x61, - 0x5b, 0x99, 0x39, 0x31, - 0x28, 0x26, 0x40, 0x73, 0x1c, 0xd2, 0xa6, 0xf0, 0x79, 0x31, 0x15, 0x54, - 0x23, 0xdc, 0xc4, 0xea, - 0x3a, 0xfa, 0x23, 0x64, 0xf6, 0xe0, 0x92, 0x74, 0x41, 0x57, 0xae, 0xf1, - 0x55, 0x7c, 0xca, 0x65, - 0x44, 0x3a, 0xf5, 0xda, 0x22, 0xd9, 0x48, 0xfd, 0xb0, 0x89, 0x99, 0x55, - 0x50, 0x88, 0x25, 0x7f, - 0x96, 0xd2, 0xaa, 0xc6, 0x14, 0xf3, 0x39, 0x85, 0x2a, 0x4c, 0x21, 0x09, - 0xaf, 0x55, 0x3d, 0x13, - 0x98, 0x5f, 0x05, 0xa7, 0x79, 0xcc, 0x4d, 0xd4, 0x3d, 0x63, 0xb0, 0xbb, - 0xb0, 0xef, 0x2f, 0x40, - 0x53, 0x9e, 0xb5, 0xde, 0x26, 0x63, 0x3c, 0xc4, 0xb8, 0x4a, 0xf4, 0x94, - 0x61, 0xd2, 0x48, 0xe4, - 0xd3, 0x58, 0xb4, 0x53, 0xae, 0xf5, 0x1f, 0x47, 0x75, 0x38, 0x50, 0x9e, - 0x05, 0x83, 0xb0, 0x45, - 0xaa, 0xf6, 0xef, 0x5c, 0x72, 0x6c, 0x16, 0xda, 0xf7, 0xd0, 0xb9, 0xc0, - 0x09, 0xe7, 0x2f, 0xd0, - 0xce, 0x40, 0xa2, 0x32, 0x68, 0x8d, 0xc4, 0x2f, 0xce, 0x59, 0xf0, 0x31, - 0x19, 0x55, 0xdd, 0x8d, - 0x48, 0x86, 0xaf, 0x3d, 0x96, 0x79, 0x0a, 0x5f, 0xca, 0x3f, 0xb1, 0x93, - 0xb2, 0x4f, 0xaa, 0x7b, - 0xfd, 0x64, 0x5d, 0x83, 0xd9, 0xb0, 0x4a, 0xae, 0x4c, 0x41, 0xee, 0x32, - 0x56, 0x74, 0xc9, 0x53, - 0x8a, 0xb7, 0xc6, 0xe1, 0xeb, 0x65, 0x48, 0xb1, 0x01, 0x2b, 0x6c, 0x95, - 0x97, 0x64, 0x2a, 0x72, - 0xc5, 0x60, 0xc5, 0x12, 0xfa, 0x27, 0x04, 0xd5, 0x7d, 0x05, 0x9a, 0xdb, - 0x21, 0xdb, 0x8d, 0xbd, - 0x52, 0x8c, 0xcd, 0xc2, 0x67, 0x75, 0x89, 0x58, 0x23, 0x5b, 0xed, 0x8a, - 0xc2, 0x32, 0x66, 0xd5, - 0x04, 0xc5, 0x04, 0x38, 0x8b, 0xa6, 0xd6, 0x3d, 0x8f, 0xae, 0x2e, 0xf0, - 0xef, 0x9b, 0x68, 0xaf, - 0x45, 0xd7, 0xcc, 0xef, 0x51, 0x83, 0x79, 0xf0, 0xb1, 0x84, 0xa1, 0x2b, - 0xd7, 0xf8, 0xf1, 0xe8, - 0xcf, 0x4e, 0x2c, 0xbc, 0xa9, 0x67, 0x78, 0xf4, 0xa3, 0x3e, 0x6f, 0xd5, - 0xf7, 0x26, 0xca, 0xe0, - 0xa6, 0x1a, 0xc9, 0x8e, 0xa0, 0xb3, 0xe3, 0x6e, 0xbc, 0x41, 0x6b, 0x1e, - 0xed, 0x35, 0xf4, 0xe4, - 0xc9, 0x5c, 0x79, 0xdd, 0xec, 0x39, 0x2f, 0x93, 0xc8, 0x5a, 0xf3, 0x98, - 0xed, 0x59, 0xeb, 0x1c, - 0x72, 0x3f, 0xcc, 0xb8, 0x12, 0x7c, 0x60, 0xbb, 0x9c, 0x32, 0x47, 0x9e, - 0x24, 0x72, 0xd4, 0xee, - 0x57, 0x01, 0x85, 0x63, 0x8c, 0x3b, 0xe5, 0xc6, 0x05, 0xc6, 0xaa, 0x13, - 0x65, 0x33, 0x23, 0x4e, - 0xca, 0x19, 0x0b, 0xd7, 0x67, 0x98, 0x75, 0x02, 0x7a, 0x55, 0x68, 0xb5, - 0x08, 0x0b, 0x59, 0x25, - 0x3a, 0xcd, 0xce, 0xd5, 0x0e, 0xdf, 0x78, 0x4c, 0x1e, 0x91, 0xbb, 0xe4, - 0x77, 0xe8, 0xf9, 0xbc, - 0xa5, 0xef, 0x7d, 0xe4, 0xcf, 0x46, 0xef, 0xfb, 0x2d, 0xeb, 0xbf, 0x23, - 0x3d, 0xb1, 0xcd, 0x7e, - 0xfe, 0x7f, 0x0b, 0x7f, 0xce, 0xa3, 0x77, 0x32, 0x12, 0x95, 0xe9, 0xfb, - 0x28, 0x4d, 0x70, 0xf1, - 0x8e, 0xa9, 0x8d, 0xf3, 0xa2, 0xee, 0xed, 0x1e, 0x84, 0xdb, 0x18, 0xae, - 0x6a, 0xc6, 0x05, 0xd3, - 0xfd, 0x7a, 0x66, 0x6e, 0x31, 0x76, 0xca, 0x38, 0x6c, 0x16, 0xe6, 0xbc, - 0x3b, 0x62, 0x9b, 0x7d, - 0x23, 0x51, 0xb0, 0x59, 0x66, 0xe3, 0x17, 0x53, 0x03, 0xa0, 0x8e, 0xab, - 0x16, 0x2f, 0x89, 0x23, - 0x7f, 0xbe, 0x4e, 0xad, 0x76, 0xc4, 0xc4, 0x71, 0xd6, 0x2c, 0x83, 0x73, - 0x6f, 0xcb, 0x3b, 0xf2, - 0x27, 0x24, 0xaf, 0x63, 0x1d, 0x65, 0xb1, 0x25, 0x70, 0x75, 0xdc, 0xd2, - 0xeb, 0xc1, 0x09, 0xe6, - 0x4d, 0xc2, 0x27, 0x2b, 0x91, 0x25, 0x4b, 0x66, 0xa0, 0xb3, 0xa3, 0x6e, - 0xa8, 0xf3, 0xe1, 0x08, - 0x78, 0x9f, 0x8a, 0x04, 0xf1, 0xd8, 0xfb, 0x84, 0xbb, 0xfd, 0x18, 0x2b, - 0xdf, 0x43, 0x04, 0xcc, - 0x46, 0x37, 0x5e, 0x2a, 0xeb, 0xd0, 0x63, 0x29, 0xe3, 0x96, 0x6b, 0xbe, - 0x5c, 0x38, 0x8e, 0x1e, - 0x9f, 0x64, 0x9f, 0xab, 0x86, 0x7a, 0x32, 0xf6, 0x39, 0x6e, 0xf6, 0x9c, - 0x47, 0x02, 0x75, 0xd7, - 0x7b, 0xbf, 0xa6, 0xea, 0xcb, 0xd1, 0x31, 0xdd, 0x1f, 0x8f, 0x56, 0xcb, - 0xd8, 0x35, 0xcf, 0xf9, - 0xf4, 0x29, 0x99, 0xaa, 0x65, 0x1a, 0x98, 0x04, 0xb7, 0xd1, 0xf8, 0x95, - 0xb7, 0xef, 0x0d, 0xe8, - 0x25, 0x43, 0x75, 0xa7, 0xc9, 0xe9, 0x51, 0xc6, 0x77, 0x14, 0x75, 0x77, - 0x42, 0xf5, 0x9f, 0xe3, - 0xdc, 0x9f, 0x8a, 0xf6, 0x14, 0x2f, 0x53, 0x91, 0xfa, 0x44, 0x00, 0x6d, - 0x28, 0x7f, 0x5c, 0xcf, - 0xb8, 0x12, 0xb4, 0xe6, 0xd2, 0xb6, 0x3f, 0x6a, 0x64, 0x0d, 0x16, 0xda, - 0x68, 0x6c, 0x93, 0x82, - 0xda, 0x5b, 0x92, 0xba, 0xce, 0x78, 0x2a, 0xea, 0x65, 0xfb, 0x5a, 0xc7, - 0x5a, 0x66, 0xcd, 0x42, - 0x7b, 0x33, 0x03, 0x62, 0x06, 0x5a, 0xcc, 0x90, 0x85, 0xf0, 0xf3, 0x6a, - 0x1b, 0xbc, 0xe6, 0xf3, - 0xdb, 0x59, 0xf9, 0x33, 0x63, 0xa7, 0x63, 0x8b, 0x64, 0xe2, 0xf6, 0xb8, - 0xd9, 0x7e, 0x90, 0x1a, - 0xef, 0x08, 0xd7, 0x41, 0xb3, 0xe5, 0x04, 0xde, 0x93, 0x8e, 0x16, 0x4a, - 0xd0, 0xd1, 0x29, 0xb3, - 0xb5, 0x19, 0xe9, 0xfb, 0x41, 0x61, 0x06, 0x51, 0x92, 0x80, 0xdc, 0x9e, - 0xf6, 0xc3, 0x64, 0xd5, - 0x3f, 0x21, 0xbd, 0xd3, 0xb2, 0xde, 0x21, 0x32, 0xf4, 0xc3, 0x5a, 0x23, - 0x27, 0x2c, 0xf3, 0xcf, - 0xb1, 0x87, 0x75, 0x25, 0x5a, 0x66, 0x42, 0x7f, 0x0c, 0xb9, 0xac, 0xd9, - 0xec, 0x3b, 0xc9, 0x89, - 0x5a, 0x69, 0x78, 0xbb, 0xa5, 0xcd, 0x8a, 0x13, 0xf4, 0x67, 0xe1, 0x71, - 0xb1, 0x16, 0x7a, 0x2e, - 0x99, 0x6e, 0x83, 0x4f, 0xa5, 0x85, 0x5a, 0xb2, 0x5e, 0x86, 0x45, 0x2a, - 0x45, 0x33, 0x8a, 0xac, - 0x99, 0x44, 0xc4, 0xb7, 0x98, 0x6d, 0xc7, 0x90, 0xeb, 0x84, 0x65, 0xcd, - 0x74, 0xe4, 0xc9, 0xc1, - 0xe2, 0xc7, 0x03, 0xae, 0xea, 0xc2, 0x51, 0x59, 0x8b, 0x37, 0x4c, 0x64, - 0x54, 0x20, 0xfd, 0x4f, - 0xe3, 0x8c, 0xb3, 0x4e, 0xd6, 0x1a, 0x9b, 0xc5, 0x51, 0xd3, 0x29, 0xb1, - 0xcb, 0xb4, 0x11, 0xb1, - 0x9b, 0xed, 0x2b, 0x45, 0x61, 0x56, 0x10, 0x34, 0x60, 0x03, 0x55, 0x85, - 0x1d, 0x64, 0x1f, 0xbc, - 0x1c, 0x8e, 0xca, 0xed, 0x44, 0xeb, 0x34, 0x4e, 0x2d, 0xb5, 0x68, 0xc6, - 0xd3, 0xba, 0x1b, 0xfd, - 0x2e, 0x20, 0x67, 0xce, 0x87, 0xc6, 0x6e, 0xcb, 0xd8, 0x24, 0x72, 0xfd, - 0x64, 0x4e, 0x5d, 0x9b, - 0xd0, 0xad, 0xa7, 0xf5, 0x90, 0x0c, 0x65, 0xb5, 0xe9, 0x7a, 0x27, 0x7f, - 0xc5, 0x6c, 0x6d, 0x61, - 0x37, 0x7a, 0x8e, 0x5d, 0x62, 0x1a, 0x51, 0xe2, 0x69, 0xdb, 0x47, 0x1c, - 0xdf, 0x81, 0xcd, 0x5b, - 0x2c, 0xeb, 0x9c, 0x90, 0x07, 0xa5, 0x1b, 0x51, 0xd1, 0x08, 0xdf, 0x93, - 0xb1, 0xcf, 0x56, 0xcb, - 0x7a, 0x2d, 0xc4, 0x69, 0x2a, 0xb9, 0x78, 0x17, 0xda, 0x3b, 0xe4, 0xc3, - 0xf5, 0x1e, 0x1d, 0x1f, - 0xe7, 0xf4, 0x3e, 0x3b, 0x91, 0x68, 0x6b, 0xf6, 0xe9, 0x3d, 0x46, 0x5d, - 0x95, 0xaf, 0x2b, 0x3e, - 0x21, 0x6f, 0xd6, 0x5b, 0x38, 0x50, 0xdc, 0x0e, 0xc0, 0xce, 0xa9, 0xc4, - 0xc1, 0x1e, 0x0b, 0x17, - 0xbb, 0xcc, 0x55, 0x5b, 0x64, 0x14, 0x56, 0x2e, 0x46, 0x1f, 0x87, 0x2d, - 0xb3, 0x76, 0x6b, 0x1f, - 0x6e, 0xb1, 0xcc, 0xd9, 0x45, 0x4b, 0x0d, 0x23, 0xeb, 0xf0, 0xca, 0xb6, - 0x16, 0xa8, 0x27, 0x93, - 0x60, 0x21, 0x63, 0xbd, 0xd8, 0xb1, 0x59, 0xe7, 0xa9, 0x71, 0x71, 0xeb, - 0xec, 0xcb, 0x88, 0x89, - 0xa5, 0xe4, 0x9d, 0x40, 0x98, 0xc3, 0x35, 0x03, 0x49, 0x5f, 0x62, 0x17, - 0xdc, 0x6a, 0x62, 0x3b, - 0xfa, 0x6c, 0x61, 0x9d, 0x3d, 0x96, 0x36, 0x85, 0x83, 0x9c, 0x72, 0xeb, - 0xf4, 0xea, 0xbb, 0xcc, - 0xb6, 0x6d, 0x9c, 0x22, 0xba, 0xcb, 0x7f, 0xa2, 0xcb, 0x8e, 0x68, 0xf4, - 0x80, 0xd9, 0xbe, 0x03, - 0x4e, 0xa2, 0xb4, 0xef, 0x16, 0x22, 0x85, 0xa7, 0x75, 0x37, 0x96, 0xc9, - 0x81, 0x46, 0x1e, 0xeb, - 0x7a, 0x57, 0x3c, 0x2c, 0xe1, 0xec, 0x35, 0x0e, 0xfc, 0x61, 0xa7, 0xd9, - 0xf6, 0x32, 0x96, 0x79, - 0x1c, 0x7a, 0xdb, 0xcc, 0x75, 0x0e, 0xb1, 0xeb, 0xdc, 0x4a, 0x84, 0xce, - 0x85, 0xeb, 0x39, 0xe4, - 0x94, 0x34, 0xf6, 0xfa, 0x6d, 0xe6, 0xf8, 0x7d, 0x78, 0x47, 0x0e, 0x36, - 0x19, 0x2a, 0x37, 0xca, - 0x53, 0x16, 0x3e, 0xb6, 0xe3, 0x33, 0x37, 0x63, 0x97, 0x4e, 0xf2, 0x77, - 0xbd, 0xa3, 0x27, 0x92, - 0x93, 0xad, 0x32, 0xed, 0x97, 0xde, 0xfa, 0xe4, 0x9c, 0x8f, 0xd7, 0xcd, - 0xb1, 0xc8, 0xa5, 0xd0, - 0x42, 0x16, 0x2e, 0x64, 0xc7, 0x5a, 0xae, 0x6b, 0x38, 0xaf, 0xc4, 0xd6, - 0x35, 0xd5, 0x3d, 0xce, - 0x55, 0x96, 0xfe, 0x6d, 0x50, 0x4c, 0x93, 0x47, 0x39, 0x07, 0x6e, 0x41, - 0x06, 0xeb, 0x3a, 0xc3, - 0x89, 0xe7, 0x46, 0xad, 0x71, 0x5f, 0x34, 0x62, 0x1d, 0x6c, 0x64, 0xac, - 0x91, 0xbc, 0xda, 0x4e, - 0x89, 0x9d, 0x6a, 0xd3, 0x12, 0x56, 0xda, 0x17, 0x8b, 0xc2, 0x82, 0x20, - 0x98, 0x8f, 0x06, 0x33, - 0x58, 0x73, 0x9d, 0x89, 0x0d, 0xec, 0x7e, 0x0f, 0xc8, 0x7f, 0x53, 0x41, - 0xa7, 0xa2, 0xd7, 0x75, - 0x16, 0xec, 0x92, 0x7b, 0x89, 0x11, 0x55, 0x5d, 0x6c, 0x36, 0xdb, 0xb6, - 0x22, 0x53, 0x7b, 0x64, - 0x9e, 0x82, 0xff, 0x0f, 0x67, 0xc7, 0x6e, 0x32, 0x7b, 0xb6, 0x93, 0xc5, - 0xab, 0xd0, 0x52, 0x2c, - 0xa3, 0xd7, 0xbb, 0xdb, 0x36, 0x52, 0x67, 0x0c, 0xa3, 0x2d, 0x07, 0xcf, - 0xf2, 0xb4, 0x6d, 0xc2, - 0xfb, 0xee, 0x84, 0x8b, 0x22, 0x64, 0xda, 0x64, 0xe1, 0x62, 0x01, 0xb2, - 0x6c, 0x74, 0xff, 0xb6, - 0x1e, 0x4d, 0xdf, 0x4f, 0x66, 0x9e, 0x4a, 0x0e, 0x77, 0xf1, 0x3d, 0x83, - 0x75, 0xbd, 0x34, 0xd4, - 0x6a, 0x23, 0xb0, 0xfb, 0x1c, 0xec, 0x92, 0xc8, 0xce, 0xb6, 0xcd, 0x42, - 0x67, 0x39, 0x5c, 0x67, - 0x62, 0x97, 0x6a, 0xac, 0x3d, 0x4d, 0x47, 0xe7, 0x3a, 0x1f, 0xbc, 0x0c, - 0xcf, 0x0a, 0x5b, 0x2c, - 0xab, 0xbb, 0x78, 0x5d, 0x8a, 0x8f, 0xd4, 0x52, 0xd9, 0x2c, 0x82, 0xca, - 0x3a, 0x3f, 0xac, 0x67, - 0xf4, 0x2e, 0x6c, 0x96, 0x82, 0x57, 0x36, 0x59, 0xda, 0xf7, 0xb0, 0x5a, - 0x07, 0x2c, 0xd6, 0x97, - 0x9c, 0xbb, 0xce, 0x32, 0xaf, 0x09, 0x0e, 0x6c, 0x70, 0xb0, 0x30, 0x80, - 0x0d, 0xb4, 0x85, 0x8c, - 0x15, 0x32, 0x56, 0xd9, 0xac, 0x26, 0x2b, 0x71, 0xa9, 0xa1, 0x5a, 0x17, - 0x92, 0x69, 0x16, 0x07, - 0xc0, 0x12, 0x7a, 0x6a, 0xc8, 0x61, 0x6b, 0x90, 0xcc, 0x83, 0x2d, 0x9c, - 0x8b, 0xee, 0x85, 0xd3, - 0x5c, 0xf9, 0x07, 0xbe, 0xb7, 0xda, 0xd2, 0xb3, 0x59, 0xfe, 0x8a, 0xcd, - 0x0a, 0xf0, 0x8c, 0x95, - 0x66, 0xdb, 0x26, 0xec, 0xdb, 0x47, 0xdf, 0xcd, 0x53, 0x77, 0x79, 0x5f, - 0x44, 0x16, 0x4f, 0xcf, - 0x5a, 0x5a, 0x6d, 0xd8, 0x23, 0x85, 0x6b, 0xa5, 0x85, 0x46, 0x1f, 0x5d, - 0xe7, 0x7b, 0x57, 0xdc, - 0x28, 0x83, 0xd9, 0x17, 0xe6, 0x90, 0x9d, 0xaa, 0x7c, 0x56, 0x5b, 0x69, - 0x99, 0xb5, 0x16, 0x9e, - 0xd4, 0xbe, 0xf3, 0x12, 0x1c, 0xbb, 0xe0, 0xc4, 0xee, 0x8b, 0x64, 0x85, - 0x39, 0x62, 0x03, 0xbe, - 0x50, 0xa0, 0xa5, 0x9c, 0x42, 0x0e, 0x5c, 0x6b, 0xa1, 0xb2, 0x80, 0xaa, - 0x65, 0xb6, 0xce, 0x35, - 0x4b, 0xd8, 0x3d, 0x52, 0x2d, 0x7d, 0xff, 0x1e, 0x4d, 0x9c, 0x20, 0x5e, - 0x60, 0xef, 0xb0, 0xc3, - 0xdb, 0x4a, 0x9f, 0x9e, 0x55, 0xd8, 0x7d, 0x0d, 0x3e, 0x30, 0x15, 0x3f, - 0x49, 0xc1, 0x4b, 0x56, - 0x5b, 0x56, 0x5b, 0x2c, 0xff, 0xa7, 0x4f, 0x3f, 0x73, 0xe8, 0xb1, 0xea, - 0x75, 0x15, 0x5e, 0x16, - 0x41, 0x84, 0x2c, 0x69, 0x63, 0x89, 0x25, 0x2e, 0x3b, 0x1a, 0x4b, 0x25, - 0x5b, 0xc7, 0x59, 0x46, - 0xe2, 0x22, 0x43, 0x65, 0x92, 0xb9, 0x48, 0xb7, 0x2c, 0x00, 0x96, 0x33, - 0x63, 0x22, 0xd9, 0xdc, - 0x1b, 0x87, 0x8b, 0xe0, 0x32, 0x1c, 0xaf, 0x5f, 0x89, 0x7e, 0x6a, 0xd9, - 0x39, 0x97, 0x5a, 0xfc, - 0x61, 0x15, 0xf9, 0x45, 0xed, 0x66, 0x8d, 0x16, 0x6f, 0x59, 0x08, 0x1f, - 0x0b, 0x88, 0x9e, 0xb9, - 0x5c, 0xf3, 0xc1, 0x42, 0x0b, 0xa5, 0xa9, 0xd8, 0x70, 0x2e, 0x12, 0x64, - 0x41, 0xcb, 0xd3, 0xba, - 0x8c, 0x8c, 0x99, 0x48, 0xac, 0x2e, 0x31, 0x5b, 0x56, 0x10, 0x3f, 0xd5, - 0x70, 0x50, 0xee, 0xc3, - 0x87, 0x2f, 0x96, 0xe3, 0xb9, 0x39, 0x7a, 0xf6, 0x72, 0xf7, 0x35, 0x07, - 0xaf, 0xb2, 0xf2, 0xb1, - 0x9c, 0x1d, 0xb1, 0x98, 0x7f, 0x97, 0xc2, 0xa1, 0xcd, 0x42, 0x7d, 0x11, - 0x3b, 0xc6, 0x93, 0x8c, - 0x5e, 0xae, 0x67, 0x39, 0xa9, 0x19, 0x5e, 0x0a, 0x9a, 0x73, 0xac, 0x50, - 0x67, 0xa3, 0x1b, 0x91, - 0x60, 0x01, 0x59, 0x73, 0xa6, 0x4f, 0x74, 0x2c, 0xc1, 0x6f, 0x6f, 0x92, - 0xff, 0xa0, 0x16, 0xba, - 0x15, 0xff, 0x13, 0x7c, 0x7e, 0x91, 0xd9, 0xf7, 0x12, 0x5c, 0x0e, 0x40, - 0x8a, 0x15, 0x7c, 0x9a, - 0xc4, 0xe7, 0x97, 0x2c, 0x7c, 0x38, 0xf1, 0x81, 0xf9, 0x6e, 0x3e, 0xac, - 0x58, 0xe1, 0xca, 0xf6, - 0xc6, 0x42, 0xc9, 0xc0, 0x66, 0x9d, 0x6b, 0x13, 0xe3, 0xe7, 0x19, 0x6a, - 0x9f, 0x6b, 0xc4, 0x17, - 0x56, 0x06, 0xc0, 0x2a, 0x64, 0x9c, 0x80, 0xae, 0xe6, 0x30, 0xc2, 0x85, - 0xb9, 0xe8, 0xee, 0x51, - 0xf8, 0x5a, 0x0d, 0xad, 0x06, 0x32, 0xf3, 0x3c, 0xb3, 0xa7, 0x91, 0xd6, - 0x07, 0xe0, 0xd7, 0xa1, - 0xe9, 0x79, 0xe1, 0x9f, 0x9d, 0xbd, 0x58, 0x84, 0xb6, 0x16, 0xf0, 0x7f, - 0x14, 0x9f, 0x3c, 0x6d, - 0xf3, 0xd8, 0x21, 0xfa, 0xa1, 0xd7, 0xd9, 0xe6, 0x7a, 0x95, 0x44, 0xf5, - 0x42, 0xf8, 0xa8, 0x44, - 0xe7, 0x73, 0x7d, 0xe6, 0x5b, 0xb1, 0x10, 0x2a, 0xf5, 0x48, 0xe8, 0xe2, - 0x5a, 0x3d, 0x37, 0xb1, - 0xe1, 0xb9, 0xb3, 0x2d, 0x6b, 0x0d, 0x46, 0x8e, 0x55, 0x70, 0x3d, 0x83, - 0x28, 0xf6, 0x72, 0x3d, - 0x07, 0xff, 0x7b, 0x0a, 0x5d, 0xb9, 0x66, 0xcd, 0xc6, 0x7f, 0xe6, 0x05, - 0x5d, 0xc3, 0x3b, 0x47, - 0x9d, 0x87, 0xff, 0x8b, 0x3c, 0xba, 0x02, 0x99, 0x0b, 0xf9, 0x3c, 0xdb, - 0x22, 0xed, 0x3c, 0xf9, - 0x3d, 0xa7, 0xf8, 0x49, 0x7c, 0x9a, 0xcf, 0x55, 0xc2, 0x27, 0xaf, 0xf6, - 0x16, 0xe0, 0xe5, 0xf1, - 0x70, 0xa9, 0x22, 0x6f, 0x3a, 0x3b, 0xc5, 0x3c, 0xcb, 0xbc, 0x06, 0x2c, - 0x3c, 0xd7, 0xcd, 0x87, - 0x15, 0xab, 0xe9, 0xc3, 0x46, 0xc6, 0x3c, 0x49, 0xc3, 0x66, 0x5d, 0xa6, - 0x8e, 0x8c, 0x9b, 0x6d, - 0x9f, 0x81, 0x14, 0xf5, 0x96, 0xcc, 0xef, 0x9b, 0x95, 0x57, 0xe2, 0x27, - 0x85, 0x8c, 0x98, 0xe6, - 0xc6, 0x4c, 0x7e, 0x1b, 0x08, 0xdd, 0xf5, 0xe4, 0x90, 0xf9, 0xf8, 0xf2, - 0x54, 0xd6, 0xf6, 0xf4, - 0xcd, 0x26, 0x5b, 0x3a, 0xb1, 0x59, 0x9d, 0xd9, 0xe2, 0x9a, 0x51, 0x1f, - 0x10, 0x33, 0xe1, 0xf0, - 0x19, 0x7c, 0x6e, 0x99, 0xbe, 0xa7, 0xee, 0x59, 0x61, 0x3a, 0xd1, 0xfb, - 0x0c, 0x94, 0x3c, 0xb3, - 0x1b, 0x91, 0x3f, 0x12, 0x4e, 0x56, 0x52, 0x09, 0x5a, 0xf9, 0xf0, 0xc7, - 0x4c, 0x2c, 0x92, 0x0d, - 0xb5, 0x35, 0x5a, 0x92, 0xb5, 0x7c, 0x52, 0x1e, 0xee, 0xe5, 0xad, 0x01, - 0x3a, 0x15, 0xf4, 0xad, - 0xe1, 0x93, 0x4d, 0x57, 0xd0, 0x2e, 0xcc, 0x20, 0x8f, 0xf4, 0xc2, 0x06, - 0xeb, 0xf4, 0x3c, 0x25, - 0xd1, 0x4c, 0x3f, 0xca, 0x56, 0x9e, 0x9d, 0xcc, 0x9e, 0x47, 0x5b, 0x7f, - 0x2c, 0x96, 0x86, 0xc5, - 0xd6, 0xc3, 0xfd, 0x78, 0xbc, 0x7a, 0xba, 0x65, 0xf4, 0x58, 0xf2, 0xb4, - 0xca, 0xe8, 0x1b, 0xb8, - 0x96, 0xeb, 0xbb, 0x70, 0x5e, 0xae, 0xd5, 0x9b, 0x36, 0x39, 0x58, 0x61, - 0x03, 0x7c, 0xcc, 0x62, - 0xb7, 0xf0, 0xae, 0xa5, 0x28, 0x28, 0x0f, 0x6e, 0x6b, 0x83, 0x8d, 0xfa, - 0x1c, 0x36, 0xc3, 0x68, - 0x94, 0x94, 0xda, 0xce, 0xd4, 0xfa, 0x03, 0x62, 0x1a, 0xec, 0x75, 0x8e, - 0x3a, 0xb4, 0xbc, 0x81, - 0x9d, 0x67, 0x63, 0x1b, 0xa8, 0x5d, 0xb7, 0x8e, 0x8c, 0x5d, 0x83, 0xb7, - 0xb8, 0x50, 0x83, 0x4d, - 0x86, 0xb2, 0xea, 0x66, 0x66, 0xcc, 0xc7, 0x63, 0xbd, 0x3d, 0x93, 0x58, - 0xf7, 0x31, 0x74, 0x5c, - 0xc0, 0xbe, 0x33, 0xc9, 0x32, 0x3e, 0x5f, 0x3f, 0x1b, 0xf6, 0xc0, 0xfa, - 0x04, 0xd6, 0x86, 0xb6, - 0x96, 0xb1, 0x82, 0x93, 0xba, 0x7f, 0x8a, 0x39, 0x63, 0x0a, 0x55, 0x89, - 0xf7, 0x37, 0x27, 0x27, - 0xb3, 0x09, 0xec, 0xa1, 0x6b, 0x68, 0x33, 0x7c, 0x56, 0xf3, 0xc7, 0x14, - 0x72, 0xea, 0x14, 0xbc, - 0x69, 0xa3, 0x96, 0x64, 0xa9, 0xbe, 0x17, 0x32, 0xd9, 0xec, 0xad, 0x23, - 0x27, 0x4d, 0xa0, 0x67, - 0x03, 0x5e, 0x6f, 0xe5, 0x7a, 0x32, 0x79, 0xb8, 0x37, 0x5c, 0x6c, 0x42, - 0x22, 0x75, 0x77, 0x2d, - 0xcf, 0x6f, 0x8d, 0x5a, 0xf7, 0xb3, 0x6d, 0x17, 0xef, 0x31, 0x50, 0xf9, - 0xb3, 0xfc, 0x0f, 0x7b, - 0x40, 0xb1, 0xae, 0x8e, 0x36, 0xe1, 0x4b, 0xe5, 0x50, 0xf0, 0xae, 0xa3, - 0xf2, 0x7d, 0x8c, 0xae, - 0xd3, 0x14, 0xc5, 0x55, 0xb4, 0xe4, 0xfb, 0xf4, 0x46, 0x41, 0x65, 0xad, - 0xae, 0xba, 0x94, 0xef, - 0x58, 0xf9, 0xa8, 0xa4, 0xbe, 0x5e, 0xaa, 0x69, 0xfa, 0xda, 0xa0, 0x09, - 0x3f, 0xc0, 0x42, 0x46, - 0xbd, 0x8c, 0xc1, 0x66, 0x61, 0x33, 0x1e, 0x8d, 0x72, 0xda, 0x6b, 0x1c, - 0x6a, 0xe6, 0x06, 0xf6, - 0xcd, 0xa6, 0x36, 0xd8, 0x0a, 0x85, 0xd9, 0xac, 0x52, 0xa1, 0xef, 0xe0, - 0x95, 0xeb, 0x3b, 0xb8, - 0x25, 0xc4, 0xd9, 0x62, 0xc6, 0xaf, 0xc5, 0x4b, 0xf2, 0x2c, 0x3d, 0xe5, - 0x50, 0x79, 0x82, 0x1c, - 0xa4, 0xee, 0xe2, 0x7b, 0x5b, 0x6b, 0x38, 0x45, 0xdd, 0xc2, 0x19, 0xe0, - 0x5e, 0xae, 0xbb, 0xf9, - 0x7c, 0x3b, 0xf8, 0xb3, 0xc6, 0x9d, 0x72, 0x0f, 0x5c, 0x2b, 0x9e, 0x56, - 0xe0, 0xb3, 0x25, 0x96, - 0x39, 0x95, 0x96, 0x4f, 0xf9, 0xd4, 0x35, 0x2b, 0xa8, 0xf3, 0x36, 0xe0, - 0x11, 0xbe, 0xab, 0x95, - 0x63, 0x03, 0xdf, 0xdf, 0xab, 0xa8, 0x08, 0x17, 0xc0, 0xf1, 0x56, 0x4d, - 0x53, 0xdd, 0x39, 0xf7, - 0xf6, 0x4f, 0xa4, 0x52, 0x9b, 0x4c, 0xcf, 0x16, 0x46, 0xd8, 0x7c, 0xe4, - 0x29, 0xe4, 0x1c, 0xbe, - 0x50, 0xfb, 0xf3, 0x16, 0x74, 0x66, 0xf8, 0xd1, 0xac, 0x93, 0x76, 0x70, - 0x7d, 0x0f, 0xb8, 0x9b, - 0xeb, 0x21, 0xa8, 0x24, 0x63, 0xc7, 0x75, 0xee, 0x8a, 0xbe, 0x09, 0x2d, - 0x4c, 0xf0, 0x91, 0x77, - 0x02, 0x36, 0xcb, 0xd6, 0xf7, 0x13, 0x95, 0xf6, 0xd6, 0xeb, 0xb8, 0xab, - 0xb4, 0x70, 0x98, 0x06, - 0x8f, 0xab, 0xe9, 0x5b, 0x8f, 0x3c, 0x36, 0x1f, 0x99, 0x0d, 0x72, 0xf4, - 0xba, 0x00, 0x56, 0xd8, - 0xc1, 0xc8, 0xc9, 0x52, 0x63, 0x4c, 0x93, 0xc4, 0x9a, 0xce, 0x89, 0xe1, - 0xce, 0x3b, 0x22, 0x6a, - 0xed, 0xea, 0x3e, 0x64, 0x25, 0xfe, 0xb2, 0x93, 0xde, 0xb6, 0xd8, 0x86, - 0x1c, 0xd9, 0x3e, 0xcf, - 0x7a, 0xca, 0x38, 0x29, 0x96, 0x22, 0x79, 0x83, 0xbe, 0xef, 0x6e, 0xed, - 0x29, 0x47, 0xfa, 0xe5, - 0xda, 0x33, 0xbd, 0xad, 0xa5, 0x8c, 0xce, 0x42, 0x27, 0xcb, 0xb0, 0xf3, - 0x6c, 0xd6, 0x2e, 0xd5, - 0x99, 0xb0, 0x50, 0xdf, 0xab, 0x99, 0xaf, 0x6b, 0xf0, 0x1d, 0x68, 0xab, - 0x82, 0x6a, 0xbb, 0x24, - 0xc0, 0xb3, 0xa3, 0x72, 0x62, 0x20, 0x1e, 0xbe, 0x5f, 0x46, 0x0b, 0x33, - 0x7d, 0xe8, 0x16, 0xc1, - 0xf3, 0x5f, 0xc9, 0xa2, 0x15, 0x96, 0x96, 0x12, 0x38, 0x2d, 0xd0, 0xfa, - 0xdc, 0x41, 0x5c, 0xaa, - 0xb3, 0x6c, 0xb1, 0x85, 0xd2, 0x33, 0x78, 0xf9, 0xcb, 0xf4, 0x2d, 0xc1, - 0xf6, 0xc5, 0x96, 0xa7, - 0x59, 0x25, 0xf4, 0x94, 0x93, 0xa7, 0x57, 0x61, 0xed, 0x15, 0xcc, 0xf1, - 0xe5, 0xa0, 0x42, 0x1e, - 0x81, 0xfb, 0xd5, 0xf4, 0xae, 0x06, 0xeb, 0xe1, 0x63, 0x07, 0x54, 0x5e, - 0x36, 0xf5, 0xb3, 0x11, - 0x99, 0xc4, 0x47, 0xde, 0xe1, 0xd0, 0xdf, 0xa6, 0x47, 0xa8, 0x53, 0xc2, - 0x62, 0x2a, 0x51, 0xab, - 0x64, 0xa5, 0xe4, 0x55, 0xb5, 0x6b, 0x2d, 0xa2, 0xd5, 0xe1, 0x33, 0x2f, - 0x92, 0xca, 0x76, 0xab, - 0x85, 0xb2, 0x07, 0x7b, 0xe0, 0x7b, 0x82, 0x4c, 0x34, 0xa6, 0x48, 0x5c, - 0x4d, 0xe7, 0x84, 0x6e, - 0xb3, 0xc2, 0x22, 0xc6, 0x4b, 0xb5, 0xbd, 0x0a, 0x9e, 0x1b, 0x39, 0xd5, - 0xed, 0x0e, 0x88, 0x8d, - 0x58, 0x26, 0xcf, 0xe7, 0x69, 0x77, 0x01, 0xb9, 0xcc, 0x0e, 0xf2, 0xfc, - 0x9e, 0x82, 0x8f, 0xc3, - 0x53, 0xd6, 0x63, 0xe3, 0x31, 0x70, 0x63, 0xfd, 0x89, 0xc6, 0x53, 0x54, - 0xad, 0x51, 0xa5, 0xdf, - 0x05, 0x70, 0x68, 0xb8, 0x7e, 0xd6, 0x41, 0x7f, 0x0f, 0x7c, 0x2e, 0xc1, - 0x32, 0x8e, 0x00, 0xcf, - 0xd5, 0xc7, 0x51, 0x7b, 0xcd, 0x64, 0xcc, 0x5e, 0x6c, 0xdb, 0xa8, 0xef, - 0xee, 0x7b, 0x7e, 0xf2, - 0x99, 0xd1, 0x81, 0x88, 0x1f, 0xeb, 0x33, 0xaf, 0x80, 0xb5, 0x1a, 0xf4, - 0xdf, 0x32, 0x6e, 0x44, - 0x0b, 0x63, 0x2d, 0x3d, 0x85, 0xf2, 0x34, 0x5c, 0xa8, 0x3b, 0x14, 0x2b, - 0xe0, 0xc2, 0xf7, 0x0d, - 0x0a, 0xf5, 0x54, 0xc9, 0x86, 0x2f, 0x2a, 0xbb, 0x14, 0xfa, 0xf5, 0x8d, - 0x93, 0x9e, 0xd8, 0x69, - 0x9f, 0xec, 0x35, 0xb1, 0xc7, 0x47, 0x3b, 0x4d, 0xe4, 0xe3, 0x5c, 0x1f, - 0x0e, 0x9e, 0x83, 0xfe, - 0x2e, 0xf7, 0xa8, 0x9d, 0xf0, 0x91, 0xeb, 0xd3, 0xef, 0x20, 0xd2, 0x32, - 0xf5, 0x53, 0x92, 0x5c, - 0x9f, 0x75, 0xc6, 0xcb, 0x7d, 0x5c, 0x7b, 0xfc, 0xa8, 0x2b, 0xbc, 0x42, - 0x14, 0x54, 0x48, 0x95, - 0x31, 0x49, 0x62, 0x6a, 0xbb, 0x24, 0x76, 0x9b, 0xd5, 0x39, 0x22, 0xa9, - 0xa0, 0x2a, 0xaf, 0x4c, - 0x3f, 0xe5, 0x69, 0x81, 0xb3, 0xb6, 0xd8, 0x8f, 0xb6, 0x1a, 0xd0, 0x44, - 0x9e, 0xcf, 0x4e, 0x94, - 0x1b, 0xf0, 0x0d, 0x21, 0x3b, 0xfb, 0xd3, 0x16, 0x7d, 0x3a, 0x1c, 0x63, - 0x19, 0x91, 0xab, 0xdf, - 0x99, 0xb2, 0x41, 0xc1, 0xfa, 0xb6, 0x52, 0x1e, 0xbc, 0x3f, 0x48, 0xc6, - 0x53, 0x2b, 0xec, 0xd5, - 0x92, 0xb5, 0x7d, 0xdf, 0x2b, 0x0f, 0xdf, 0xf8, 0x3b, 0xde, 0xbf, 0x1f, - 0xec, 0xc4, 0x3b, 0xd3, - 0x7c, 0xfa, 0x62, 0xe5, 0x79, 0xfd, 0xac, 0xd8, 0xee, 0xf7, 0x7e, 0x56, - 0x0a, 0x9a, 0xdf, 0xc5, - 0x8e, 0x51, 0x4e, 0xdd, 0xee, 0xcb, 0x5b, 0xbd, 0x96, 0x68, 0x9d, 0x7e, - 0x8f, 0x67, 0xac, 0x9f, - 0x3c, 0x79, 0xc4, 0xc7, 0x34, 0x3c, 0xae, 0xc8, 0xef, 0x9d, 0x2a, 0x97, - 0x4c, 0x07, 0x02, 0xea, - 0x46, 0x61, 0x3b, 0x9e, 0x90, 0xe9, 0x33, 0x7e, 0x20, 0xf2, 0xef, 0x85, - 0x63, 0x57, 0xff, 0xcb, - 0xd4, 0x0f, 0xa3, 0x7d, 0xb4, 0x97, 0xa7, 0xdf, 0xfc, 0xf2, 0xdf, 0xd9, - 0x53, 0x38, 0x5f, 0xae, - 0x34, 0x67, 0x59, 0xd1, 0xcc, 0x9e, 0x33, 0x5e, 0xca, 0x8c, 0x2a, 0x89, - 0xc2, 0x66, 0xed, 0xaa, - 0xbb, 0xa6, 0xf6, 0x2e, 0xa9, 0xcc, 0x2a, 0xd1, 0x4f, 0xe3, 0x76, 0x06, - 0xbc, 0x7b, 0x7a, 0x10, - 0x3a, 0x4d, 0xfa, 0xee, 0x6a, 0x46, 0x80, 0xb7, 0x34, 0xd5, 0xfb, 0x8c, - 0xde, 0xdf, 0xb2, 0xf0, - 0xe5, 0xed, 0xac, 0xb2, 0x06, 0x4d, 0xa6, 0x59, 0xc6, 0x67, 0x04, 0x98, - 0x6b, 0xc0, 0x63, 0x12, - 0xba, 0x70, 0xad, 0xb2, 0x8b, 0xbc, 0x19, 0xd9, 0x66, 0x54, 0x0e, 0xb9, - 0x36, 0x01, 0x3f, 0x3b, - 0x08, 0xf6, 0x92, 0xa1, 0x92, 0x2d, 0x7d, 0x99, 0x9c, 0x40, 0x63, 0xc9, - 0x41, 0xe3, 0x65, 0xa4, - 0x7e, 0x27, 0xd1, 0xbb, 0x56, 0x2c, 0x1e, 0xb8, 0x0d, 0x3d, 0x57, 0xe1, - 0x39, 0x5e, 0x8a, 0xd9, - 0xe4, 0x80, 0x06, 0xbd, 0x56, 0x13, 0x76, 0x49, 0x69, 0xc3, 0x4f, 0x36, - 0xb6, 0x99, 0x88, 0x7f, - 0x8c, 0x27, 0x97, 0xa5, 0xb7, 0x91, 0xe9, 0x60, 0xd0, 0xfb, 0xbb, 0x3b, - 0xf5, 0x5d, 0x01, 0x2b, - 0x9d, 0x7e, 0xc4, 0xea, 0x2b, 0xee, 0x19, 0x07, 0xf5, 0x5b, 0x5c, 0xe9, - 0x54, 0x25, 0x99, 0x41, - 0xdf, 0x74, 0x4d, 0xd7, 0xef, 0x7d, 0xa9, 0x7b, 0x45, 0x07, 0x02, 0xae, - 0x73, 0x84, 0xd3, 0x29, - 0x79, 0xdf, 0x28, 0x97, 0xc8, 0xda, 0x2e, 0x09, 0xed, 0xaa, 0xc3, 0x53, - 0xfe, 0x54, 0x51, 0x99, - 0x5a, 0xa8, 0xdf, 0x91, 0x99, 0xab, 0xef, 0x9e, 0xb6, 0x45, 0x0b, 0x56, - 0x9b, 0x43, 0xa5, 0x9c, - 0xae, 0x9f, 0xfc, 0x59, 0x91, 0xca, 0x6a, 0x03, 0xb0, 0x8e, 0xf7, 0xf7, - 0x7e, 0xfa, 0xce, 0xe8, - 0x7e, 0x3c, 0xb6, 0xa7, 0x7e, 0x4a, 0x96, 0x1c, 0x10, 0xea, 0x5e, 0xed, - 0xdf, 0xe5, 0x7e, 0xf6, - 0xef, 0xc3, 0xee, 0x35, 0x5e, 0x25, 0xd2, 0xd4, 0x73, 0x6c, 0xdf, 0x71, - 0x59, 0xd4, 0x2b, 0x33, - 0xf4, 0x98, 0xc3, 0xfa, 0xdd, 0x87, 0x31, 0x96, 0x11, 0xea, 0x3d, 0xc4, - 0x44, 0xfc, 0x63, 0x33, - 0x36, 0x4b, 0xf4, 0xe3, 0x6c, 0x34, 0xf9, 0x6f, 0x33, 0xde, 0x19, 0x6f, - 0x69, 0x4b, 0xc3, 0x66, - 0xf3, 0xe0, 0xed, 0x10, 0xd9, 0xa7, 0x11, 0x7b, 0xfb, 0xf3, 0x96, 0x06, - 0xc7, 0xb5, 0xe8, 0xb7, - 0x42, 0x3f, 0xb9, 0x4c, 0xf6, 0x93, 0xe9, 0x70, 0x40, 0xcd, 0x28, 0xec, - 0x45, 0x37, 0x49, 0x3e, - 0x74, 0xfa, 0x60, 0xf7, 0x66, 0xcb, 0x8c, 0x03, 0x44, 0xf6, 0x20, 0xea, - 0xc5, 0xb6, 0xfa, 0xf3, - 0xcc, 0xc8, 0xa5, 0x4a, 0x7b, 0x9a, 0x88, 0x0c, 0xbc, 0xc2, 0x09, 0x5d, - 0x89, 0x15, 0x1a, 0x25, - 0x32, 0x4a, 0xc5, 0x99, 0x7a, 0xef, 0x6a, 0x52, 0x4a, 0x72, 0x81, 0xe1, - 0xd0, 0xf7, 0x60, 0x8f, - 0xb6, 0x79, 0xb2, 0xe4, 0xc2, 0x6b, 0xac, 0x5b, 0x23, 0xff, 0xa4, 0xe2, - 0x49, 0x32, 0xff, 0xe6, - 0x25, 0x41, 0x3f, 0x85, 0xf8, 0x03, 0x3b, 0x74, 0x9a, 0x65, 0xfd, 0xe7, - 0x18, 0x79, 0x54, 0x8f, - 0x9f, 0xce, 0x59, 0x6d, 0x28, 0x2d, 0x49, 0x8c, 0x8c, 0xb7, 0xcc, 0x4a, - 0x42, 0x0b, 0x51, 0xd2, - 0x89, 0x2a, 0x6c, 0x05, 0x94, 0x8f, 0x9a, 0x2b, 0xec, 0x23, 0x2e, 0x22, - 0x7d, 0x64, 0x51, 0x6f, - 0xaa, 0x3f, 0x84, 0x24, 0x47, 0xf5, 0xb8, 0x16, 0xf2, 0xa8, 0x7a, 0x56, - 0xe5, 0xed, 0x7d, 0x1e, - 0x8f, 0x79, 0x0d, 0xcf, 0x9c, 0x23, 0x43, 0x7c, 0xb4, 0x96, 0x0c, 0x9f, - 0x45, 0x44, 0x5a, 0x3d, - 0x19, 0xdd, 0xaa, 0xfb, 0xde, 0x9c, 0xc2, 0x8e, 0x6a, 0x4a, 0x3b, 0xe1, - 0x64, 0x84, 0x7e, 0x47, - 0xc2, 0xf3, 0x57, 0x20, 0x49, 0xd0, 0xeb, 0xcd, 0xce, 0xa9, 0xf6, 0xfb, - 0x68, 0x3f, 0x9d, 0xba, - 0x64, 0x3a, 0x12, 0x10, 0xea, 0xf9, 0xd4, 0x0a, 0x1f, 0x6f, 0x4b, 0xa5, - 0xb2, 0xac, 0xb6, 0x48, - 0xa6, 0x64, 0x6b, 0xa1, 0x32, 0x53, 0x7f, 0x77, 0x9e, 0xc8, 0xb8, 0x44, - 0x1f, 0x6d, 0xa8, 0xb7, - 0x34, 0x86, 0x72, 0x76, 0x18, 0x80, 0x8f, 0x05, 0x5b, 0xe3, 0x0c, 0x3b, - 0xad, 0x5d, 0x1c, 0x46, - 0xa1, 0xbc, 0xa8, 0xe2, 0x4c, 0xfd, 0x9d, 0xe0, 0xb4, 0xee, 0x31, 0x85, - 0x76, 0x9b, 0x43, 0xbd, - 0xc5, 0xb9, 0x5a, 0xce, 0x62, 0xd5, 0x40, 0x50, 0xbc, 0x55, 0xa3, 0xc1, - 0x1e, 0x44, 0xb9, 0x4b, - 0xc6, 0x68, 0xe2, 0xe4, 0x77, 0xc8, 0x93, 0xcd, 0x09, 0xf2, 0x2e, 0x5d, - 0xc7, 0xdf, 0xcd, 0xff, - 0xf1, 0x70, 0x78, 0x52, 0x8f, 0x57, 0xcf, 0x5f, 0x9e, 0xa5, 0x9e, 0xef, - 0x81, 0xd7, 0x7b, 0xfe, - 0xc2, 0x63, 0x0c, 0x9f, 0x9f, 0x92, 0xce, 0xf2, 0xbf, 0xe8, 0x7b, 0x8d, - 0x0f, 0xfd, 0xe3, 0xf8, - 0xe5, 0x26, 0x22, 0xe7, 0x2e, 0x93, 0x96, 0xaa, 0xac, 0xbb, 0xe0, 0x47, - 0x47, 0x4c, 0x0e, 0xf6, - 0xe1, 0x8f, 0xf7, 0x59, 0xfa, 0xef, 0xc2, 0x32, 0xa7, 0xe4, 0x18, 0x51, - 0x5d, 0x8a, 0x7f, 0x78, - 0xdb, 0x55, 0xcf, 0x20, 0xe2, 0x76, 0x35, 0xff, 0xde, 0x69, 0xb6, 0xdd, - 0x29, 0x8f, 0xd2, 0xa6, - 0x78, 0x3b, 0xc6, 0x5a, 0x6b, 0xb1, 0xf3, 0xed, 0xcc, 0xea, 0xa5, 0xff, - 0x8e, 0x7f, 0x00, 0xa7, - 0xd9, 0xee, 0xf2, 0x00, 0xb5, 0xdc, 0x21, 0xb4, 0xdb, 0xd3, 0x32, 0xcb, - 0x2a, 0x53, 0x60, 0xbc, - 0x86, 0x57, 0x45, 0x5b, 0xf8, 0xbe, 0x4b, 0xfe, 0xc2, 0x19, 0xd8, 0x77, - 0xfc, 0x31, 0x46, 0x6d, - 0xc1, 0x93, 0xd4, 0x59, 0x61, 0xa8, 0xe9, 0x27, 0x63, 0xf0, 0xc9, 0x27, - 0xf4, 0x1b, 0x2b, 0xc9, - 0xfa, 0x39, 0x52, 0x30, 0x9c, 0xd7, 0x6f, 0x69, 0xd8, 0x88, 0xab, 0x11, - 0xb5, 0x5d, 0x13, 0x5c, - 0xef, 0x11, 0x87, 0x8d, 0xca, 0x34, 0x72, 0x0d, 0xf5, 0xde, 0x73, 0x36, - 0xfd, 0x67, 0x7c, 0x9e, - 0xac, 0x7b, 0x71, 0x12, 0xad, 0x6d, 0x60, 0xbd, 0x7b, 0x24, 0x0c, 0xad, - 0xb7, 0x97, 0x9b, 0xf1, - 0x9c, 0x3a, 0x72, 0x80, 0xaa, 0x38, 0x5c, 0x3b, 0x96, 0x7a, 0xb3, 0x76, - 0xb5, 0xf9, 0xdc, 0xfe, - 0x14, 0x9f, 0x0e, 0xea, 0xea, 0xe5, 0x3e, 0xc6, 0x87, 0x11, 0x59, 0x1d, - 0xe5, 0x46, 0xfe, 0x7d, - 0x8c, 0x91, 0x4b, 0xb1, 0xd1, 0xeb, 0x7e, 0x2b, 0x9d, 0x82, 0xfe, 0x72, - 0x76, 0xb0, 0x74, 0xf7, - 0x3b, 0xd9, 0x8a, 0x5e, 0x11, 0x7e, 0xef, 0xed, 0x3f, 0x46, 0x85, 0x60, - 0x33, 0xfb, 0xb3, 0xc8, - 0xff, 0x4d, 0x50, 0x39, 0x0d, 0xad, 0x83, 0xec, 0x44, 0x19, 0x26, 0x32, - 0xf5, 0xb3, 0x4b, 0xf5, - 0xd4, 0xae, 0xde, 0xa7, 0x6d, 0x2a, 0xb6, 0xf2, 0xd0, 0x3a, 0xce, 0x8e, - 0x53, 0x8f, 0xae, 0xfa, - 0xcb, 0xe3, 0xd8, 0xf2, 0x51, 0xec, 0x34, 0x80, 0xda, 0x60, 0x1f, 0x3d, - 0x2d, 0xfa, 0x59, 0x92, - 0x97, 0x07, 0xab, 0x4c, 0x81, 0xa0, 0x9e, 0x9c, 0x2f, 0xd6, 0xbb, 0xba, - 0x67, 0x46, 0x25, 0xf9, - 0xf2, 0x4c, 0xc0, 0x71, 0x6b, 0xd0, 0xf0, 0x13, 0xd2, 0x15, 0x74, 0x46, - 0x13, 0x37, 0x92, 0x11, - 0x7b, 0xb0, 0xea, 0x26, 0xe8, 0xbf, 0x1e, 0x94, 0xfe, 0x69, 0x79, 0x1b, - 0x3d, 0x64, 0xc9, 0x58, - 0xc3, 0x26, 0xc3, 0xdc, 0x36, 0x53, 0x75, 0x48, 0x9f, 0xa2, 0xbc, 0x9c, - 0x2c, 0xfd, 0xf6, 0xfd, - 0x62, 0x79, 0x57, 0xce, 0x06, 0xc1, 0xeb, 0xfa, 0xfd, 0x8c, 0xdd, 0x68, - 0x76, 0x0e, 0x1e, 0xd9, - 0x84, 0xef, 0xb8, 0x5a, 0xcf, 0xb8, 0x39, 0x54, 0xfd, 0x67, 0xf5, 0xe5, - 0x9d, 0x71, 0x06, 0x4d, - 0xef, 0x45, 0xd7, 0xf3, 0xf5, 0x9d, 0xc3, 0xe5, 0xfa, 0x29, 0xb1, 0x7a, - 0x97, 0xe3, 0x8d, 0x00, - 0xf4, 0xcf, 0x58, 0x68, 0x9d, 0xd6, 0xbf, 0x9d, 0xf5, 0xa1, 0x77, 0xc6, - 0x0d, 0x57, 0xef, 0x19, - 0x68, 0x78, 0x56, 0xb4, 0xce, 0x73, 0xf5, 0xf9, 0x8e, 0xf6, 0x50, 0x7b, - 0xdd, 0x4f, 0x1a, 0xa5, - 0xc7, 0x66, 0xbd, 0xef, 0x1f, 0xc2, 0x63, 0x4e, 0xb9, 0xe9, 0x58, 0x69, - 0xb5, 0x95, 0xa9, 0xad, - 0x56, 0xac, 0x7c, 0xab, 0xcf, 0x6f, 0x04, 0x19, 0xaf, 0x68, 0x29, 0x3f, - 0xde, 0xe2, 0x7e, 0x5a, - 0xb9, 0x4c, 0x3f, 0xf3, 0x3b, 0x13, 0x50, 0x17, 0x56, 0xbc, 0x47, 0xb5, - 0x41, 0x2d, 0x44, 0x54, - 0x0d, 0x31, 0x6d, 0xd6, 0x2d, 0xa5, 0x6b, 0x55, 0x46, 0x6a, 0xba, 0x91, - 0xa6, 0xdf, 0x1e, 0x3a, - 0x8a, 0x5d, 0xcf, 0x07, 0xc4, 0x05, 0x0d, 0xf5, 0xde, 0xc9, 0x3b, 0xfa, - 0x0d, 0x95, 0xb7, 0xdc, - 0x2d, 0x6f, 0x5a, 0x70, 0x41, 0xbf, 0xe1, 0x63, 0x1d, 0xff, 0xa6, 0x7e, - 0x8b, 0xc7, 0x35, 0x47, - 0xfd, 0xff, 0x96, 0xdf, 0x28, 0x5f, 0xfa, 0x6f, 0x06, 0xa5, 0x76, 0x3e, - 0xe0, 0x5a, 0x17, 0x7c, - 0xd6, 0xf1, 0xef, 0xbb, 0x12, 0xde, 0xde, 0x72, 0x23, 0xd8, 0xac, 0x60, - 0xdc, 0xb6, 0xa5, 0x74, - 0xb9, 0xf1, 0xde, 0x15, 0x5d, 0xda, 0x78, 0x47, 0x6b, 0xe3, 0xc2, 0x65, - 0xe8, 0x9f, 0x97, 0x0f, - 0xc9, 0x64, 0x54, 0x2a, 0x46, 0xa6, 0x0c, 0xf6, 0xd8, 0xcc, 0xbd, 0xa7, - 0x65, 0xda, 0x93, 0x1d, - 0xc9, 0xd8, 0xcc, 0x2e, 0x9f, 0x6a, 0x5a, 0x21, 0xfc, 0x56, 0xf0, 0x29, - 0xf5, 0x21, 0xb5, 0x17, - 0x31, 0x35, 0xb0, 0xc6, 0x6b, 0xb3, 0x6e, 0xb3, 0xba, 0x46, 0x8c, 0x74, - 0x8c, 0xb1, 0xab, 0x9d, - 0x31, 0x82, 0xea, 0xe9, 0x22, 0xf1, 0xf8, 0xf3, 0xe1, 0x03, 0xf9, 0x38, - 0xf4, 0x4d, 0x11, 0xd7, - 0x80, 0xef, 0xd8, 0xc5, 0xe3, 0x24, 0xd1, 0x18, 0x23, 0x03, 0x2c, 0x71, - 0xa6, 0xce, 0x69, 0xb7, - 0x97, 0x8f, 0x49, 0x8b, 0x33, 0xe2, 0xe8, 0x7d, 0x41, 0x56, 0xc9, 0xd7, - 0xf2, 0x2f, 0x74, 0xfd, - 0x73, 0xe0, 0x13, 0x72, 0xc0, 0x0a, 0x7d, 0xaf, 0x2e, 0x84, 0x9f, 0x86, - 0x4d, 0xfa, 0x6f, 0x3d, - 0xe3, 0x8c, 0x44, 0xe9, 0x67, 0xb5, 0x19, 0xe8, 0x3a, 0xed, 0xb1, 0x98, - 0x04, 0x7b, 0xb4, 0x43, - 0xfd, 0x65, 0xe4, 0x10, 0x2a, 0x8c, 0x6f, 0x88, 0x8e, 0x8f, 0xae, 0x19, - 0x17, 0xc9, 0xc6, 0x71, - 0x32, 0x8c, 0xda, 0x3e, 0x84, 0x9f, 0x8e, 0xd1, 0x54, 0xdf, 0xd1, 0xc4, - 0x53, 0x9f, 0xda, 0xb0, - 0x78, 0x9f, 0xef, 0x9a, 0x20, 0x3f, 0xf6, 0x2d, 0x88, 0xc9, 0x55, 0xdf, - 0xa4, 0x13, 0x81, 0x96, - 0xd7, 0x49, 0xab, 0x7c, 0x46, 0x2e, 0xbd, 0x16, 0xa8, 0x68, 0x4d, 0x22, - 0x6e, 0x23, 0x43, 0xb8, - 0x76, 0x18, 0xd1, 0xf2, 0x4c, 0x6d, 0x58, 0x82, 0xff, 0xf7, 0xff, 0x75, - 0x9d, 0x34, 0x78, 0x4c, - 0xa4, 0xe1, 0xfa, 0xe6, 0xaa, 0x7e, 0x9c, 0xad, 0xd4, 0x77, 0xc4, 0x7d, - 0xfe, 0x13, 0x71, 0x51, - 0x7e, 0xe4, 0x3c, 0x38, 0x44, 0x46, 0xb8, 0xbf, 0x0b, 0x2b, 0xd2, 0x1e, - 0xe9, 0x08, 0x5d, 0xd7, - 0x70, 0xd9, 0xa2, 0x1c, 0x6d, 0x6c, 0xa6, 0x63, 0x2d, 0x7c, 0xd4, 0x73, - 0x32, 0xca, 0xfe, 0x82, - 0x28, 0x0c, 0xe4, 0x04, 0xf8, 0xa5, 0xfe, 0x0b, 0xba, 0x2f, 0xae, 0x1a, - 0xdf, 0x32, 0x6f, 0x89, - 0x0c, 0xc6, 0x62, 0x8a, 0xd2, 0x8b, 0xf6, 0x91, 0xd2, 0xab, 0xac, 0x57, - 0x7a, 0xaf, 0xf2, 0x5f, - 0xfb, 0x7a, 0x2a, 0xbd, 0x7b, 0x45, 0xf7, 0xb4, 0xee, 0xe5, 0xbd, 0xd2, - 0x2e, 0x37, 0xb6, 0x67, - 0x39, 0xe3, 0x18, 0xdb, 0xd3, 0x6c, 0x7b, 0x32, 0xfd, 0x91, 0xca, 0x47, - 0x52, 0x1f, 0xa9, 0xe8, - 0xc1, 0xdc, 0x9e, 0xf4, 0xf7, 0xcc, 0xe8, 0xf9, 0x4b, 0xca, 0x54, 0xd6, - 0x3b, 0xfd, 0xe1, 0xba, - 0xf0, 0x98, 0x40, 0xdf, 0xb5, 0x19, 0x36, 0xe9, 0xd9, 0xa4, 0x17, 0xec, - 0xc3, 0x1d, 0xc3, 0x65, - 0xb8, 0x0c, 0x92, 0x01, 0xd4, 0x23, 0xea, 0xef, 0x51, 0xbf, 0xba, 0x0a, - 0xa8, 0xbf, 0x83, 0x3d, - 0x2b, 0x29, 0xd2, 0x87, 0x0c, 0x0b, 0x15, 0x03, 0xbb, 0x95, 0xdd, 0x93, - 0xde, 0xb5, 0x21, 0x2c, - 0x22, 0x2c, 0x74, 0x5d, 0xf3, 0x15, 0xf0, 0xfb, 0x36, 0x89, 0xb5, 0x5e, - 0x05, 0x2f, 0xd8, 0x86, - 0x1a, 0x43, 0xf5, 0x77, 0x04, 0x3c, 0xad, 0x9f, 0x98, 0xb4, 0xea, 0xbf, - 0x66, 0xfd, 0xe6, 0x32, - 0xf8, 0xd6, 0xfd, 0x2d, 0xaa, 0xd5, 0xd8, 0x6b, 0xa0, 0x0c, 0xd5, 0x18, - 0x0e, 0x9d, 0xbb, 0x66, - 0x86, 0x8f, 0x0e, 0x7d, 0x33, 0xe6, 0xf5, 0xfd, 0x5e, 0xdb, 0xae, 0x75, - 0xff, 0x88, 0x1b, 0x6a, - 0x1b, 0x22, 0xcf, 0x81, 0xc1, 0xc4, 0x5a, 0x0f, 0xf6, 0xb7, 0x55, 0x3a, - 0x4f, 0xba, 0x6c, 0xd7, - 0xf6, 0x1b, 0xa4, 0x3d, 0xdf, 0x4f, 0x7c, 0x58, 0xf2, 0x19, 0xdd, 0x97, - 0x59, 0x6a, 0xee, 0x73, - 0xf6, 0x61, 0x8e, 0xbe, 0x13, 0xc3, 0x93, 0xc2, 0xab, 0x43, 0xdf, 0x6f, - 0x7b, 0xdd, 0xbf, 0xdb, - 0x96, 0x58, 0xbb, 0xb3, 0xe2, 0xd9, 0xd4, 0x21, 0xf6, 0x41, 0x0e, 0xd7, - 0x37, 0x32, 0xf4, 0x97, - 0xa7, 0xa8, 0x4a, 0xb2, 0x65, 0x99, 0xbc, 0x1d, 0xf0, 0x6f, 0xf9, 0x2f, - 0xca, 0x3e, 0xa9, 0x60, - 0xf7, 0x7a, 0x52, 0x47, 0x98, 0x9e, 0x63, 0x0c, 0x96, 0xa1, 0xc5, 0x0f, - 0x67, 0x87, 0xcf, 0xea, - 0x36, 0x2a, 0xa4, 0xd1, 0x5f, 0x26, 0xd6, 0xc2, 0x67, 0x85, 0x47, 0x3c, - 0x58, 0x3c, 0x30, 0x7b, - 0xa0, 0x7d, 0x80, 0x0c, 0x70, 0x7f, 0xf7, 0xf0, 0x33, 0xd8, 0xe4, 0x31, - 0x79, 0x1c, 0xdb, 0x64, - 0x4a, 0x91, 0x4c, 0x90, 0x49, 0x52, 0xc6, 0x19, 0x3d, 0x9a, 0xfc, 0xf9, - 0x88, 0x74, 0x97, 0xde, - 0xc4, 0x97, 0x7b, 0xac, 0xf1, 0xac, 0x0c, 0xca, 0x7f, 0xca, 0x76, 0x9b, - 0x33, 0x3c, 0xa2, 0x5b, - 0x28, 0xc6, 0x7e, 0x59, 0xbb, 0x39, 0x6f, 0x8d, 0x78, 0xb4, 0x70, 0x60, - 0xee, 0xb3, 0xf6, 0xfe, - 0xe2, 0x85, 0x7a, 0x7a, 0xd7, 0x5b, 0x7a, 0x49, 0x4f, 0x62, 0xaf, 0x27, - 0x9f, 0x9e, 0xd1, 0xdf, - 0x28, 0x6d, 0x02, 0x1b, 0x0f, 0x32, 0x7a, 0x19, 0xf7, 0xcc, 0x08, 0x8f, - 0x0a, 0xd9, 0xeb, 0xd7, - 0x8a, 0xb7, 0x6e, 0xa3, 0x1e, 0x1c, 0xff, 0x74, 0x66, 0x7f, 0x5b, 0xbf, - 0xfc, 0xbe, 0x46, 0x5f, - 0x09, 0x0a, 0xfa, 0xfa, 0xd9, 0xfa, 0x3b, 0xfa, 0x16, 0x3e, 0x9e, 0x7b, - 0x47, 0x7d, 0xd8, 0xe8, - 0x50, 0x4e, 0xfc, 0xd5, 0xf3, 0xe4, 0xa8, 0x3b, 0x26, 0x3f, 0x9c, 0xd0, - 0xd3, 0x20, 0xca, 0xf2, - 0xfa, 0xe6, 0xf7, 0xb5, 0xf7, 0x71, 0xf4, 0x31, 0xfa, 0x88, 0xbe, 0xec, - 0x7d, 0x1d, 0x7d, 0x6d, - 0xfd, 0x1c, 0xfd, 0xed, 0xcf, 0x38, 0x9e, 0xa8, 0xbc, 0x2f, 0x45, 0xed, - 0x85, 0xa1, 0xf8, 0xfa, - 0x6d, 0xd8, 0x4d, 0xd9, 0x22, 0xac, 0xa1, 0xdb, 0xa8, 0x3b, 0x6a, 0xef, - 0x8f, 0x7f, 0xa8, 0xf4, - 0xb1, 0x8c, 0x7f, 0x16, 0xf6, 0x18, 0xdb, 0xa3, 0xb0, 0x7b, 0xee, 0xe3, - 0xe3, 0xff, 0x91, 0xf5, - 0xc0, 0xa4, 0xbb, 0x93, 0x6e, 0x65, 0xff, 0x53, 0x7b, 0x60, 0xb7, 0x50, - 0x7c, 0xfd, 0x26, 0x6d, - 0x17, 0xde, 0xc0, 0xd5, 0x88, 0x8d, 0xd4, 0xa5, 0x3e, 0x63, 0xa7, 0x90, - 0xad, 0x42, 0x08, 0x21, - 0x30, 0xfe, 0x1f, 0x7e, 0x26, 0xe7, 0x5b -}; +/******************************************************************* + * Image File : /public/dkpro.bmp + * Width : 218 + * Height : 65 + * + * This header contains a compressed Zip image. + * Use zlib1.2.3 uncompress function to restore. + *******************************************************************/ + +#define dkpro_RAW 28340 +#define dkpro_COMPRESSED 6887 +#define dkpro_WIDTH 218 +#define dkpro_HEIGHT 65 + +unsigned char dkpro[6887] = { + 0x78, 0xda, 0xed, 0x9c, 0x67, 0x70, 0x54, 0x57, 0x96, 0xc7, 0xf9, 0xb8, + 0xb5, 0x55, 0xbb, 0x55, + 0x53, 0xb5, 0xb5, 0xb3, 0x9e, 0x31, 0xc6, 0x98, 0x20, 0x31, 0xf6, 0x38, + 0x7b, 0xc6, 0x33, 0x0e, + 0xe3, 0x34, 0x60, 0x03, 0x36, 0xc9, 0x80, 0x49, 0xb6, 0x41, 0x42, 0x59, + 0x42, 0x39, 0x20, 0x75, + 0xbf, 0xd3, 0x92, 0x90, 0x84, 0x32, 0x41, 0x02, 0x11, 0xd4, 0x48, 0xe4, + 0x60, 0x72, 0x0e, 0x22, + 0x98, 0x8c, 0x8d, 0x04, 0x26, 0x83, 0x31, 0xe0, 0xec, 0x71, 0x06, 0xe7, + 0xa0, 0xfd, 0xdd, 0xdb, + 0xdd, 0xaf, 0x5f, 0xb7, 0xba, 0x07, 0x30, 0xc6, 0xf6, 0x87, 0xd6, 0xbf, + 0x1e, 0xb4, 0x6e, 0x38, + 0xf7, 0xe4, 0x7b, 0xee, 0x7b, 0x4f, 0xdd, 0x4e, 0xda, 0x5d, 0x1d, 0xaa, + 0xc3, 0x52, 0xba, 0x38, + 0x3b, 0x46, 0x75, 0x70, 0xb6, 0x8f, 0xbd, 0xb1, 0xfe, 0xc6, 0xf8, 0x3f, + 0x3a, 0x6f, 0x8c, 0x6f, + 0xef, 0xbc, 0x29, 0xb6, 0xa3, 0xb3, 0x53, 0x74, 0x57, 0x67, 0xb7, 0x88, + 0x76, 0x12, 0xc2, 0x6f, + 0x06, 0x55, 0xe1, 0xd8, 0xea, 0xe6, 0xa8, 0x3f, 0x38, 0xc3, 0x62, 0xfa, + 0xd5, 0x94, 0xc4, 0x2f, + 0x28, 0xdd, 0x91, 0x71, 0x74, 0xdc, 0xf9, 0xdc, 0x0b, 0x85, 0xa7, 0x72, + 0x0f, 0x8c, 0x5f, 0x95, + 0x59, 0x37, 0x29, 0x32, 0xf1, 0xfe, 0xfa, 0x3f, 0xc4, 0xb4, 0x77, 0x76, + 0x8a, 0x09, 0x9b, 0x15, + 0xb2, 0xdd, 0xaf, 0x6f, 0xaf, 0xb0, 0x94, 0x9b, 0x89, 0xa3, 0xbe, 0x93, + 0x9d, 0x09, 0xef, 0x39, + 0x5a, 0xed, 0xad, 0x12, 0x0c, 0x3f, 0xca, 0x8e, 0xca, 0x84, 0x94, 0xdb, + 0x9d, 0xed, 0xa3, 0xba, + 0x84, 0xec, 0xf6, 0x6b, 0xda, 0x2b, 0xf5, 0x26, 0x67, 0x58, 0x74, 0xe5, + 0xf8, 0x7f, 0x65, 0x6a, + 0xab, 0x18, 0xdf, 0x49, 0x50, 0x18, 0x3f, 0xb8, 0x6c, 0x37, 0x6e, 0x5d, + 0xee, 0xd3, 0x33, 0x6e, + 0x88, 0xeb, 0xec, 0xec, 0x16, 0x19, 0xd2, 0xe0, 0x2f, 0x9f, 0x0f, 0x3b, + 0xd4, 0xdf, 0x1b, 0x35, + 0xaf, 0xa8, 0x75, 0x6c, 0x2b, 0xf6, 0xf8, 0xc6, 0xf8, 0x46, 0x3c, 0xf8, + 0x9e, 0x98, 0xf2, 0x46, + 0xd7, 0x0f, 0xf2, 0xad, 0x78, 0xfb, 0xbe, 0x33, 0x68, 0xcd, 0x3f, 0x69, + 0x1b, 0x36, 0xfd, 0xa6, + 0xd8, 0x2e, 0xd5, 0xed, 0x52, 0x43, 0x9a, 0xfc, 0x85, 0x50, 0xdd, 0x2d, + 0xa5, 0xb3, 0xb3, 0x43, + 0x74, 0x69, 0x49, 0x6b, 0x76, 0xab, 0xf1, 0xb5, 0x7c, 0xa5, 0xa1, 0x6c, + 0xe5, 0xb2, 0xd3, 0x27, + 0x72, 0x52, 0xf6, 0xcb, 0x36, 0x69, 0x92, 0x5d, 0x72, 0x48, 0xde, 0x96, + 0x1f, 0xdc, 0xd6, 0xfb, + 0x56, 0xdc, 0x63, 0x0d, 0x6c, 0x5a, 0xb0, 0x3b, 0xef, 0xfe, 0xfa, 0x9b, + 0xa2, 0xc3, 0xab, 0xda, + 0xa5, 0x84, 0x34, 0x7a, 0xfd, 0xd1, 0xcd, 0xd9, 0x61, 0x74, 0x8f, 0xca, + 0x8f, 0x53, 0x5b, 0x8d, + 0xaf, 0xe4, 0x4b, 0x8d, 0x6f, 0xb0, 0xc9, 0xb7, 0x72, 0x5c, 0xe6, 0x48, + 0x86, 0x3c, 0x2b, 0x4f, + 0x4b, 0x5f, 0xe9, 0x2f, 0x03, 0x40, 0x7f, 0xe9, 0x27, 0x7d, 0xf8, 0x3d, + 0x5a, 0x2a, 0x65, 0x27, + 0xb6, 0x6c, 0xc5, 0xae, 0xae, 0x19, 0x5f, 0x2a, 0xbb, 0x95, 0x8c, 0xcf, + 0xea, 0xe8, 0x0c, 0x8b, + 0x0a, 0x69, 0xf4, 0x7a, 0xc7, 0x58, 0x58, 0xca, 0x1f, 0xa7, 0x94, 0x24, + 0xfd, 0x68, 0xff, 0x46, + 0x2e, 0x6a, 0x7c, 0x85, 0x25, 0x3e, 0x90, 0x06, 0x19, 0x8d, 0xb5, 0x06, + 0xcb, 0x70, 0x79, 0x41, + 0x5e, 0x6c, 0x83, 0x11, 0x32, 0x84, 0xde, 0x61, 0x32, 0x4e, 0x5e, 0xd5, + 0xd6, 0xbd, 0xa4, 0x67, + 0x5e, 0x22, 0x4f, 0x1e, 0x9a, 0x78, 0x4b, 0xca, 0xef, 0x9d, 0x37, 0x24, + 0xdd, 0xe0, 0xbc, 0x21, + 0x31, 0x74, 0x5d, 0xdb, 0xd5, 0xa1, 0xaa, 0x5d, 0x7a, 0x20, 0x9b, 0x85, + 0xcd, 0xea, 0x34, 0x7a, + 0x4d, 0x61, 0x6b, 0xee, 0xe7, 0xc6, 0x67, 0xf2, 0x99, 0x7c, 0x4e, 0xdc, + 0x9c, 0x93, 0x72, 0xe2, + 0x69, 0x08, 0x96, 0x19, 0x75, 0x19, 0x8c, 0xc4, 0x76, 0x03, 0x24, 0x81, + 0xac, 0xf9, 0x9d, 0x7c, + 0x21, 0x9f, 0x69, 0x7c, 0x65, 0x04, 0xaf, 0x34, 0x43, 0xb8, 0x3a, 0xac, + 0x99, 0xdc, 0x21, 0xb9, + 0x6d, 0xdd, 0xd1, 0x35, 0xb5, 0xc3, 0xc4, 0xe6, 0x94, 0xef, 0xed, 0x9f, + 0x88, 0xc2, 0x25, 0x62, + 0xac, 0x51, 0x86, 0x62, 0x89, 0xc8, 0xab, 0xc0, 0x48, 0x79, 0x4e, 0xc6, + 0xca, 0x19, 0xec, 0xf6, + 0xa9, 0x7c, 0x12, 0xc2, 0xcf, 0x05, 0xea, 0x8a, 0x39, 0x35, 0x1d, 0x92, + 0xda, 0xc6, 0x58, 0x97, + 0xc8, 0x23, 0xf2, 0x95, 0xfd, 0x43, 0x51, 0xf8, 0x42, 0x8e, 0x92, 0x0f, + 0x87, 0x73, 0x45, 0x5d, + 0x35, 0x46, 0x92, 0x45, 0x17, 0x90, 0x1d, 0x3f, 0x96, 0x0f, 0x43, 0xf8, + 0x79, 0x60, 0x7c, 0x21, + 0x8d, 0x35, 0x37, 0x27, 0xf9, 0xd7, 0xf6, 0xed, 0x27, 0xee, 0x4e, 0xbd, + 0x64, 0x7f, 0x5f, 0xde, + 0x67, 0xff, 0xfa, 0x5a, 0x56, 0x90, 0x0d, 0x47, 0x4b, 0xec, 0x4f, 0x44, + 0x8c, 0x3c, 0x2f, 0x42, + 0xa4, 0xaa, 0x5a, 0x32, 0x84, 0x6b, 0xc3, 0x87, 0x58, 0xe4, 0x7d, 0xe3, + 0x73, 0x69, 0xf0, 0xb3, + 0x99, 0xaa, 0x15, 0xe7, 0x17, 0x7c, 0x99, 0xf7, 0xae, 0xbc, 0x2b, 0xef, + 0x11, 0x8b, 0x33, 0x89, + 0xb0, 0x38, 0x89, 0xbf, 0x26, 0x44, 0x63, 0x37, 0xb5, 0xcb, 0x85, 0x70, + 0x2d, 0x18, 0x28, 0x47, + 0x88, 0xa1, 0x77, 0x8d, 0x4f, 0xc5, 0xe9, 0x67, 0xb3, 0x9b, 0xa7, 0x66, + 0xc4, 0x7d, 0x61, 0x7f, + 0xdb, 0xf1, 0x16, 0xe7, 0xad, 0xcf, 0x64, 0xaa, 0x44, 0x48, 0xa2, 0x24, + 0x5d, 0x33, 0x12, 0x43, + 0xb8, 0x66, 0x8c, 0x94, 0x63, 0xc4, 0xd1, 0x5b, 0xc6, 0x47, 0x52, 0x6f, + 0xb5, 0x59, 0x75, 0x97, + 0xd4, 0xbf, 0x95, 0x5f, 0x4c, 0xbf, 0x60, 0x9c, 0x97, 0xf3, 0xd8, 0x74, + 0x16, 0x95, 0x44, 0x4a, + 0x08, 0xbf, 0x11, 0x44, 0xc9, 0x6b, 0xf2, 0x96, 0x9c, 0x37, 0x3e, 0x90, + 0xe9, 0x35, 0x1d, 0x4d, + 0x9b, 0x85, 0x3b, 0x3b, 0x8e, 0xde, 0xe6, 0x78, 0xdb, 0x7e, 0x56, 0xce, + 0x62, 0xd1, 0xd5, 0xec, + 0x46, 0x69, 0x57, 0x81, 0x74, 0x13, 0x69, 0xd7, 0x1d, 0xe9, 0x57, 0xb9, + 0x5a, 0xaa, 0xbe, 0x52, + 0xaf, 0x61, 0x95, 0xf4, 0x5f, 0x54, 0xbe, 0x40, 0x88, 0x91, 0x43, 0x44, + 0xd2, 0x59, 0xe3, 0x5d, + 0x99, 0x66, 0xb1, 0xd9, 0x2d, 0x75, 0xa9, 0x71, 0x1f, 0xd8, 0x4f, 0x3b, + 0x4e, 0xcb, 0x1b, 0xd2, + 0xcc, 0xf9, 0x2a, 0x53, 0xb2, 0xae, 0x10, 0x99, 0x3e, 0x92, 0xa4, 0x4b, + 0xc6, 0x15, 0xcf, 0xbc, + 0x7a, 0x64, 0xfa, 0x69, 0x2d, 0xfd, 0xdf, 0xf2, 0x99, 0x89, 0xa5, 0xd4, + 0x8e, 0xea, 0xaa, 0x63, + 0xa3, 0xf1, 0xc3, 0x64, 0x66, 0x5c, 0xfd, 0x2a, 0x69, 0x7e, 0xf2, 0x65, + 0x5e, 0x47, 0x09, 0x03, + 0x23, 0x41, 0x0e, 0x12, 0x4b, 0xa7, 0x8d, 0x37, 0x65, 0xaa, 0xc7, 0x66, + 0xd4, 0x8b, 0xb7, 0x54, + 0x9d, 0x4d, 0x3f, 0x65, 0x9c, 0x90, 0x93, 0xf4, 0x8d, 0x83, 0xab, 0xb1, + 0x57, 0x88, 0x2c, 0x19, + 0x23, 0x2f, 0xc8, 0x30, 0xce, 0xdb, 0x0a, 0xc3, 0xa9, 0x33, 0xd3, 0x25, + 0xfb, 0x8a, 0x67, 0x5f, + 0x1d, 0x72, 0xd0, 0x57, 0x2c, 0x27, 0xc5, 0xa1, 0xe6, 0x6a, 0xa3, 0x69, + 0xc9, 0x09, 0x3a, 0x3e, + 0x93, 0x9d, 0x40, 0x5d, 0xb1, 0x54, 0x52, 0xb1, 0x58, 0x2f, 0x8d, 0x2c, + 0x93, 0xa6, 0xc7, 0xe7, + 0xc0, 0xa3, 0xb2, 0x4d, 0x86, 0x86, 0xb2, 0x81, 0x97, 0xe7, 0x6c, 0x2c, + 0xfd, 0xa2, 0x29, 0x91, + 0x15, 0x43, 0x59, 0xf1, 0x79, 0xf6, 0x0c, 0x65, 0xfb, 0x8c, 0xeb, 0x26, + 0x65, 0x20, 0x24, 0xcb, + 0x2b, 0x72, 0x5a, 0x4e, 0xb0, 0x6f, 0xd5, 0xd6, 0xba, 0x6c, 0xd6, 0x6d, + 0x56, 0xc7, 0x48, 0x5b, + 0xd1, 0xf9, 0x9c, 0x23, 0x54, 0x27, 0xa7, 0x39, 0x53, 0x65, 0x88, 0xed, + 0x8a, 0xa1, 0xfc, 0x6e, + 0xbf, 0x6c, 0x91, 0xcd, 0x1a, 0x4d, 0xf2, 0x2a, 0x3a, 0xcd, 0x11, 0xfb, + 0x55, 0x50, 0xb8, 0x72, + 0xe4, 0xa2, 0x77, 0xa7, 0xec, 0x34, 0x57, 0xdb, 0x2e, 0x6b, 0xa9, 0x93, + 0xc6, 0x06, 0x1d, 0x9f, + 0x49, 0x74, 0xf9, 0xde, 0x45, 0xa8, 0x46, 0xe3, 0x36, 0xb8, 0xcb, 0xc1, + 0xd3, 0x46, 0x70, 0xee, + 0x1f, 0xa4, 0x31, 0x84, 0x3d, 0x3e, 0x03, 0xea, 0x36, 0xdd, 0x97, 0xc9, + 0x2a, 0x07, 0x90, 0x64, + 0x73, 0x1b, 0x34, 0xc9, 0x4a, 0x99, 0x27, 0xe5, 0xd8, 0x7d, 0x04, 0x67, + 0xcf, 0x04, 0x2c, 0x9d, + 0x7b, 0x5d, 0xe4, 0x0c, 0xa4, 0xe5, 0xfd, 0x72, 0x5c, 0x8e, 0x18, 0x67, + 0x64, 0xb2, 0x3b, 0xce, + 0xc2, 0x9d, 0x5d, 0x22, 0x0f, 0x18, 0x47, 0x8c, 0x43, 0x72, 0x98, 0xbd, + 0x6e, 0xac, 0x18, 0x72, + 0xa5, 0x3f, 0x06, 0x3e, 0x99, 0xe2, 0xa7, 0x97, 0xdb, 0xd0, 0xc8, 0xf5, + 0xf9, 0xb1, 0xa1, 0xdb, + 0x26, 0x9f, 0xb5, 0xde, 0x94, 0x87, 0xd0, 0x72, 0xb0, 0x9f, 0x4c, 0xa2, + 0xe2, 0x0b, 0xf9, 0xc1, + 0x7c, 0xbe, 0xd7, 0x0a, 0xb7, 0x23, 0x34, 0xd7, 0x69, 0x52, 0x88, 0x77, + 0x36, 0xbb, 0x71, 0x48, + 0x5a, 0x88, 0x44, 0x97, 0xdc, 0x06, 0xd6, 0x7b, 0xfe, 0xb2, 0x77, 0x90, + 0xbe, 0xc6, 0xaa, 0xd1, + 0xc4, 0x62, 0x16, 0x3c, 0xfd, 0x12, 0x3f, 0x59, 0xb2, 0x07, 0xcb, 0x1c, + 0x32, 0x4e, 0xca, 0xc4, + 0x9a, 0x8e, 0x89, 0xca, 0x66, 0x9d, 0xa7, 0x45, 0xc4, 0xbe, 0x6e, 0x6f, + 0x76, 0x34, 0x13, 0x67, + 0x0d, 0x70, 0x5d, 0x70, 0x85, 0x28, 0xe4, 0x4a, 0xc3, 0x2b, 0x5b, 0x3d, + 0xf7, 0xf1, 0x41, 0xab, + 0xfc, 0x51, 0xf2, 0xe8, 0x29, 0xbc, 0x62, 0x2a, 0x57, 0xbe, 0x9a, 0x90, + 0xb3, 0x56, 0xc9, 0x8f, + 0xe6, 0x5a, 0xdf, 0xc9, 0x51, 0xb9, 0x5b, 0xf2, 0x03, 0xae, 0xa5, 0xda, + 0x72, 0xb0, 0xd0, 0xa7, + 0xe8, 0xd7, 0xcb, 0x9b, 0xca, 0xe3, 0xaa, 0x27, 0x85, 0x59, 0xea, 0xf9, + 0x83, 0x0b, 0xad, 0x9c, + 0xfb, 0x9f, 0xc0, 0x66, 0x8a, 0xeb, 0x7c, 0xf4, 0x33, 0xd8, 0x47, 0xa2, + 0x40, 0xf8, 0x5a, 0x3f, + 0x7b, 0x9a, 0x43, 0x8c, 0x8e, 0x15, 0xc7, 0xcf, 0x2e, 0x69, 0x5b, 0xe4, + 0xc9, 0x6e, 0xfc, 0xaa, + 0xd9, 0x38, 0x26, 0xd5, 0x6e, 0x9b, 0xdd, 0x34, 0x71, 0x69, 0x6a, 0x8b, + 0x71, 0x80, 0x9c, 0xb9, + 0x5f, 0x8a, 0xd8, 0xcd, 0x8a, 0x2e, 0x8b, 0x62, 0xa0, 0xfe, 0x1d, 0xa7, + 0x33, 0x49, 0xab, 0x7c, + 0x6e, 0xa2, 0x55, 0xda, 0xe3, 0xf9, 0x81, 0x66, 0x78, 0xe7, 0xfd, 0x34, + 0x14, 0xc3, 0xfb, 0x48, + 0x59, 0x21, 0xdf, 0x9a, 0x6b, 0x7d, 0x45, 0x5e, 0xb8, 0x87, 0xd6, 0x60, + 0x34, 0xf3, 0xc8, 0x9c, + 0x1f, 0x11, 0x69, 0x17, 0xdd, 0x50, 0x36, 0x8b, 0xd0, 0x12, 0xa6, 0xd0, + 0xe7, 0xe5, 0xfa, 0x12, + 0x67, 0x9b, 0xfb, 0x89, 0x98, 0x22, 0xdd, 0x97, 0x43, 0xae, 0xb4, 0x4a, + 0x14, 0x1c, 0xad, 0x64, + 0xea, 0x61, 0x78, 0xd2, 0xb8, 0x9f, 0x20, 0x4b, 0xb1, 0x45, 0x2b, 0x97, + 0x87, 0x21, 0x3b, 0xd8, + 0x75, 0x0e, 0x18, 0x87, 0xa5, 0xb2, 0x16, 0x9b, 0x55, 0x87, 0xa5, 0xdc, + 0x56, 0x71, 0x32, 0x75, + 0xaf, 0xec, 0x25, 0xde, 0x97, 0xb2, 0x7e, 0x69, 0x50, 0x94, 0x81, 0x52, + 0x19, 0x2f, 0x25, 0x7a, + 0xad, 0x12, 0x3e, 0x95, 0x92, 0xd1, 0x93, 0xd0, 0xa2, 0xf7, 0x9e, 0x58, + 0xab, 0x74, 0x44, 0x8b, + 0xae, 0x91, 0xbe, 0x33, 0xc6, 0xb9, 0x65, 0x73, 0xcd, 0xf3, 0x8c, 0x08, + 0xbe, 0x8e, 0xff, 0x88, + 0x32, 0x68, 0x44, 0xc1, 0xe1, 0x25, 0x73, 0xad, 0xcf, 0x90, 0xe3, 0x7e, + 0xe8, 0x05, 0xa3, 0x95, + 0x0f, 0x6f, 0xff, 0x72, 0x3f, 0x13, 0x72, 0xd9, 0x4c, 0xd5, 0x91, 0x6a, + 0x6c, 0x06, 0x36, 0xfb, + 0xc6, 0xa4, 0xf3, 0x09, 0x67, 0x9f, 0x07, 0xd0, 0xbd, 0x8b, 0x8a, 0x8d, + 0x4a, 0xe3, 0xfb, 0x2b, + 0xbc, 0x03, 0xf8, 0x23, 0xd6, 0xcf, 0x80, 0x83, 0xc0, 0x72, 0x28, 0xb9, + 0x95, 0xb4, 0xe3, 0x03, + 0x68, 0xa3, 0xc8, 0xad, 0x8f, 0x62, 0xb7, 0x36, 0x4a, 0xff, 0x8d, 0x3e, + 0x4a, 0x89, 0xff, 0x6d, + 0xb2, 0x4f, 0xf6, 0x1a, 0xcd, 0x52, 0xae, 0x6a, 0x90, 0xea, 0xce, 0xa9, + 0x11, 0x25, 0xcd, 0x59, + 0x3b, 0xd9, 0xdb, 0xf7, 0x4b, 0x0d, 0x3b, 0x6c, 0x45, 0x10, 0x54, 0x72, + 0x95, 0xb3, 0x82, 0x50, + 0x31, 0x25, 0xe3, 0xb1, 0x69, 0xd8, 0xab, 0x10, 0xaf, 0x4c, 0x42, 0x2b, + 0xef, 0x9a, 0xf8, 0x5e, + 0x6e, 0x81, 0x97, 0x4a, 0x0d, 0x35, 0xab, 0x4c, 0x7b, 0x49, 0x26, 0xe3, + 0xe3, 0x75, 0xed, 0x36, + 0x86, 0xdc, 0x63, 0xc0, 0x69, 0x99, 0x9b, 0x66, 0x39, 0x1c, 0x15, 0x61, + 0xe5, 0x7c, 0x33, 0xa7, + 0x95, 0x68, 0x1e, 0x5c, 0xab, 0x95, 0x40, 0xcb, 0xd3, 0x33, 0x8e, 0xbe, + 0x18, 0x59, 0x2c, 0x1f, + 0x9b, 0x6b, 0x7d, 0x88, 0x9f, 0xfd, 0x4d, 0x53, 0x2a, 0x63, 0x64, 0xa1, + 0x39, 0x32, 0x9f, 0xb1, + 0xc5, 0x9a, 0xd7, 0x6c, 0xe9, 0x21, 0x37, 0x49, 0x07, 0x8d, 0x9b, 0xc1, + 0x7d, 0xd8, 0x4a, 0x71, + 0xa4, 0xb8, 0xb8, 0x68, 0xd2, 0x79, 0x5f, 0xce, 0xc9, 0x5f, 0x90, 0x64, + 0x9c, 0x5e, 0x5b, 0xd8, + 0xcf, 0xbe, 0xb4, 0x48, 0xa4, 0x70, 0xc9, 0x8d, 0x4f, 0xf1, 0x01, 0x6b, + 0xfb, 0x47, 0xb2, 0x4b, + 0x06, 0x6a, 0x69, 0x8a, 0xcd, 0xf5, 0x0b, 0xa1, 0x5f, 0xaa, 0xa5, 0xb2, + 0xe9, 0x3a, 0x3d, 0x9f, + 0xcf, 0x15, 0xa6, 0x36, 0x4a, 0xdc, 0xfa, 0x8b, 0xd7, 0x77, 0x64, 0x93, + 0xa8, 0x2e, 0x6c, 0x3a, + 0x4e, 0xca, 0x4d, 0x8d, 0x05, 0x42, 0x09, 0x75, 0xd7, 0x2e, 0xd9, 0x49, + 0x2e, 0x2c, 0xad, 0xb9, + 0x25, 0x91, 0x9a, 0x71, 0x74, 0x4d, 0xc1, 0xee, 0xbc, 0xed, 0x54, 0x61, + 0x5b, 0x99, 0x39, 0x31, + 0x28, 0x26, 0x40, 0x73, 0x1c, 0xd2, 0xa6, 0xf0, 0x79, 0x31, 0x15, 0x54, + 0x23, 0xdc, 0xc4, 0xea, + 0x3a, 0xfa, 0x23, 0x64, 0xf6, 0xe0, 0x92, 0x74, 0x41, 0x57, 0xae, 0xf1, + 0x55, 0x7c, 0xca, 0x65, + 0x44, 0x3a, 0xf5, 0xda, 0x22, 0xd9, 0x48, 0xfd, 0xb0, 0x89, 0x99, 0x55, + 0x50, 0x88, 0x25, 0x7f, + 0x96, 0xd2, 0xaa, 0xc6, 0x14, 0xf3, 0x39, 0x85, 0x2a, 0x4c, 0x21, 0x09, + 0xaf, 0x55, 0x3d, 0x13, + 0x98, 0x5f, 0x05, 0xa7, 0x79, 0xcc, 0x4d, 0xd4, 0x3d, 0x63, 0xb0, 0xbb, + 0xb0, 0xef, 0x2f, 0x40, + 0x53, 0x9e, 0xb5, 0xde, 0x26, 0x63, 0x3c, 0xc4, 0xb8, 0x4a, 0xf4, 0x94, + 0x61, 0xd2, 0x48, 0xe4, + 0xd3, 0x58, 0xb4, 0x53, 0xae, 0xf5, 0x1f, 0x47, 0x75, 0x38, 0x50, 0x9e, + 0x05, 0x83, 0xb0, 0x45, + 0xaa, 0xf6, 0xef, 0x5c, 0x72, 0x6c, 0x16, 0xda, 0xf7, 0xd0, 0xb9, 0xc0, + 0x09, 0xe7, 0x2f, 0xd0, + 0xce, 0x40, 0xa2, 0x32, 0x68, 0x8d, 0xc4, 0x2f, 0xce, 0x59, 0xf0, 0x31, + 0x19, 0x55, 0xdd, 0x8d, + 0x48, 0x86, 0xaf, 0x3d, 0x96, 0x79, 0x0a, 0x5f, 0xca, 0x3f, 0xb1, 0x93, + 0xb2, 0x4f, 0xaa, 0x7b, + 0xfd, 0x64, 0x5d, 0x83, 0xd9, 0xb0, 0x4a, 0xae, 0x4c, 0x41, 0xee, 0x32, + 0x56, 0x74, 0xc9, 0x53, + 0x8a, 0xb7, 0xc6, 0xe1, 0xeb, 0x65, 0x48, 0xb1, 0x01, 0x2b, 0x6c, 0x95, + 0x97, 0x64, 0x2a, 0x72, + 0xc5, 0x60, 0xc5, 0x12, 0xfa, 0x27, 0x04, 0xd5, 0x7d, 0x05, 0x9a, 0xdb, + 0x21, 0xdb, 0x8d, 0xbd, + 0x52, 0x8c, 0xcd, 0xc2, 0x67, 0x75, 0x89, 0x58, 0x23, 0x5b, 0xed, 0x8a, + 0xc2, 0x32, 0x66, 0xd5, + 0x04, 0xc5, 0x04, 0x38, 0x8b, 0xa6, 0xd6, 0x3d, 0x8f, 0xae, 0x2e, 0xf0, + 0xef, 0x9b, 0x68, 0xaf, + 0x45, 0xd7, 0xcc, 0xef, 0x51, 0x83, 0x79, 0xf0, 0xb1, 0x84, 0xa1, 0x2b, + 0xd7, 0xf8, 0xf1, 0xe8, + 0xcf, 0x4e, 0x2c, 0xbc, 0xa9, 0x67, 0x78, 0xf4, 0xa3, 0x3e, 0x6f, 0xd5, + 0xf7, 0x26, 0xca, 0xe0, + 0xa6, 0x1a, 0xc9, 0x8e, 0xa0, 0xb3, 0xe3, 0x6e, 0xbc, 0x41, 0x6b, 0x1e, + 0xed, 0x35, 0xf4, 0xe4, + 0xc9, 0x5c, 0x79, 0xdd, 0xec, 0x39, 0x2f, 0x93, 0xc8, 0x5a, 0xf3, 0x98, + 0xed, 0x59, 0xeb, 0x1c, + 0x72, 0x3f, 0xcc, 0xb8, 0x12, 0x7c, 0x60, 0xbb, 0x9c, 0x32, 0x47, 0x9e, + 0x24, 0x72, 0xd4, 0xee, + 0x57, 0x01, 0x85, 0x63, 0x8c, 0x3b, 0xe5, 0xc6, 0x05, 0xc6, 0xaa, 0x13, + 0x65, 0x33, 0x23, 0x4e, + 0xca, 0x19, 0x0b, 0xd7, 0x67, 0x98, 0x75, 0x02, 0x7a, 0x55, 0x68, 0xb5, + 0x08, 0x0b, 0x59, 0x25, + 0x3a, 0xcd, 0xce, 0xd5, 0x0e, 0xdf, 0x78, 0x4c, 0x1e, 0x91, 0xbb, 0xe4, + 0x77, 0xe8, 0xf9, 0xbc, + 0xa5, 0xef, 0x7d, 0xe4, 0xcf, 0x46, 0xef, 0xfb, 0x2d, 0xeb, 0xbf, 0x23, + 0x3d, 0xb1, 0xcd, 0x7e, + 0xfe, 0x7f, 0x0b, 0x7f, 0xce, 0xa3, 0x77, 0x32, 0x12, 0x95, 0xe9, 0xfb, + 0x28, 0x4d, 0x70, 0xf1, + 0x8e, 0xa9, 0x8d, 0xf3, 0xa2, 0xee, 0xed, 0x1e, 0x84, 0xdb, 0x18, 0xae, + 0x6a, 0xc6, 0x05, 0xd3, + 0xfd, 0x7a, 0x66, 0x6e, 0x31, 0x76, 0xca, 0x38, 0x6c, 0x16, 0xe6, 0xbc, + 0x3b, 0x62, 0x9b, 0x7d, + 0x23, 0x51, 0xb0, 0x59, 0x66, 0xe3, 0x17, 0x53, 0x03, 0xa0, 0x8e, 0xab, + 0x16, 0x2f, 0x89, 0x23, + 0x7f, 0xbe, 0x4e, 0xad, 0x76, 0xc4, 0xc4, 0x71, 0xd6, 0x2c, 0x83, 0x73, + 0x6f, 0xcb, 0x3b, 0xf2, + 0x27, 0x24, 0xaf, 0x63, 0x1d, 0x65, 0xb1, 0x25, 0x70, 0x75, 0xdc, 0xd2, + 0xeb, 0xc1, 0x09, 0xe6, + 0x4d, 0xc2, 0x27, 0x2b, 0x91, 0x25, 0x4b, 0x66, 0xa0, 0xb3, 0xa3, 0x6e, + 0xa8, 0xf3, 0xe1, 0x08, + 0x78, 0x9f, 0x8a, 0x04, 0xf1, 0xd8, 0xfb, 0x84, 0xbb, 0xfd, 0x18, 0x2b, + 0xdf, 0x43, 0x04, 0xcc, + 0x46, 0x37, 0x5e, 0x2a, 0xeb, 0xd0, 0x63, 0x29, 0xe3, 0x96, 0x6b, 0xbe, + 0x5c, 0x38, 0x8e, 0x1e, + 0x9f, 0x64, 0x9f, 0xab, 0x86, 0x7a, 0x32, 0xf6, 0x39, 0x6e, 0xf6, 0x9c, + 0x47, 0x02, 0x75, 0xd7, + 0x7b, 0xbf, 0xa6, 0xea, 0xcb, 0xd1, 0x31, 0xdd, 0x1f, 0x8f, 0x56, 0xcb, + 0xd8, 0x35, 0xcf, 0xf9, + 0xf4, 0x29, 0x99, 0xaa, 0x65, 0x1a, 0x98, 0x04, 0xb7, 0xd1, 0xf8, 0x95, + 0xb7, 0xef, 0x0d, 0xe8, + 0x25, 0x43, 0x75, 0xa7, 0xc9, 0xe9, 0x51, 0xc6, 0x77, 0x14, 0x75, 0x77, + 0x42, 0xf5, 0x9f, 0xe3, + 0xdc, 0x9f, 0x8a, 0xf6, 0x14, 0x2f, 0x53, 0x91, 0xfa, 0x44, 0x00, 0x6d, + 0x28, 0x7f, 0x5c, 0xcf, + 0xb8, 0x12, 0xb4, 0xe6, 0xd2, 0xb6, 0x3f, 0x6a, 0x64, 0x0d, 0x16, 0xda, + 0x68, 0x6c, 0x93, 0x82, + 0xda, 0x5b, 0x92, 0xba, 0xce, 0x78, 0x2a, 0xea, 0x65, 0xfb, 0x5a, 0xc7, + 0x5a, 0x66, 0xcd, 0x42, + 0x7b, 0x33, 0x03, 0x62, 0x06, 0x5a, 0xcc, 0x90, 0x85, 0xf0, 0xf3, 0x6a, + 0x1b, 0xbc, 0xe6, 0xf3, + 0xdb, 0x59, 0xf9, 0x33, 0x63, 0xa7, 0x63, 0x8b, 0x64, 0xe2, 0xf6, 0xb8, + 0xd9, 0x7e, 0x90, 0x1a, + 0xef, 0x08, 0xd7, 0x41, 0xb3, 0xe5, 0x04, 0xde, 0x93, 0x8e, 0x16, 0x4a, + 0xd0, 0xd1, 0x29, 0xb3, + 0xb5, 0x19, 0xe9, 0xfb, 0x41, 0x61, 0x06, 0x51, 0x92, 0x80, 0xdc, 0x9e, + 0xf6, 0xc3, 0x64, 0xd5, + 0x3f, 0x21, 0xbd, 0xd3, 0xb2, 0xde, 0x21, 0x32, 0xf4, 0xc3, 0x5a, 0x23, + 0x27, 0x2c, 0xf3, 0xcf, + 0xb1, 0x87, 0x75, 0x25, 0x5a, 0x66, 0x42, 0x7f, 0x0c, 0xb9, 0xac, 0xd9, + 0xec, 0x3b, 0xc9, 0x89, + 0x5a, 0x69, 0x78, 0xbb, 0xa5, 0xcd, 0x8a, 0x13, 0xf4, 0x67, 0xe1, 0x71, + 0xb1, 0x16, 0x7a, 0x2e, + 0x99, 0x6e, 0x83, 0x4f, 0xa5, 0x85, 0x5a, 0xb2, 0x5e, 0x86, 0x45, 0x2a, + 0x45, 0x33, 0x8a, 0xac, + 0x99, 0x44, 0xc4, 0xb7, 0x98, 0x6d, 0xc7, 0x90, 0xeb, 0x84, 0x65, 0xcd, + 0x74, 0xe4, 0xc9, 0xc1, + 0xe2, 0xc7, 0x03, 0xae, 0xea, 0xc2, 0x51, 0x59, 0x8b, 0x37, 0x4c, 0x64, + 0x54, 0x20, 0xfd, 0x4f, + 0xe3, 0x8c, 0xb3, 0x4e, 0xd6, 0x1a, 0x9b, 0xc5, 0x51, 0xd3, 0x29, 0xb1, + 0xcb, 0xb4, 0x11, 0xb1, + 0x9b, 0xed, 0x2b, 0x45, 0x61, 0x56, 0x10, 0x34, 0x60, 0x03, 0x55, 0x85, + 0x1d, 0x64, 0x1f, 0xbc, + 0x1c, 0x8e, 0xca, 0xed, 0x44, 0xeb, 0x34, 0x4e, 0x2d, 0xb5, 0x68, 0xc6, + 0xd3, 0xba, 0x1b, 0xfd, + 0x2e, 0x20, 0x67, 0xce, 0x87, 0xc6, 0x6e, 0xcb, 0xd8, 0x24, 0x72, 0xfd, + 0x64, 0x4e, 0x5d, 0x9b, + 0xd0, 0xad, 0xa7, 0xf5, 0x90, 0x0c, 0x65, 0xb5, 0xe9, 0x7a, 0x27, 0x7f, + 0xc5, 0x6c, 0x6d, 0x61, + 0x37, 0x7a, 0x8e, 0x5d, 0x62, 0x1a, 0x51, 0xe2, 0x69, 0xdb, 0x47, 0x1c, + 0xdf, 0x81, 0xcd, 0x5b, + 0x2c, 0xeb, 0x9c, 0x90, 0x07, 0xa5, 0x1b, 0x51, 0xd1, 0x08, 0xdf, 0x93, + 0xb1, 0xcf, 0x56, 0xcb, + 0x7a, 0x2d, 0xc4, 0x69, 0x2a, 0xb9, 0x78, 0x17, 0xda, 0x3b, 0xe4, 0xc3, + 0xf5, 0x1e, 0x1d, 0x1f, + 0xe7, 0xf4, 0x3e, 0x3b, 0x91, 0x68, 0x6b, 0xf6, 0xe9, 0x3d, 0x46, 0x5d, + 0x95, 0xaf, 0x2b, 0x3e, + 0x21, 0x6f, 0xd6, 0x5b, 0x38, 0x50, 0xdc, 0x0e, 0xc0, 0xce, 0xa9, 0xc4, + 0xc1, 0x1e, 0x0b, 0x17, + 0xbb, 0xcc, 0x55, 0x5b, 0x64, 0x14, 0x56, 0x2e, 0x46, 0x1f, 0x87, 0x2d, + 0xb3, 0x76, 0x6b, 0x1f, + 0x6e, 0xb1, 0xcc, 0xd9, 0x45, 0x4b, 0x0d, 0x23, 0xeb, 0xf0, 0xca, 0xb6, + 0x16, 0xa8, 0x27, 0x93, + 0x60, 0x21, 0x63, 0xbd, 0xd8, 0xb1, 0x59, 0xe7, 0xa9, 0x71, 0x71, 0xeb, + 0xec, 0xcb, 0x88, 0x89, + 0xa5, 0xe4, 0x9d, 0x40, 0x98, 0xc3, 0x35, 0x03, 0x49, 0x5f, 0x62, 0x17, + 0xdc, 0x6a, 0x62, 0x3b, + 0xfa, 0x6c, 0x61, 0x9d, 0x3d, 0x96, 0x36, 0x85, 0x83, 0x9c, 0x72, 0xeb, + 0xf4, 0xea, 0xbb, 0xcc, + 0xb6, 0x6d, 0x9c, 0x22, 0xba, 0xcb, 0x7f, 0xa2, 0xcb, 0x8e, 0x68, 0xf4, + 0x80, 0xd9, 0xbe, 0x03, + 0x4e, 0xa2, 0xb4, 0xef, 0x16, 0x22, 0x85, 0xa7, 0x75, 0x37, 0x96, 0xc9, + 0x81, 0x46, 0x1e, 0xeb, + 0x7a, 0x57, 0x3c, 0x2c, 0xe1, 0xec, 0x35, 0x0e, 0xfc, 0x61, 0xa7, 0xd9, + 0xf6, 0x32, 0x96, 0x79, + 0x1c, 0x7a, 0xdb, 0xcc, 0x75, 0x0e, 0xb1, 0xeb, 0xdc, 0x4a, 0x84, 0xce, + 0x85, 0xeb, 0x39, 0xe4, + 0x94, 0x34, 0xf6, 0xfa, 0x6d, 0xe6, 0xf8, 0x7d, 0x78, 0x47, 0x0e, 0x36, + 0x19, 0x2a, 0x37, 0xca, + 0x53, 0x16, 0x3e, 0xb6, 0xe3, 0x33, 0x37, 0x63, 0x97, 0x4e, 0xf2, 0x77, + 0xbd, 0xa3, 0x27, 0x92, + 0x93, 0xad, 0x32, 0xed, 0x97, 0xde, 0xfa, 0xe4, 0x9c, 0x8f, 0xd7, 0xcd, + 0xb1, 0xc8, 0xa5, 0xd0, + 0x42, 0x16, 0x2e, 0x64, 0xc7, 0x5a, 0xae, 0x6b, 0x38, 0xaf, 0xc4, 0xd6, + 0x35, 0xd5, 0x3d, 0xce, + 0x55, 0x96, 0xfe, 0x6d, 0x50, 0x4c, 0x93, 0x47, 0x39, 0x07, 0x6e, 0x41, + 0x06, 0xeb, 0x3a, 0xc3, + 0x89, 0xe7, 0x46, 0xad, 0x71, 0x5f, 0x34, 0x62, 0x1d, 0x6c, 0x64, 0xac, + 0x91, 0xbc, 0xda, 0x4e, + 0x89, 0x9d, 0x6a, 0xd3, 0x12, 0x56, 0xda, 0x17, 0x8b, 0xc2, 0x82, 0x20, + 0x98, 0x8f, 0x06, 0x33, + 0x58, 0x73, 0x9d, 0x89, 0x0d, 0xec, 0x7e, 0x0f, 0xc8, 0x7f, 0x53, 0x41, + 0xa7, 0xa2, 0xd7, 0x75, + 0x16, 0xec, 0x92, 0x7b, 0x89, 0x11, 0x55, 0x5d, 0x6c, 0x36, 0xdb, 0xb6, + 0x22, 0x53, 0x7b, 0x64, + 0x9e, 0x82, 0xff, 0x0f, 0x67, 0xc7, 0x6e, 0x32, 0x7b, 0xb6, 0x93, 0xc5, + 0xab, 0xd0, 0x52, 0x2c, + 0xa3, 0xd7, 0xbb, 0xdb, 0x36, 0x52, 0x67, 0x0c, 0xa3, 0x2d, 0x07, 0xcf, + 0xf2, 0xb4, 0x6d, 0xc2, + 0xfb, 0xee, 0x84, 0x8b, 0x22, 0x64, 0xda, 0x64, 0xe1, 0x62, 0x01, 0xb2, + 0x6c, 0x74, 0xff, 0xb6, + 0x1e, 0x4d, 0xdf, 0x4f, 0x66, 0x9e, 0x4a, 0x0e, 0x77, 0xf1, 0x3d, 0x83, + 0x75, 0xbd, 0x34, 0xd4, + 0x6a, 0x23, 0xb0, 0xfb, 0x1c, 0xec, 0x92, 0xc8, 0xce, 0xb6, 0xcd, 0x42, + 0x67, 0x39, 0x5c, 0x67, + 0x62, 0x97, 0x6a, 0xac, 0x3d, 0x4d, 0x47, 0xe7, 0x3a, 0x1f, 0xbc, 0x0c, + 0xcf, 0x0a, 0x5b, 0x2c, + 0xab, 0xbb, 0x78, 0x5d, 0x8a, 0x8f, 0xd4, 0x52, 0xd9, 0x2c, 0x82, 0xca, + 0x3a, 0x3f, 0xac, 0x67, + 0xf4, 0x2e, 0x6c, 0x96, 0x82, 0x57, 0x36, 0x59, 0xda, 0xf7, 0xb0, 0x5a, + 0x07, 0x2c, 0xd6, 0x97, + 0x9c, 0xbb, 0xce, 0x32, 0xaf, 0x09, 0x0e, 0x6c, 0x70, 0xb0, 0x30, 0x80, + 0x0d, 0xb4, 0x85, 0x8c, + 0x15, 0x32, 0x56, 0xd9, 0xac, 0x26, 0x2b, 0x71, 0xa9, 0xa1, 0x5a, 0x17, + 0x92, 0x69, 0x16, 0x07, + 0xc0, 0x12, 0x7a, 0x6a, 0xc8, 0x61, 0x6b, 0x90, 0xcc, 0x83, 0x2d, 0x9c, + 0x8b, 0xee, 0x85, 0xd3, + 0x5c, 0xf9, 0x07, 0xbe, 0xb7, 0xda, 0xd2, 0xb3, 0x59, 0xfe, 0x8a, 0xcd, + 0x0a, 0xf0, 0x8c, 0x95, + 0x66, 0xdb, 0x26, 0xec, 0xdb, 0x47, 0xdf, 0xcd, 0x53, 0x77, 0x79, 0x5f, + 0x44, 0x16, 0x4f, 0xcf, + 0x5a, 0x5a, 0x6d, 0xd8, 0x23, 0x85, 0x6b, 0xa5, 0x85, 0x46, 0x1f, 0x5d, + 0xe7, 0x7b, 0x57, 0xdc, + 0x28, 0x83, 0xd9, 0x17, 0xe6, 0x90, 0x9d, 0xaa, 0x7c, 0x56, 0x5b, 0x69, + 0x99, 0xb5, 0x16, 0x9e, + 0xd4, 0xbe, 0xf3, 0x12, 0x1c, 0xbb, 0xe0, 0xc4, 0xee, 0x8b, 0x64, 0x85, + 0x39, 0x62, 0x03, 0xbe, + 0x50, 0xa0, 0xa5, 0x9c, 0x42, 0x0e, 0x5c, 0x6b, 0xa1, 0xb2, 0x80, 0xaa, + 0x65, 0xb6, 0xce, 0x35, + 0x4b, 0xd8, 0x3d, 0x52, 0x2d, 0x7d, 0xff, 0x1e, 0x4d, 0x9c, 0x20, 0x5e, + 0x60, 0xef, 0xb0, 0xc3, + 0xdb, 0x4a, 0x9f, 0x9e, 0x55, 0xd8, 0x7d, 0x0d, 0x3e, 0x30, 0x15, 0x3f, + 0x49, 0xc1, 0x4b, 0x56, + 0x5b, 0x56, 0x5b, 0x2c, 0xff, 0xa7, 0x4f, 0x3f, 0x73, 0xe8, 0xb1, 0xea, + 0x75, 0x15, 0x5e, 0x16, + 0x41, 0x84, 0x2c, 0x69, 0x63, 0x89, 0x25, 0x2e, 0x3b, 0x1a, 0x4b, 0x25, + 0x5b, 0xc7, 0x59, 0x46, + 0xe2, 0x22, 0x43, 0x65, 0x92, 0xb9, 0x48, 0xb7, 0x2c, 0x00, 0x96, 0x33, + 0x63, 0x22, 0xd9, 0xdc, + 0x1b, 0x87, 0x8b, 0xe0, 0x32, 0x1c, 0xaf, 0x5f, 0x89, 0x7e, 0x6a, 0xd9, + 0x39, 0x97, 0x5a, 0xfc, + 0x61, 0x15, 0xf9, 0x45, 0xed, 0x66, 0x8d, 0x16, 0x6f, 0x59, 0x08, 0x1f, + 0x0b, 0x88, 0x9e, 0xb9, + 0x5c, 0xf3, 0xc1, 0x42, 0x0b, 0xa5, 0xa9, 0xd8, 0x70, 0x2e, 0x12, 0x64, + 0x41, 0xcb, 0xd3, 0xba, + 0x8c, 0x8c, 0x99, 0x48, 0xac, 0x2e, 0x31, 0x5b, 0x56, 0x10, 0x3f, 0xd5, + 0x70, 0x50, 0xee, 0xc3, + 0x87, 0x2f, 0x96, 0xe3, 0xb9, 0x39, 0x7a, 0xf6, 0x72, 0xf7, 0x35, 0x07, + 0xaf, 0xb2, 0xf2, 0xb1, + 0x9c, 0x1d, 0xb1, 0x98, 0x7f, 0x97, 0xc2, 0xa1, 0xcd, 0x42, 0x7d, 0x11, + 0x3b, 0xc6, 0x93, 0x8c, + 0x5e, 0xae, 0x67, 0x39, 0xa9, 0x19, 0x5e, 0x0a, 0x9a, 0x73, 0xac, 0x50, + 0x67, 0xa3, 0x1b, 0x91, + 0x60, 0x01, 0x59, 0x73, 0xa6, 0x4f, 0x74, 0x2c, 0xc1, 0x6f, 0x6f, 0x92, + 0xff, 0xa0, 0x16, 0xba, + 0x15, 0xff, 0x13, 0x7c, 0x7e, 0x91, 0xd9, 0xf7, 0x12, 0x5c, 0x0e, 0x40, + 0x8a, 0x15, 0x7c, 0x9a, + 0xc4, 0xe7, 0x97, 0x2c, 0x7c, 0x38, 0xf1, 0x81, 0xf9, 0x6e, 0x3e, 0xac, + 0x58, 0xe1, 0xca, 0xf6, + 0xc6, 0x42, 0xc9, 0xc0, 0x66, 0x9d, 0x6b, 0x13, 0xe3, 0xe7, 0x19, 0x6a, + 0x9f, 0x6b, 0xc4, 0x17, + 0x56, 0x06, 0xc0, 0x2a, 0x64, 0x9c, 0x80, 0xae, 0xe6, 0x30, 0xc2, 0x85, + 0xb9, 0xe8, 0xee, 0x51, + 0xf8, 0x5a, 0x0d, 0xad, 0x06, 0x32, 0xf3, 0x3c, 0xb3, 0xa7, 0x91, 0xd6, + 0x07, 0xe0, 0xd7, 0xa1, + 0xe9, 0x79, 0xe1, 0x9f, 0x9d, 0xbd, 0x58, 0x84, 0xb6, 0x16, 0xf0, 0x7f, + 0x14, 0x9f, 0x3c, 0x6d, + 0xf3, 0xd8, 0x21, 0xfa, 0xa1, 0xd7, 0xd9, 0xe6, 0x7a, 0x95, 0x44, 0xf5, + 0x42, 0xf8, 0xa8, 0x44, + 0xe7, 0x73, 0x7d, 0xe6, 0x5b, 0xb1, 0x10, 0x2a, 0xf5, 0x48, 0xe8, 0xe2, + 0x5a, 0x3d, 0x37, 0xb1, + 0xe1, 0xb9, 0xb3, 0x2d, 0x6b, 0x0d, 0x46, 0x8e, 0x55, 0x70, 0x3d, 0x83, + 0x28, 0xf6, 0x72, 0x3d, + 0x07, 0xff, 0x7b, 0x0a, 0x5d, 0xb9, 0x66, 0xcd, 0xc6, 0x7f, 0xe6, 0x05, + 0x5d, 0xc3, 0x3b, 0x47, + 0x9d, 0x87, 0xff, 0x8b, 0x3c, 0xba, 0x02, 0x99, 0x0b, 0xf9, 0x3c, 0xdb, + 0x22, 0xed, 0x3c, 0xf9, + 0x3d, 0xa7, 0xf8, 0x49, 0x7c, 0x9a, 0xcf, 0x55, 0xc2, 0x27, 0xaf, 0xf6, + 0x16, 0xe0, 0xe5, 0xf1, + 0x70, 0xa9, 0x22, 0x6f, 0x3a, 0x3b, 0xc5, 0x3c, 0xcb, 0xbc, 0x06, 0x2c, + 0x3c, 0xd7, 0xcd, 0x87, + 0x15, 0xab, 0xe9, 0xc3, 0x46, 0xc6, 0x3c, 0x49, 0xc3, 0x66, 0x5d, 0xa6, + 0x8e, 0x8c, 0x9b, 0x6d, + 0x9f, 0x81, 0x14, 0xf5, 0x96, 0xcc, 0xef, 0x9b, 0x95, 0x57, 0xe2, 0x27, + 0x85, 0x8c, 0x98, 0xe6, + 0xc6, 0x4c, 0x7e, 0x1b, 0x08, 0xdd, 0xf5, 0xe4, 0x90, 0xf9, 0xf8, 0xf2, + 0x54, 0xd6, 0xf6, 0xf4, + 0xcd, 0x26, 0x5b, 0x3a, 0xb1, 0x59, 0x9d, 0xd9, 0xe2, 0x9a, 0x51, 0x1f, + 0x10, 0x33, 0xe1, 0xf0, + 0x19, 0x7c, 0x6e, 0x99, 0xbe, 0xa7, 0xee, 0x59, 0x61, 0x3a, 0xd1, 0xfb, + 0x0c, 0x94, 0x3c, 0xb3, + 0x1b, 0x91, 0x3f, 0x12, 0x4e, 0x56, 0x52, 0x09, 0x5a, 0xf9, 0xf0, 0xc7, + 0x4c, 0x2c, 0x92, 0x0d, + 0xb5, 0x35, 0x5a, 0x92, 0xb5, 0x7c, 0x52, 0x1e, 0xee, 0xe5, 0xad, 0x01, + 0x3a, 0x15, 0xf4, 0xad, + 0xe1, 0x93, 0x4d, 0x57, 0xd0, 0x2e, 0xcc, 0x20, 0x8f, 0xf4, 0xc2, 0x06, + 0xeb, 0xf4, 0x3c, 0x25, + 0xd1, 0x4c, 0x3f, 0xca, 0x56, 0x9e, 0x9d, 0xcc, 0x9e, 0x47, 0x5b, 0x7f, + 0x2c, 0x96, 0x86, 0xc5, + 0xd6, 0xc3, 0xfd, 0x78, 0xbc, 0x7a, 0xba, 0x65, 0xf4, 0x58, 0xf2, 0xb4, + 0xca, 0xe8, 0x1b, 0xb8, + 0x96, 0xeb, 0xbb, 0x70, 0x5e, 0xae, 0xd5, 0x9b, 0x36, 0x39, 0x58, 0x61, + 0x03, 0x7c, 0xcc, 0x62, + 0xb7, 0xf0, 0xae, 0xa5, 0x28, 0x28, 0x0f, 0x6e, 0x6b, 0x83, 0x8d, 0xfa, + 0x1c, 0x36, 0xc3, 0x68, + 0x94, 0x94, 0xda, 0xce, 0xd4, 0xfa, 0x03, 0x62, 0x1a, 0xec, 0x75, 0x8e, + 0x3a, 0xb4, 0xbc, 0x81, + 0x9d, 0x67, 0x63, 0x1b, 0xa8, 0x5d, 0xb7, 0x8e, 0x8c, 0x5d, 0x83, 0xb7, + 0xb8, 0x50, 0x83, 0x4d, + 0x86, 0xb2, 0xea, 0x66, 0x66, 0xcc, 0xc7, 0x63, 0xbd, 0x3d, 0x93, 0x58, + 0xf7, 0x31, 0x74, 0x5c, + 0xc0, 0xbe, 0x33, 0xc9, 0x32, 0x3e, 0x5f, 0x3f, 0x1b, 0xf6, 0xc0, 0xfa, + 0x04, 0xd6, 0x86, 0xb6, + 0x96, 0xb1, 0x82, 0x93, 0xba, 0x7f, 0x8a, 0x39, 0x63, 0x0a, 0x55, 0x89, + 0xf7, 0x37, 0x27, 0x27, + 0xb3, 0x09, 0xec, 0xa1, 0x6b, 0x68, 0x33, 0x7c, 0x56, 0xf3, 0xc7, 0x14, + 0x72, 0xea, 0x14, 0xbc, + 0x69, 0xa3, 0x96, 0x64, 0xa9, 0xbe, 0x17, 0x32, 0xd9, 0xec, 0xad, 0x23, + 0x27, 0x4d, 0xa0, 0x67, + 0x03, 0x5e, 0x6f, 0xe5, 0x7a, 0x32, 0x79, 0xb8, 0x37, 0x5c, 0x6c, 0x42, + 0x22, 0x75, 0x77, 0x2d, + 0xcf, 0x6f, 0x8d, 0x5a, 0xf7, 0xb3, 0x6d, 0x17, 0xef, 0x31, 0x50, 0xf9, + 0xb3, 0xfc, 0x0f, 0x7b, + 0x40, 0xb1, 0xae, 0x8e, 0x36, 0xe1, 0x4b, 0xe5, 0x50, 0xf0, 0xae, 0xa3, + 0xf2, 0x7d, 0x8c, 0xae, + 0xd3, 0x14, 0xc5, 0x55, 0xb4, 0xe4, 0xfb, 0xf4, 0x46, 0x41, 0x65, 0xad, + 0xae, 0xba, 0x94, 0xef, + 0x58, 0xf9, 0xa8, 0xa4, 0xbe, 0x5e, 0xaa, 0x69, 0xfa, 0xda, 0xa0, 0x09, + 0x3f, 0xc0, 0x42, 0x46, + 0xbd, 0x8c, 0xc1, 0x66, 0x61, 0x33, 0x1e, 0x8d, 0x72, 0xda, 0x6b, 0x1c, + 0x6a, 0xe6, 0x06, 0xf6, + 0xcd, 0xa6, 0x36, 0xd8, 0x0a, 0x85, 0xd9, 0xac, 0x52, 0xa1, 0xef, 0xe0, + 0x95, 0xeb, 0x3b, 0xb8, + 0x25, 0xc4, 0xd9, 0x62, 0xc6, 0xaf, 0xc5, 0x4b, 0xf2, 0x2c, 0x3d, 0xe5, + 0x50, 0x79, 0x82, 0x1c, + 0xa4, 0xee, 0xe2, 0x7b, 0x5b, 0x6b, 0x38, 0x45, 0xdd, 0xc2, 0x19, 0xe0, + 0x5e, 0xae, 0xbb, 0xf9, + 0x7c, 0x3b, 0xf8, 0xb3, 0xc6, 0x9d, 0x72, 0x0f, 0x5c, 0x2b, 0x9e, 0x56, + 0xe0, 0xb3, 0x25, 0x96, + 0x39, 0x95, 0x96, 0x4f, 0xf9, 0xd4, 0x35, 0x2b, 0xa8, 0xf3, 0x36, 0xe0, + 0x11, 0xbe, 0xab, 0x95, + 0x63, 0x03, 0xdf, 0xdf, 0xab, 0xa8, 0x08, 0x17, 0xc0, 0xf1, 0x56, 0x4d, + 0x53, 0xdd, 0x39, 0xf7, + 0xf6, 0x4f, 0xa4, 0x52, 0x9b, 0x4c, 0xcf, 0x16, 0x46, 0xd8, 0x7c, 0xe4, + 0x29, 0xe4, 0x1c, 0xbe, + 0x50, 0xfb, 0xf3, 0x16, 0x74, 0x66, 0xf8, 0xd1, 0xac, 0x93, 0x76, 0x70, + 0x7d, 0x0f, 0xb8, 0x9b, + 0xeb, 0x21, 0xa8, 0x24, 0x63, 0xc7, 0x75, 0xee, 0x8a, 0xbe, 0x09, 0x2d, + 0x4c, 0xf0, 0x91, 0x77, + 0x02, 0x36, 0xcb, 0xd6, 0xf7, 0x13, 0x95, 0xf6, 0xd6, 0xeb, 0xb8, 0xab, + 0xb4, 0x70, 0x98, 0x06, + 0x8f, 0xab, 0xe9, 0x5b, 0x8f, 0x3c, 0x36, 0x1f, 0x99, 0x0d, 0x72, 0xf4, + 0xba, 0x00, 0x56, 0xd8, + 0xc1, 0xc8, 0xc9, 0x52, 0x63, 0x4c, 0x93, 0xc4, 0x9a, 0xce, 0x89, 0xe1, + 0xce, 0x3b, 0x22, 0x6a, + 0xed, 0xea, 0x3e, 0x64, 0x25, 0xfe, 0xb2, 0x93, 0xde, 0xb6, 0xd8, 0x86, + 0x1c, 0xd9, 0x3e, 0xcf, + 0x7a, 0xca, 0x38, 0x29, 0x96, 0x22, 0x79, 0x83, 0xbe, 0xef, 0x6e, 0xed, + 0x29, 0x47, 0xfa, 0xe5, + 0xda, 0x33, 0xbd, 0xad, 0xa5, 0x8c, 0xce, 0x42, 0x27, 0xcb, 0xb0, 0xf3, + 0x6c, 0xd6, 0x2e, 0xd5, + 0x99, 0xb0, 0x50, 0xdf, 0xab, 0x99, 0xaf, 0x6b, 0xf0, 0x1d, 0x68, 0xab, + 0x82, 0x6a, 0xbb, 0x24, + 0xc0, 0xb3, 0xa3, 0x72, 0x62, 0x20, 0x1e, 0xbe, 0x5f, 0x46, 0x0b, 0x33, + 0x7d, 0xe8, 0x16, 0xc1, + 0xf3, 0x5f, 0xc9, 0xa2, 0x15, 0x96, 0x96, 0x12, 0x38, 0x2d, 0xd0, 0xfa, + 0xdc, 0x41, 0x5c, 0xaa, + 0xb3, 0x6c, 0xb1, 0x85, 0xd2, 0x33, 0x78, 0xf9, 0xcb, 0xf4, 0x2d, 0xc1, + 0xf6, 0xc5, 0x96, 0xa7, + 0x59, 0x25, 0xf4, 0x94, 0x93, 0xa7, 0x57, 0x61, 0xed, 0x15, 0xcc, 0xf1, + 0xe5, 0xa0, 0x42, 0x1e, + 0x81, 0xfb, 0xd5, 0xf4, 0xae, 0x06, 0xeb, 0xe1, 0x63, 0x07, 0x54, 0x5e, + 0x36, 0xf5, 0xb3, 0x11, + 0x99, 0xc4, 0x47, 0xde, 0xe1, 0xd0, 0xdf, 0xa6, 0x47, 0xa8, 0x53, 0xc2, + 0x62, 0x2a, 0x51, 0xab, + 0x64, 0xa5, 0xe4, 0x55, 0xb5, 0x6b, 0x2d, 0xa2, 0xd5, 0xe1, 0x33, 0x2f, + 0x92, 0xca, 0x76, 0xab, + 0x85, 0xb2, 0x07, 0x7b, 0xe0, 0x7b, 0x82, 0x4c, 0x34, 0xa6, 0x48, 0x5c, + 0x4d, 0xe7, 0x84, 0x6e, + 0xb3, 0xc2, 0x22, 0xc6, 0x4b, 0xb5, 0xbd, 0x0a, 0x9e, 0x1b, 0x39, 0xd5, + 0xed, 0x0e, 0x88, 0x8d, + 0x58, 0x26, 0xcf, 0xe7, 0x69, 0x77, 0x01, 0xb9, 0xcc, 0x0e, 0xf2, 0xfc, + 0x9e, 0x82, 0x8f, 0xc3, + 0x53, 0xd6, 0x63, 0xe3, 0x31, 0x70, 0x63, 0xfd, 0x89, 0xc6, 0x53, 0x54, + 0xad, 0x51, 0xa5, 0xdf, + 0x05, 0x70, 0x68, 0xb8, 0x7e, 0xd6, 0x41, 0x7f, 0x0f, 0x7c, 0x2e, 0xc1, + 0x32, 0x8e, 0x00, 0xcf, + 0xd5, 0xc7, 0x51, 0x7b, 0xcd, 0x64, 0xcc, 0x5e, 0x6c, 0xdb, 0xa8, 0xef, + 0xee, 0x7b, 0x7e, 0xf2, + 0x99, 0xd1, 0x81, 0x88, 0x1f, 0xeb, 0x33, 0xaf, 0x80, 0xb5, 0x1a, 0xf4, + 0xdf, 0x32, 0x6e, 0x44, + 0x0b, 0x63, 0x2d, 0x3d, 0x85, 0xf2, 0x34, 0x5c, 0xa8, 0x3b, 0x14, 0x2b, + 0xe0, 0xc2, 0xf7, 0x0d, + 0x0a, 0xf5, 0x54, 0xc9, 0x86, 0x2f, 0x2a, 0xbb, 0x14, 0xfa, 0xf5, 0x8d, + 0x93, 0x9e, 0xd8, 0x69, + 0x9f, 0xec, 0x35, 0xb1, 0xc7, 0x47, 0x3b, 0x4d, 0xe4, 0xe3, 0x5c, 0x1f, + 0x0e, 0x9e, 0x83, 0xfe, + 0x2e, 0xf7, 0xa8, 0x9d, 0xf0, 0x91, 0xeb, 0xd3, 0xef, 0x20, 0xd2, 0x32, + 0xf5, 0x53, 0x92, 0x5c, + 0x9f, 0x75, 0xc6, 0xcb, 0x7d, 0x5c, 0x7b, 0xfc, 0xa8, 0x2b, 0xbc, 0x42, + 0x14, 0x54, 0x48, 0x95, + 0x31, 0x49, 0x62, 0x6a, 0xbb, 0x24, 0x76, 0x9b, 0xd5, 0x39, 0x22, 0xa9, + 0xa0, 0x2a, 0xaf, 0x4c, + 0x3f, 0xe5, 0x69, 0x81, 0xb3, 0xb6, 0xd8, 0x8f, 0xb6, 0x1a, 0xd0, 0x44, + 0x9e, 0xcf, 0x4e, 0x94, + 0x1b, 0xf0, 0x0d, 0x21, 0x3b, 0xfb, 0xd3, 0x16, 0x7d, 0x3a, 0x1c, 0x63, + 0x19, 0x91, 0xab, 0xdf, + 0x99, 0xb2, 0x41, 0xc1, 0xfa, 0xb6, 0x52, 0x1e, 0xbc, 0x3f, 0x48, 0xc6, + 0x53, 0x2b, 0xec, 0xd5, + 0x92, 0xb5, 0x7d, 0xdf, 0x2b, 0x0f, 0xdf, 0xf8, 0x3b, 0xde, 0xbf, 0x1f, + 0xec, 0xc4, 0x3b, 0xd3, + 0x7c, 0xfa, 0x62, 0xe5, 0x79, 0xfd, 0xac, 0xd8, 0xee, 0xf7, 0x7e, 0x56, + 0x0a, 0x9a, 0xdf, 0xc5, + 0x8e, 0x51, 0x4e, 0xdd, 0xee, 0xcb, 0x5b, 0xbd, 0x96, 0x68, 0x9d, 0x7e, + 0x8f, 0x67, 0xac, 0x9f, + 0x3c, 0x79, 0xc4, 0xc7, 0x34, 0x3c, 0xae, 0xc8, 0xef, 0x9d, 0x2a, 0x97, + 0x4c, 0x07, 0x02, 0xea, + 0x46, 0x61, 0x3b, 0x9e, 0x90, 0xe9, 0x33, 0x7e, 0x20, 0xf2, 0xef, 0x85, + 0x63, 0x57, 0xff, 0xcb, + 0xd4, 0x0f, 0xa3, 0x7d, 0xb4, 0x97, 0xa7, 0xdf, 0xfc, 0xf2, 0xdf, 0xd9, + 0x53, 0x38, 0x5f, 0xae, + 0x34, 0x67, 0x59, 0xd1, 0xcc, 0x9e, 0x33, 0x5e, 0xca, 0x8c, 0x2a, 0x89, + 0xc2, 0x66, 0xed, 0xaa, + 0xbb, 0xa6, 0xf6, 0x2e, 0xa9, 0xcc, 0x2a, 0xd1, 0x4f, 0xe3, 0x76, 0x06, + 0xbc, 0x7b, 0x7a, 0x10, + 0x3a, 0x4d, 0xfa, 0xee, 0x6a, 0x46, 0x80, 0xb7, 0x34, 0xd5, 0xfb, 0x8c, + 0xde, 0xdf, 0xb2, 0xf0, + 0xe5, 0xed, 0xac, 0xb2, 0x06, 0x4d, 0xa6, 0x59, 0xc6, 0x67, 0x04, 0x98, + 0x6b, 0xc0, 0x63, 0x12, + 0xba, 0x70, 0xad, 0xb2, 0x8b, 0xbc, 0x19, 0xd9, 0x66, 0x54, 0x0e, 0xb9, + 0x36, 0x01, 0x3f, 0x3b, + 0x08, 0xf6, 0x92, 0xa1, 0x92, 0x2d, 0x7d, 0x99, 0x9c, 0x40, 0x63, 0xc9, + 0x41, 0xe3, 0x65, 0xa4, + 0x7e, 0x27, 0xd1, 0xbb, 0x56, 0x2c, 0x1e, 0xb8, 0x0d, 0x3d, 0x57, 0xe1, + 0x39, 0x5e, 0x8a, 0xd9, + 0xe4, 0x80, 0x06, 0xbd, 0x56, 0x13, 0x76, 0x49, 0x69, 0xc3, 0x4f, 0x36, + 0xb6, 0x99, 0x88, 0x7f, + 0x8c, 0x27, 0x97, 0xa5, 0xb7, 0x91, 0xe9, 0x60, 0xd0, 0xfb, 0xbb, 0x3b, + 0xf5, 0x5d, 0x01, 0x2b, + 0x9d, 0x7e, 0xc4, 0xea, 0x2b, 0xee, 0x19, 0x07, 0xf5, 0x5b, 0x5c, 0xe9, + 0x54, 0x25, 0x99, 0x41, + 0xdf, 0x74, 0x4d, 0xd7, 0xef, 0x7d, 0xa9, 0x7b, 0x45, 0x07, 0x02, 0xae, + 0x73, 0x84, 0xd3, 0x29, + 0x79, 0xdf, 0x28, 0x97, 0xc8, 0xda, 0x2e, 0x09, 0xed, 0xaa, 0xc3, 0x53, + 0xfe, 0x54, 0x51, 0x99, + 0x5a, 0xa8, 0xdf, 0x91, 0x99, 0xab, 0xef, 0x9e, 0xb6, 0x45, 0x0b, 0x56, + 0x9b, 0x43, 0xa5, 0x9c, + 0xae, 0x9f, 0xfc, 0x59, 0x91, 0xca, 0x6a, 0x03, 0xb0, 0x8e, 0xf7, 0xf7, + 0x7e, 0xfa, 0xce, 0xe8, + 0x7e, 0x3c, 0xb6, 0xa7, 0x7e, 0x4a, 0x96, 0x1c, 0x10, 0xea, 0x5e, 0xed, + 0xdf, 0xe5, 0x7e, 0xf6, + 0xef, 0xc3, 0xee, 0x35, 0x5e, 0x25, 0xd2, 0xd4, 0x73, 0x6c, 0xdf, 0x71, + 0x59, 0xd4, 0x2b, 0x33, + 0xf4, 0x98, 0xc3, 0xfa, 0xdd, 0x87, 0x31, 0x96, 0x11, 0xea, 0x3d, 0xc4, + 0x44, 0xfc, 0x63, 0x33, + 0x36, 0x4b, 0xf4, 0xe3, 0x6c, 0x34, 0xf9, 0x6f, 0x33, 0xde, 0x19, 0x6f, + 0x69, 0x4b, 0xc3, 0x66, + 0xf3, 0xe0, 0xed, 0x10, 0xd9, 0xa7, 0x11, 0x7b, 0xfb, 0xf3, 0x96, 0x06, + 0xc7, 0xb5, 0xe8, 0xb7, + 0x42, 0x3f, 0xb9, 0x4c, 0xf6, 0x93, 0xe9, 0x70, 0x40, 0xcd, 0x28, 0xec, + 0x45, 0x37, 0x49, 0x3e, + 0x74, 0xfa, 0x60, 0xf7, 0x66, 0xcb, 0x8c, 0x03, 0x44, 0xf6, 0x20, 0xea, + 0xc5, 0xb6, 0xfa, 0xf3, + 0xcc, 0xc8, 0xa5, 0x4a, 0x7b, 0x9a, 0x88, 0x0c, 0xbc, 0xc2, 0x09, 0x5d, + 0x89, 0x15, 0x1a, 0x25, + 0x32, 0x4a, 0xc5, 0x99, 0x7a, 0xef, 0x6a, 0x52, 0x4a, 0x72, 0x81, 0xe1, + 0xd0, 0xf7, 0x60, 0x8f, + 0xb6, 0x79, 0xb2, 0xe4, 0xc2, 0x6b, 0xac, 0x5b, 0x23, 0xff, 0xa4, 0xe2, + 0x49, 0x32, 0xff, 0xe6, + 0x25, 0x41, 0x3f, 0x85, 0xf8, 0x03, 0x3b, 0x74, 0x9a, 0x65, 0xfd, 0xe7, + 0x18, 0x79, 0x54, 0x8f, + 0x9f, 0xce, 0x59, 0x6d, 0x28, 0x2d, 0x49, 0x8c, 0x8c, 0xb7, 0xcc, 0x4a, + 0x42, 0x0b, 0x51, 0xd2, + 0x89, 0x2a, 0x6c, 0x05, 0x94, 0x8f, 0x9a, 0x2b, 0xec, 0x23, 0x2e, 0x22, + 0x7d, 0x64, 0x51, 0x6f, + 0xaa, 0x3f, 0x84, 0x24, 0x47, 0xf5, 0xb8, 0x16, 0xf2, 0xa8, 0x7a, 0x56, + 0xe5, 0xed, 0x7d, 0x1e, + 0x8f, 0x79, 0x0d, 0xcf, 0x9c, 0x23, 0x43, 0x7c, 0xb4, 0x96, 0x0c, 0x9f, + 0x45, 0x44, 0x5a, 0x3d, + 0x19, 0xdd, 0xaa, 0xfb, 0xde, 0x9c, 0xc2, 0x8e, 0x6a, 0x4a, 0x3b, 0xe1, + 0x64, 0x84, 0x7e, 0x47, + 0xc2, 0xf3, 0x57, 0x20, 0x49, 0xd0, 0xeb, 0xcd, 0xce, 0xa9, 0xf6, 0xfb, + 0x68, 0x3f, 0x9d, 0xba, + 0x64, 0x3a, 0x12, 0x10, 0xea, 0xf9, 0xd4, 0x0a, 0x1f, 0x6f, 0x4b, 0xa5, + 0xb2, 0xac, 0xb6, 0x48, + 0xa6, 0x64, 0x6b, 0xa1, 0x32, 0x53, 0x7f, 0x77, 0x9e, 0xc8, 0xb8, 0x44, + 0x1f, 0x6d, 0xa8, 0xb7, + 0x34, 0x86, 0x72, 0x76, 0x18, 0x80, 0x8f, 0x05, 0x5b, 0xe3, 0x0c, 0x3b, + 0xad, 0x5d, 0x1c, 0x46, + 0xa1, 0xbc, 0xa8, 0xe2, 0x4c, 0xfd, 0x9d, 0xe0, 0xb4, 0xee, 0x31, 0x85, + 0x76, 0x9b, 0x43, 0xbd, + 0xc5, 0xb9, 0x5a, 0xce, 0x62, 0xd5, 0x40, 0x50, 0xbc, 0x55, 0xa3, 0xc1, + 0x1e, 0x44, 0xb9, 0x4b, + 0xc6, 0x68, 0xe2, 0xe4, 0x77, 0xc8, 0x93, 0xcd, 0x09, 0xf2, 0x2e, 0x5d, + 0xc7, 0xdf, 0xcd, 0xff, + 0xf1, 0x70, 0x78, 0x52, 0x8f, 0x57, 0xcf, 0x5f, 0x9e, 0xa5, 0x9e, 0xef, + 0x81, 0xd7, 0x7b, 0xfe, + 0xc2, 0x63, 0x0c, 0x9f, 0x9f, 0x92, 0xce, 0xf2, 0xbf, 0xe8, 0x7b, 0x8d, + 0x0f, 0xfd, 0xe3, 0xf8, + 0xe5, 0x26, 0x22, 0xe7, 0x2e, 0x93, 0x96, 0xaa, 0xac, 0xbb, 0xe0, 0x47, + 0x47, 0x4c, 0x0e, 0xf6, + 0xe1, 0x8f, 0xf7, 0x59, 0xfa, 0xef, 0xc2, 0x32, 0xa7, 0xe4, 0x18, 0x51, + 0x5d, 0x8a, 0x7f, 0x78, + 0xdb, 0x55, 0xcf, 0x20, 0xe2, 0x76, 0x35, 0xff, 0xde, 0x69, 0xb6, 0xdd, + 0x29, 0x8f, 0xd2, 0xa6, + 0x78, 0x3b, 0xc6, 0x5a, 0x6b, 0xb1, 0xf3, 0xed, 0xcc, 0xea, 0xa5, 0xff, + 0x8e, 0x7f, 0x00, 0xa7, + 0xd9, 0xee, 0xf2, 0x00, 0xb5, 0xdc, 0x21, 0xb4, 0xdb, 0xd3, 0x32, 0xcb, + 0x2a, 0x53, 0x60, 0xbc, + 0x86, 0x57, 0x45, 0x5b, 0xf8, 0xbe, 0x4b, 0xfe, 0xc2, 0x19, 0xd8, 0x77, + 0xfc, 0x31, 0x46, 0x6d, + 0xc1, 0x93, 0xd4, 0x59, 0x61, 0xa8, 0xe9, 0x27, 0x63, 0xf0, 0xc9, 0x27, + 0xf4, 0x1b, 0x2b, 0xc9, + 0xfa, 0x39, 0x52, 0x30, 0x9c, 0xd7, 0x6f, 0x69, 0xd8, 0x88, 0xab, 0x11, + 0xb5, 0x5d, 0x13, 0x5c, + 0xef, 0x11, 0x87, 0x8d, 0xca, 0x34, 0x72, 0x0d, 0xf5, 0xde, 0x73, 0x36, + 0xfd, 0x67, 0x7c, 0x9e, + 0xac, 0x7b, 0x71, 0x12, 0xad, 0x6d, 0x60, 0xbd, 0x7b, 0x24, 0x0c, 0xad, + 0xb7, 0x97, 0x9b, 0xf1, + 0x9c, 0x3a, 0x72, 0x80, 0xaa, 0x38, 0x5c, 0x3b, 0x96, 0x7a, 0xb3, 0x76, + 0xb5, 0xf9, 0xdc, 0xfe, + 0x14, 0x9f, 0x0e, 0xea, 0xea, 0xe5, 0x3e, 0xc6, 0x87, 0x11, 0x59, 0x1d, + 0xe5, 0x46, 0xfe, 0x7d, + 0x8c, 0x91, 0x4b, 0xb1, 0xd1, 0xeb, 0x7e, 0x2b, 0x9d, 0x82, 0xfe, 0x72, + 0x76, 0xb0, 0x74, 0xf7, + 0x3b, 0xd9, 0x8a, 0x5e, 0x11, 0x7e, 0xef, 0xed, 0x3f, 0x46, 0x85, 0x60, + 0x33, 0xfb, 0xb3, 0xc8, + 0xff, 0x4d, 0x50, 0x39, 0x0d, 0xad, 0x83, 0xec, 0x44, 0x19, 0x26, 0x32, + 0xf5, 0xb3, 0x4b, 0xf5, + 0xd4, 0xae, 0xde, 0xa7, 0x6d, 0x2a, 0xb6, 0xf2, 0xd0, 0x3a, 0xce, 0x8e, + 0x53, 0x8f, 0xae, 0xfa, + 0xcb, 0xe3, 0xd8, 0xf2, 0x51, 0xec, 0x34, 0x80, 0xda, 0x60, 0x1f, 0x3d, + 0x2d, 0xfa, 0x59, 0x92, + 0x97, 0x07, 0xab, 0x4c, 0x81, 0xa0, 0x9e, 0x9c, 0x2f, 0xd6, 0xbb, 0xba, + 0x67, 0x46, 0x25, 0xf9, + 0xf2, 0x4c, 0xc0, 0x71, 0x6b, 0xd0, 0xf0, 0x13, 0xd2, 0x15, 0x74, 0x46, + 0x13, 0x37, 0x92, 0x11, + 0x7b, 0xb0, 0xea, 0x26, 0xe8, 0xbf, 0x1e, 0x94, 0xfe, 0x69, 0x79, 0x1b, + 0x3d, 0x64, 0xc9, 0x58, + 0xc3, 0x26, 0xc3, 0xdc, 0x36, 0x53, 0x75, 0x48, 0x9f, 0xa2, 0xbc, 0x9c, + 0x2c, 0xfd, 0xf6, 0xfd, + 0x62, 0x79, 0x57, 0xce, 0x06, 0xc1, 0xeb, 0xfa, 0xfd, 0x8c, 0xdd, 0x68, + 0x76, 0x0e, 0x1e, 0xd9, + 0x84, 0xef, 0xb8, 0x5a, 0xcf, 0xb8, 0x39, 0x54, 0xfd, 0x67, 0xf5, 0xe5, + 0x9d, 0x71, 0x06, 0x4d, + 0xef, 0x45, 0xd7, 0xf3, 0xf5, 0x9d, 0xc3, 0xe5, 0xfa, 0x29, 0xb1, 0x7a, + 0x97, 0xe3, 0x8d, 0x00, + 0xf4, 0xcf, 0x58, 0x68, 0x9d, 0xd6, 0xbf, 0x9d, 0xf5, 0xa1, 0x77, 0xc6, + 0x0d, 0x57, 0xef, 0x19, + 0x68, 0x78, 0x56, 0xb4, 0xce, 0x73, 0xf5, 0xf9, 0x8e, 0xf6, 0x50, 0x7b, + 0xdd, 0x4f, 0x1a, 0xa5, + 0xc7, 0x66, 0xbd, 0xef, 0x1f, 0xc2, 0x63, 0x4e, 0xb9, 0xe9, 0x58, 0x69, + 0xb5, 0x95, 0xa9, 0xad, + 0x56, 0xac, 0x7c, 0xab, 0xcf, 0x6f, 0x04, 0x19, 0xaf, 0x68, 0x29, 0x3f, + 0xde, 0xe2, 0x7e, 0x5a, + 0xb9, 0x4c, 0x3f, 0xf3, 0x3b, 0x13, 0x50, 0x17, 0x56, 0xbc, 0x47, 0xb5, + 0x41, 0x2d, 0x44, 0x54, + 0x0d, 0x31, 0x6d, 0xd6, 0x2d, 0xa5, 0x6b, 0x55, 0x46, 0x6a, 0xba, 0x91, + 0xa6, 0xdf, 0x1e, 0x3a, + 0x8a, 0x5d, 0xcf, 0x07, 0xc4, 0x05, 0x0d, 0xf5, 0xde, 0xc9, 0x3b, 0xfa, + 0x0d, 0x95, 0xb7, 0xdc, + 0x2d, 0x6f, 0x5a, 0x70, 0x41, 0xbf, 0xe1, 0x63, 0x1d, 0xff, 0xa6, 0x7e, + 0x8b, 0xc7, 0x35, 0x47, + 0xfd, 0xff, 0x96, 0xdf, 0x28, 0x5f, 0xfa, 0x6f, 0x06, 0xa5, 0x76, 0x3e, + 0xe0, 0x5a, 0x17, 0x7c, + 0xd6, 0xf1, 0xef, 0xbb, 0x12, 0xde, 0xde, 0x72, 0x23, 0xd8, 0xac, 0x60, + 0xdc, 0xb6, 0xa5, 0x74, + 0xb9, 0xf1, 0xde, 0x15, 0x5d, 0xda, 0x78, 0x47, 0x6b, 0xe3, 0xc2, 0x65, + 0xe8, 0x9f, 0x97, 0x0f, + 0xc9, 0x64, 0x54, 0x2a, 0x46, 0xa6, 0x0c, 0xf6, 0xd8, 0xcc, 0xbd, 0xa7, + 0x65, 0xda, 0x93, 0x1d, + 0xc9, 0xd8, 0xcc, 0x2e, 0x9f, 0x6a, 0x5a, 0x21, 0xfc, 0x56, 0xf0, 0x29, + 0xf5, 0x21, 0xb5, 0x17, + 0x31, 0x35, 0xb0, 0xc6, 0x6b, 0xb3, 0x6e, 0xb3, 0xba, 0x46, 0x8c, 0x74, + 0x8c, 0xb1, 0xab, 0x9d, + 0x31, 0x82, 0xea, 0xe9, 0x22, 0xf1, 0xf8, 0xf3, 0xe1, 0x03, 0xf9, 0x38, + 0xf4, 0x4d, 0x11, 0xd7, + 0x80, 0xef, 0xd8, 0xc5, 0xe3, 0x24, 0xd1, 0x18, 0x23, 0x03, 0x2c, 0x71, + 0xa6, 0xce, 0x69, 0xb7, + 0x97, 0x8f, 0x49, 0x8b, 0x33, 0xe2, 0xe8, 0x7d, 0x41, 0x56, 0xc9, 0xd7, + 0xf2, 0x2f, 0x74, 0xfd, + 0x73, 0xe0, 0x13, 0x72, 0xc0, 0x0a, 0x7d, 0xaf, 0x2e, 0x84, 0x9f, 0x86, + 0x4d, 0xfa, 0x6f, 0x3d, + 0xe3, 0x8c, 0x44, 0xe9, 0x67, 0xb5, 0x19, 0xe8, 0x3a, 0xed, 0xb1, 0x98, + 0x04, 0x7b, 0xb4, 0x43, + 0xfd, 0x65, 0xe4, 0x10, 0x2a, 0x8c, 0x6f, 0x88, 0x8e, 0x8f, 0xae, 0x19, + 0x17, 0xc9, 0xc6, 0x71, + 0x32, 0x8c, 0xda, 0x3e, 0x84, 0x9f, 0x8e, 0xd1, 0x54, 0xdf, 0xd1, 0xc4, + 0x53, 0x9f, 0xda, 0xb0, + 0x78, 0x9f, 0xef, 0x9a, 0x20, 0x3f, 0xf6, 0x2d, 0x88, 0xc9, 0x55, 0xdf, + 0xa4, 0x13, 0x81, 0x96, + 0xd7, 0x49, 0xab, 0x7c, 0x46, 0x2e, 0xbd, 0x16, 0xa8, 0x68, 0x4d, 0x22, + 0x6e, 0x23, 0x43, 0xb8, + 0x76, 0x18, 0xd1, 0xf2, 0x4c, 0x6d, 0x58, 0x82, 0xff, 0xf7, 0xff, 0x75, + 0x9d, 0x34, 0x78, 0x4c, + 0xa4, 0xe1, 0xfa, 0xe6, 0xaa, 0x7e, 0x9c, 0xad, 0xd4, 0x77, 0xc4, 0x7d, + 0xfe, 0x13, 0x71, 0x51, + 0x7e, 0xe4, 0x3c, 0x38, 0x44, 0x46, 0xb8, 0xbf, 0x0b, 0x2b, 0xd2, 0x1e, + 0xe9, 0x08, 0x5d, 0xd7, + 0x70, 0xd9, 0xa2, 0x1c, 0x6d, 0x6c, 0xa6, 0x63, 0x2d, 0x7c, 0xd4, 0x73, + 0x32, 0xca, 0xfe, 0x82, + 0x28, 0x0c, 0xe4, 0x04, 0xf8, 0xa5, 0xfe, 0x0b, 0xba, 0x2f, 0xae, 0x1a, + 0xdf, 0x32, 0x6f, 0x89, + 0x0c, 0xc6, 0x62, 0x8a, 0xd2, 0x8b, 0xf6, 0x91, 0xd2, 0xab, 0xac, 0x57, + 0x7a, 0xaf, 0xf2, 0x5f, + 0xfb, 0x7a, 0x2a, 0xbd, 0x7b, 0x45, 0xf7, 0xb4, 0xee, 0xe5, 0xbd, 0xd2, + 0x2e, 0x37, 0xb6, 0x67, + 0x39, 0xe3, 0x18, 0xdb, 0xd3, 0x6c, 0x7b, 0x32, 0xfd, 0x91, 0xca, 0x47, + 0x52, 0x1f, 0xa9, 0xe8, + 0xc1, 0xdc, 0x9e, 0xf4, 0xf7, 0xcc, 0xe8, 0xf9, 0x4b, 0xca, 0x54, 0xd6, + 0x3b, 0xfd, 0xe1, 0xba, + 0xf0, 0x98, 0x40, 0xdf, 0xb5, 0x19, 0x36, 0xe9, 0xd9, 0xa4, 0x17, 0xec, + 0xc3, 0x1d, 0xc3, 0x65, + 0xb8, 0x0c, 0x92, 0x01, 0xd4, 0x23, 0xea, 0xef, 0x51, 0xbf, 0xba, 0x0a, + 0xa8, 0xbf, 0x83, 0x3d, + 0x2b, 0x29, 0xd2, 0x87, 0x0c, 0x0b, 0x15, 0x03, 0xbb, 0x95, 0xdd, 0x93, + 0xde, 0xb5, 0x21, 0x2c, + 0x22, 0x2c, 0x74, 0x5d, 0xf3, 0x15, 0xf0, 0xfb, 0x36, 0x89, 0xb5, 0x5e, + 0x05, 0x2f, 0xd8, 0x86, + 0x1a, 0x43, 0xf5, 0x77, 0x04, 0x3c, 0xad, 0x9f, 0x98, 0xb4, 0xea, 0xbf, + 0x66, 0xfd, 0xe6, 0x32, + 0xf8, 0xd6, 0xfd, 0x2d, 0xaa, 0xd5, 0xd8, 0x6b, 0xa0, 0x0c, 0xd5, 0x18, + 0x0e, 0x9d, 0xbb, 0x66, + 0x86, 0x8f, 0x0e, 0x7d, 0x33, 0xe6, 0xf5, 0xfd, 0x5e, 0xdb, 0xae, 0x75, + 0xff, 0x88, 0x1b, 0x6a, + 0x1b, 0x22, 0xcf, 0x81, 0xc1, 0xc4, 0x5a, 0x0f, 0xf6, 0xb7, 0x55, 0x3a, + 0x4f, 0xba, 0x6c, 0xd7, + 0xf6, 0x1b, 0xa4, 0x3d, 0xdf, 0x4f, 0x7c, 0x58, 0xf2, 0x19, 0xdd, 0x97, + 0x59, 0x6a, 0xee, 0x73, + 0xf6, 0x61, 0x8e, 0xbe, 0x13, 0xc3, 0x93, 0xc2, 0xab, 0x43, 0xdf, 0x6f, + 0x7b, 0xdd, 0xbf, 0xdb, + 0x96, 0x58, 0xbb, 0xb3, 0xe2, 0xd9, 0xd4, 0x21, 0xf6, 0x41, 0x0e, 0xd7, + 0x37, 0x32, 0xf4, 0x97, + 0xa7, 0xa8, 0x4a, 0xb2, 0x65, 0x99, 0xbc, 0x1d, 0xf0, 0x6f, 0xf9, 0x2f, + 0xca, 0x3e, 0xa9, 0x60, + 0xf7, 0x7a, 0x52, 0x47, 0x98, 0x9e, 0x63, 0x0c, 0x96, 0xa1, 0xc5, 0x0f, + 0x67, 0x87, 0xcf, 0xea, + 0x36, 0x2a, 0xa4, 0xd1, 0x5f, 0x26, 0xd6, 0xc2, 0x67, 0x85, 0x47, 0x3c, + 0x58, 0x3c, 0x30, 0x7b, + 0xa0, 0x7d, 0x80, 0x0c, 0x70, 0x7f, 0xf7, 0xf0, 0x33, 0xd8, 0xe4, 0x31, + 0x79, 0x1c, 0xdb, 0x64, + 0x4a, 0x91, 0x4c, 0x90, 0x49, 0x52, 0xc6, 0x19, 0x3d, 0x9a, 0xfc, 0xf9, + 0x88, 0x74, 0x97, 0xde, + 0xc4, 0x97, 0x7b, 0xac, 0xf1, 0xac, 0x0c, 0xca, 0x7f, 0xca, 0x76, 0x9b, + 0x33, 0x3c, 0xa2, 0x5b, + 0x28, 0xc6, 0x7e, 0x59, 0xbb, 0x39, 0x6f, 0x8d, 0x78, 0xb4, 0x70, 0x60, + 0xee, 0xb3, 0xf6, 0xfe, + 0xe2, 0x85, 0x7a, 0x7a, 0xd7, 0x5b, 0x7a, 0x49, 0x4f, 0x62, 0xaf, 0x27, + 0x9f, 0x9e, 0xd1, 0xdf, + 0x28, 0x6d, 0x02, 0x1b, 0x0f, 0x32, 0x7a, 0x19, 0xf7, 0xcc, 0x08, 0x8f, + 0x0a, 0xd9, 0xeb, 0xd7, + 0x8a, 0xb7, 0x6e, 0xa3, 0x1e, 0x1c, 0xff, 0x74, 0x66, 0x7f, 0x5b, 0xbf, + 0xfc, 0xbe, 0x46, 0x5f, + 0x09, 0x0a, 0xfa, 0xfa, 0xd9, 0xfa, 0x3b, 0xfa, 0x16, 0x3e, 0x9e, 0x7b, + 0x47, 0x7d, 0xd8, 0xe8, + 0x50, 0x4e, 0xfc, 0xd5, 0xf3, 0xe4, 0xa8, 0x3b, 0x26, 0x3f, 0x9c, 0xd0, + 0xd3, 0x20, 0xca, 0xf2, + 0xfa, 0xe6, 0xf7, 0xb5, 0xf7, 0x71, 0xf4, 0x31, 0xfa, 0x88, 0xbe, 0xec, + 0x7d, 0x1d, 0x7d, 0x6d, + 0xfd, 0x1c, 0xfd, 0xed, 0xcf, 0x38, 0x9e, 0xa8, 0xbc, 0x2f, 0x45, 0xed, + 0x85, 0xa1, 0xf8, 0xfa, + 0x6d, 0xd8, 0x4d, 0xd9, 0x22, 0xac, 0xa1, 0xdb, 0xa8, 0x3b, 0x6a, 0xef, + 0x8f, 0x7f, 0xa8, 0xf4, + 0xb1, 0x8c, 0x7f, 0x16, 0xf6, 0x18, 0xdb, 0xa3, 0xb0, 0x7b, 0xee, 0xe3, + 0xe3, 0xff, 0x91, 0xf5, + 0xc0, 0xa4, 0xbb, 0x93, 0x6e, 0x65, 0xff, 0x53, 0x7b, 0x60, 0xb7, 0x50, + 0x7c, 0xfd, 0x26, 0x6d, + 0x17, 0xde, 0xc0, 0xd5, 0x88, 0x8d, 0xd4, 0xa5, 0x3e, 0x63, 0xa7, 0x90, + 0xad, 0x42, 0x08, 0x21, + 0x30, 0xfe, 0x1f, 0x7e, 0x26, 0xe7, 0x5b +}; diff --git a/source/ngc/gui/dvd.c b/source/ngc/gui/dvd.c index d6c9145..4ca039b 100644 --- a/source/ngc/gui/dvd.c +++ b/source/ngc/gui/dvd.c @@ -1,148 +1,178 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Nintendo Gamecube DVD Reading Library - * - * This is NOT a complete DVD library, in that it works for reading - * ISO9660 discs only. - * - * If you need softmod drivecodes etc, look elsewhere. - * There are known issues with libogc dvd handling, so these work - * outside of it ,if you will. - * - * This is ideal for using with a gc-linux self booting DVD only. - * Go http://www.gc-linux.org for further information and the tools - * for your platform. - * - * To keep libOGC stable, make sure you call DVD_Init before using - * these functions. - ***************************************************************************/ -#include "shared.h" - -/** DVD I/O Address base **/ -volatile unsigned long *dvd = (volatile unsigned long *) 0xCC006000; -static unsigned char *inquiry=(unsigned char *)0x80000004; - -/** Due to lack of memory, we'll use this little 2k keyhole for all DVD operations **/ -unsigned char DVDreadbuffer[2048] ATTRIBUTE_ALIGN (32); - -/*************************************************************************** - * dvd_read - * - * Read DVD disc sectors - ***************************************************************************/ -extern u8 isWII; - -int dvd_read (void *dst, unsigned int len, u64 offset) -{ - unsigned char *buffer = (unsigned char *) (unsigned int) DVDreadbuffer; - - if (len > 2048) return 1; /*** We only allow 2k reads **/ - DCInvalidateRange((void *)buffer, len); - - if(offset < 0x57057C00 || (isWII == 1 && offset < 0x118244F00LL)) // don't read past the end of the DVD - { - offset >>= 2; - dvd[0] = 0x2E; - dvd[1] = 0; - dvd[2] = 0xA8000000; - dvd[3] = (u32)offset; - dvd[4] = len; - dvd[5] = (unsigned long) buffer; - dvd[6] = len; - dvd[7] = 3; /*** Enable reading with DMA ***/ - while (dvd[7] & 1); - memcpy (dst, buffer, len); - } - else return 0; // Let's not read past end of DVD - - if (dvd[0] & 0x4) return 0; /* Ensure it has completed */ - - return 1; -} - -/**************************************************************************** - * uselessinquiry - * - * As the name suggests, this function is quite useless. - * It's only purpose is to stop any pending DVD interrupts while we use the - * memcard interface. - * - * libOGC tends to foul up if you don't, and sometimes does if you do! - ****************************************************************************/ -void uselessinquiry () -{ - - dvd[0] = 0; - dvd[1] = 0; - dvd[2] = 0x12000000; - dvd[3] = 0; - dvd[4] = 0x20; - dvd[5] = 0x80000000; - dvd[6] = 0x20; - dvd[7] = 1; - - while (dvd[7] & 1); -} - -/**************************************************************************** - * dvd_motor_off - * - * Stop the DVD Motor - * - * This can be used to prevent the Disc from spinning during playtime - ****************************************************************************/ -void dvd_motor_off( ) -{ - dvd[0] = 0x2e; - dvd[1] = 0; - dvd[2] = 0xe3000000; - dvd[3] = 0; - dvd[4] = 0; - dvd[5] = 0; - dvd[6] = 0; - dvd[7] = 1; // Do immediate - while (dvd[7] & 1); - - /*** PSO Stops blackscreen at reload ***/ - dvd[0] = 0x14; - dvd[1] = 0; -} - -/**************************************************************************** - * dvd_inquiry - * - * Return the Current DVD Drive ID - * - * This can be used to determine whereas the console is a Gamecube or a Wii - ****************************************************************************/ -int dvd_inquiry() -{ - dvd[0] = 0x2e; - dvd[1] = 0; - dvd[2] = 0x12000000; - dvd[3] = 0; - dvd[4] = 0x20; - dvd[5] = 0x80000000; - dvd[6] = 0x20; - dvd[7] = 3; - while( dvd[7] & 1 ); - DCFlushRange((void *)0x80000000, 32); - return (int)inquiry[2]; -} +/**************************************************************************** + * Nintendo Gamecube DVD Reading Library + * + * This is NOT a complete DVD library, in that it works for reading + * ISO9660 discs only. + * + * If you need softmod drivecodes etc, look elsewhere. + * There are known issues with libogc dvd handling, so these work + * outside of it ,if you will. + * + * This is ideal for using with a gc-linux self booting DVD only. + * Go http://www.gc-linux.org for further information and the tools + * for your platform. + * + * To keep libOGC stable, make sure you call DVD_Init before using + * these functions. + ***************************************************************************/ + +#include "shared.h" +#ifdef WII_DVD +#include "wdvd.h" +#endif +#include "dvd.h" + +/** DVD I/O Address base **/ +#ifndef HW_RVL +static vu32* const dvd = (u32*)0xCC006000; +static unsigned char *inquiry=(unsigned char *)0x80000004; +#endif + +/** Due to lack of memory, we'll use this little 2k keyhole for all DVD operations **/ +unsigned char DVDreadbuffer[2048] ATTRIBUTE_ALIGN (32); + +#ifdef HW_RVL +u64 DvdMaxOffset = 0x118244F00LL; +#else +u64 DvdMaxOffset = 0x57057C00; // default +#endif + +/*************************************************************************** + * dvd_read + * + * Read DVD disc sectors + ***************************************************************************/ +int dvd_read (void *dst, unsigned int len, u64 offset) +{ +#ifndef HW_RVL + //unsigned char *buffer = (unsigned char *) (unsigned int) DVDreadbuffer; + + // if (len > 2048) return 1; /*** We only allow 2k reads **/ + /* DCInvalidateRange((void *)buffer, len); + + if(offset < DvdMaxOffset) + { + dvd[0] = 0x2E; + dvd[1] = 0; + dvd[2] = 0xA8000000; + dvd[3] = (u32)(offset >> 2); + dvd[4] = len; + dvd[5] = (u32) buffer; + dvd[6] = len; + dvd[7] = 3; *//*** Enable reading with DMA ***/ + // while (dvd[7] & 1); + // memcpy (dst, buffer, len); + // } + // else return 1; // Let's not read past end of DVD + +// if (dvd[0] & 0x4) return 0; /* Ensure it has completed */ + if (DVD_LowRead(dst,len,offset,NULL) == 1) + return 0; +#elif WII_DVD + + if (WDVD_LowUnencryptedRead((unsigned char **)&dst, len, (u32)(offset >> 2)) == 1) + return 0; +#endif + + return 1; +} + +/**************************************************************************** + * uselessinquiry + * + * As the name suggests, this function is quite useless. + * It's only purpose is to stop any pending DVD interrupts while we use the + * memcard interface. + * + * libOGC tends to foul up if you don't, and sometimes does if you do! + ****************************************************************************/ +#ifndef HW_RVL +void uselessinquiry () +{ + dvddrvinfo drive_info; + + DVD_LowInquiry(&drive_info,NULL); + +/* + dvd[0] = 0; + dvd[1] = 0; + dvd[2] = 0x12000000; + dvd[3] = 0; + dvd[4] = 0x20; + dvd[5] = 0x80000000; + dvd[6] = 0x20; + dvd[7] = 1; + + while (dvd[7] & 1);*/ +} +#endif + +/**************************************************************************** + * dvd_motor_off + * + * Stop the DVD Motor + * + * This can be used to prevent the Disc from spinning during playtime + ****************************************************************************/ +#ifndef HW_RVL +void dvd_motor_off( ) +{ + + DVD_LowStopMotor(NULL); + + /* + dvd[0] = 0x2e; + dvd[1] = 0; + dvd[2] = 0xe3000000; + dvd[3] = 0; + dvd[4] = 0; + dvd[5] = 0; + dvd[6] = 0; + dvd[7] = 1; // Do immediate + while (dvd[7] & 1);*/ + + /*** PSO Stops blackscreen at reload ***/ +/* dvd[0] = 0x14; + dvd[1] = 0;*/ +} +#endif + +/**************************************************************************** + * dvd_drive_detect() + * + * Detect the DVD Drive Type + * + ****************************************************************************/ +#ifndef HW_RVL +void dvd_drive_detect() +{ + /*dvd[0] = 0x2e; + dvd[1] = 0; + dvd[2] = 0x12000000; + dvd[3] = 0; + dvd[4] = 0x20; + dvd[5] = 0x80000000; + dvd[6] = 0x20; + dvd[7] = 3; + while( dvd[7] & 1 ); + DCFlushRange((void *)0x80000000, 32);*/ + + dvddrvinfo drive_info; + + DVD_LowInquiry(&drive_info,NULL); + + //int driveid = (int)inquiry[2]; + int driveid = drive_info.dev_code; + + if ((driveid == 4) || (driveid == 6) || (driveid == 8)) + { + /* Gamecube DVD Drive (1.4 GB)*/ + DvdMaxOffset = 0x57057C00; + } + else + { + /* Wii DVD Drive (4.7GB) */ + DvdMaxOffset = 0x118244F00LL; + } +} +#endif diff --git a/source/ngc/gui/dvd.h b/source/ngc/gui/dvd.h index 3394211..6885e59 100644 --- a/source/ngc/gui/dvd.h +++ b/source/ngc/gui/dvd.h @@ -1,24 +1,23 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - ***************************************************************************/ - -extern int dvd_read (void *dst, unsigned int len, u64 offset); -extern void uselessinquiry (); -extern void dvd_motor_off (); -extern int dvd_inquiry(); +/**************************************************************************** + * Nintendo Gamecube DVD Reading Library + * + * This is NOT a complete DVD library, in that it works for reading + * ISO9660 discs only. + * + * If you need softmod drivecodes etc, look elsewhere. + * There are known issues with libogc dvd handling, so these work + * outside of it ,if you will. + * + * This is ideal for using with a gc-linux self booting DVD only. + * Go http://www.gc-linux.org for further information and the tools + * for your platform. + * + * To keep libOGC stable, make sure you call DVD_Init before using + * these functions. + ***************************************************************************/ + +extern int dvd_read (void *dst, unsigned int len, u64 offset); +extern void uselessinquiry (); +extern void dvd_motor_off (); +extern void dvd_drive_detect(); + diff --git a/source/ngc/gui/filesel.c b/source/ngc/gui/filesel.c index 3d5549d..545ce4d 100644 --- a/source/ngc/gui/filesel.c +++ b/source/ngc/gui/filesel.c @@ -1,540 +1,645 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * File Selection - ***************************************************************************/ -#include "shared.h" -#include "dvd.h" -#include "iso9660.h" -#include "font.h" -#include "unzip.h" - -#define PAGESIZE 12 -#define PADCAL 70 - -static int maxfiles; -u8 havedir = 0; -u8 haveSDdir = 0; -u8 UseSDCARD = 0; -sd_file *filehandle; -char rootSDdir[SDCARD_MAX_PATH_LEN]; -int LoadFile (unsigned char *buffer); -int offset = 0; -int selection = 0; -int old_selection = 0; -int old_offset = 0; - -extern void reloadrom (); - -/*************************************************************************** - * Showfile screen - ***************************************************************************/ -static void ShowFiles (int offset, int selection) -{ - int i, j; - char text[MAXJOLIET+2]; - - ClearScreen (); - j = 0; - - for (i = offset; i < (offset + PAGESIZE) && (i < maxfiles); i++) - { - memset(text,0,MAXJOLIET+2); - if (filelist[i].flags) sprintf(text, "[%s]", filelist[i].filename + filelist[i].filename_offset); - else sprintf (text, "%s", filelist[i].filename + filelist[i].filename_offset); - - if (j == (selection - offset)) WriteCentre_HL ((j * fheight) + 120, text); - else WriteCentre ((j * fheight) + 120, text); - j++; - } - SetScreen (); -} - -/*************************************************************************** - * Update SDCARD curent directory name - ***************************************************************************/ -int updateSDdirname() -{ - int size=0; - char *test; - char temp[1024]; - - /* current directory doesn't change */ - if (strcmp(filelist[selection].filename,".") == 0) return 0; - - /* go up to parent directory */ - else if (strcmp(filelist[selection].filename,"..") == 0) - { - /* determine last subdirectory namelength */ - sprintf(temp,"%s",rootSDdir); - test= strtok(temp,"\\"); - while (test != NULL) - { - size = strlen(test); - test = strtok(NULL,"\\"); - } - - /* remove last subdirectory name */ - size = strlen(rootSDdir) - size - 1; - rootSDdir[size] = 0; - - /* handles root name */ - if (strcmp(rootSDdir,"dev0:") == 0) sprintf(rootSDdir,"dev0:\\genplus\\.."); - - return 1; - } - else - { - /* test new directory namelength */ - if ((strlen(rootSDdir)+1+strlen(filelist[selection].filename)) < SDCARD_MAX_PATH_LEN) - { - /* handles root name */ - if (strcmp(rootSDdir,"dev0:\\genplus\\..") == 0) sprintf(rootSDdir,"dev0:"); - - /* update current directory name */ - sprintf(rootSDdir, "%s\\%s",rootSDdir, filelist[selection].filename); - return 1; - } - else - { - WaitPrompt ("Dirname is too long !"); - return -1; - } - } -} - -/*************************************************************************** - * Browse SDCARD subdirectories - ***************************************************************************/ -int parseSDdirectory() -{ - int entries = 0; - int nbfiles = 0; - DIR *sddir = NULL; - - /* Get a list of files from the actual root directory */ - entries = SDCARD_ReadDir (rootSDdir, &sddir); - - if (entries < 0) entries = 0; - if (entries > MAXFILES) entries = MAXFILES; - - /* Move to DVD structure - this is required for the file selector */ - while (entries) - { - memset (&filelist[nbfiles], 0, sizeof (FILEENTRIES)); - strncpy(filelist[nbfiles].filename,sddir[nbfiles].fname,MAXJOLIET); - filelist[nbfiles].filename[MAXJOLIET-1] = 0; - filelist[nbfiles].length = sddir[nbfiles].fsize; - filelist[nbfiles].flags = (char)(sddir[nbfiles].fattr & SDCARD_ATTR_DIR); - nbfiles++; - entries--; - } - - /*** Release memory ***/ - free(sddir); - - return nbfiles; -} - -/**************************************************************************** - * FileSelector - * - * Let user select a file from the File listing - ****************************************************************************/ -void FileSelector () -{ - short p; - signed char a,b; - int haverom = 0; - int redraw = 1; - int go_up = 0; - int i,size; - - while (haverom == 0) - { - if (redraw) ShowFiles (offset, selection); - redraw = 0; - p = PAD_ButtonsDown (0); - a = PAD_StickY (0); - b = PAD_StickX (0); - - /* - * check selection screen changes - */ - - /* scroll displayed filename */ - if ((p & PAD_BUTTON_LEFT) || (b < -PADCAL)) - { - if (filelist[selection].filename_offset > 0) - { - filelist[selection].filename_offset --; - redraw = 1; - } - } - else if ((p & PAD_BUTTON_RIGHT) || (b > PADCAL)) - { - size = 0; - for (i=filelist[selection].filename_offset; i back_framewidth) - { - filelist[selection].filename_offset ++; - redraw = 1; - } - } - - /* highlight next item */ - else if ((p & PAD_BUTTON_DOWN) || (a < -PADCAL)) - { - filelist[selection].filename_offset = 0; - selection++; - if (selection == maxfiles) selection = offset = 0; - if ((selection - offset) >= PAGESIZE) offset += PAGESIZE; - redraw = 1; - } - - /* highlight previous item */ - else if ((p & PAD_BUTTON_UP) || (a > PADCAL)) - { - filelist[selection].filename_offset = 0; - selection--; - if (selection < 0) - { - selection = maxfiles - 1; - offset = selection - PAGESIZE + 1; - } - if (selection < offset) offset -= PAGESIZE; - if (offset < 0) offset = 0; - redraw = 1; - } - - /* go back one page */ - else if (p & PAD_TRIGGER_L) - { - filelist[selection].filename_offset = 0; - selection -= PAGESIZE; - if (selection < 0) - { - selection = maxfiles - 1; - offset = selection - PAGESIZE + 1; - } - if (selection < offset) offset -= PAGESIZE; - if (offset < 0) offset = 0; - redraw = 1; - } - - /* go forward one page */ - else if (p & PAD_TRIGGER_R) - { - filelist[selection].filename_offset = 0; - selection += PAGESIZE; - if (selection > maxfiles - 1) selection = offset = 0; - if ((selection - offset) >= PAGESIZE) offset += PAGESIZE; - redraw = 1; - } - - /* - * Check pressed key - */ - - /* go up one directory or quit */ - if (p & PAD_BUTTON_B) - { - filelist[selection].filename_offset = 0; - if (((!UseSDCARD) && (basedir == rootdir)) || - (UseSDCARD && strcmp(rootSDdir,"dev0:\\genplus\\..") == 0)) return; - go_up = 1; - } - - /* quit */ - if (p & PAD_TRIGGER_Z) - { - filelist[selection].filename_offset = 0; - return; - } - - /* open selected file or directory */ - if ((p & PAD_BUTTON_A) || go_up) - { - filelist[selection].filename_offset = 0; - if (go_up) - { - go_up = 0; - selection = 1; - } - - /*** This is directory ***/ - if (filelist[selection].flags) - { - if (UseSDCARD) /* SDCARD directory handler */ - { - /* update current directory */ - int status = updateSDdirname(); - - /* move to new directory */ - if (status == 1) - { - /* reinit selector (previous value is saved for one level) */ - if (selection == 1) - { - selection = old_selection; - offset = old_offset; - old_selection = 0; - old_offset = 0; - } - else - { - /* save current selector value */ - old_selection = selection; - old_offset = offset; - selection = 0; - offset = 0; - } - - - /* set new entry list */ - maxfiles = parseSDdirectory(); - if (!maxfiles) - { - /* quit */ - WaitPrompt ("Error reading directory !"); - haverom = 1; - haveSDdir = 0; - } - } - else if (status == -1) - { - /* quit */ - haverom = 1; - haveSDdir = 0; - } - } - else /* DVD directory handler */ - { - /* move to a new directory */ - if (selection != 0) - { - /* update current directory */ - rootdir = filelist[selection].offset; - rootdirlength = filelist[selection].length; - - /* reinit selector (previous value is saved for one level) */ - if (selection == 1) - { - selection = old_selection; - offset = old_offset; - old_selection = 0; - old_offset = 0; - } - else - { - /* save current selector value */ - old_selection = selection; - old_offset = offset; - selection = 0; - offset = 0; - } - - /* get new entry list */ - maxfiles = parsedirectory (); - } - } - } - else /*** This is a file ***/ - { - rootdir = filelist[selection].offset; - rootdirlength = filelist[selection].length; - genromsize = LoadFile (cart_rom); - reloadrom (); - haverom = 1; - } - redraw = 1; - } - } -} - -/**************************************************************************** - * OpenDVD - * - * Function to load a DVD directory and display to user. - ****************************************************************************/ -void OpenDVD () -{ - UseSDCARD = 0; - if (!getpvd()) - { - ShowAction("Mounting DVD ... Wait"); - DVD_Mount(); - havedir = 0; - if (!getpvd()) - { - WaitPrompt ("Failed to mount DVD"); - return; - } - } - - if (havedir == 0) - { - /* don't mess with SD entries */ - haveSDdir = 0; - - /* reinit selector */ - rootdir = basedir; - old_selection = selection = offset = old_offset = 0; - - if ((maxfiles = parsedirectory ())) - { - FileSelector (); - havedir = 1; - } - } - else FileSelector (); -} - -/**************************************************************************** - * OpenSD updated to use the new libogc. Written by softdev and pasted - * into this code by Drack. - * Modified for subdirectory browing & quick filelist recovery - * Enjoy! -*****************************************************************************/ -int OpenSD () -{ - UseSDCARD = 1; - - if (haveSDdir == 0) - { - /* don't mess with DVD entries */ - havedir = 0; - - /* reinit selector */ - old_selection = selection = offset = old_offset = 0; - - /* Reset SDCARD root directory */ - sprintf(rootSDdir,"dev0:\\genplus\\roms"); - - /* Parse initial root directory and get entries list */ - ShowAction("Reading Directory ..."); - if ((maxfiles = parseSDdirectory ())) - { - /* Select an entry */ - FileSelector (); - - /* memorize last entries list, actual root directory and selection for next access */ - haveSDdir = 1; - } - else - { - /* no entries found */ - WaitPrompt ("Error reading dev0:\\genplus\\roms"); - return 0; - } - } - /* Retrieve previous entries list and made a new selection */ - else FileSelector (); - - return 1; -} - -/**************************************************************************** - * SDCard Get Info - ****************************************************************************/ -void GetSDInfo () -{ - char fname[SDCARD_MAX_PATH_LEN]; - rootdirlength = 0; - - /* Check filename length */ - if ((strlen(rootSDdir)+1+strlen(filelist[selection].filename)) < SDCARD_MAX_PATH_LEN) - sprintf(fname, "%s\\%s",rootSDdir,filelist[selection].filename); - - else - { - WaitPrompt ("Maximum Filename Length reached !"); - haveSDdir = 0; // reset everything before next access - } - - filehandle = SDCARD_OpenFile (fname, "rb"); - if (filehandle == NULL) - { - WaitPrompt ("Unable to open file!"); - return; - } - rootdirlength = SDCARD_GetFileSize (filehandle); -} - -/**************************************************************************** - * LoadFile - * - * This function will load a file from DVD or SDCARD, in BIN, SMD or ZIP format. - * The values for offset and length are inherited from rootdir and - * rootdirlength. - * - * The buffer parameter should re-use the initial ROM buffer. - ****************************************************************************/ -int LoadFile (unsigned char *buffer) -{ - int offset; - int blocks; - int i; - u64 discoffset; - char readbuffer[2048]; - - /* SDCard Addition */ - if (UseSDCARD) GetSDInfo (); - - /* How many 2k blocks to read */ - if (rootdirlength == 0) return 0; - blocks = rootdirlength / 2048; - - offset = 0; - discoffset = rootdir; - ShowAction ("Loading ... Wait"); - - if (UseSDCARD) SDCARD_ReadFile (filehandle, &readbuffer, 2048); - else dvd_read (&readbuffer, 2048, discoffset); - - if (!IsZipFile ((char *) readbuffer)) - { - if (UseSDCARD) SDCARD_SeekFile (filehandle, 0, SDCARD_SEEK_SET); - - for (i = 0; i < blocks; i++) - { - if (UseSDCARD) SDCARD_ReadFile (filehandle, &readbuffer, 2048); - else dvd_read(readbuffer, 2048, discoffset); - memcpy (buffer + offset, readbuffer, 2048); - offset += 2048; - discoffset += 2048; - } - - /* And final cleanup */ - if (rootdirlength % 2048) - { - i = rootdirlength % 2048; - if (UseSDCARD) SDCARD_ReadFile (filehandle, &readbuffer, i); - else dvd_read (readbuffer, 2048, discoffset); - memcpy (buffer + offset, readbuffer, i); - } - } - else return UnZipBuffer (buffer, discoffset, rootdirlength); - - if (UseSDCARD) SDCARD_CloseFile (filehandle); - - return rootdirlength; -} +/**************************************************************************** + * ROM Selection Interface + * + * The following features are implemented: + * . SDCARD access with LFN support (through softdev's VFAT library) + * . DVD access + * . easy subdirectory browsing + * . ROM browser + * . alphabetical file sorting (Marty Disibio) + * . load from history list (Marty Disibio) + * + ***************************************************************************/ +#include "shared.h" +#include "dvd.h" +#include "iso9660.h" +#include "font.h" +#include "unzip.h" +#include "history.h" + +#define PAGESIZE 12 + +static int maxfiles; +static int offset = 0; +static int selection = 0; +static int old_selection = 0; +static int old_offset = 0; +static char rootSDdir[256]; +static u8 haveDVDdir = 0; +static u8 haveSDdir = 0; +static u8 UseSDCARD = 0; +static u8 UseHistory = 0; +static int LoadFile (unsigned char *buffer); + +/* globals */ +FILE *sdfile; + + +/*************************************************************************** + * FileSortCallback + * + * Quick sort callback to sort file entries with the following order: + * . + * .. + * + * + ***************************************************************************/ +static int FileSortCallback(const void *f1, const void *f2) +{ + /* Special case for implicit directories */ + if(((FILEENTRIES *)f1)->filename[0] == '.' || ((FILEENTRIES *)f2)->filename[0] == '.') + { + if(strcmp(((FILEENTRIES *)f1)->filename, ".") == 0) { return -1; } + if(strcmp(((FILEENTRIES *)f2)->filename, ".") == 0) { return 1; } + if(strcmp(((FILEENTRIES *)f1)->filename, "..") == 0) { return -1; } + if(strcmp(((FILEENTRIES *)f2)->filename, "..") == 0) { return 1; } + } + + /* If one is a file and one is a directory the directory is first. */ + if(((FILEENTRIES *)f1)->flags == 1 && ((FILEENTRIES *)f2)->flags == 0) return -1; + if(((FILEENTRIES *)f1)->flags == 0 && ((FILEENTRIES *)f2)->flags == 1) return 1; + + return stricmp(((FILEENTRIES *)f1)->filename, ((FILEENTRIES *)f2)->filename); +} + +/*************************************************************************** + * ShowFiles + * + * Show filenames list in current directory + ***************************************************************************/ +static void ShowFiles (int offset, int selection) +{ + int i, j; + char text[MAXJOLIET+2]; + + ClearScreen (); + j = 0; + + for (i = offset; i < (offset + PAGESIZE) && (i < maxfiles); i++) + { + memset(text,0,MAXJOLIET+2); + if (filelist[i].flags) sprintf(text, "[%s]", filelist[i].filename + filelist[i].filename_offset); + else sprintf (text, "%s", filelist[i].filename + filelist[i].filename_offset); + if (j == (selection - offset)) WriteCentre_HL ((j * fheight) + 120, text); + else WriteCentre ((j * fheight) + 120, text); + j++; + } + SetScreen (); +} + +/*************************************************************************** + * updateSDdirname + * + * Update ROOT directory while browsing SDCARD + ***************************************************************************/ +static int updateSDdirname() +{ + int size=0; + char *test; + char temp[1024]; + + /* current directory doesn't change */ + if (strcmp(filelist[selection].filename,".") == 0) return 0; + + /* go up to parent directory */ + else if (strcmp(filelist[selection].filename,"..") == 0) + { + /* determine last subdirectory namelength */ + sprintf(temp,"%s",rootSDdir); + test= strtok(temp,"/"); + while (test != NULL) + { + size = strlen(test); + test = strtok(NULL,"/"); + } + + /* remove last subdirectory name */ + size = strlen(rootSDdir) - size; + rootSDdir[size-1] = 0; + } + else + { + sprintf(rootSDdir, "%s%s/",rootSDdir, filelist[selection].filename); + } + + return 1; +} + +/*************************************************************************** + * parseSDdirectory + * + * List files into one SDCARD directory + ***************************************************************************/ +static int parseSDdirectory() +{ + int nbfiles = 0; + char filename[MAXPATHLEN]; + struct stat filestat; + + /* open directory */ + DIR_ITER *dir = diropen (rootSDdir); + if (dir == NULL) + { + sprintf(filename, "Error opening %s", rootSDdir); + WaitPrompt (filename); + return 0; + } + + while (dirnext(dir, filename, &filestat) == 0) + { + if (strcmp(filename,".") != 0) + { + memset(&filelist[nbfiles], 0, sizeof (FILEENTRIES)); + sprintf(filelist[nbfiles].filename,"%s",filename); + filelist[nbfiles].length = filestat.st_size; + filelist[nbfiles].flags = (filestat.st_mode & S_IFDIR) ? 1 : 0; + nbfiles++; + } + } + + dirclose(dir); + + /* Sort the file list */ + qsort(filelist, nbfiles, sizeof(FILEENTRIES), FileSortCallback); + + return nbfiles; +} + +/**************************************************************************** + * FileSelected + * + * Called when a file is selected by the user inside the FileSelector loop. + ****************************************************************************/ +static void FileSelected() +{ + /* If loading from history then we need to setup a few more things. */ + if(UseHistory) + { + /* Get the parent folder for the file. */ + strncpy(rootSDdir, history.entries[selection].filepath, MAXJOLIET-1); + rootSDdir[MAXJOLIET-1] = '\0'; + + /* Get the length of the file. This has to be done + * before calling LoadFile(). */ + char filepath[MAXJOLIET]; + struct stat filestat; + snprintf(filepath, MAXJOLIET-1, "%s%s", history.entries[selection].filepath, history.entries[selection].filename); + filepath[MAXJOLIET-1] = '\0'; + if(stat(filepath, &filestat) == 0) + { + filelist[selection].length = filestat.st_size; + } + } + + /* Add/move the file to the top of the history. */ + history_add_file(rootSDdir, filelist[selection].filename); + + rootdir = filelist[selection].offset; + rootdirlength = filelist[selection].length; + memfile_autosave(); + genromsize = LoadFile(cart_rom); + reloadrom(); + memfile_autoload(); +} + +/**************************************************************************** + * FileSelector + * + * Let user select a file from the File listing + ****************************************************************************/ +static void FileSelector () +{ + short p; + int haverom = 0; + int redraw = 1; + int go_up = 0; + int i,size; + + while (haverom == 0) + { + if (redraw) ShowFiles (offset, selection); + redraw = 0; + p = ogc_input__getMenuButtons(); + + /* scroll displayed filename */ + if (p & PAD_BUTTON_LEFT) + { + if (filelist[selection].filename_offset > 0) + { + filelist[selection].filename_offset --; + redraw = 1; + } + } + else if (p & PAD_BUTTON_RIGHT) + { + size = 0; + for (i=filelist[selection].filename_offset; i back_framewidth) + { + filelist[selection].filename_offset ++; + redraw = 1; + } + } + + /* highlight next item */ + else if (p & PAD_BUTTON_DOWN) + { + filelist[selection].filename_offset = 0; + selection++; + if (selection == maxfiles) selection = offset = 0; + if ((selection - offset) >= PAGESIZE) offset += PAGESIZE; + redraw = 1; + } + + /* highlight previous item */ + else if (p & PAD_BUTTON_UP) + { + filelist[selection].filename_offset = 0; + selection--; + if (selection < 0) + { + selection = maxfiles - 1; + offset = selection - PAGESIZE + 1; + } + if (selection < offset) offset -= PAGESIZE; + if (offset < 0) offset = 0; + redraw = 1; + } + + /* go back one page */ + else if (p & PAD_TRIGGER_L) + { + filelist[selection].filename_offset = 0; + selection -= PAGESIZE; + if (selection < 0) + { + selection = maxfiles - 1; + offset = selection - PAGESIZE + 1; + } + if (selection < offset) offset -= PAGESIZE; + if (offset < 0) offset = 0; + redraw = 1; + } + + /* go forward one page */ + else if (p & PAD_TRIGGER_R) + { + filelist[selection].filename_offset = 0; + selection += PAGESIZE; + if (selection > maxfiles - 1) selection = offset = 0; + if ((selection - offset) >= PAGESIZE) offset += PAGESIZE; + redraw = 1; + } + + /* go up one directory or quit */ + if (p & PAD_BUTTON_B) + { + filelist[selection].filename_offset = 0; + if (UseSDCARD) + { + if (strcmp(filelist[0].filename,"..") != 0) return; + } + else + { + if (basedir == rootdir) return; + } + go_up = 1; + } + + /* quit */ + if (p & PAD_TRIGGER_Z) + { + filelist[selection].filename_offset = 0; + return; + } + + /* open selected file or directory */ + if ((p & PAD_BUTTON_A) || go_up) + { + filelist[selection].filename_offset = 0; + if (go_up) + { + /* select item #1 */ + go_up = 0; + selection = UseSDCARD ? 0 : 1; + } + + /*** This is directory ***/ + if (filelist[selection].flags) + { + /* SDCARD directory handler */ + if (UseSDCARD) + { + /* update current directory */ + if (updateSDdirname()) + { + /* reinit selector (previous value is saved for one level) */ + if (selection == 0) + { + selection = old_selection; + offset = old_offset; + old_selection = 0; + old_offset = 0; + } + else + { + /* save current selector value */ + old_selection = selection; + old_offset = offset; + selection = 0; + offset = 0; + } + + /* set new entry list */ + maxfiles = parseSDdirectory(); + if (!maxfiles) + { + /* quit */ + WaitPrompt ("No files found !"); + haverom = 1; + haveSDdir = 0; + } + } + } + else /* DVD directory handler */ + { + /* move to a new directory */ + if (selection != 0) + { + /* update current directory */ + rootdir = filelist[selection].offset; + rootdirlength = filelist[selection].length; + + /* reinit selector (previous value is saved for one level) */ + if (selection == 1) + { + selection = old_selection; + offset = old_offset; + old_selection = 0; + old_offset = 0; + } + else + { + /* save current selector value */ + old_selection = selection; + old_offset = offset; + selection = 0; + offset = 0; + } + + /* get new entry list */ + maxfiles = parseDVDdirectory (); + } + } + } + else /*** This is a file ***/ + { + FileSelected(); + haverom = 1; + } + redraw = 1; + } + } +} + +/**************************************************************************** + * OpenDVD + * + * Function to load a DVD directory and display to user. + ****************************************************************************/ +void OpenDVD () +{ + UseSDCARD = 0; + UseHistory = 0; + + if (!getpvd()) + { + ShowAction("Mounting DVD ... Wait"); +#ifndef HW_RVL + DVD_Mount(); +#endif + haveDVDdir = 0; + if (!getpvd()) + { + WaitPrompt ("Failed to mount DVD"); + return; + } + } + + if (haveDVDdir == 0) + { + /* don't mess with SD entries */ + haveSDdir = 0; + + /* reinit selector */ + rootdir = basedir; + old_selection = selection = offset = old_offset = 0; + + if ((maxfiles = parseDVDdirectory ())) + { + FileSelector (); + haveDVDdir = 1; + } + } + else FileSelector (); +} + +/**************************************************************************** + * OpenSD + * + * Function to load a SDCARD directory and display to user. + ****************************************************************************/ +int OpenSD () +{ + UseSDCARD = 1; + UseHistory = 0; + + if (haveSDdir == 0) + { + /* don't mess with DVD entries */ + haveDVDdir = 0; + + /* reinit selector */ + old_selection = selection = offset = old_offset = 0; + + /* Reset SDCARD root directory */ + sprintf (rootSDdir, "/genplus/roms/"); + + /* if directory doesn't exist, use root */ + DIR_ITER *dir = diropen(rootSDdir); + if (dir == NULL) sprintf (rootSDdir, "fat:/"); + else dirclose(dir); + } + + /* Parse root directory and get entries list */ + ShowAction("Reading Directory ..."); + if ((maxfiles = parseSDdirectory ())) + { + /* Select an entry */ + FileSelector (); + + /* memorize last entries list, actual root directory and selection for next access */ + haveSDdir = 1; + } + else + { + /* no entries found */ + WaitPrompt ("no files found !"); + haveSDdir = 0; + return 0; + } + + return 1; +} + +void OpenHistory() +{ + int i; + + UseSDCARD = 1; + UseHistory = 1; + + /* don't mess with SD entries */ + haveSDdir = 0; + + /* reinit selector */ + old_selection = selection = offset = old_offset = 0; + + /* Reset SDCARD root directory */ + /* Make this empty because the history */ + /* entry will contain the entire path. */ + /*sprintf (rootSDdir, "");*/ + + /* Recreate the file listing from the history + * as if all of the roms were in the same directory. */ + ShowAction("Reading Files ..."); + + maxfiles = 0; + for(i=0; i < NUM_HISTORY_ENTRIES; i++) + { + if(history.entries[i].filepath[0] > 0) + { + filelist[i].offset = 0; + filelist[i].length = 0; + filelist[i].flags = 0; + filelist[i].filename_offset = 0; + strncpy(filelist[i].filename, history.entries[i].filename, MAXJOLIET-1); + filelist[i].filename[MAXJOLIET-1] = '\0'; + + maxfiles++; + } + else + { + /* Found the end of the list. */ + break; + } + } + + if(!maxfiles) + { + WaitPrompt ("No recent files"); + return; + } + + FileSelector(); +} + + +/**************************************************************************** + * LoadFile + * + * This function will load a file from DVD or SDCARD, in BIN, SMD or ZIP format. + * The values for offset and length are inherited from rootdir and + * rootdirlength. + * + * The buffer parameter should re-use the initial ROM buffer. + ****************************************************************************/ +static int LoadFile (unsigned char *buffer) +{ + int readoffset; + int blocks; + int i; + u64 discoffset = 0; + char readbuffer[2048]; + char fname[MAXPATHLEN]; + + /* SDCard access */ + if (UseSDCARD) + { + /* open file */ + sprintf(fname, "%s%s",rootSDdir,filelist[selection].filename); + sdfile = fopen(fname, "rb"); + if (sdfile == NULL) + { + WaitPrompt ("Unable to open file!"); + haveSDdir = 0; + return 0; + } + } + + /* How many 2k blocks to read */ + if (rootdirlength == 0) return 0; + blocks = rootdirlength / 2048; + readoffset = 0; + + ShowAction ("Loading ... Wait"); + + /* Read first data chunk */ + if (UseSDCARD) + { + fread(readbuffer, 1, 2048, sdfile); + } + else + { + discoffset = rootdir; + dvd_read (&readbuffer, 2048, discoffset); + } + + /* determine file type */ + if (!IsZipFile ((char *) readbuffer)) + { + /* go back to file start */ + if (UseSDCARD) + { + fseek(sdfile, 0, SEEK_SET); + } + + /* read data chunks */ + for (i = 0; i < blocks; i++) + { + if (UseSDCARD) + { + fread(readbuffer, 1, 2048, sdfile); + } + else + { + dvd_read(readbuffer, 2048, discoffset); + discoffset += 2048; + } + + memcpy (buffer + readoffset, readbuffer, 2048); + readoffset += 2048; + } + + /* final read */ + i = rootdirlength % 2048; + if (i) + { + if (UseSDCARD) fread(readbuffer, 1, i, sdfile); + else dvd_read (readbuffer, 2048, discoffset); + memcpy (buffer + readoffset, readbuffer, i); + } + } + else + { + /* unzip file */ + return UnZipBuffer (buffer, discoffset, rootdirlength, UseSDCARD); + } + + /* close SD file */ + if (UseSDCARD) fclose(sdfile); + + return rootdirlength; +} diff --git a/source/ngc/gui/filesel.c.new b/source/ngc/gui/filesel.c.new deleted file mode 100644 index 75e98c8..0000000 --- a/source/ngc/gui/filesel.c.new +++ /dev/null @@ -1,526 +0,0 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * File Selection - ***************************************************************************/ -#include "shared.h" -#include "dvd.h" -#include "iso9660.h" -#include "font.h" -#include "unzip.h" -#include "diskio.h" -#include "vfat.h" - - -#define PAGESIZE 12 -#define PADCAL 70 - -static int maxfiles; -u8 havedir = 0; -u8 haveSDdir = 0; -u8 UseSDCARD = 0; -char rootSDdir[SDCARD_MAX_PATH_LEN]; -int LoadFile (unsigned char *buffer); -int offset = 0; -int selection = 0; -int old_selection = 0; -int old_offset = 0; -VFATFS fs; -FSDIRENTRY f; - - -extern void reloadrom (); - -/*************************************************************************** - * Showfile screen - ***************************************************************************/ -static void ShowFiles (int offset, int selection) -{ - int i, j; - char text[MAX_LONG_NAME+2]; - - ClearScreen (); - j = 0; - - for (i = offset; i < (offset + PAGESIZE) && (i < maxfiles); i++) - { - memset(text,0,MAX_LONG_NAME+2); - if (filelist[i].flags) sprintf(text, "[%s]", filelist[i].displayname + filelist[i].filename_offset); - else sprintf (text, "%s", filelist[i].displayname + filelist[i].filename_offset); - - if (j == (selection - offset)) WriteCentre_HL ((j * fheight) + 120, text); - else WriteCentre ((j * fheight) + 120, text); - j++; - } - SetScreen (); -} - -/*************************************************************************** - * Update SDCARD curent directory name - ***************************************************************************/ -int updateSDdirname() -{ - int size=0; - char *test; - char temp[1024]; - - - /* go up to parent directory */ - if (strcmp(filelist[selection].filename,"..") == 0) - { - /* determine last subdirectory namelength */ - sprintf(temp,"%s",rootSDdir); - test= strtok(temp,"/"); - while (test != NULL) - { - size = strlen(test); - test = strtok(NULL,"/"); - } - - /* remove last subdirectory name */ - size = strlen(rootSDdir) - size - 1; - rootSDdir[size] = 0; - - return 1; - } - else - { - /* update current directory name */ - sprintf(rootSDdir, "%s/%s",rootSDdir, filelist[selection].filename); - return 1; - } -} - -/*************************************************************************** - * Browse SDCARD subdirectories - ***************************************************************************/ -int parseSDdirectory() -{ - int nbfiles = 0; - FSDIRENTRY fsdir; - - /* Get a list of files from the actual root directory */ - int res = VFAT_opendir(0, &fsdir, rootSDdir); - - if (res == FS_SUCCESS) - { - while ( VFAT_readdir(&fsdir) == FS_SUCCESS ) - { - memset (&filelist[nbfiles], 0, sizeof (FILEENTRIES)); - strcpy(filelist[nbfiles].displayname, fsdir.longname); - strcpy(filelist[nbfiles].filename, fsdir.shortname); - filelist[nbfiles].length = fsdir.fsize; - filelist[nbfiles].flags = fsdir.dirent.attribute & ATTR_DIRECTORY; - nbfiles++; - } - - VFAT_closedir(&fsdir); - } - - return nbfiles; -} - -/**************************************************************************** - * FileSelector - * - * Let user select a file from the File listing - ****************************************************************************/ -void FileSelector () -{ - short p; - signed char a,b; - int haverom = 0; - int redraw = 1; - int go_up = 0; - int i,size; - - while (haverom == 0) - { - if (redraw) ShowFiles (offset, selection); - redraw = 0; - p = PAD_ButtonsDown (0); - a = PAD_StickY (0); - b = PAD_StickX (0); - - /* - * check selection screen changes - */ - - /* scroll displayed filename */ - if ((p & PAD_BUTTON_LEFT) || (b < -PADCAL)) - { - if (filelist[selection].filename_offset > 0) - { - filelist[selection].filename_offset --; - redraw = 1; - } - } - else if ((p & PAD_BUTTON_RIGHT) || (b > PADCAL)) - { - size = 0; - for (i=filelist[selection].filename_offset; i back_framewidth) - { - filelist[selection].filename_offset ++; - redraw = 1; - } - } - - /* highlight next item */ - else if ((p & PAD_BUTTON_DOWN) || (a < -PADCAL)) - { - filelist[selection].filename_offset = 0; - selection++; - if (selection == maxfiles) selection = offset = 0; - if ((selection - offset) >= PAGESIZE) offset += PAGESIZE; - redraw = 1; - } - - /* highlight previous item */ - else if ((p & PAD_BUTTON_UP) || (a > PADCAL)) - { - filelist[selection].filename_offset = 0; - selection--; - if (selection < 0) - { - selection = maxfiles - 1; - offset = selection - PAGESIZE + 1; - } - if (selection < offset) offset -= PAGESIZE; - if (offset < 0) offset = 0; - redraw = 1; - } - - /* go back one page */ - else if (p & PAD_TRIGGER_L) - { - filelist[selection].filename_offset = 0; - selection -= PAGESIZE; - if (selection < 0) - { - selection = maxfiles - 1; - offset = selection - PAGESIZE + 1; - } - if (selection < offset) offset -= PAGESIZE; - if (offset < 0) offset = 0; - redraw = 1; - } - - /* go forward one page */ - else if (p & PAD_TRIGGER_R) - { - filelist[selection].filename_offset = 0; - selection += PAGESIZE; - if (selection > maxfiles - 1) selection = offset = 0; - if ((selection - offset) >= PAGESIZE) offset += PAGESIZE; - redraw = 1; - } - - /* - * Check pressed key - */ - - /* go up one directory or quit */ - if (p & PAD_BUTTON_B) - { - filelist[selection].filename_offset = 0; - if (((!UseSDCARD) && (basedir == rootdir)) || - (UseSDCARD && strcmp(rootSDdir,"/") == 0)) return; - go_up = 1; - } - - /* quit */ - if (p & PAD_TRIGGER_Z) - { - filelist[selection].filename_offset = 0; - return; - } - - /* open selected file or directory */ - if ((p & PAD_BUTTON_A) || go_up) - { - filelist[selection].filename_offset = 0; - if (go_up) - { - go_up = 0; - selection = UseSDCARD ? 0 : 1; - } - - /*** This is directory ***/ - if (filelist[selection].flags) - { - /* SDCARD directory handler */ - if (UseSDCARD) - { - /* update current directory */ - int status = updateSDdirname(); - - /* move to new directory */ - if (status == 1) - { - /* reinit selector (previous value is saved for one level) */ - if (selection == 1) - { - selection = old_selection; - offset = old_offset; - old_selection = 0; - old_offset = 0; - } - else - { - /* save current selector value */ - old_selection = selection; - old_offset = offset; - selection = 0; - offset = 0; - } - - /* set new entry list */ - maxfiles = parseSDdirectory(); - if (!maxfiles) - { - /* quit */ - WaitPrompt ("Error reading directory !"); - haverom = 1; - haveSDdir = 0; - } - } - else if (status == -1) - { - /* quit */ - haverom = 1; - haveSDdir = 0; - } - } - /* DVD directory handler */ - else - { - /* move to a new directory */ - if (selection != 0) - { - /* update current directory */ - rootdir = filelist[selection].offset; - rootdirlength = filelist[selection].length; - - /* reinit selector (previous value is saved for one level) */ - if (selection == 1) - { - selection = old_selection; - offset = old_offset; - old_selection = 0; - old_offset = 0; - } - else - { - /* save current selector value */ - old_selection = selection; - old_offset = offset; - selection = 0; - offset = 0; - } - - /* get new entry list */ - maxfiles = parsedirectory (); - } - } - } - else /*** This is a file ***/ - { - rootdir = filelist[selection].offset; - rootdirlength = filelist[selection].length; - genromsize = LoadFile (cart_rom); - reloadrom (); - haverom = 1; - } - redraw = 1; - } - } -} - -/**************************************************************************** - * OpenDVD - * - * Function to load a DVD directory and display to user. - ****************************************************************************/ -void OpenDVD () -{ - UseSDCARD = 0; - if (!getpvd()) - { - ShowAction("Mounting DVD ... Wait"); - DVD_Mount(); - havedir = 0; - if (!getpvd()) - { - WaitPrompt ("Failed to mount DVD"); - return; - } - } - - if (havedir == 0) - { - /* don't mess with SD entries */ - haveSDdir = 0; - - /* reinit selector */ - rootdir = basedir; - old_selection = selection = offset = old_offset = 0; - - if ((maxfiles = parsedirectory ())) - { - FileSelector (); - havedir = 1; - } - } - else FileSelector (); -} - -/**************************************************************************** - * OpenSD updated to use the new libogc. Written by softdev and pasted - * into this code by Drack. - * Modified for subdirectory browing & quick filelist recovery - * Enjoy! -*****************************************************************************/ -int OpenSD () -{ - UseSDCARD = 1; - char msg[20]; - - if (haveSDdir == 0) - { - /* don't mess with DVD entries */ - havedir = 0; - - /* reinit selector */ - old_selection = selection = offset = old_offset = 0; - - /* Reset SDCARD root directory */ - sprintf(rootSDdir,"/genplus/roms"); - - /* Parse initial root directory and get entries list */ - ShowAction("Reading Directory ..."); - int res = VFAT_mount(FS_SLOTA, &fs); - if ( res != FS_TYPE_FAT16 ) - { - sprintf(msg,"Error mounting SDCARD: %d", res); - WaitPrompt (msg); - return 0; - } - - if ((maxfiles = parseSDdirectory ())) - { - /* Select an entry */ - FileSelector (); - - /* memorize last entries list, actual root directory and selection for next access */ - haveSDdir = 1; - } - else - { - /* no entries found */ - WaitPrompt ("Error reading /genplus/roms"); - return 0; - } - } - /* Retrieve previous entries list and made a new selection */ - else FileSelector (); - - return 1; -} - -/**************************************************************************** - * SDCard Get Info - ****************************************************************************/ -void GetSDInfo () -{ - char fname[SDCARD_MAX_PATH_LEN]; - rootdirlength = 0; - - /* Check filename length */ - sprintf(fname, "%s/%s",rootSDdir,filelist[selection].filename); - - int res = VFAT_fopen(0, &f, fname, FS_READ); - if (res != FS_SUCCESS ) - { - WaitPrompt ("Unable to open file!"); - return; - } -} - -/**************************************************************************** - * LoadFile - * - * This function will load a file from DVD or SDCARD, in BIN, SMD or ZIP format. - * The values for offset and length are inherited from rootdir and - * rootdirlength. - * - * The buffer parameter should re-use the initial ROM buffer. - ****************************************************************************/ -int LoadFile (unsigned char *buffer) -{ - int offset; - int blocks; - int i; - u64 discoffset; - char readbuffer[2048]; - - /* SDCard Addition */ - if (UseSDCARD) GetSDInfo (); - - /* How many 2k blocks to read */ - if (rootdirlength == 0) return 0; - blocks = rootdirlength / 2048; - - offset = 0; - discoffset = rootdir; - ShowAction ("Loading ... Wait"); - - if (UseSDCARD) VFAT_fread(&f, readbuffer, 2048); - else dvd_read (&readbuffer, 2048, discoffset); - - if (!IsZipFile ((char *) readbuffer)) - { - if (UseSDCARD) VFAT_fseek(&f, 0, SEEK_SET); - - for (i = 0; i < blocks; i++) - { - if (UseSDCARD) VFAT_fread (&f, readbuffer, 2048); - else dvd_read(readbuffer, 2048, discoffset); - memcpy (buffer + offset, readbuffer, 2048); - offset += 2048; - discoffset += 2048; - } - - /* And final cleanup */ - if (rootdirlength % 2048) - { - i = rootdirlength % 2048; - if (UseSDCARD) VFAT_fread (&f, readbuffer, i); - else dvd_read (readbuffer, 2048, discoffset); - memcpy (buffer + offset, readbuffer, i); - } - } - else return UnZipBuffer (buffer, discoffset, rootdirlength); - - if (UseSDCARD) VFAT_fclose(&f); - - return rootdirlength; -} diff --git a/source/ngc/gui/filesel.c.old b/source/ngc/gui/filesel.c.old deleted file mode 100644 index 3d5549d..0000000 --- a/source/ngc/gui/filesel.c.old +++ /dev/null @@ -1,540 +0,0 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * File Selection - ***************************************************************************/ -#include "shared.h" -#include "dvd.h" -#include "iso9660.h" -#include "font.h" -#include "unzip.h" - -#define PAGESIZE 12 -#define PADCAL 70 - -static int maxfiles; -u8 havedir = 0; -u8 haveSDdir = 0; -u8 UseSDCARD = 0; -sd_file *filehandle; -char rootSDdir[SDCARD_MAX_PATH_LEN]; -int LoadFile (unsigned char *buffer); -int offset = 0; -int selection = 0; -int old_selection = 0; -int old_offset = 0; - -extern void reloadrom (); - -/*************************************************************************** - * Showfile screen - ***************************************************************************/ -static void ShowFiles (int offset, int selection) -{ - int i, j; - char text[MAXJOLIET+2]; - - ClearScreen (); - j = 0; - - for (i = offset; i < (offset + PAGESIZE) && (i < maxfiles); i++) - { - memset(text,0,MAXJOLIET+2); - if (filelist[i].flags) sprintf(text, "[%s]", filelist[i].filename + filelist[i].filename_offset); - else sprintf (text, "%s", filelist[i].filename + filelist[i].filename_offset); - - if (j == (selection - offset)) WriteCentre_HL ((j * fheight) + 120, text); - else WriteCentre ((j * fheight) + 120, text); - j++; - } - SetScreen (); -} - -/*************************************************************************** - * Update SDCARD curent directory name - ***************************************************************************/ -int updateSDdirname() -{ - int size=0; - char *test; - char temp[1024]; - - /* current directory doesn't change */ - if (strcmp(filelist[selection].filename,".") == 0) return 0; - - /* go up to parent directory */ - else if (strcmp(filelist[selection].filename,"..") == 0) - { - /* determine last subdirectory namelength */ - sprintf(temp,"%s",rootSDdir); - test= strtok(temp,"\\"); - while (test != NULL) - { - size = strlen(test); - test = strtok(NULL,"\\"); - } - - /* remove last subdirectory name */ - size = strlen(rootSDdir) - size - 1; - rootSDdir[size] = 0; - - /* handles root name */ - if (strcmp(rootSDdir,"dev0:") == 0) sprintf(rootSDdir,"dev0:\\genplus\\.."); - - return 1; - } - else - { - /* test new directory namelength */ - if ((strlen(rootSDdir)+1+strlen(filelist[selection].filename)) < SDCARD_MAX_PATH_LEN) - { - /* handles root name */ - if (strcmp(rootSDdir,"dev0:\\genplus\\..") == 0) sprintf(rootSDdir,"dev0:"); - - /* update current directory name */ - sprintf(rootSDdir, "%s\\%s",rootSDdir, filelist[selection].filename); - return 1; - } - else - { - WaitPrompt ("Dirname is too long !"); - return -1; - } - } -} - -/*************************************************************************** - * Browse SDCARD subdirectories - ***************************************************************************/ -int parseSDdirectory() -{ - int entries = 0; - int nbfiles = 0; - DIR *sddir = NULL; - - /* Get a list of files from the actual root directory */ - entries = SDCARD_ReadDir (rootSDdir, &sddir); - - if (entries < 0) entries = 0; - if (entries > MAXFILES) entries = MAXFILES; - - /* Move to DVD structure - this is required for the file selector */ - while (entries) - { - memset (&filelist[nbfiles], 0, sizeof (FILEENTRIES)); - strncpy(filelist[nbfiles].filename,sddir[nbfiles].fname,MAXJOLIET); - filelist[nbfiles].filename[MAXJOLIET-1] = 0; - filelist[nbfiles].length = sddir[nbfiles].fsize; - filelist[nbfiles].flags = (char)(sddir[nbfiles].fattr & SDCARD_ATTR_DIR); - nbfiles++; - entries--; - } - - /*** Release memory ***/ - free(sddir); - - return nbfiles; -} - -/**************************************************************************** - * FileSelector - * - * Let user select a file from the File listing - ****************************************************************************/ -void FileSelector () -{ - short p; - signed char a,b; - int haverom = 0; - int redraw = 1; - int go_up = 0; - int i,size; - - while (haverom == 0) - { - if (redraw) ShowFiles (offset, selection); - redraw = 0; - p = PAD_ButtonsDown (0); - a = PAD_StickY (0); - b = PAD_StickX (0); - - /* - * check selection screen changes - */ - - /* scroll displayed filename */ - if ((p & PAD_BUTTON_LEFT) || (b < -PADCAL)) - { - if (filelist[selection].filename_offset > 0) - { - filelist[selection].filename_offset --; - redraw = 1; - } - } - else if ((p & PAD_BUTTON_RIGHT) || (b > PADCAL)) - { - size = 0; - for (i=filelist[selection].filename_offset; i back_framewidth) - { - filelist[selection].filename_offset ++; - redraw = 1; - } - } - - /* highlight next item */ - else if ((p & PAD_BUTTON_DOWN) || (a < -PADCAL)) - { - filelist[selection].filename_offset = 0; - selection++; - if (selection == maxfiles) selection = offset = 0; - if ((selection - offset) >= PAGESIZE) offset += PAGESIZE; - redraw = 1; - } - - /* highlight previous item */ - else if ((p & PAD_BUTTON_UP) || (a > PADCAL)) - { - filelist[selection].filename_offset = 0; - selection--; - if (selection < 0) - { - selection = maxfiles - 1; - offset = selection - PAGESIZE + 1; - } - if (selection < offset) offset -= PAGESIZE; - if (offset < 0) offset = 0; - redraw = 1; - } - - /* go back one page */ - else if (p & PAD_TRIGGER_L) - { - filelist[selection].filename_offset = 0; - selection -= PAGESIZE; - if (selection < 0) - { - selection = maxfiles - 1; - offset = selection - PAGESIZE + 1; - } - if (selection < offset) offset -= PAGESIZE; - if (offset < 0) offset = 0; - redraw = 1; - } - - /* go forward one page */ - else if (p & PAD_TRIGGER_R) - { - filelist[selection].filename_offset = 0; - selection += PAGESIZE; - if (selection > maxfiles - 1) selection = offset = 0; - if ((selection - offset) >= PAGESIZE) offset += PAGESIZE; - redraw = 1; - } - - /* - * Check pressed key - */ - - /* go up one directory or quit */ - if (p & PAD_BUTTON_B) - { - filelist[selection].filename_offset = 0; - if (((!UseSDCARD) && (basedir == rootdir)) || - (UseSDCARD && strcmp(rootSDdir,"dev0:\\genplus\\..") == 0)) return; - go_up = 1; - } - - /* quit */ - if (p & PAD_TRIGGER_Z) - { - filelist[selection].filename_offset = 0; - return; - } - - /* open selected file or directory */ - if ((p & PAD_BUTTON_A) || go_up) - { - filelist[selection].filename_offset = 0; - if (go_up) - { - go_up = 0; - selection = 1; - } - - /*** This is directory ***/ - if (filelist[selection].flags) - { - if (UseSDCARD) /* SDCARD directory handler */ - { - /* update current directory */ - int status = updateSDdirname(); - - /* move to new directory */ - if (status == 1) - { - /* reinit selector (previous value is saved for one level) */ - if (selection == 1) - { - selection = old_selection; - offset = old_offset; - old_selection = 0; - old_offset = 0; - } - else - { - /* save current selector value */ - old_selection = selection; - old_offset = offset; - selection = 0; - offset = 0; - } - - - /* set new entry list */ - maxfiles = parseSDdirectory(); - if (!maxfiles) - { - /* quit */ - WaitPrompt ("Error reading directory !"); - haverom = 1; - haveSDdir = 0; - } - } - else if (status == -1) - { - /* quit */ - haverom = 1; - haveSDdir = 0; - } - } - else /* DVD directory handler */ - { - /* move to a new directory */ - if (selection != 0) - { - /* update current directory */ - rootdir = filelist[selection].offset; - rootdirlength = filelist[selection].length; - - /* reinit selector (previous value is saved for one level) */ - if (selection == 1) - { - selection = old_selection; - offset = old_offset; - old_selection = 0; - old_offset = 0; - } - else - { - /* save current selector value */ - old_selection = selection; - old_offset = offset; - selection = 0; - offset = 0; - } - - /* get new entry list */ - maxfiles = parsedirectory (); - } - } - } - else /*** This is a file ***/ - { - rootdir = filelist[selection].offset; - rootdirlength = filelist[selection].length; - genromsize = LoadFile (cart_rom); - reloadrom (); - haverom = 1; - } - redraw = 1; - } - } -} - -/**************************************************************************** - * OpenDVD - * - * Function to load a DVD directory and display to user. - ****************************************************************************/ -void OpenDVD () -{ - UseSDCARD = 0; - if (!getpvd()) - { - ShowAction("Mounting DVD ... Wait"); - DVD_Mount(); - havedir = 0; - if (!getpvd()) - { - WaitPrompt ("Failed to mount DVD"); - return; - } - } - - if (havedir == 0) - { - /* don't mess with SD entries */ - haveSDdir = 0; - - /* reinit selector */ - rootdir = basedir; - old_selection = selection = offset = old_offset = 0; - - if ((maxfiles = parsedirectory ())) - { - FileSelector (); - havedir = 1; - } - } - else FileSelector (); -} - -/**************************************************************************** - * OpenSD updated to use the new libogc. Written by softdev and pasted - * into this code by Drack. - * Modified for subdirectory browing & quick filelist recovery - * Enjoy! -*****************************************************************************/ -int OpenSD () -{ - UseSDCARD = 1; - - if (haveSDdir == 0) - { - /* don't mess with DVD entries */ - havedir = 0; - - /* reinit selector */ - old_selection = selection = offset = old_offset = 0; - - /* Reset SDCARD root directory */ - sprintf(rootSDdir,"dev0:\\genplus\\roms"); - - /* Parse initial root directory and get entries list */ - ShowAction("Reading Directory ..."); - if ((maxfiles = parseSDdirectory ())) - { - /* Select an entry */ - FileSelector (); - - /* memorize last entries list, actual root directory and selection for next access */ - haveSDdir = 1; - } - else - { - /* no entries found */ - WaitPrompt ("Error reading dev0:\\genplus\\roms"); - return 0; - } - } - /* Retrieve previous entries list and made a new selection */ - else FileSelector (); - - return 1; -} - -/**************************************************************************** - * SDCard Get Info - ****************************************************************************/ -void GetSDInfo () -{ - char fname[SDCARD_MAX_PATH_LEN]; - rootdirlength = 0; - - /* Check filename length */ - if ((strlen(rootSDdir)+1+strlen(filelist[selection].filename)) < SDCARD_MAX_PATH_LEN) - sprintf(fname, "%s\\%s",rootSDdir,filelist[selection].filename); - - else - { - WaitPrompt ("Maximum Filename Length reached !"); - haveSDdir = 0; // reset everything before next access - } - - filehandle = SDCARD_OpenFile (fname, "rb"); - if (filehandle == NULL) - { - WaitPrompt ("Unable to open file!"); - return; - } - rootdirlength = SDCARD_GetFileSize (filehandle); -} - -/**************************************************************************** - * LoadFile - * - * This function will load a file from DVD or SDCARD, in BIN, SMD or ZIP format. - * The values for offset and length are inherited from rootdir and - * rootdirlength. - * - * The buffer parameter should re-use the initial ROM buffer. - ****************************************************************************/ -int LoadFile (unsigned char *buffer) -{ - int offset; - int blocks; - int i; - u64 discoffset; - char readbuffer[2048]; - - /* SDCard Addition */ - if (UseSDCARD) GetSDInfo (); - - /* How many 2k blocks to read */ - if (rootdirlength == 0) return 0; - blocks = rootdirlength / 2048; - - offset = 0; - discoffset = rootdir; - ShowAction ("Loading ... Wait"); - - if (UseSDCARD) SDCARD_ReadFile (filehandle, &readbuffer, 2048); - else dvd_read (&readbuffer, 2048, discoffset); - - if (!IsZipFile ((char *) readbuffer)) - { - if (UseSDCARD) SDCARD_SeekFile (filehandle, 0, SDCARD_SEEK_SET); - - for (i = 0; i < blocks; i++) - { - if (UseSDCARD) SDCARD_ReadFile (filehandle, &readbuffer, 2048); - else dvd_read(readbuffer, 2048, discoffset); - memcpy (buffer + offset, readbuffer, 2048); - offset += 2048; - discoffset += 2048; - } - - /* And final cleanup */ - if (rootdirlength % 2048) - { - i = rootdirlength % 2048; - if (UseSDCARD) SDCARD_ReadFile (filehandle, &readbuffer, i); - else dvd_read (readbuffer, 2048, discoffset); - memcpy (buffer + offset, readbuffer, i); - } - } - else return UnZipBuffer (buffer, discoffset, rootdirlength); - - if (UseSDCARD) SDCARD_CloseFile (filehandle); - - return rootdirlength; -} diff --git a/source/ngc/gui/font.c b/source/ngc/gui/font.c index 34a9b95..618a938 100644 --- a/source/ngc/gui/font.c +++ b/source/ngc/gui/font.c @@ -1,24 +1,3 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - ***************************************************************************/ - /***************************************************************************** * IPL FONT Engine * @@ -26,9 +5,613 @@ * Added IPL font extraction *****************************************************************************/ #include "shared.h" -#include "font.h" #include "gpback.h" +/*** IPL Font (ripped from original BOOTROM) ***/ +static unsigned char iplfont[]= +{ + 0x59,0x61,0x79,0x30,0x00,0x01,0x01,0x10,0x00,0x00,0x03,0x08,0x00,0x00,0x13,0x94, + 0xfd,0x77,0x7e,0xfb,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xfb,0xff,0xff, + 0xfe,0xff,0x7f,0x9f,0xff,0xff,0xfd,0xed,0xdb,0xb3,0x3f,0x73,0x27,0xdf,0xbe,0xfb, + 0xe7,0x3e,0xe9,0xfd,0xf9,0x51,0xfd,0xf7,0xdf,0x7d,0x5f,0x77,0xee,0x7d,0xdf,0xff, + 0xfb,0xff,0x7f,0xfb,0xbf,0xb7,0xef,0xff,0xeb,0xff,0xdf,0xaf,0x7d,0xf1,0xdd,0x7f, + 0xff,0xbf,0xb3,0xff,0x7e,0x9f,0xbf,0x7f,0xfe,0xbf,0xdf,0xf4,0xfe,0x7d,0xff,0xff, + 0xba,0x6f,0xe5,0xff,0xfe,0xd4,0xbf,0xf7,0xbe,0x7e,0xbf,0xcf,0xbf,0xf5,0x6b,0xfd, + 0xff,0xd7,0xd5,0x7f,0x7a,0xd0,0xbe,0xd3,0xf5,0xfe,0xff,0xe5,0xbf,0x7e,0xf9,0xfc, + 0x79,0x67,0xe8,0x35,0xbe,0x9b,0xbf,0x72,0xf0,0xcf,0x49,0xf7,0xd5,0x72,0xb6,0x7c, + 0xff,0xf5,0xa3,0xfc,0xfa,0xba,0xa9,0x97,0xb5,0xb9,0xfb,0x1f,0xff,0xc0,0xb2,0x2f, + 0xf4,0xe7,0x3f,0xff,0xfe,0xff,0x43,0xff,0x6f,0x69,0xaf,0xdc,0xe7,0x8c,0x48,0xaa, + 0x3f,0x00,0x0f,0x70,0x73,0x28,0x3b,0x1f,0x1a,0x7f,0xa4,0xff,0x42,0x7a,0x7f,0x6b, + 0x74,0x8f,0xaa,0xbc,0xaf,0xa3,0xcd,0x5e,0x02,0x16,0x3e,0xaa,0xfc,0x55,0xce,0x2d, + 0x7b,0x3c,0xa9,0x57,0xd2,0x72,0x7f,0x7f,0x7f,0xaf,0xb4,0x3f,0xec,0xab,0xff,0xff, + 0xff,0xfd,0xff,0xfe,0xff,0xea,0x6a,0x93,0xa0,0x49,0x4f,0xc6,0x9e,0x04,0xb6,0x7f, + 0xfd,0xff,0xfa,0x54,0xf4,0xcb,0xa9,0x3d,0x0a,0x14,0xa7,0xe3,0x77,0xd2,0xdf,0xfd, + 0xff,0xe2,0xff,0x8e,0x07,0xff,0x89,0x8e,0x80,0x88,0x73,0x7a,0x71,0x04,0x6f,0xbf, + 0x52,0x9f,0x3f,0xd2,0x9f,0x1c,0x18,0xf7,0xff,0x82,0x95,0x7f,0xae,0x64,0x3d,0xd7, + 0x9e,0x0b,0xa3,0xfc,0x81,0x17,0xa8,0x7f,0x9f,0xd3,0xf9,0x6a,0xb2,0x88,0xb4,0xf1, + 0x2d,0xef,0xaf,0xd7,0xc7,0xc0,0x50,0xb6,0xe4,0xce,0xff,0xf7,0xe8,0x50,0xfe,0xd4, + 0x80,0x31,0x3e,0x32,0x1a,0x27,0x9f,0xb9,0xfe,0x3f,0x11,0xb9,0xdd,0xcf,0xe0,0x9b, + 0xe5,0xff,0xef,0xfc,0x9f,0x54,0x5f,0x53,0xa4,0xff,0xc4,0x4d,0xfe,0xff,0x53,0xff, + 0x7f,0xdf,0x87,0xfd,0xff,0x7e,0x57,0xea,0xa6,0x4f,0xca,0xc8,0xfd,0x7f,0xfb,0xf2, + 0xed,0x78,0xfb,0x57,0xff,0xc9,0xfc,0x9f,0xf4,0x75,0xff,0x5b,0xf3,0xfb,0xfa,0xa8, + 0x7d,0xef,0xdd,0x3a,0x3e,0xfd,0x5b,0xe9,0xe3,0xf9,0x27,0xfd,0xef,0x3f,0xf7,0x44, + 0xde,0xff,0x7e,0xbf,0x9d,0xab,0xfd,0xea,0xad,0xf1,0x63,0xfc,0xf9,0x98,0x3c,0xca, + 0x9b,0x7c,0xdf,0xea,0xfd,0x57,0x42,0xfc,0xff,0xfa,0xff,0x7f,0xef,0xf9,0xf9,0x7d, + 0xaa,0x0b,0xf9,0x74,0xcd,0xff,0x74,0xff,0xcf,0xfb,0xff,0x56,0xaa,0x56,0x6f,0xf5, + 0x3d,0xf5,0x1a,0xad,0x2d,0xff,0x57,0xbd,0xd5,0x00,0x7f,0xf9,0x57,0xfe,0xd6,0x95, + 0xdf,0xd8,0xa9,0xff,0xfb,0xf3,0x7f,0xfe,0xaf,0xf7,0xfe,0x5f,0xff,0xbf,0x13,0xf7, + 0xd2,0xff,0xdf,0xf7,0xde,0xff,0xfd,0x7f,0xff,0xc7,0xd0,0xb6,0xff,0xff,0xc7,0xd5, + 0xff,0x7c,0xfe,0x28,0x57,0xab,0xf9,0x7b,0xf3,0xdf,0xee,0x9f,0xab,0xdd,0x55,0xe9, + 0xef,0x93,0xd4,0xac,0x97,0x09,0x6f,0xf1,0xfe,0xfa,0xbf,0xef,0xfd,0x7f,0x9d,0x3d, + 0xf2,0xa4,0x3a,0x25,0x55,0xef,0xfa,0x92,0xa5,0x50,0xcd,0xfd,0x63,0xab,0xec,0x69, + 0x3f,0x1e,0xee,0x4d,0xff,0xff,0xef,0x9f,0xfe,0xbf,0xfa,0x57,0xc2,0xff,0x5f,0xe2, + 0xaa,0xaa,0xb7,0x58,0xa7,0xc4,0xd9,0xed,0xfa,0xa0,0x6f,0x97,0xfa,0x9d,0xbf,0xc9, + 0xac,0xa7,0x7a,0x57,0xbd,0xff,0x7c,0xf5,0x16,0xaa,0xbc,0x7a,0xbd,0x27,0xd6,0xaf, + 0xf3,0x98,0xbe,0x97,0xd5,0xd2,0x7f,0x5e,0x5f,0xed,0x96,0xff,0x3f,0x42,0xe9,0x52, + 0x55,0xc4,0x52,0x58,0x8e,0x57,0x55,0x52,0xca,0x65,0x7b,0xdc,0x5d,0x41,0xff,0x5b, + 0x2f,0xff,0xf9,0xf7,0xaf,0xea,0x7c,0x89,0x09,0xea,0x7c,0xf4,0xdf,0xff,0xa3,0x07, + 0xbe,0x22,0x5f,0x4c,0xff,0xf2,0xbf,0xe1,0x7f,0xaa,0x32,0xaf,0xd5,0xfe,0xd1,0xcc, + 0xf7,0xaa,0x54,0xc5,0x80,0xf4,0x5f,0xde,0xc3,0xba,0xc0,0x81,0x31,0x5c,0xb2,0x7f, + 0xc9,0xac,0xbd,0xfe,0x39,0xff,0xf2,0x8a,0xd5,0x34,0x2d,0xe4,0x83,0xff,0x7f,0xf4, + 0xff,0x0b,0xff,0xf5,0xaa,0xa2,0x49,0xd1,0x0b,0xe3,0x73,0x7f,0x97,0xf0,0xaa,0x0a, + 0x8d,0xf3,0xe5,0xca,0x3f,0x6f,0xdf,0xfd,0x6e,0xa9,0xb5,0x51,0x13,0x7f,0x47,0x56, + 0xfe,0xb1,0x51,0x54,0xa6,0x0c,0x16,0xef,0x55,0xa9,0xc5,0x52,0x8f,0xcf,0xcd,0xf7, + 0x7d,0x22,0x0a,0x88,0xca,0x4f,0xf2,0xe2,0x80,0x65,0x41,0x6b,0x68,0x5f,0xfd,0x85, + 0xfd,0xca,0x58,0xfe,0xb3,0xfb,0x52,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x03,0x10,0x09,0x10,0x07,0x10,0x15, + 0x20,0x0a,0x30,0x13,0x10,0x0e,0x10,0x0a,0x10,0x06,0x10,0x17,0x10,0x1e,0x10,0x6b, + 0x10,0x00,0x10,0x58,0x10,0x00,0x20,0x12,0x10,0x85,0x50,0x00,0x20,0x00,0x20,0x1f, + 0x40,0x10,0x10,0x88,0x00,0x00,0x10,0x01,0x00,0x3f,0x20,0x01,0x80,0x6f,0x30,0x01, + 0x00,0x7f,0x80,0x9f,0x00,0x2d,0x80,0xcf,0x00,0x60,0x90,0x5f,0x12,0x05,0xc0,0x9f, + 0xb1,0x1d,0xa0,0x5f,0x01,0x3e,0x30,0x01,0x01,0x5f,0x01,0x8f,0x00,0x2f,0x51,0xe7, + 0x01,0xef,0xa2,0x1f,0x10,0xf1,0x00,0x00,0x70,0xcf,0xa2,0xfe,0x83,0x0f,0x01,0x8f, + 0x03,0x3f,0x83,0x6f,0x10,0x5f,0x01,0xef,0xb0,0x8f,0x03,0xaf,0x01,0xb0,0xb0,0x01, + 0x04,0x3f,0x94,0x65,0x04,0x72,0x10,0x00,0xe4,0xaf,0x14,0x2f,0x45,0xcc,0xf4,0x2f, + 0x20,0x01,0x23,0xf3,0x92,0xe0,0x12,0x1d,0x11,0x8d,0x12,0x35,0x20,0xc7,0xf3,0x10, + 0x05,0x54,0x10,0xdb,0x60,0x01,0x05,0x8f,0x10,0x82,0x30,0x01,0x05,0xbf,0x13,0xd2, + 0x12,0xe1,0x03,0xf1,0x30,0x01,0x40,0x01,0x83,0xff,0x01,0xc9,0x06,0x5a,0x86,0x7d, + 0x04,0x5e,0x15,0xb1,0xd6,0x73,0x50,0x01,0x36,0xdc,0x10,0x07,0xd7,0x20,0x80,0x01, + 0x07,0x40,0x42,0xf2,0x03,0x0b,0x23,0x20,0x30,0x90,0x26,0x94,0x10,0x2f,0x20,0x9b, + 0x05,0xa1,0x17,0x25,0x50,0x01,0xc7,0xdf,0x05,0xbf,0x21,0xbb,0x37,0xf9,0x06,0x0b, + 0x31,0x07,0x13,0x71,0x07,0x36,0x18,0x55,0x18,0x2d,0x13,0x4f,0x08,0xd8,0x22,0x0f, + 0x40,0x5f,0x20,0x3d,0x13,0x56,0x10,0x1e,0x61,0x9b,0x12,0x3e,0x2a,0x25,0x97,0x1b, + 0x03,0x0b,0x27,0xc7,0x17,0xff,0x09,0x8d,0x13,0xff,0x07,0xcc,0x13,0x01,0x72,0xef, + 0x00,0xad,0x70,0x01,0x54,0x6e,0x64,0x01,0x04,0x60,0x20,0x01,0x08,0x1d,0x20,0x01, + 0x01,0x50,0x13,0xca,0x3b,0xe2,0x06,0x6f,0x61,0xff,0x0b,0x1a,0x83,0xfb,0x0b,0x3b, + 0x24,0x01,0x8b,0x6b,0x03,0x01,0x62,0x6f,0x1a,0x62,0x00,0x8f,0x35,0xa5,0x9b,0xc4, + 0x43,0xfd,0x43,0x3f,0x03,0xf3,0x17,0x79,0x94,0x2f,0x0c,0x1f,0xc8,0xcf,0x38,0x9f, + 0x0a,0x20,0x56,0x51,0xb5,0xf1,0x08,0xff,0xb9,0x2f,0x08,0xff,0x8c,0xcf,0x09,0x5f, + 0x0a,0xcb,0x0b,0x40,0x09,0xdf,0xab,0xcd,0x09,0x8c,0x16,0xaf,0x9b,0xf0,0x46,0x93, + 0xa4,0xf7,0xcd,0x3f,0xad,0xaf,0x06,0xae,0x9c,0x8a,0x98,0x01,0x20,0x8f,0x0e,0x10, + 0x19,0x83,0x9b,0x6f,0x02,0x3f,0x98,0x61,0x2b,0xd1,0x00,0x2f,0xa8,0x91,0xb3,0x5a, + 0x02,0xcf,0x98,0xc1,0x11,0x4f,0x03,0x2f,0x25,0x59,0x9f,0x9f,0x00,0x2f,0x06,0x7f, + 0x5b,0x9a,0x1c,0xf9,0x19,0x09,0x19,0x09,0xe6,0xaf,0x24,0xcd,0x10,0x09,0x10,0x91, + 0x58,0x9d,0x0e,0x49,0x19,0x8b,0x2d,0x77,0x1d,0x79,0x1b,0x61,0x06,0x4d,0x47,0x6f, + 0x12,0xad,0x2a,0x80,0x19,0x2f,0x18,0xff,0x0f,0x70,0x29,0xa8,0x16,0x23,0x1a,0xe3, + 0x11,0x23,0x25,0x33,0xff,0xa0,0x06,0x4b,0x00,0x2f,0x3e,0x5a,0x0f,0xd4,0x2b,0x6b, + 0x46,0x1d,0x18,0xfd,0x2b,0x0b,0x1b,0x6b,0x36,0x2d,0x6b,0x6b,0x6d,0x3d,0x1b,0xb4, + 0x1e,0xa9,0x9f,0x97,0x1e,0xc5,0x03,0x3f,0x1c,0x28,0x73,0x9d,0x16,0xef,0x17,0xaf, + 0xfb,0x09,0x5b,0x0f,0x1a,0x4f,0x1c,0x37,0x70,0x01,0x1c,0x3e,0x10,0x53,0x1e,0x14, + 0x1e,0x21,0x31,0xc3,0xfe,0xaf,0x50,0x01,0x13,0xfd,0x20,0x0b,0x10,0x01,0x10,0x8f, + 0x07,0x3f,0x30,0x01,0x13,0x0f,0x0e,0x9f,0xc0,0x01,0x12,0x13,0x1b,0x45,0x13,0x3d, + 0xfd,0xaf,0x60,0x2f,0x14,0x2b,0x2b,0xf2,0x6f,0xff,0x04,0xbb,0x7c,0x29,0x23,0xfd, + 0x85,0x0e,0x1c,0x36,0x0b,0xff,0x80,0x8d,0x33,0x2f,0x2f,0xff,0x02,0xcf,0x49,0x4d, + 0x19,0x53,0x21,0x1f,0x19,0x59,0x30,0xb7,0x13,0xf7,0x28,0x31,0x03,0xff,0x70,0x2f, + 0x50,0x37,0x0f,0xef,0x1f,0x0d,0x48,0xff,0x38,0x6f,0x1c,0x6f,0x08,0x6f,0x19,0xef, + 0x16,0x3a,0x69,0x2f,0x08,0x9f,0x1f,0x10,0x5d,0x5c,0x68,0x8f,0x0b,0x2d,0x53,0xcb, + 0x7b,0x6f,0x1d,0x8b,0x00,0x5f,0x1a,0x1f,0x8b,0x9f,0x24,0x2d,0x16,0x4f,0x03,0xcf, + 0x44,0x2f,0x0a,0xdd,0x1e,0x71,0x9f,0xff,0x1c,0xc0,0x0c,0xef,0xbf,0xf3,0xd0,0x0f, + 0xfd,0xb1,0x50,0x4e,0x00,0xe7,0x9a,0x4e,0x27,0x39,0x2e,0xe0,0xac,0xad,0x0f,0xbb, + 0x1a,0x3b,0x10,0xc7,0x3c,0xdf,0x1c,0xf0,0x6c,0xe9,0x9f,0xf9,0x26,0x41,0x5e,0x0f, + 0x15,0xaf,0x1d,0x3e,0x0e,0x20,0x83,0xfd,0x4b,0x0f,0x1e,0xdd,0x0f,0x3f,0x12,0x6d, + 0x12,0x9d,0x74,0xf3,0x0b,0x0f,0x3f,0xb6,0x23,0xcd,0x3b,0x5f,0x10,0x5d,0x04,0x2f, + 0x30,0x2f,0xab,0x9f,0x03,0xff,0x0e,0xff,0x10,0xc1,0x1e,0x3d,0x51,0x7f,0x02,0xcf, + 0x83,0xcf,0x4c,0xef,0x63,0xff,0x64,0x37,0x00,0x2f,0x0f,0xe0,0x19,0xbd,0x99,0xbf, + 0x26,0x75,0x09,0x8e,0xba,0x0e,0x27,0xd9,0x00,0x2f,0x0f,0x30,0xaa,0xdf,0x1f,0xa3, + 0x00,0x9f,0x17,0x6f,0x9c,0x1f,0x0a,0x4f,0x0c,0xbf,0xa9,0xef,0x13,0xd9,0x09,0xef, + 0xcd,0x1f,0x0b,0x0f,0x19,0x85,0x0c,0xef,0x1d,0x1f,0x9c,0xef,0x1b,0xcf,0x0d,0x7f, + 0x9d,0xdf,0x04,0x3c,0xa7,0x0f,0x1b,0xde,0x0d,0x4f,0x14,0x64,0xba,0xaf,0x18,0x13, + 0x00,0x5f,0xac,0x4e,0x18,0xd8,0xb0,0x7f,0xb9,0xee,0xa1,0xdf,0x13,0xdb,0x0c,0xff, + 0x26,0xa9,0xad,0x1f,0x00,0xbf,0xee,0x9f,0x1b,0x05,0x0f,0x3c,0x0e,0x5e,0x0e,0x8f, + 0x0f,0xbc,0x1f,0x8b,0xaa,0x17,0x0e,0x6e,0xc0,0x01,0x23,0xf3,0xa0,0x03,0xfb,0x6f, + 0x1c,0xfd,0x1b,0xf4,0x6a,0x47,0x1b,0xcd,0x05,0x2f,0x03,0xff,0xe0,0x9f,0x23,0xf3, + 0xfa,0x7f,0x12,0x33,0x5a,0x4f,0x1a,0x8b,0x2c,0xb3,0x79,0xd6,0xef,0xff,0x70,0x01, + 0x39,0xf1,0x1c,0x67,0x3a,0xb1,0x1b,0x43,0x0d,0x4f,0x1c,0xdf,0x1a,0xab,0x20,0x2f, + 0x39,0x2b,0x1d,0x45,0x37,0x0d,0x2c,0xa6,0x0d,0x4f,0x79,0xef,0x1f,0x0d,0x22,0xb1, + 0x23,0x65,0x0d,0x4e,0x2b,0xbd,0x17,0x13,0x57,0x11,0x5c,0xcb,0x23,0xfd,0x01,0xdf, + 0xeb,0x3f,0x23,0xf3,0xa0,0x03,0x07,0x9f,0x1b,0x61,0x1b,0x61,0x37,0xf7,0x13,0x63, + 0x10,0xbf,0x4a,0xf7,0x0a,0x3f,0x17,0x69,0x1e,0x19,0x1e,0x1b,0x4e,0x1d,0x2e,0x5f, + 0x17,0x3b,0x1c,0xbd,0x2c,0xbf,0x5e,0x3d,0x1e,0x43,0x0e,0x6e,0x1b,0xe3,0x2e,0x87, + 0x1c,0xed,0x21,0xed,0x11,0x78,0x5e,0x71,0x0f,0xff,0x1e,0x99,0x2c,0xc7,0x3e,0x9b, + 0xb8,0xe3,0xb9,0x1f,0xd0,0x01,0x0f,0x6f,0x30,0xbb,0xa7,0x57,0x23,0x27,0x10,0x16, + 0x14,0xcf,0x0f,0xff,0xd0,0x01,0x0f,0xd0,0xdf,0xf0,0x0c,0x00,0x27,0xf3,0x3b,0x30, + 0x43,0xff,0x0b,0x9f,0xc8,0xff,0x28,0xe3,0x0d,0x2f,0x1d,0x2b,0x99,0x5f,0x16,0xa9, + 0x09,0x5f,0x3f,0xea,0x80,0x9f,0x80,0xa3,0x7e,0x4f,0x4f,0xd3,0x00,0x8f,0x9a,0x4f, + 0x4f,0xd4,0x0c,0xef,0x83,0xff,0x09,0xef,0x11,0x09,0xa9,0xed,0x1d,0xef,0x09,0xef, + 0x3c,0xfd,0x2e,0xb3,0x0e,0x4e,0x2c,0xed,0x4d,0xaf,0x3d,0x1f,0x1f,0x99,0x2b,0x3f, + 0x05,0xdf,0x01,0x3f,0x0d,0x7f,0x8d,0x4f,0x23,0xcb,0x10,0x5f,0x1f,0x9f,0x05,0xb0, + 0x2f,0xee,0x1d,0xe5,0x4c,0x2f,0x27,0xb3,0x43,0xc1,0x00,0x2f,0x15,0xd1,0x19,0x38, + 0x31,0xe0,0x37,0xf8,0x8e,0x1f,0xb2,0x7f,0x27,0xe7,0xa1,0x1f,0x14,0x71,0x15,0x57, + 0x01,0x1f,0x1d,0x7d,0x60,0x01,0x3c,0xbf,0x70,0x01,0x0e,0x73,0x26,0x0f,0xfb,0xff, + 0x03,0xff,0x0b,0x72,0x1f,0x0f,0x7c,0xcb,0x57,0xa7,0x16,0x1a,0x1e,0x65,0x83,0xff, + 0x00,0x5f,0x00,0x32,0x00,0xa1,0x37,0x7b,0x01,0x01,0x1a,0xbd,0x0c,0xf0,0x0d,0x5f, + 0x01,0xc1,0xeb,0x9f,0x00,0xdf,0x10,0x01,0x0e,0x3e,0x2f,0xdb,0x0e,0x84,0x2c,0x2f, + 0x02,0xe1,0x00,0x99,0x4b,0xff,0x03,0xf5,0x3f,0x6f,0x24,0xef,0x2b,0x16,0x20,0x01, + 0x0b,0x6f,0x18,0x8d,0x10,0x67,0x53,0xff,0x1c,0xc5,0x1b,0x3a,0x02,0x2f,0x5e,0xaf, + 0x1a,0x88,0x0d,0x5a,0x20,0x2f,0x4b,0xa5,0x2b,0x7f,0x15,0xed,0x1b,0xd7,0x30,0x01, + 0x0d,0xea,0x3c,0x35,0x40,0x5f,0x29,0xbd,0xff,0x6f,0x27,0x8f,0x27,0x97,0x27,0x9b, + 0x0d,0xea,0x30,0x8f,0x2c,0x93,0x4f,0x3f,0x1c,0x9f,0x10,0x01,0x03,0x4f,0x1f,0x93, + 0x7f,0x9f,0x26,0x3f,0x1f,0x2d,0x20,0x01,0x00,0xbc,0xa9,0x23,0x03,0x9f,0x28,0x75, + 0x90,0x01,0x0e,0xe1,0x59,0x7f,0x1d,0x7d,0x31,0xdf,0x1e,0x77,0x0b,0x3f,0x2d,0x77, + 0xa0,0x03,0x0f,0x0a,0x20,0x01,0x1f,0xff,0x39,0xe4,0x6b,0x53,0x9e,0xaf,0x60,0xef, + 0x41,0xaf,0x0e,0x7f,0x22,0x3f,0x62,0x3f,0x1f,0x35,0x1c,0x72,0x02,0x0f,0x1b,0x2d, + 0xc2,0x9f,0x32,0x9f,0x21,0xc1,0x02,0x9f,0x12,0x6f,0x2d,0x0f,0x45,0x1f,0x02,0x6f, + 0x2f,0x5d,0x0f,0x2f,0x2b,0x4e,0x2e,0xcb,0x39,0xb5,0x53,0x5f,0x3c,0x69,0x06,0x7e, + 0x1b,0xa3,0x93,0xb4,0xa0,0x0f,0x04,0x2f,0x1e,0xfa,0x3a,0xcf,0x1e,0x24,0x5b,0xaf, + 0x0f,0x6f,0x1f,0x9b,0x52,0x2f,0x2b,0xa2,0x1e,0x13,0x0a,0xaf,0x2f,0x65,0x3a,0xaf, + 0x7b,0xa0,0x13,0xff,0x02,0x7f,0x2c,0xad,0x90,0x2f,0x2f,0x4f,0x19,0xed,0x00,0x8f, + 0x10,0x2d,0x1a,0xa3,0x3f,0x68,0x1e,0x2c,0x13,0xf9,0x0a,0x4f,0x53,0xf7,0x09,0x1b, + 0x10,0x09,0x1c,0xd3,0x1f,0xcf,0x08,0x3c,0x8f,0x9f,0x4d,0x1f,0x70,0x01,0x03,0x9f, + 0x7d,0x1f,0x0e,0xb0,0x43,0xfb,0x0e,0xde,0x13,0xf9,0x8d,0x7f,0x3e,0xdd,0x25,0xaf, + 0x03,0xff,0x00,0x8f,0x43,0xf5,0x23,0xfb,0x4e,0x6f,0x23,0xf3,0x40,0x03,0x0e,0x0f, + 0x6e,0xad,0x02,0x6f,0xe2,0x3f,0x25,0x87,0x02,0x6f,0x16,0xff,0x64,0x4d,0x02,0x9b, + 0x5e,0x0f,0x92,0x9b,0x22,0x6b,0x56,0x6b,0x06,0x6d,0x00,0xaf,0xff,0xde,0x26,0xc5, + 0x12,0x45,0x3f,0x5f,0x26,0x09,0x1f,0x95,0x0a,0x78,0x09,0x8f,0x0d,0x82,0x0c,0x4f, + 0x30,0x01,0x0e,0x51,0x0e,0x21,0x15,0x1a,0x8f,0xf4,0xaf,0xff,0x2e,0xe9,0x0e,0xa2, + 0x1f,0x69,0x7c,0xcc,0x15,0xe3,0x0c,0x6f,0x30,0x01,0x00,0x2f,0x18,0xc5,0x6f,0xff, + 0x3b,0x67,0x01,0xb2,0x20,0x07,0x20,0x0b,0x0f,0xff,0x86,0x83,0x4e,0x7f,0x90,0x01, + 0x0a,0x23,0x17,0x43,0x65,0x63,0x2b,0xad,0x00,0x9f,0x34,0xd3,0x2c,0x10,0x1a,0x5b, + 0x75,0xef,0x37,0x43,0x17,0xa1,0x49,0xe0,0x1b,0x0d,0x1c,0x65,0x20,0x27,0x0f,0xff, + 0x48,0x03,0x4b,0x53,0x1c,0x63,0x30,0x31,0x0c,0xf3,0x12,0x49,0x30,0x58,0x35,0x63, + 0x10,0x2d,0x0a,0xe1,0x19,0x8f,0x10,0x09,0x0f,0xff,0xd0,0x01,0x0f,0xff,0x10,0xa6, + 0x20,0x01,0x2b,0xf2,0x03,0x50,0x72,0x1d,0x4f,0xff,0x1a,0x2f,0x00,0xfd,0x0c,0x00, + 0x22,0x47,0x1f,0xd9,0x05,0x02,0x0f,0xff,0x21,0xa7,0x10,0x01,0x32,0x2b,0x0f,0xff, + 0x53,0xfb,0x14,0x01,0x1e,0x9b,0x0f,0xff,0x80,0x2f,0x1e,0xcb,0x0f,0xff,0xdf,0xff, + 0x05,0xb2,0x33,0xf7,0x1a,0xdf,0x99,0xb0,0x08,0xd1,0x2f,0x63,0x3e,0x29,0x33,0xfb, + 0x1f,0x0f,0x0a,0x7f,0x10,0x1e,0x23,0x97,0x4b,0x3f,0x63,0x67,0x07,0x18,0x10,0x8f, + 0x40,0x5f,0x0f,0xd2,0x1d,0x5d,0x4c,0x4f,0x5a,0x7d,0x0e,0xeb,0x1b,0xc9,0x1c,0x92, + 0x16,0x8e,0xc4,0x49,0x06,0xd2,0x21,0xc3,0x8f,0xeb,0x1c,0xc3,0x07,0x02,0x0f,0xfd, + 0x03,0xfd,0x23,0xfb,0x14,0xaa,0x09,0xad,0x25,0x73,0x87,0x67,0x1c,0x01,0x4f,0xff, + 0x05,0x2b,0x00,0x60,0x20,0x01,0x09,0x1d,0x10,0x8d,0x2c,0x8f,0x00,0x7b,0x20,0x01, + 0xac,0x51,0x0d,0xbe,0x7e,0x90,0x7f,0xfb,0x36,0x21,0x4f,0xff,0x90,0x01,0x04,0x2f, + 0x10,0x2f,0x04,0x2f,0x0b,0xaf,0xa4,0x4e,0x0a,0xbf,0x13,0x79,0x2f,0xff,0x1f,0xa1, + 0x27,0x6f,0x09,0x8d,0x16,0x2b,0x98,0xff,0x0b,0x1a,0x8f,0xf4,0x8f,0xff,0x1f,0xe3, + 0x0a,0x18,0x10,0xbf,0xc0,0xbf,0x0a,0x1f,0x11,0x1e,0x0a,0x9f,0x4f,0x49,0x07,0x16, + 0x6f,0xff,0x49,0x19,0x03,0x17,0xab,0xbd,0x07,0xcb,0x0b,0xf8,0x7c,0x98,0x07,0x77, + 0x29,0xb5,0x69,0xaf,0x02,0xd0,0x8f,0xf8,0x1a,0x57,0x0b,0x6f,0x2f,0xa5,0x10,0x31, + 0x0f,0x5f,0x20,0x01,0x1d,0x2b,0x3a,0xdd,0x8f,0xff,0x17,0xe5,0x2b,0x3f,0x15,0xe4, + 0x18,0x38,0x42,0x54,0x18,0x05,0x0e,0xef,0x1b,0xf1,0x0f,0xff,0x10,0x29,0x18,0xd5, + 0x11,0x2f,0x18,0xdd,0x1c,0x3d,0x10,0x01,0x10,0x09,0x6f,0xff,0x0e,0x4b,0x33,0xf3, + 0x14,0xc2,0x1a,0xb9,0x0b,0xcf,0x0f,0x5f,0x0e,0x95,0x11,0x03,0x0f,0xf4,0x26,0xdd, + 0xc3,0xc5,0x0f,0x04,0x87,0x07,0x6f,0xb3,0x0f,0x32,0x60,0x01,0x0f,0xe0,0x51,0x89, + 0x5f,0xff,0x15,0xdd,0x95,0xdd,0x19,0xc5,0xaa,0xf7,0xc0,0x2f,0xc0,0x2f,0x06,0x0e, + 0x43,0xf5,0x6f,0xff,0x09,0x7f,0x3b,0x29,0x13,0x07,0x3e,0x63,0x1f,0x69,0x1d,0x5d, + 0x0e,0x0f,0x1e,0x5e,0x13,0xfe,0x1d,0x29,0xaf,0xff,0x0a,0x75,0x1f,0xc9,0x13,0x8b, + 0x1f,0xff,0xa5,0x8d,0x0d,0x5b,0x5e,0x1b,0x48,0xcf,0x68,0xcf,0x14,0x1f,0x17,0xfd, + 0x2f,0xcb,0x1e,0xe9,0x0b,0x9e,0x30,0xff,0x1c,0xa8,0x19,0x38,0x0c,0x63,0x25,0x23, + 0x17,0x9d,0x2b,0xa5,0x30,0x5f,0x16,0xe5,0x9b,0x7f,0x2f,0x81,0x0e,0x57,0x2b,0xcf, + 0xcb,0xcf,0x1e,0xb1,0x0b,0x4d,0x00,0x82,0x01,0x35,0x4f,0x2f,0x1f,0x13,0x1b,0xf1, + 0x0f,0x31,0x1c,0x27,0x0f,0x9c,0x5f,0x5f,0x83,0x60,0x06,0xa9,0x13,0x6b,0x8f,0xf6, + 0x14,0xb6,0x0f,0x19,0x4f,0x02,0xba,0x8b,0x11,0x10,0x0e,0x91,0x0e,0xe0,0xac,0xce, + 0x0d,0xc6,0x75,0x4f,0x01,0x21,0xcf,0xf3,0x19,0x2a,0x0a,0x53,0xa0,0x4f,0x0f,0xe2, + 0x19,0x77,0xe0,0x5f,0x07,0x40,0x1d,0x1d,0x79,0x4f,0x32,0x89,0x0f,0xa4,0x20,0x01, + 0x6f,0xff,0x30,0x01,0x0f,0x93,0x1f,0xd7,0x59,0x64,0x9f,0xc6,0x1d,0xf1,0x4e,0x0f, + 0x19,0xac,0x0f,0xe6,0x1a,0x68,0x82,0x7d,0x1a,0x79,0x0c,0x5f,0x00,0xef,0xaf,0xff, + 0x80,0xef,0x7a,0x45,0x7f,0xf1,0xc8,0xbb,0x10,0x0f,0xb8,0x8b,0x67,0xfb,0x27,0xbd, + 0x0a,0x71,0xc0,0x81,0x0a,0xf3,0x0f,0xff,0x18,0xd1,0x29,0x8d,0x1f,0xa1,0x4b,0x05, + 0x2f,0x5b,0x0b,0x11,0x12,0xd3,0x44,0xf6,0x18,0x01,0x15,0x07,0x2b,0x45,0x03,0xf1, + 0x1f,0xff,0x3b,0xff,0x02,0xcf,0xb3,0xc5,0x2c,0x85,0x1c,0xc3,0x0c,0x6e,0x19,0x8f, + 0x3d,0xf3,0x1c,0xdd,0x0f,0xfc,0x5a,0x27,0x30,0x01,0x0d,0xcf,0x41,0x1b,0x16,0x23, + 0x0c,0xb3,0x43,0xf5,0x46,0x19,0x03,0xff,0x19,0x1b,0x1c,0xbe,0x33,0xf9,0x21,0x97, + 0x10,0x8d,0x0c,0xc2,0x10,0x01,0x4d,0x76,0x13,0xa7,0x40,0x01,0xa9,0xd7,0x0a,0x9b, + 0x1d,0xc9,0x8a,0xc7,0x0d,0x81,0xeb,0xfb,0x1f,0x4e,0x20,0x01,0x0f,0xd3,0xec,0x4f, + 0x0c,0xf7,0x10,0xef,0x50,0x01,0xe0,0xef,0x04,0x56,0x09,0x1f,0x1e,0xa5,0x20,0x09, + 0x15,0x80,0x0e,0xf3,0x71,0x7b,0x0f,0x12,0xcb,0x0f,0x2d,0x7d,0x0b,0x5f,0x70,0x01, + 0x6f,0x87,0x40,0x99,0x0f,0x3d,0x43,0xf7,0x30,0x01,0x0f,0xe1,0x1c,0x8b,0x1c,0x5f, + 0x29,0x60,0x0d,0x89,0x5f,0xdc,0x16,0xd5,0xa2,0x1b,0x0f,0xfe,0x19,0x7c,0x7f,0xff, + 0x0f,0xff,0x25,0x49,0x10,0x01,0x31,0x1f,0x01,0x1f,0x70,0x01,0x0f,0xd5,0x14,0x7f, + 0x3d,0x81,0x1a,0x7f,0x1e,0x58,0x1a,0x83,0x0c,0xc0,0x17,0xf5,0x1e,0xab,0x3d,0xad, + 0x18,0x36,0x21,0x21,0x27,0xa5,0x17,0xf9,0x0e,0x79,0x15,0x71,0x19,0x39,0x18,0x03, + 0x1f,0x3d,0x18,0x04,0x1e,0xe9,0x78,0x9e,0x0f,0xc6,0x0d,0xa5,0x10,0xef,0xa0,0xef, + 0x21,0x88,0x00,0xef,0x0e,0xa0,0x1d,0x53,0x88,0x5f,0x29,0x80,0x13,0xff,0x0e,0x9d, + 0x1f,0xd5,0xb5,0x2f,0x0f,0x12,0x0f,0x30,0x9b,0x9f,0x1b,0xac,0x0f,0xa2,0x02,0xf6, + 0xaf,0xff,0x0d,0xb7,0xc0,0x2f,0x03,0x65,0xaa,0x10,0x24,0xdb,0x00,0x2f,0xa6,0xf0, + 0x00,0x9d,0xd7,0x20,0x0a,0xd5,0x1a,0x39,0x56,0x4d,0x3c,0x8d,0x1d,0x88,0x25,0x63, + 0x0e,0x6f,0x20,0x31,0x60,0x2f,0x1e,0x7e,0x4d,0xa8,0x0e,0x9f,0x18,0x19,0x25,0x10, + 0x40,0x5f,0x30,0x5d,0x19,0xab,0x0e,0xcf,0x1d,0x49,0x70,0xbf,0x0e,0xff,0x30,0x01, + 0x43,0xad,0x17,0x83,0x20,0x01,0x2d,0x1b,0x00,0xef,0x1c,0xed,0x1b,0x5f,0x11,0xdf, + 0x1e,0x74,0x19,0x3f,0x15,0xb1,0x0c,0x95,0xd8,0xd5,0xcf,0xf8,0xda,0x7e,0x5c,0x5f, + 0x51,0xc0,0x0a,0x0f,0x8d,0xd5,0x04,0xeb,0x1b,0x99,0x60,0x01,0x1b,0x2f,0x70,0x01, + 0x0e,0xa9,0x20,0x01,0x1b,0x9d,0x1e,0x56,0xb0,0x01,0x0f,0xff,0x20,0x01,0x08,0x84, + 0xab,0xcf,0x40,0x01,0x0f,0x98,0x8b,0x0f,0x6f,0x63,0x0b,0x0f,0x1f,0x48,0x13,0x00, + 0x67,0x1a,0x2b,0x65,0x1f,0x22,0xf1,0x4d,0x70,0x01,0x00,0x2f,0xcf,0xcf,0x1d,0xbf, + 0x1e,0xc3,0x19,0x2f,0x95,0x80,0x1e,0x1f,0x1d,0x3a,0x33,0xf3,0x1e,0x3b,0x2e,0xd5, + 0x62,0x45,0x0e,0xdd,0x23,0xfb,0x1e,0x3b,0x18,0xb7,0x1f,0x7a,0x00,0x2f,0x1e,0x5e, + 0x40,0x2f,0x60,0x2f,0x00,0x2f,0x00,0x2f,0x20,0x5f,0x50,0x5f,0x40,0x5f,0x00,0x8f, + 0x30,0xe9,0x14,0x8f,0x10,0x33,0x1e,0x6f,0x10,0x2b,0x1f,0x17,0x00,0x2f,0x40,0xf1, + 0x70,0x2f,0x40,0x2f,0x00,0x2f,0xd0,0x8f,0x1f,0x8d,0x1d,0xe3,0x10,0x00,0x1e,0xd1, + 0xcf,0x93,0x1e,0x61,0x3f,0x2f,0x1e,0x11,0xab,0x8a,0x00,0x00,0x44,0x01,0x1e,0x9d, + 0x1a,0xa7,0x1e,0xe9,0x0c,0x00,0x4f,0xfe,0x15,0xf1,0xa3,0xff,0x08,0x6f,0x1f,0xcb, + 0x00,0x85,0x08,0x67,0x10,0x8d,0x19,0x50,0x1b,0x0d,0xf1,0xe5,0xb2,0xdf,0x13,0x39, + 0x3f,0xeb,0x1b,0x17,0x7b,0x19,0xac,0xfd,0xd0,0x2f,0x1c,0x2e,0x11,0x01,0x3f,0xaf, + 0x6b,0xc9,0x62,0x2a,0x1d,0xe1,0x20,0x63,0x3d,0xdf,0x20,0x2b,0x4d,0xef,0x23,0xf3, + 0x10,0x01,0x5d,0x61,0x25,0xd7,0x66,0x7d,0x04,0xef,0x22,0xb1,0x27,0x3e,0x12,0xde, + 0x1c,0xc4,0x50,0x10,0x00,0x2f,0x10,0x61,0x70,0x2f,0x00,0x2f,0x00,0x2f,0x10,0x5f, + 0x80,0x5f,0x1d,0x54,0x00,0x8f,0x15,0x71,0x12,0x3f,0x4c,0xad,0x34,0x30,0xcc,0xbe, + 0x80,0x2f,0xc0,0x2f,0x00,0x2f,0x60,0x8f,0x53,0x23,0x43,0xfb,0x9f,0x9f,0x7f,0x6f, + 0x1e,0x07,0x1e,0x6f,0x1e,0x06,0x32,0x41,0x0d,0xa1,0x1e,0x4b,0x39,0x91,0x86,0x0b, + 0x2f,0x41,0x08,0x3f,0x19,0xbd,0x60,0x2f,0x59,0x8d,0x00,0x2f,0x10,0x2d,0x80,0x2f, + 0x19,0xf1,0x00,0x5f,0x20,0x01,0x70,0x2f,0x44,0xff,0x22,0x2d,0x00,0xbe,0x1a,0x6c, + 0x04,0x93,0x3f,0x2d,0x00,0x2f,0x10,0x5d,0x00,0x5f,0x20,0x01,0x00,0x8f,0x9f,0xf8, + 0xcf,0xff,0x0d,0xab,0x21,0xaf,0x4f,0x86,0x1c,0x00,0x07,0x3f,0x39,0x1c,0x5f,0xcd, + 0x5a,0x1f,0x1b,0x67,0x1a,0x1f,0x0a,0x15,0x1b,0xa1,0x1b,0xf1,0x22,0x1e,0x1a,0xa9, + 0x2e,0x87,0x11,0x67,0x0b,0xcf,0x1f,0x43,0x20,0x2f,0x1a,0xd7,0x17,0x0f,0x00,0x2f, + 0x4b,0x6f,0x1e,0xe8,0x30,0x5f,0x1e,0x6b,0x4b,0x6f,0x00,0x5f,0x8b,0x6f,0x1f,0xa5, + 0x27,0xe2,0x20,0x01,0x00,0x8f,0x9f,0xff,0xfe,0xa1,0x0f,0x06,0x40,0x8f,0x6f,0xea, + 0x04,0xc2,0x21,0x4f,0x4b,0x99,0x3f,0x20,0x1c,0x91,0x2f,0xbc,0x0f,0xd3,0x1b,0x99, + 0x40,0x2f,0x1f,0xd3,0x5d,0xd9,0x00,0x2f,0x20,0x2d,0x27,0xc7,0x20,0x5f,0x3c,0xef, + 0x1b,0x45,0x00,0x5f,0x20,0x01,0x23,0x20,0xec,0x9e,0x0f,0xff,0x50,0x01,0x9c,0x31, + 0x00,0x2f,0x67,0xa0,0x20,0x2f,0x00,0x2f,0x00,0x5f,0x00,0x2f,0xd0,0x01,0x0f,0xff, + 0x00,0x2f,0x13,0xf1,0x4e,0x4d,0x14,0x03,0x1f,0x17,0x11,0xd6,0x45,0x5d,0x2b,0x99, + 0x1f,0x1d,0x1b,0xff,0x60,0x01,0xfb,0x3f,0x26,0xdd,0x3d,0x75,0x26,0xe1,0x1d,0x7c, + 0x1a,0xf5,0xef,0x9c,0x17,0x71,0x17,0xd5,0x1d,0xb7,0x1a,0x4f,0x27,0x0d,0x62,0x24, + 0x00,0x2f,0x40,0x2f,0x12,0xab,0x00,0x2f,0x30,0x8f,0x38,0x65,0x1e,0x3f,0x1f,0xdb, + 0x00,0x8f,0x3d,0x6b,0x10,0xb3,0x15,0x49,0x2c,0x67,0x18,0xa1,0x1b,0x41,0x21,0x3f, + 0x00,0xbf,0x11,0x68,0xf0,0xef,0x20,0xe5,0xa0,0x03,0xc0,0x01,0x00,0x2f,0xd0,0x01, + 0x00,0x8f,0x00,0x3f,0x98,0x5f,0x0b,0x9e,0x00,0x2f,0x83,0xff,0x0f,0xfa,0x00,0x2f, + 0x56,0xdb,0x17,0xf9,0x4b,0x10,0x1f,0xf8,0x49,0xee,0x1f,0x65,0xa9,0xc9,0x6d,0x20, + 0x4b,0x3f,0x04,0xef,0x33,0x11,0x1a,0x25,0x45,0x76,0x0c,0x5e,0x1f,0x55,0x13,0x3f, + 0x24,0x85,0x55,0x60,0x00,0x2f,0xa0,0x2f,0x30,0x2f,0x00,0x2f,0x1c,0x29,0xf0,0x2f, + 0x20,0x2f,0x00,0x8f,0x20,0x8f,0x10,0x8f,0x07,0x6a,0x86,0xdf,0x14,0xef,0x0f,0x07, + 0x1c,0x97,0x1f,0x5a,0x60,0xbf,0x00,0xef,0x25,0x13,0x71,0x4f,0x23,0xff,0x01,0x4f, + 0x30,0x2f,0xc0,0x2f,0x00,0x5f,0xf0,0x2f,0x20,0x2f,0x00,0x2f,0x24,0xf1,0xa0,0x5f, + 0x50,0x2f,0x0f,0xfa,0x38,0x71,0x21,0x5c,0x08,0x9f,0x9f,0xff,0x0f,0x91,0xcf,0xf8, + 0x00,0xa3,0x1b,0xd6,0x1c,0xd9,0xb6,0x6f,0x2c,0x95,0x0b,0xd6,0xad,0x81,0x0f,0xdf, + 0x5c,0x95,0xc0,0x5d,0x0a,0x1a,0x9e,0x09,0x0f,0xff,0x20,0x01,0x8f,0xff,0x4d,0xc9, + 0x0f,0xd6,0x1f,0x93,0x6f,0xf6,0x17,0xf1,0x09,0xbe,0x00,0x1f,0x4e,0x15,0x01,0x7f, + 0x4e,0x15,0x9c,0x50,0x01,0x7f,0x6e,0x15,0x01,0x4f,0x7e,0x15,0x0d,0x80,0x2e,0x15, + 0x0d,0xaf,0x4e,0x15,0x0d,0xe0,0x4e,0x15,0x0e,0x10,0x1d,0xab,0x89,0x6f,0x1d,0xe1, + 0x02,0x9f,0x02,0x9f,0x0f,0x0b,0x15,0xef,0x2a,0x11,0x2c,0x62,0x15,0xc4,0x39,0x31, + 0x08,0x2f,0x18,0x2b,0x8a,0x0e,0x1e,0x45,0x14,0xe3,0x10,0x01,0xfe,0x1f,0x3b,0xa3, + 0x1e,0x82,0x1a,0x29,0x19,0xc2,0x19,0xcf,0x0e,0x4d,0x23,0xc3,0x2d,0x01,0x1d,0x61, + 0x0a,0xae,0x1f,0x0d,0xc0,0x2f,0xb0,0x2f,0x03,0x95,0x30,0x5f,0x50,0x5f,0x1e,0xdf, + 0x70,0x2d,0x00,0x5f,0xc0,0x8f,0x1f,0x35,0x4d,0x91,0x00,0x8f,0x1e,0x11,0x10,0xbf, + 0x10,0xbf,0x34,0xe5,0x2b,0x6e,0x00,0xbf,0x1f,0x91,0xa0,0x8f,0x40,0xef,0x20,0xed, + 0x00,0x2f,0x2e,0x20,0x3d,0x1e,0x7d,0x2e,0x1f,0xe5,0x20,0x01,0x4d,0xe5,0x2e,0x43, + 0x11,0x77,0x7f,0x17,0x0f,0xcd,0x50,0xbf,0x1f,0x7a,0x04,0xef,0x25,0x64,0x40,0x2f, + 0x10,0x2f,0x90,0x2f,0x00,0x2f,0x21,0x7f,0x20,0x2f,0x50,0x2f,0x61,0x7f,0x1e,0x55, + 0x00,0x2f,0x31,0x4f,0x20,0x2f,0x10,0x8f,0x51,0x4f,0x00,0x2f,0x20,0x8f,0x5e,0xa1, + 0x2e,0xa9,0x0e,0xff,0x27,0x25,0x0e,0x3f,0x00,0x2f,0x1f,0x95,0x00,0x2f,0x1f,0xf7, + 0x16,0x9b,0x1c,0xb7,0x2c,0xc8,0x19,0x99,0xf6,0xd2,0x19,0xa5,0x3f,0x97,0x42,0x9f, + 0x4d,0xb2,0x0e,0x7f,0x70,0x01,0x2f,0xf9,0x70,0x01,0x0c,0x2f,0x1f,0xf5,0x4e,0x0a, + 0x30,0x2e,0x13,0xfb,0x0f,0x6f,0x23,0xfb,0x47,0x15,0x34,0x25,0x00,0x35,0x24,0x2b, + 0x3a,0xa0,0x43,0x37,0x0c,0xbf,0x30,0x2f,0x00,0x2f,0x2e,0xcc,0xf0,0x5f,0x00,0x2f, + 0x00,0x2f,0x21,0x87,0xc0,0xbf,0x00,0x2f,0x1c,0x01,0x3b,0xc0,0x7b,0xd0,0x9c,0x31, + 0x1a,0x79,0x1f,0xbf,0x21,0xaa,0x15,0xad,0x01,0xdb,0x3b,0x5e,0x17,0x09,0x6a,0xaf, + 0x14,0x23,0x35,0xad,0x00,0x2f,0x00,0x5f,0x2c,0xc1,0x00,0x2f,0x02,0x9f,0x83,0xf9, + 0x0e,0x0f,0x00,0x2f,0x4c,0x2f,0x6d,0xaf,0x14,0x07,0x00,0xef,0x00,0x9f,0xbe,0x89, + 0xaf,0xf4,0x0a,0x7f,0x1e,0xa7,0x09,0xef,0xab,0x9d,0x08,0xcf,0xcb,0x6f,0x17,0xbb, + 0x0b,0x6f,0x1c,0xf9,0x9c,0xaf,0x30,0x01,0x0c,0x90,0xcf,0xff,0x0b,0x6f,0x01,0x4f, + 0x01,0x4f,0x03,0xa7,0x1f,0xcd,0x11,0x4f,0xc1,0x4f,0x0a,0xbf,0x20,0x01,0x8f,0xf4, + 0x09,0x1f,0x01,0xdf,0x0c,0xa9,0x20,0x01,0x0b,0xcf,0x00,0x18,0x0e,0x19,0x29,0xef, + 0x19,0xef,0x1b,0xf5,0x89,0xef,0x0b,0x9f,0xc0,0x2f,0xb0,0x2f,0x0b,0xff,0x30,0x5f, + 0x50,0x5f,0x1a,0x73,0x00,0x2f,0xb0,0x2f,0x68,0xcf,0x20,0x8f,0x00,0x5f,0x2a,0x10, + 0x1f,0xc9,0x4a,0xe3,0x4b,0x6f,0x2d,0x3c,0x2c,0x91,0x09,0x60,0x43,0xf3,0x2f,0x95, + 0x4d,0x92,0xce,0xed,0x79,0x01,0x20,0x5f,0x2d,0x69,0x2a,0xdb,0x0f,0xff,0x1e,0x4b, + 0x60,0x01,0xd0,0x0f,0x01,0x4f,0xe0,0x1f,0x2d,0x21,0x50,0x01,0xf3,0xc5,0x11,0x4f, + 0xa0,0x5f,0x1b,0xc3,0x5d,0x8b,0x8e,0x2e,0xb1,0x1f,0xa0,0x8f,0x40,0x5f,0x00,0x2f, + 0x22,0x00,0x1d,0xcd,0x4e,0x15,0x30,0xcf,0x1b,0x7b,0x1d,0x7b,0x05,0x1f,0x50,0xab, + 0x5f,0xf2,0x1d,0xe5,0x1e,0x57,0x0d,0x1f,0x10,0x5f,0x6e,0x75,0x2d,0x1f,0x32,0x17, + 0x00,0x5f,0x04,0x10,0x05,0x21,0x1b,0x0b,0x23,0x29,0x79,0xef,0x23,0xc3,0x09,0x8f, + 0x20,0x2f,0xb0,0x2f,0x00,0x2f,0x00,0x2f,0x09,0xef,0x2d,0x89,0x14,0x79,0x2a,0x7f, + 0x50,0x5f,0x09,0xef,0x34,0x17,0x6a,0xaf,0x10,0xbf,0x0a,0xaf,0xa4,0x03,0x64,0xd0, + 0x26,0x79,0x07,0xc4,0x2b,0x10,0x01,0x1f,0x33,0xf9,0x10,0x8f,0x1f,0x99,0x60,0x0f, + 0x00,0x2f,0x50,0x2f,0x23,0xf9,0x00,0x2f,0x70,0x2f,0x1f,0xd7,0x1f,0x97,0x00,0x2f, + 0x1f,0xe8,0x11,0xb0,0x19,0x0e,0x18,0x85,0x06,0x06,0x7e,0x0f,0x64,0xad,0x2d,0xdd, + 0x0f,0x77,0x2e,0xd0,0xa0,0x5f,0x1e,0x73,0x07,0xf7,0x09,0x08,0x0a,0x19,0x0b,0x2a, + 0x0c,0x3b,0x0d,0x4c,0x0e,0x5d,0x0f,0x6e,0x0c,0x7f,0x0d,0x90,0x0e,0xa1,0x0f,0xb2, + 0x0c,0xcb,0x0d,0xdc,0x0e,0xed,0x0f,0xfe,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff, + 0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff, + 0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff, + 0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff, + 0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff, + 0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff, + 0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff, + 0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff, + 0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff, + 0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff, + 0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff, + 0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff, + 0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff, + 0x0f,0xff,0x0f,0xff,0x00,0x00,0x00,0x20,0x00,0xff,0x18,0x18,0x00,0x1c,0x18,0x00, + 0x02,0x00,0x00,0x15,0x00,0x0b,0x02,0x30,0x00,0x00,0x01,0x10,0x55,0xaa,0xff,0x0c, + 0x06,0x0b,0x12,0x10,0x16,0x13,0x06,0x0a,0x0a,0x0f,0x13,0x07,0x11,0x07,0x17,0x12, + 0x0a,0x11,0x11,0x13,0x12,0x12,0x11,0x11,0x11,0x07,0x07,0x11,0x13,0x11,0x0f,0x14, + 0x12,0x10,0x11,0x11,0x0e,0x0e,0x0b,0x10,0x0e,0x13,0x10,0x12,0x0f,0x12,0x11,0x10, + 0x10,0x10,0x11,0x16,0x11,0x11,0x0f,0x0a,0x17,0x09,0x0d,0x18,0x07,0x0f,0x0f,0x0e, + 0x0f,0x0f,0x0a,0x0f,0x0e,0x07,0x09,0x0e,0x07,0x13,0x0f,0x0a,0x0d,0x0b,0x0e,0x0f, + 0x13,0x0f,0x0e,0x0d,0x0a,0x05,0x0a,0x15,0x18,0x14,0x18,0x06,0x0f,0x0b,0x15,0x0e, + 0x0e,0x0d,0x17,0x18,0x0f,0x18,0x18,0x07,0x07,0x0b,0x0b,0x0f,0x12,0x0e,0x0b,0x13, + 0x18,0x0d,0x11,0x06,0x0f,0x0c,0x17,0x0b,0x0e,0x12,0x0a,0x17,0x18,0x0b,0x12,0x0a, + 0x0b,0x0a,0x0e,0x0e,0x08,0x08,0x07,0x0b,0x0e,0x14,0x14,0x15,0x10,0x12,0x13,0x13, + 0x14,0x10,0x0f,0x06,0x14,0x10,0x11,0x11,0x12,0x10,0x11,0x0f,0x13,0x0e,0x10,0x0e, + 0x0e,0x0e,0x0f,0x10,0x0e,0x00,0x27,0x29,0x00,0x3e,0x18,0x3e,0x0b,0x80,0x09,0x06, + 0x00,0x0b,0x00,0x0f,0x41,0x90,0x42,0xe0,0x42,0xd0,0x09,0x1b,0x02,0xff,0x0f,0xeb, + 0x90,0x00,0xfd,0x00,0xbf,0x09,0x06,0xf8,0x1f,0xfe,0x2e,0x0b,0x40,0x2e,0x6f,0x01, + 0xff,0x03,0xe0,0xf4,0x00,0xbc,0x09,0x3f,0x17,0x18,0x00,0x7d,0x00,0xf8,0x02,0xe0, + 0x16,0x09,0x00,0x0f,0x40,0x07,0xc0,0x18,0x0a,0x1d,0x01,0xa0,0xad,0x06,0x00,0x1f, + 0x80,0x7e,0x00,0xf8,0x1b,0x00,0xbf,0x03,0xfd,0xf9,0x00,0xff,0x80,0x6f,0x0a,0x29, + 0x00,0xbe,0x07,0xfe,0x19,0x2b,0x01,0xff,0x07,0xf9,0xe9,0x5f,0x0a,0x6b,0x02,0xff, + 0x0b,0xf5,0xd0,0x5b,0xf0,0x18,0x06,0x80,0x1f,0xd0,0x7f,0xd0,0x3e,0x3e,0x00,0x2e, + 0x0e,0x0e,0x03,0x0d,0x03,0x38,0x80,0x00,0x40,0x0c,0x0f,0x0b,0xff,0x0b,0xff,0x01, + 0x7d,0x00,0x3c,0x00,0x78,0x15,0xb9,0x2f,0xff,0x03,0xc0,0xff,0x5b,0x95,0x0f,0x40, + 0x0f,0x00,0x5e,0x54,0xff,0xf8,0x2f,0x4b,0x2e,0x0b,0x2f,0x4b,0x1f,0xeb,0x07,0xff, + 0x00,0x6f,0x0b,0x0b,0xc0,0xe4,0x00,0xff,0x40,0x6f,0xc0,0x07,0x3d,0x0b,0x2f,0x6f, + 0x0b,0xfe,0x01,0xa4,0x80,0x7c,0x81,0xf4,0x82,0xe0,0x4b,0x80,0x1f,0x00,0x7d,0x1f, + 0xb8,0x7e,0xe0,0xe0,0x7d,0x00,0x03,0xd0,0x03,0xd0,0x02,0xf1,0x00,0xfb,0x00,0xbf, + 0xdb,0x0f,0x42,0x7c,0x00,0x7c,0xe0,0xb4,0xd0,0xb4,0xf4,0x0f,0x00,0x0e,0x00,0x38, + 0x19,0x03,0xd0,0x07,0x80,0x0b,0x0f,0xf4,0x00,0xb8,0x3c,0x00,0x2d,0x3c,0x0f,0x1f, + 0x04,0x0f,0x2e,0x0f,0x3f,0xdf,0x06,0xff,0x00,0x7f,0x06,0xff,0x2f,0xdf,0x40,0x0b, + 0x80,0x7f,0xc0,0xf9,0x00,0xd0,0xbf,0xc0,0x01,0x1a,0xaa,0x2f,0xff,0x1a,0xaa,0x00, + 0x01,0xf4,0x00,0xfa,0xaa,0xff,0xff,0xfa,0xaa,0x40,0x10,0x0b,0x2a,0xaa,0x7f,0xff, + 0x6a,0xaa,0xaa,0xa8,0xff,0xfc,0xaa,0xa8,0x3f,0x02,0x00,0x07,0x00,0x1f,0x00,0x7e, + 0x01,0xf4,0x07,0xd0,0x2f,0x40,0xbd,0xe0,0x0b,0xe0,0x0f,0xc0,0x2f,0x40,0x2f,0x00, + 0x40,0x02,0xf8,0x00,0xfc,0x00,0xbd,0x00,0x7e,0x3e,0x7f,0xfe,0x3e,0x7e,0x10,0x7e, + 0x00,0x0d,0x0f,0xd0,0x1f,0x80,0x06,0x06,0x00,0x7f,0x01,0xfe,0x02,0xf4,0x02,0xf8, + 0x02,0xf4,0x07,0xf0,0x6f,0xe0,0xff,0x40,0xf4,0x01,0x0f,0x80,0x01,0x15,0xf4,0x01, + 0x5f,0xe0,0xff,0x80,0xff,0xe0,0x07,0x00,0x07,0x2e,0x00,0xb8,0x02,0xf0,0x0b,0xd0, + 0x1f,0xaa,0xfb,0xd0,0xe7,0xd0,0x87,0xd0,0x07,0xab,0xea,0x80,0x2f,0x29,0x15,0x43, + 0x2f,0xff,0x00,0xf0,0x01,0xe0,0x02,0xe0,0x02,0xd0,0x00,0xff,0xf8,0x3c,0x78,0x00, + 0xb4,0x00,0x50,0x04,0x2f,0xeb,0x0b,0xff,0x00,0xbf,0x06,0xe0,0x03,0xe0,0x1b,0xd0, + 0xff,0x80,0xf9,0x06,0x3d,0x00,0xb8,0x01,0xf0,0xc1,0xf0,0x41,0xf0,0x00,0xf0,0x00, + 0xbe,0x00,0x7f,0x00,0x2e,0xbc,0x00,0x1f,0x0f,0x80,0x0b,0xfa,0x02,0xff,0x00,0x1a, + 0xbe,0xf0,0x2f,0xe0,0x1f,0xf8,0xbf,0xff,0xf8,0x2f,0x40,0x40,0x27,0x0b,0x40,0x0b, + 0x80,0x03,0xf4,0x1d,0x11,0x3c,0xf4,0x02,0xf0,0x07,0xd0,0x0f,0x40,0x12,0x2e,0x0f, + 0x04,0x0f,0x1a,0x80,0x01,0x0c,0x01,0x07,0x80,0x07,0x80,0x03,0x40,0x0e,0x45,0x2f, + 0x80,0x05,0x15,0xbd,0x02,0xf4,0x0b,0x80,0x2e,0xd0,0x0d,0x1f,0x80,0x0f,0xd0,0x07, + 0xf4,0x02,0xfe,0x00,0xbd,0x01,0xfc,0x07,0xf4,0xbf,0xd0,0xff,0x40,0xa4,0x04,0x14, + 0x12,0x07,0xf4,0x2f,0xff,0x2f,0xff,0x05,0x55,0xff,0xf8,0xff,0xf8,0x55,0x54,0x05, + 0x00,0x2f,0x90,0x0b,0xfe,0xfc,0x02,0xf8,0xaf,0xf4,0xff,0x90,0x04,0xff,0xff,0xab, + 0xea,0xc0,0x17,0x06,0xaa,0xaa,0xa0,0xff,0xf0,0xaa,0xa0,0x09,0x1b,0x09,0xab,0xf8, + 0x0d,0xe4,0xd0,0x1b,0x0a,0x6f,0x07,0xff,0x1f,0xe5,0xe8,0x0e,0x60,0xb4,0x07,0x3b, + 0x2d,0x00,0x2f,0x19,0x01,0xaf,0x0b,0xff,0x2f,0xd5,0xfe,0x00,0xbf,0x0a,0x02,0xbe, + 0x90,0xaa,0xfd,0xa0,0x00,0x02,0xaa,0x1f,0xff,0x1f,0x90,0x0a,0x1a,0xfa,0x40,0xff, + 0xe0,0x5b,0x09,0x2a,0xaa,0x3f,0xff,0x3f,0x50,0x40,0x0c,0x3e,0x00,0xff,0x00,0x01, + 0x2f,0xa9,0xa9,0x00,0x38,0x0a,0x40,0xa4,0x01,0xf8,0x01,0xf8,0x19,0x14,0xc0,0x0f, + 0x80,0x0f,0x85,0x1f,0xbf,0x1f,0xfe,0x2f,0xd0,0x05,0xa4,0xaf,0xf0,0xbc,0x00,0x2e, + 0x2f,0x3e,0xbf,0x3f,0xe4,0x3f,0x50,0x40,0x00,0xfe,0x40,0xbd,0x09,0x03,0x0b,0x0b, + 0xe0,0xbd,0xf0,0xd0,0x02,0x40,0xd0,0x3f,0xaf,0xbf,0xe0,0x06,0xf8,0x00,0x2f,0x40, + 0x3f,0x0f,0xf5,0x6a,0x02,0xf0,0xfc,0x6f,0xfc,0xfe,0xbc,0xa4,0x1a,0x40,0x19,0x21, + 0x2f,0x02,0xfe,0x1f,0xe4,0x2f,0x80,0x1f,0xe0,0x02,0xfe,0x7f,0xe0,0xfe,0x00,0x0e, + 0x55,0xff,0xff,0x0b,0x80,0xbf,0x80,0x1f,0xf0,0x02,0xf4,0x1b,0xf4,0x00,0x3e,0x1f, + 0x00,0x2f,0x7f,0x40,0xfd,0x81,0x0f,0x0b,0x2e,0x2f,0x2c,0x3e,0x3c,0x7c,0x3c,0xbc, + 0x3c,0xbc,0x2d,0x7e,0xa4,0x07,0xfe,0xe2,0xaf,0xe1,0xc0,0x0b,0xc1,0x0b,0x82,0x5f, + 0xd7,0xc0,0xe0,0x7d,0x00,0xfc,0x01,0xf4,0x02,0xfa,0x03,0xff,0xbd,0x2f,0x00,0xc0, + 0xab,0xe0,0xff,0x1f,0x40,0xff,0xc0,0x0b,0x6f,0xff,0x80,0x1b,0xd0,0x03,0xe0,0x04, + 0x1f,0x40,0x2f,0xb8,0x00,0x20,0x0c,0x2f,0xd0,0x07,0xe0,0xf4,0x02,0xff,0xfc,0x05, + 0x55,0xa8,0x54,0x05,0x2f,0x6a,0xa8,0xbf,0xfc,0xaa,0xfc,0x00,0x02,0x20,0x1b,0x40, + 0x2f,0xd0,0xff,0x00,0x16,0x05,0x0b,0xe0,0x03,0x00,0xbc,0x0a,0x1f,0x15,0x0a,0xbd, + 0x02,0xfc,0x09,0x00,0x0a,0x0b,0xe0,0xbf,0xd0,0xfe,0x32,0x07,0x40,0x17,0x6f,0xe0, + 0x00,0xfd,0x00,0xbf,0xd0,0x0b,0xf4,0x10,0x05,0xff,0x0b,0x00,0xbf,0x07,0xfd,0x2f, + 0xd0,0x2e,0xf8,0x05,0x05,0x06,0x1e,0x2f,0x0f,0x4a,0xf9,0xff,0xff,0xe5,0xa9,0x00, + 0x07,0x55,0x69,0x40,0xc0,0x07,0xea,0x2f,0x40,0x3f,0xab,0x7d,0x06,0x02,0xf0,0x03, + 0xf0,0x1b,0xfe,0x06,0xc0,0xf8,0x6f,0x74,0x01,0xfc,0xef,0x07,0x01,0x15,0x03,0xf0, + 0x0b,0xe0,0x7f,0xe4,0x0b,0x40,0xff,0x40,0x55,0x0c,0x15,0x2f,0x40,0xf4,0x7f,0xbc, + 0x00,0xbc,0x01,0x09,0x0e,0x29,0x0a,0x0c,0x2f,0x06,0x90,0x18,0x0e,0x2a,0x40,0x3f, + 0xc0,0x3f,0x2a,0xbf,0x08,0x0a,0x1f,0x01,0xa0,0x02,0xf0,0x02,0xf0,0x18,0x12,0x90, + 0xff,0x0d,0x03,0x80,0x5b,0xe0,0x18,0x40,0xbf,0xc0,0x0a,0xe4,0x7f,0x80,0x0d,0xaf, + 0x90,0xff,0xe0,0xea,0x09,0x29,0x00,0x90,0x03,0xe0,0x03,0x09,0x40,0x68,0xf8,0x0c, + 0x69,0xbf,0x7d,0x0a,0x40,0x0b,0xd0,0x03,0xa4,0x09,0x1a,0xa4,0x02,0xf4,0x0b,0x40, + 0x07,0x05,0x54,0x1f,0xfe,0x1f,0xa9,0x1e,0x17,0x18,0x00,0x2e,0x00,0x0b,0x80,0x02, + 0x17,0x15,0x54,0x2f,0xfc,0x1a,0xbc,0x00,0x3c,0x15,0x69,0xff,0x0b,0xeb,0x2f,0x82, + 0xe0,0x00,0x11,0x0f,0x02,0x2f,0x0b,0x2f,0x2f,0x2f,0xbe,0x2f,0xfe,0x8b,0x2f,0x80, + 0xf4,0x09,0x2f,0x13,0x3f,0xe0,0x3e,0xf0,0x3e,0xf4,0x3e,0xb8,0x3e,0x7c,0x3e,0x3e, + 0x3e,0x2f,0x3e,0x1f,0x00,0xff,0x01,0xff,0x02,0xfb,0x03,0xeb,0x07,0xcb,0x0b,0x8b, + 0x0f,0x4b,0x5f,0x0b,0x1f,0xf8,0x1f,0xbd,0x1f,0xbe,0x1f,0x6f,0x1f,0x4f,0x1f,0x4b, + 0x1f,0x43,0x1f,0x41,0x02,0xf0,0x42,0xf0,0xc2,0xf0,0xe2,0xf0,0xf2,0xf0,0xfa,0x07, + 0x0f,0x80,0x01,0x3e,0x3f,0x2e,0xaa,0x1f,0x80,0xbf,0xa0,0x00,0xfc,0x7e,0x00,0x95, + 0xea,0x0b,0xd0,0xaf,0xc0,0xff,0x40,0x02,0xf9,0x02,0x0b,0xbf,0x80,0x0f,0xd0,0x2e, + 0x01,0x03,0x7e,0xf0,0x07,0x0f,0xc0,0x01,0x41,0x0f,0x82,0x0f,0x82,0x0b,0xc3,0x07, + 0xd3,0x03,0xe7,0x03,0xeb,0x80,0xfb,0xc1,0xe7,0xc1,0xe7,0xd2,0xd3,0xe3,0xc2,0xe3, + 0x81,0xf7,0xbc,0xf4,0xd0,0xbd,0x2f,0x3f,0x1f,0x80,0x3f,0xf0,0x00,0x03,0xe0,0x3f, + 0x0b,0x00,0x07,0x2f,0xbc,0x03,0x02,0xbe,0x01,0xf8,0x7f,0xe0,0x0f,0xbd,0x02,0x01, + 0x00,0x3c,0x0d,0x1d,0xb4,0x1e,0x1f,0x2e,0xbf,0x2f,0xfe,0x06,0x08,0x2f,0x01,0xfc, + 0x00,0xbe,0xd0,0x07,0xf0,0x01,0x50,0x07,0x55,0x55,0xfe,0x00,0x04,0x3e,0x0f,0x3e, + 0x0b,0x3e,0x07,0x3e,0x03,0x3e,0x02,0x14,0xbe,0x0b,0xfd,0x0b,0xfc,0x0b,0xf8,0x0b, + 0xf4,0x0b,0x50,0x05,0x40,0xbe,0xf0,0x7f,0xf0,0x2f,0xf0,0x0f,0xf0,0x0b,0x05,0x7e, + 0x00,0xfd,0x0a,0x14,0x07,0xf4,0xbf,0xd0,0xff,0x80,0x9b,0xf4,0x02,0xfd,0x00,0x64, + 0x10,0xf4,0x03,0x40,0x1f,0xd0,0x1f,0xc0,0x90,0x0e,0x03,0x04,0x50,0x05,0x0b,0x04, + 0x02,0xfb,0x01,0xbe,0x00,0x81,0xfb,0x40,0xff,0x7f,0xbd,0x01,0xf8,0xf0,0x03,0xe0, + 0x04,0x2f,0x80,0x80,0xff,0x80,0x55,0x40,0x0a,0x1f,0xa9,0x1f,0xfe,0x05,0x54,0x21, + 0x7d,0x07,0xf8,0x1f,0x1a,0xbc,0x2f,0xfc,0x15,0x22,0x55,0x01,0x00,0x0b,0x40,0x1c, + 0x00,0x1c,0x40,0x48,0x19,0x58,0x0a,0x1f,0x0a,0x1e,0xad,0x02,0xfe,0x07,0xe4,0x48, + 0x3f,0x64,0x00,0xb8,0x19,0x18,0x2f,0x40,0x88,0xff,0x80,0x2f,0x80,0x1a,0x1c,0x55, + 0x0b,0xff,0x2f,0xeb,0x1d,0x00,0x04,0x01,0x00,0x6f,0x0b,0x01,0x05,0xfb,0x40,0xfc, + 0x2f,0x06,0x15,0x01,0xff,0x0b,0xfa,0x1f,0x90,0x2f,0x40,0xfd,0x00,0x1c,0x09,0x0f, + 0xd0,0xef,0x02,0x00,0xbf,0x02,0xfa,0x5a,0x1f,0xff,0xfe,0x80,0xbf,0x80,0xfe,0x3f, + 0xfd,0x3f,0xfd,0x12,0x00,0xeb,0x40,0xff,0x0f,0x00,0x15,0x3e,0xff,0x3f,0xfb,0x3f, + 0x40,0x3e,0xbd,0x00,0x11,0xb8,0x0d,0x42,0x6f,0x1f,0xfd,0x1f,0xbd,0xd0,0x05,0x12, + 0x2e,0xff,0x2f,0xef,0x2f,0x42,0x2e,0x02,0x50,0xdb,0xfe,0xff,0xbf,0xf8,0x1f,0x0b, + 0x05,0x1f,0x7f,0x1f,0xfa,0x1f,0xd0,0x7f,0x08,0x15,0x02,0x80,0x00,0xfd,0x1f,0x40, + 0x06,0xfa,0xfd,0x04,0x07,0xeb,0x0c,0x04,0x2e,0x80,0x14,0x07,0xff,0x0f,0xeb,0x74, + 0x18,0x15,0x1a,0xaa,0x55,0xff,0xff,0xaa,0x50,0xff,0xf8,0xaa,0xa4,0x21,0x90,0x01, + 0x3f,0xaf,0x1f,0xff,0x01,0xbc,0xfc,0x00,0xfe,0x40,0x6f,0x02,0xfa,0x2e,0xbf,0x14, + 0x05,0x06,0x1c,0xf8,0x06,0x2f,0xeb,0x80,0x04,0x1f,0xa5,0xd0,0x03,0xfa,0x40,0x40, + 0xf9,0x06,0x07,0xd0,0x01,0x13,0x0b,0xe5,0x07,0xff,0x00,0x6a,0x00,0x00,0x09,0x00, + 0x0b,0xff,0x00,0xbf,0x40,0xef,0x40,0x4f,0x7f,0x02,0x7d,0x14,0x0a,0x0f,0xf8,0x05, + 0xf8,0x3f,0xf4,0x2f,0x90,0x10,0x1f,0xef,0x42,0x80,0x15,0x0d,0x14,0x14,0x2f,0x00, + 0x04,0x7f,0x09,0xfa,0x2f,0xbf,0x2f,0x05,0x0a,0xfa,0x01,0xef,0x02,0x0e,0x16,0x08, + 0xeb,0xbd,0x22,0x01,0xa0,0x02,0xf0,0xff,0x26,0x68,0x02,0xfd,0x03,0xd4,0x03,0x17, + 0x28,0x00,0x38,0x16,0x09,0x40,0x1f,0xe0,0x05,0xf0,0x00,0xb0,0x7b,0x2b,0xe9,0xff, + 0xff,0xf9,0x6f,0x5b,0x03,0xc0,0xd0,0x68,0x28,0x00,0x3d,0x44,0x69,0x01,0xff,0xeb, + 0x1f,0x82,0x40,0x00,0xc0,0x0f,0xf0,0x02,0xf0,0x1f,0xff,0x1f,0xff,0x12,0x7e,0x04, + 0x0f,0xc0,0xe0,0x02,0xf0,0x01,0xf4,0x7c,0x05,0x3e,0x01,0x2f,0x02,0x1f,0x43,0x0f, + 0x83,0x0b,0xc7,0x07,0xcb,0x07,0xfc,0x0b,0xfd,0x0f,0xfe,0x0f,0xee,0x1f,0x9f,0xc0, + 0xc0,0x07,0xe0,0x01,0xf9,0x3f,0x2f,0xf8,0x02,0x7d,0xd1,0x03,0xe2,0x02,0xf7,0xb8, + 0xf0,0x03,0xff,0x2f,0xff,0x0b,0xf8,0x04,0x03,0xc0,0x02,0xc0,0x02,0xd0,0x02,0xd0, + 0x0b,0xc0,0x0e,0x38,0x0f,0x01,0xf8,0x01,0x16,0x6a,0x07,0xff,0x1f,0xea,0x2d,0x00, + 0x04,0xe4,0x00,0xff,0x96,0x2f,0xff,0x01,0xa9,0x10,0xf4,0x05,0x0e,0x00,0x2f,0x0a, + 0xbf,0x1f,0xff,0x05,0xbe,0x00,0xbd,0xd0,0x02,0x40,0x00,0xaa,0x80,0xff,0xd0,0x55, + 0xff,0xd0,0xff,0xd0,0xe0,0x00,0x17,0x34,0x0a,0xaf,0x0f,0xff,0x0a,0xaf,0x00,0x0f, + 0xc0,0x80,0x00,0xea,0x40,0xff,0x80,0xaa,0x40,0x80,0x5f,0x15,0x7d,0x3f,0xff,0x3f, + 0xff,0x54,0xfd,0x09,0x2a,0xbe,0x3f,0xff,0x2a,0xbe,0xa9,0xa8,0x09,0x1e,0xb4,0x1e, + 0x01,0xfe,0x40,0x07,0x3f,0x41,0x2f,0xeb,0x0b,0xff,0xbe,0xbe,0x05,0x00,0xf9,0x1f, + 0x06,0x03,0xdf,0x02,0xff,0x02,0xfe,0xfd,0x4f,0x7d,0x0b,0xbc,0x07,0xf8,0x07,0xf4, + 0x03,0xf4,0x01,0x50,0x03,0x7f,0x00,0xfa,0x02,0xf4,0x0b,0xe0,0x2f,0x80,0x05,0x03, + 0x01,0xfb,0x7f,0xbd,0x2f,0xf8,0x1f,0x01,0xf8,0x07,0xe0,0x1f,0x80,0x15,0x55,0xfc, + 0x54,0x04,0xd0,0x02,0xc0,0x03,0xc0,0x03,0x80,0x03,0xd0,0x02,0xfd,0x00,0x68,0x10, + 0x1d,0x00,0xb0,0x01,0xf0,0x1f,0xe0,0x0a,0x40,0x71,0x0f,0x01,0xe4,0x07,0xff,0xbf, + 0xbf,0xff,0x06,0x94,0xd0,0x07,0x16,0x0b,0x00,0x0e,0x14,0x0f,0x1f,0x04,0x1f,0x1f, + 0xbe,0x0b,0xfd,0x00,0x60,0x40,0x0d,0x3e,0x0f,0x0e,0x03,0x0d,0x03,0x34,0x0e,0x08, + 0x06,0x00,0x1f,0xc0,0x1f,0xc0,0x06,0x18,0x00,0x7e,0x01,0x7f,0x01,0x19,0x60,0x64, + 0x3d,0x28,0x1d,0x0e,0x38,0x06,0xe4,0x0b,0xbc,0x1d,0x90,0x02,0xd0,0x07,0x03,0x01, + 0x00,0x07,0xe0,0x02,0xfa,0x1a,0x00,0xaf,0x04,0x40,0x00,0xa4,0x0a,0x0b,0x0f,0x6f, + 0x01,0xff,0x03,0xf5,0x96,0xaa,0xff,0xff,0xff,0xaa,0xa4,0xa4,0x25,0x07,0xd0,0xbf, + 0x00,0x1a,0x1a,0xaa,0xaa,0x67,0x40,0x1c,0x00,0x2c,0x19,0x17,0x01,0x1c,0x07,0x3c, + 0x0f,0x39,0x0e,0x40,0x0f,0x80,0x5e,0x26,0x90,0x0f,0xf8,0x2f,0xbf,0x38,0x1b,0x20, + 0x02,0x40,0x4b,0x80,0xff,0x09,0x1a,0xa9,0x2f,0xfe,0xa0,0x19,0xf8,0x2e,0xfc,0x7e, + 0xfe,0xfe,0xef,0xea,0x0b,0x80,0x07,0xf6,0x14,0x08,0x0f,0x7e,0x1d,0x1e,0x0b,0xbd, + 0x06,0xf6,0x1e,0x00,0x2d,0x0f,0x00,0x2d,0x00,0x78,0x85,0x00,0x7f,0x81,0xb6,0xd3, + 0x64,0xdb,0x40,0x07,0xff,0x0f,0x90,0x2f,0x00,0x6f,0x00,0x6f,0x40,0xa0,0xbf,0x00, + 0xb8,0x01,0xf4,0x02,0xe0,0x07,0xc0,0x0f,0x0f,0x40,0x0b,0xc0,0x0e,0x0b,0x1f,0x2e, + 0x1e,0x3f,0x40,0x40,0x0b,0x40,0x0b,0xff,0xe0,0x25,0x2f,0xff,0x3f,0x00,0xbd,0xff, + 0x80,0xbf,0x80,0xbe,0x09,0x4e,0x2f,0x80,0x2f,0x80,0x1a,0x19,0x00,0x39,0x19,0x29, + 0x0a,0x0a,0x10,0x15,0x54,0x2f,0xfd,0x16,0x1a,0xaa,0xaa,0xaa,0xa8,0x05,0x55,0x55, + 0x55,0x55,0x54,0xff,0xf8,0xaa,0x21,0x01,0x90,0xeb,0xda,0xe2,0x8a,0xe0,0x0a,0x90, + 0x0a,0x07,0xff,0xaa,0x80,0x0f,0x90,0x07,0xfe,0xe0,0x90,0x7c,0x90,0x00,0xd0,0x01, + 0xf0,0x7d,0x07,0x54,0xef,0x1f,0x43,0x2e,0x01,0x2d,0x50,0x4b,0xfd,0xdf,0xaf,0xfd, + 0x0b,0xf8,0x03,0xf9,0xaf,0xff,0xfe,0xc0,0x32,0xb4,0x01,0xe1,0x03,0xc0,0x0b,0x40, + 0x1e,0xe1,0xe7,0xd1,0xeb,0xe1,0xe7,0xf6,0xd3,0x7f,0xc2,0x87,0x80,0x47,0x80,0x87, + 0x80,0xdb,0x40,0xfe,0x2f,0x40,0x1f,0xfa,0x02,0xff,0xc0,0xc0,0xbf,0x40,0xfd,0x00, + 0x04,0x03,0xe0,0x3d,0x0b,0x00,0x0e,0x1f,0x7f,0x40,0xff,0xff,0xeb,0xff,0x45,0x54, + 0x23,0x02,0xf8,0x0b,0xaa,0x80,0x55,0x72,0x9f,0x1a,0xa8,0xdd,0xaf,0x00,0x01,0x0a, + 0x00,0x1f,0xea,0x06,0xff,0xf8,0x00,0xbd,0xfd,0x05,0xb8,0x01,0xf0,0x03,0xd0,0x0b, + 0x80,0x0f,0x40,0x2e,0x10,0x2d,0x00,0x2e,0x01,0x1f,0x43,0x0b,0xef,0x02,0xfa,0x50, + 0xf8,0x01,0xfd,0x07,0xdf,0xaf,0x4b,0xfe,0x80,0x43,0x04,0x0b,0xd7,0x10,0xf4,0x06, + 0xfc,0x1a,0xa4,0x3c,0x3e,0x2b,0x05,0x00,0x01,0x7f,0x00,0x00,0x00,0xa9,0x00,0xff, + 0x80,0x5b,0xd0,0x0c,0x2d,0x10,0x08,0x40,0x0f,0x80,0x0b,0x68,0x01,0xf8,0x03,0xf0, + 0x06,0x18,0x2d,0x0b,0xfa,0x07,0x40,0x2e,0x06,0x0b,0x15,0x05,0xd0,0x0b,0x06,0xb8, + 0x02,0x15,0x40,0xff,0xf9,0x95,0x6f,0x00,0x02,0x05,0x80,0xb8,0x50,0x0f,0xf8,0x09, + 0x01,0xfe,0x07,0x5e,0x17,0x08,0x00,0x2c,0xb0,0x0e,0x38,0x68,0x03,0x01,0xa4,0x1f, + 0xff,0x3d,0x0b,0x3c,0x03,0x3d,0x07,0x1f,0xbf,0xc0,0x0e,0x01,0x90,0x07,0x06,0xa4, + 0x1f,0xbd,0x3c,0x1e,0x14,0x1e,0x01,0xfd,0x1e,0x07,0xff,0x15,0x05,0x57,0x2f,0xf4, + 0x03,0x1f,0x03,0xf0,0x01,0x1f,0x00,0x0b,0x02,0xf4,0x03,0xe0,0x40,0x3e,0x30,0x2a, + 0x29,0x2e,0x07,0xbf,0x02,0xfe,0x0b,0xe0,0x0f,0x80,0x1f,0x40,0x1f,0x41,0x1f,0x42, + 0xad,0x40,0xbb,0xc0,0xf2,0xc0,0xe0,0x00,0x01,0xf4,0xf4,0x00,0xb8,0x05,0xbd,0x1f, + 0xff,0x0a,0xbe,0x00,0x2e,0x02,0xe0,0x01,0x55,0xa9,0x01,0x1f,0x46,0x07,0xef,0x01, + 0xf9,0x01,0xe0,0xf0,0x91,0xf4,0xff,0xd0,0x6f,0x40,0x0b,0x80,0x03,0x00,0x02,0x3f, + 0x05,0x6f,0x0f,0xff,0x0a,0xab,0x00,0x03,0x0b,0xd0,0x1f,0x80,0x2f,0xf9,0x50,0xff, + 0xf8,0xea,0xa4,0x00,0x14,0x11,0xf9,0x06,0xff,0x0f,0x96,0x1f,0x0f,0xd0,0x07,0xfe, + 0x04,0xff,0xbf,0x2f,0x07,0x80,0x0b,0x02,0x0e,0x0b,0x1d,0x0b,0x1d,0x0f,0x0b,0x0e, + 0x07,0xbf,0xf8,0xe5,0x7d,0x80,0x08,0x40,0x00,0xc0,0x09,0x2d,0x0b,0x00,0x07,0x40, + 0x0b,0x00,0x2d,0x0e,0x1d,0x3f,0x0b,0xe6,0x00,0x00,0x2a,0xaa,0x2a,0xaa,0x80,0x05, + 0x01,0xe0,0x03,0xc0,0x07,0x42,0x0e,0x07,0x2d,0x0f,0x38,0x1d,0x2c,0x0e,0x0e,0x07, + 0xb4,0x04,0x15,0x55,0x7f,0xff,0x6a,0xaf,0x05,0x40,0x05,0x07,0x81,0x02,0x1d,0x0e, + 0x02,0xaa,0x90,0xea,0xf4,0xc0,0x38,0xc0,0x38,0xea,0xf4,0xeb,0xd0,0xc1,0xe0,0xc0, + 0xf4,0x1f,0x1e,0x02,0x00,0x02,0x1a,0xab,0xab,0x00,0xe0,0x00,0xea,0xa8,0xff,0xfd, + 0xfa,0xa9,0xe0,0x03,0x0b,0x90,0x2e,0x00,0x3e,0x21,0xbd,0x02,0xf4,0x0b,0xd0,0x2f, + 0xea,0x05,0x07,0x01,0x34,0x3e,0x2a,0x11,0x0f,0xc3,0x0b,0xe7,0xbf,0x2c,0x81,0xc0, + 0x47,0xc0,0xaf,0x80,0xfe,0x01,0x3d,0xf9,0x0f,0xff,0x0b,0x24,0xfa,0xfc,0xff,0xf4, + 0x15,0x03,0xef,0x1f,0x46,0x1d,0x6f,0x40,0xfb,0xd0,0x91,0xf4,0x00,0x74,0x06,0x0a, + 0xab,0x0f,0x03,0xea,0xa4,0xff,0xf8,0xe5,0x50,0x08,0x2d,0x29,0x14,0x6f,0x00,0x01, + 0x01,0x07,0xe5,0x01,0xf9,0x2f,0xbe,0x90,0x31,0x0b,0x02,0x07,0x80,0xb8,0xf9,0xbd, + 0xbf,0xf4,0x02,0x95,0x6f,0xff,0xf9,0xb8,0x26,0x0b,0x42,0x03,0x81,0xf0,0x2c,0xe0, + 0x38,0x0e,0x00,0x0a,0x0a,0x3c,0x81,0xc0,0x78,0x80,0x37,0x20,0xaa,0xaa,0xaa,0xa9, + 0x4a,0x01,0xa9,0x0b,0xef,0x0a,0x07,0x00,0x5b,0x05,0x10,0x01,0xf8,0x0b,0xfd,0x2f, + 0xd0,0x09,0x4b,0x01,0xbf,0x0b,0xff,0x2f,0xfe,0x1e,0x65,0x01,0x40,0x1b,0x80,0x3f, + 0x80,0x12,0x80,0x02,0x15,0x01,0x50,0x0b,0xfd,0x1e,0x0b,0x2c,0x07,0x2c,0x07,0x40, + 0x09,0x04,0x08,0x2c,0x0e,0x1e,0x0b,0x0b,0x03,0x0c,0x02,0xe0,0x1f,0x14,0x39,0x50, + 0x0b,0xfe,0x1e,0x01,0x00,0x0b,0x40,0x1f,0x0d,0xc0,0x04,0x0b,0x01,0xf8,0x05,0x3f, + 0x00,0x19,0xf4,0x03,0x06,0xf4,0xa0,0x2f,0x01,0x04,0x14,0xff,0x07,0x41,0x02,0x40, + 0x20,0xe0,0xb4,0xff,0xf0,0x6f,0xd0,0x05,0x06,0x7e,0x15,0xc0,0xfc,0x06,0x2e,0x2e, + 0x90,0x0b,0x5f,0xfc,0x10,0x05,0x00,0x00,0xff,0x10,0x07,0x19,0x03,0x1f,0xaf,0x06, + 0xfa,0xc0,0x3d,0x05,0x00,0x14,0x00,0x7d,0xbd,0x00,0xfe,0x2f,0xfe,0x0b,0xfe,0x01, + 0x00,0x2e,0x06,0x1f,0xd0,0x05,0x34,0x80,0x16,0x2d,0x0b,0x0f,0xae,0x02,0xa4,0x06, + 0x03,0x81,0x02,0xd0,0x74,0x00,0x3c,0x2c,0x00,0x74,0x0e,0xe0,0x01,0x00,0x92,0x00, + 0x07,0x02,0xe0,0x07,0xd0,0x0b,0x40,0x2e,0x00,0x7c,0x00,0xf4,0x1a,0xe0,0x7e,0xc0, + 0xfa,0x19,0xbf,0xe2,0xe6,0xc2,0x80,0x0b,0x01,0xae,0x01,0xaf,0x00,0x07,0x2d,0x07, + 0x1f,0xaf,0x01,0x40,0x41,0xf0,0x83,0xd0,0x8b,0x80,0x6e,0x02,0x7d,0x0b,0xb4,0x90, + 0x0b,0x06,0x0f,0x00,0x6f,0x02,0xfe,0x03,0x2f,0x7d,0x00,0xfc,0x01,0xf4,0x02,0xfa, + 0xf8,0x7e,0x1f,0x40,0x0f,0xc0,0x0b,0xd0,0xab,0xe0,0x07,0xfc,0x80,0x03,0x0f,0x25, + 0xbc,0x03,0x3f,0xc0,0x01,0x07,0x1f,0x7d,0xfe,0xfd,0xaf,0x00,0x4f,0x07,0xab,0xf4, + 0x05,0x5f,0xe0,0x01,0xff,0xff,0xf9,0x55,0xf8,0xf8,0x07,0xfe,0x40,0x2f,0x80,0xaf, + 0xe0,0x02,0xa0,0x00,0x6d,0x1f,0xeb,0x1f,0xff,0x1f,0xa9,0x1a,0xfd,0x7d,0x0d,0x33, + 0x40,0x02,0x03,0xc0,0x1f,0x80,0x2e,0x0a,0x58,0xf0,0x81,0x0b,0x43,0x0e,0x07,0x2c, + 0x0e,0x14,0x78,0xd0,0x2e,0x00,0xb8,0xd0,0x06,0x42,0xda,0x0b,0x4a,0x1e,0xaf,0x1a, + 0xaf,0x90,0x40,0x02,0xb8,0xea,0x02,0xa0,0x02,0x7c,0x00,0x64,0x79,0xc1,0xe1,0x43, + 0x01,0xe8,0xd0,0x0b,0xe0,0x1f,0x80,0x0f,0xe0,0x07,0xff,0x02,0x90,0x07,0xd0,0x2f, + 0xc0,0xff,0x40,0xf8,0x02,0xff,0x0b,0xd5,0x0f,0xc0,0x00,0x00,0xff,0xf0,0xfc,0x3e, + 0x02,0x3f,0x56,0xf4,0x0a,0x07,0x23,0x2f,0x14,0xf8,0x7e,0x04,0x02,0xff,0x03,0xf5, + 0xff,0xf8,0x55,0xbc,0x2f,0x40,0xe5,0x07,0xd0,0x0f,0x7d,0x08,0x3e,0xfe,0xaa,0xff, + 0xff,0x55,0x90,0x07,0xf5,0x1b,0x07,0x2e,0x00,0x00,0x17,0xf0,0xff,0xd0,0xf9,0x17, + 0x10,0x00,0x7d,0x2f,0xff,0x03,0x01,0xbf,0x02,0xfd,0x01,0x90,0x80,0x05,0x2a,0xff, + 0x0b,0xe2,0x0b,0x40,0xe0,0x78,0x06,0x00,0x0b,0xd2,0x05,0x50,0x03,0xb9,0x00,0xff, + 0x80,0x2f,0xe0,0x01,0x3e,0x14,0x40,0xbf,0xc0,0xf9,0x12,0x6a,0xff,0xe0,0xd2,0xf8, + 0x40,0xb8,0x00,0x10,0x14,0xc2,0xf4,0x40,0x50,0x16,0x7f,0xff,0xe4,0x01,0x90,0x0b, + 0xfd,0x1f,0xbf,0x2d,0x0b,0x14,0x80,0x42,0xc0,0xff,0x80,0xfe,0x02,0x00,0x80,0xfd, + 0x00,0x28,0xfe,0x07,0x0a,0x6f,0xb8,0x54,0x07,0x7e,0x11,0xa4,0xff,0x40,0x5f,0x05, + 0x81,0x24,0x95,0x04,0x01,0xc0,0x05,0x40,0x05,0x60,0x0c,0x54,0x7e,0xff,0x02,0x3f, + 0x2f,0x80,0x00,0xe4,0x68,0xf0,0x05,0x2f,0x38,0x40,0xf4,0x03,0x06,0x01,0xf8,0x90, + 0x7e,0x06,0x02,0xf8,0x2f,0xf0,0x0e,0x2f,0xff,0x2f,0x00,0xff,0x2f,0xaa,0x2f,0xfd, + 0x00,0xa9,0x03,0x2e,0x29,0xfc,0x00,0xa8,0x12,0x00,0x0c,0x3e,0x0e,0x7e,0x7e,0x0a, + 0xbe,0x1f,0xff,0x0a,0xbe,0xff,0xfe,0x0b,0x02,0xa4,0xa4,0x02,0xf0,0xf0,0x00,0x2f, + 0xd0,0x2f,0xf0,0x2f,0xf8,0x2e,0xbd,0x2e,0x3f,0x2e,0x2f,0x2e,0x0f,0x2e,0x82,0xe0, + 0xd2,0xe0,0xe2,0x07,0xfe,0x0f,0xd0,0x7e,0x7e,0x00,0xbf,0xd0,0x0b,0xe0,0x02,0xbc, + 0xbd,0xff,0x03,0xf4,0x0b,0xd0,0x2f,0x3e,0x00,0x07,0x44,0xc0,0xaf,0xf4,0x02,0xfc, + 0x3f,0x00,0x40,0xd0,0x07,0xf4,0x01,0xfd,0xbe,0x01,0xf8,0x07,0x7e,0xbe,0x00,0x0b, + 0x42,0x1f,0x4b,0xaf,0xf4,0x07,0xf8,0x0f,0xfd,0x2f,0x7e,0x7d,0x2f,0xf8,0xd0,0x02, + 0xf0,0x5f,0x0e,0x05,0xaa,0x2f,0xff,0x15,0xaa,0x40,0xff,0x80,0x55,0x09,0x78,0x15, + 0x13,0x7e,0x7f,0x03,0x6f,0xab,0xfe,0xff,0xe4,0xe0,0x2e,0x02,0xf6,0xe0,0xfe,0xe0, + 0x7f,0xe0,0x2f,0xe0,0x0f,0xe0,0x05,0x50,0x04,0xfa,0x1a,0x02,0xf8,0x07,0xf0,0xaf, + 0xd0,0xfe,0x40,0xa4,0x04,0x06,0xbe,0x01,0xfc,0xaf,0xf4,0xff,0x90,0xa5,0x09,0x02, + 0xbd,0x80,0x04,0x02,0xf8,0x15,0x3f,0xab,0xa9,0x04,0xf8,0x0b,0xe0,0x2f,0x80,0x1d, + 0x80,0xf8,0x08,0x0f,0x9f,0x0b,0xfe,0x07,0xfd,0x02,0xfe,0xc6,0x0a,0x80,0x05,0x0f, + 0xd0,0x0b,0x07,0xe0,0x08,0xc0,0x0b,0xfa,0x02,0xc0,0xfe,0x40,0x94,0x05,0x2f,0x0b, + 0x00,0x05,0x80,0x03,0x90,0x18,0x00,0x34,0x11,0x1a,0x1d,0x01,0xaa,0x09,0x0a,0x00, + 0xbf,0x03,0xfd,0xd0,0x0a,0xf8,0x08,0x40,0x0b,0xf8,0x2f,0xfe,0x78,0x1f,0x40,0x07, + 0x80,0xff,0x09,0x0b,0xe1,0x05,0x19,0x01,0xff,0xc0,0x02,0xe5,0xd0,0xb4,0x00,0x0f, + 0x4a,0x16,0x80,0x3b,0x15,0x18,0xfd,0x17,0xe2,0xf8,0x18,0x17,0xb8,0x1f,0x06,0x00, + 0xaf,0x0a,0x1f,0x00,0x40,0xff,0x10,0x03,0x2f,0x00,0x0f,0x07,0xe0,0x0b,0xc0,0x1f, + 0x40,0xd0,0x02,0x2f,0x55,0xa4,0x6f,0x80,0x6f,0x0b,0xff,0x2f,0x95,0x01,0x3e,0x2f, + 0x3e,0x1a,0x3e,0x00,0xf9,0xf8,0x00,0xbe,0x01,0x00,0x02,0xbf,0x1f,0xff,0x2e,0x41, + 0x08,0x00,0x00,0x5b,0x07,0xff,0xf8,0xfc,0x00,0x00,0xfc,0x00,0x40,0x01,0x1e,0x78, + 0x90,0x00,0x20,0x02,0xfd,0x05,0x01,0x1f,0x40,0x1b,0x06,0xff,0x54,0xbc,0x03,0x05, + 0x05,0xff,0x1f,0xff,0x0e,0x02,0x04,0x02,0x00,0x02,0x06,0x5b,0xf8,0xff,0xfe,0xf8, + 0x1f,0xf0,0x0b,0xe5,0xab,0xff,0x40,0x00,0x05,0x01,0xbf,0x07,0xfa,0x1f,0x80,0x04, + 0x02,0x00,0x00,0xaf,0x07,0xff,0x0f,0x90,0x2f,0x00,0x2e,0x16,0x3f,0xff,0x90,0xbe, + 0xaf,0x00,0x00,0x01,0xbf,0x3e,0x00,0xbf,0x01,0x1f,0xbd,0x02,0x05,0x2e,0x00,0x3d, + 0x50,0x06,0x2a,0x0e,0x2a,0x19,0x40,0xb8,0x00,0x10,0x29,0x1a,0x1a,0x02,0xfe,0x00, + 0x00,0x6f,0x1f,0x40,0x2f,0x40,0xef,0x80,0xff,0xc0,0x2f,0xc0,0x20,0x19,0x6a,0x2e, + 0xff,0x2f,0xd5,0x2f,0x13,0x0b,0x05,0xc0,0x40,0x04,0xa4,0x10,0x05,0x29,0x08,0x1f, + 0xe4,0x2f,0xab,0x1f,0xff,0x01,0xfe,0x40,0xbf,0x40,0x06,0x04,0x3f,0x17,0x1f,0xe4, + 0x2e,0xaf,0x0a,0x01,0x1a,0xbc,0x00,0xfe,0x80,0xaf,0x80,0x34,0x0f,0xff,0x02,0x2f, + 0x5f,0x1f,0xff,0x06,0xfa,0x94,0xe0,0x01,0xf4,0x07,0xfe,0xaf,0x6f,0xfe,0x06,0x80, + 0x0b,0xe4,0x6f,0x00,0x0f,0xbd,0x6e,0x90,0x05,0xa9,0x2e,0x0b,0xea,0x50,0x1e,0x40, + 0x49,0xfe,0x09,0x00,0xf4,0x05,0x4e,0x14,0x43,0x07,0xf9,0x07,0xd0,0x0b,0xd0,0x1f, + 0xc0,0xbf,0x50,0x13,0x1e,0xbf,0x00,0x1b,0xd0,0x0a,0x01,0x7f,0x01,0x18,0x1a,0x00, + 0xbf,0x01,0xff,0x07,0xe5,0xf4,0x0c,0xf4,0x3f,0x0a,0x03,0x03,0xbd,0x0e,0xf4,0x3a, + 0x2e,0x00,0xf4,0x1b,0xe0,0x09,0x7f,0xf5,0x0a,0x07,0xe0,0x04,0x27,0x1f,0x0b,0xe0, + 0x16,0xff,0x36,0x6a,0xe5,0x2f,0x3e,0x00,0xa0,0x40,0x0f,0x80,0x0b,0x00,0xa0,0x00, + 0x0f,0x00,0x80,0x01,0x1f,0x7d,0x0a,0x20,0x07,0x00,0x1f,0x01,0x01,0x6a,0xe5,0xfd, + 0x80,0x00,0x05,0x55,0x2f,0xff,0x1a,0xaa,0x55,0x55,0xff,0xff,0xaa,0xaa,0x6a,0x06, + 0x81,0x2f,0x02,0x2e,0x0b,0x9f,0x40,0xfe,0x80,0xef,0x80,0xcb,0xc0,0x02,0x0a,0xa0, + 0x02,0x1a,0x6d,0x1a,0x2f,0x54,0x07,0x1a,0x00,0xf9,0x40,0xf8,0x01,0x5b,0x2f,0xbf, + 0x2f,0xf4,0x2f,0xe0,0x2f,0x40,0xd0,0x02,0xd0,0x02,0xf9,0x0a,0x04,0xff,0x3d,0x2f, + 0x40,0x08,0x2f,0x1f,0x0d,0x3f,0x00,0x09,0x5a,0x40,0x2f,0x09,0x2f,0x0b,0xfa,0x0b, + 0xc0,0x80,0x08,0x60,0x06,0x1f,0x2f,0x7e,0x1f,0xf8,0x0b,0xfa,0x03,0xff,0x0b,0x9a, + 0x4b,0xc0,0x0c,0x69,0x3f,0x40,0xff,0x40,0xef,0x40,0x05,0x09,0x0f,0xfa,0x07,0x7f, + 0x10,0xea,0x7f,0xef,0x00,0x34,0x00,0x1f,0x00,0x7f,0x0f,0xfd,0x0f,0xf0,0xd0,0x00, + 0x00,0xf0,0x2f,0xfe,0x2f,0x6f,0x2f,0x45,0x07,0xd0,0x90,0x08,0xbe,0xd0,0x80,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +}; + /*** Backdrop ***/ char backdrop[(640 * 480 * 2) + 32]; @@ -46,8 +629,6 @@ typedef struct static unsigned char fontWork[ 0x20000 ] __attribute__((aligned(32))); static unsigned char fontFont[ 0x40000 ] __attribute__((aligned(32))); -extern unsigned int *xfb[2]; -extern int whichfb; /**************************************************************************** * YAY0 Decoding @@ -144,13 +725,14 @@ void untile(unsigned char *dst, unsigned char *src, int xres, int yres) } int font_offset[256], font_size[256], fheight; -extern void __SYS_ReadROM(void *buf,u32 len,u32 offset); +//extern void __SYS_ReadROM(void *buf,u32 len,u32 offset); void init_font(void) { int i; - __SYS_ReadROM((unsigned char *)&fontFont,0x3000,0x1FCF00); + //__SYS_ReadROM((unsigned char *)&fontFont,0x3000,0x1FCF00); + memcpy(&fontFont, &iplfont, sizeof(iplfont)); yay0_decode((unsigned char *)&fontFont, (unsigned char *)&fontWork); FONT_HEADER *fnt; @@ -177,8 +759,8 @@ void init_font(void) #define TRANSPARENCY (COLOR_BLACK) -unsigned int blit_lookup[4] = {COLOR_BLACK, 0x6d896d77, 0xb584b57b, 0xff80ff80}; -unsigned int blit_lookup_inv[4] = {COLOR_WHITE, 0xb584b57b, 0x6d896d77, 0x258e2573}; +unsigned int blit_lookup[4]={COLOR_BLACK, 0x6d896d77, 0xb584b57b, COLOR_WHITE}; +unsigned int blit_lookup_inv[4]={COLOR_WHITE, 0xb584b57b, 0x6d896d77, 0x258e2573}; void setfontcolour (int fcolour) { @@ -186,7 +768,7 @@ void setfontcolour (int fcolour) { blit_lookup[1] = 0x6d896d77; blit_lookup[2] = 0xb584b57b; - blit_lookup[3] = 0xff80ff80; + blit_lookup[3] = COLOR_WHITE; } else { @@ -235,24 +817,24 @@ void blit_char(int x, int y, unsigned char c, unsigned int *lookup) } } -void write_font(int x, int y, const unsigned char *string) +void write_font(int x, int y, char *string) { int ox = x; while (*string && (x < (ox + back_framewidth))) { blit_char(x, y, *string, blit_lookup); - x += font_size[*string]; + x += font_size[(u8)*string]; string++; } } -void writex(int x, int y, int sx, int sy, const unsigned char *string, unsigned int *lookup) +void writex(int x, int y, int sx, int sy, char *string, unsigned int *lookup) { int ox = x; while ((*string) && ((x) < (ox + sx))) { blit_char(x, y, *string, lookup); - x += font_size[*string]; + x += font_size[(u8)*string]; string++; } @@ -264,19 +846,19 @@ void writex(int x, int y, int sx, int sy, const unsigned char *string, unsigned } } -void WriteCentre( int y, const unsigned char *string) +void WriteCentre( int y, char *string) { int x, t; - for (x=t=0; tback_framewidth) x=back_framewidth; x = (640 - x) >> 1; write_font(x, y, string); } -void WriteCentre_HL( int y, const unsigned char *string) +void WriteCentre_HL( int y, char *string) { int x,t,h; - for (x=t=0; tback_framewidth) x = back_framewidth; h = x; x = (640 - x) >> 1; @@ -326,6 +908,7 @@ u8 SILENT = 0; void SetScreen () { + VIDEO_SetNextFramebuffer (xfb[whichfb]); VIDEO_Flush (); VIDEO_WaitVSync (); @@ -338,21 +921,31 @@ void ClearScreen () back_framewidth = 440; } +void WaitButtonA () +{ + s16 p = ogc_input__getMenuButtons(); + + while (p & PAD_BUTTON_A) + { + VIDEO_WaitVSync(); + p = ogc_input__getMenuButtons(); + } + + while (!(p & PAD_BUTTON_A)) + { + VIDEO_WaitVSync(); + p = ogc_input__getMenuButtons(); + } +} + void WaitPrompt (char *msg) { - int quit = 0; - if (SILENT) return; - - while (PAD_ButtonsDown(0) & PAD_BUTTON_A) {}; - while (!(PAD_ButtonsDown(0) & PAD_BUTTON_A) && (quit == 0)) - { - ClearScreen(); - WriteCentre(254, msg); - WriteCentre(254 + fheight, "Press A to Continue"); - SetScreen(); - while (!(PAD_ButtonsDown(0) & PAD_BUTTON_A)); - } + ClearScreen(); + WriteCentre(254, msg); + WriteCentre(254 + fheight, "Press A to Continue"); + SetScreen(); + WaitButtonA (); } void ShowAction (char *msg) @@ -364,12 +957,6 @@ void ShowAction (char *msg) SetScreen(); } -void WaitButtonA () -{ - while (PAD_ButtonsDown(0) & PAD_BUTTON_A) {}; - while (!(PAD_ButtonsDown(0) & PAD_BUTTON_A)); -} - /**************************************************************************** * Unpack Backdrop * @@ -382,7 +969,7 @@ void unpackBackdrop () inbytes = gpback_COMPRESSED; outbytes = gpback_RAW; - res = uncompress ((char *) &backdrop[0], &outbytes, (char *) &gpback[0], inbytes); + res = uncompress ((Bytef *) &backdrop[0], &outbytes, (Bytef *) &gpback[0], inbytes); if (res != Z_OK) while (1); } diff --git a/source/ngc/gui/font.h b/source/ngc/gui/font.h index a452a68..af9838a 100644 --- a/source/ngc/gui/font.h +++ b/source/ngc/gui/font.h @@ -1,23 +1,3 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - ***************************************************************************/ /***************************************************************************** * IPL FONT Engine * @@ -26,9 +6,9 @@ *****************************************************************************/ extern void init_font(void); -extern void WriteCentre_HL( int y, const unsigned char *string); -extern void WriteCentre (int y, const unsigned char *text); -extern void write_font (int x, int y, const unsigned char *text); +extern void WriteCentre_HL( int y, char *string); +extern void WriteCentre (int y, char *text); +extern void write_font (int x, int y, char *text); extern void WaitPrompt (char *msg); extern void ShowAction (char *msg); extern void WaitButtonA (); @@ -40,3 +20,4 @@ extern void setfontcolour (int fcolour); extern int fheight; extern int font_size[256]; extern u16 back_framewidth; +extern u8 SILENT; diff --git a/source/ngc/gui/ggentry.c b/source/ngc/gui/ggentry.c index 2b372d9..5b7b221 100644 --- a/source/ngc/gui/ggentry.c +++ b/source/ngc/gui/ggentry.c @@ -1,351 +1,347 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Nintendo Gamecube Game Genie Entry - ***************************************************************************/ - -#include "shared.h" -#include "font.h" -#include "rominfo.h" - -#define MAXCODES 8 - -typedef struct -{ - int address; - unsigned short data; -} GGPATCH; - -/*** Game Genie Codes Array ***/ -unsigned char ggcodes[MAXCODES][10]; /*** Codes are entered as XXXX-XXXX ***/ -int gghpos[MAXCODES]; /*** Edit positions ***/ -int ggrow = 0; -int editing = 0; -char ggvalidchars[] = "ABCDEFGHJKLMNPRSTVWXYZ0123456789*"; -GGPATCH ggpatch[8]; -extern char menutitle[]; - -/**************************************************************************** - * Decode Game Genie entries to memory patches - ****************************************************************************/ -void decode_genie (char *code, int which) -{ - char *p; - int n, i; - for (i = 0; i < 8; i++) - { - /*** This should only happen if memory is corrupt! ***/ - p = strchr (ggvalidchars, code[i]); - if (p == NULL) - { - ggpatch[which].address = ggpatch[which].data = 0; - return; - } - - n = p - ggvalidchars; - - switch (i) - { - case 0: - ggpatch[which].data |= n << 3; - break; - - case 1: - ggpatch[which].data |= n >> 2; - ggpatch[which].address |= (n & 3) << 14; - break; - - case 2: - ggpatch[which].address |= n << 9; - break; - - case 3: - ggpatch[which].address |= (n & 0xF) << 20 | (n >> 4) << 8; - break; - - case 4: - ggpatch[which].data |= (n & 1) << 12; - ggpatch[which].address |= (n >> 1) << 16; - break; - - case 5: - ggpatch[which].data |= (n & 1) << 15 | (n >> 1) << 8; - break; - - case 6: - ggpatch[which].data |= (n >> 3) << 13; - ggpatch[which].address |= (n & 7) << 5; - break; - - case 7: - ggpatch[which].address |= n; - break; - } - } -} - -void decode_ggcodes () -{ - int i, j; - char thiscode[10]; - - /*** Clear out any old patches ***/ - memset (&ggpatch[0], 0, 8 * sizeof (GGPATCH)); - memset (&thiscode, 0, 10); - - j = 0; - for (i = 0; i < 8; i++) - { - if (strcmp (ggcodes[i], "AAAA-AAAA")) - { - /*** Move the code into thiscode ***/ - memcpy (&thiscode, &ggcodes[i], 4); - memcpy (&thiscode[4], &ggcodes[i][5], 4); - - decode_genie (thiscode, j); - j++; - } - } - - /*** And now apply the patches ***/ - if (j) - { - for (i = 0; i < j; i++) - { - if (ggpatch[i].address < rominfo.romend) - { - /*** Patching ROM space ***/ - cart_rom[ggpatch[i].address] = ggpatch[i].data & 0x0ff; - cart_rom[ggpatch[i].address + 1] = (ggpatch[i].data & 0xff00) >> 8; - } - else - { - /*** Patching 68K memory ***/ - m68k_write_memory_16 (ggpatch[i].address, ggpatch[i].data); - } - } - /* TODO : Fix Checksum */ - } -} - -/**************************************************************************** - * ClearGGCodes - * - * Should be called whenever a new rom is loaded - ****************************************************************************/ -void ClearGGCodes () -{ - int i; - - for (i = 0; i < MAXCODES; i++) - { - strcpy (ggcodes[i], "AAAA-AAAA"); - gghpos[i] = 0; - } - ggrow = 0; -} - -/**************************************************************************** - * DrawGGCodes - * - * Just draw the codes, with the current one highlighted. - ****************************************************************************/ -void DrawGGCodes () -{ - int i,j; - unsigned char c[2] = { 0, 0 }; - - ClearScreen (); - WriteCentre (134, menutitle); - - for (i = 0; i < MAXCODES; i++) - { - if (i == ggrow) - { - /*** Highlight selected ***/ - WriteCentre_HL (i * fheight + 224, ggcodes[i]); - - /*** If editing, highlight the current character ***/ - if (editing) - { - int hpos = 0; - - for (j=0; j> 1); - for (j=0; j 70)) - { - /*** Increment the entry ***/ - redraw = 1; - c[0] = ggcodes[ggrow][gghpos[ggrow]]; - v = strstr (ggvalidchars, c); - v++; - if (*v == '*') ggcodes[ggrow][gghpos[ggrow]] = 'A'; - else ggcodes[ggrow][gghpos[ggrow]] = *v; - } - - if ((p & PAD_BUTTON_DOWN) || (y < -70)) - { - /*** Decrement entry ***/ - redraw = 1; - c[0] = ggcodes[ggrow][gghpos[ggrow]]; - v = strstr (ggvalidchars, c); - if (*v == 'A') ggcodes[ggrow][gghpos[ggrow]] = '9'; - else - { - v--; - ggcodes[ggrow][gghpos[ggrow]] = *v; - } - } - - if ((p & PAD_BUTTON_LEFT) || (x < -70)) - { - redraw = 1; - gghpos[ggrow]--; - if (gghpos[ggrow] == 4) gghpos[ggrow]--; - } - - if ((p & PAD_BUTTON_RIGHT) || (x > 70)) - { - redraw = 1; - gghpos[ggrow]++; - if (gghpos[ggrow] == 4) gghpos[ggrow]++; - } - - if (gghpos[ggrow] < 0) gghpos[ggrow] = 8; - if (gghpos[ggrow] > 8) gghpos[ggrow] = 0; - } - - /** Lose any previous A press **/ - while (PAD_ButtonsDown (0) & PAD_BUTTON_A); - - editing = 0; -} - -/**************************************************************************** - * GGSelectLine - * - * Select which line to edit - ****************************************************************************/ -void GGSelectLine () -{ - int redraw = 1; - int quit = 0; - short j; - signed char y; - - /*** To select a line, just move up or down. - Pressing A will enter edit mode. - Pressing B will exit to caller. ***/ - - while (!(PAD_ButtonsDown (0) & PAD_BUTTON_B) && (quit == 0)) - { - if (redraw) - { - DrawGGCodes (); - redraw = 0; - } - - j = PAD_ButtonsDown (0); - y = PAD_StickY (0); - - if ((j & PAD_BUTTON_UP) || (y > 70)) - { - ggrow--; - redraw = 1; - } - - if ((j & PAD_BUTTON_DOWN) || (y < -70)) - { - ggrow++; - redraw = 1; - } - - if (ggrow < 0) ggrow = MAXCODES - 1; - if (ggrow == MAXCODES) ggrow = 0; - - if (j & PAD_BUTTON_B) quit = 1; - - if (j & PAD_BUTTON_A) - { - GGEditLine (); - redraw = 1; - } - } -} - -/**************************************************************************** - * GetGGEntries - * - * Screen to return encoded Game Genie codes. - * No keyboard is available, so it's just a simple wrap round each line kind - * of thing. - ****************************************************************************/ -void GetGGEntries () -{ - editing = 0; - strcpy (menutitle, "Game Genie Entry"); - GGSelectLine (); -} +/**************************************************************************** + * Genesis Plus 1.2a + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Nintendo Gamecube Game Genie Entry + ***************************************************************************/ + +#include "shared.h" +#include "font.h" + +#define MAXCODES 8 + +extern char menutitle[60]; + +typedef struct +{ + int address; + unsigned short data; +} GGPATCH; + +/*** Game Genie Codes Array ***/ +unsigned char ggcodes[MAXCODES][10]; /*** Codes are entered as XXXX-XXXX ***/ +int gghpos[MAXCODES]; /*** Edit positions ***/ +int ggrow = 0; +int editing = 0; +char ggvalidchars[] = "ABCDEFGHJKLMNPRSTVWXYZ0123456789*"; +GGPATCH ggpatch[8]; + +/**************************************************************************** + * Decode Game Genie entries to memory patches + ****************************************************************************/ +void decode_genie (char *code, int which) +{ + char *p; + int n, i; + for (i = 0; i < 8; i++) + { + /*** This should only happen if memory is corrupt! ***/ + p = strchr (ggvalidchars, code[i]); + if (p == NULL) + { + ggpatch[which].address = ggpatch[which].data = 0; + return; + } + + n = p - ggvalidchars; + + switch (i) + { + case 0: + ggpatch[which].data |= n << 3; + break; + + case 1: + ggpatch[which].data |= n >> 2; + ggpatch[which].address |= (n & 3) << 14; + break; + + case 2: + ggpatch[which].address |= n << 9; + break; + + case 3: + ggpatch[which].address |= (n & 0xF) << 20 | (n >> 4) << 8; + break; + + case 4: + ggpatch[which].data |= (n & 1) << 12; + ggpatch[which].address |= (n >> 1) << 16; + break; + + case 5: + ggpatch[which].data |= (n & 1) << 15 | (n >> 1) << 8; + break; + + case 6: + ggpatch[which].data |= (n >> 3) << 13; + ggpatch[which].address |= (n & 7) << 5; + break; + + case 7: + ggpatch[which].address |= n; + break; + } + } +} + +void decode_ggcodes () +{ + int i, j; + char thiscode[10]; + + /*** Clear out any old patches ***/ + memset (&ggpatch[0], 0, 8 * sizeof (GGPATCH)); + memset (&thiscode, 0, 10); + + j = 0; + for (i = 0; i < 8; i++) + { + if (strcmp ((char *)ggcodes[i], "AAAA-AAAA")) + { + /*** Move the code into thiscode ***/ + memcpy (&thiscode, &ggcodes[i], 4); + memcpy (&thiscode[4], &ggcodes[i][5], 4); + + decode_genie (thiscode, j); + j++; + } + } + + /*** And now apply the patches ***/ + if (j) + { + for (i = 0; i < j; i++) + { + if (ggpatch[i].address < 0x400000) + { + /*** Patching ROM space ONLY (Game Genie does NOT have access to other memory areas) ***/ + if (cart_rom) *(uint16 *)(cart_rom + ggpatch[i].address) = ggpatch[i].data & 0xffff; + } + } + } +} + +/**************************************************************************** + * ClearGGCodes + * + * Should be called whenever a new rom is loaded + ****************************************************************************/ +void ClearGGCodes () +{ + int i; + + for (i = 0; i < MAXCODES; i++) + { + strcpy ((char *)ggcodes[i], "AAAA-AAAA"); + gghpos[i] = 0; + } + ggrow = 0; +} + +/**************************************************************************** + * DrawGGCodes + * + * Just draw the codes, with the current one highlighted. + ****************************************************************************/ +void DrawGGCodes () +{ + int i,j; + unsigned char c[2] = { 0, 0 }; + + ClearScreen (); + WriteCentre (134, menutitle); + + for (i = 0; i < MAXCODES; i++) + { + if (i == ggrow) + { + /*** Highlight selected ***/ + WriteCentre_HL (i * fheight + 224, (char *)ggcodes[i]); + + /*** If editing, highlight the current character ***/ + if (editing) + { + int hpos = 0; + + for (j=0; j> 1); + for (j=0; j 8) gghpos[ggrow] = 0; + + if (p & PAD_BUTTON_A) quit = 1; + } + + editing = 0; +} + +/**************************************************************************** + * GGSelectLine + * + * Select which line to edit + ****************************************************************************/ +void GGSelectLine () +{ + int redraw = 1; + int quit = 0; + short j; + + /*** To select a line, just move up or down. + Pressing A will enter edit mode. + Pressing B will exit to caller. ***/ + + while (quit == 0) + { + if (redraw) + { + DrawGGCodes (); + redraw = 0; + } + + j = ogc_input__getMenuButtons(); + + if (j & PAD_BUTTON_UP) + { + ggrow--; + redraw = 1; + } + + if (j & PAD_BUTTON_DOWN) + { + ggrow++; + redraw = 1; + } + + if (ggrow < 0) ggrow = MAXCODES - 1; + if (ggrow == MAXCODES) ggrow = 0; + + if (j & PAD_BUTTON_B) quit = 1; + + if (j & PAD_BUTTON_A) + { + GGEditLine (); + redraw = 1; + } + + if (j & PAD_TRIGGER_Z) + { + /* reset code */ + strcpy ((char *)ggcodes[ggrow], "AAAA-AAAA"); + gghpos[ggrow] = 0; + redraw = 1; + } + } +} + +/**************************************************************************** + * GetGGEntries + * + * Screen to return encoded Game Genie codes. + * No keyboard is available, so it's just a simple wrap round each line kind + * of thing. + ****************************************************************************/ +void GetGGEntries () +{ + editing = 0; + strcpy (menutitle, "Game Genie Entry"); + GGSelectLine (); + + /* Apply Game Genie patches */ + decode_ggcodes (); +} diff --git a/source/ngc/gui/gpback.h b/source/ngc/gui/gpback.h index ff42e31..6beaf85 100644 --- a/source/ngc/gui/gpback.h +++ b/source/ngc/gui/gpback.h @@ -1,8991 +1,8991 @@ -/******************************************************************* - * Image File : genplus.bmp - * Width : 640 - * Height : 480 - * - * This header contains a compressed Zip image. - * Use zlib1.2.3 uncompress function to restore. - * - * Backdrop design by brakken[at]tehskeen.com - *******************************************************************/ - -#define gpback_RAW 614400 -#define gpback_COMPRESSED 71779 -#define gpback_WIDTH 640 -#define gpback_HEIGHT 480 - -unsigned char gpback[71779] = { - 0x78, 0xda, 0xe4, 0xbd, 0x07, 0x98, 0x1b, 0xd5, 0xbd, 0x3e, 0xec, 0x6d, - 0xd2, 0x6a, 0xab, 0xa4, - 0x5d, 0x77, 0x1b, 0xdb, 0xb8, 0x62, 0x3a, 0x06, 0x4c, 0xef, 0x10, 0x20, - 0xa1, 0x04, 0x48, 0x4c, - 0x35, 0x60, 0x8c, 0x6d, 0xc0, 0x75, 0x8b, 0xa4, 0xd1, 0xcc, 0x29, 0x53, - 0x34, 0x55, 0x7d, 0x7b, - 0x5f, 0xdb, 0x60, 0x1b, 0x30, 0xcd, 0x74, 0x02, 0x09, 0x1d, 0x17, 0x6c, - 0x53, 0x43, 0x0d, 0x10, - 0x48, 0x21, 0xe5, 0xa6, 0x53, 0x6e, 0x72, 0xef, 0xe5, 0x3b, 0x67, 0xb4, - 0x45, 0xbb, 0xab, 0x32, - 0xbb, 0x96, 0xcd, 0xff, 0x79, 0x3e, 0xf6, 0x39, 0x8c, 0x56, 0xd6, 0x6a, - 0xe6, 0x9c, 0x99, 0xf3, - 0x9e, 0xf7, 0xf7, 0xfe, 0xca, 0x19, 0x87, 0xc7, 0xa5, 0xfd, 0xc9, 0x53, - 0x6c, 0xc0, 0x6e, 0x14, - 0xb0, 0x49, 0xef, 0xa1, 0x3c, 0x31, 0x1f, 0xe6, 0x2b, 0x05, 0xa0, 0xc8, - 0xb0, 0xb1, 0xf6, 0x88, - 0xdd, 0x6f, 0x8f, 0x92, 0x46, 0x8f, 0x61, 0x9b, 0xdf, 0xa6, 0x17, 0xb2, - 0x05, 0x72, 0x3e, 0xc8, - 0x13, 0xf3, 0x60, 0x1e, 0x3f, 0x0e, 0x0d, 0xf9, 0x36, 0x21, 0x1f, 0xd9, - 0xc3, 0x76, 0xff, 0x88, - 0xf7, 0x87, 0x9f, 0x53, 0x25, 0xe7, 0xd4, 0xf3, 0xb9, 0x4c, 0x9f, 0xa1, - 0xd7, 0x51, 0x18, 0xb2, - 0xb3, 0x85, 0xd2, 0x38, 0x98, 0xf1, 0x53, 0x62, 0x01, 0xa4, 0xd7, 0x95, - 0x87, 0x53, 0x9f, 0x33, - 0x4f, 0xc8, 0x83, 0xf9, 0x72, 0x01, 0x28, 0x34, 0xec, 0x23, 0xfb, 0x62, - 0x14, 0xb1, 0x05, 0x4a, - 0x3e, 0xc8, 0x1f, 0xec, 0x0b, 0x2a, 0x0a, 0xd9, 0xfd, 0x05, 0xd9, 0xce, - 0x29, 0x91, 0x73, 0x86, - 0x6c, 0xfe, 0x71, 0x38, 0x73, 0x3f, 0xf3, 0x35, 0x3b, 0x67, 0xd7, 0xf2, - 0x32, 0xf7, 0x93, 0xcf, - 0x43, 0x36, 0x32, 0x66, 0x05, 0x62, 0xb6, 0x73, 0x16, 0x92, 0x73, 0x16, - 0xb1, 0xf9, 0x01, 0xd2, - 0x17, 0xbd, 0x88, 0xa3, 0x7f, 0x33, 0xd8, 0x17, 0xbb, 0xdf, 0x16, 0x2c, - 0x62, 0x0b, 0xd5, 0x02, - 0xce, 0x3c, 0xa7, 0x6a, 0x9e, 0x13, 0x65, 0x3b, 0x67, 0xbe, 0x98, 0xf9, - 0xfa, 0xc7, 0x05, 0x0a, - 0x81, 0x3d, 0x58, 0xc8, 0x66, 0xb9, 0x4f, 0x38, 0x5f, 0xb7, 0x73, 0x36, - 0x25, 0x0f, 0x64, 0xed, - 0x27, 0xb9, 0xd6, 0x7c, 0xa1, 0xef, 0x9c, 0xe4, 0xf7, 0x7c, 0x29, 0x1f, - 0x16, 0x68, 0x85, 0x9c, - 0x2d, 0xd4, 0xd7, 0x97, 0x68, 0xa2, 0x2f, 0xf4, 0xde, 0x98, 0x7d, 0x91, - 0xe8, 0x7d, 0xc9, 0x43, - 0xa9, 0xfa, 0x52, 0x40, 0xee, 0xa7, 0x4d, 0x1e, 0x97, 0xf9, 0x9c, 0xf4, - 0x79, 0x24, 0xe7, 0xcc, - 0x13, 0xb2, 0x3c, 0x8f, 0x23, 0xe7, 0x40, 0xea, 0xe7, 0x31, 0x68, 0x67, - 0x8b, 0x02, 0xa9, 0xee, - 0x53, 0x1e, 0xca, 0xa3, 0x7d, 0x51, 0x49, 0x5f, 0x82, 0x43, 0xe7, 0x8c, - 0x2d, 0x64, 0x63, 0x8b, - 0xf4, 0x42, 0x2e, 0x3f, 0x90, 0x0f, 0xc9, 0xb3, 0x38, 0xd0, 0x97, 0xc4, - 0x39, 0x73, 0x35, 0x07, - 0xe8, 0xbc, 0x4b, 0x3f, 0x07, 0x92, 0xe6, 0x1d, 0x97, 0x75, 0xde, 0x91, - 0xf1, 0xa6, 0x73, 0xa0, - 0x88, 0xdc, 0x97, 0xa2, 0x61, 0x7d, 0xa1, 0xcf, 0x7c, 0x11, 0x9d, 0xff, - 0x01, 0x32, 0xff, 0xc9, - 0x73, 0x68, 0x7d, 0x0e, 0xe4, 0xe7, 0x74, 0x0e, 0x64, 0x7d, 0x1e, 0x93, - 0xe6, 0x40, 0x9e, 0x90, - 0x0f, 0x0f, 0x60, 0x4c, 0x4c, 0x2c, 0x34, 0xef, 0x6b, 0xb8, 0x6f, 0x0c, - 0x92, 0xc7, 0x82, 0x8c, - 0x91, 0x39, 0x16, 0xfd, 0xf7, 0x55, 0x1c, 0x0d, 0x2e, 0x7c, 0x0f, 0x63, - 0x42, 0xfa, 0x99, 0x12, - 0xd7, 0x43, 0x7d, 0xb8, 0x4e, 0xfa, 0x42, 0xe7, 0x62, 0xd6, 0x73, 0x52, - 0x5c, 0x08, 0x59, 0xc4, - 0x05, 0x75, 0x94, 0xb8, 0x90, 0xee, 0x3e, 0xc9, 0x45, 0xc9, 0x58, 0x84, - 0x06, 0x70, 0x5d, 0x1f, - 0xbe, 0x46, 0x25, 0xb0, 0x70, 0x18, 0xae, 0xa7, 0xc4, 0x85, 0xfc, 0xdc, - 0xe2, 0x82, 0x35, 0x2c, - 0x4a, 0x79, 0x3d, 0x04, 0x0b, 0xfb, 0x71, 0x3d, 0x94, 0x02, 0xd7, 0x15, - 0x82, 0x85, 0x49, 0x6b, - 0xd4, 0x00, 0x2e, 0x04, 0xac, 0xe0, 0x42, 0xae, 0xd6, 0x63, 0x13, 0x17, - 0xb2, 0x63, 0x91, 0x94, - 0x58, 0x8f, 0x87, 0xe0, 0xfa, 0x40, 0x5f, 0x6c, 0x6c, 0x3f, 0xae, 0xe7, - 0xab, 0x07, 0x65, 0x0e, - 0xa0, 0x6c, 0xcf, 0xa3, 0xd5, 0xf5, 0x38, 0xf1, 0x6c, 0x24, 0xe3, 0xfa, - 0xd0, 0x35, 0xca, 0xc4, - 0xf9, 0x50, 0x91, 0x9f, 0xae, 0x61, 0xc9, 0xb8, 0x9e, 0xf2, 0x9c, 0xea, - 0x68, 0xce, 0x99, 0xe1, - 0x67, 0xe8, 0x1c, 0x48, 0xfb, 0x63, 0x69, 0x6d, 0x1c, 0x0d, 0x47, 0xc1, - 0x7d, 0xf7, 0x81, 0xf0, - 0xbe, 0x54, 0xeb, 0x35, 0x1d, 0x8b, 0x22, 0x8d, 0xdc, 0x57, 0x65, 0x80, - 0x2f, 0xa0, 0x9c, 0xe0, - 0xc2, 0xc1, 0x1b, 0x93, 0x01, 0x5c, 0x37, 0xd7, 0xb8, 0x21, 0xdc, 0x83, - 0xae, 0x7d, 0x05, 0x43, - 0x71, 0x7d, 0x8c, 0xb8, 0x50, 0x70, 0xa0, 0xb8, 0x60, 0xed, 0x9c, 0xe9, - 0xf9, 0x7a, 0x28, 0x89, - 0xaf, 0x13, 0xbc, 0x1c, 0xe8, 0x4b, 0x3f, 0x5f, 0xc8, 0x11, 0x4f, 0x2f, - 0x1a, 0x05, 0x4f, 0xcf, - 0xf2, 0x6c, 0x20, 0xf3, 0x79, 0x24, 0xf7, 0x73, 0x04, 0xae, 0x87, 0xfa, - 0xf8, 0xba, 0x9c, 0xc0, - 0x75, 0xeb, 0x3c, 0xbd, 0xe8, 0xd0, 0xf2, 0xf4, 0xe4, 0xb5, 0xb1, 0x1f, - 0xd7, 0xb5, 0x91, 0x7c, - 0x9d, 0x5e, 0xbf, 0x4d, 0x1f, 0x81, 0xeb, 0xdf, 0x3f, 0x2e, 0x90, 0x6b, - 0x4e, 0xb9, 0x36, 0x52, - 0xbe, 0x1e, 0xa0, 0x7c, 0xbd, 0x68, 0x90, 0x0b, 0xa5, 0xc0, 0xf5, 0xe1, - 0x7d, 0xa1, 0xe7, 0xb4, - 0x34, 0x07, 0xc2, 0x07, 0x34, 0x07, 0x46, 0xac, 0xc7, 0x59, 0xd7, 0xc6, - 0xd1, 0x8c, 0x09, 0x3f, - 0xcc, 0x8e, 0xe0, 0x93, 0xd6, 0xeb, 0xf0, 0x50, 0x9b, 0xd2, 0xb4, 0x5d, - 0x94, 0x8c, 0xf7, 0x15, - 0x7d, 0x5f, 0x63, 0x92, 0xd2, 0x76, 0x49, 0xb6, 0xc3, 0x86, 0x61, 0xa1, - 0x79, 0x5f, 0x29, 0xae, - 0xd3, 0x35, 0x2e, 0xc9, 0x0e, 0xcb, 0x39, 0x2e, 0x58, 0xe1, 0xcc, 0xaa, - 0xdd, 0x92, 0xed, 0x62, - 0x0b, 0xf7, 0xdb, 0x2e, 0x49, 0x6b, 0x54, 0x92, 0x1d, 0xd6, 0x67, 0xbb, - 0xf4, 0x9f, 0x13, 0x1f, - 0x5a, 0x5c, 0x28, 0xb2, 0xc4, 0x99, 0xed, 0xca, 0x38, 0x6e, 0x08, 0xae, - 0xa7, 0xb0, 0xc3, 0xe8, - 0x39, 0x0b, 0x87, 0xe3, 0xfa, 0x88, 0x73, 0x5a, 0xc4, 0x05, 0x9d, 0xcc, - 0x01, 0x65, 0x8c, 0xb8, - 0x30, 0x82, 0xa7, 0x93, 0x67, 0x23, 0x38, 0xe2, 0x79, 0x44, 0x54, 0x2f, - 0x4a, 0xe8, 0x30, 0x19, - 0x70, 0x5d, 0x18, 0xc6, 0xd7, 0x0f, 0xd5, 0x1c, 0x18, 0xed, 0xbc, 0x23, - 0x63, 0x51, 0xa0, 0x11, - 0xbb, 0x31, 0x9c, 0xb8, 0x0f, 0x43, 0x38, 0xae, 0x61, 0xf2, 0xf5, 0x84, - 0xed, 0x21, 0xe4, 0xe5, - 0x72, 0x6d, 0x24, 0xf3, 0xce, 0xc2, 0x1c, 0x48, 0xf0, 0xf4, 0xec, 0x6b, - 0x63, 0x8e, 0xc6, 0x24, - 0xd9, 0x0e, 0x1b, 0x8e, 0x85, 0x89, 0xb1, 0x18, 0x61, 0x87, 0x7d, 0x2f, - 0x63, 0x62, 0xb3, 0x32, - 0x26, 0x81, 0x42, 0x13, 0x17, 0x32, 0xea, 0x6b, 0xf4, 0x39, 0xfe, 0xbe, - 0x70, 0x61, 0x34, 0x76, - 0x44, 0x06, 0x7d, 0xad, 0xcf, 0x76, 0x61, 0x87, 0xe3, 0x7a, 0x6a, 0x5c, - 0xc8, 0xce, 0xd3, 0x0f, - 0x00, 0x17, 0x70, 0xaa, 0xb5, 0x71, 0xe4, 0x7a, 0x3c, 0xcc, 0x0e, 0x8b, - 0x24, 0xf5, 0x25, 0x8d, - 0xbe, 0xf6, 0xbd, 0xe0, 0x82, 0xb5, 0xb5, 0xd1, 0xc4, 0x75, 0x93, 0xff, - 0x65, 0xd2, 0xd7, 0x28, - 0xae, 0x7f, 0x1f, 0x73, 0xc0, 0xa2, 0xb6, 0x9d, 0xd7, 0x67, 0xbf, 0x53, - 0x7d, 0x2d, 0x2d, 0xae, - 0x93, 0xbe, 0x98, 0x58, 0x14, 0x48, 0xa3, 0xc3, 0x0c, 0xda, 0xef, 0x07, - 0x67, 0x0e, 0x64, 0xc5, - 0xbf, 0xbc, 0x5c, 0xea, 0xfd, 0x83, 0xb6, 0x4b, 0x26, 0x3b, 0x8c, 0xe0, - 0x87, 0x45, 0x4d, 0x23, - 0xf7, 0x63, 0x32, 0x0a, 0xbd, 0x3f, 0xbd, 0xbe, 0x66, 0xa3, 0xb6, 0x0b, - 0x3b, 0xcc, 0x76, 0x39, - 0x40, 0x5d, 0xaf, 0x20, 0x47, 0xb6, 0x4b, 0x9a, 0x39, 0x2a, 0x0c, 0xe3, - 0xeb, 0x91, 0xd4, 0xb8, - 0x3e, 0x8c, 0xaf, 0x5b, 0xc7, 0x85, 0x88, 0x45, 0x5c, 0xc8, 0x85, 0xde, - 0x4f, 0x71, 0x5d, 0x26, - 0xf7, 0x89, 0x5e, 0x7b, 0x78, 0x24, 0xae, 0x27, 0xf8, 0x7a, 0xc2, 0x6f, - 0x62, 0x49, 0xef, 0xef, - 0xd3, 0xf5, 0x0a, 0x72, 0xc5, 0xd3, 0xad, 0x68, 0xdb, 0xe4, 0x3b, 0x12, - 0x58, 0x44, 0xae, 0x33, - 0x95, 0xbe, 0xd6, 0xcf, 0xd7, 0xc9, 0xda, 0x45, 0xe7, 0x40, 0x26, 0x7d, - 0x6d, 0xb4, 0x3c, 0xfd, - 0x20, 0xfa, 0xbc, 0x12, 0x9a, 0x92, 0x52, 0x08, 0x8a, 0xb2, 0xe1, 0xfa, - 0xb0, 0xbe, 0xe4, 0x74, - 0x0e, 0xf4, 0xd9, 0xaa, 0xf9, 0xbc, 0x05, 0xfc, 0x1b, 0xcd, 0x98, 0x58, - 0xd5, 0xfb, 0x13, 0x76, - 0xc4, 0x50, 0x7d, 0x2d, 0x79, 0x2c, 0x82, 0x43, 0x6c, 0x97, 0xb4, 0xf7, - 0x35, 0x2f, 0xa7, 0x9a, - 0x86, 0xb5, 0x31, 0x49, 0xc3, 0x17, 0xac, 0xeb, 0x6b, 0x63, 0xb6, 0x5d, - 0x2c, 0xe2, 0x82, 0x25, - 0x8e, 0x92, 0xd1, 0x0f, 0x68, 0xfa, 0x4d, 0x0a, 0x74, 0x82, 0x0b, 0xe4, - 0xda, 0x53, 0xda, 0x61, - 0x03, 0x7c, 0x3d, 0xc7, 0xb8, 0x30, 0x0a, 0xfb, 0x3d, 0xfb, 0xda, 0x58, - 0x90, 0xd0, 0xfb, 0x85, - 0x74, 0x3a, 0x4c, 0xc2, 0x0e, 0x33, 0x9f, 0x0d, 0xca, 0x51, 0xd2, 0xe9, - 0x6b, 0x07, 0x69, 0x0e, - 0x8c, 0x89, 0xa3, 0x24, 0xeb, 0x6b, 0xc9, 0x7e, 0x93, 0xc8, 0x70, 0x7d, - 0x6d, 0xe4, 0x9c, 0x19, - 0x15, 0x2e, 0x58, 0xe1, 0xe9, 0x07, 0xec, 0xf3, 0x1a, 0xe4, 0xeb, 0x03, - 0xcf, 0x58, 0x32, 0x5f, - 0xa7, 0x6b, 0x54, 0x12, 0x5f, 0x37, 0xe7, 0x80, 0x9e, 0xcb, 0x39, 0x90, - 0x7d, 0xde, 0x8d, 0x06, - 0x2b, 0x2d, 0xeb, 0xfd, 0xa9, 0x74, 0x3d, 0xbe, 0x6f, 0x2c, 0x32, 0xf9, - 0x4d, 0x52, 0xd8, 0x61, - 0x96, 0x6d, 0x97, 0x43, 0xeb, 0x07, 0x34, 0xfb, 0x42, 0xfb, 0x41, 0xef, - 0x63, 0xf2, 0x7a, 0xdd, - 0xb7, 0xc6, 0x0d, 0xfa, 0x4d, 0x24, 0x6b, 0x1a, 0x5b, 0x9e, 0x36, 0x0a, - 0x5c, 0xc8, 0x91, 0xde, - 0x3f, 0x60, 0xbb, 0x64, 0xc6, 0x75, 0xae, 0x9f, 0xa3, 0x64, 0xfc, 0xbe, - 0x83, 0x8d, 0x0b, 0xd6, - 0xf4, 0xfe, 0x41, 0x7f, 0x78, 0xaa, 0x98, 0xad, 0x74, 0xfa, 0xda, 0x68, - 0xec, 0x77, 0xc5, 0xa2, - 0xfd, 0x1e, 0xcc, 0x81, 0xb6, 0xdd, 0x8f, 0xeb, 0x46, 0x0a, 0xdf, 0xbe, - 0x31, 0xd2, 0x1f, 0x6e, - 0x49, 0xef, 0xcf, 0x71, 0x6c, 0xda, 0x68, 0x34, 0xac, 0x21, 0x7e, 0x93, - 0x54, 0xfe, 0xf0, 0x41, - 0x9e, 0x8e, 0xb2, 0xfa, 0x60, 0x73, 0x64, 0xbf, 0x27, 0x3e, 0x6b, 0x07, - 0xee, 0x26, 0x57, 0x4d, - 0x36, 0xfc, 0x2b, 0x08, 0x3a, 0x7d, 0x55, 0x51, 0x9b, 0x27, 0x9b, 0x1d, - 0x51, 0xde, 0x58, 0x55, - 0x57, 0x2a, 0x8f, 0x4b, 0x3b, 0x76, 0x79, 0x42, 0x01, 0x2c, 0xd2, 0x4b, - 0x99, 0xaa, 0x66, 0x57, - 0x8d, 0xb3, 0xa9, 0xaa, 0xb6, 0xaa, 0xb5, 0xaa, 0xa6, 0xaa, 0xa5, 0xaa, - 0x86, 0x5e, 0x83, 0x33, - 0x5e, 0x5e, 0x5f, 0x1a, 0x2c, 0xf6, 0xd9, 0xe4, 0x42, 0x96, 0x3e, 0xa7, - 0x85, 0x21, 0x97, 0xb7, - 0x2a, 0x5c, 0xe8, 0xcd, 0x86, 0xdf, 0x15, 0xe4, 0x7b, 0x1c, 0x81, 0x71, - 0x99, 0xef, 0x97, 0x5c, - 0xc2, 0x56, 0x35, 0x56, 0xd4, 0x66, 0x1b, 0x93, 0xa2, 0x30, 0x39, 0x67, - 0x28, 0xcb, 0x39, 0x49, - 0x3f, 0x2b, 0xc9, 0x39, 0x8b, 0xe5, 0x7c, 0xae, 0x50, 0xb6, 0xb3, 0x8e, - 0x50, 0x99, 0xb7, 0xb2, - 0xd1, 0x9d, 0xe8, 0x0b, 0x69, 0x6e, 0xda, 0xb7, 0x86, 0x8a, 0xba, 0xb2, - 0x70, 0xa9, 0xb7, 0xaa, - 0xa1, 0xac, 0x8e, 0x3c, 0xa7, 0x20, 0xd3, 0x79, 0x6d, 0x11, 0xb7, 0xc7, - 0x15, 0xcc, 0xf7, 0x65, - 0x7e, 0x76, 0x0b, 0xa0, 0xb3, 0xb9, 0xaa, 0xd6, 0x2e, 0x65, 0x9e, 0x57, - 0x79, 0x6a, 0xb9, 0xbf, - 0xaa, 0xa1, 0xb4, 0x3e, 0xdb, 0x7d, 0x2f, 0x8e, 0xba, 0x3d, 0x95, 0x7a, - 0x1e, 0x93, 0x8c, 0x01, - 0x05, 0xb2, 0x8d, 0x73, 0x04, 0x4b, 0x7d, 0xe5, 0x0d, 0xae, 0xba, 0xfe, - 0xbe, 0xd0, 0x7b, 0xe3, - 0x6a, 0xa8, 0xac, 0x2d, 0x0f, 0x97, 0x78, 0x8b, 0x55, 0x82, 0x21, 0x22, - 0xc1, 0xf6, 0xe1, 0xb6, - 0x8b, 0x56, 0xc1, 0x54, 0xc5, 0x1d, 0xd9, 0xce, 0x89, 0x4a, 0x62, 0x55, - 0xf5, 0x15, 0xda, 0xb8, - 0xcc, 0xeb, 0x81, 0x58, 0x04, 0x5d, 0xcd, 0x55, 0x35, 0x85, 0x42, 0xe6, - 0x67, 0x3c, 0xdf, 0xa8, - 0x64, 0xaa, 0x62, 0xc5, 0x9e, 0x74, 0xf7, 0xa7, 0x20, 0x50, 0xc4, 0x15, - 0x1b, 0x25, 0x0c, 0x7d, - 0x36, 0xdc, 0x2d, 0x7d, 0x7d, 0x69, 0x76, 0xd7, 0xb8, 0x1a, 0x9d, 0xb5, - 0xe5, 0x91, 0x52, 0x8f, - 0x43, 0xb5, 0xf9, 0x0b, 0x25, 0xb3, 0x2f, 0x70, 0x9c, 0x64, 0x1b, 0xc5, - 0x1c, 0xb0, 0x5b, 0x9b, - 0x03, 0x4a, 0x96, 0xe7, 0x31, 0x50, 0x4c, 0xce, 0xe9, 0xac, 0xcd, 0xcb, - 0x7a, 0x4e, 0x97, 0x8f, - 0xf6, 0xd3, 0xa6, 0x3b, 0xfc, 0x65, 0xd1, 0xca, 0xfa, 0x81, 0xbe, 0xb4, - 0x90, 0xbe, 0x90, 0xbf, - 0xaf, 0x88, 0x96, 0xd5, 0x3b, 0x34, 0x1b, 0x53, 0xd6, 0x50, 0x55, 0x57, - 0x22, 0x8f, 0x63, 0x73, - 0x36, 0x07, 0x2c, 0xcc, 0x3b, 0x73, 0x0e, 0x64, 0xc1, 0xf9, 0x3c, 0xa5, - 0x94, 0x9c, 0xb3, 0xbc, - 0x6e, 0xe0, 0x77, 0xb1, 0x00, 0xd8, 0xb4, 0x62, 0x7f, 0x69, 0xa4, 0xdc, - 0x4b, 0xef, 0xf3, 0x60, - 0x5f, 0xdc, 0x35, 0xee, 0x86, 0xf2, 0xba, 0x12, 0xa3, 0x98, 0x29, 0x0a, - 0x10, 0x3c, 0x4c, 0xe5, - 0xd3, 0xb2, 0x3c, 0x07, 0xca, 0xfc, 0x65, 0xe1, 0x42, 0xc6, 0x8a, 0xef, - 0x77, 0x5c, 0xc0, 0x71, - 0xc8, 0xc7, 0x84, 0xdc, 0x07, 0x8e, 0xe2, 0x42, 0x9e, 0x58, 0x48, 0xc6, - 0xc2, 0xe1, 0x2f, 0x8d, - 0x56, 0x78, 0x92, 0xc7, 0x82, 0x3e, 0x8b, 0x95, 0xb1, 0xf2, 0x7a, 0x47, - 0xd4, 0x55, 0xef, 0x0c, - 0x15, 0xf9, 0xf2, 0xf9, 0x0c, 0xfc, 0xa3, 0x6f, 0x4c, 0x6c, 0xd6, 0x70, - 0xa1, 0x2e, 0x2b, 0x2e, - 0x10, 0x2c, 0x72, 0x1a, 0x79, 0x99, 0xc7, 0x4e, 0x28, 0x34, 0xe7, 0x68, - 0x51, 0x92, 0x8d, 0x66, - 0xe2, 0xba, 0x5a, 0xcc, 0x96, 0x84, 0xcb, 0xbd, 0xc9, 0xb8, 0x4e, 0x71, - 0xbe, 0x32, 0x81, 0xeb, - 0x8c, 0x2d, 0x90, 0xc0, 0xf5, 0x61, 0x7d, 0x41, 0x8e, 0x5c, 0xe2, 0x82, - 0x9e, 0x09, 0x17, 0x06, - 0xcf, 0x59, 0xda, 0x50, 0x55, 0x5f, 0xae, 0xa6, 0x99, 0x2f, 0x7c, 0x3e, - 0x2c, 0x54, 0x28, 0xae, - 0x97, 0x7b, 0xdd, 0xe4, 0x7e, 0x8c, 0xc0, 0xf5, 0x90, 0x23, 0xb1, 0x46, - 0xf5, 0xe1, 0x7a, 0xfe, - 0x68, 0xd6, 0x46, 0x25, 0xcb, 0x1c, 0x95, 0xac, 0xe1, 0x82, 0xb9, 0x36, - 0x46, 0x8a, 0xb2, 0xf6, - 0xd3, 0x3c, 0xa7, 0x6e, 0x63, 0x28, 0xae, 0x57, 0x24, 0xe1, 0xba, 0xdb, - 0xc4, 0xc2, 0x04, 0xae, - 0xdb, 0xc9, 0x7c, 0xa4, 0x73, 0x80, 0xe0, 0x1f, 0xcc, 0xe1, 0x1c, 0xc8, - 0x8c, 0x7f, 0xc3, 0x70, - 0x21, 0xd3, 0xda, 0xe8, 0x1e, 0x58, 0x1b, 0x07, 0x71, 0xbd, 0x3c, 0xee, - 0xac, 0xaf, 0x4a, 0xc6, - 0x75, 0xf2, 0x6c, 0x54, 0x10, 0x5c, 0x2f, 0xd6, 0x92, 0x70, 0x3d, 0x05, - 0x2e, 0x58, 0x99, 0x03, - 0xf6, 0xd1, 0xcd, 0x81, 0xcc, 0xf3, 0x4e, 0x23, 0xf3, 0x2e, 0x5e, 0x52, - 0x9f, 0xd2, 0x57, 0x40, - 0xf5, 0x7d, 0xcd, 0xc1, 0x50, 0x5c, 0xa7, 0x73, 0x38, 0x15, 0xae, 0x17, - 0x12, 0x2c, 0xcc, 0xeb, - 0xbf, 0x2f, 0xa3, 0x98, 0x03, 0x65, 0xa1, 0x02, 0x4b, 0xf8, 0x67, 0x75, - 0x4c, 0x28, 0x5f, 0x70, - 0x06, 0xf3, 0x0f, 0xd6, 0x98, 0x10, 0xae, 0x5f, 0x44, 0xf8, 0x6f, 0x09, - 0x53, 0x16, 0x4b, 0x5e, - 0xe3, 0x28, 0x2f, 0x34, 0xc7, 0xc2, 0xe3, 0x48, 0xdc, 0xd7, 0xc1, 0xb1, - 0x18, 0x13, 0x2e, 0x64, - 0xe7, 0x28, 0xa5, 0x71, 0x13, 0x17, 0xb2, 0x60, 0x11, 0xe1, 0x0b, 0xe4, - 0x99, 0x2b, 0x48, 0x7d, - 0x4e, 0x94, 0xdf, 0x8f, 0xeb, 0x31, 0xd7, 0xe0, 0x33, 0x9a, 0x84, 0xeb, - 0x25, 0xba, 0x3d, 0xb1, - 0xc6, 0xf5, 0xe1, 0x3a, 0x5d, 0xbb, 0xb3, 0xf2, 0x05, 0x8a, 0x0b, 0xcd, - 0xce, 0xda, 0x6c, 0x1c, - 0xa5, 0x90, 0x62, 0x51, 0x24, 0x0b, 0x16, 0xf1, 0x09, 0x2c, 0x2a, 0x91, - 0xb3, 0x71, 0x14, 0x07, - 0x57, 0xd5, 0x54, 0x59, 0x6b, 0x53, 0x13, 0xeb, 0xf5, 0xe0, 0x33, 0x9a, - 0xe0, 0xeb, 0x03, 0xb8, - 0x4e, 0x70, 0xc1, 0x1d, 0x2e, 0xf2, 0x66, 0xce, 0x37, 0x49, 0xe0, 0x82, - 0xc3, 0x3a, 0x2e, 0x64, - 0xec, 0xa7, 0x2d, 0x4c, 0x70, 0x21, 0x54, 0xe0, 0xcd, 0xc6, 0x99, 0xe9, - 0x39, 0x07, 0xf8, 0x82, - 0x90, 0x0f, 0x8b, 0x08, 0xae, 0x97, 0x24, 0xf3, 0xf5, 0xbe, 0xbe, 0xd0, - 0x7e, 0x96, 0x06, 0x87, - 0xe2, 0x7a, 0x2a, 0x5c, 0xb0, 0xca, 0xd3, 0x6d, 0x63, 0xc7, 0x05, 0x3c, - 0x7c, 0x6d, 0x1c, 0xc2, - 0xd3, 0x93, 0xee, 0x61, 0xa1, 0x6c, 0x63, 0x13, 0xb8, 0xee, 0x1c, 0x8a, - 0xeb, 0x7d, 0x7c, 0xdd, - 0xae, 0x0c, 0xe5, 0xeb, 0x79, 0x16, 0xe7, 0x40, 0xc9, 0x81, 0xcf, 0x81, - 0x24, 0x5d, 0xb2, 0x92, - 0xac, 0x8d, 0x59, 0xd6, 0x63, 0xf2, 0x6c, 0xd0, 0x39, 0x50, 0x1e, 0x29, - 0xf1, 0x8e, 0xc0, 0x75, - 0xba, 0x46, 0x45, 0x4a, 0x89, 0xed, 0x41, 0xe6, 0x3f, 0xb1, 0xb5, 0x2c, - 0x71, 0xe6, 0x90, 0xd3, - 0x57, 0x16, 0xcc, 0x1f, 0x72, 0xfd, 0xe9, 0xe2, 0x1c, 0xf2, 0xf5, 0x8a, - 0x43, 0x85, 0x0b, 0x83, - 0xe7, 0xcc, 0x68, 0x47, 0xd0, 0x35, 0xce, 0xc6, 0x15, 0x07, 0x4b, 0x99, - 0xca, 0x11, 0xb6, 0x4b, - 0xff, 0x58, 0x90, 0xfb, 0x3a, 0x60, 0xbb, 0xd8, 0xad, 0xd9, 0x11, 0x21, - 0x57, 0x76, 0x8e, 0x32, - 0x1a, 0x5c, 0x20, 0xd7, 0x92, 0x2d, 0xd7, 0xc8, 0xe4, 0x28, 0x84, 0x8b, - 0x51, 0x5c, 0x2f, 0x4f, - 0xc6, 0xf5, 0x3e, 0x3b, 0x8c, 0xae, 0xd7, 0x0e, 0xad, 0xc8, 0x4f, 0xcf, - 0x99, 0xdd, 0x7e, 0xcf, - 0x25, 0x2e, 0xe4, 0x0f, 0xc5, 0x85, 0xf4, 0x6b, 0x23, 0x4b, 0x79, 0xfa, - 0x08, 0x5c, 0xa7, 0x7c, - 0xbd, 0x65, 0xa8, 0xed, 0xe2, 0x22, 0xb6, 0x8b, 0x43, 0x4b, 0xe0, 0x7a, - 0x5e, 0x02, 0xd7, 0x47, - 0xe0, 0x02, 0x5d, 0xa7, 0xb2, 0xf2, 0x74, 0x6b, 0xb8, 0x80, 0x1d, 0x51, - 0x82, 0x0b, 0x5a, 0x16, - 0x8e, 0xd2, 0xb7, 0x36, 0x16, 0xa5, 0xf0, 0xa5, 0x10, 0xbe, 0x0e, 0xfa, - 0x71, 0x7d, 0x38, 0x16, - 0x9a, 0xb8, 0x4e, 0xed, 0x30, 0x79, 0xa8, 0x1d, 0x96, 0x4b, 0x5c, 0xc8, - 0xb7, 0x82, 0x0b, 0x64, - 0x2e, 0x50, 0x5c, 0x28, 0xcb, 0xc6, 0x99, 0x03, 0xc5, 0x1c, 0xbd, 0xee, - 0xd2, 0xf0, 0x48, 0x5c, - 0x4f, 0xe6, 0xeb, 0xa3, 0x59, 0x1b, 0x4b, 0xb3, 0xce, 0x81, 0x62, 0x73, - 0x6d, 0xb4, 0x34, 0x07, - 0x22, 0x45, 0xde, 0x6c, 0xe7, 0xac, 0x68, 0xec, 0xe3, 0xcc, 0xd4, 0xf6, - 0x18, 0xc0, 0xf5, 0x61, - 0x7c, 0x9d, 0x3c, 0x63, 0x94, 0xa7, 0x17, 0x2b, 0xa9, 0x75, 0x98, 0x41, - 0x9e, 0xee, 0xf6, 0x94, - 0x19, 0x79, 0x43, 0xee, 0xd3, 0x90, 0x38, 0x07, 0x9a, 0x7b, 0xd3, 0x77, - 0x5f, 0x0b, 0x72, 0x3c, - 0x26, 0xee, 0x5c, 0x8d, 0x09, 0xb9, 0xf7, 0x54, 0xbb, 0x29, 0x35, 0x88, - 0xed, 0x12, 0x2a, 0xf3, - 0xa5, 0xd4, 0xd7, 0x42, 0x0e, 0x2f, 0x9d, 0x8f, 0x14, 0x17, 0xf2, 0xb2, - 0xda, 0xef, 0x14, 0x17, - 0x0a, 0x2d, 0xe1, 0x42, 0xb1, 0x64, 0x41, 0xd3, 0x18, 0xc4, 0x85, 0x8c, - 0x76, 0x84, 0xcb, 0xc8, - 0xf3, 0x25, 0xeb, 0x6b, 0xc5, 0xc3, 0xf4, 0x35, 0xda, 0x17, 0x3a, 0x47, - 0x87, 0xe9, 0x6b, 0x30, - 0x35, 0x2e, 0x8c, 0x41, 0xd7, 0xb3, 0x68, 0xbf, 0xa7, 0xe6, 0xcc, 0xe9, - 0x74, 0xbd, 0xbc, 0x01, - 0xbe, 0x4e, 0x71, 0x7d, 0x40, 0xbb, 0x48, 0xc6, 0xf5, 0x7e, 0x7d, 0x2d, - 0xc9, 0x76, 0xa1, 0xcf, - 0x70, 0xa1, 0x15, 0x5c, 0xb0, 0x66, 0xbf, 0x67, 0xc7, 0x85, 0x7e, 0x6d, - 0x3b, 0xf3, 0x39, 0x51, - 0x11, 0xe1, 0x0b, 0xd4, 0x06, 0x1a, 0x8e, 0xeb, 0x7d, 0xb6, 0x87, 0xc9, - 0xd7, 0xa9, 0x1d, 0x66, - 0x89, 0xa7, 0xf7, 0xeb, 0x7a, 0x39, 0xc1, 0x05, 0x8b, 0xda, 0xb6, 0xb9, - 0x1e, 0x9b, 0x1a, 0xd6, - 0x10, 0x5c, 0x1f, 0xd4, 0x94, 0x12, 0x58, 0x48, 0xf1, 0xc4, 0x15, 0x75, - 0xd4, 0xa7, 0xd5, 0xd7, - 0x92, 0xe7, 0x40, 0x36, 0x0d, 0x6b, 0x34, 0x73, 0x20, 0x54, 0x60, 0x8d, - 0x33, 0x0f, 0x9b, 0x77, - 0x79, 0xfd, 0x7c, 0x3d, 0x3c, 0x72, 0x8d, 0x72, 0xc6, 0x2b, 0xea, 0xd2, - 0xf1, 0x75, 0x3a, 0x07, - 0x4a, 0xb5, 0xa1, 0xcf, 0xc6, 0x70, 0x7f, 0x98, 0x69, 0x87, 0x19, 0xf6, - 0x51, 0xd9, 0x2e, 0x96, - 0xb4, 0x4e, 0x0b, 0x63, 0x62, 0x1b, 0x83, 0x1d, 0x91, 0x4e, 0x5f, 0xa3, - 0xcf, 0x5a, 0xc2, 0x76, - 0x19, 0xf4, 0x9b, 0xa4, 0xea, 0x8b, 0x69, 0xbf, 0x1b, 0xb9, 0xc1, 0x05, - 0x53, 0xef, 0x8f, 0x1d, - 0x80, 0xde, 0x3f, 0xa0, 0xaf, 0x91, 0xf5, 0x7a, 0x88, 0xed, 0x92, 0x84, - 0xeb, 0x4a, 0x21, 0xc1, - 0xc2, 0xc1, 0xfb, 0x9a, 0x59, 0xef, 0x1f, 0xc4, 0x25, 0xaa, 0xeb, 0x65, - 0xc7, 0x05, 0xca, 0x51, - 0xb2, 0xe2, 0x82, 0x35, 0xbd, 0x9f, 0xdc, 0x17, 0xba, 0x36, 0x52, 0x5e, - 0x9e, 0x4e, 0x5f, 0x33, - 0x71, 0xbd, 0xdf, 0x76, 0xc9, 0x21, 0x5f, 0xc8, 0x95, 0xcf, 0xcb, 0x3c, - 0xa7, 0xc9, 0x99, 0xfb, - 0xf4, 0x35, 0x3d, 0xa1, 0xaf, 0x0d, 0xb7, 0x3d, 0xe8, 0x1c, 0x28, 0xd5, - 0x8b, 0x98, 0x74, 0xfa, - 0x5a, 0x2a, 0xbd, 0x3f, 0xe3, 0x1c, 0x08, 0xe5, 0xca, 0xe7, 0x55, 0x96, - 0xca, 0xe7, 0x95, 0xd0, - 0xd7, 0xf4, 0x84, 0xbe, 0x96, 0xda, 0x6f, 0x62, 0xef, 0xd3, 0xd7, 0x92, - 0xf8, 0xfa, 0x68, 0x34, - 0x2c, 0x0b, 0x73, 0x20, 0x57, 0xda, 0x36, 0xf5, 0x9b, 0xd8, 0xc3, 0x95, - 0x5e, 0x3a, 0xd7, 0x93, - 0xb5, 0xc2, 0x01, 0x4d, 0x29, 0xc9, 0x6f, 0x42, 0xe7, 0x40, 0xf1, 0x30, - 0xae, 0x36, 0x3c, 0xce, - 0xa1, 0xff, 0xef, 0x9d, 0xcd, 0xee, 0x5a, 0x57, 0xbc, 0xac, 0x2e, 0xad, - 0xbe, 0x96, 0x1b, 0xad, - 0x33, 0xc5, 0x98, 0xe4, 0x8d, 0x79, 0x4c, 0x92, 0xfd, 0x26, 0xce, 0x26, - 0x77, 0x6d, 0x36, 0x7d, - 0xad, 0x9f, 0x2f, 0x64, 0xb5, 0x5d, 0x24, 0x8b, 0x9a, 0x86, 0x45, 0x3f, - 0x60, 0x1f, 0x5f, 0x60, - 0x33, 0xc7, 0x5a, 0x39, 0x4c, 0x5c, 0x30, 0xf5, 0xb5, 0xa6, 0x34, 0xfa, - 0x1a, 0xb1, 0xc3, 0x0a, - 0x29, 0x47, 0xb1, 0x80, 0x0b, 0xd6, 0xed, 0xf7, 0x8a, 0xac, 0x58, 0x54, - 0x64, 0xc9, 0xff, 0x9e, - 0xe0, 0xe9, 0x26, 0x67, 0x4e, 0xc6, 0xf5, 0xe1, 0x7c, 0x9d, 0xf4, 0x85, - 0x9e, 0xd3, 0x9e, 0x41, - 0x5f, 0x1b, 0xd0, 0xfb, 0x2d, 0xe8, 0x7a, 0xa3, 0xc0, 0x85, 0xb1, 0xe9, - 0xfd, 0x43, 0xf4, 0x35, - 0x82, 0xeb, 0x2d, 0x49, 0x7c, 0x3d, 0x8d, 0xbe, 0x76, 0xd0, 0xe6, 0x80, - 0x15, 0x9e, 0x1e, 0x2b, - 0xae, 0xcf, 0xf4, 0x2c, 0x52, 0x4d, 0xa9, 0x9c, 0x3c, 0x8f, 0xce, 0x46, - 0x67, 0x5d, 0x0a, 0x7d, - 0x2d, 0xe1, 0x37, 0xa1, 0x7d, 0x91, 0x6c, 0x1c, 0x9d, 0x03, 0xb9, 0xf2, - 0x85, 0x5b, 0x99, 0x03, - 0x56, 0x35, 0xac, 0xfc, 0xa0, 0x93, 0xa1, 0x1a, 0x56, 0xb2, 0xdf, 0x64, - 0x24, 0xae, 0x97, 0x7a, - 0xe8, 0x1c, 0xb0, 0xcb, 0x79, 0x5c, 0x9a, 0xef, 0x33, 0x63, 0x79, 0x8b, - 0x8d, 0x52, 0x73, 0x8d, - 0x73, 0x65, 0xd3, 0xd7, 0xbe, 0x27, 0x5c, 0x48, 0xf8, 0x01, 0xb3, 0xc6, - 0x24, 0x20, 0xca, 0x5f, - 0x29, 0xe7, 0x2c, 0x4b, 0xa5, 0xaf, 0x0d, 0xf8, 0x4d, 0x0a, 0xb8, 0xd1, - 0xe8, 0x7a, 0xb9, 0xf2, - 0x85, 0x5b, 0x8e, 0xcb, 0x69, 0x48, 0xe8, 0x7a, 0xf9, 0x69, 0xfd, 0xe1, - 0xce, 0xda, 0xf2, 0x84, - 0xed, 0xe2, 0x29, 0x1c, 0xc4, 0xf5, 0xec, 0x7a, 0x7f, 0x0e, 0x70, 0x61, - 0xac, 0x7a, 0x3f, 0xb5, - 0xc3, 0x8a, 0xb2, 0xf8, 0x4d, 0x86, 0xeb, 0x6b, 0xa6, 0xae, 0x17, 0xb3, - 0xa2, 0xeb, 0x91, 0xf5, - 0xb8, 0xc5, 0x2a, 0x2e, 0xe4, 0x40, 0xef, 0x27, 0x76, 0x58, 0xa1, 0x56, - 0xe2, 0xa7, 0x73, 0x60, - 0x88, 0x1d, 0x96, 0xc2, 0x1f, 0x9e, 0xd0, 0xfb, 0x6d, 0x39, 0xc4, 0x05, - 0x0b, 0x71, 0x39, 0x21, - 0x0b, 0x1a, 0x16, 0xf9, 0x31, 0xe7, 0x80, 0x92, 0xc7, 0xa6, 0xd7, 0xd7, - 0x12, 0xb8, 0xee, 0x26, - 0xeb, 0x54, 0x61, 0x06, 0x7d, 0x6d, 0x90, 0xa7, 0xe7, 0x32, 0x36, 0x6d, - 0x2c, 0xda, 0x76, 0xbf, - 0x3f, 0xbc, 0x74, 0xa8, 0x3f, 0x9c, 0x1c, 0x4b, 0x23, 0x36, 0x26, 0x29, - 0x16, 0x17, 0x66, 0xb1, - 0x5d, 0x3c, 0x95, 0x8d, 0xae, 0xda, 0xe4, 0xb1, 0x48, 0xdc, 0x57, 0xba, - 0xc6, 0x11, 0x3b, 0x4c, - 0x29, 0x66, 0xad, 0xe0, 0xc2, 0xf7, 0x31, 0x26, 0x45, 0x61, 0xb7, 0xd7, - 0x6d, 0xda, 0x11, 0x03, - 0xfa, 0x1a, 0x33, 0x24, 0x7e, 0xcd, 0xbc, 0xaf, 0x15, 0x75, 0xa6, 0xed, - 0xa2, 0x15, 0xf9, 0x0b, - 0xb2, 0xd9, 0x2e, 0x56, 0x35, 0x0d, 0xab, 0xb8, 0x30, 0x26, 0xbd, 0x7f, - 0xa8, 0xbe, 0x36, 0x64, - 0x8d, 0x1b, 0xf0, 0x9b, 0x0c, 0xd3, 0xd7, 0xfa, 0x71, 0xc1, 0xaa, 0xae, - 0x97, 0x33, 0x3f, 0x60, - 0x51, 0xb6, 0xb5, 0xd1, 0xc4, 0xf5, 0xe2, 0x88, 0xd3, 0xb4, 0x5d, 0x86, - 0xe3, 0x7a, 0x65, 0x9f, - 0xbe, 0x66, 0xfa, 0x4d, 0x12, 0xb6, 0x4b, 0x6e, 0x71, 0x21, 0x57, 0x3e, - 0x2f, 0x72, 0x4e, 0x7a, - 0xfd, 0xf9, 0xd2, 0xa0, 0xbe, 0x96, 0x0a, 0xd7, 0x1d, 0x11, 0xa7, 0xc7, - 0x1d, 0xb1, 0x7b, 0xf2, - 0x33, 0xd5, 0x64, 0xc8, 0x79, 0xcc, 0xaa, 0x9b, 0xac, 0xc7, 0x05, 0xa3, - 0x8f, 0x4d, 0x4b, 0xe3, - 0x0f, 0x37, 0xed, 0xc2, 0x14, 0x71, 0x4e, 0x63, 0xd6, 0xb0, 0xac, 0xc4, - 0xa6, 0x59, 0xd2, 0xb6, - 0xab, 0xd2, 0x6b, 0xdb, 0xfd, 0x7e, 0x93, 0x50, 0x99, 0xcf, 0x4d, 0x9e, - 0xb1, 0xb2, 0xb8, 0xdd, - 0x97, 0x9c, 0x63, 0x91, 0x69, 0x4c, 0x28, 0x5f, 0x18, 0xaa, 0xaf, 0xb9, - 0x47, 0xc4, 0x25, 0x53, - 0x2c, 0xca, 0xa4, 0xaf, 0xe5, 0x1c, 0x17, 0xc6, 0x1a, 0xc7, 0x3b, 0x30, - 0x16, 0xa6, 0x1d, 0x96, - 0xd6, 0x6f, 0x62, 0xef, 0xd3, 0xd7, 0x92, 0xd7, 0x38, 0xcb, 0xb8, 0x10, - 0xb3, 0x86, 0x0b, 0x2e, - 0x6b, 0x7a, 0x3f, 0x93, 0xd1, 0x0f, 0xd8, 0xe7, 0x37, 0xa1, 0x73, 0xd4, - 0x39, 0x6c, 0x8d, 0x1a, - 0xa2, 0xaf, 0x99, 0xb6, 0x8b, 0x9d, 0xa3, 0x7d, 0xcc, 0x66, 0xd7, 0x16, - 0x8c, 0x2e, 0x5e, 0xcf, - 0x82, 0xde, 0x9f, 0xdd, 0xe7, 0x95, 0x4f, 0xe3, 0x78, 0x09, 0x47, 0x19, - 0xc0, 0xf5, 0x11, 0xfa, - 0x5a, 0x02, 0xd7, 0x13, 0x1c, 0x25, 0x9f, 0xcd, 0xcb, 0x14, 0x8b, 0x37, - 0x9a, 0xb5, 0x31, 0x97, - 0x71, 0xbc, 0x43, 0xd7, 0x46, 0x53, 0x5f, 0xa3, 0x7c, 0x7d, 0xa8, 0x1d, - 0x46, 0xda, 0x30, 0xbf, - 0xc9, 0x08, 0x7f, 0x78, 0xae, 0x63, 0x56, 0x73, 0xa0, 0x6d, 0x9b, 0x71, - 0xc9, 0x14, 0xd7, 0x63, - 0x4e, 0x4f, 0x55, 0xcb, 0x50, 0xbf, 0x49, 0x2a, 0x7f, 0xb8, 0xc5, 0x39, - 0x90, 0xeb, 0x98, 0xd5, - 0xec, 0x3e, 0x2f, 0x31, 0xa1, 0x6d, 0x17, 0x99, 0x75, 0xfa, 0x06, 0xf3, - 0x4d, 0x46, 0x33, 0x26, - 0x03, 0xfa, 0x5a, 0x24, 0xd9, 0x0e, 0xab, 0x4a, 0xd2, 0x1a, 0x47, 0xe8, - 0x6b, 0xa3, 0x8a, 0xef, - 0x77, 0x1f, 0x70, 0x7c, 0xff, 0xd0, 0x38, 0xde, 0x4c, 0x63, 0x92, 0xc8, - 0x37, 0xa1, 0xb6, 0x0b, - 0xcd, 0x37, 0x71, 0xa7, 0xb2, 0xc3, 0x7c, 0xfd, 0x71, 0xc9, 0x96, 0x7c, - 0xe1, 0x39, 0x8e, 0xef, - 0xb7, 0xe6, 0x0b, 0x4f, 0xc4, 0xf1, 0x52, 0x5c, 0x48, 0xab, 0xaf, 0xf5, - 0xf1, 0x75, 0x8a, 0x0b, - 0x05, 0x59, 0xf2, 0x4d, 0x72, 0x1a, 0xcb, 0x3e, 0x56, 0xbd, 0x3f, 0x29, - 0xdf, 0xa4, 0x62, 0x44, - 0xbe, 0x49, 0x45, 0x5d, 0xc6, 0x7c, 0x93, 0xd4, 0x7a, 0xff, 0x41, 0xc1, - 0x85, 0xa1, 0x39, 0x2e, - 0xe9, 0x74, 0xbd, 0x41, 0x3b, 0x8c, 0xfa, 0x65, 0xb2, 0xe6, 0x9b, 0xf4, - 0xe1, 0x42, 0x81, 0x35, - 0x5c, 0xb0, 0x1a, 0x9b, 0x66, 0xc1, 0xe7, 0x65, 0x25, 0x2e, 0xc7, 0x69, - 0x72, 0x80, 0x6c, 0xf9, - 0x26, 0x74, 0xde, 0x95, 0x66, 0x8f, 0xcb, 0x31, 0xe7, 0x40, 0x7e, 0x2e, - 0x62, 0xd9, 0xad, 0x6b, - 0xdb, 0xfd, 0xb6, 0xea, 0x60, 0x1e, 0xa1, 0x5c, 0x00, 0xc6, 0x38, 0x26, - 0x64, 0x8d, 0x2b, 0xa2, - 0xb6, 0x8b, 0xa7, 0xaa, 0xd9, 0x39, 0xf4, 0xbe, 0x0e, 0x8f, 0x4b, 0x26, - 0xf8, 0x61, 0x6a, 0x1a, - 0xb2, 0x85, 0x38, 0x5e, 0xcb, 0xb8, 0x90, 0xab, 0x78, 0xbd, 0x62, 0x60, - 0xc6, 0xf7, 0x4b, 0x85, - 0x5c, 0xe6, 0x7c, 0x13, 0xa7, 0xc7, 0x15, 0xb6, 0x79, 0xf3, 0xf8, 0xcc, - 0xb6, 0xcb, 0x28, 0x71, - 0x21, 0x27, 0x71, 0xbc, 0xc3, 0xf5, 0xfe, 0x3e, 0x7d, 0x8d, 0x1d, 0xee, - 0x37, 0x19, 0x92, 0x6f, - 0x22, 0xa7, 0x8e, 0x73, 0xb0, 0x8f, 0x02, 0x17, 0x6c, 0x87, 0xc2, 0xe7, - 0x95, 0xe4, 0x37, 0x71, - 0xf7, 0xdf, 0x97, 0x0c, 0xf9, 0x26, 0x79, 0x56, 0xf9, 0x42, 0x2e, 0xe3, - 0x78, 0x2d, 0x69, 0xdb, - 0xe3, 0xb0, 0x19, 0xaf, 0x67, 0xd8, 0x7c, 0x99, 0xf4, 0x35, 0xbb, 0x6a, - 0xf7, 0xbb, 0xc9, 0x1c, - 0xcd, 0x76, 0xce, 0xc2, 0x60, 0x2e, 0xe7, 0x80, 0xb5, 0x98, 0xd5, 0xa1, - 0x3e, 0x2f, 0x0b, 0xf9, - 0x26, 0x6a, 0x9f, 0xdf, 0x24, 0x95, 0xa6, 0x94, 0xe3, 0x98, 0x55, 0xeb, - 0x3e, 0xaf, 0xec, 0x1a, - 0xd6, 0x68, 0xc6, 0xc4, 0xcc, 0x41, 0x24, 0xf8, 0x6c, 0xc6, 0x25, 0x1b, - 0x7d, 0xfa, 0xda, 0x70, - 0xbf, 0x09, 0xb9, 0xaf, 0x66, 0x1c, 0xaf, 0x4c, 0x6c, 0x17, 0x9c, 0xc9, - 0x76, 0x29, 0x1d, 0xd0, - 0xfb, 0x73, 0x1e, 0xdf, 0x6f, 0x5d, 0xef, 0x4f, 0x9b, 0x6f, 0x42, 0x6d, - 0x97, 0xf2, 0x41, 0x7d, - 0x6d, 0xa4, 0x3f, 0xbc, 0x3f, 0x8e, 0x57, 0x3c, 0x94, 0x71, 0xbc, 0x19, - 0x39, 0x4a, 0x52, 0xbe, - 0x89, 0x73, 0x58, 0xbe, 0x89, 0xb3, 0x36, 0xd9, 0x1f, 0xde, 0x6f, 0x87, - 0xe5, 0x3e, 0x8e, 0xd7, - 0x9e, 0x9b, 0x38, 0xde, 0x3e, 0x5d, 0xcf, 0xae, 0x65, 0xf0, 0x9b, 0x50, - 0x3b, 0x2c, 0x54, 0xe9, - 0xa3, 0x1a, 0xdb, 0xb8, 0x2c, 0xfb, 0x9b, 0x58, 0x8b, 0x59, 0x75, 0xe4, - 0x30, 0x8e, 0x77, 0x98, - 0xae, 0x97, 0x36, 0xdf, 0x84, 0xc6, 0x6c, 0x39, 0x6b, 0x33, 0xe9, 0x6b, - 0x07, 0x39, 0x96, 0x7d, - 0xf4, 0xda, 0x36, 0x79, 0x76, 0x86, 0xe4, 0x9b, 0xb4, 0x58, 0xc8, 0x37, - 0xb1, 0x18, 0xb3, 0xea, - 0x88, 0xba, 0xeb, 0x73, 0x1a, 0xb3, 0x9a, 0x5d, 0xc3, 0x3a, 0x30, 0xbd, - 0x3f, 0x49, 0x6b, 0x1c, - 0xf0, 0x9b, 0xd0, 0xfb, 0x4a, 0x1a, 0x8d, 0x4b, 0x1c, 0xf0, 0x9b, 0x0c, - 0xd3, 0xd7, 0x46, 0x85, - 0x0b, 0xb1, 0x43, 0x34, 0x26, 0x49, 0x71, 0xc9, 0x15, 0x56, 0xf2, 0x4d, - 0xb2, 0xeb, 0xfd, 0xa3, - 0x8a, 0xef, 0x1f, 0x55, 0x1c, 0xaf, 0x95, 0x98, 0x84, 0xb8, 0xa3, 0x3e, - 0x5b, 0xbe, 0x49, 0x69, - 0x82, 0xa7, 0xb3, 0xd9, 0x70, 0xc1, 0xd4, 0xf5, 0xc6, 0x60, 0xbf, 0x9f, - 0x28, 0x9c, 0x86, 0x8e, - 0x17, 0x8e, 0x83, 0xc7, 0xf1, 0xb4, 0x1d, 0x0f, 0x4f, 0x10, 0x16, 0xc1, - 0x93, 0x8d, 0xd3, 0x99, - 0x33, 0x84, 0x13, 0xc1, 0xf1, 0xfc, 0x09, 0x60, 0x11, 0x7f, 0x02, 0x3c, - 0x0e, 0x2f, 0x82, 0x0b, - 0xf8, 0xc3, 0xe1, 0x31, 0xc2, 0x04, 0x34, 0x5e, 0xa8, 0x42, 0xd5, 0xfc, - 0x78, 0x34, 0x5e, 0x9a, - 0x02, 0x66, 0x86, 0xa7, 0x7b, 0xab, 0xf8, 0x89, 0x68, 0x12, 0xef, 0x42, - 0xd5, 0xd2, 0x78, 0x30, - 0x41, 0x9d, 0xc8, 0x4e, 0x36, 0xa6, 0x32, 0xd3, 0xc8, 0xfb, 0xd3, 0x23, - 0x73, 0xbc, 0xc9, 0xb9, - 0xf2, 0x29, 0xe3, 0xd7, 0x46, 0x19, 0xc7, 0x7b, 0xa8, 0x7c, 0x5e, 0xc9, - 0x71, 0xc9, 0x29, 0x75, - 0x98, 0x14, 0xf9, 0x26, 0xdf, 0x03, 0x2e, 0x24, 0x34, 0xac, 0x6c, 0x6b, - 0x63, 0xc0, 0xce, 0x51, - 0x6d, 0xbb, 0x34, 0x5c, 0xe6, 0x49, 0x95, 0x6f, 0xd2, 0x1f, 0x97, 0x5c, - 0x60, 0x29, 0x96, 0xfd, - 0x20, 0xcc, 0x81, 0x68, 0x76, 0x5f, 0x78, 0xae, 0xf4, 0xfe, 0x64, 0xbf, - 0x89, 0x7b, 0x98, 0x6e, - 0x3a, 0xbc, 0x9e, 0x8b, 0xc9, 0x55, 0x4c, 0xbd, 0xdf, 0x9e, 0xa3, 0x31, - 0xb1, 0xe5, 0x72, 0x4c, - 0x4c, 0xbe, 0x50, 0x66, 0xd8, 0x7d, 0x19, 0xfd, 0x26, 0x7d, 0xb6, 0x4b, - 0x3e, 0x9f, 0x23, 0xbe, - 0xd0, 0x98, 0xeb, 0xda, 0x35, 0x7d, 0x7c, 0x21, 0x4b, 0xbe, 0x49, 0x45, - 0xb8, 0xc4, 0x93, 0x29, - 0xdf, 0x64, 0xdc, 0x98, 0x63, 0xd9, 0x8f, 0x40, 0xff, 0x0d, 0x3f, 0x43, - 0x7f, 0x81, 0xdf, 0xa0, - 0x6f, 0xd9, 0x7f, 0x81, 0xff, 0x62, 0xff, 0x0e, 0xfe, 0xc1, 0x7e, 0x0d, - 0x3e, 0x41, 0x1f, 0xc3, - 0x4f, 0xe0, 0xef, 0xd1, 0xdf, 0xb8, 0xbf, 0x83, 0x7f, 0xb1, 0xdf, 0xc2, - 0x7f, 0x72, 0xff, 0x02, - 0x5f, 0xa0, 0xfd, 0xe8, 0x97, 0xe0, 0x03, 0xfc, 0x09, 0xf9, 0xf9, 0x18, - 0x7d, 0x8c, 0xdf, 0xe7, - 0x3e, 0x40, 0x1f, 0xc1, 0xfd, 0x68, 0x3f, 0x69, 0x7b, 0x85, 0x7d, 0xe8, - 0x03, 0xfc, 0x5b, 0xf8, - 0x1b, 0xfe, 0x4d, 0xb8, 0x57, 0x7c, 0x1d, 0xef, 0x11, 0xf6, 0xe1, 0xd7, - 0x85, 0x4f, 0xf0, 0x8f, - 0xc3, 0x4e, 0xef, 0xf0, 0x7c, 0x93, 0xf2, 0x54, 0xf9, 0x26, 0x56, 0x71, - 0xe1, 0x40, 0x63, 0xd9, - 0x47, 0xaf, 0xf7, 0xa3, 0xc2, 0x20, 0xc1, 0x05, 0x32, 0xb6, 0xa5, 0x69, - 0xf4, 0xb5, 0x7e, 0xbf, - 0x09, 0xb5, 0xdf, 0xad, 0xc5, 0xb2, 0xbb, 0x2d, 0xc6, 0xb2, 0xe7, 0xaa, - 0x46, 0x45, 0x22, 0x5e, - 0x2f, 0x11, 0x4b, 0x97, 0x29, 0xdf, 0xc4, 0x59, 0xe7, 0x8e, 0x95, 0x64, - 0xce, 0x37, 0x19, 0x95, - 0xae, 0x97, 0xa3, 0x3a, 0x2d, 0x07, 0xcd, 0x0f, 0xe8, 0xac, 0xa5, 0x71, - 0x89, 0x43, 0xfd, 0x26, - 0xee, 0xa1, 0x7e, 0x93, 0x90, 0xd3, 0xe7, 0x0e, 0xdb, 0xb2, 0xda, 0x2e, - 0x14, 0x17, 0xb2, 0x8e, - 0x89, 0x3c, 0x90, 0xf7, 0x93, 0xf3, 0xda, 0x35, 0x16, 0xf2, 0x4d, 0xd2, - 0xd5, 0x73, 0x49, 0xd2, - 0xfb, 0x0b, 0x72, 0x59, 0xd3, 0x6a, 0xec, 0x7e, 0x40, 0x2b, 0xf9, 0x26, - 0xf2, 0xd0, 0x7c, 0x93, - 0xcc, 0x7a, 0x7f, 0xfa, 0xf8, 0xfe, 0x3c, 0xfe, 0x51, 0xf4, 0x21, 0xfc, - 0x1c, 0x3e, 0x1b, 0x68, - 0x03, 0xed, 0x72, 0x37, 0x68, 0x95, 0x5b, 0x61, 0xab, 0xd2, 0x0d, 0x5e, - 0x00, 0x3b, 0xd1, 0x27, - 0x70, 0x3f, 0xbf, 0x59, 0xeb, 0x82, 0x1b, 0xd5, 0x6d, 0x70, 0xab, 0xda, - 0x03, 0x9e, 0x40, 0xef, - 0x08, 0x7f, 0x06, 0x9f, 0xe0, 0x57, 0xc4, 0x17, 0xf1, 0xcb, 0xc2, 0x0b, - 0xf8, 0x17, 0xfc, 0x0b, - 0xf8, 0x79, 0x61, 0x27, 0xbf, 0x1f, 0xee, 0xe1, 0x5f, 0xc5, 0x9f, 0x08, - 0xbf, 0x44, 0x5b, 0xe0, - 0x13, 0xf0, 0x73, 0xf4, 0x1e, 0xff, 0x12, 0x7e, 0x87, 0x7f, 0x13, 0xef, - 0xe2, 0xdf, 0xc5, 0x1f, - 0x0b, 0x25, 0xa6, 0x2d, 0x4d, 0xe3, 0x5c, 0xd3, 0xd6, 0x73, 0xa1, 0xb8, - 0x1e, 0xb0, 0x99, 0xbe, - 0xf0, 0x43, 0x1a, 0xc7, 0x1b, 0xb0, 0x56, 0xa3, 0x22, 0xe1, 0x67, 0x2b, - 0xf4, 0x66, 0xd4, 0xd7, - 0x48, 0x5f, 0xa8, 0x3d, 0x52, 0x66, 0x64, 0xce, 0x37, 0xc9, 0x75, 0xcc, - 0xea, 0x01, 0xd4, 0xa8, - 0x48, 0x9f, 0x6f, 0xd2, 0x98, 0xa6, 0x9e, 0xcb, 0x41, 0x88, 0x65, 0x37, - 0xeb, 0x37, 0x65, 0xab, - 0xd3, 0x32, 0xaa, 0xf8, 0xfe, 0x51, 0x8f, 0xc9, 0x80, 0xdf, 0x64, 0x84, - 0xbe, 0x46, 0xe3, 0x0a, - 0x09, 0xf7, 0x77, 0x67, 0xcd, 0x37, 0xc9, 0x71, 0x7c, 0xbf, 0x89, 0x0b, - 0xf9, 0x63, 0xd5, 0xfb, - 0xd1, 0x18, 0xf2, 0x4d, 0x2c, 0xc6, 0xf1, 0x1e, 0xfa, 0xda, 0x35, 0x79, - 0x34, 0x47, 0x9b, 0xda, - 0x2e, 0x91, 0x72, 0x4f, 0xa6, 0x7c, 0x93, 0x82, 0x60, 0xe5, 0x98, 0x70, - 0xe1, 0x3c, 0xf8, 0x2f, - 0xf8, 0x8e, 0xb6, 0x9e, 0x9b, 0xde, 0x69, 0x63, 0x1d, 0x3d, 0xa5, 0x4c, - 0x79, 0x4f, 0x39, 0x63, - 0xeb, 0x72, 0x32, 0x4f, 0x82, 0xaf, 0xb8, 0xfb, 0x23, 0x27, 0x82, 0xca, - 0x2e, 0x97, 0xdf, 0xdd, - 0xe9, 0x64, 0xaa, 0xda, 0x8a, 0xfc, 0x40, 0xf8, 0x6f, 0xdc, 0x1c, 0x3f, - 0x87, 0x9d, 0xdf, 0x31, - 0x97, 0x9d, 0xd7, 0xb1, 0x80, 0x5d, 0xd0, 0x3e, 0xcb, 0x3f, 0x2d, 0x7a, - 0x37, 0xf8, 0x10, 0xbd, - 0xca, 0x7f, 0x2c, 0x3e, 0x87, 0x16, 0xb7, 0xd9, 0xd8, 0xb2, 0x96, 0x9b, - 0xfd, 0xfb, 0xf0, 0xe7, - 0xf8, 0x7e, 0xcc, 0x60, 0x05, 0x3f, 0x48, 0x5e, 0xf9, 0xd0, 0x40, 0xbd, - 0x08, 0x3e, 0x85, 0xbe, - 0x96, 0x94, 0x6f, 0x42, 0x79, 0x3a, 0xd5, 0x61, 0x32, 0xe5, 0x9b, 0x14, - 0x59, 0x8c, 0x59, 0x3d, - 0xe8, 0xb5, 0x6b, 0x86, 0xe7, 0x9b, 0xb4, 0x5a, 0xcc, 0x37, 0x19, 0x85, - 0xae, 0x67, 0xa5, 0x7e, - 0xd3, 0xd8, 0x63, 0x56, 0x47, 0xfa, 0xc3, 0xc9, 0xf3, 0x58, 0x47, 0xb1, - 0x2f, 0x6d, 0x3d, 0x17, - 0xda, 0x17, 0x33, 0x4e, 0xcc, 0x8a, 0x2f, 0x3c, 0x87, 0x75, 0x5a, 0x46, - 0xa9, 0x69, 0x1c, 0x98, - 0xde, 0x3f, 0x58, 0xcf, 0xa5, 0xbc, 0xc1, 0x39, 0x90, 0x2b, 0xef, 0xce, - 0x94, 0x6f, 0xf2, 0xbd, - 0xc4, 0xf1, 0x5a, 0xd1, 0xfb, 0x69, 0x3d, 0xf8, 0x84, 0xed, 0x52, 0x96, - 0x56, 0x5f, 0x4b, 0xe4, - 0x9b, 0xe4, 0x54, 0xd3, 0x08, 0xb9, 0x7c, 0xb9, 0xf5, 0x85, 0x27, 0xf8, - 0x42, 0xba, 0x7a, 0x2e, - 0xfd, 0xf9, 0x26, 0x6e, 0x32, 0xb6, 0xb4, 0x2f, 0x79, 0xe9, 0xf2, 0x4d, - 0x46, 0xc4, 0xf1, 0xe6, - 0xa3, 0x3d, 0xdc, 0xe7, 0xe8, 0x86, 0x58, 0x21, 0x3b, 0x6d, 0xd3, 0x45, - 0xbe, 0x33, 0x7b, 0xce, - 0xf2, 0x9c, 0xd5, 0x79, 0x8e, 0xf7, 0xd4, 0xae, 0x0b, 0xeb, 0xf7, 0x80, - 0xbd, 0xcc, 0xf4, 0x2e, - 0x3b, 0x7b, 0x46, 0xd7, 0xb9, 0x9e, 0xd3, 0x3a, 0x4f, 0xf7, 0x9c, 0xde, - 0x33, 0xb3, 0x7e, 0x8b, - 0xf6, 0x38, 0x57, 0xd4, 0x5e, 0xc6, 0x9c, 0xd1, 0x7b, 0xb2, 0x77, 0x71, - 0xf7, 0x62, 0xdf, 0xe2, - 0x9e, 0xe3, 0xeb, 0x8f, 0x6b, 0xd8, 0xce, 0x7c, 0xc4, 0xbd, 0x81, 0x3e, - 0x0a, 0x9d, 0xed, 0xb7, - 0x77, 0x5f, 0xed, 0x3d, 0xa3, 0xb3, 0xc8, 0x57, 0x2f, 0x7d, 0x08, 0x19, - 0x7c, 0x23, 0x5e, 0x81, - 0x21, 0x7e, 0x86, 0xff, 0x2f, 0x3c, 0x87, 0xe6, 0x37, 0x49, 0x23, 0xf3, - 0x4d, 0x32, 0xd6, 0xe9, - 0x32, 0x52, 0xe7, 0x9b, 0xe4, 0xbe, 0xa6, 0xd5, 0x01, 0xc6, 0xf1, 0xf6, - 0xfb, 0x4d, 0x54, 0x87, - 0xdf, 0xd5, 0xc7, 0x17, 0x32, 0xe5, 0x9b, 0x64, 0xcf, 0x7d, 0x1b, 0x4d, - 0xcc, 0x6a, 0x62, 0x0e, - 0x14, 0xe6, 0x44, 0xdb, 0x1e, 0x87, 0xcd, 0xd8, 0x34, 0x35, 0xcf, 0x9f, - 0x39, 0xdf, 0xc4, 0xe1, - 0xa5, 0xcf, 0x5b, 0x91, 0x94, 0x97, 0x31, 0xdf, 0xc4, 0x92, 0xad, 0x6a, - 0xd5, 0xe7, 0x95, 0xdb, - 0xf8, 0x7e, 0xeb, 0x63, 0x42, 0x9e, 0xa3, 0x84, 0xed, 0x92, 0xa4, 0x9b, - 0xa6, 0x8a, 0x4b, 0x96, - 0x6d, 0x66, 0x3d, 0x9f, 0xbc, 0x43, 0x54, 0x93, 0x7a, 0x88, 0xde, 0x8f, - 0x2d, 0x60, 0x11, 0xe5, - 0xcc, 0x7c, 0xe6, 0x7c, 0x13, 0xb3, 0x76, 0x8d, 0x5e, 0xc8, 0x64, 0xca, - 0x37, 0x19, 0x5d, 0x1c, - 0xaf, 0x35, 0x3f, 0xe0, 0xd8, 0xf4, 0x7e, 0x0b, 0xf9, 0x26, 0x6a, 0x8a, - 0x7c, 0x93, 0xe1, 0x7a, - 0xbf, 0x70, 0x23, 0xfa, 0x3f, 0x51, 0x45, 0xb6, 0xce, 0xe3, 0x98, 0xdb, - 0x9a, 0x4f, 0x67, 0x16, - 0x77, 0x9e, 0xee, 0x3b, 0xa5, 0xed, 0x54, 0xe6, 0xc4, 0xee, 0x33, 0xfd, - 0x6f, 0xcb, 0x6b, 0x38, - 0x5b, 0xdb, 0xb5, 0xcc, 0x92, 0xd6, 0x93, 0x7d, 0xa7, 0x75, 0x90, 0xf7, - 0x3b, 0x17, 0x32, 0x5a, - 0xe3, 0x25, 0xfe, 0x79, 0x2d, 0xab, 0x99, 0x9f, 0x36, 0x5d, 0xc1, 0x5c, - 0xdd, 0xf8, 0x63, 0xdf, - 0x95, 0x2d, 0x57, 0xf8, 0x7f, 0x1c, 0x7b, 0x12, 0xbe, 0xcb, 0xfd, 0x16, - 0x75, 0x35, 0xda, 0xfc, - 0x17, 0xb6, 0xad, 0xf0, 0x5d, 0xdb, 0x3e, 0xc9, 0x7b, 0x4e, 0x70, 0x23, - 0x8b, 0xc9, 0x7f, 0x90, - 0x67, 0xd1, 0x66, 0xe1, 0x23, 0xfc, 0x70, 0xa4, 0xca, 0x9b, 0x61, 0x6d, - 0x34, 0xed, 0xb0, 0xe2, - 0x50, 0xa5, 0x97, 0xc6, 0x6c, 0x0d, 0xcf, 0x37, 0x19, 0x1e, 0x97, 0xdc, - 0x87, 0x0b, 0xac, 0x95, - 0x98, 0xd5, 0x82, 0x9c, 0xd4, 0xae, 0xb1, 0xa8, 0x6d, 0xd3, 0x73, 0x92, - 0x39, 0x40, 0xd7, 0x9f, - 0x74, 0xfa, 0x9a, 0x99, 0x6f, 0x12, 0xae, 0xf4, 0xb8, 0xc9, 0xbc, 0xcb, - 0x58, 0x23, 0xd8, 0xf2, - 0x1c, 0xc8, 0x61, 0xcc, 0x6a, 0x8a, 0x1c, 0x97, 0x74, 0xf5, 0x5c, 0xcc, - 0x7c, 0x93, 0x0c, 0xf5, - 0x5c, 0x06, 0x72, 0x5c, 0x42, 0x39, 0x8a, 0x59, 0x1d, 0xe5, 0x98, 0x54, - 0x8d, 0xd1, 0x0f, 0x98, - 0xee, 0x9c, 0x74, 0x4c, 0xd2, 0xeb, 0x6b, 0x83, 0xb9, 0xf2, 0xd9, 0xf2, - 0x4d, 0x2c, 0xd5, 0xaa, - 0x1f, 0x63, 0x9d, 0x6e, 0xeb, 0x7a, 0xff, 0x90, 0x7c, 0x13, 0x6f, 0xda, - 0x3a, 0x5d, 0xc3, 0xea, - 0xb9, 0x1c, 0x70, 0x8e, 0xcb, 0x98, 0xe3, 0x78, 0xb3, 0xd4, 0xed, 0xe8, - 0xc3, 0x75, 0xba, 0x4e, - 0xb9, 0x9a, 0xb2, 0xe5, 0x9b, 0x0c, 0xb5, 0x5d, 0x4a, 0xf8, 0x3f, 0xa3, - 0xcf, 0xd4, 0xab, 0x90, - 0xad, 0xfd, 0x5a, 0xe6, 0xcc, 0x36, 0xa7, 0x77, 0x61, 0xe7, 0x82, 0xba, - 0x23, 0x7b, 0xa7, 0x79, - 0x1c, 0x1b, 0x27, 0xf9, 0x9f, 0xd7, 0xaf, 0x04, 0x53, 0x3a, 0x6f, 0xf1, - 0x4e, 0xe9, 0x9d, 0xca, - 0xcc, 0xe9, 0x9e, 0xe7, 0x9d, 0xb7, 0x71, 0xb6, 0xf7, 0x27, 0xed, 0x73, - 0x7d, 0xeb, 0x5a, 0xae, - 0x63, 0x1c, 0xbd, 0x95, 0x3e, 0x57, 0x4f, 0x95, 0xd7, 0xdd, 0x5b, 0xee, - 0x2f, 0x6b, 0xdc, 0x0a, - 0x3f, 0xe4, 0xbe, 0x44, 0x2b, 0x5a, 0x6d, 0xfe, 0xdb, 0x5b, 0x0f, 0x67, - 0xce, 0x6f, 0xfe, 0x81, - 0xaf, 0x2a, 0xfe, 0x30, 0xdb, 0x02, 0x43, 0x38, 0x2a, 0x60, 0xb4, 0x5f, - 0xd8, 0x85, 0x7f, 0xa3, - 0x5e, 0xc2, 0x65, 0xd3, 0xfb, 0xf3, 0x68, 0x1c, 0x2f, 0xb1, 0xdf, 0xf3, - 0xd3, 0xd6, 0x73, 0x31, - 0xfd, 0x26, 0x5e, 0xd3, 0x17, 0xae, 0xe6, 0xfb, 0x33, 0xc6, 0x6c, 0xe5, - 0xb2, 0x26, 0x35, 0x3f, - 0x38, 0x07, 0x46, 0xa9, 0xf7, 0xa3, 0xd4, 0x79, 0xff, 0xb4, 0x3f, 0x19, - 0xea, 0xb9, 0x1c, 0x8c, - 0x98, 0x55, 0xb3, 0x46, 0x45, 0xfe, 0x01, 0xd5, 0xa8, 0x18, 0xf0, 0x9b, - 0x90, 0xbe, 0x54, 0xf5, - 0xd7, 0x18, 0x1f, 0xce, 0xd7, 0x93, 0xfc, 0x26, 0xa6, 0xb6, 0xad, 0xe7, - 0xa6, 0x26, 0xf5, 0xa8, - 0xc7, 0xc4, 0xa2, 0x1f, 0xd0, 0x6a, 0x1c, 0xef, 0x88, 0x3a, 0x5f, 0x29, - 0xf3, 0xfe, 0xb3, 0xe6, - 0x9b, 0xe4, 0x38, 0xbe, 0x7f, 0x34, 0x71, 0xbc, 0xe9, 0x39, 0xb3, 0x89, - 0xeb, 0x5a, 0x49, 0xc2, - 0x76, 0x69, 0x76, 0xa7, 0xd6, 0xd7, 0xfa, 0xfc, 0x26, 0xd6, 0x62, 0xe7, - 0xb2, 0xd4, 0xaa, 0x1f, - 0x65, 0x7c, 0xff, 0x68, 0xe2, 0x78, 0x29, 0x2e, 0x64, 0xce, 0x37, 0x71, - 0xf8, 0xa8, 0xc6, 0x56, - 0x28, 0x25, 0x70, 0x3d, 0x80, 0x3e, 0x47, 0xef, 0x18, 0x17, 0xe1, 0x92, - 0xae, 0xeb, 0x99, 0xb9, - 0x84, 0xdf, 0x2d, 0x6f, 0x5c, 0xee, 0xaf, 0x0d, 0x3f, 0xc4, 0xbd, 0x28, - 0x3f, 0xc4, 0xed, 0xd5, - 0xcf, 0x07, 0xb3, 0xda, 0xaf, 0xf7, 0x4e, 0xe8, 0x3d, 0x8e, 0x59, 0x1b, - 0x5f, 0xc7, 0xdc, 0xd9, - 0xe4, 0xf7, 0xf3, 0xcd, 0x87, 0xb1, 0x77, 0xb4, 0x9f, 0xeb, 0x75, 0x77, - 0x2c, 0x61, 0xd6, 0xc5, - 0x56, 0xb2, 0x2b, 0x1b, 0x57, 0xf8, 0x57, 0x18, 0x4f, 0x73, 0x1f, 0xf1, - 0xaf, 0xc2, 0xa3, 0xbb, - 0xe7, 0xfb, 0xae, 0x6b, 0x1f, 0xef, 0x3b, 0xbf, 0xed, 0x16, 0x6f, 0x51, - 0x23, 0xe6, 0xfe, 0x00, - 0xef, 0x41, 0x5d, 0xd2, 0xcf, 0xd1, 0x1b, 0xc2, 0x6e, 0xb4, 0x4b, 0x7c, - 0x1b, 0x15, 0x8e, 0x56, - 0xef, 0xa7, 0xfa, 0x5a, 0x20, 0x85, 0x1d, 0x96, 0xb4, 0xbf, 0x89, 0x3d, - 0x4d, 0xbe, 0x49, 0x52, - 0x1c, 0x6f, 0xce, 0xe6, 0xc0, 0x81, 0x69, 0xdb, 0x49, 0x7e, 0x13, 0x82, - 0xa5, 0xa9, 0xf2, 0x4d, - 0x86, 0xd4, 0xc1, 0xef, 0xd3, 0xb0, 0x0e, 0xd5, 0x1c, 0x18, 0xa2, 0x6d, - 0x67, 0x3d, 0x67, 0x25, - 0x43, 0x35, 0x03, 0x9b, 0x96, 0xa9, 0x4e, 0x97, 0x8d, 0x71, 0x98, 0x3c, - 0x3d, 0x6f, 0xcc, 0x1a, - 0xd6, 0x88, 0x3d, 0x37, 0x0f, 0x42, 0x7c, 0xbf, 0xd5, 0x38, 0xde, 0xc2, - 0x6c, 0xf9, 0x26, 0xe1, - 0x84, 0xed, 0x92, 0x31, 0xdf, 0x84, 0x60, 0xa1, 0xa5, 0xbc, 0x1f, 0xf1, - 0xfb, 0xa8, 0x5d, 0x63, - 0x33, 0xfd, 0x80, 0x85, 0x81, 0x2c, 0xf9, 0x26, 0x91, 0x4a, 0x33, 0x57, - 0x3e, 0xad, 0xbe, 0x76, - 0x10, 0xe2, 0xfb, 0x0b, 0xc7, 0xe8, 0xf3, 0x4a, 0x5d, 0xcf, 0xc5, 0x6d, - 0xde, 0x9b, 0xc4, 0x7a, - 0x3d, 0x87, 0xf9, 0x07, 0x7e, 0x19, 0xfd, 0x5a, 0xbe, 0x11, 0xdb, 0xda, - 0x97, 0x32, 0x37, 0xb7, - 0xb9, 0x7d, 0x93, 0x7b, 0x26, 0xfb, 0x2a, 0x5a, 0x4f, 0x67, 0x9e, 0xc5, - 0xff, 0xc3, 0xbe, 0x17, - 0x3a, 0x17, 0xcc, 0xee, 0xbe, 0xda, 0xeb, 0xee, 0x9a, 0xec, 0x9b, 0xda, - 0x3e, 0xd9, 0x3b, 0xa1, - 0x7b, 0xbe, 0x97, 0x6b, 0x99, 0xe3, 0x5b, 0xd2, 0x76, 0x8e, 0x77, 0x4e, - 0xdb, 0x2a, 0xcf, 0xc2, - 0xf6, 0x85, 0x75, 0xc7, 0xf5, 0x2c, 0x66, 0x4e, 0x8d, 0x6d, 0x67, 0xff, - 0x21, 0xb6, 0x41, 0x47, - 0xf7, 0x62, 0xdf, 0x19, 0x5d, 0x53, 0x7c, 0xf3, 0x3a, 0x6e, 0xf0, 0x4d, - 0xee, 0x38, 0x93, 0x79, - 0x0f, 0x7f, 0x0c, 0x3f, 0x92, 0xf6, 0xa1, 0x97, 0xf8, 0x3d, 0xf0, 0x35, - 0xfe, 0x4b, 0x7c, 0x45, - 0x96, 0x7e, 0xda, 0x33, 0xed, 0xd7, 0x90, 0x14, 0x97, 0xec, 0x4e, 0x5e, - 0x6f, 0xd3, 0xe5, 0x9b, - 0x1c, 0x68, 0xad, 0xfa, 0x54, 0x73, 0x40, 0xcc, 0x89, 0xcf, 0x0b, 0xd3, - 0x39, 0x50, 0x11, 0xcc, - 0x96, 0x6f, 0x62, 0xf3, 0x53, 0x2e, 0x4f, 0xe6, 0x1d, 0xc8, 0x45, 0x2c, - 0x7b, 0x6e, 0xb5, 0x6d, - 0xb3, 0xae, 0x9b, 0x27, 0x5b, 0xbe, 0x09, 0x7d, 0xe6, 0x2a, 0xb3, 0xe5, - 0x9b, 0x64, 0x88, 0x65, - 0x1f, 0xbe, 0xcf, 0x64, 0x5e, 0x7f, 0xdc, 0x50, 0xb6, 0x9a, 0x5b, 0x07, - 0x21, 0xbe, 0x3f, 0xfb, - 0x39, 0x13, 0xb6, 0xcb, 0xa0, 0xdf, 0x24, 0x75, 0xbe, 0x49, 0x02, 0x8b, - 0xf2, 0x32, 0xe7, 0x9b, - 0x8c, 0x06, 0x17, 0x72, 0x55, 0x8f, 0x77, 0x50, 0xd7, 0xcb, 0xa2, 0xaf, - 0x59, 0xc9, 0x37, 0x39, - 0x44, 0xf1, 0xfd, 0xd6, 0xf3, 0xf3, 0x07, 0xfc, 0x26, 0x65, 0xc9, 0xf9, - 0x26, 0x91, 0x07, 0xbc, - 0xef, 0xe1, 0xd7, 0xd0, 0xc7, 0x68, 0x3b, 0x72, 0x76, 0x8e, 0x67, 0x6e, - 0x6d, 0xb9, 0xc2, 0x77, - 0x7e, 0xe7, 0xf9, 0x9e, 0x25, 0xdd, 0x93, 0xbc, 0xf6, 0xf8, 0xbd, 0xfe, - 0x3f, 0x69, 0x17, 0x80, - 0x69, 0x9d, 0x75, 0xbe, 0xab, 0x5a, 0xaf, 0x62, 0x2e, 0x6f, 0xbf, 0xdc, - 0x77, 0x59, 0xe7, 0x52, - 0x46, 0x6c, 0x9b, 0xee, 0xbf, 0xbe, 0xe5, 0x1c, 0xdf, 0x61, 0x8d, 0xeb, - 0x99, 0xab, 0xdb, 0xaf, - 0xf2, 0x5f, 0xd8, 0x33, 0x91, 0xa9, 0x6e, 0xda, 0xc2, 0x7e, 0xa5, 0x2d, - 0x87, 0xb6, 0x8e, 0xab, - 0xfc, 0xe7, 0xf7, 0x4c, 0xf6, 0x56, 0x77, 0x5c, 0xee, 0x3d, 0xaf, 0xbb, - 0x82, 0xb9, 0x5f, 0xfa, - 0x08, 0xec, 0x16, 0x76, 0xe3, 0xdd, 0xc2, 0x5e, 0xb8, 0x87, 0x7f, 0x0b, - 0x7d, 0x8a, 0x4b, 0x51, - 0x0e, 0xb4, 0x6d, 0xb3, 0x26, 0x75, 0xb1, 0x9e, 0xc5, 0x6f, 0x12, 0xac, - 0xe8, 0xd7, 0xb6, 0xd1, - 0xa1, 0x9a, 0x03, 0x63, 0xd2, 0xfb, 0x33, 0xe4, 0x9b, 0x50, 0x6c, 0xcf, - 0x96, 0x6f, 0x72, 0x90, - 0xe6, 0xc0, 0xd8, 0xe2, 0x72, 0x86, 0xd4, 0xc1, 0xb7, 0x96, 0x6f, 0x32, - 0x4e, 0x49, 0x3f, 0x07, - 0x86, 0xee, 0xb9, 0x59, 0xc4, 0x52, 0xad, 0xd1, 0xac, 0xf3, 0x25, 0x64, - 0xce, 0x95, 0xff, 0x7e, - 0xc6, 0x84, 0xd8, 0x11, 0xc9, 0x7a, 0x7f, 0xaa, 0x7a, 0x2e, 0xfd, 0xf9, - 0x26, 0x19, 0xea, 0xb9, - 0x8c, 0xc6, 0x7e, 0xb7, 0x1f, 0xaa, 0x7a, 0x3e, 0xc9, 0xf9, 0x26, 0x8d, - 0x55, 0xb5, 0x43, 0xee, - 0xab, 0x89, 0xeb, 0xa5, 0x43, 0xeb, 0xe0, 0x0b, 0x85, 0xa3, 0xa8, 0x81, - 0x99, 0xb3, 0xda, 0x35, - 0x56, 0x6b, 0xd5, 0x9b, 0x31, 0x82, 0x14, 0xd7, 0x2f, 0x56, 0xfe, 0xc8, - 0xbd, 0x86, 0xf6, 0xa0, - 0xdd, 0xe0, 0xf7, 0xa8, 0xbd, 0xa1, 0x98, 0xb1, 0x77, 0x1f, 0xc5, 0x2c, - 0x6c, 0x9d, 0xcf, 0x5c, - 0xd5, 0xb4, 0x92, 0x2d, 0xeb, 0x3c, 0x92, 0x7b, 0x2b, 0x78, 0x29, 0x98, - 0xd6, 0xba, 0xc6, 0xfb, - 0x83, 0x8e, 0x0b, 0x99, 0x73, 0xda, 0xce, 0x25, 0xed, 0x72, 0x06, 0x36, - 0xcc, 0x60, 0xaf, 0x6f, - 0x39, 0xdb, 0x3f, 0xad, 0x79, 0x8d, 0xff, 0xc6, 0xc6, 0x2b, 0xb9, 0xda, - 0x96, 0x53, 0x18, 0x67, - 0xe3, 0xa3, 0xfe, 0x77, 0x42, 0xf3, 0xe1, 0xb4, 0xae, 0xe5, 0xbe, 0xe3, - 0x36, 0x56, 0xd7, 0x57, - 0x77, 0x9f, 0xee, 0xb9, 0xad, 0xc3, 0xe6, 0xdf, 0xa0, 0x7e, 0xc1, 0xed, - 0xe4, 0x77, 0xf1, 0xaf, - 0x89, 0xbb, 0xe1, 0xeb, 0x78, 0x27, 0xfe, 0x02, 0x6b, 0x39, 0xd1, 0xb6, - 0xfb, 0xe3, 0x78, 0xc7, - 0x0d, 0xa9, 0xe7, 0x32, 0x7c, 0x7f, 0x13, 0x57, 0x6d, 0x55, 0xb6, 0x7c, - 0x93, 0x83, 0x52, 0xd3, - 0xaa, 0x70, 0xcc, 0x3e, 0xaf, 0x11, 0xf9, 0x26, 0x2d, 0x09, 0xee, 0xe0, - 0x6e, 0x4c, 0xd8, 0x1e, - 0xa9, 0xfc, 0xe1, 0xb6, 0x03, 0xa8, 0x55, 0x9f, 0x26, 0x66, 0x35, 0x27, - 0x35, 0x2a, 0x28, 0x57, - 0xa3, 0x73, 0xa0, 0x2c, 0x92, 0x22, 0xdf, 0x24, 0xc9, 0x6f, 0x52, 0xa0, - 0x97, 0xa7, 0x9d, 0x03, - 0xe6, 0xbe, 0xd0, 0xfa, 0xe0, 0x5e, 0xca, 0x09, 0xdb, 0x25, 0xb3, 0xbe, - 0x96, 0x56, 0xef, 0x3f, - 0x30, 0x4d, 0xe3, 0x80, 0xc6, 0x64, 0x48, 0xbe, 0x49, 0x0a, 0x7f, 0xd8, - 0xf0, 0x7c, 0x93, 0xbc, - 0x43, 0x1f, 0xdf, 0x6f, 0xb5, 0x76, 0x0d, 0x36, 0x6b, 0x52, 0x07, 0xcd, - 0x7c, 0x93, 0xf4, 0x7e, - 0x13, 0xd5, 0xc6, 0xd2, 0xbe, 0xe5, 0xd8, 0x7e, 0xcf, 0xa1, 0x1f, 0x90, - 0xce, 0xd1, 0x02, 0xf4, - 0x4b, 0x44, 0xd0, 0x8f, 0x7f, 0x1d, 0xbd, 0x82, 0x3e, 0x82, 0xff, 0x27, - 0xed, 0xe2, 0x6e, 0xef, - 0x3c, 0xdb, 0x77, 0x7e, 0xcf, 0x49, 0x5e, 0x5b, 0xcb, 0x35, 0xcc, 0xc5, - 0x5d, 0x76, 0x66, 0x53, - 0xfc, 0x7a, 0x76, 0x66, 0xe7, 0x15, 0x1e, 0x77, 0xef, 0x34, 0xcf, 0xec, - 0xae, 0x59, 0x9e, 0x69, - 0x5d, 0xc7, 0x31, 0xb0, 0xe9, 0x70, 0xdf, 0x0d, 0x6d, 0x67, 0x33, 0x0b, - 0xda, 0x96, 0x32, 0x95, - 0xdd, 0x76, 0xdf, 0x0f, 0xda, 0xce, 0x62, 0x2a, 0x1a, 0x5e, 0xf2, 0x6f, - 0x8b, 0xd9, 0xc0, 0xc5, - 0x6d, 0xb7, 0xf8, 0x4a, 0xba, 0x7f, 0xec, 0x3b, 0xab, 0x73, 0xa2, 0xef, - 0xfa, 0xce, 0x99, 0xde, - 0xd3, 0xf5, 0x37, 0xd9, 0x7d, 0x68, 0x17, 0xbf, 0x4b, 0x20, 0x18, 0x8b, - 0x77, 0xa1, 0xd7, 0xf0, - 0x9f, 0xd1, 0xf4, 0x5c, 0x68, 0xdb, 0x29, 0xd7, 0xe3, 0xa1, 0x75, 0xf0, - 0x33, 0xe6, 0x9b, 0xf4, - 0xdb, 0x1e, 0x87, 0x70, 0x0e, 0x8c, 0x52, 0xef, 0x47, 0x85, 0x06, 0xe1, - 0xaf, 0x04, 0xbf, 0xcd, - 0x7c, 0x93, 0xe6, 0x7e, 0x9f, 0x49, 0x72, 0x5c, 0x32, 0xc5, 0xf5, 0x7c, - 0x8e, 0xe6, 0xa2, 0x57, - 0xa8, 0xdf, 0xcb, 0x3e, 0xac, 0x96, 0xd6, 0x63, 0xca, 0x99, 0xd3, 0xed, - 0x1f, 0x6c, 0xe6, 0x9b, - 0xc4, 0x2b, 0xeb, 0x28, 0xef, 0x48, 0x8a, 0xb1, 0x46, 0x23, 0x63, 0x79, - 0x13, 0x75, 0xf0, 0xcb, - 0xa8, 0x7d, 0xdd, 0x3a, 0x42, 0x6b, 0x1c, 0x61, 0x87, 0x7d, 0x8f, 0x7b, - 0xd3, 0x5a, 0xaa, 0x55, - 0x5f, 0xac, 0x3b, 0x98, 0x74, 0xfa, 0x9a, 0x19, 0x97, 0x3c, 0xc6, 0x38, - 0xde, 0x03, 0xf7, 0x03, - 0x8e, 0x2e, 0x5e, 0x6f, 0xa0, 0x9e, 0x4b, 0xca, 0x7c, 0x13, 0x67, 0xdf, - 0xfe, 0x26, 0xe9, 0xf3, - 0x88, 0x72, 0xbb, 0x3f, 0xf3, 0x68, 0xf5, 0xfe, 0x6b, 0xd0, 0x97, 0xf0, - 0x65, 0xbc, 0x13, 0xee, - 0xe7, 0xdf, 0x57, 0x43, 0xf8, 0xe6, 0xa0, 0x08, 0x60, 0x74, 0x29, 0xb8, - 0xbd, 0xf9, 0x52, 0xce, - 0xd6, 0xfe, 0x23, 0xff, 0x8f, 0x3b, 0x6c, 0x4c, 0x73, 0x6c, 0x89, 0x7f, - 0x6e, 0xd7, 0x75, 0x9e, - 0xaa, 0xce, 0x63, 0xeb, 0x56, 0xc6, 0x57, 0xb3, 0xcb, 0x63, 0xb5, 0x10, - 0x37, 0x4d, 0x63, 0x97, - 0xb4, 0x9c, 0xe3, 0x9d, 0xd0, 0xb6, 0xd6, 0xff, 0xe3, 0xee, 0x4a, 0xcf, - 0x8f, 0xdb, 0xce, 0x20, - 0xf3, 0xf4, 0x25, 0xff, 0x9a, 0x16, 0x1b, 0xb7, 0xb4, 0xed, 0x87, 0xbe, - 0xe2, 0x4e, 0x85, 0xb9, - 0xb9, 0xbd, 0xd8, 0x7f, 0x76, 0xf7, 0x49, 0x3e, 0x77, 0xc3, 0x56, 0xff, - 0xa7, 0x78, 0x97, 0xb0, - 0x97, 0xdf, 0x8b, 0x76, 0xe1, 0x3d, 0x04, 0x6b, 0x3f, 0x40, 0x5b, 0x70, - 0xde, 0x41, 0x8a, 0x59, - 0x1d, 0x3a, 0x66, 0xd4, 0x96, 0xae, 0x8c, 0x96, 0xd6, 0xa7, 0xd5, 0xd7, - 0xa8, 0x1d, 0x46, 0xf0, - 0xd2, 0xda, 0x1c, 0xc8, 0x61, 0x1c, 0xaf, 0xe5, 0x9a, 0x56, 0x64, 0xde, - 0x99, 0xcf, 0xe3, 0xb0, - 0xfd, 0x4d, 0x28, 0x1f, 0xec, 0xd3, 0x70, 0x4d, 0xdb, 0x83, 0xd6, 0x42, - 0xa6, 0xf9, 0x26, 0x62, - 0x86, 0x98, 0xad, 0xef, 0x25, 0x66, 0x35, 0xa5, 0x86, 0x85, 0xd2, 0xd6, - 0xc1, 0x27, 0xb8, 0xee, - 0x08, 0x16, 0xfa, 0x0b, 0xe4, 0x7c, 0x40, 0xe7, 0x4b, 0xaa, 0xf9, 0x6a, - 0xee, 0x41, 0x49, 0xee, - 0x7d, 0xa2, 0x9e, 0x4b, 0xba, 0x3d, 0x37, 0x89, 0x9d, 0x6c, 0xa5, 0xce, - 0x97, 0xb5, 0x5a, 0xf5, - 0x07, 0x65, 0x4c, 0xb2, 0xe7, 0x9b, 0xb8, 0x6a, 0xdd, 0xc4, 0xfe, 0x2d, - 0xce, 0x94, 0x6f, 0x62, - 0x39, 0xbe, 0xbf, 0xe4, 0xe0, 0xed, 0x4d, 0x9b, 0x42, 0x5f, 0x33, 0x71, - 0xbd, 0xc9, 0x9d, 0xb6, - 0x9e, 0x4b, 0x72, 0x1d, 0xfc, 0xe2, 0x43, 0xbf, 0x37, 0xed, 0x40, 0x8d, - 0x8a, 0x12, 0xfe, 0x33, - 0xb4, 0x0f, 0xee, 0xc2, 0x7b, 0xb9, 0xb7, 0xe1, 0x1f, 0x8c, 0xcb, 0xb8, - 0xc2, 0x76, 0x3b, 0x5b, - 0xdc, 0x55, 0xc1, 0x94, 0x74, 0x3b, 0x7d, 0xf3, 0xba, 0x6e, 0xf4, 0x1e, - 0xb9, 0xb1, 0xdc, 0xfb, - 0x78, 0xe4, 0x6a, 0x6e, 0x52, 0x47, 0x8d, 0x6f, 0x76, 0x8f, 0xdb, 0x33, - 0xb9, 0x6b, 0x0a, 0x33, - 0x7e, 0xa3, 0x93, 0xb9, 0xac, 0x7d, 0x8e, 0xf7, 0xd6, 0xd6, 0x1f, 0xfa, - 0x6c, 0xdd, 0x2e, 0xff, - 0xd4, 0x1e, 0x1b, 0x73, 0x69, 0xeb, 0x39, 0xbe, 0x69, 0x8d, 0x9b, 0x98, - 0x53, 0xba, 0xa6, 0xf9, - 0x57, 0x74, 0xcd, 0xf3, 0x55, 0x77, 0x39, 0x3d, 0xae, 0x2e, 0x07, 0x73, - 0x42, 0xc7, 0xa5, 0x3e, - 0x5b, 0x13, 0xc7, 0xfe, 0x81, 0x7f, 0x15, 0xef, 0xc5, 0x7b, 0xd1, 0x5e, - 0x7e, 0x17, 0xda, 0xcd, - 0xbf, 0x8c, 0xfe, 0x84, 0x2f, 0x40, 0x07, 0xe4, 0xf3, 0xb2, 0x16, 0xc7, - 0x8b, 0x06, 0xe6, 0x40, - 0x3a, 0x7d, 0xad, 0x3f, 0xdf, 0x84, 0xdc, 0x9f, 0xe2, 0x2c, 0xf9, 0x26, - 0x96, 0x6a, 0xd5, 0x8f, - 0x62, 0x0e, 0x58, 0xdb, 0x6f, 0x91, 0xe6, 0x9c, 0x16, 0x8e, 0xcc, 0x37, - 0xe9, 0xf3, 0x87, 0xd3, - 0xf9, 0x4f, 0x71, 0xd0, 0x9c, 0x37, 0x4d, 0x89, 0x7c, 0x93, 0x44, 0x0d, - 0x93, 0x14, 0xfe, 0xf0, - 0xd1, 0x68, 0x58, 0x16, 0xe7, 0xc0, 0x81, 0xef, 0xb7, 0xd8, 0x97, 0x6f, - 0x42, 0x9e, 0x47, 0xca, - 0xe3, 0xe8, 0x3d, 0x31, 0xeb, 0x3f, 0x53, 0x5b, 0x37, 0x64, 0xf3, 0x17, - 0xe9, 0x85, 0x6c, 0x46, - 0x3f, 0x60, 0xaa, 0x7a, 0x2e, 0xfd, 0x76, 0x18, 0x99, 0x2f, 0x34, 0x46, - 0x3b, 0xad, 0xbe, 0x96, - 0xf3, 0x31, 0x49, 0xd4, 0xf9, 0x2a, 0x1e, 0xb3, 0xde, 0x9f, 0x1c, 0x97, - 0x6c, 0x31, 0xdf, 0xe4, - 0x80, 0x6a, 0xd5, 0xa7, 0xc0, 0x85, 0x03, 0xaf, 0x69, 0x35, 0xd0, 0x97, - 0x42, 0xaa, 0xbd, 0x93, - 0xb1, 0xcd, 0x9c, 0x6f, 0x92, 0x0f, 0x2c, 0xc6, 0xf1, 0x1e, 0x94, 0xda, - 0x35, 0x1e, 0xfe, 0x77, - 0x68, 0x17, 0x7a, 0x1d, 0xef, 0x87, 0x6f, 0xa3, 0x4f, 0x05, 0x1e, 0x5c, - 0xd8, 0xba, 0x84, 0xbd, - 0xb2, 0xf5, 0xc7, 0xec, 0x35, 0x6d, 0x97, 0xb3, 0x57, 0x77, 0x9c, 0xe5, - 0x2b, 0x6a, 0xfb, 0xa9, - 0xff, 0x1b, 0xcd, 0x0b, 0x6c, 0x6d, 0x97, 0xfa, 0x57, 0x36, 0x2e, 0xf5, - 0xde, 0x40, 0x6c, 0xe1, - 0x9b, 0x5a, 0xaf, 0xf5, 0x37, 0x34, 0x9e, 0xc6, 0x1c, 0xdd, 0xbc, 0xdc, - 0x77, 0x53, 0xd3, 0x35, - 0xde, 0x6b, 0x5b, 0x7e, 0xea, 0x61, 0x5a, 0x17, 0xf9, 0x8e, 0x6e, 0x5d, - 0xc9, 0x94, 0x75, 0x5f, - 0xcc, 0xdc, 0xd8, 0x6e, 0x63, 0x2e, 0x6b, 0x5c, 0xe5, 0xbd, 0xba, 0xed, - 0x3a, 0xef, 0x9a, 0x46, - 0xaf, 0xaf, 0xac, 0xed, 0x3c, 0xdf, 0x3b, 0xfc, 0x3e, 0xf4, 0x06, 0x7e, - 0x0b, 0xed, 0x27, 0x1c, - 0x70, 0x27, 0xbf, 0x13, 0xbd, 0x83, 0xdf, 0x47, 0xb6, 0x54, 0xcf, 0x5c, - 0x2e, 0x63, 0x56, 0xd3, - 0xe8, 0x7a, 0x63, 0xcd, 0x37, 0x49, 0xf0, 0x74, 0x8b, 0xb5, 0xea, 0x73, - 0xb4, 0x0f, 0x2b, 0xdd, - 0x23, 0x27, 0x63, 0xfe, 0xa7, 0x89, 0xeb, 0x0e, 0x7f, 0x65, 0x93, 0xbb, - 0xd6, 0xd9, 0xd8, 0xa7, - 0x15, 0xa6, 0xd8, 0x3f, 0x98, 0xe2, 0xba, 0xd5, 0x39, 0x90, 0xd3, 0x7d, - 0x58, 0xad, 0x69, 0x58, - 0x09, 0x5b, 0x55, 0xcf, 0x67, 0x28, 0x96, 0xd9, 0xb4, 0x42, 0xd6, 0x16, - 0xec, 0xdb, 0xf3, 0x32, - 0x45, 0xfd, 0xe7, 0x74, 0x7a, 0xff, 0x90, 0xb8, 0xe4, 0xe4, 0xda, 0x56, - 0x03, 0xf5, 0x5c, 0x1c, - 0x23, 0xf6, 0x99, 0xfc, 0x3e, 0xe2, 0x78, 0xcd, 0x31, 0x89, 0x67, 0x19, - 0x13, 0x72, 0x5f, 0xa9, - 0x1d, 0x51, 0x19, 0x2b, 0xab, 0xcf, 0x98, 0x6f, 0x62, 0xda, 0x2e, 0x16, - 0xed, 0x88, 0x5c, 0xee, - 0x4d, 0x6b, 0x61, 0x0f, 0x4a, 0xd3, 0x17, 0x4e, 0xf9, 0x42, 0xda, 0x7a, - 0x2e, 0x7d, 0x76, 0x18, - 0xad, 0x5d, 0x43, 0xf3, 0x4d, 0x32, 0xd9, 0x2e, 0xb9, 0xde, 0x9b, 0xd6, - 0xac, 0x5d, 0x33, 0x89, - 0xfd, 0x1b, 0xde, 0x8d, 0xf6, 0xa3, 0x3d, 0x68, 0x1f, 0x78, 0x07, 0xfd, - 0x5e, 0xbe, 0x1d, 0x54, - 0x75, 0x2f, 0xf4, 0x2f, 0xe8, 0x38, 0x82, 0x99, 0xdf, 0xb5, 0x80, 0xa9, - 0xea, 0x28, 0x62, 0xcf, - 0x8a, 0xbf, 0xee, 0xff, 0x5c, 0xd8, 0x8f, 0x16, 0xb7, 0x14, 0xb2, 0x73, - 0xda, 0x4f, 0x67, 0x16, - 0x77, 0x9f, 0xc4, 0x9c, 0xda, 0x3e, 0x87, 0xd9, 0x1a, 0xea, 0x26, 0x5c, - 0x71, 0x8a, 0xff, 0xf2, - 0xf6, 0x1f, 0x79, 0x7e, 0xd8, 0x75, 0x85, 0xe7, 0xdc, 0x9e, 0x29, 0xbe, - 0x23, 0x7b, 0x8e, 0xf7, - 0xd9, 0x7b, 0x96, 0x32, 0x67, 0x76, 0x55, 0xf8, 0x9a, 0x1b, 0xd7, 0xfb, - 0x7e, 0xd0, 0x75, 0x8d, - 0x77, 0x49, 0xfb, 0x39, 0xbe, 0x19, 0x1b, 0x5d, 0x9e, 0x8d, 0x81, 0x5f, - 0x83, 0x9d, 0x98, 0x20, - 0x20, 0xff, 0x06, 0xe1, 0x80, 0xaf, 0x13, 0x0e, 0xf8, 0x17, 0xc4, 0xa4, - 0xea, 0xcb, 0x28, 0x7c, - 0x5e, 0x56, 0xe3, 0x78, 0x33, 0xac, 0x8d, 0x09, 0x3b, 0x2c, 0x54, 0x61, - 0x29, 0xdf, 0x24, 0x11, - 0xc7, 0x3b, 0xee, 0x50, 0xe2, 0x02, 0xa2, 0x75, 0xb4, 0xca, 0xb3, 0x69, - 0x58, 0xb4, 0x9f, 0xc4, - 0xd6, 0xa0, 0x76, 0xc5, 0x40, 0xbe, 0x49, 0x53, 0x7f, 0x7e, 0x46, 0x72, - 0xbe, 0x49, 0xb9, 0x97, - 0x9e, 0x33, 0x63, 0x8d, 0x60, 0x0b, 0x75, 0xd9, 0x47, 0x1f, 0xb3, 0x3a, - 0x86, 0xda, 0x35, 0x3c, - 0x8d, 0xbb, 0xc8, 0x87, 0xb4, 0x0e, 0xfe, 0x58, 0xf4, 0x7e, 0x9a, 0x2b, - 0x4f, 0x71, 0xa1, 0x2c, - 0x5a, 0x9e, 0xbe, 0x9e, 0x0b, 0x19, 0xaf, 0x02, 0xeb, 0x7b, 0x56, 0x5b, - 0x8c, 0xe3, 0xcd, 0x95, - 0xde, 0x3f, 0x0e, 0xf5, 0xd7, 0xa4, 0xce, 0x98, 0x6f, 0x42, 0xf0, 0xd1, - 0xcc, 0x95, 0x97, 0x0b, - 0x32, 0xe6, 0x9b, 0x8c, 0x66, 0x6f, 0xda, 0x83, 0x5a, 0xcf, 0x27, 0xd3, - 0x3e, 0x93, 0x69, 0xea, - 0xb9, 0x8c, 0x1b, 0x59, 0xa3, 0x22, 0x73, 0x8e, 0x8b, 0xd5, 0xda, 0x35, - 0x81, 0x7b, 0xc1, 0x5b, - 0x70, 0x0f, 0x7a, 0x0b, 0xbd, 0x8e, 0xf6, 0xf8, 0xdf, 0x06, 0xbf, 0x55, - 0x57, 0x31, 0xb3, 0xba, - 0x4f, 0xf2, 0x9d, 0xd8, 0x79, 0x42, 0xed, 0x09, 0x5d, 0xc7, 0xd6, 0x2e, - 0x6e, 0xde, 0xe0, 0x7b, - 0x17, 0x7d, 0xc0, 0xbd, 0x0a, 0x3f, 0xc5, 0x2f, 0x85, 0xaf, 0xf3, 0x2f, - 0xec, 0x38, 0x9c, 0x99, - 0xbd, 0x71, 0x4e, 0xdd, 0xbc, 0xae, 0x62, 0x6f, 0x40, 0xfc, 0x2b, 0xf4, - 0xb4, 0xce, 0xf2, 0x3b, - 0x7a, 0xcb, 0x7c, 0x65, 0xbd, 0x65, 0x9e, 0xd2, 0xde, 0x49, 0xde, 0x49, - 0xdd, 0xe5, 0xde, 0x05, - 0xed, 0x37, 0xd6, 0x97, 0xf4, 0x1c, 0xe7, 0x79, 0xb8, 0x69, 0x3a, 0xb1, - 0x8d, 0xc9, 0xfa, 0xdd, - 0xe3, 0x60, 0x26, 0x77, 0x15, 0xf9, 0x6e, 0x56, 0x7e, 0x03, 0x76, 0xf2, - 0x84, 0x67, 0xf2, 0xfb, - 0xd1, 0x3e, 0xbc, 0x0f, 0xed, 0xc7, 0xfb, 0xd1, 0x17, 0x7c, 0x25, 0x3c, - 0x24, 0x71, 0xbc, 0x59, - 0x9e, 0xc7, 0x71, 0x5a, 0x85, 0x99, 0x57, 0x93, 0x1c, 0xbf, 0x96, 0x2a, - 0x2e, 0xd9, 0xac, 0x69, - 0xa5, 0x65, 0xcb, 0x37, 0x19, 0x05, 0x2e, 0x44, 0x2c, 0xc4, 0xeb, 0xc5, - 0xdd, 0x16, 0xf6, 0x77, - 0x2a, 0x06, 0xd4, 0x3e, 0x4a, 0xe2, 0xcc, 0x69, 0xeb, 0xb9, 0x64, 0xcf, - 0x37, 0xb1, 0x68, 0xbf, - 0xcb, 0x63, 0xa9, 0x49, 0x6d, 0x3d, 0x66, 0x35, 0x2b, 0x2e, 0x58, 0xaa, - 0xaf, 0x67, 0xea, 0xfd, - 0x30, 0x9d, 0xbe, 0x46, 0xed, 0x6d, 0xf3, 0x5e, 0x47, 0x69, 0xae, 0x7c, - 0x1a, 0x7d, 0x6d, 0xd4, - 0xba, 0x5e, 0x45, 0x4e, 0xc7, 0xa4, 0x78, 0xb8, 0xed, 0x92, 0x36, 0xdf, - 0x24, 0xa5, 0xbe, 0x86, - 0x46, 0xab, 0xeb, 0x59, 0xf6, 0x03, 0xc6, 0x5c, 0xf5, 0x56, 0x38, 0x4a, - 0x26, 0x3f, 0xa0, 0xe9, - 0x37, 0xd1, 0x68, 0xae, 0x7c, 0x55, 0xfa, 0x7c, 0x93, 0x3e, 0x3b, 0x2c, - 0x7f, 0x54, 0x7b, 0x56, - 0x5b, 0xdb, 0x9b, 0xf6, 0x78, 0xf1, 0xaf, 0xe8, 0x55, 0x4c, 0x31, 0x69, - 0x2f, 0xde, 0xc7, 0xed, - 0xc6, 0xaf, 0xa3, 0xbd, 0x70, 0x8f, 0xf8, 0x0a, 0x78, 0x59, 0x7c, 0x95, - 0x7b, 0x35, 0xf0, 0x12, - 0xfb, 0x96, 0xf8, 0x19, 0xd8, 0xcf, 0xed, 0x81, 0xaf, 0xa3, 0x57, 0xd1, - 0x87, 0xfc, 0xe7, 0xe0, - 0x85, 0xc0, 0x53, 0xdc, 0x53, 0xe2, 0x33, 0xec, 0xcf, 0x02, 0x4f, 0x70, - 0xbf, 0x20, 0x4c, 0xee, - 0xd7, 0xfc, 0xcf, 0xc1, 0xdd, 0x5a, 0xaf, 0x7f, 0xb3, 0x72, 0x37, 0xbb, - 0x31, 0xd4, 0xc3, 0x6d, - 0x0a, 0x76, 0xb3, 0x0f, 0x68, 0x0f, 0xfb, 0x9b, 0x8c, 0x07, 0xd9, 0x3d, - 0xf2, 0x46, 0xae, 0x23, - 0xd4, 0xc9, 0x76, 0x12, 0x9e, 0xd8, 0x19, 0x6c, 0xf6, 0x6f, 0x15, 0xf7, - 0xc1, 0xdd, 0x04, 0xff, - 0x5e, 0xe7, 0xf7, 0x60, 0x7a, 0xdc, 0xc5, 0xef, 0x41, 0x5f, 0x0a, 0x22, - 0x3a, 0x10, 0x5f, 0x78, - 0x99, 0xc5, 0x5a, 0x77, 0xa3, 0xd6, 0xb6, 0xd3, 0xd5, 0x73, 0x49, 0xda, - 0xdf, 0x24, 0xa5, 0xbe, - 0x36, 0xaa, 0x39, 0x90, 0x42, 0xd7, 0x4b, 0x31, 0x07, 0xa8, 0xbd, 0x90, - 0xcd, 0x96, 0xa6, 0x1a, - 0x16, 0xad, 0xcb, 0x94, 0x7a, 0x3d, 0x1e, 0x9a, 0x6f, 0x92, 0x72, 0xff, - 0xe0, 0xe4, 0xb8, 0x64, - 0x72, 0xce, 0x5c, 0xd6, 0xaa, 0xcf, 0x65, 0x9d, 0x96, 0x01, 0x8e, 0x32, - 0xca, 0xbd, 0x69, 0x87, - 0x8e, 0x45, 0x8a, 0x3a, 0xf8, 0x2d, 0x19, 0xf4, 0xb5, 0xcc, 0x7a, 0x7f, - 0x0a, 0x5d, 0xef, 0xe0, - 0xee, 0x4d, 0x3b, 0xc4, 0x76, 0xa1, 0xf7, 0x35, 0x5c, 0x31, 0x32, 0xdf, - 0xa4, 0x31, 0xb1, 0x97, - 0x72, 0xb2, 0x3f, 0x3c, 0x91, 0xe3, 0x92, 0x8d, 0x2f, 0x58, 0x8c, 0xd7, - 0xd3, 0xca, 0xd9, 0xab, - 0xc5, 0x2f, 0xe0, 0xb7, 0xf0, 0x4f, 0xe8, 0x2f, 0xe8, 0x4b, 0xf4, 0x1b, - 0xf4, 0x05, 0xfa, 0x0c, - 0x7d, 0x8a, 0xbe, 0x80, 0x9f, 0xa2, 0x8f, 0xc9, 0xab, 0x0f, 0x79, 0xfa, - 0xdb, 0xaf, 0xf0, 0x67, - 0xe8, 0x13, 0xfc, 0x21, 0xfa, 0x88, 0xff, 0x90, 0x1c, 0x3f, 0x45, 0x1f, - 0xa1, 0xf7, 0xf1, 0xfb, - 0xf8, 0x57, 0xe4, 0xf8, 0x2b, 0xf4, 0x39, 0xfc, 0x0d, 0xfa, 0x03, 0xfc, - 0x0b, 0xfa, 0x33, 0xfc, - 0x3d, 0xfa, 0x35, 0x24, 0xff, 0x02, 0xdf, 0x45, 0xef, 0xc2, 0x37, 0xf8, - 0xd7, 0xe1, 0x7e, 0xfe, - 0x5d, 0xf8, 0x26, 0xff, 0x16, 0xdc, 0x47, 0x5e, 0xef, 0x21, 0x6d, 0x1f, - 0x4f, 0x63, 0x86, 0xf7, - 0x91, 0xf7, 0x5f, 0x27, 0xf8, 0xb1, 0x8b, 0xbe, 0x47, 0xec, 0xc7, 0x3d, - 0xe8, 0x15, 0xfe, 0x65, - 0xf4, 0x2a, 0xbf, 0x13, 0xed, 0x24, 0xc7, 0x97, 0xf8, 0x97, 0xd0, 0xcb, - 0xfc, 0x2b, 0xe4, 0xf8, - 0x3c, 0x7a, 0x81, 0xbc, 0x7e, 0x01, 0xbf, 0x40, 0x8e, 0x3f, 0x87, 0x2f, - 0xf2, 0x2f, 0xc2, 0x9f, - 0xd3, 0xa3, 0xf0, 0x22, 0x7a, 0x41, 0x78, 0x1e, 0x3f, 0x2f, 0x3c, 0x8b, - 0xc8, 0xff, 0xd1, 0x73, - 0xf8, 0x67, 0xe4, 0xfd, 0x57, 0xd0, 0xc7, 0xf0, 0x1d, 0xfc, 0x26, 0x7c, - 0x17, 0x7f, 0x00, 0x3f, - 0xc4, 0xf4, 0xea, 0xde, 0x06, 0x1f, 0xf3, 0x9f, 0x70, 0x1f, 0xf2, 0xbf, - 0x02, 0x9f, 0xf2, 0x1f, - 0x72, 0x1f, 0xe1, 0x0f, 0xb9, 0x37, 0xf1, 0x5b, 0xe8, 0x6d, 0x4c, 0xfe, - 0x8f, 0xdf, 0x26, 0x9f, - 0xfd, 0x10, 0x92, 0xf7, 0xc0, 0x07, 0xf8, 0x03, 0xf0, 0x39, 0x7e, 0x87, - 0xd8, 0xcc, 0xfb, 0xe1, - 0x7b, 0xf8, 0xd7, 0xdc, 0x27, 0xf8, 0x63, 0x40, 0xfa, 0xc7, 0x7d, 0x8c, - 0x3f, 0xe2, 0x3e, 0xc7, - 0x9f, 0x80, 0xf7, 0xc9, 0x7b, 0x1f, 0xe1, 0x37, 0xe0, 0xc7, 0xf8, 0x73, - 0xee, 0xd7, 0xf8, 0x57, - 0xdc, 0x67, 0xf8, 0x77, 0xe4, 0xf3, 0xef, 0xc1, 0xd7, 0xd0, 0x2e, 0xd3, - 0xff, 0xb1, 0x9b, 0xe2, - 0x1f, 0x7a, 0x5d, 0xd8, 0x87, 0x76, 0x0b, 0xef, 0xe0, 0xe5, 0xfc, 0x65, - 0xe8, 0x0a, 0xfe, 0x52, - 0x74, 0x09, 0x7f, 0x09, 0xfa, 0x11, 0xff, 0x23, 0xf4, 0x43, 0xf9, 0x4a, - 0xee, 0xc7, 0xca, 0x25, - 0xec, 0x0f, 0xf8, 0x4b, 0xe1, 0x85, 0xfc, 0x45, 0xf0, 0x07, 0xfc, 0x85, - 0xf0, 0x42, 0xe1, 0x42, - 0x78, 0xbe, 0x70, 0x01, 0xba, 0x80, 0x3f, 0x0f, 0x5e, 0xc0, 0x5f, 0x80, - 0xce, 0xe1, 0xcf, 0x85, - 0x17, 0x69, 0x97, 0xf8, 0x2f, 0x12, 0xcf, 0x06, 0x67, 0xf3, 0x67, 0xc3, - 0xb3, 0xf8, 0xd3, 0xe0, - 0x59, 0xc2, 0x39, 0xe8, 0x4c, 0xf3, 0xf5, 0x59, 0xe8, 0x0c, 0xf3, 0x78, - 0x06, 0x3c, 0x83, 0xfc, - 0xfb, 0xc5, 0xda, 0xf9, 0xfe, 0x33, 0xc8, 0xeb, 0xd3, 0x30, 0x69, 0xfc, - 0x29, 0xe8, 0x64, 0x7e, - 0x31, 0x3a, 0x55, 0x38, 0x05, 0x9d, 0x2e, 0x2c, 0x46, 0x8b, 0xf9, 0x93, - 0xe1, 0x49, 0xc2, 0x49, - 0xe8, 0x24, 0xe5, 0x74, 0xf6, 0x4c, 0xe5, 0x44, 0xf6, 0x04, 0xfe, 0x44, - 0x74, 0x0a, 0x7f, 0x1c, - 0x3c, 0x9e, 0x3f, 0x0e, 0x1d, 0xcf, 0x2f, 0x42, 0x8b, 0x68, 0x13, 0x8e, - 0x87, 0xc7, 0x4b, 0x27, - 0x81, 0x53, 0x94, 0xc5, 0xec, 0xa9, 0xfa, 0xe9, 0xcc, 0xa9, 0xfa, 0xa9, - 0xcc, 0x29, 0xfa, 0xc9, - 0xcc, 0x62, 0xfd, 0x14, 0xff, 0x62, 0xf5, 0x6c, 0x76, 0x96, 0x56, 0xec, - 0x1f, 0x12, 0x97, 0x4c, - 0xe3, 0x78, 0xe3, 0x56, 0xe6, 0x80, 0xcb, 0x42, 0x4d, 0xab, 0x02, 0x48, - 0xf1, 0x37, 0x6b, 0xee, - 0x1b, 0xc1, 0x22, 0x5a, 0xab, 0x34, 0xbb, 0xb6, 0xed, 0xae, 0xaf, 0x0c, - 0xd9, 0xbd, 0x99, 0xf3, - 0x4d, 0x8a, 0x58, 0x1a, 0x73, 0x98, 0x2d, 0x0f, 0xf7, 0x10, 0xef, 0xc3, - 0x3a, 0x04, 0xff, 0xac, - 0xc7, 0xf1, 0x66, 0x18, 0x93, 0xbe, 0xb8, 0xe4, 0x54, 0xb9, 0xf2, 0x43, - 0xf6, 0x0f, 0xa6, 0xba, - 0x29, 0xe1, 0x5c, 0xb9, 0x8c, 0x0f, 0xb0, 0x1e, 0xdf, 0x9f, 0xbd, 0x6e, - 0x47, 0x5e, 0x5f, 0xae, - 0xd1, 0x90, 0x7c, 0x93, 0xd6, 0xe1, 0x6b, 0x5c, 0x89, 0xd7, 0xb4, 0x5d, - 0xd4, 0xbc, 0x2c, 0xb6, - 0x8b, 0x95, 0xf8, 0x80, 0x3c, 0xf4, 0x23, 0x61, 0x37, 0xfa, 0x0e, 0x7f, - 0x87, 0xff, 0x0c, 0xbe, - 0xe2, 0xff, 0x49, 0x7e, 0xbe, 0xc2, 0x7f, 0xe7, 0xff, 0xc1, 0x7f, 0xc5, - 0x7f, 0x0d, 0xbf, 0xc2, - 0x5f, 0xa1, 0x7f, 0xe1, 0x7f, 0xe2, 0xaf, 0xf1, 0x57, 0xf8, 0x1b, 0xfc, - 0xdf, 0xe8, 0x1b, 0xfc, - 0x35, 0x69, 0xdf, 0xe0, 0x6f, 0xc9, 0xef, 0x5f, 0xe3, 0x7f, 0xe0, 0x7f, - 0xe1, 0x6f, 0xd0, 0xb7, - 0x7d, 0xed, 0xdf, 0xf8, 0x3f, 0xf8, 0xdf, 0xe4, 0x33, 0xdf, 0x26, 0x3e, - 0x83, 0xbe, 0x26, 0xed, - 0x1b, 0x81, 0xfc, 0xce, 0x93, 0xdf, 0x85, 0x7f, 0x23, 0xf2, 0x17, 0xe4, - 0x33, 0xff, 0x36, 0xdb, - 0x7f, 0xf8, 0xff, 0xa0, 0x7f, 0xf3, 0xdf, 0x92, 0x7f, 0xfb, 0x0f, 0xfa, - 0x0f, 0xfe, 0x0f, 0x39, - 0xfb, 0xff, 0xa0, 0xff, 0xc5, 0xf4, 0x1a, 0xfe, 0xb7, 0xef, 0xf8, 0x5d, - 0xff, 0x71, 0x14, 0x3f, - 0xff, 0x0d, 0xc9, 0x15, 0x99, 0xe7, 0xfd, 0x96, 0x5c, 0x09, 0xb9, 0x0e, - 0xfe, 0x6b, 0xf2, 0xff, - 0xc4, 0xb5, 0x7c, 0x05, 0xe9, 0xf9, 0xbf, 0x35, 0xfb, 0xf0, 0x2d, 0xfa, - 0x6f, 0xb3, 0xfd, 0x9b, - 0x1e, 0xc9, 0x2b, 0xda, 0xab, 0xef, 0xf0, 0xff, 0x5f, 0x7e, 0xfe, 0x6f, - 0xd8, 0xcf, 0xff, 0x0e, - 0xf9, 0x79, 0x1b, 0x63, 0x34, 0x35, 0xea, 0xaa, 0x4f, 0x68, 0x4a, 0xc5, - 0x4c, 0x91, 0x5e, 0xd6, - 0x3f, 0x07, 0x50, 0x66, 0x9e, 0xee, 0xb6, 0x30, 0x07, 0x0a, 0x21, 0xad, - 0x79, 0x6b, 0xa5, 0xbe, - 0x9e, 0x2b, 0x32, 0xca, 0xdc, 0xb7, 0x6c, 0xf9, 0x26, 0xc1, 0x84, 0x0e, - 0x93, 0xce, 0x1f, 0x6e, - 0x95, 0xa7, 0x5b, 0xad, 0xbf, 0x6c, 0xc5, 0xe7, 0xd5, 0x77, 0xdd, 0x28, - 0xa7, 0x71, 0xbc, 0x14, - 0x8b, 0xf4, 0x02, 0x26, 0xd3, 0xfe, 0xc1, 0x34, 0x7e, 0xcd, 0xac, 0xf3, - 0x95, 0x65, 0x6f, 0xc6, - 0xef, 0x63, 0x6f, 0xda, 0x11, 0xba, 0xde, 0x81, 0xe4, 0x9b, 0x58, 0xf0, - 0x85, 0xcf, 0x43, 0xbf, - 0x30, 0xe7, 0xfe, 0xbf, 0x84, 0x8d, 0x7c, 0xbd, 0x26, 0x4a, 0x92, 0x1a, - 0x90, 0x64, 0x55, 0x25, - 0x47, 0x51, 0x0a, 0x28, 0xa2, 0xc0, 0x2b, 0x12, 0x2f, 0x68, 0xb2, 0xa0, - 0x69, 0xaa, 0x20, 0x69, - 0x01, 0x21, 0xa0, 0x06, 0x04, 0x51, 0x85, 0x58, 0xd0, 0x30, 0xe6, 0x34, - 0x0e, 0x23, 0x0d, 0xf3, - 0xbc, 0x8a, 0x04, 0xa8, 0x41, 0xd2, 0x78, 0x01, 0xab, 0x9c, 0x00, 0x54, - 0x5e, 0x60, 0x55, 0x46, - 0x80, 0x0a, 0x12, 0x59, 0x85, 0x13, 0x39, 0x85, 0xbc, 0x27, 0x43, 0x01, - 0xcb, 0xd8, 0x3c, 0xf2, - 0xe4, 0xc8, 0xcb, 0x40, 0x84, 0x32, 0x14, 0x05, 0x19, 0x61, 0x10, 0x20, - 0x7f, 0x26, 0x93, 0x37, - 0x65, 0x01, 0x63, 0x99, 0xc7, 0xf4, 0x3d, 0xd8, 0xf7, 0x1a, 0xcb, 0x1c, - 0xe6, 0xc8, 0x6b, 0xf2, - 0x1e, 0xc2, 0xb2, 0x88, 0x44, 0x99, 0x47, 0x01, 0x25, 0x80, 0x45, 0x45, - 0xc2, 0xb2, 0x22, 0x63, - 0x55, 0x93, 0xb1, 0xac, 0x89, 0x98, 0x5c, 0x1b, 0xd6, 0x14, 0x15, 0x6b, - 0xaa, 0x8a, 0x15, 0x55, - 0xc1, 0x92, 0x2a, 0xe3, 0x00, 0x69, 0xba, 0xaa, 0x91, 0xdf, 0x03, 0x58, - 0x26, 0x47, 0x43, 0x51, - 0xc8, 0xdf, 0xa8, 0x58, 0x25, 0x47, 0x85, 0xfc, 0x1e, 0x54, 0x62, 0x38, - 0x2a, 0xc7, 0x51, 0x54, - 0x36, 0x50, 0x47, 0xe0, 0x1e, 0xbc, 0x45, 0xba, 0x1b, 0x6f, 0x0b, 0x6c, - 0xc6, 0x1b, 0xa5, 0x5e, - 0xbc, 0x59, 0xba, 0x1b, 0xdd, 0x4d, 0x5e, 0xdf, 0x2d, 0x6d, 0xc2, 0xf7, - 0x04, 0xb6, 0xa0, 0x2d, - 0xd2, 0x56, 0xbc, 0x4d, 0x7a, 0x10, 0x3f, 0x10, 0xd8, 0x86, 0xef, 0x93, - 0xee, 0xc7, 0xf7, 0x91, - 0xe3, 0x36, 0x89, 0xb6, 0xfb, 0xf0, 0xbd, 0xd2, 0xbd, 0x78, 0xbb, 0xb4, - 0x1d, 0xdf, 0x2b, 0xde, - 0x8f, 0xef, 0x17, 0xc9, 0xe7, 0xc8, 0xf1, 0x01, 0xf1, 0x21, 0xf4, 0x80, - 0xb8, 0x03, 0x3d, 0x22, - 0x3e, 0x8c, 0x1e, 0x16, 0x77, 0x08, 0x8f, 0x8a, 0x8f, 0x90, 0xf6, 0xa8, - 0xf0, 0xa0, 0xf8, 0xa0, - 0xf9, 0xfa, 0x31, 0xf2, 0xde, 0x13, 0xe2, 0x13, 0xc2, 0xe3, 0xa4, 0x3d, - 0x21, 0x3e, 0x2d, 0x3c, - 0x23, 0x3e, 0x29, 0x3e, 0x2d, 0x3d, 0x43, 0x7e, 0x9e, 0x93, 0x9e, 0x11, - 0x9f, 0x93, 0x9e, 0x95, - 0x7e, 0x26, 0x3c, 0x27, 0xbd, 0x20, 0xbc, 0x20, 0xbd, 0x28, 0xbc, 0x20, - 0x3e, 0x2f, 0xbc, 0x44, - 0x8f, 0xa4, 0xfd, 0x82, 0xbc, 0x7e, 0x9e, 0x1c, 0x5f, 0x11, 0x5f, 0x15, - 0x76, 0x0a, 0xaf, 0x92, - 0xff, 0xbf, 0x22, 0xbd, 0x4c, 0x8e, 0xbb, 0x84, 0x5d, 0xe2, 0x6b, 0xc2, - 0x6e, 0xf1, 0x75, 0x61, - 0xb7, 0xb4, 0x47, 0xd8, 0x27, 0xee, 0x15, 0xf6, 0x0a, 0x6f, 0x9a, 0xed, - 0x0d, 0x61, 0xbf, 0xf0, - 0x16, 0xff, 0xb6, 0xf0, 0x96, 0xf0, 0x8e, 0x40, 0xff, 0xff, 0x9e, 0xf0, - 0x3e, 0xf9, 0xf9, 0x80, - 0x1c, 0xdf, 0xe3, 0xdf, 0x43, 0xbf, 0x14, 0xde, 0x47, 0x1f, 0xf0, 0x1f, - 0x20, 0xf2, 0x1b, 0x7e, - 0x97, 0xff, 0x98, 0xac, 0x61, 0xff, 0xc1, 0x6f, 0x0b, 0x57, 0x40, 0x27, - 0xcd, 0x07, 0x32, 0xd7, - 0x5b, 0x0b, 0xf9, 0x26, 0xd4, 0x7e, 0xb7, 0xa2, 0xeb, 0x89, 0x76, 0x40, - 0x75, 0x90, 0xac, 0x75, - 0xdd, 0x8c, 0x4a, 0x9f, 0x2b, 0x6b, 0x2d, 0xa5, 0xf4, 0x1a, 0x56, 0x72, - 0x1d, 0x7c, 0x67, 0x3f, - 0x17, 0xea, 0xf7, 0x15, 0xa4, 0xf1, 0x87, 0x7f, 0x1f, 0xfb, 0xb0, 0x26, - 0xc6, 0xa4, 0x00, 0xe6, - 0xae, 0xce, 0xd7, 0x48, 0xbd, 0x3f, 0xf5, 0xfe, 0xc1, 0xd6, 0xf2, 0x4d, - 0x72, 0x3e, 0x26, 0x56, - 0xf7, 0xb0, 0x48, 0xa3, 0xf7, 0x27, 0xfb, 0x4d, 0x5c, 0x2d, 0x69, 0xf2, - 0x4d, 0x92, 0xeb, 0xe0, - 0x67, 0xf1, 0x85, 0x97, 0x0b, 0x1c, 0xfe, 0x86, 0x27, 0x8c, 0x80, 0x7f, - 0x11, 0xf3, 0xda, 0x7a, - 0x11, 0x85, 0x81, 0xc4, 0xa9, 0x04, 0xa1, 0x48, 0xe3, 0x54, 0xbf, 0xec, - 0x55, 0xbd, 0x22, 0xd0, - 0x81, 0xc8, 0x18, 0xac, 0xe8, 0x37, 0x18, 0xa1, 0x3e, 0xc8, 0x8a, 0xc0, - 0xa8, 0x17, 0x7c, 0x46, - 0x3d, 0xbf, 0xc1, 0xa8, 0xe5, 0xeb, 0x8c, 0x1a, 0x7e, 0xad, 0xb1, 0x96, - 0xb4, 0xf5, 0xe2, 0xda, - 0xe0, 0x6a, 0xb1, 0xc6, 0x58, 0x27, 0xae, 0x09, 0xae, 0x15, 0x37, 0x18, - 0x35, 0xe2, 0x1a, 0xe3, - 0x2e, 0x71, 0xb5, 0x7e, 0x17, 0x7f, 0xa7, 0xb1, 0x8a, 0xbf, 0x43, 0x5f, - 0x89, 0xef, 0x50, 0xd7, - 0x88, 0xeb, 0xd4, 0x3b, 0xc5, 0xbb, 0xd4, 0x55, 0xc2, 0x2a, 0xf5, 0x4e, - 0xbc, 0x52, 0x5d, 0x81, - 0xef, 0x52, 0xef, 0xe4, 0xd7, 0xa8, 0x2b, 0xf1, 0x32, 0x75, 0x25, 0xbf, - 0x5c, 0x5d, 0xc5, 0xaf, - 0x52, 0x57, 0xf0, 0xcb, 0xd4, 0xdb, 0xf9, 0x95, 0xea, 0xad, 0xf4, 0x88, - 0x6f, 0x57, 0x97, 0xf1, - 0xb7, 0xa9, 0x37, 0xf1, 0xb7, 0xa8, 0x37, 0xe1, 0xa5, 0xea, 0x32, 0x74, - 0xb3, 0xba, 0x14, 0xdf, - 0xaa, 0x2e, 0x47, 0x2b, 0xb4, 0xdb, 0xd0, 0xcd, 0xda, 0x2d, 0xe8, 0x36, - 0x72, 0x5c, 0x66, 0x2c, - 0xc3, 0xb7, 0x19, 0x2b, 0xf0, 0x72, 0x63, 0x15, 0x5e, 0x69, 0xdc, 0x46, - 0xda, 0x2a, 0xf2, 0xfb, - 0xcd, 0xf8, 0x26, 0x6d, 0x29, 0x26, 0x9f, 0xc1, 0xb7, 0x6a, 0xb7, 0xe2, - 0x65, 0xe4, 0xb8, 0x54, - 0xbf, 0x85, 0x5f, 0x6a, 0xdc, 0xc4, 0x2f, 0xd5, 0x6f, 0xc5, 0x37, 0xea, - 0xd7, 0xe3, 0x5b, 0xf4, - 0x9b, 0xd1, 0x52, 0xfd, 0x36, 0x74, 0x3b, 0x69, 0xb7, 0xe9, 0xcb, 0xc9, - 0x7b, 0x4b, 0xf1, 0x6d, - 0xea, 0x75, 0xe8, 0x26, 0x6d, 0x09, 0xfa, 0x89, 0xfa, 0x13, 0xf4, 0x53, - 0xfd, 0x5a, 0x74, 0x83, - 0xbe, 0x04, 0x5d, 0xab, 0x5f, 0x87, 0xae, 0xd3, 0xaf, 0x27, 0xaf, 0x6f, - 0x24, 0x7f, 0x73, 0x3b, - 0x5a, 0x6a, 0x5c, 0x8b, 0xaf, 0x27, 0x7f, 0x7f, 0xa3, 0x7e, 0x13, 0xba, - 0x49, 0xbf, 0x89, 0x1c, - 0x6f, 0xe4, 0x6f, 0xd0, 0xaf, 0x25, 0xed, 0x3a, 0xfe, 0x06, 0xed, 0x5a, - 0x7e, 0x89, 0x76, 0x15, - 0x69, 0xd7, 0xf1, 0x3f, 0xd5, 0xae, 0xc6, 0xd7, 0x69, 0x37, 0xe2, 0x1b, - 0x48, 0x5b, 0xa2, 0xfd, - 0x54, 0x5c, 0xa2, 0x2f, 0x11, 0x6f, 0xd0, 0x6f, 0x10, 0xaf, 0x53, 0xaf, - 0x15, 0xae, 0x57, 0xaf, - 0x27, 0xc7, 0x25, 0xc2, 0x8d, 0xea, 0x12, 0x71, 0x89, 0x46, 0x5e, 0x6b, - 0xd7, 0x8a, 0x37, 0x68, - 0x37, 0x8b, 0xb7, 0xe9, 0x4b, 0xc9, 0xf1, 0x06, 0xd2, 0x6e, 0x15, 0x6f, - 0x25, 0xaf, 0x6f, 0xd1, - 0x97, 0x89, 0xcb, 0xf5, 0xdb, 0xc5, 0xdb, 0xb5, 0xdb, 0xc5, 0x95, 0xda, - 0x32, 0x91, 0xf4, 0x45, - 0x24, 0x7d, 0x11, 0x97, 0x92, 0x23, 0x7d, 0xef, 0x36, 0xe5, 0x56, 0x61, - 0xa9, 0x72, 0x9d, 0x70, - 0x33, 0x39, 0x2e, 0x53, 0x96, 0x91, 0xe3, 0xcd, 0xe2, 0x2a, 0x85, 0xbe, - 0x7f, 0x87, 0xb8, 0x52, - 0x59, 0x29, 0xac, 0x51, 0x56, 0x89, 0xcb, 0x95, 0xdb, 0x85, 0xe5, 0xca, - 0x0a, 0xf2, 0xfb, 0x6a, - 0x61, 0xb5, 0xb2, 0x5a, 0xbc, 0x43, 0x59, 0x2b, 0xd6, 0x28, 0xf5, 0x62, - 0x9d, 0xb2, 0x41, 0x58, - 0x2d, 0xd7, 0xa2, 0x1a, 0x79, 0x1d, 0xae, 0x91, 0xd7, 0xe0, 0x3b, 0x8c, - 0x35, 0xf8, 0x4e, 0x65, - 0x25, 0xee, 0xe5, 0x7f, 0x8b, 0x29, 0x2b, 0xbe, 0x57, 0x3c, 0x12, 0x50, - 0x5f, 0x83, 0x59, 0x23, - 0x9d, 0x62, 0x07, 0xf5, 0x67, 0x35, 0x56, 0xd6, 0x25, 0x72, 0x22, 0x87, - 0xe5, 0xfd, 0x53, 0xff, - 0x3b, 0xd5, 0xf5, 0xb2, 0xc6, 0xb2, 0x3b, 0xb8, 0xca, 0x68, 0xa9, 0x27, - 0xab, 0x9f, 0x8d, 0xf0, - 0x0e, 0xa7, 0x91, 0x93, 0xfd, 0x1a, 0x90, 0x99, 0x87, 0xd6, 0x58, 0x51, - 0x9b, 0xa9, 0x9e, 0x0b, - 0xc5, 0xf5, 0x6c, 0xda, 0x76, 0xbf, 0x2f, 0x3c, 0x97, 0x31, 0xab, 0x09, - 0x5e, 0x54, 0x08, 0x0e, - 0xe6, 0xde, 0xb4, 0xc3, 0xeb, 0xb9, 0x24, 0xfc, 0x26, 0xc3, 0x62, 0xac, - 0xd3, 0xe4, 0x9b, 0x1c, - 0x60, 0xad, 0xfa, 0x83, 0x58, 0xbb, 0x26, 0xa1, 0xf7, 0x3b, 0xb2, 0xe4, - 0x9b, 0x14, 0x1a, 0xe9, - 0x73, 0x10, 0xf3, 0xf0, 0x4f, 0xf0, 0xaf, 0xf8, 0xef, 0xf8, 0xef, 0x84, - 0x0f, 0x70, 0x83, 0xb6, - 0x46, 0xf4, 0xeb, 0x86, 0x20, 0xeb, 0x92, 0xa0, 0xc8, 0x62, 0x20, 0xa0, - 0xe0, 0x00, 0x50, 0xc4, - 0x80, 0x28, 0x83, 0x80, 0x48, 0x5e, 0x43, 0x55, 0x0c, 0x20, 0x1d, 0x89, - 0xbc, 0x2e, 0x90, 0x86, - 0x44, 0x48, 0x30, 0xd1, 0xa7, 0xb3, 0x22, 0xab, 0x73, 0xa2, 0x4f, 0xf3, - 0x88, 0x5e, 0xad, 0x5e, - 0xf0, 0x68, 0x5e, 0x72, 0xf4, 0x8a, 0x8c, 0xe6, 0x13, 0x58, 0x0d, 0x09, - 0x9c, 0xe6, 0x17, 0x3c, - 0xba, 0x8f, 0x70, 0xc4, 0x3a, 0x5c, 0xab, 0x7b, 0xb0, 0x5f, 0xf1, 0x0b, - 0x3e, 0x85, 0x60, 0xa7, - 0xea, 0x11, 0x3c, 0x8a, 0x97, 0xf7, 0x29, 0x75, 0xbc, 0x47, 0xad, 0xc7, - 0x35, 0x6a, 0x9d, 0xb0, - 0x56, 0x59, 0x27, 0xac, 0x57, 0xea, 0x84, 0x3a, 0xf2, 0x6f, 0x1b, 0xd4, - 0x1a, 0xa1, 0x86, 0xfc, - 0xbe, 0x4e, 0x59, 0x23, 0x6c, 0x20, 0x9f, 0xdf, 0xa0, 0xac, 0x35, 0xdb, - 0x7a, 0xa5, 0x16, 0xaf, - 0x51, 0xd6, 0xe1, 0x3a, 0xf2, 0x37, 0xb5, 0xda, 0x06, 0x54, 0xa7, 0xd5, - 0xa1, 0x3a, 0xb5, 0x06, - 0xaf, 0x51, 0xd7, 0xa2, 0x75, 0x6a, 0x0d, 0xaa, 0x57, 0xeb, 0x91, 0x47, - 0xdd, 0x80, 0x37, 0x90, - 0xf3, 0x6d, 0x50, 0xd7, 0xd1, 0x7f, 0x43, 0xab, 0x95, 0x35, 0x78, 0x9d, - 0xb2, 0x16, 0xd7, 0x2a, - 0x6b, 0xf9, 0x35, 0xda, 0x06, 0x91, 0xbc, 0x2f, 0xac, 0x55, 0xd7, 0x08, - 0xeb, 0xc9, 0x9c, 0x5f, - 0xad, 0xd4, 0x90, 0xf7, 0x37, 0xa0, 0x5a, 0xad, 0x06, 0xad, 0xd7, 0x6a, - 0xd1, 0x06, 0xbd, 0x1e, - 0xb3, 0xe4, 0xf5, 0x06, 0x6d, 0x35, 0x5a, 0x47, 0xbe, 0x7b, 0xbd, 0xbe, - 0x0e, 0x6f, 0xd0, 0x37, - 0x90, 0xf7, 0x6b, 0x50, 0x9d, 0x5e, 0x87, 0xea, 0x35, 0x2f, 0xf9, 0x77, - 0x7a, 0x24, 0xfd, 0x21, - 0x9f, 0xab, 0xd1, 0xc9, 0xf9, 0x34, 0x1f, 0xb9, 0xfe, 0x5a, 0x61, 0x83, - 0x46, 0xae, 0x59, 0x5b, - 0x23, 0xd4, 0x91, 0xe3, 0x6a, 0x7d, 0xb5, 0xb0, 0x41, 0x27, 0x7d, 0xd2, - 0xd7, 0x93, 0x7e, 0xaf, - 0xc7, 0x35, 0x7a, 0x1d, 0xae, 0xd3, 0x6b, 0xf8, 0x0d, 0xfa, 0x5a, 0xa1, - 0x56, 0xaf, 0x15, 0xd6, - 0x90, 0xfe, 0x91, 0x3e, 0xf2, 0xeb, 0x49, 0xab, 0xd1, 0xe8, 0xfb, 0xf5, - 0x42, 0xbd, 0x5e, 0x43, - 0x9a, 0x97, 0xf7, 0x92, 0xf1, 0xf2, 0x93, 0xef, 0xf5, 0x92, 0xef, 0xf5, - 0xe9, 0x5e, 0x32, 0x7e, - 0x5e, 0x9e, 0xd5, 0x11, 0x8f, 0x74, 0x20, 0x30, 0xba, 0x4f, 0xa8, 0xd3, - 0x3d, 0x3c, 0xa7, 0x93, - 0x71, 0x24, 0x8d, 0xd3, 0x59, 0xc1, 0xab, 0x33, 0xb0, 0x56, 0xaf, 0x81, - 0x3e, 0x72, 0xe4, 0x74, - 0x0e, 0x01, 0xd2, 0x07, 0x4e, 0x63, 0x11, 0xa3, 0xf9, 0x79, 0xa4, 0x41, - 0x9e, 0xd7, 0x39, 0x9e, - 0x21, 0x47, 0xfa, 0x1a, 0xeb, 0x80, 0x7c, 0x0f, 0xe4, 0xa1, 0x2e, 0x0a, - 0xa2, 0x2e, 0x0b, 0xaa, - 0xae, 0x10, 0x5e, 0xcf, 0x13, 0x9e, 0x2c, 0x10, 0x2e, 0xcc, 0xf3, 0x01, - 0x4d, 0xe0, 0x91, 0x8a, - 0xd0, 0x1d, 0xaa, 0x97, 0x7f, 0x9a, 0xff, 0x1a, 0x7f, 0x8d, 0x7f, 0x87, - 0x03, 0x7c, 0x39, 0x72, - 0x44, 0x5d, 0x1e, 0x67, 0xac, 0xb4, 0x7e, 0x20, 0x47, 0xa3, 0x8f, 0x13, - 0x26, 0xf6, 0x56, 0x74, - 0xf8, 0x6c, 0xd4, 0x6f, 0x22, 0x15, 0x72, 0x15, 0x8d, 0xae, 0xba, 0xac, - 0xf5, 0xa5, 0x08, 0x07, - 0xa8, 0x0c, 0x17, 0x67, 0xdb, 0x0f, 0x08, 0x15, 0x87, 0x9d, 0xde, 0xec, - 0xf5, 0xa5, 0x8a, 0xac, - 0xef, 0x15, 0x6f, 0xda, 0x8d, 0x99, 0xf7, 0x37, 0x29, 0xa7, 0xb5, 0x90, - 0x83, 0x36, 0x5f, 0xc6, - 0x7c, 0x93, 0x9c, 0xee, 0xc3, 0xda, 0x77, 0x7d, 0x72, 0x11, 0x38, 0xb4, - 0x71, 0xbc, 0x7d, 0xba, - 0x5e, 0x43, 0x69, 0x5d, 0xda, 0x7a, 0x2e, 0x7d, 0x7e, 0x13, 0xb3, 0xce, - 0x97, 0xf6, 0xff, 0xee, - 0xde, 0xb4, 0x09, 0x3b, 0x22, 0x2f, 0xf5, 0xfe, 0xc1, 0xcd, 0x7d, 0xb9, - 0xf2, 0x64, 0x6d, 0x19, - 0x9e, 0x6f, 0x92, 0xcf, 0x9f, 0x8c, 0x5f, 0xa0, 0xd8, 0x87, 0xff, 0x81, - 0x77, 0x10, 0x2e, 0x00, - 0x74, 0x4d, 0x32, 0x34, 0x45, 0x90, 0x35, 0x4d, 0x50, 0x74, 0x62, 0x03, - 0x6b, 0x5c, 0x00, 0x2a, - 0xaa, 0x18, 0x0c, 0x20, 0x09, 0x04, 0x38, 0x09, 0x2a, 0x50, 0x22, 0x36, - 0xad, 0x28, 0x11, 0x70, - 0x94, 0x14, 0x41, 0xc0, 0x64, 0xae, 0x88, 0xc4, 0xe6, 0x84, 0x1a, 0xcb, - 0xfb, 0x35, 0x1f, 0xf2, - 0xe9, 0x3e, 0x48, 0xb0, 0x0e, 0x91, 0x39, 0x89, 0xbc, 0x3a, 0x0b, 0x15, - 0xad, 0x09, 0x85, 0xc9, - 0xdc, 0xf2, 0x93, 0x79, 0xea, 0x31, 0x7c, 0x04, 0x0b, 0x39, 0x62, 0x1b, - 0xfb, 0x08, 0x76, 0x31, - 0x7c, 0xbd, 0xea, 0x41, 0x35, 0x04, 0x6f, 0xea, 0x09, 0xbe, 0xd4, 0x6a, - 0xb5, 0x78, 0xad, 0xb6, - 0x1a, 0xaf, 0xd6, 0x09, 0x4e, 0xe9, 0xab, 0xf9, 0x55, 0xda, 0x4a, 0x7e, - 0xb5, 0xb6, 0x5a, 0xb8, - 0x4b, 0xbf, 0x93, 0xbf, 0x83, 0xbc, 0x5e, 0xa3, 0xad, 0xc5, 0x77, 0x69, - 0xeb, 0x79, 0x1f, 0xb1, - 0xbd, 0xa1, 0xb6, 0x81, 0x7c, 0xfe, 0x2e, 0xbc, 0x46, 0xbb, 0x13, 0xdf, - 0xa1, 0xdd, 0x81, 0xc8, - 0xdf, 0xa0, 0x3b, 0x8d, 0xd5, 0x70, 0xa5, 0xb6, 0x0a, 0x12, 0x4c, 0x44, - 0x04, 0x87, 0x21, 0xc1, - 0x56, 0x5c, 0xaf, 0xfa, 0xe9, 0xf7, 0x12, 0x5b, 0xbe, 0x86, 0x5f, 0xa7, - 0xad, 0x27, 0x18, 0x56, - 0xc3, 0xdf, 0xa9, 0xdf, 0x4e, 0x78, 0xe0, 0x6d, 0x84, 0x4f, 0xae, 0x10, - 0x48, 0xe3, 0x57, 0xca, - 0xcb, 0xd0, 0x3a, 0x59, 0x40, 0x7e, 0xc5, 0x87, 0xea, 0x15, 0x0f, 0x26, - 0xb8, 0x89, 0x6a, 0x55, - 0x3f, 0xe2, 0x55, 0x86, 0x7c, 0xcf, 0x3a, 0xca, 0x3b, 0xd1, 0x2d, 0xea, - 0xad, 0x26, 0xdf, 0x5c, - 0xaa, 0xde, 0x82, 0x6e, 0x55, 0x97, 0xe1, 0xdb, 0xb5, 0x95, 0x68, 0x05, - 0xe5, 0x8a, 0xda, 0x0a, - 0x7c, 0x3b, 0xf9, 0xbe, 0xdb, 0x75, 0xc2, 0x59, 0x75, 0xc2, 0x57, 0xb5, - 0xa5, 0x84, 0x83, 0xdd, - 0x22, 0xdc, 0xa2, 0xac, 0x12, 0x28, 0x96, 0x13, 0x3c, 0xe4, 0xeb, 0x09, - 0xbe, 0xd7, 0x29, 0x3e, - 0xec, 0x25, 0xfd, 0x5b, 0xad, 0x2c, 0x17, 0x56, 0x28, 0x2b, 0x08, 0xb7, - 0x5c, 0xca, 0x93, 0xef, - 0xe1, 0x6f, 0x22, 0x9f, 0x5d, 0xa6, 0xdc, 0x46, 0x1b, 0xe1, 0xb8, 0x2b, - 0x84, 0x55, 0xca, 0x1d, - 0xfc, 0x1d, 0xea, 0x6a, 0xbc, 0x82, 0x70, 0xe1, 0x3b, 0x49, 0x9f, 0xef, - 0x20, 0xd8, 0x7f, 0x17, - 0xc5, 0x68, 0xd2, 0xd7, 0x1a, 0x0d, 0x11, 0x5e, 0x0e, 0xb1, 0x4f, 0x5d, - 0xcf, 0xaf, 0x53, 0xd7, - 0x92, 0xcf, 0xad, 0xe2, 0xd7, 0x12, 0x3c, 0x5f, 0x43, 0x70, 0x7d, 0x95, - 0x5a, 0x8b, 0x81, 0x06, - 0x08, 0xde, 0x31, 0x98, 0xd1, 0x59, 0x82, 0xcd, 0x1c, 0xc1, 0x33, 0x84, - 0xfd, 0xe4, 0x88, 0x55, - 0x91, 0xbc, 0xae, 0x21, 0x63, 0xb9, 0x8e, 0x60, 0x68, 0x1d, 0x5f, 0x43, - 0xf0, 0xb5, 0xd6, 0xa0, - 0x63, 0xe2, 0xe1, 0xc9, 0x3a, 0x85, 0x13, 0x58, 0x0e, 0x31, 0x50, 0x39, - 0x1e, 0x6a, 0x7e, 0xfa, - 0x1d, 0xc8, 0x27, 0xfb, 0x31, 0x08, 0x10, 0xac, 0x35, 0x6a, 0xd1, 0xed, - 0x81, 0x46, 0xfc, 0x36, - 0xfe, 0x27, 0x79, 0x3a, 0xde, 0x40, 0x97, 0x6a, 0x2e, 0x7f, 0x59, 0x7f, - 0xbe, 0x49, 0x52, 0x0d, - 0x14, 0x57, 0xb3, 0xab, 0x96, 0x3e, 0x5f, 0xce, 0x86, 0x4a, 0x73, 0xff, - 0xa7, 0xca, 0x78, 0x65, - 0x5d, 0xb6, 0x98, 0xad, 0x7c, 0xad, 0xcc, 0x4f, 0x31, 0x26, 0xab, 0x9e, - 0x1e, 0x75, 0x7a, 0xb2, - 0xc7, 0xc8, 0x1c, 0x40, 0xed, 0x9a, 0x21, 0xfb, 0x07, 0x0f, 0xaf, 0x97, - 0x9e, 0x7e, 0x7f, 0x93, - 0x31, 0x6b, 0x58, 0x19, 0xd7, 0x04, 0x1b, 0xf8, 0x5e, 0xf6, 0xe5, 0xec, - 0xaf, 0xf3, 0x95, 0x4a, - 0x5f, 0x4b, 0xca, 0x37, 0xa9, 0xc8, 0x96, 0x6f, 0x42, 0xf7, 0xf0, 0xc9, - 0xf5, 0x9e, 0xd5, 0xf2, - 0x18, 0xeb, 0x76, 0x0c, 0xab, 0x83, 0x9f, 0x32, 0xdf, 0x44, 0x3e, 0x92, - 0xdb, 0x86, 0xa9, 0x6f, - 0xe1, 0x1f, 0xf8, 0x71, 0xc5, 0x10, 0x58, 0xdd, 0x10, 0x23, 0x7a, 0x48, - 0x0a, 0x6b, 0x86, 0x14, - 0xd4, 0x34, 0x31, 0x14, 0xe4, 0x02, 0xf5, 0xea, 0xc6, 0xc0, 0x9f, 0x84, - 0x3e, 0x9f, 0x02, 0x3f, - 0xa0, 0x99, 0xa3, 0xff, 0xe1, 0xff, 0xcd, 0xfd, 0x47, 0xf8, 0xd6, 0xff, - 0x8d, 0xf8, 0x1f, 0xf6, - 0x7f, 0xf8, 0xff, 0x66, 0xbf, 0x91, 0xbe, 0x66, 0xbf, 0x96, 0xbe, 0xf2, - 0xff, 0x4b, 0xfe, 0x87, - 0xff, 0x6f, 0xca, 0x3f, 0xd9, 0xbf, 0x6a, 0x5f, 0x70, 0x9f, 0x69, 0x7f, - 0xf4, 0x3f, 0xa7, 0x8b, - 0x40, 0x32, 0x02, 0x18, 0xab, 0x98, 0xa7, 0xba, 0x20, 0xe5, 0x1f, 0xeb, - 0x09, 0x6f, 0x6b, 0xd3, - 0xde, 0xe1, 0xff, 0x2e, 0xff, 0x93, 0xfd, 0xa7, 0xfc, 0x2f, 0xff, 0x3f, - 0x03, 0xdf, 0xb0, 0xdf, - 0x4a, 0x5f, 0x73, 0x5f, 0x49, 0xff, 0xe4, 0xfe, 0x29, 0xff, 0x93, 0xfb, - 0x87, 0xf2, 0x77, 0xee, - 0xaf, 0xf2, 0x5f, 0xd0, 0xdf, 0xa4, 0xbf, 0xf3, 0x7f, 0x0f, 0xfc, 0x0d, - 0xfd, 0x97, 0xfc, 0x27, - 0xf8, 0x5b, 0xed, 0x7d, 0xff, 0x27, 0xea, 0xc7, 0xf0, 0x7e, 0x55, 0xe6, - 0xfd, 0x04, 0xa3, 0x42, - 0xfa, 0xf3, 0xe8, 0x73, 0xe5, 0xaf, 0xf8, 0x5f, 0xc2, 0x57, 0xf8, 0x1f, - 0xd2, 0xdf, 0xc0, 0x5f, - 0xe4, 0x3f, 0xf8, 0x7f, 0xa3, 0x7f, 0xca, 0x35, 0x05, 0xeb, 0x04, 0x3a, - 0xb7, 0x19, 0x85, 0x11, - 0xfd, 0x2a, 0x8b, 0x19, 0xcd, 0x4b, 0xb8, 0x66, 0x9d, 0x54, 0xa7, 0x78, - 0x08, 0x27, 0x63, 0x84, - 0xa7, 0xd4, 0x3f, 0xc0, 0x3f, 0x06, 0xfe, 0x8b, 0xfb, 0xb3, 0xf4, 0x7b, - 0xf8, 0x47, 0xe9, 0x8f, - 0xe8, 0x53, 0xed, 0x57, 0x60, 0xbf, 0x16, 0x85, 0x1e, 0x8d, 0x23, 0x5c, - 0xa9, 0x1e, 0xd7, 0x69, - 0x1e, 0xc4, 0xe8, 0x7e, 0x24, 0xab, 0x00, 0xaf, 0xd6, 0xbc, 0xfc, 0x83, - 0xf2, 0x8b, 0xe8, 0x55, - 0x61, 0x0f, 0x7c, 0x4d, 0x7c, 0x0d, 0xee, 0x11, 0x5e, 0x87, 0x3b, 0x85, - 0x5d, 0x70, 0x97, 0xfc, - 0x1a, 0x7c, 0x55, 0x7d, 0x05, 0xbe, 0x18, 0x78, 0x0d, 0xec, 0x96, 0x76, - 0xe3, 0xd7, 0xc5, 0x5d, - 0xe2, 0x4e, 0xf1, 0x25, 0xfc, 0x82, 0xf8, 0x0b, 0xfc, 0xb4, 0xf4, 0x2c, - 0xff, 0x73, 0xed, 0x6e, - 0x81, 0x55, 0x37, 0x08, 0x75, 0x01, 0xc2, 0xe3, 0x14, 0x80, 0xa1, 0xc2, - 0xa0, 0x0d, 0xc6, 0x1a, - 0x21, 0xa2, 0x3e, 0x2e, 0xec, 0xd0, 0x1e, 0x86, 0x8f, 0x28, 0x3b, 0xd0, - 0xc3, 0x81, 0x27, 0xf0, - 0xd3, 0x81, 0xc7, 0xf9, 0xa7, 0x02, 0x4f, 0xf0, 0x4f, 0x06, 0x9e, 0xe4, - 0x9f, 0x94, 0x9e, 0x14, - 0x1f, 0x97, 0x1e, 0xc1, 0x3b, 0x02, 0x8f, 0xc0, 0x87, 0xa4, 0xc7, 0xd1, - 0xe3, 0xe2, 0x23, 0xe8, - 0x61, 0xfe, 0x31, 0xfc, 0x90, 0xf2, 0x20, 0xfe, 0xb9, 0xf6, 0x18, 0xd6, - 0xf4, 0x84, 0xce, 0xda, - 0x13, 0xb8, 0x97, 0xdf, 0x2e, 0x3c, 0x22, 0x3c, 0x26, 0xed, 0x90, 0x1e, - 0x0a, 0xec, 0x40, 0x3b, - 0xa4, 0x87, 0xf9, 0x07, 0x95, 0x46, 0xe4, 0x53, 0x21, 0x46, 0x9a, 0x84, - 0x79, 0xd2, 0x67, 0xa0, - 0x02, 0x81, 0x55, 0x44, 0xc8, 0x1b, 0x08, 0x0a, 0x84, 0x6b, 0xb3, 0x5a, - 0x07, 0x4f, 0xfe, 0x0a, - 0x3f, 0x24, 0x6d, 0xe7, 0xef, 0x0f, 0xdc, 0x8f, 0xef, 0x97, 0xef, 0xe7, - 0x1f, 0x90, 0xb7, 0xe3, - 0x2d, 0x81, 0x2d, 0xe8, 0x6e, 0x79, 0x2b, 0xda, 0x26, 0xdf, 0x87, 0xb6, - 0x2a, 0xf7, 0x08, 0x5b, - 0x95, 0xfb, 0xf0, 0xdd, 0xca, 0x3d, 0x60, 0xb3, 0xda, 0x0d, 0x5b, 0xe5, - 0x16, 0xb4, 0x51, 0xdd, - 0x0e, 0x7a, 0x94, 0xf5, 0xd8, 0xa3, 0xb4, 0xe2, 0xfd, 0xfc, 0x5f, 0xf0, - 0x5f, 0xd0, 0xa3, 0xe8, - 0x0c, 0x62, 0x57, 0x8d, 0x88, 0x73, 0x52, 0xfb, 0x7c, 0x0d, 0x04, 0x0b, - 0x9d, 0x4d, 0xa4, 0x35, - 0x3a, 0xeb, 0x2a, 0x09, 0x27, 0x2c, 0x4f, 0xda, 0x77, 0x66, 0x78, 0x5c, - 0x72, 0x81, 0x56, 0xc6, - 0x54, 0x18, 0x05, 0x4c, 0x36, 0x0d, 0x8b, 0xae, 0xe3, 0xf6, 0x40, 0xf6, - 0x18, 0x19, 0xeb, 0xfb, - 0xb0, 0xa6, 0xd7, 0xb0, 0xcc, 0x3a, 0xf8, 0x6a, 0x31, 0x4b, 0xe7, 0xfa, - 0x48, 0x5f, 0xc1, 0xd0, - 0x3a, 0xf8, 0x84, 0xbf, 0xfa, 0xad, 0x6b, 0x58, 0xf9, 0x3e, 0x4b, 0xf8, - 0xa7, 0xd9, 0x39, 0xab, - 0xba, 0xde, 0x98, 0x71, 0xc1, 0x62, 0x7e, 0x7e, 0xf6, 0x7c, 0x93, 0xe2, - 0x11, 0xf9, 0x26, 0x87, - 0xb2, 0x4e, 0xf7, 0xb0, 0x7a, 0x3e, 0x75, 0x59, 0xb0, 0x14, 0x96, 0xc4, - 0xdc, 0xf5, 0xce, 0x78, - 0x52, 0xbe, 0x49, 0xe3, 0x8c, 0xba, 0x38, 0xff, 0x8d, 0x89, 0x6b, 0xaf, - 0xa8, 0x41, 0xc1, 0x1b, - 0xd2, 0x85, 0x78, 0x30, 0x26, 0x34, 0x68, 0x0d, 0x62, 0x5c, 0x8b, 0x48, - 0x71, 0x82, 0x7f, 0x75, - 0x81, 0x88, 0xf8, 0x3b, 0x82, 0x79, 0x0f, 0x47, 0x04, 0xbf, 0xa2, 0x21, - 0x0e, 0x68, 0x08, 0x60, - 0x05, 0x02, 0x7f, 0x00, 0x40, 0x21, 0xa4, 0x03, 0x23, 0x24, 0xb3, 0x7e, - 0xb5, 0x86, 0x23, 0x98, - 0x01, 0x7c, 0x5a, 0x3d, 0xa8, 0xd7, 0xea, 0xb9, 0x1a, 0x63, 0x3d, 0xb7, - 0x56, 0x5f, 0xc3, 0xdd, - 0xa2, 0xaf, 0xe6, 0x90, 0xf6, 0x53, 0xee, 0x54, 0xed, 0x7a, 0xc2, 0x05, - 0x65, 0x41, 0x33, 0x64, - 0xac, 0x68, 0x04, 0xbb, 0x8c, 0x3b, 0x89, 0xbd, 0xb5, 0x1f, 0xbd, 0xdb, - 0xd0, 0xc3, 0xb5, 0xc7, - 0xbb, 0x7c, 0xcd, 0xa1, 0x06, 0x36, 0x2a, 0x47, 0xb8, 0xb0, 0x16, 0x25, - 0x2d, 0x06, 0x1a, 0xd5, - 0x38, 0x8c, 0x2a, 0x31, 0x10, 0x57, 0xa3, 0x30, 0x22, 0x87, 0x51, 0x58, - 0x09, 0xe3, 0x68, 0x30, - 0x04, 0xa5, 0x68, 0x33, 0x1b, 0xd7, 0x2e, 0x87, 0x67, 0x2b, 0x37, 0x62, - 0x8a, 0x55, 0xd1, 0x60, - 0x1b, 0x6c, 0x52, 0xba, 0x71, 0x87, 0xdc, 0x8e, 0x3b, 0x94, 0x36, 0xd8, - 0xa6, 0x34, 0x82, 0x06, - 0xa3, 0xc1, 0x1f, 0x8c, 0xf5, 0x10, 0xbc, 0x5d, 0xc7, 0x7b, 0x14, 0x96, - 0x87, 0x06, 0x2b, 0x00, - 0x95, 0xe5, 0x19, 0x99, 0x60, 0x00, 0xc1, 0x81, 0x1a, 0x72, 0xfe, 0x9f, - 0xa9, 0xdb, 0x50, 0xaf, - 0xd4, 0x05, 0x3a, 0x02, 0x3d, 0xdc, 0x66, 0xbd, 0x07, 0xc4, 0x8c, 0x10, - 0xb8, 0x33, 0xb8, 0x04, - 0x1a, 0x41, 0x3f, 0xf2, 0x18, 0x5e, 0xd2, 0xea, 0x08, 0x87, 0xc2, 0xbc, - 0x3f, 0xb8, 0x16, 0xdf, - 0xa3, 0xfc, 0x8d, 0xfb, 0x34, 0xb4, 0xdb, 0xff, 0xae, 0xfc, 0x36, 0xfb, - 0x96, 0xfc, 0x36, 0xb7, - 0x3f, 0xf0, 0x3a, 0xb7, 0x57, 0xda, 0xc7, 0xee, 0x0b, 0xbc, 0xc1, 0xee, - 0x0f, 0xec, 0xe5, 0x76, - 0xca, 0x7b, 0xfc, 0xbb, 0x03, 0xbb, 0xb8, 0xdd, 0xf2, 0x2e, 0x82, 0xa1, - 0xef, 0xb2, 0x6f, 0x05, - 0x77, 0x71, 0x1f, 0x69, 0x3f, 0x83, 0xeb, 0x84, 0xab, 0xf0, 0x6d, 0xb2, - 0x87, 0xf7, 0xca, 0x0c, - 0xb1, 0x39, 0x89, 0xbd, 0xaa, 0xad, 0xe6, 0x39, 0x65, 0x87, 0xf0, 0x72, - 0xe4, 0x45, 0xf6, 0xf9, - 0xc8, 0x4b, 0xcc, 0xce, 0xd0, 0x7e, 0xff, 0x9b, 0xfa, 0x5b, 0xdc, 0x3b, - 0xca, 0x9b, 0xec, 0x5b, - 0xca, 0xdb, 0xdc, 0xdb, 0xca, 0xbb, 0xec, 0x2f, 0xa5, 0x77, 0xe1, 0x9b, - 0x81, 0xfd, 0x70, 0x9f, - 0xb2, 0x87, 0x7d, 0x53, 0x7e, 0xdf, 0xff, 0xa1, 0xf6, 0x11, 0xfb, 0x9e, - 0xf6, 0x82, 0xff, 0xd5, - 0xf0, 0xeb, 0x6c, 0x50, 0x59, 0x86, 0xd7, 0x99, 0xfc, 0x8f, 0x45, 0xbf, - 0xd0, 0xbe, 0x04, 0xbf, - 0xd7, 0xfe, 0x00, 0xff, 0x1c, 0xf8, 0x23, 0xfa, 0xb5, 0xfa, 0x29, 0xfa, - 0x52, 0xfa, 0x12, 0xbd, - 0x2d, 0x2f, 0x05, 0x35, 0xaa, 0x8a, 0x25, 0xc2, 0xc3, 0x55, 0x55, 0xc4, - 0xa2, 0x86, 0x78, 0x41, - 0x0f, 0xf0, 0xaa, 0xce, 0xe1, 0x5a, 0x32, 0x4e, 0xcf, 0x45, 0xde, 0x64, - 0x7e, 0xaf, 0xfc, 0xc9, - 0xf7, 0xb1, 0xfa, 0x11, 0xf7, 0x2b, 0xe5, 0x33, 0xee, 0x0b, 0xf1, 0x37, - 0xe0, 0x0b, 0xfe, 0xb7, - 0xe0, 0x37, 0xc2, 0x6f, 0xd1, 0xef, 0x84, 0xdf, 0xa1, 0xdf, 0x08, 0x5f, - 0xa0, 0x5f, 0x8b, 0x9f, - 0xa0, 0x4f, 0x84, 0x5f, 0xa1, 0x8f, 0xf8, 0xf7, 0xf9, 0xb7, 0xf4, 0x5f, - 0x90, 0xeb, 0xfc, 0x80, - 0x79, 0x48, 0xf4, 0x80, 0x3b, 0x03, 0x00, 0xb3, 0x0a, 0x83, 0xfd, 0xd2, - 0x46, 0xfc, 0x5b, 0xfc, - 0x07, 0xfc, 0x39, 0xbe, 0x07, 0xcd, 0x4a, 0xfd, 0x7c, 0xa3, 0x7c, 0xea, - 0x6b, 0x30, 0x4a, 0x19, - 0x3a, 0x3f, 0x68, 0xcd, 0x93, 0x4a, 0xc2, 0x07, 0x4d, 0x1c, 0x8c, 0x96, - 0x7b, 0x4a, 0x93, 0xf3, - 0x76, 0x09, 0x27, 0x29, 0xd4, 0xcb, 0x99, 0xb2, 0x6c, 0x76, 0x2d, 0x8d, - 0x11, 0x24, 0xf8, 0x97, - 0x55, 0x4f, 0x1a, 0xd5, 0x7e, 0x8b, 0x59, 0xec, 0x46, 0x3e, 0xe1, 0x83, - 0xa5, 0xfc, 0x35, 0xd3, - 0xfe, 0x26, 0x14, 0xef, 0xa9, 0xad, 0x9a, 0x2d, 0xdf, 0x24, 0x5b, 0xcc, - 0x6a, 0xb2, 0xaf, 0x23, - 0x5f, 0xb7, 0x73, 0x87, 0xa6, 0x4e, 0x77, 0x52, 0xee, 0x9b, 0x05, 0xad, - 0x33, 0xcf, 0xdc, 0x57, - 0xbe, 0xaa, 0xa6, 0x3c, 0x5a, 0x51, 0x9f, 0x29, 0xdf, 0x24, 0x3f, 0x43, - 0x9d, 0xaf, 0x83, 0x15, - 0xdf, 0xdf, 0x57, 0xbb, 0x26, 0xab, 0x66, 0xd0, 0x17, 0x97, 0xc3, 0x9a, - 0xb8, 0xae, 0xd8, 0xd8, - 0xcb, 0x85, 0x8f, 0x4c, 0x5f, 0xef, 0x97, 0xf2, 0x66, 0xc1, 0x1f, 0x0e, - 0x09, 0xb1, 0x48, 0x54, - 0x68, 0x09, 0xc6, 0x85, 0x88, 0x1e, 0x91, 0x5a, 0xb4, 0x98, 0x84, 0x54, - 0x41, 0x7a, 0x19, 0x7d, - 0xc7, 0xef, 0x0f, 0x5e, 0xc6, 0x96, 0x87, 0xf2, 0xc1, 0xb8, 0x64, 0x1e, - 0x2d, 0x15, 0xe3, 0x89, - 0xd1, 0x69, 0x7c, 0x95, 0x91, 0xdf, 0xf7, 0x7b, 0x1e, 0xca, 0x0b, 0xe4, - 0xa1, 0x21, 0x9f, 0x91, - 0x8b, 0x60, 0xa5, 0x7e, 0x32, 0x62, 0xb5, 0x56, 0x5e, 0xd3, 0x14, 0x51, - 0x0b, 0x86, 0x04, 0x81, - 0xd8, 0xb9, 0x48, 0x7b, 0x15, 0x7e, 0x15, 0x7a, 0xc2, 0xbf, 0xa4, 0x6b, - 0x46, 0x7d, 0x45, 0x9b, - 0x8d, 0xc9, 0x57, 0xfa, 0xfa, 0x27, 0xe7, 0xc3, 0x7c, 0x95, 0x3c, 0x4b, - 0xc3, 0xf9, 0x3a, 0xad, - 0x2d, 0xa4, 0x15, 0xc0, 0x69, 0xd1, 0x0a, 0xae, 0x40, 0x3f, 0x09, 0xfa, - 0x65, 0xdd, 0xb4, 0xf1, - 0xee, 0x8d, 0xfc, 0xb8, 0xdf, 0x5f, 0x9f, 0x68, 0xf4, 0xef, 0x02, 0x79, - 0x70, 0x7e, 0xc3, 0x2a, - 0x66, 0x6b, 0xc3, 0x83, 0x7e, 0xa8, 0xad, 0x87, 0xac, 0x06, 0x44, 0xce, - 0x20, 0x76, 0xa0, 0xea, - 0x27, 0x76, 0xb3, 0x4f, 0x58, 0xa3, 0x37, 0xe0, 0xad, 0x4a, 0xe2, 0x3a, - 0xf3, 0xf4, 0x62, 0x60, - 0x0f, 0x15, 0x70, 0xf4, 0xb5, 0x4d, 0xbd, 0x1a, 0x35, 0x10, 0x9b, 0xd7, - 0x6f, 0x70, 0xc8, 0xaf, - 0xfb, 0xb0, 0x4f, 0x5b, 0x23, 0xb4, 0x12, 0x7c, 0xf9, 0x5f, 0x6d, 0x2b, - 0x73, 0x7a, 0xeb, 0x64, - 0x9f, 0x53, 0xb7, 0x71, 0x05, 0x6a, 0x3e, 0xc8, 0xd7, 0x0a, 0x41, 0x81, - 0x92, 0x0f, 0x68, 0xfd, - 0x8e, 0x3c, 0x29, 0x0f, 0x9a, 0x7d, 0x16, 0xc9, 0xbc, 0x0f, 0x39, 0xb8, - 0x29, 0xed, 0xd3, 0x7d, - 0x93, 0x3a, 0x4e, 0xf0, 0x1d, 0x1b, 0xca, 0x03, 0xd3, 0xc4, 0x9b, 0x31, - 0x24, 0xdf, 0x53, 0x43, - 0xf8, 0x26, 0x36, 0x36, 0x88, 0xb5, 0xea, 0x43, 0xfc, 0x6f, 0x23, 0x4f, - 0x70, 0x3f, 0x6d, 0x9d, - 0xc3, 0x4c, 0xd1, 0x4b, 0x40, 0x89, 0x6a, 0x47, 0x0e, 0xa5, 0x14, 0x17, - 0x29, 0x85, 0xb8, 0x50, - 0xb5, 0xa1, 0x42, 0xc5, 0x86, 0x6d, 0x72, 0x11, 0x2a, 0x10, 0x0a, 0x78, - 0x9b, 0x36, 0x1e, 0x1d, - 0xd5, 0x72, 0x9c, 0xef, 0xf8, 0xd6, 0xb9, 0x5e, 0x5b, 0x74, 0x82, 0xff, - 0x94, 0xd0, 0x34, 0xb6, - 0x5a, 0xb9, 0x02, 0x8b, 0x8a, 0x42, 0xb8, 0x9d, 0x81, 0x3a, 0x5b, 0xae, - 0xf1, 0x9e, 0xd9, 0x71, - 0x36, 0x73, 0x72, 0xfc, 0x68, 0xff, 0x82, 0xe0, 0x5c, 0xee, 0x08, 0xe3, - 0x08, 0xf6, 0x38, 0x63, - 0x16, 0x1b, 0x50, 0x63, 0x26, 0xfe, 0x05, 0x34, 0x05, 0x1b, 0x8a, 0x88, - 0x24, 0x32, 0xdc, 0x75, - 0x7a, 0x00, 0xed, 0xd7, 0x7f, 0xef, 0xef, 0xe8, 0xba, 0x6c, 0xc3, 0x05, - 0x1d, 0x17, 0xd7, 0x1e, - 0xdb, 0x30, 0x17, 0x1c, 0xae, 0x4d, 0x47, 0x87, 0x29, 0xf3, 0xd0, 0xc2, - 0xc0, 0x02, 0x3c, 0x4f, - 0x9a, 0x8b, 0xe6, 0x48, 0x33, 0xd1, 0xe1, 0xd2, 0x6c, 0x34, 0x43, 0x9c, - 0x07, 0xe7, 0xe2, 0x59, - 0x68, 0xb6, 0x3c, 0x0f, 0x4d, 0x8e, 0x9c, 0xe4, 0xb9, 0x33, 0xb2, 0x98, - 0xad, 0x92, 0xce, 0x02, - 0x77, 0x49, 0xab, 0xd0, 0xad, 0x81, 0x95, 0x18, 0x10, 0x0c, 0x94, 0xc5, - 0xe7, 0xf0, 0x6f, 0xc8, - 0xcf, 0x4b, 0x70, 0x09, 0x2e, 0x4c, 0x5f, 0xa3, 0x87, 0xab, 0x0c, 0x3b, - 0x3c, 0x66, 0xcd, 0x42, - 0x82, 0x1f, 0x14, 0x27, 0x2a, 0x62, 0x15, 0xf5, 0xb4, 0x51, 0x1c, 0x2c, - 0x0b, 0x97, 0x7a, 0x68, - 0x2c, 0x8d, 0xcd, 0x28, 0xf3, 0x39, 0x94, 0x7c, 0x36, 0x23, 0x57, 0x20, - 0xcf, 0x2a, 0xc5, 0xbf, - 0x82, 0x1c, 0xed, 0xc3, 0x3a, 0xc6, 0xfd, 0x16, 0xd3, 0xd6, 0x73, 0x19, - 0xcc, 0x37, 0x49, 0xb1, - 0x7f, 0xb0, 0xc5, 0xfa, 0x4d, 0x45, 0x5a, 0x21, 0x57, 0x10, 0x20, 0xcf, - 0x13, 0xe1, 0x51, 0x05, - 0x86, 0x9d, 0xad, 0xcc, 0x29, 0x2e, 0xe4, 0xa8, 0x9e, 0x4f, 0x7f, 0x9d, - 0x2f, 0x21, 0x4b, 0xbe, - 0x09, 0x79, 0xaf, 0x2a, 0x56, 0x52, 0x5f, 0x30, 0x7c, 0x3f, 0xb2, 0x31, - 0xd5, 0xb4, 0xb2, 0x5b, - 0xda, 0xb3, 0xba, 0x30, 0x38, 0xfa, 0x9a, 0x56, 0xf3, 0xf9, 0x27, 0x4c, - 0xec, 0xfb, 0xbb, 0xf4, - 0x33, 0xde, 0x08, 0xa9, 0x42, 0x5b, 0xb8, 0x51, 0x68, 0x26, 0x2d, 0x66, - 0x34, 0x08, 0x84, 0x8f, - 0x09, 0xb2, 0x16, 0x10, 0x9e, 0x13, 0xbe, 0xe3, 0xbf, 0x0d, 0x70, 0xc8, - 0x1e, 0xcc, 0x07, 0x13, - 0xa4, 0x89, 0xd2, 0x14, 0xde, 0xc5, 0x3b, 0xf9, 0x0a, 0x5c, 0x26, 0x4e, - 0xc3, 0xc7, 0x45, 0x4e, - 0x81, 0xa7, 0x84, 0x8e, 0x85, 0x53, 0x95, 0x4a, 0x58, 0x29, 0x4f, 0xe0, - 0xa7, 0x2b, 0x53, 0x84, - 0x2a, 0xd5, 0x29, 0x54, 0x92, 0x4f, 0x38, 0x50, 0x01, 0x2e, 0x97, 0x4f, - 0x80, 0x67, 0x2a, 0x17, - 0x41, 0x45, 0xbb, 0x87, 0x6f, 0xd6, 0x0c, 0x3e, 0xa4, 0x47, 0x05, 0x2d, - 0xc4, 0x89, 0x7c, 0xe0, - 0x25, 0xf0, 0xbf, 0xf2, 0xef, 0xfc, 0xfe, 0xee, 0xc3, 0x6b, 0x27, 0x74, - 0xcd, 0xad, 0x3b, 0x2c, - 0x3a, 0x01, 0xb8, 0xc4, 0x4a, 0xde, 0xad, 0x4e, 0xc0, 0x53, 0xd5, 0x49, - 0x60, 0xbc, 0xe4, 0x44, - 0xe5, 0x42, 0x19, 0x2e, 0x17, 0xca, 0x71, 0x09, 0x5f, 0x22, 0x94, 0x93, - 0x6f, 0x2c, 0xd1, 0x5d, - 0xec, 0xd1, 0xd1, 0x4b, 0xfc, 0x27, 0x68, 0xa7, 0x22, 0xaf, 0xd6, 0x80, - 0x02, 0x1a, 0x24, 0x7c, - 0x92, 0xe1, 0x7f, 0x11, 0x5b, 0xc9, 0x8d, 0x13, 0x2b, 0x91, 0x4b, 0x22, - 0x2d, 0xe0, 0x42, 0x2e, - 0x79, 0x22, 0x9e, 0xa9, 0x2d, 0x40, 0x33, 0xe3, 0x15, 0xcc, 0xa2, 0xa8, - 0xec, 0xff, 0x45, 0xf4, - 0x6e, 0x8e, 0x6a, 0x5a, 0x84, 0x7f, 0x21, 0x9e, 0xd8, 0xb3, 0x3e, 0xc2, - 0x89, 0xea, 0xf4, 0x16, - 0xf4, 0xbc, 0x32, 0x15, 0x95, 0xe8, 0x33, 0xe1, 0x51, 0xd1, 0xf9, 0xdc, - 0x64, 0xcd, 0xc9, 0x96, - 0xa8, 0x55, 0x60, 0xba, 0xfa, 0x43, 0x14, 0x53, 0x05, 0x84, 0x54, 0x09, - 0x49, 0x6a, 0x3d, 0xaa, - 0x97, 0x77, 0xa3, 0xef, 0x08, 0xaf, 0xbb, 0xb2, 0xdd, 0x55, 0x3b, 0x3e, - 0x36, 0x9e, 0x2b, 0x11, - 0x8b, 0xb1, 0x4d, 0x70, 0xf0, 0xa5, 0xe4, 0xda, 0x1c, 0x42, 0x21, 0x2e, - 0xe2, 0x69, 0x23, 0x98, - 0xc5, 0x17, 0x0a, 0xc5, 0x52, 0x05, 0xc1, 0xe6, 0x39, 0xde, 0x79, 0x1d, - 0xc7, 0xd4, 0x5f, 0xdf, - 0x70, 0xb5, 0xef, 0x34, 0x79, 0x25, 0x88, 0x12, 0x0e, 0xe6, 0xd7, 0x05, - 0x8c, 0x94, 0x0d, 0x78, - 0xbd, 0x42, 0x78, 0x53, 0xf8, 0x0d, 0xae, 0xae, 0x73, 0x9e, 0x67, 0x7c, - 0xb4, 0x1a, 0x38, 0xa4, - 0x42, 0xde, 0x2e, 0x94, 0x08, 0xc5, 0x7c, 0xb1, 0x58, 0x20, 0x10, 0xeb, - 0x41, 0x28, 0xe4, 0x8b, - 0x44, 0xbb, 0x60, 0x17, 0x08, 0x96, 0x0a, 0xa5, 0x78, 0x46, 0xe4, 0x78, - 0x78, 0x52, 0xc7, 0x02, - 0xaf, 0xa3, 0xc1, 0xe6, 0xbf, 0x50, 0xdb, 0x00, 0x6e, 0x92, 0x6e, 0xe7, - 0xe3, 0x5a, 0x9c, 0x60, - 0x9f, 0x84, 0xfd, 0x5a, 0x33, 0xba, 0xaf, 0xe9, 0x58, 0xef, 0x8c, 0x96, - 0x99, 0xbe, 0xea, 0x50, - 0x39, 0x53, 0xa1, 0x55, 0x10, 0xbe, 0x30, 0x91, 0x39, 0x26, 0x7c, 0x22, - 0xab, 0x69, 0x61, 0x1c, - 0xd2, 0x0d, 0xac, 0xea, 0x0a, 0xd6, 0x55, 0x05, 0x78, 0x74, 0x80, 0x7e, - 0x21, 0xfd, 0x83, 0x7b, - 0xa9, 0xfd, 0xfa, 0xfa, 0x05, 0xbd, 0xc7, 0xd4, 0xcc, 0x6f, 0x98, 0xe4, - 0x73, 0xcb, 0x0e, 0xa1, - 0x48, 0x2e, 0x12, 0x4a, 0x95, 0x4a, 0xa1, 0x52, 0x29, 0xe5, 0x89, 0x1d, - 0x47, 0x30, 0x86, 0x3c, - 0x5f, 0xb4, 0x21, 0x3b, 0xb6, 0x0b, 0x85, 0x30, 0xdf, 0x98, 0xc0, 0x9d, - 0x11, 0xba, 0xd1, 0x7f, - 0x8c, 0x74, 0x14, 0x64, 0xf4, 0x2e, 0xe4, 0x0f, 0x5c, 0x83, 0x7e, 0x28, - 0x5f, 0x8b, 0xee, 0x52, - 0x75, 0x08, 0xb4, 0x0d, 0x28, 0x22, 0xbe, 0x8c, 0x3f, 0xc1, 0xbf, 0xc2, - 0x0f, 0xa2, 0x93, 0x70, - 0x2a, 0xec, 0xa2, 0xba, 0x5e, 0x65, 0xd0, 0x36, 0x64, 0x7f, 0x13, 0xea, - 0x13, 0xa1, 0xb5, 0xf1, - 0x28, 0x16, 0x9a, 0x18, 0x18, 0x29, 0xf3, 0x94, 0x86, 0x49, 0x23, 0xf6, - 0x64, 0x71, 0x9f, 0x7d, - 0x9c, 0x52, 0x2b, 0x24, 0xf3, 0x8e, 0x7e, 0x3e, 0x2f, 0x87, 0x35, 0xa9, - 0x2d, 0xe5, 0x79, 0xa5, - 0xd5, 0xb0, 0x92, 0xfc, 0x26, 0x0d, 0xee, 0xba, 0x8c, 0xfb, 0x07, 0x9b, - 0xf9, 0x26, 0xd9, 0xf3, - 0x39, 0xcc, 0x3a, 0x08, 0x66, 0xed, 0x67, 0x1b, 0x5b, 0x14, 0xb2, 0xb3, - 0xe5, 0x66, 0xae, 0x7c, - 0x86, 0x3d, 0x37, 0x47, 0x53, 0xe7, 0x2b, 0x57, 0xfb, 0x72, 0x06, 0x8a, - 0x53, 0xe4, 0x03, 0x26, - 0xef, 0x1f, 0x3c, 0x34, 0xdf, 0xc4, 0x8c, 0x0d, 0x48, 0x97, 0x6f, 0x92, - 0xe3, 0x9a, 0xd4, 0xb6, - 0xe1, 0x35, 0xa9, 0xd3, 0xd4, 0x5b, 0x48, 0xce, 0x71, 0x69, 0x20, 0xd8, - 0xf7, 0xad, 0xf0, 0x1a, - 0xdf, 0x18, 0x54, 0x84, 0xc6, 0x70, 0xbb, 0xd8, 0x16, 0x6e, 0x15, 0xda, - 0x22, 0x6d, 0x42, 0x93, - 0xd1, 0x24, 0x84, 0x42, 0x06, 0x7a, 0x34, 0xf0, 0x57, 0xfc, 0xa5, 0xd4, - 0x84, 0x8e, 0xd2, 0xf3, - 0xa0, 0x4b, 0x9c, 0x28, 0x54, 0xf0, 0x15, 0x92, 0x9b, 0xe0, 0x91, 0x43, - 0x76, 0x0b, 0xb3, 0x8d, - 0x45, 0xc2, 0x49, 0xe1, 0x85, 0x68, 0x7a, 0x60, 0x02, 0xae, 0x14, 0x5c, - 0x42, 0xb5, 0x34, 0x1e, - 0xbb, 0xc5, 0x72, 0x54, 0x2a, 0x11, 0xcc, 0x12, 0x0b, 0xe0, 0x78, 0x6d, - 0x06, 0xfc, 0x51, 0x78, - 0x03, 0xac, 0x37, 0x36, 0xc2, 0x4d, 0x46, 0x0c, 0x37, 0x18, 0x71, 0xdc, - 0x18, 0x14, 0xb1, 0x10, - 0x7a, 0x04, 0x7d, 0x13, 0xf8, 0x0d, 0xdb, 0xd0, 0x7e, 0x52, 0x9d, 0xbb, - 0x67, 0x41, 0xed, 0x9c, - 0x86, 0x09, 0x8c, 0x53, 0x2e, 0x41, 0xe5, 0xa2, 0x0b, 0x8e, 0xd7, 0xa7, - 0xc0, 0x6a, 0xd9, 0x09, - 0x4b, 0xf9, 0x52, 0x58, 0x2c, 0x94, 0xa0, 0x12, 0xd2, 0x8a, 0xa5, 0x12, - 0x5c, 0x66, 0x54, 0xa0, - 0xf9, 0xb1, 0xc5, 0x2c, 0x17, 0xae, 0xe3, 0xee, 0x50, 0x5a, 0x70, 0xa3, - 0x86, 0x91, 0x68, 0xc8, - 0x04, 0xa3, 0x04, 0xe1, 0x8d, 0xd8, 0x5a, 0xc2, 0xdd, 0x08, 0xee, 0x89, - 0x4e, 0xe4, 0x56, 0xaa, - 0xe1, 0x34, 0x7d, 0x1e, 0x58, 0x18, 0x5b, 0xe8, 0x3b, 0x3c, 0x78, 0x18, - 0xb1, 0xb1, 0xc6, 0xa1, - 0x0b, 0x23, 0x06, 0xdc, 0x1e, 0xee, 0x05, 0x3c, 0xb1, 0xcd, 0x03, 0x9a, - 0x86, 0x05, 0x1d, 0x61, - 0xc6, 0xe8, 0x42, 0x2f, 0xeb, 0x33, 0xe0, 0x74, 0xe3, 0x28, 0x30, 0xd7, - 0x98, 0x08, 0xca, 0x94, - 0x52, 0x50, 0x15, 0x9c, 0x05, 0xa6, 0x19, 0xe7, 0xa1, 0x26, 0x43, 0x42, - 0xb2, 0x2c, 0xa2, 0x3a, - 0xa3, 0x8e, 0xfb, 0x58, 0xf9, 0xd2, 0xbf, 0xb6, 0x69, 0xbc, 0xaf, 0xb2, - 0x71, 0x06, 0x53, 0x15, - 0x28, 0x83, 0x0e, 0xa1, 0x94, 0x2f, 0x17, 0x2b, 0xf8, 0x4a, 0x91, 0x8e, - 0x44, 0x19, 0xef, 0x10, - 0xed, 0x7c, 0x59, 0xa0, 0x98, 0x77, 0xa8, 0x55, 0xe8, 0xb0, 0xf0, 0x6c, - 0x66, 0x6e, 0xd3, 0x29, - 0xf5, 0xa7, 0xb6, 0x7a, 0xbd, 0x2d, 0x0d, 0xab, 0x38, 0x5e, 0x09, 0x21, - 0x60, 0x40, 0x1e, 0x29, - 0x5e, 0xe4, 0x95, 0xbb, 0xc1, 0xbb, 0xca, 0xfb, 0xac, 0xda, 0x72, 0x94, - 0xcf, 0xd9, 0x32, 0xcd, - 0x37, 0x81, 0x8c, 0x53, 0x05, 0xc1, 0x6b, 0xa7, 0xe4, 0xc4, 0xe5, 0xa2, - 0x83, 0x27, 0x3f, 0xc8, - 0x2e, 0x38, 0x50, 0x05, 0x69, 0x65, 0xbc, 0x13, 0xcc, 0x08, 0x1d, 0xe3, - 0x3f, 0xad, 0xf9, 0x78, - 0xef, 0xc4, 0xa6, 0x99, 0xbe, 0x73, 0x43, 0x06, 0x78, 0xce, 0x68, 0xc0, - 0x21, 0x2d, 0x26, 0xc8, - 0xba, 0x86, 0x69, 0xe3, 0x09, 0x1e, 0xdd, 0x17, 0x39, 0xda, 0x3f, 0x3d, - 0x34, 0x85, 0x73, 0xcb, - 0x6e, 0xe0, 0x52, 0x26, 0xc0, 0x99, 0xa1, 0xd9, 0xcc, 0x09, 0xc1, 0x45, - 0x9c, 0xa1, 0xb7, 0xf2, - 0x0d, 0x7a, 0x23, 0x8e, 0x6a, 0x51, 0x1e, 0x07, 0x65, 0xee, 0x59, 0xe9, - 0xf7, 0xe0, 0xcd, 0x08, - 0xf2, 0xce, 0xbb, 0x7b, 0x5e, 0xdd, 0xa2, 0xe6, 0x23, 0xbc, 0x93, 0xd5, - 0x0a, 0x58, 0x89, 0x5d, - 0x7c, 0x95, 0x34, 0x19, 0x4d, 0x0a, 0xb8, 0xc9, 0x35, 0x54, 0x22, 0xd2, - 0x1b, 0xb2, 0xd6, 0x94, - 0x62, 0x32, 0xee, 0x7c, 0x39, 0x3f, 0x0d, 0x57, 0x6a, 0x93, 0xc0, 0x59, - 0xc1, 0x45, 0xec, 0xf5, - 0x2a, 0x83, 0xef, 0x50, 0x5a, 0x41, 0x34, 0x28, 0xf2, 0xeb, 0xd4, 0xeb, - 0xd1, 0x65, 0xf2, 0x6d, - 0xf0, 0x0e, 0x0d, 0x41, 0x49, 0xe3, 0x91, 0x47, 0xf7, 0xe2, 0x4d, 0xd2, - 0x4e, 0xfc, 0x1e, 0xfe, - 0x25, 0x79, 0x8e, 0xaa, 0x47, 0xce, 0x3b, 0x62, 0x03, 0x55, 0x18, 0x85, - 0xbe, 0x34, 0xf3, 0x0d, - 0x9a, 0x58, 0x68, 0xf2, 0xc2, 0x52, 0x6f, 0x69, 0x98, 0x34, 0x7a, 0x0c, - 0x95, 0xf8, 0x4a, 0x0c, - 0x87, 0xcf, 0xde, 0x3f, 0x5f, 0xfa, 0x6d, 0x4a, 0x32, 0xd7, 0xa9, 0xff, - 0xc1, 0x5a, 0xfd, 0xa6, - 0xc2, 0x43, 0x5a, 0xbb, 0xc6, 0xcc, 0xf3, 0x8a, 0x14, 0x7b, 0x32, 0xe6, - 0x9b, 0x10, 0x7b, 0x3f, - 0x5b, 0x6e, 0x19, 0xad, 0x81, 0x60, 0x0b, 0x0f, 0xd6, 0x83, 0xc9, 0x54, - 0xcf, 0x65, 0x94, 0x35, - 0xad, 0xbc, 0x59, 0xc7, 0xe4, 0x80, 0xf6, 0xa6, 0x1d, 0x9e, 0x6f, 0x62, - 0x63, 0x69, 0x3e, 0x37, - 0xed, 0x7f, 0xda, 0x7a, 0x2e, 0x14, 0xd7, 0xfb, 0xec, 0xf7, 0xec, 0x79, - 0x3f, 0x56, 0xf7, 0xac, - 0x1e, 0xfd, 0x5e, 0x73, 0x11, 0x82, 0x7f, 0x4f, 0x6a, 0x2c, 0xdf, 0x1c, - 0xe9, 0x14, 0x5b, 0x83, - 0x1d, 0x62, 0x47, 0xa4, 0x5d, 0xe8, 0x8a, 0xf6, 0x10, 0x1e, 0xd8, 0xc0, - 0xdf, 0x1f, 0xf8, 0x3b, - 0xf8, 0x4e, 0x6a, 0x45, 0x53, 0xb5, 0x3c, 0x50, 0x1a, 0x98, 0x24, 0xb8, - 0xc9, 0xac, 0x9f, 0x22, - 0xcc, 0x84, 0xf3, 0xf8, 0xd9, 0xe0, 0x78, 0xf5, 0x5c, 0x78, 0x59, 0xec, - 0x02, 0xb8, 0x28, 0x34, - 0x17, 0x54, 0xd3, 0xb9, 0xa7, 0x4e, 0xc6, 0xd5, 0x5a, 0x25, 0xac, 0x56, - 0x26, 0x73, 0x93, 0xe4, - 0xc9, 0x60, 0xaa, 0x36, 0x95, 0x5b, 0x10, 0xbf, 0x85, 0x8b, 0xc5, 0xda, - 0xe0, 0x46, 0xbd, 0x03, - 0x37, 0x86, 0xda, 0x70, 0x5b, 0xa8, 0x01, 0x35, 0x84, 0xb6, 0xc0, 0x3f, - 0xcb, 0xff, 0x61, 0x22, - 0x9d, 0x47, 0x78, 0x9d, 0xbd, 0x87, 0xd5, 0xcd, 0x6f, 0x9c, 0xe1, 0x9b, - 0xa8, 0x8d, 0x87, 0x53, - 0x02, 0xd3, 0xe1, 0x2c, 0xed, 0x30, 0x6e, 0x9a, 0x36, 0x01, 0x54, 0x2a, - 0x15, 0xb0, 0x2c, 0x50, - 0x8a, 0xca, 0x03, 0x15, 0xb0, 0x44, 0xb1, 0x41, 0x97, 0x36, 0x85, 0x9b, - 0x1d, 0x3b, 0x93, 0x5d, - 0x11, 0xf9, 0x09, 0xd0, 0xd4, 0x56, 0xd4, 0x4c, 0xe6, 0xbf, 0x66, 0x04, - 0x91, 0x18, 0x52, 0x60, - 0x40, 0x91, 0x85, 0x5f, 0xc6, 0xd6, 0x13, 0xfe, 0x3c, 0x01, 0x8f, 0x97, - 0x26, 0xe1, 0xc3, 0x28, - 0xf6, 0x45, 0x17, 0xfa, 0x0f, 0x8f, 0x4e, 0x63, 0xc6, 0xcb, 0x04, 0x8b, - 0xc5, 0x62, 0xf3, 0xd9, - 0x38, 0xa9, 0x41, 0x64, 0x9f, 0x88, 0xf7, 0x70, 0x5e, 0x62, 0x13, 0x6a, - 0xba, 0x88, 0xa1, 0xd1, - 0x09, 0x7f, 0x1e, 0x39, 0x06, 0xcc, 0x31, 0x66, 0x71, 0x6e, 0xb1, 0x04, - 0x56, 0x2a, 0x13, 0xe1, - 0x44, 0x6d, 0x32, 0x98, 0xa0, 0x9d, 0x0b, 0x5b, 0x08, 0xf7, 0x43, 0x1a, - 0x87, 0x36, 0xc9, 0xff, - 0x07, 0x1e, 0x6f, 0x70, 0xd7, 0xbb, 0x1a, 0xa6, 0x72, 0xd3, 0x54, 0x27, - 0x2c, 0x0a, 0x38, 0xa0, - 0x43, 0x2a, 0x85, 0x25, 0x92, 0x1d, 0xda, 0xa5, 0x42, 0x98, 0x47, 0xb0, - 0x75, 0x9c, 0x98, 0x67, - 0xda, 0xda, 0xae, 0xd0, 0x1c, 0x76, 0x76, 0xd3, 0x51, 0xbe, 0x33, 0x1a, - 0x4e, 0x62, 0x7f, 0x64, - 0xe8, 0xd8, 0xd0, 0x54, 0xaa, 0xbd, 0x11, 0x9b, 0x97, 0xd8, 0x9e, 0x5a, - 0x04, 0xbd, 0x13, 0xfc, - 0x3d, 0xdb, 0xde, 0x7c, 0x9c, 0xc7, 0xd1, 0x38, 0x9e, 0x99, 0x18, 0xa8, - 0x44, 0x04, 0x47, 0x39, - 0x82, 0x9f, 0xd0, 0x46, 0xb8, 0x5e, 0x3e, 0x4f, 0x56, 0x70, 0xba, 0x86, - 0x93, 0xd7, 0x05, 0xa4, - 0x15, 0xab, 0x33, 0xd0, 0xc2, 0xc6, 0x23, 0xfd, 0x87, 0x35, 0x1d, 0xe6, - 0x3d, 0x23, 0x72, 0x3b, - 0x68, 0x52, 0x1f, 0xe7, 0xe3, 0x04, 0xeb, 0x75, 0x5d, 0x45, 0x7a, 0x50, - 0xc6, 0x5a, 0x30, 0x84, - 0xa5, 0xe0, 0x26, 0xfc, 0x10, 0xc1, 0x6f, 0x47, 0x80, 0xf0, 0x70, 0xb2, - 0x2a, 0xb9, 0x88, 0x2d, - 0x3b, 0x3b, 0x34, 0xc9, 0x3f, 0x5b, 0x39, 0x16, 0x86, 0xf4, 0x16, 0x1c, - 0x35, 0x9a, 0x71, 0xdc, - 0x08, 0xe0, 0x6d, 0xd2, 0x37, 0xe8, 0xcb, 0x30, 0xf6, 0x1d, 0x75, 0xcf, - 0x61, 0xeb, 0x8f, 0x6b, - 0x3f, 0xaa, 0x7e, 0x82, 0x5a, 0x04, 0x8a, 0x02, 0x36, 0x5c, 0x12, 0x28, - 0x07, 0x25, 0x22, 0xc1, - 0x5c, 0xb2, 0x76, 0xf7, 0x6b, 0x0b, 0x94, 0x03, 0x14, 0xf1, 0xc5, 0xb8, - 0x5c, 0x99, 0x06, 0x4e, - 0x8b, 0x5c, 0x0d, 0x2e, 0xd1, 0x4f, 0x04, 0x77, 0x6a, 0x51, 0x14, 0x26, - 0xe7, 0x16, 0x83, 0x06, - 0xc1, 0xbb, 0xeb, 0x50, 0x8d, 0x72, 0x15, 0xba, 0x53, 0x0d, 0x20, 0x44, - 0xec, 0x69, 0x41, 0xe3, - 0x61, 0x9d, 0xce, 0xc0, 0x1e, 0x69, 0x37, 0xda, 0x87, 0x2f, 0x1b, 0x69, - 0x8f, 0x18, 0xe5, 0x0c, - 0xad, 0xa3, 0x90, 0x8d, 0x77, 0x50, 0xdc, 0x28, 0x22, 0xf3, 0xdb, 0xa6, - 0xda, 0xfd, 0xf4, 0x35, - 0xc1, 0x41, 0xb3, 0x95, 0x04, 0x4b, 0x7c, 0x0e, 0x62, 0x1f, 0x9b, 0x5a, - 0xa1, 0x52, 0xcc, 0x96, - 0x87, 0x8a, 0x7d, 0xd9, 0xe6, 0x7a, 0x6e, 0xf7, 0x5b, 0xac, 0x18, 0xb5, - 0x86, 0x95, 0x6e, 0xff, - 0x60, 0x1a, 0xcb, 0x6c, 0xd6, 0x69, 0xe9, 0xf7, 0x15, 0xa4, 0xc9, 0xb1, - 0xa0, 0xb6, 0x2f, 0xad, - 0x83, 0x4f, 0x71, 0x30, 0xa3, 0xbe, 0x46, 0xd6, 0x85, 0xac, 0xb9, 0x6f, - 0xdf, 0xdf, 0x98, 0x24, - 0xea, 0x7c, 0x19, 0xc9, 0xf9, 0x26, 0x29, 0xeb, 0xaf, 0xf9, 0x68, 0xac, - 0x80, 0x4d, 0xca, 0xe3, - 0x32, 0xdd, 0x57, 0x6b, 0x39, 0x2e, 0x79, 0xa3, 0xaa, 0x49, 0xdd, 0x5f, - 0xd3, 0x2a, 0x88, 0xbf, - 0x43, 0x8f, 0x85, 0xc2, 0xa8, 0x37, 0xda, 0x85, 0x5b, 0x43, 0x9d, 0xb8, - 0x3b, 0xdc, 0x2b, 0xf4, - 0x84, 0x3b, 0xc5, 0x86, 0xf0, 0x76, 0xfc, 0x77, 0xfd, 0x65, 0x70, 0x51, - 0x28, 0x1f, 0x96, 0xcb, - 0x87, 0xe1, 0x2a, 0xd1, 0x2d, 0xba, 0xf8, 0x4a, 0xfc, 0x03, 0xf9, 0x68, - 0x38, 0x53, 0x9c, 0x85, - 0xe6, 0xca, 0x47, 0xa1, 0x13, 0xf5, 0xc5, 0x84, 0x5b, 0x5d, 0x0e, 0x2f, - 0x8f, 0x2e, 0x82, 0x67, - 0xc7, 0x3d, 0x10, 0x34, 0xae, 0xe6, 0xae, 0x8a, 0x1c, 0x07, 0x0e, 0xd3, - 0x89, 0x1d, 0x19, 0xba, - 0x90, 0x5b, 0x17, 0xed, 0x85, 0x3d, 0x04, 0xf3, 0xda, 0xb5, 0x66, 0x21, - 0x6e, 0xb4, 0xf1, 0x8d, - 0xe1, 0x20, 0x7e, 0x34, 0xf4, 0x7b, 0xee, 0xe1, 0x96, 0xf3, 0x3c, 0xae, - 0x8d, 0x73, 0xea, 0x16, - 0x34, 0xcf, 0xf2, 0x4d, 0x33, 0xca, 0xc1, 0x74, 0xfd, 0x7c, 0x6e, 0xba, - 0x4a, 0xb0, 0x2b, 0x38, - 0x87, 0x9b, 0x66, 0x54, 0x71, 0xb3, 0x8c, 0x79, 0xdc, 0x11, 0xc6, 0xd1, - 0xf0, 0x48, 0x6d, 0x11, - 0xbc, 0x48, 0xf9, 0x31, 0x3a, 0x47, 0x1f, 0x0f, 0x16, 0x87, 0x56, 0x71, - 0x72, 0x30, 0x86, 0x1a, - 0xb4, 0x28, 0x8e, 0xe8, 0x11, 0x62, 0xdf, 0x85, 0xb1, 0xae, 0x87, 0xa0, - 0xac, 0x04, 0xf0, 0xa7, - 0x21, 0x0f, 0xc1, 0xbf, 0x49, 0xc4, 0xe6, 0x9d, 0x8f, 0x8f, 0x0c, 0x1f, - 0xe5, 0x5f, 0x10, 0x9b, - 0xcd, 0x4c, 0xd4, 0xcb, 0x40, 0x99, 0x58, 0x46, 0x38, 0x65, 0x29, 0x2a, - 0x41, 0x76, 0x7e, 0x5c, - 0xa0, 0x00, 0xfe, 0xa4, 0xf1, 0x15, 0xe6, 0xdd, 0x48, 0x10, 0x00, 0x4d, - 0xe3, 0x15, 0xa3, 0x87, - 0x7f, 0xda, 0x38, 0x96, 0x60, 0x9e, 0x1b, 0x94, 0xc9, 0xd5, 0x60, 0x8a, - 0x3c, 0x11, 0x96, 0x4b, - 0x55, 0x60, 0xbc, 0x7c, 0x1e, 0x68, 0x57, 0x64, 0x14, 0x08, 0xee, 0x83, - 0xdf, 0x28, 0x5b, 0xd8, - 0x19, 0xb1, 0x32, 0xe6, 0x68, 0x75, 0x3a, 0x74, 0x0a, 0x65, 0xf0, 0x70, - 0xb5, 0xda, 0x5f, 0xa6, - 0xb8, 0x09, 0xdf, 0x1a, 0x0f, 0x26, 0xcb, 0x87, 0x73, 0x0b, 0xb5, 0x23, - 0xd8, 0x79, 0xca, 0x5c, - 0xff, 0xb1, 0xea, 0x62, 0xf6, 0xe8, 0xd0, 0x61, 0xec, 0xbc, 0xc8, 0x51, - 0xec, 0xfc, 0xd0, 0x12, - 0x14, 0xd6, 0xc2, 0xbc, 0xa2, 0x05, 0x71, 0x40, 0x97, 0x79, 0xa4, 0xf1, - 0xfc, 0x53, 0xe1, 0x8f, - 0xc1, 0xb6, 0xb6, 0x73, 0x3d, 0x25, 0xad, 0xd5, 0xbe, 0x69, 0x7a, 0x35, - 0x28, 0x97, 0x8a, 0xf1, - 0x0c, 0x6d, 0x3e, 0x74, 0xc9, 0x4e, 0x50, 0x1d, 0x98, 0x0c, 0xab, 0x03, - 0x13, 0xc1, 0x34, 0x79, - 0x16, 0x9c, 0xaf, 0xcc, 0x06, 0xd3, 0xe5, 0xb3, 0xc0, 0x55, 0x91, 0x8b, - 0xc0, 0x39, 0xf1, 0xa3, - 0xb8, 0x63, 0x42, 0x27, 0xb2, 0x67, 0xe8, 0x5e, 0x28, 0x19, 0x06, 0x96, - 0x43, 0x3a, 0x0a, 0xe8, - 0x41, 0x14, 0x09, 0xe9, 0x38, 0x66, 0x44, 0xb0, 0xac, 0x6d, 0xc3, 0x8f, - 0x6b, 0x6e, 0x98, 0x47, - 0x18, 0x9b, 0x43, 0x2c, 0xc7, 0x93, 0xb5, 0x19, 0x68, 0x8a, 0x52, 0x02, - 0x66, 0xca, 0x27, 0x00, - 0x43, 0x6f, 0x83, 0xb1, 0xb0, 0xce, 0xb7, 0x6b, 0x6f, 0x83, 0x6f, 0x95, - 0x2e, 0xee, 0xc4, 0x4d, - 0x87, 0x6d, 0x38, 0xb1, 0xf7, 0x84, 0xda, 0x59, 0x46, 0x25, 0x3b, 0x35, - 0x70, 0x04, 0x9c, 0xa2, - 0x4c, 0xe3, 0x66, 0xc8, 0xd3, 0xb8, 0xc3, 0x03, 0xb3, 0xd1, 0x2c, 0xe9, - 0x30, 0x74, 0xb8, 0x78, - 0x14, 0x9a, 0x47, 0x38, 0xdf, 0x4c, 0x7e, 0x06, 0x9a, 0x27, 0xcd, 0x47, - 0x47, 0x04, 0xcf, 0x82, - 0xe7, 0x06, 0x2f, 0x86, 0xcb, 0x94, 0x30, 0x6c, 0x30, 0x44, 0x72, 0x7e, - 0x11, 0x0a, 0xba, 0x0c, - 0x05, 0x63, 0x3d, 0xbc, 0x5d, 0x5b, 0x03, 0x79, 0x1d, 0x42, 0xa8, 0x63, - 0xc8, 0x6b, 0x08, 0x08, - 0x1a, 0x0b, 0x56, 0xea, 0xad, 0x60, 0x27, 0xbe, 0x60, 0x04, 0x2e, 0xd8, - 0x83, 0xe5, 0x3e, 0x62, - 0x63, 0xb2, 0xd9, 0xb8, 0x98, 0xc3, 0x28, 0xf1, 0xf5, 0xd9, 0xb5, 0x88, - 0xe2, 0x47, 0x41, 0xa0, - 0xcf, 0x46, 0xee, 0xc3, 0xc2, 0x69, 0x8d, 0xa5, 0x1b, 0xe8, 0x91, 0xd6, - 0xf8, 0xb4, 0x0d, 0xfa, - 0x4d, 0xe0, 0x98, 0x35, 0x2c, 0xe9, 0xd0, 0xec, 0xb7, 0x38, 0xa4, 0x0e, - 0xfe, 0xf0, 0x7c, 0x13, - 0x82, 0x65, 0x76, 0xb5, 0x80, 0xe2, 0x60, 0x7f, 0xed, 0x67, 0x94, 0xbc, - 0x26, 0x98, 0x76, 0x30, - 0xe1, 0x49, 0x23, 0xf4, 0xb5, 0xa4, 0x3a, 0xf8, 0xc5, 0xa1, 0x72, 0x5f, - 0xa2, 0xce, 0x57, 0xc6, - 0x7e, 0x7c, 0x0f, 0x7b, 0xd3, 0x8e, 0x1c, 0x93, 0xd4, 0xf5, 0x5c, 0xfa, - 0xf6, 0x66, 0xec, 0xab, - 0xbf, 0x96, 0x2e, 0xdf, 0x24, 0xf7, 0x35, 0xa9, 0x07, 0xeb, 0x76, 0x84, - 0x09, 0xfe, 0x3d, 0x17, - 0x8a, 0xa3, 0x9e, 0x68, 0x2f, 0xda, 0x18, 0xee, 0x26, 0x6d, 0x93, 0x40, - 0x8e, 0x62, 0x6f, 0xf4, - 0x19, 0x84, 0x1b, 0x09, 0xff, 0xd2, 0xa7, 0x08, 0x13, 0x84, 0x2a, 0x81, - 0xd8, 0x48, 0x42, 0x05, - 0x76, 0xa3, 0x33, 0xb5, 0xeb, 0xb1, 0x57, 0x59, 0x2d, 0xdc, 0xa9, 0xac, - 0x10, 0xee, 0xd0, 0x6a, - 0x05, 0x56, 0x97, 0x84, 0xa6, 0x60, 0x80, 0xf7, 0x85, 0x3a, 0xf0, 0xd6, - 0x70, 0x37, 0xd0, 0x0d, - 0x0f, 0xbe, 0xd3, 0x58, 0x29, 0x2c, 0x8b, 0x84, 0xe1, 0x7d, 0x91, 0x36, - 0xd0, 0x14, 0x69, 0x84, - 0xed, 0xe1, 0x36, 0xbe, 0x9d, 0xf0, 0x91, 0x86, 0x50, 0x13, 0x86, 0xd1, - 0x35, 0x6c, 0x55, 0xcf, - 0xb4, 0xba, 0x85, 0xad, 0xb3, 0x3c, 0x53, 0x43, 0x13, 0xb9, 0x6a, 0xa9, - 0x14, 0xcd, 0xd2, 0x16, - 0xb3, 0xe7, 0xa9, 0x77, 0x08, 0xcb, 0x82, 0xcb, 0xe1, 0x6d, 0xc1, 0x65, - 0x70, 0x6d, 0xd0, 0x0b, - 0x40, 0x10, 0xc0, 0x5a, 0xdd, 0x8f, 0x1a, 0xd5, 0x6e, 0xa4, 0x69, 0xcb, - 0xd1, 0x5d, 0x7a, 0x03, - 0xea, 0x36, 0xda, 0x70, 0x93, 0xd1, 0x80, 0x1a, 0xb5, 0x06, 0x82, 0x31, - 0x0d, 0x28, 0xae, 0x19, - 0x48, 0x57, 0x55, 0xf4, 0x47, 0x9d, 0x65, 0x6d, 0xf2, 0x1c, 0x7c, 0x64, - 0xe8, 0x58, 0x70, 0x6c, - 0xc3, 0x42, 0x66, 0x76, 0xc8, 0xed, 0x9f, 0xa2, 0x1e, 0x0d, 0x5c, 0x52, - 0x09, 0x34, 0x75, 0x3a, - 0xb1, 0x84, 0x27, 0xf6, 0x38, 0xe1, 0x69, 0x93, 0x61, 0x34, 0xf2, 0x06, - 0xf7, 0xbc, 0xa6, 0xf2, - 0xac, 0x72, 0xb7, 0xf0, 0xa0, 0x3e, 0x13, 0x95, 0x2a, 0x2e, 0x30, 0x41, - 0x99, 0x04, 0xaa, 0x64, - 0xd2, 0x57, 0xc9, 0x05, 0x27, 0xca, 0x17, 0x73, 0x1d, 0xaa, 0x81, 0xe2, - 0xe1, 0x2d, 0xf0, 0x46, - 0x62, 0x83, 0x54, 0x07, 0x67, 0xb3, 0x47, 0x4a, 0x93, 0x61, 0xb9, 0x50, - 0x05, 0x8f, 0xd7, 0xe6, - 0xfb, 0x8f, 0x57, 0x4f, 0x86, 0xa7, 0xa9, 0x67, 0xc2, 0x2b, 0x95, 0x9b, - 0xe1, 0x0a, 0xfd, 0x56, - 0x78, 0x8d, 0x7a, 0x25, 0xdc, 0x20, 0x03, 0xfc, 0x53, 0xe5, 0x04, 0x74, - 0x86, 0x7a, 0x31, 0xf4, - 0x04, 0x37, 0xc1, 0x58, 0xc8, 0x40, 0x41, 0xcd, 0xc0, 0x61, 0x5d, 0x26, - 0xb6, 0xaa, 0x8a, 0x37, - 0xc6, 0x97, 0xf9, 0x4b, 0x5a, 0xcb, 0xbc, 0x33, 0x23, 0x13, 0xd9, 0x0a, - 0xc5, 0x85, 0x9c, 0x4a, - 0x19, 0x9c, 0xad, 0x1e, 0x81, 0x8e, 0x10, 0x8f, 0x03, 0x27, 0x48, 0xc7, - 0x83, 0x53, 0xc4, 0x1f, - 0x82, 0xcb, 0x94, 0x25, 0xf8, 0x5a, 0xf5, 0x0c, 0x7c, 0x8d, 0xda, 0xcb, - 0x3f, 0x26, 0x89, 0xe8, - 0x27, 0xe2, 0xe9, 0x78, 0x91, 0x72, 0x0e, 0x5e, 0xae, 0xf5, 0xa0, 0x66, - 0x23, 0x8a, 0xe2, 0x04, - 0xfb, 0x43, 0x14, 0xf7, 0x83, 0x71, 0x3e, 0xae, 0xc7, 0xb0, 0xae, 0x3e, - 0x80, 0x9f, 0xd0, 0x2a, - 0x01, 0xdd, 0xd1, 0xbd, 0x42, 0x9a, 0x80, 0x26, 0xca, 0xd5, 0xa8, 0x5c, - 0x2a, 0x44, 0x73, 0x03, - 0x8b, 0x89, 0xfd, 0xdb, 0xc2, 0xc5, 0xc9, 0x5a, 0xb3, 0x35, 0xf8, 0x3c, - 0xbb, 0xb4, 0x63, 0x6a, - 0xed, 0x31, 0xbd, 0x8b, 0x6b, 0x8e, 0x6a, 0x9c, 0xc6, 0xb8, 0xa4, 0x02, - 0x74, 0xa2, 0x7c, 0x3e, - 0x98, 0x28, 0x4f, 0x27, 0xf8, 0x37, 0x93, 0x9b, 0xab, 0x1c, 0x83, 0x4e, - 0x53, 0xae, 0x41, 0xcb, - 0x94, 0x1b, 0xe1, 0x15, 0xe2, 0x65, 0xf0, 0x72, 0xfe, 0x42, 0x78, 0x7a, - 0xe0, 0x48, 0x74, 0x44, - 0x60, 0x11, 0x3a, 0x57, 0x46, 0xa8, 0x45, 0xd5, 0x91, 0xac, 0x12, 0xee, - 0xa7, 0xf2, 0x08, 0xa9, - 0x18, 0x61, 0x5d, 0x02, 0xaa, 0x21, 0x00, 0x9f, 0xe1, 0x03, 0x40, 0x47, - 0xa4, 0x31, 0x80, 0xd5, - 0x01, 0xd8, 0xa0, 0x45, 0xe1, 0x0b, 0xe8, 0xa2, 0x91, 0xf1, 0xca, 0xa1, - 0x72, 0x6f, 0xd6, 0x9a, - 0x2e, 0xc4, 0x06, 0x72, 0xe8, 0xc5, 0xcc, 0xc8, 0x1c, 0xcd, 0x4a, 0xff, - 0x82, 0x7b, 0x4f, 0xbf, - 0xf1, 0xca, 0x3d, 0x2b, 0xcf, 0x5a, 0xf9, 0xf6, 0xb2, 0xc5, 0x47, 0x75, - 0x94, 0xdd, 0x55, 0x16, - 0x29, 0xf7, 0x50, 0x0d, 0xb0, 0x3c, 0x92, 0xd0, 0x0b, 0x93, 0x62, 0xf1, - 0x60, 0x72, 0xce, 0x69, - 0x4e, 0xf7, 0x61, 0x8d, 0x14, 0xe6, 0x62, 0x5f, 0x35, 0x54, 0xa0, 0x95, - 0xfa, 0xe9, 0x39, 0x93, - 0xfd, 0x26, 0x65, 0x31, 0xbb, 0x8f, 0xd6, 0x7e, 0xb6, 0x19, 0xc4, 0x1e, - 0x94, 0xf3, 0x07, 0xc7, - 0x49, 0xcc, 0x27, 0xf8, 0x67, 0xf3, 0x0f, 0x6a, 0x9d, 0xc9, 0xf5, 0x5c, - 0x06, 0x63, 0xb4, 0x4d, - 0xfb, 0xb2, 0x29, 0x69, 0x3f, 0x32, 0x29, 0x45, 0x8c, 0x76, 0xce, 0xeb, - 0x74, 0x1f, 0x70, 0x9d, - 0xaf, 0x81, 0x7c, 0x13, 0xd3, 0x47, 0x32, 0xa2, 0x9e, 0xcb, 0xc8, 0x7c, - 0x13, 0x5b, 0x2e, 0xeb, - 0x74, 0x0f, 0xab, 0x5d, 0x43, 0xf1, 0xef, 0xe7, 0xa1, 0x46, 0xb4, 0x39, - 0xba, 0x19, 0xdd, 0x1d, - 0xee, 0x41, 0x1b, 0x23, 0x77, 0xf3, 0x9b, 0xc2, 0x3d, 0xc2, 0x3d, 0xd1, - 0x17, 0xe0, 0xd2, 0x48, - 0x31, 0x3f, 0x55, 0x1c, 0x2f, 0x56, 0x09, 0x2e, 0xa9, 0x5a, 0x70, 0x09, - 0x15, 0xe2, 0xe1, 0xe8, - 0x58, 0x75, 0x03, 0xda, 0x19, 0x7c, 0x4c, 0x78, 0x24, 0xf8, 0xa0, 0xb0, - 0x3d, 0xf4, 0x30, 0x7f, - 0xbf, 0x7e, 0xaf, 0xb8, 0x45, 0xdb, 0x26, 0x6c, 0x37, 0x7a, 0x70, 0x9b, - 0xde, 0x89, 0xef, 0xd6, - 0xef, 0x15, 0xb6, 0x07, 0x1f, 0x12, 0xb7, 0x87, 0x7b, 0x70, 0x53, 0xb8, - 0x15, 0xb6, 0x46, 0x3a, - 0x50, 0x57, 0xa4, 0x07, 0x77, 0x86, 0x5b, 0x41, 0x5b, 0xa8, 0x0b, 0xdf, - 0x15, 0x39, 0x1f, 0xce, - 0xee, 0x38, 0xb2, 0x6e, 0x56, 0x64, 0x92, 0xcf, 0xad, 0xb9, 0x60, 0x95, - 0xec, 0x42, 0x33, 0xf5, - 0xd3, 0x59, 0xa0, 0x3f, 0xc6, 0xdf, 0x1b, 0xbe, 0x17, 0x6d, 0x09, 0x6d, - 0x45, 0x9b, 0xc2, 0x9d, - 0xa8, 0xc3, 0xe8, 0xc2, 0x1b, 0xf5, 0x6e, 0xdc, 0xa2, 0xb7, 0xe2, 0x5e, - 0x6d, 0x0b, 0xbf, 0x45, - 0x6b, 0xc5, 0x71, 0xbd, 0x19, 0xb5, 0x93, 0xd6, 0x48, 0xb0, 0xb0, 0x51, - 0x6f, 0x21, 0x2d, 0x4e, - 0x30, 0x30, 0x06, 0xbf, 0x52, 0x0d, 0xae, 0x3a, 0x7c, 0x32, 0x38, 0x21, - 0x7e, 0x8c, 0x6f, 0x7e, - 0xd3, 0x4c, 0x66, 0x92, 0x56, 0x4a, 0xf8, 0xe4, 0x39, 0xa0, 0x44, 0xb6, - 0x41, 0xa7, 0x54, 0x84, - 0xec, 0x81, 0x12, 0x54, 0x2c, 0x94, 0x62, 0x07, 0x7d, 0x9e, 0xe4, 0x53, - 0xe1, 0x5e, 0xed, 0x5f, - 0xf0, 0x11, 0x75, 0x23, 0xda, 0x1a, 0x9c, 0x04, 0x2b, 0x08, 0xef, 0x9b, - 0x24, 0x57, 0xc2, 0x92, - 0x40, 0x09, 0xc1, 0xbf, 0x0a, 0x38, 0x4d, 0xb9, 0x9c, 0xeb, 0xd5, 0xc2, - 0xa8, 0x39, 0x2a, 0xc3, - 0x19, 0xe1, 0xa9, 0xec, 0x0c, 0x6d, 0x12, 0x37, 0x27, 0x50, 0x0d, 0x2b, - 0xc5, 0x4a, 0x78, 0x2c, - 0xe1, 0x3a, 0x77, 0x87, 0xda, 0xb9, 0xb6, 0x50, 0x2b, 0xd7, 0x1a, 0xea, - 0x20, 0xc7, 0x28, 0xe1, - 0x47, 0x6d, 0xe4, 0x1a, 0xe3, 0x7c, 0xab, 0xd6, 0xc6, 0x37, 0xab, 0x9d, - 0xb8, 0x87, 0x5c, 0x53, - 0xcc, 0x08, 0xa1, 0x08, 0xe1, 0xa7, 0x31, 0xdd, 0x20, 0x78, 0x15, 0x45, - 0xb5, 0xcd, 0xb3, 0x98, - 0xea, 0xf8, 0x54, 0xc6, 0x2d, 0x57, 0x22, 0x77, 0xc0, 0x89, 0x2a, 0xa5, - 0x62, 0x72, 0x3c, 0x83, - 0x5c, 0x7f, 0x07, 0x8a, 0x1b, 0x71, 0xd4, 0x62, 0x34, 0x22, 0x8a, 0x69, - 0x21, 0x3d, 0x84, 0x9b, - 0xf4, 0x46, 0xdc, 0xa2, 0x35, 0xe1, 0xa0, 0x16, 0x44, 0x1a, 0x59, 0x2f, - 0xee, 0x09, 0x36, 0xa1, - 0x06, 0xd2, 0xe7, 0x98, 0x4e, 0xb8, 0x2f, 0xf9, 0xee, 0xc6, 0x60, 0x1c, - 0x37, 0xe8, 0x4d, 0x38, - 0xa4, 0x3d, 0x88, 0x9f, 0xd2, 0x2a, 0xe0, 0x38, 0xbe, 0x0c, 0xbb, 0xc4, - 0xf1, 0xd8, 0x29, 0x95, - 0xe0, 0x12, 0xa1, 0x10, 0xcd, 0x17, 0x4f, 0x87, 0x11, 0xbd, 0x95, 0x8b, - 0x1a, 0x2d, 0xf0, 0x9e, - 0x86, 0xcb, 0x99, 0x49, 0xdd, 0x8b, 0x6b, 0x4e, 0x6c, 0x5d, 0xe0, 0x9d, - 0xa2, 0xbb, 0x09, 0xcf, - 0x74, 0xc0, 0x23, 0xf4, 0x0b, 0xc0, 0xba, 0x20, 0xe2, 0x18, 0xdd, 0xc3, - 0xd5, 0x1b, 0x5e, 0x08, - 0x0d, 0x15, 0x2a, 0x86, 0x07, 0xf8, 0x82, 0x18, 0x40, 0x8d, 0x33, 0x63, - 0x97, 0x6a, 0x55, 0x1f, - 0x6c, 0xd6, 0xc2, 0x30, 0x60, 0xa8, 0x28, 0xa0, 0xc9, 0x50, 0xd2, 0x24, - 0x18, 0xd0, 0x30, 0xc4, - 0x3a, 0x06, 0x80, 0x60, 0x9f, 0xcf, 0x60, 0x80, 0x9f, 0xe0, 0x9e, 0x5f, - 0xf7, 0x13, 0xfc, 0xf3, - 0x82, 0x35, 0x5a, 0x08, 0x3e, 0x8d, 0xce, 0x1b, 0xc1, 0x01, 0x68, 0xed, - 0xc7, 0x6c, 0xf5, 0x55, - 0x88, 0xdd, 0x05, 0xe8, 0x3e, 0x4d, 0xfd, 0x6b, 0xbe, 0x2d, 0x34, 0xb5, - 0x76, 0xd1, 0xa3, 0x17, - 0x5f, 0x7d, 0xcb, 0x5b, 0x2b, 0x4f, 0x59, 0xf9, 0xee, 0xca, 0x93, 0xfb, - 0xdb, 0xb2, 0x87, 0x4a, - 0xae, 0xa5, 0x71, 0x66, 0xf4, 0x3b, 0xcb, 0xa9, 0x0f, 0x39, 0x5e, 0x59, - 0x67, 0xb6, 0x58, 0x9f, - 0x3e, 0x66, 0xe6, 0x9b, 0x14, 0x00, 0x1a, 0x0f, 0x67, 0xcf, 0xa5, 0xae, - 0x97, 0xa3, 0xfd, 0x16, - 0xc7, 0xd1, 0x18, 0x14, 0xd3, 0x56, 0xed, 0xf7, 0x9b, 0x94, 0x32, 0x0e, - 0x82, 0x7d, 0xfd, 0x7b, - 0xbd, 0xd1, 0xe3, 0x20, 0x17, 0x2b, 0x84, 0xf6, 0x50, 0x91, 0x3f, 0xa5, - 0x4d, 0x98, 0x54, 0x07, - 0x7f, 0xf8, 0xde, 0x8c, 0x23, 0xea, 0xb9, 0x98, 0xb1, 0x10, 0x09, 0x2c, - 0xfa, 0x7f, 0x68, 0x6f, - 0xda, 0xa1, 0xb9, 0x6f, 0x74, 0xdf, 0x8f, 0xb4, 0xf5, 0x5c, 0x12, 0xb8, - 0x5e, 0x1c, 0xad, 0xf2, - 0x58, 0xdd, 0xb3, 0xba, 0x68, 0x94, 0x7b, 0x50, 0x06, 0x69, 0xcc, 0x5f, - 0xa8, 0x1d, 0x6d, 0x8d, - 0x6e, 0xc5, 0x5b, 0xc2, 0xf7, 0xa0, 0x6d, 0x11, 0x72, 0x8c, 0x6c, 0xe6, - 0xb7, 0xc6, 0xdf, 0x80, - 0x2b, 0x8d, 0x42, 0x61, 0x02, 0x1e, 0x2f, 0x54, 0x0b, 0x55, 0x92, 0x53, - 0x98, 0xc0, 0xcf, 0x0c, - 0x9d, 0x02, 0x4f, 0x94, 0x6f, 0x80, 0x4f, 0x05, 0x7b, 0x85, 0xce, 0x60, - 0x8f, 0xb0, 0xd1, 0xe8, - 0xe5, 0x37, 0x07, 0x37, 0x8a, 0xdd, 0xa1, 0x1e, 0xa1, 0x37, 0xb2, 0x91, - 0xef, 0x0a, 0x77, 0x09, - 0xdd, 0xe1, 0x76, 0xdc, 0x11, 0xe9, 0x02, 0x5d, 0xd1, 0x76, 0xae, 0x3d, - 0x4a, 0x30, 0x2f, 0xdc, - 0x0d, 0x37, 0x87, 0x3b, 0xe0, 0x3d, 0x91, 0x2d, 0x5c, 0x57, 0xb8, 0x17, - 0xa1, 0xc8, 0x95, 0x78, - 0x7a, 0xe3, 0x74, 0x66, 0xbc, 0x5a, 0xc5, 0xba, 0xb4, 0xf1, 0x60, 0xbc, - 0xe6, 0xc4, 0x93, 0x43, - 0xc7, 0x72, 0x6b, 0x8c, 0xcd, 0x28, 0x16, 0x6e, 0x47, 0x2d, 0xe1, 0x66, - 0x82, 0x9b, 0xcd, 0xa8, - 0x25, 0xd8, 0x82, 0x1b, 0x0c, 0xf2, 0x5d, 0xc1, 0x56, 0xdc, 0xaa, 0x37, - 0xf3, 0x04, 0x07, 0xf9, - 0x56, 0xa3, 0x19, 0xb5, 0xe9, 0xed, 0xb0, 0xc3, 0x68, 0x45, 0xad, 0x06, - 0xf9, 0x6c, 0xb0, 0x0d, - 0x35, 0x18, 0x4d, 0xf0, 0xdf, 0x6a, 0x0f, 0x9c, 0xd9, 0x78, 0x3c, 0x7b, - 0x54, 0xfc, 0x70, 0xcf, - 0xa4, 0xa0, 0x9b, 0x75, 0x05, 0x4a, 0xe1, 0x54, 0xf5, 0x70, 0x70, 0xb1, - 0xfa, 0x43, 0x58, 0x42, - 0xf0, 0xb5, 0x4c, 0xca, 0x47, 0xc5, 0x7c, 0x09, 0xb6, 0x13, 0x2e, 0x38, - 0x49, 0x71, 0x71, 0xc7, - 0xc4, 0x3d, 0xdc, 0xe3, 0xe1, 0x5f, 0xc1, 0xad, 0x11, 0x27, 0x70, 0x4a, - 0x6e, 0x54, 0x41, 0x38, - 0xa8, 0x43, 0x2c, 0x46, 0x0e, 0xf2, 0x77, 0x73, 0xd5, 0x1b, 0xb8, 0x8d, - 0x46, 0x04, 0x75, 0x47, - 0x1f, 0x04, 0x27, 0x04, 0xab, 0xb8, 0xf1, 0xb2, 0x13, 0xce, 0x90, 0xc6, - 0x43, 0x97, 0x58, 0x04, - 0x2f, 0x20, 0xf8, 0xd3, 0x13, 0x69, 0xe6, 0x9a, 0x23, 0x4d, 0x5c, 0x2c, - 0xd2, 0xc0, 0xb5, 0xc4, - 0x5a, 0x40, 0x6b, 0xa4, 0x05, 0xc6, 0xc3, 0x0d, 0xa8, 0x21, 0xd2, 0xc2, - 0xb7, 0x85, 0x9a, 0xf9, - 0x26, 0xa3, 0x8d, 0x5c, 0x5b, 0x0b, 0x6c, 0xd6, 0x09, 0xdf, 0x25, 0x98, - 0x15, 0x0e, 0x6e, 0x83, - 0x9b, 0x1b, 0xe6, 0x33, 0x15, 0xc1, 0xf1, 0x5c, 0x95, 0xe8, 0x26, 0x58, - 0x55, 0x81, 0x4a, 0xf8, - 0x7c, 0x3c, 0x45, 0xba, 0x16, 0xd3, 0x3e, 0xb6, 0x06, 0xbb, 0x70, 0x6f, - 0xb0, 0x1d, 0xb7, 0x19, - 0xcd, 0xa0, 0xd3, 0xe8, 0x84, 0x2d, 0xa4, 0x3f, 0xf1, 0x60, 0x9c, 0xf4, - 0xb1, 0x93, 0xf0, 0xdd, - 0x4e, 0xc2, 0xfd, 0xda, 0x50, 0x7b, 0xb0, 0x15, 0xb6, 0x84, 0x9a, 0x61, - 0x53, 0xb0, 0x99, 0x7c, - 0x77, 0x33, 0x59, 0x67, 0xda, 0x71, 0xc4, 0x78, 0x0c, 0xfd, 0x5c, 0x75, - 0xc2, 0x42, 0xd1, 0xc9, - 0x57, 0x8a, 0x65, 0xd4, 0x47, 0x4e, 0xf0, 0x3d, 0x1f, 0x1d, 0x23, 0x5e, - 0x88, 0x82, 0x46, 0x1b, - 0x17, 0xd1, 0x5a, 0xb9, 0x57, 0x5b, 0x6e, 0x64, 0x66, 0xb6, 0x2d, 0xf4, - 0xcc, 0x08, 0x4f, 0xe0, - 0x5c, 0xa4, 0x9f, 0x55, 0x92, 0x1d, 0x2e, 0x54, 0xce, 0x27, 0xb6, 0x6b, - 0x2f, 0x68, 0x32, 0x62, - 0x20, 0x1e, 0x6a, 0x00, 0x8d, 0xa1, 0x08, 0x88, 0x84, 0xa2, 0x20, 0x1a, - 0x0c, 0x12, 0xdc, 0x24, - 0xf6, 0xae, 0xda, 0x40, 0x30, 0xbd, 0x01, 0xa8, 0xba, 0x0a, 0x02, 0xba, - 0x08, 0x14, 0x43, 0x06, - 0x42, 0x50, 0x04, 0xbc, 0x81, 0x00, 0x36, 0x08, 0xe6, 0x19, 0x0c, 0xc7, - 0x19, 0x7e, 0xce, 0x4f, - 0xb8, 0x1f, 0xa3, 0x13, 0x2c, 0x24, 0xf8, 0x77, 0xa7, 0x66, 0xc0, 0x47, - 0xd0, 0x05, 0x23, 0xec, - 0x11, 0xea, 0xd7, 0xc8, 0x5a, 0xeb, 0x49, 0x2c, 0x02, 0x74, 0x3f, 0x92, - 0xaa, 0xd6, 0x05, 0x77, - 0x9e, 0xf3, 0xf3, 0x9f, 0x5c, 0x9a, 0x8c, 0x79, 0xfd, 0x4d, 0xdc, 0xbb, - 0xf2, 0xcc, 0x95, 0x4f, - 0x4d, 0xbf, 0xd2, 0x8c, 0xf3, 0xa5, 0x7e, 0x93, 0xfe, 0xbc, 0x26, 0x9a, - 0x87, 0xdc, 0xe8, 0x34, - 0xeb, 0x3a, 0x99, 0x71, 0xd6, 0x7d, 0x35, 0xd4, 0x1d, 0x09, 0xbb, 0x12, - 0xa4, 0xcf, 0x37, 0xb1, - 0x50, 0x97, 0xbd, 0x7f, 0x1f, 0xd6, 0xec, 0x31, 0x28, 0x60, 0xec, 0x75, - 0x5a, 0xe8, 0x1e, 0xe7, - 0xc4, 0xde, 0x57, 0x89, 0xbd, 0x1f, 0x4c, 0xc2, 0x3f, 0x99, 0xf0, 0xa3, - 0x60, 0x21, 0x9b, 0x5d, - 0x63, 0x73, 0xd7, 0x3b, 0x23, 0xc5, 0xde, 0xf4, 0xf5, 0x5c, 0x12, 0x7e, - 0x13, 0x5a, 0x73, 0x33, - 0x67, 0x75, 0xbe, 0x62, 0xd6, 0xf6, 0xdf, 0xb3, 0xb4, 0x37, 0x2d, 0x8d, - 0xcb, 0xe9, 0xb7, 0xa5, - 0xd3, 0xe6, 0x9b, 0x10, 0xfb, 0xb8, 0xc9, 0xcc, 0x37, 0xf1, 0x64, 0xcc, - 0x37, 0xb1, 0x58, 0xab, - 0x7e, 0x78, 0x7c, 0x00, 0xd5, 0xff, 0x76, 0x86, 0x36, 0xa1, 0x6d, 0xd1, - 0x6d, 0xe8, 0xbe, 0xf0, - 0x56, 0x78, 0x1f, 0xc1, 0xc1, 0x7b, 0xa2, 0xf7, 0xf2, 0xf7, 0x47, 0x3f, - 0x83, 0x6b, 0x94, 0x71, - 0x68, 0x22, 0xef, 0xc6, 0x95, 0xa2, 0x5b, 0x9c, 0xac, 0xcc, 0xc3, 0xc7, - 0x36, 0x9c, 0x0c, 0x8e, - 0x53, 0x6e, 0x82, 0x8f, 0x06, 0x3b, 0x84, 0x5e, 0x63, 0x23, 0xe1, 0x64, - 0x77, 0xf3, 0xf7, 0xe9, - 0xdb, 0x84, 0xad, 0xc6, 0xdd, 0xfc, 0xd6, 0x50, 0x1b, 0xbe, 0x3b, 0xfc, - 0x33, 0xfc, 0x7a, 0x74, - 0x2f, 0xb7, 0x2f, 0xfe, 0xb6, 0x7f, 0x5f, 0xe3, 0x6b, 0xcc, 0xfe, 0xd8, - 0x87, 0xcc, 0xaf, 0x83, - 0x9f, 0xb0, 0x9f, 0x69, 0xbf, 0xe3, 0x7a, 0xc2, 0x22, 0xd8, 0x16, 0xbe, - 0x07, 0x34, 0x47, 0xaf, - 0xc0, 0xe5, 0xc6, 0x64, 0x6e, 0xbc, 0x52, 0x05, 0xc7, 0x6b, 0x74, 0x5e, - 0xda, 0xf9, 0xc3, 0x55, - 0x3b, 0x77, 0x89, 0xf6, 0x14, 0xec, 0x0d, 0xf6, 0xc0, 0x8d, 0xc6, 0x46, - 0xb8, 0xd9, 0xa0, 0xba, - 0x61, 0x2f, 0xec, 0x25, 0xd8, 0xd9, 0x11, 0xea, 0x80, 0xed, 0x46, 0x37, - 0xea, 0x0c, 0x77, 0xc2, - 0xee, 0x50, 0x2f, 0x78, 0x44, 0x7b, 0x0c, 0xf6, 0x18, 0x1d, 0xa8, 0x87, - 0xbe, 0x47, 0xf0, 0xaf, - 0xd3, 0xe8, 0x02, 0x6f, 0x87, 0x20, 0x9c, 0xd9, 0x70, 0x84, 0xef, 0xb0, - 0xd0, 0x04, 0x9f, 0x8b, - 0xd8, 0xb0, 0x4e, 0xb1, 0x04, 0x4d, 0x57, 0x5d, 0xa0, 0x56, 0x7f, 0x09, - 0xae, 0x50, 0x67, 0x22, - 0xc2, 0x5e, 0x09, 0xb7, 0x2b, 0x86, 0xd5, 0xea, 0x3c, 0x74, 0x4a, 0xf0, - 0x2c, 0x6e, 0x5e, 0x30, - 0x1f, 0x14, 0x87, 0x57, 0xc2, 0x58, 0x64, 0x32, 0xb0, 0x8b, 0x65, 0xa8, - 0x54, 0xa0, 0xbe, 0xd7, - 0x62, 0xc2, 0x13, 0x1d, 0xf0, 0x18, 0x6d, 0x39, 0xb7, 0x39, 0x14, 0x47, - 0x9b, 0x23, 0x3b, 0xc0, - 0xb1, 0x7a, 0x19, 0xe7, 0x0e, 0x54, 0xe3, 0x69, 0x82, 0x13, 0x55, 0x88, - 0xe5, 0xf0, 0xdc, 0x20, - 0xe0, 0x7a, 0x43, 0x31, 0x62, 0xc7, 0x47, 0x51, 0x28, 0x14, 0xc2, 0x91, - 0x48, 0x0c, 0x46, 0x43, - 0x06, 0x0c, 0x87, 0xc2, 0x84, 0xe7, 0x05, 0xc9, 0x7b, 0x51, 0x1c, 0x09, - 0x6b, 0xb0, 0x21, 0xbc, - 0x19, 0x6e, 0xd5, 0x08, 0x3e, 0x53, 0x8e, 0x6a, 0xec, 0x00, 0xdb, 0xc3, - 0x53, 0xfc, 0x0e, 0xc5, - 0x0d, 0xdd, 0x92, 0x93, 0x2f, 0x25, 0x58, 0x55, 0xce, 0x3b, 0xb0, 0x53, - 0xbc, 0x84, 0xe0, 0x18, - 0xe5, 0x7d, 0x84, 0xc3, 0xea, 0xc4, 0xbe, 0x25, 0x36, 0x6e, 0xd0, 0x30, - 0x50, 0x84, 0x70, 0x47, - 0x72, 0xc4, 0x21, 0x23, 0x8e, 0xe3, 0x41, 0xf2, 0x7d, 0xa1, 0x08, 0x8a, - 0x05, 0x09, 0x56, 0x19, - 0x4d, 0xa0, 0x21, 0x18, 0x07, 0x71, 0xad, 0x8b, 0xe0, 0x62, 0x17, 0xf9, - 0xdc, 0xe3, 0xf0, 0x25, - 0xd2, 0x47, 0xbb, 0x58, 0x49, 0xbe, 0xb3, 0x98, 0xe0, 0x5f, 0x31, 0xf9, - 0xd6, 0x71, 0xf8, 0x38, - 0xe9, 0x12, 0x64, 0x04, 0xbb, 0x60, 0x93, 0xd1, 0xc2, 0xbd, 0xd0, 0x74, - 0xad, 0xdf, 0x15, 0x99, - 0xc2, 0x4d, 0x50, 0xaa, 0x71, 0xb5, 0xe4, 0x42, 0xe5, 0x62, 0x01, 0x58, - 0x28, 0x9f, 0x85, 0xd6, - 0x69, 0x51, 0x20, 0x1b, 0x0a, 0x90, 0x83, 0x12, 0x10, 0x83, 0x02, 0xc1, - 0x36, 0x72, 0x34, 0x24, - 0x4e, 0x30, 0x78, 0x4e, 0xd2, 0x34, 0x20, 0xab, 0x3c, 0xf9, 0x3d, 0x40, - 0x70, 0x8f, 0x70, 0xc2, - 0x20, 0x07, 0x90, 0xc1, 0x12, 0xdc, 0x13, 0xc8, 0xd1, 0xcf, 0xb1, 0x06, - 0xc7, 0x31, 0x86, 0x97, - 0xb4, 0x3a, 0xe0, 0xd1, 0xeb, 0x41, 0x8d, 0x5e, 0x0b, 0xee, 0x20, 0x1c, - 0x71, 0x1b, 0xba, 0x70, - 0x04, 0x07, 0xa0, 0xfa, 0x5d, 0xc6, 0xd8, 0x0c, 0xb1, 0x18, 0xcc, 0xbc, - 0x67, 0xf1, 0x2d, 0x57, - 0xbe, 0x4e, 0x6c, 0xdc, 0xe1, 0xb8, 0xf7, 0x06, 0x73, 0x5a, 0xef, 0x03, - 0xcf, 0x5e, 0xfb, 0x81, - 0xfe, 0x9d, 0xe7, 0xde, 0x17, 0x57, 0x5e, 0xb4, 0xf2, 0x85, 0x45, 0x17, - 0x0f, 0xe7, 0x30, 0x66, - 0xbe, 0x49, 0x52, 0x6d, 0xab, 0xfe, 0xbd, 0xe2, 0xcc, 0xfd, 0x83, 0x33, - 0xec, 0x6f, 0x92, 0xeb, - 0x9a, 0x56, 0x39, 0xa9, 0xd3, 0xc2, 0xe7, 0xa1, 0xe4, 0xdc, 0x37, 0xbb, - 0x51, 0xc0, 0x66, 0xaf, - 0x99, 0x3d, 0xa8, 0xeb, 0x99, 0xfa, 0x9a, 0x3a, 0xb2, 0x9e, 0x0b, 0xad, - 0x19, 0x4f, 0xf1, 0xb0, - 0x34, 0x43, 0x3d, 0x97, 0x31, 0xe8, 0x7a, 0x07, 0x75, 0x4c, 0x86, 0xd6, - 0xc1, 0x77, 0xd5, 0x0e, - 0xdf, 0xdf, 0x20, 0x65, 0xbe, 0x49, 0x9f, 0xae, 0x37, 0xda, 0x1c, 0x97, - 0x7e, 0xfc, 0x7b, 0x28, - 0x7a, 0x1f, 0xda, 0x4a, 0xec, 0xcf, 0xed, 0xb1, 0xed, 0x78, 0x7b, 0xec, - 0x3e, 0xfc, 0x60, 0xf4, - 0x53, 0x6e, 0x43, 0x60, 0x1c, 0xac, 0x92, 0xaa, 0x88, 0xdd, 0x34, 0x5b, - 0x38, 0x26, 0x7a, 0x0c, - 0x3e, 0xba, 0x61, 0x21, 0x37, 0x57, 0xbb, 0x05, 0x3c, 0x11, 0xdd, 0x22, - 0x6c, 0x0d, 0x91, 0xa6, - 0xdf, 0x23, 0xdc, 0xab, 0xdf, 0xcf, 0x3f, 0x68, 0x6c, 0xc2, 0xdd, 0xfa, - 0x5b, 0xe8, 0x6b, 0x7d, - 0x07, 0xb8, 0xa1, 0xe1, 0x62, 0xe6, 0xe2, 0xe8, 0x0f, 0xd9, 0x8b, 0xf5, - 0xf3, 0xd1, 0x05, 0xea, - 0x25, 0xf0, 0x32, 0xe5, 0x12, 0x7c, 0xa6, 0x52, 0x83, 0xcf, 0x08, 0x2d, - 0x87, 0x4f, 0x45, 0xb6, - 0xb1, 0xdb, 0xe2, 0xd7, 0x40, 0x9b, 0x5e, 0xcd, 0x56, 0x6b, 0xd5, 0xb8, - 0x4a, 0xae, 0xc4, 0xa5, - 0xb0, 0x80, 0x9f, 0xaa, 0x5f, 0xcd, 0x86, 0xe3, 0x4f, 0x82, 0x17, 0xe2, - 0x7b, 0xb9, 0x37, 0x62, - 0xef, 0x82, 0x0f, 0xe3, 0xef, 0x83, 0x77, 0xe3, 0xef, 0xb1, 0x1f, 0x46, - 0x3f, 0xe3, 0xbe, 0x30, - 0x7e, 0xcb, 0x7d, 0x1e, 0xfe, 0x88, 0xfd, 0x65, 0xc3, 0x5e, 0xf6, 0xfd, - 0xf0, 0x1b, 0x5c, 0xa3, - 0xc2, 0xc3, 0xae, 0xe0, 0x66, 0xd4, 0x1d, 0xec, 0xc5, 0x9b, 0x82, 0x1d, - 0xb8, 0x57, 0xdf, 0x04, - 0x5e, 0x23, 0x58, 0x56, 0x15, 0x99, 0xe5, 0x99, 0x4c, 0x39, 0xa5, 0x4c, - 0xf0, 0x9a, 0xd8, 0xbc, - 0x93, 0xd5, 0xf1, 0x60, 0xb9, 0xf1, 0x08, 0x7c, 0x58, 0x8f, 0xe2, 0xab, - 0xd4, 0xf9, 0xd0, 0xa9, - 0x2d, 0x00, 0xc7, 0x46, 0x4e, 0x03, 0xa7, 0x47, 0x8f, 0x64, 0x27, 0xa9, - 0x13, 0x89, 0xbd, 0x9b, - 0x87, 0xa6, 0x2b, 0x13, 0xa1, 0x43, 0x28, 0x41, 0x0e, 0xa1, 0x18, 0xdb, - 0x79, 0x3b, 0x76, 0x04, - 0x4a, 0xc0, 0x62, 0x6d, 0x35, 0xd8, 0x4a, 0xb8, 0xd6, 0xf6, 0xe0, 0xe3, - 0x60, 0xbe, 0x5e, 0x06, - 0x5c, 0x01, 0x27, 0x9e, 0xc2, 0xbb, 0x61, 0xb1, 0x58, 0x01, 0xae, 0x0c, - 0x75, 0x30, 0xaf, 0xc6, - 0x5f, 0xf0, 0xbf, 0x1c, 0xdb, 0xe3, 0x7f, 0x33, 0xfe, 0x8e, 0xff, 0xcd, - 0x86, 0xd7, 0x99, 0xdd, - 0x91, 0x37, 0x99, 0x77, 0x23, 0xbf, 0x64, 0xdf, 0x8a, 0xee, 0x65, 0xdf, - 0x08, 0xbd, 0x01, 0xf6, - 0x6b, 0x1f, 0xc3, 0xdd, 0x4a, 0x0c, 0xf9, 0xf4, 0x38, 0x6c, 0xd3, 0xa9, - 0x1d, 0xff, 0x14, 0x7c, - 0x3a, 0x38, 0x09, 0x14, 0x8b, 0x95, 0xb8, 0x4c, 0x28, 0xe1, 0xcb, 0xc4, - 0x72, 0x5c, 0x4e, 0xce, - 0xe7, 0x12, 0x6f, 0xc7, 0x2f, 0x1b, 0x4f, 0x83, 0x67, 0x8c, 0xe7, 0xc0, - 0x8b, 0xc1, 0xd7, 0xc0, - 0xab, 0x06, 0xfd, 0xdb, 0x3d, 0x60, 0xb7, 0xf6, 0x2a, 0xd8, 0xa5, 0xef, - 0x01, 0xaf, 0xe9, 0x2f, - 0xc3, 0x9d, 0xda, 0x4e, 0xb8, 0x4b, 0x7b, 0x05, 0xbc, 0xa8, 0xbc, 0x0c, - 0x5e, 0x95, 0x5f, 0x01, - 0xcf, 0xe9, 0xcf, 0x80, 0x67, 0xb5, 0x5e, 0xd4, 0xaa, 0x77, 0xa1, 0x78, - 0xf0, 0x71, 0xb8, 0x4b, - 0x9d, 0x00, 0x0b, 0x08, 0x9e, 0x96, 0x09, 0x0e, 0x72, 0xfd, 0x25, 0xc4, - 0xc2, 0x1f, 0x87, 0x4f, - 0x08, 0x9c, 0x8f, 0x83, 0xa1, 0x1e, 0xbe, 0x25, 0xd4, 0x02, 0x1e, 0x8d, - 0x5d, 0xed, 0xb7, 0x6b, - 0xd5, 0x68, 0x82, 0x5c, 0x8d, 0x5d, 0x52, 0x19, 0x2a, 0x13, 0x0a, 0xd0, - 0x7c, 0xf9, 0x54, 0xe4, - 0xd5, 0xdb, 0x60, 0x8b, 0xde, 0x0d, 0xba, 0xb4, 0x0e, 0xd0, 0xae, 0x12, - 0x3b, 0x5e, 0xed, 0x20, - 0xaf, 0xbb, 0x40, 0x1b, 0xe5, 0x99, 0x7a, 0x0b, 0x68, 0x51, 0x5b, 0x40, - 0x8f, 0xda, 0x05, 0x5a, - 0xd5, 0x26, 0x10, 0x53, 0x09, 0x37, 0x54, 0x82, 0xa0, 0x45, 0x09, 0x00, - 0x0f, 0xe1, 0x7e, 0xac, - 0xe1, 0xe3, 0x6a, 0xf5, 0x7a, 0xae, 0x4e, 0xf7, 0x80, 0x3a, 0x7d, 0x3d, - 0xd8, 0xa0, 0xaf, 0x83, - 0x2b, 0x89, 0x6d, 0xdc, 0x83, 0xce, 0x1e, 0xe1, 0x4f, 0xa4, 0x71, 0x2c, - 0xa9, 0xd6, 0xea, 0x3c, - 0x63, 0x4a, 0xfd, 0xd1, 0x0f, 0x9c, 0xb7, 0xe4, 0xba, 0x37, 0x56, 0x9e, - 0x36, 0x1c, 0xf7, 0xd6, - 0xef, 0x0c, 0x9e, 0xb7, 0x63, 0xd3, 0xfe, 0x5b, 0xbf, 0x12, 0xbe, 0x03, - 0x66, 0xa6, 0xa5, 0xfa, - 0x39, 0x63, 0xfe, 0xdb, 0x53, 0xd3, 0xae, 0xcc, 0x60, 0xdb, 0x24, 0xf6, - 0x23, 0x24, 0x36, 0x65, - 0xc2, 0xcf, 0x9a, 0xaa, 0x9e, 0xcb, 0x60, 0x9d, 0xae, 0x44, 0x5d, 0xf6, - 0x82, 0x31, 0xd5, 0x65, - 0xcf, 0x50, 0xd3, 0xea, 0xc0, 0xeb, 0xb4, 0x0c, 0xd8, 0xa2, 0x36, 0xc2, - 0x6f, 0xf3, 0xb9, 0x31, - 0xea, 0xfd, 0x43, 0xf7, 0x99, 0xec, 0x8f, 0x41, 0xc9, 0x50, 0xcf, 0x65, - 0x00, 0x17, 0x22, 0x85, - 0x87, 0x76, 0x4c, 0x22, 0xd9, 0xc7, 0x24, 0x4f, 0xb2, 0x71, 0xe6, 0xfe, - 0x76, 0xb1, 0xf2, 0xf4, - 0xfb, 0x07, 0x53, 0x5c, 0xd7, 0x2c, 0xe6, 0xfd, 0x44, 0x86, 0xd6, 0xae, - 0xa1, 0xf6, 0xef, 0xae, - 0xd0, 0x46, 0xf4, 0x50, 0xe4, 0x01, 0x74, 0x5f, 0xe4, 0x61, 0xf4, 0x60, - 0x6c, 0x3b, 0x7c, 0x28, - 0xba, 0x1d, 0x3d, 0x14, 0x7f, 0x87, 0x5b, 0x29, 0x8f, 0x83, 0x13, 0x02, - 0x33, 0xf9, 0x23, 0x42, - 0x8b, 0xd0, 0x09, 0x0d, 0x0b, 0xc1, 0x4c, 0x63, 0x12, 0x5c, 0x64, 0xd4, - 0xe3, 0x67, 0xe2, 0xdb, - 0xf9, 0x7b, 0x23, 0xf7, 0xf3, 0xf7, 0x1a, 0x0f, 0xf0, 0x8f, 0x84, 0xef, - 0x15, 0x7a, 0x8c, 0x67, - 0xd1, 0x37, 0xca, 0xaf, 0xa1, 0xa7, 0x75, 0x36, 0x63, 0x8f, 0x14, 0xb0, - 0x79, 0xf2, 0xb0, 0xe7, - 0x34, 0x30, 0x87, 0xfc, 0x6d, 0x1d, 0xfb, 0x5c, 0xf4, 0x7e, 0xee, 0xde, - 0xf8, 0x55, 0x5c, 0xa1, - 0x56, 0x05, 0x5c, 0x4a, 0x25, 0x5f, 0x21, 0x94, 0x09, 0xc5, 0x82, 0x8d, - 0x2f, 0x0b, 0x9c, 0x0f, - 0x2f, 0x0a, 0x9e, 0x8c, 0x7e, 0x10, 0xff, 0x09, 0x77, 0x6d, 0xe3, 0xd5, - 0xdc, 0x0f, 0x63, 0x97, - 0x82, 0x4b, 0x42, 0x17, 0xc3, 0x4b, 0x8d, 0xcb, 0xc1, 0x55, 0xf2, 0xe5, - 0xf0, 0x32, 0xed, 0x02, - 0x70, 0x61, 0xe4, 0x16, 0xee, 0x4a, 0xf5, 0x58, 0x70, 0x89, 0x16, 0x84, - 0xf7, 0x05, 0xef, 0x81, - 0x9b, 0x83, 0x5b, 0x09, 0x4f, 0xdc, 0x44, 0x38, 0x61, 0x27, 0xf8, 0x5b, - 0x10, 0xc0, 0x42, 0x63, - 0x12, 0x3b, 0x49, 0xae, 0x86, 0x2e, 0xa5, 0x02, 0x97, 0x4b, 0xc5, 0x04, - 0xff, 0x26, 0x72, 0x2b, - 0x83, 0x0f, 0x81, 0xa6, 0xd0, 0x3d, 0xe8, 0x61, 0xc3, 0x80, 0x3f, 0x32, - 0xa6, 0xc2, 0x73, 0x43, - 0xa7, 0x83, 0xe9, 0xc6, 0x74, 0x38, 0x49, 0x99, 0x40, 0xf0, 0x80, 0xa0, - 0x05, 0xc1, 0xa1, 0x12, - 0x91, 0xf0, 0x26, 0xbe, 0x18, 0x97, 0xf2, 0x25, 0xc8, 0x46, 0x70, 0xe4, - 0x27, 0x11, 0xc8, 0x6e, - 0x0e, 0xb5, 0xa1, 0x47, 0x42, 0x4f, 0x82, 0x59, 0x5a, 0x19, 0x8d, 0xc3, - 0xe1, 0x0f, 0x13, 0xdc, - 0xc8, 0x81, 0x6d, 0x78, 0x89, 0x2c, 0xb1, 0x5c, 0x54, 0xf3, 0x86, 0x5b, - 0xe2, 0xde, 0x48, 0xa3, - 0xee, 0x95, 0xa2, 0x12, 0x1b, 0x88, 0xc5, 0x7d, 0xf1, 0x78, 0xd4, 0x17, - 0x8d, 0x12, 0x92, 0x64, - 0xd4, 0x82, 0x06, 0x85, 0x83, 0x67, 0x4b, 0xd7, 0x21, 0xcd, 0xd8, 0x44, - 0xb8, 0xe9, 0x46, 0xd4, - 0x15, 0xdc, 0x0e, 0x1f, 0x31, 0xa6, 0xc1, 0x42, 0xaa, 0x3f, 0x0a, 0x76, - 0x5c, 0x2a, 0x97, 0x9b, - 0x38, 0x34, 0x3b, 0x00, 0x71, 0x50, 0x6f, 0x63, 0x7b, 0xe2, 0xdd, 0x5c, - 0x4f, 0x88, 0xf4, 0x43, - 0xdd, 0xc4, 0x3d, 0x14, 0x7e, 0x98, 0x79, 0x3c, 0xfa, 0x38, 0xb3, 0x23, - 0xf2, 0x28, 0xfb, 0x60, - 0x70, 0x3b, 0xd8, 0xa1, 0xed, 0x00, 0x8f, 0x92, 0xb6, 0x43, 0x79, 0x12, - 0x3d, 0x29, 0x3f, 0x82, - 0xb6, 0xa8, 0x0f, 0xa3, 0x5a, 0x75, 0x15, 0x7c, 0x30, 0xb8, 0x11, 0xb5, - 0x05, 0x7f, 0x06, 0x5f, - 0x50, 0xa8, 0xfd, 0x5b, 0x8a, 0x4b, 0xcc, 0xef, 0x76, 0x90, 0x3e, 0x8c, - 0xc3, 0x67, 0xca, 0xd7, - 0xf1, 0x6a, 0xb8, 0x07, 0x35, 0x12, 0xfc, 0x7b, 0x2e, 0x7c, 0x19, 0x28, - 0x94, 0xaa, 0x91, 0x4b, - 0xac, 0x24, 0x1c, 0xb7, 0x14, 0x95, 0x91, 0x7b, 0x31, 0x3b, 0x50, 0x8b, - 0x9a, 0xb5, 0x1d, 0xf0, - 0xf9, 0xc0, 0x4b, 0xf0, 0x05, 0xf9, 0x25, 0x6e, 0xa7, 0xf4, 0x12, 0x78, - 0x56, 0x7d, 0x86, 0x7b, - 0x46, 0x7d, 0x96, 0x7d, 0x3c, 0xf8, 0xa0, 0xff, 0x11, 0xfd, 0x31, 0xee, - 0x19, 0xf9, 0x67, 0xec, - 0xb3, 0xe2, 0x73, 0xec, 0x73, 0xc2, 0xd3, 0xec, 0x63, 0xf2, 0x0e, 0x70, - 0x7f, 0x60, 0x07, 0xf0, - 0x04, 0xae, 0x87, 0x98, 0xd8, 0xba, 0x5e, 0x82, 0x7b, 0xb5, 0xfa, 0x06, - 0x6e, 0xbd, 0xbe, 0x01, - 0xac, 0xd3, 0xd6, 0x82, 0xd5, 0xda, 0x5d, 0xe0, 0x36, 0x95, 0x81, 0xcd, - 0xe8, 0xdc, 0x11, 0x76, - 0xa1, 0x43, 0xb7, 0x8d, 0xb4, 0x93, 0xe2, 0x47, 0xae, 0x4f, 0x69, 0xe3, - 0x3e, 0xd7, 0x7b, 0xe9, - 0x2b, 0xad, 0x9f, 0xdf, 0x35, 0xa2, 0x2e, 0xeb, 0x26, 0x71, 0x19, 0xfd, - 0xf7, 0x73, 0x37, 0x95, - 0x2c, 0xcf, 0x6a, 0x4b, 0x2b, 0xa5, 0x1c, 0xdd, 0x47, 0x36, 0x63, 0x3d, - 0x17, 0x5a, 0x07, 0x9f, - 0xee, 0x71, 0x16, 0x2c, 0xf4, 0x65, 0xac, 0x11, 0x9c, 0xcb, 0xfd, 0x99, - 0xad, 0xd6, 0x69, 0x19, - 0xb0, 0xcf, 0xed, 0x9c, 0x5d, 0xcb, 0xe3, 0xac, 0xe8, 0xfd, 0x99, 0x75, - 0xbd, 0x3c, 0x33, 0xb7, - 0xb0, 0xaa, 0xa9, 0xa2, 0x36, 0xd3, 0xfe, 0xc1, 0xd4, 0x6f, 0x62, 0xea, - 0x7a, 0x59, 0x63, 0x64, - 0x72, 0xbd, 0x37, 0x6d, 0x55, 0x7d, 0xf6, 0xbd, 0xe6, 0x0a, 0xfa, 0x6b, - 0xd5, 0x83, 0xb4, 0xf5, - 0x5c, 0xe8, 0xbe, 0x35, 0xb1, 0x8a, 0x7a, 0x1a, 0x23, 0x98, 0x39, 0xdf, - 0xa4, 0x4f, 0xd3, 0x48, - 0xb2, 0xdf, 0x29, 0xff, 0xdb, 0x43, 0x30, 0x62, 0x47, 0xe4, 0x09, 0xf8, - 0x58, 0xf4, 0x31, 0xf4, - 0x48, 0xec, 0x21, 0xb8, 0x23, 0xb2, 0x03, 0x3d, 0x12, 0x7f, 0x07, 0x2e, - 0x0b, 0x15, 0xc1, 0x23, - 0x8c, 0x13, 0x84, 0x45, 0x0d, 0x47, 0x83, 0xf9, 0xd1, 0x99, 0xdc, 0x54, - 0xb9, 0x0a, 0x9d, 0x68, - 0x20, 0xf1, 0xc5, 0xf0, 0x43, 0xf8, 0xde, 0xd0, 0xfd, 0x78, 0x7b, 0xf0, - 0x21, 0x74, 0x5f, 0xf0, - 0x17, 0xf8, 0x77, 0xf2, 0x9f, 0x40, 0x47, 0xd3, 0x02, 0xa6, 0xb8, 0x6d, - 0xa2, 0x7f, 0x62, 0x80, - 0xe6, 0x6d, 0x10, 0x8e, 0x23, 0x56, 0xa0, 0x4a, 0x89, 0xf0, 0x3b, 0xb9, - 0x12, 0x4d, 0x0a, 0x5d, - 0xc6, 0x2c, 0xd2, 0x3c, 0xcc, 0xf3, 0xb1, 0xfb, 0xc0, 0xc3, 0xb1, 0xab, - 0xd8, 0x42, 0xa5, 0x8a, - 0x77, 0x4a, 0x15, 0x64, 0xbe, 0x96, 0xe1, 0x52, 0xa9, 0x04, 0x3b, 0x4c, - 0xfb, 0xbd, 0x0c, 0x55, - 0x07, 0x5d, 0x5c, 0x69, 0xb0, 0x08, 0xe4, 0x49, 0xe3, 0x60, 0x52, 0x3e, - 0x9b, 0xe9, 0x0f, 0x9b, - 0xaa, 0x1f, 0x81, 0x8e, 0x94, 0x6b, 0xd0, 0x53, 0xc6, 0x13, 0x14, 0xf7, - 0xc0, 0x66, 0x63, 0x0b, - 0xd8, 0x6a, 0x6c, 0x03, 0xbd, 0xe1, 0x36, 0xf0, 0x27, 0xa3, 0x06, 0xe4, - 0x11, 0x2e, 0x57, 0x6d, - 0x6a, 0x7d, 0xa5, 0xe4, 0xfc, 0xc5, 0x68, 0x92, 0x3a, 0x89, 0xbb, 0x23, - 0xb8, 0x83, 0xeb, 0x26, - 0x36, 0x74, 0xa7, 0xf1, 0x30, 0x7a, 0x52, 0xbf, 0x01, 0x9d, 0xa8, 0x5f, - 0x81, 0xe6, 0x12, 0xce, - 0x59, 0x16, 0xa0, 0x91, 0x8c, 0x04, 0x33, 0xa4, 0x62, 0xc2, 0x9a, 0x4a, - 0x88, 0xdd, 0xe8, 0x20, - 0x18, 0x52, 0x8c, 0x1d, 0xa2, 0x13, 0x5f, 0xd7, 0x80, 0xfd, 0xbd, 0xa1, - 0x4e, 0xf4, 0x44, 0xe8, - 0x51, 0x30, 0x43, 0x75, 0x20, 0x07, 0xb1, 0xa5, 0x27, 0x09, 0x25, 0xb8, - 0x94, 0xb0, 0x2c, 0xc2, - 0x1d, 0x50, 0xa5, 0x3e, 0x85, 0x9b, 0x12, 0xae, 0x04, 0xf9, 0x14, 0xe3, - 0xe5, 0x7c, 0x68, 0x8b, - 0xd9, 0xd9, 0x42, 0x3d, 0x2f, 0x91, 0x13, 0x18, 0xc8, 0x47, 0x79, 0x6a, - 0x29, 0x5c, 0x61, 0x3c, - 0x00, 0x1f, 0x09, 0x6e, 0x84, 0xbd, 0x46, 0x2f, 0xda, 0x18, 0x7c, 0x00, - 0x6e, 0x53, 0xc7, 0xc3, - 0x7c, 0xde, 0xce, 0x17, 0xe1, 0xe2, 0x84, 0x4e, 0x07, 0x6d, 0xb8, 0x42, - 0x76, 0xf3, 0x93, 0x42, - 0x73, 0xb8, 0xc3, 0x22, 0x2e, 0x98, 0x27, 0x24, 0xe2, 0x08, 0xed, 0xd1, - 0x2a, 0xb6, 0x3a, 0x56, - 0xc1, 0x94, 0x04, 0x09, 0x4f, 0x09, 0x10, 0x6e, 0x2f, 0x8e, 0x43, 0x79, - 0x34, 0x9f, 0x50, 0x4a, - 0xe4, 0xd6, 0x8d, 0x23, 0xb8, 0x9e, 0xaf, 0x2e, 0x87, 0x8f, 0x13, 0xfc, - 0xeb, 0x08, 0x3e, 0x07, - 0x1f, 0x57, 0x4b, 0x60, 0x81, 0x40, 0x75, 0x3f, 0x7a, 0xfd, 0x25, 0xb8, - 0x84, 0x8c, 0xd7, 0x79, - 0xca, 0x06, 0xac, 0x45, 0x3a, 0x41, 0xa3, 0xd1, 0xcc, 0x3e, 0x13, 0x3a, - 0x17, 0xe5, 0x13, 0xdb, - 0xbd, 0x8c, 0x27, 0xfd, 0x30, 0xf5, 0x4f, 0x3b, 0xae, 0x14, 0x8f, 0xc5, - 0x0b, 0xa5, 0x05, 0xe8, - 0xa8, 0xc0, 0x22, 0x78, 0x66, 0xe8, 0x12, 0x70, 0x71, 0xf8, 0x34, 0xf6, - 0x38, 0x79, 0x3e, 0x9c, - 0xad, 0xcc, 0x41, 0x73, 0xd5, 0xf9, 0xe0, 0x08, 0x69, 0x01, 0x3e, 0x42, - 0x3c, 0x12, 0x2e, 0x90, - 0xe6, 0xc1, 0xf9, 0xe2, 0x42, 0xb8, 0x30, 0xb0, 0x10, 0xce, 0x0c, 0x9c, - 0x0a, 0xc7, 0x4b, 0x17, - 0x60, 0x95, 0xd8, 0xbb, 0x04, 0xfb, 0x08, 0xe7, 0x5b, 0x03, 0xd7, 0x6a, - 0xab, 0xe1, 0x6a, 0x6d, - 0x15, 0x58, 0xa9, 0xdd, 0x01, 0x6f, 0x54, 0x6b, 0x61, 0x08, 0x9d, 0x35, - 0x22, 0x9e, 0xc2, 0xa1, - 0x16, 0xfa, 0xc7, 0x09, 0x36, 0x50, 0xa5, 0x0e, 0xee, 0x25, 0x77, 0x0a, - 0xb5, 0x65, 0xfb, 0x71, - 0xef, 0xad, 0xf5, 0xa7, 0x34, 0x3f, 0xba, 0xe3, 0x1a, 0x6a, 0xe3, 0xa6, - 0xab, 0x4a, 0xfd, 0xec, - 0x73, 0x2b, 0x2f, 0x5d, 0xf9, 0xce, 0xed, 0x27, 0x4f, 0x8c, 0x39, 0xea, - 0xb2, 0xe5, 0x39, 0xd0, - 0xbd, 0x63, 0xe8, 0x1e, 0x3f, 0xd9, 0xea, 0xb9, 0xd0, 0x7a, 0xeb, 0xe6, - 0xfc, 0xcf, 0xb4, 0xbf, - 0x49, 0x9f, 0x86, 0x65, 0xa9, 0x7e, 0x53, 0xae, 0xea, 0xb4, 0x0c, 0xd4, - 0x79, 0xb5, 0xb3, 0x36, - 0x39, 0x8b, 0x3f, 0x45, 0xb4, 0x1a, 0xaf, 0xd7, 0xb7, 0x9f, 0x4e, 0xda, - 0xfd, 0x83, 0xfb, 0xfc, - 0x26, 0x0d, 0x89, 0x7d, 0xe5, 0x33, 0xe6, 0x9b, 0x58, 0xac, 0x55, 0x3f, - 0xda, 0xbd, 0x69, 0x47, - 0x5f, 0xbb, 0x66, 0x68, 0x3d, 0x97, 0x01, 0xbf, 0x49, 0xb6, 0x7c, 0x13, - 0x3c, 0x32, 0xc7, 0xc5, - 0x20, 0xcf, 0xd8, 0xde, 0xf0, 0xfd, 0xe8, 0xe9, 0xe8, 0x33, 0xe0, 0x99, - 0xe8, 0x53, 0xe8, 0xc9, - 0xd8, 0x93, 0xf0, 0x31, 0x82, 0x85, 0xcf, 0x44, 0x3e, 0x87, 0xfe, 0x86, - 0x29, 0xe0, 0x94, 0xa6, - 0x93, 0xc0, 0xc2, 0xd8, 0x0c, 0x34, 0x4d, 0x9b, 0x84, 0xaa, 0x03, 0x13, - 0xf1, 0x82, 0x10, 0xc0, - 0x2f, 0x07, 0x1f, 0x45, 0x8f, 0x87, 0x1f, 0x45, 0x0f, 0x46, 0x9f, 0x44, - 0x9f, 0xea, 0xbf, 0x64, - 0xb5, 0x8e, 0x33, 0x7d, 0x8e, 0xae, 0x32, 0x5f, 0xb5, 0x51, 0x86, 0x4a, - 0x78, 0x1b, 0xe1, 0x74, - 0x65, 0xa8, 0x54, 0x2c, 0x83, 0xa5, 0x92, 0x13, 0x4d, 0xd0, 0xe6, 0x72, - 0x73, 0x63, 0xa7, 0x72, - 0x97, 0x18, 0x22, 0xfb, 0xb3, 0xd8, 0xbd, 0xdc, 0xce, 0xd8, 0x0d, 0x4c, - 0x9e, 0xe8, 0x22, 0x36, - 0x20, 0xc1, 0x21, 0x8a, 0x2a, 0x7c, 0x19, 0x74, 0x69, 0xd3, 0xe1, 0xec, - 0xd0, 0x5c, 0x70, 0x58, - 0x70, 0x12, 0xb1, 0xb7, 0xcb, 0x91, 0x13, 0x11, 0x6c, 0xa4, 0xff, 0x26, - 0x96, 0x60, 0x9b, 0x3a, - 0x05, 0xcf, 0xd4, 0x8f, 0x45, 0x30, 0xd8, 0x8a, 0x9e, 0xd0, 0x9f, 0x47, - 0xdb, 0x09, 0x9f, 0xba, - 0x3f, 0x78, 0x1f, 0xdc, 0x4a, 0x38, 0xe0, 0x36, 0x82, 0x7f, 0x9b, 0x09, - 0x77, 0xda, 0x19, 0xba, - 0x05, 0xe4, 0x2b, 0xe3, 0xa1, 0x9b, 0x70, 0x3a, 0x87, 0xe8, 0x40, 0x25, - 0x82, 0x0d, 0x4f, 0xd4, - 0x4e, 0xe5, 0x58, 0xc2, 0xff, 0x7a, 0x08, 0xb7, 0xdd, 0xa2, 0x6f, 0x84, - 0x5b, 0xf5, 0x27, 0x51, - 0xb3, 0xae, 0xa2, 0xf5, 0xca, 0x99, 0x68, 0x92, 0xe4, 0xc0, 0x94, 0x37, - 0x15, 0x0b, 0x14, 0x17, - 0x1c, 0x26, 0x7e, 0x38, 0x08, 0x56, 0x4f, 0x35, 0x66, 0x82, 0x1f, 0xc4, - 0x18, 0xdf, 0x96, 0x60, - 0x17, 0x7c, 0xda, 0xf8, 0xff, 0xd8, 0xbb, 0xee, 0xf8, 0x28, 0xaa, 0xb5, - 0x9d, 0xde, 0x7b, 0xe8, - 0xbd, 0x49, 0xb5, 0x21, 0x22, 0x08, 0x16, 0x04, 0x45, 0xe5, 0xaa, 0xd8, - 0xaf, 0xf5, 0xb3, 0x8b, - 0x15, 0x90, 0x12, 0xb2, 0x3b, 0x73, 0xca, 0xec, 0xce, 0x4e, 0xd9, 0x96, - 0x46, 0x00, 0x11, 0x15, - 0x0b, 0x0a, 0xa8, 0x28, 0x48, 0x11, 0x08, 0xbd, 0x4b, 0xef, 0x24, 0x24, - 0x01, 0x42, 0x6f, 0xd2, - 0x44, 0xc5, 0x7b, 0x95, 0xef, 0x3d, 0xb3, 0xbb, 0x61, 0x93, 0x6c, 0x99, - 0x85, 0xd5, 0xeb, 0x1f, - 0xfc, 0xce, 0xef, 0xb0, 0x61, 0xb3, 0x75, 0x32, 0xef, 0x33, 0x6f, 0x7b, - 0x9e, 0x77, 0x3a, 0xaa, - 0x6f, 0x89, 0x23, 0xf1, 0xa6, 0x74, 0xd2, 0x04, 0x1e, 0x17, 0x67, 0x4a, - 0x11, 0x1a, 0x4b, 0x1d, - 0xd1, 0x8d, 0x05, 0xd7, 0xe1, 0xe6, 0xe0, 0x77, 0x25, 0xcb, 0x59, 0xa4, - 0x45, 0x7e, 0x3b, 0x63, - 0x73, 0x7b, 0x7d, 0xbe, 0xbe, 0x99, 0x69, 0x40, 0x75, 0xc3, 0x39, 0xf6, - 0xe1, 0x78, 0x28, 0x7c, - 0xbe, 0xa5, 0xf6, 0x29, 0x78, 0x92, 0x6d, 0x32, 0xf9, 0x1c, 0xfc, 0xbf, - 0x89, 0xf6, 0xc5, 0xb8, - 0x44, 0x4d, 0xc2, 0x11, 0x80, 0x7e, 0xf1, 0xe0, 0xa3, 0x25, 0x08, 0xb1, - 0xa6, 0x18, 0x31, 0x9b, - 0x76, 0xc9, 0xeb, 0x81, 0x6f, 0x2c, 0x6c, 0x43, 0x1a, 0x58, 0x12, 0x49, - 0xac, 0x29, 0x03, 0x35, - 0x72, 0xb4, 0xe4, 0x9a, 0xe7, 0xb7, 0xe0, 0x1a, 0xaa, 0x69, 0x7c, 0x82, - 0x39, 0x86, 0x44, 0x9b, - 0x62, 0x68, 0x0c, 0x7c, 0x8f, 0x18, 0x01, 0x6e, 0x49, 0x2c, 0x89, 0x01, - 0xff, 0x33, 0x5e, 0x48, - 0x26, 0x3d, 0x55, 0x91, 0x7c, 0xe3, 0x98, 0x88, 0x3f, 0xb2, 0x7f, 0x0b, - 0xf8, 0x9a, 0x42, 0x22, - 0x01, 0xd3, 0xe2, 0x01, 0x57, 0x21, 0x7a, 0x07, 0x2f, 0x36, 0x9a, 0x3c, - 0x68, 0x35, 0x20, 0x5b, - 0xde, 0x47, 0x68, 0xac, 0x6d, 0x34, 0x3f, 0xc9, 0x71, 0x2b, 0x89, 0x10, - 0x58, 0xed, 0x3b, 0x01, - 0x8e, 0x49, 0x3c, 0x89, 0x37, 0x27, 0x9b, 0xe2, 0x85, 0x08, 0x13, 0xd8, - 0x0e, 0xa9, 0x6f, 0x6f, - 0x81, 0xda, 0x16, 0x34, 0xe1, 0x52, 0xed, 0xb1, 0x3c, 0xe3, 0xbc, 0x45, - 0x9a, 0xa2, 0x68, 0x14, - 0x5c, 0x67, 0x5c, 0x57, 0xc9, 0x1a, 0x99, 0x1b, 0xf8, 0xa9, 0x09, 0x69, - 0x6a, 0xba, 0x97, 0x0a, - 0x0c, 0xfb, 0xc0, 0xe7, 0x1b, 0xac, 0xbe, 0x0b, 0xd8, 0xf7, 0x0e, 0x7e, - 0x5b, 0x79, 0x0d, 0xbf, - 0xaa, 0xbc, 0x82, 0x9f, 0x95, 0x87, 0x62, 0x33, 0xe9, 0x25, 0xd4, 0x38, - 0xbb, 0xed, 0x8d, 0x72, - 0xae, 0x9d, 0x76, 0xd7, 0x53, 0x4f, 0x6c, 0x18, 0x74, 0x1b, 0xeb, 0x5f, - 0x69, 0x97, 0x17, 0x31, - 0x2c, 0x42, 0x6d, 0x38, 0x4a, 0xc3, 0xbd, 0x1f, 0xed, 0x77, 0x4e, 0xf9, - 0x72, 0xc5, 0xf3, 0x27, - 0x2c, 0x17, 0xb9, 0x80, 0x9a, 0xfc, 0x96, 0x13, 0xdc, 0x50, 0x56, 0x07, - 0x9e, 0xdf, 0xfe, 0xc1, - 0x04, 0x6b, 0x82, 0x51, 0x8f, 0x3e, 0x74, 0x96, 0x3f, 0x7d, 0x7c, 0x2f, - 0x1d, 0xfc, 0xda, 0xb3, - 0x90, 0x99, 0xfd, 0x7b, 0xeb, 0xb9, 0x68, 0xdf, 0xd9, 0xa3, 0x69, 0x15, - 0x26, 0xfd, 0x65, 0x66, - 0x77, 0x41, 0x75, 0x5a, 0xdc, 0xc7, 0x3b, 0xc6, 0x1e, 0xcf, 0xc5, 0x5a, - 0x82, 0xf8, 0xba, 0x5a, - 0xbe, 0x3f, 0x2b, 0xe4, 0x7c, 0x7f, 0xdd, 0xfc, 0x5a, 0x2d, 0x6d, 0x2b, - 0x7f, 0xf9, 0x35, 0xef, - 0xbc, 0x5e, 0x18, 0x67, 0xd3, 0x5e, 0xf1, 0x0c, 0x4a, 0x77, 0xdd, 0x84, - 0xcd, 0x95, 0x0f, 0xce, - 0x37, 0x89, 0xaa, 0xe3, 0x33, 0xab, 0x70, 0x9e, 0x6d, 0x75, 0xce, 0xc0, - 0x73, 0xf3, 0xe7, 0xf3, - 0x8b, 0x0b, 0xe6, 0xe3, 0xf9, 0x05, 0x0b, 0xd0, 0xfc, 0xfc, 0x1f, 0xd0, - 0x0f, 0xb6, 0xd3, 0xfc, - 0xc7, 0xc5, 0x37, 0x70, 0x37, 0x17, 0xb7, 0x37, 0xb6, 0xb0, 0x35, 0xa6, - 0x59, 0x62, 0x7d, 0x53, - 0x96, 0x29, 0x96, 0x3e, 0xe2, 0xf8, 0x1a, 0x2f, 0xc8, 0x9b, 0x89, 0x17, - 0xe6, 0xad, 0xc0, 0xab, - 0x9c, 0x5b, 0xc8, 0xb4, 0xa2, 0x07, 0x8d, 0x2d, 0x3e, 0xed, 0x30, 0xea, - 0x86, 0xe2, 0x8e, 0xc6, - 0xb6, 0x96, 0xe6, 0xb4, 0xa9, 0xa5, 0xb9, 0x39, 0xc3, 0x9c, 0x22, 0x24, - 0x01, 0xbe, 0x64, 0xab, - 0x2d, 0x50, 0x67, 0x47, 0x07, 0xae, 0xbe, 0xa3, 0x35, 0x79, 0xc1, 0x39, - 0x1a, 0xcd, 0xc9, 0xff, - 0x86, 0x5f, 0x5f, 0xf0, 0x74, 0x6e, 0x84, 0x90, 0x46, 0x21, 0xf6, 0x05, - 0x9f, 0x05, 0x6e, 0x2d, - 0x4d, 0xf8, 0x36, 0x79, 0xed, 0xb8, 0xe6, 0x8e, 0x86, 0x7c, 0xa6, 0x9a, - 0xcc, 0xf0, 0x93, 0xd9, - 0xb3, 0x90, 0x60, 0x4e, 0xa0, 0x91, 0x96, 0x86, 0xa4, 0x1d, 0x60, 0x5f, - 0x1f, 0x5b, 0x2e, 0x59, - 0x64, 0x5f, 0x0a, 0x3e, 0xd5, 0x57, 0xb0, 0xbf, 0xc5, 0xdf, 0xda, 0xa7, - 0x41, 0x0c, 0xf8, 0x15, - 0xfe, 0xda, 0xf6, 0x15, 0xfe, 0xd2, 0xf1, 0x25, 0x5e, 0x64, 0x7b, 0x1e, - 0x7c, 0xa4, 0x2c, 0x92, - 0xce, 0xf0, 0x8c, 0xf9, 0x71, 0x80, 0x1d, 0x0d, 0xd4, 0xa7, 0xf8, 0x02, - 0xc0, 0xbf, 0xcf, 0xed, - 0x93, 0x09, 0xe0, 0x24, 0xfe, 0xc6, 0xfa, 0x25, 0xf9, 0x1e, 0x30, 0xf0, - 0x6b, 0xd9, 0x41, 0xee, - 0xb2, 0x34, 0x21, 0x0d, 0x44, 0x40, 0x14, 0xc0, 0x69, 0xc6, 0x3b, 0x4b, - 0x30, 0x27, 0xd2, 0xc6, - 0x72, 0x7b, 0xdc, 0x39, 0xbf, 0xad, 0xb1, 0x77, 0xfe, 0xb0, 0xdc, 0x19, - 0xf6, 0x89, 0xf0, 0xfd, - 0xbf, 0x44, 0x59, 0x70, 0x8d, 0x4d, 0x12, 0x32, 0x49, 0x23, 0xc0, 0x9d, - 0xfa, 0x52, 0x5b, 0x7c, - 0xa3, 0xe3, 0x26, 0xd4, 0x21, 0xaf, 0x31, 0x4a, 0x55, 0xe2, 0x51, 0x03, - 0x5b, 0x1b, 0xd4, 0xd6, - 0xd1, 0xd2, 0x98, 0x6d, 0x4a, 0xc4, 0x09, 0x4a, 0x63, 0xf4, 0x54, 0xbe, - 0x91, 0xff, 0xcc, 0x31, - 0x9f, 0x2c, 0x74, 0x4c, 0x23, 0x5f, 0xc1, 0x31, 0x9a, 0x6a, 0x63, 0x9f, - 0xef, 0x0b, 0xf2, 0x99, - 0x7d, 0x05, 0x9e, 0x21, 0xc7, 0xa1, 0x28, 0xca, 0xfc, 0xb4, 0x78, 0x12, - 0x6b, 0x49, 0xa1, 0x6d, - 0xf2, 0x6f, 0x47, 0x7d, 0x0a, 0x6f, 0x34, 0x34, 0xb6, 0x65, 0xa0, 0x14, - 0x4b, 0x1a, 0xdf, 0x50, - 0x6d, 0x65, 0x6c, 0xe3, 0x68, 0x65, 0x6c, 0x60, 0xcb, 0xe2, 0xd3, 0x45, - 0xe6, 0x1d, 0xc6, 0x01, - 0xa2, 0xb9, 0x6a, 0x1a, 0xf1, 0x0c, 0xb7, 0x04, 0x38, 0x22, 0x70, 0x3c, - 0xd3, 0xc5, 0x16, 0x64, - 0x80, 0x55, 0x25, 0x33, 0xe0, 0x3b, 0x7f, 0x64, 0x9f, 0x8c, 0x0b, 0x1c, - 0xc9, 0x24, 0x0a, 0xfc, - 0x3a, 0xf6, 0xe8, 0x78, 0x53, 0x9c, 0xa9, 0x81, 0xd8, 0x08, 0xdf, 0x9f, - 0x6f, 0xe6, 0x0b, 0x1c, - 0x13, 0xd0, 0xfb, 0xb6, 0x02, 0xfe, 0x7d, 0xdb, 0x2d, 0x70, 0xce, 0x24, - 0xb3, 0xda, 0x8e, 0xe6, - 0xfb, 0xb1, 0x08, 0x39, 0x49, 0x48, 0x16, 0x1a, 0xa9, 0x9d, 0x51, 0xd7, - 0xfc, 0xeb, 0xb9, 0x76, - 0x8e, 0x06, 0x7c, 0x9a, 0x98, 0x8a, 0x53, 0xcd, 0x59, 0x34, 0xcb, 0x0c, - 0xbe, 0xba, 0x99, 0xf9, - 0x91, 0x8c, 0x8b, 0x97, 0x41, 0xe1, 0xea, 0x44, 0x92, 0x05, 0x88, 0xd5, - 0x49, 0x9a, 0x39, 0xdd, - 0xd4, 0x9d, 0xb6, 0x36, 0xdd, 0x41, 0x91, 0x3a, 0x14, 0x0d, 0x76, 0xbe, - 0x6d, 0x78, 0x4b, 0x79, - 0x0b, 0x0f, 0x82, 0x38, 0xfc, 0x75, 0xe5, 0x25, 0xfc, 0x82, 0xf2, 0x7f, - 0xf8, 0x29, 0xe9, 0x0d, - 0x6c, 0x24, 0xbd, 0xa9, 0xc6, 0x55, 0x63, 0x78, 0x91, 0xd7, 0x6e, 0xd8, - 0xcb, 0x5b, 0x07, 0xf5, - 0xa8, 0x11, 0xe3, 0xce, 0x6c, 0xf8, 0x68, 0xc4, 0x07, 0x7d, 0xdf, 0x60, - 0x3f, 0x4f, 0x1c, 0x7f, - 0xf1, 0x8d, 0xa0, 0xf3, 0x48, 0x94, 0x2a, 0xc3, 0x8a, 0xef, 0xec, 0x4f, - 0xb2, 0xc7, 0x3f, 0x31, - 0x29, 0xfa, 0x45, 0xc6, 0x0d, 0x8e, 0xd0, 0x33, 0x6b, 0x4e, 0x27, 0xf7, - 0x8d, 0xcd, 0x1c, 0xf4, - 0xa7, 0xe7, 0xa2, 0xd5, 0x4d, 0xd4, 0x24, 0x63, 0xb8, 0x72, 0x58, 0x7a, - 0x75, 0x5a, 0x3c, 0x3e, - 0x4a, 0x9c, 0x23, 0xde, 0x18, 0x2d, 0x06, 0xc1, 0xbf, 0x2b, 0x99, 0x4d, - 0x5b, 0xa3, 0x47, 0x5b, - 0xeb, 0x4b, 0x36, 0xb0, 0xcf, 0x17, 0x94, 0x6f, 0x12, 0x06, 0xad, 0xfa, - 0xbf, 0x4a, 0xbb, 0x46, - 0xcb, 0xeb, 0x39, 0x62, 0x73, 0x03, 0xf3, 0x4d, 0xe2, 0xb5, 0xda, 0x72, - 0xbc, 0x17, 0xdf, 0x84, - 0xc5, 0xbf, 0xa5, 0x79, 0xb3, 0xf0, 0xa2, 0x82, 0xc5, 0xdc, 0xe2, 0x82, - 0x45, 0x68, 0x59, 0xc1, - 0x42, 0xb4, 0x34, 0x7f, 0x19, 0x3f, 0xcf, 0xf6, 0x33, 0x37, 0xa5, 0xb8, - 0x03, 0xd7, 0xd9, 0xde, - 0x8c, 0x6f, 0x22, 0xb1, 0x0e, 0xe8, 0x6c, 0x88, 0x58, 0x23, 0xe8, 0x60, - 0xe7, 0x4a, 0xb2, 0xc8, - 0x31, 0x8f, 0x7c, 0x68, 0x1d, 0x8e, 0x1f, 0x91, 0x3a, 0x91, 0x4c, 0xb9, - 0x3d, 0x7f, 0x8f, 0xfa, - 0x10, 0xd7, 0x5f, 0xea, 0x4d, 0x3a, 0x4a, 0xcd, 0x71, 0x43, 0xe9, 0x66, - 0xda, 0x8a, 0xc6, 0x99, - 0x53, 0xc5, 0x7a, 0x42, 0x07, 0x67, 0x67, 0xbe, 0x9d, 0xa3, 0x09, 0x4a, - 0x94, 0x5b, 0x90, 0x81, - 0x05, 0x4e, 0x7e, 0x61, 0xde, 0xd7, 0xfc, 0x92, 0x82, 0x27, 0x21, 0x16, - 0x02, 0xff, 0x0e, 0x7c, - 0xbb, 0x14, 0xb1, 0x01, 0x6d, 0x6e, 0xbb, 0x86, 0x6b, 0x5f, 0xd0, 0x81, - 0x6b, 0x65, 0x6b, 0xca, - 0x35, 0x95, 0x1b, 0xa1, 0x7a, 0x62, 0x03, 0x92, 0x2d, 0x67, 0xd1, 0xfa, - 0x6a, 0x3d, 0xd2, 0x46, - 0x69, 0x00, 0x31, 0xd9, 0x08, 0x32, 0xd3, 0xba, 0x1c, 0x36, 0xc4, 0xb0, - 0xf6, 0x39, 0x64, 0x96, - 0xed, 0x7b, 0xc0, 0x40, 0x86, 0x7f, 0xb0, 0x6d, 0xd3, 0xd0, 0x34, 0xc7, - 0x54, 0xb2, 0x5a, 0x7d, - 0x09, 0xfc, 0x9c, 0x2c, 0x92, 0x66, 0x62, 0xb9, 0xb0, 0x14, 0xad, 0x97, - 0xa5, 0x8d, 0xed, 0x31, - 0x7e, 0xb4, 0x7d, 0x0e, 0xff, 0x35, 0xf8, 0x61, 0x53, 0xad, 0xd3, 0xc9, - 0x37, 0xd6, 0x6f, 0xc8, - 0x34, 0xeb, 0x57, 0x64, 0xb6, 0xb2, 0x08, 0x17, 0xcb, 0xf7, 0x93, 0xa6, - 0x52, 0x1b, 0x92, 0x6d, - 0x8e, 0x25, 0x29, 0x8c, 0x6f, 0x2b, 0x35, 0x26, 0x1d, 0xed, 0x5d, 0xf8, - 0x0e, 0x05, 0x2d, 0x0d, - 0xdd, 0xf3, 0xde, 0x30, 0xcc, 0xb3, 0x4d, 0x41, 0xb3, 0xed, 0xe3, 0x50, - 0x36, 0xe0, 0x5f, 0xb2, - 0x29, 0x15, 0xfc, 0xbf, 0x26, 0xa4, 0xb3, 0xb5, 0x2b, 0x7f, 0x5d, 0x41, - 0x7b, 0xd4, 0x44, 0xae, - 0x6f, 0x6c, 0x64, 0x6d, 0x63, 0xec, 0xec, 0x68, 0x68, 0x4c, 0x55, 0xea, - 0xf1, 0x59, 0x62, 0x63, - 0xd2, 0x3c, 0xef, 0x79, 0xee, 0xa3, 0xc2, 0x19, 0xdc, 0x34, 0xc7, 0xb7, - 0x64, 0xba, 0xf3, 0x1b, - 0x3c, 0xd5, 0xfe, 0x2d, 0x99, 0x06, 0x31, 0xf0, 0x34, 0xdb, 0x54, 0x32, - 0xd5, 0xbe, 0x0c, 0x7f, - 0x61, 0xcd, 0xe0, 0x13, 0x2c, 0x99, 0x24, 0x43, 0x6a, 0x80, 0xbb, 0xaa, - 0xf7, 0xa2, 0x87, 0x8a, - 0xfb, 0x1a, 0x3b, 0x3b, 0xeb, 0xe7, 0x66, 0x2a, 0x59, 0xc6, 0xc6, 0xd6, - 0x16, 0xc6, 0x46, 0xf6, - 0x4c, 0x43, 0xaa, 0x25, 0x89, 0x4f, 0x10, 0xe3, 0x70, 0xac, 0x09, 0x7c, - 0x4e, 0x0a, 0x91, 0x32, - 0x60, 0x5e, 0x14, 0xbb, 0x16, 0x80, 0x57, 0x17, 0xcb, 0xf2, 0x86, 0xe6, - 0x4c, 0xd2, 0x58, 0x6a, - 0x49, 0x9e, 0x04, 0xdf, 0x74, 0x86, 0x63, 0x12, 0xf9, 0xd8, 0xfe, 0x19, - 0x36, 0x02, 0xfe, 0x45, - 0x0b, 0x2c, 0xf7, 0x17, 0x47, 0x93, 0xe5, 0x66, 0xa4, 0x3d, 0xf8, 0xc0, - 0x5d, 0xf3, 0xdf, 0xe3, - 0xc7, 0xda, 0xdf, 0x07, 0xff, 0xaf, 0x90, 0x2f, 0xb6, 0x76, 0x83, 0xbf, - 0x71, 0x1c, 0x8d, 0x06, - 0x1f, 0x32, 0x1a, 0xae, 0x5d, 0xcc, 0x4f, 0xcc, 0xb2, 0xb4, 0xc5, 0x5d, - 0x6c, 0x9d, 0xb8, 0x66, - 0x6a, 0x7d, 0x63, 0x92, 0x9c, 0x80, 0xe2, 0x01, 0xf3, 0x92, 0xe1, 0x77, - 0x80, 0x5b, 0x34, 0x8a, - 0xc4, 0xc2, 0xbb, 0x46, 0x03, 0x8e, 0x01, 0x16, 0x12, 0xf0, 0xa3, 0x85, - 0x14, 0x92, 0x4e, 0x1b, - 0x0a, 0xcd, 0xe4, 0x5e, 0xe4, 0x46, 0x71, 0x00, 0xcd, 0x99, 0xfe, 0xc6, - 0xbf, 0x35, 0x2c, 0x9b, - 0xfb, 0xfa, 0xc3, 0xaf, 0x3a, 0x5e, 0x36, 0xbc, 0x22, 0xbf, 0x08, 0xbe, - 0xdf, 0xd3, 0xf8, 0x51, - 0xe9, 0x15, 0x3c, 0x94, 0xf6, 0xa4, 0xf1, 0x4a, 0x9c, 0x31, 0x56, 0x8a, - 0xe1, 0xef, 0x59, 0x3d, - 0xa8, 0xaf, 0x77, 0x8c, 0xab, 0xf5, 0xaf, 0xac, 0xe8, 0xdb, 0x2f, 0x69, - 0xda, 0x20, 0xed, 0xf9, - 0x81, 0xfc, 0xbe, 0xf3, 0x8e, 0xd2, 0x11, 0x33, 0x66, 0xd9, 0x1f, 0x1d, - 0xea, 0xd5, 0xff, 0xd7, - 0xc8, 0x11, 0x33, 0x92, 0xc5, 0x33, 0xc1, 0xed, 0x2e, 0x73, 0x54, 0xba, - 0x0e, 0x5d, 0x76, 0x2f, - 0xce, 0xa9, 0xdf, 0xf9, 0xc1, 0xac, 0x56, 0xc0, 0xf0, 0x25, 0xf0, 0x7c, - 0x93, 0xd0, 0x74, 0xd9, - 0x63, 0x74, 0xce, 0x7d, 0x63, 0xdc, 0xb7, 0x28, 0x73, 0x60, 0x5c, 0x0b, - 0x4d, 0xe7, 0x2b, 0x2a, - 0xa8, 0xce, 0x17, 0x3b, 0x26, 0x09, 0xbe, 0xf8, 0x26, 0x5e, 0x75, 0x93, - 0x04, 0x7b, 0x4a, 0xae, - 0x4b, 0xe7, 0x2b, 0x30, 0xdf, 0x24, 0x94, 0xd9, 0xb4, 0x31, 0xba, 0xfa, - 0xf5, 0x12, 0xf4, 0x6a, - 0xd7, 0x04, 0xe5, 0x9b, 0xb0, 0xef, 0xe5, 0xcd, 0x37, 0xb1, 0x0b, 0x80, - 0x7f, 0xf9, 0xf3, 0xd1, - 0xca, 0x82, 0x65, 0xdc, 0x8a, 0xc2, 0x65, 0xe0, 0x03, 0x2e, 0xe3, 0x97, - 0xe7, 0xad, 0xe4, 0x17, - 0x5a, 0xcf, 0x73, 0xce, 0xa2, 0x14, 0xae, 0x85, 0xa5, 0xb1, 0x50, 0x4f, - 0xcc, 0x34, 0xd5, 0x03, - 0xaf, 0x2e, 0x5d, 0x88, 0x14, 0x06, 0x39, 0x97, 0xd1, 0xa5, 0xb6, 0xa5, - 0xf4, 0x13, 0xa6, 0xe3, - 0x2c, 0x8b, 0xb4, 0x40, 0xfd, 0x10, 0x7f, 0xa1, 0x4c, 0xe1, 0x27, 0x38, - 0x8a, 0xc9, 0xe8, 0xbc, - 0x71, 0xc8, 0xaa, 0x74, 0xc3, 0x59, 0xe0, 0x65, 0x34, 0x77, 0x74, 0xc1, - 0x5d, 0xec, 0xad, 0x50, - 0x7d, 0x29, 0x83, 0x26, 0x29, 0xad, 0xd0, 0x13, 0x45, 0x85, 0xc6, 0x65, - 0x79, 0xd3, 0xd0, 0xcc, - 0x82, 0x87, 0xe0, 0x33, 0xa6, 0xd0, 0x54, 0x88, 0x01, 0x5b, 0xc8, 0x1d, - 0x68, 0x27, 0x67, 0x33, - 0xf0, 0xff, 0x06, 0xf0, 0x8d, 0xd5, 0x86, 0x7c, 0x0b, 0xf9, 0x1a, 0xd4, - 0x49, 0x69, 0x83, 0x3b, - 0x82, 0xbd, 0x75, 0x56, 0x52, 0x48, 0x47, 0xeb, 0x13, 0xe4, 0x73, 0x75, - 0x03, 0x99, 0x0f, 0x7e, - 0xdb, 0x0f, 0xca, 0x6c, 0x32, 0xdf, 0x36, 0x8f, 0xcc, 0xb2, 0xce, 0x86, - 0xd8, 0x74, 0x26, 0xfa, - 0x0e, 0x70, 0xf0, 0x3b, 0xdb, 0x74, 0x3c, 0xc3, 0xfe, 0x35, 0xdd, 0xad, - 0xbc, 0x0a, 0xe7, 0x4a, - 0x26, 0xe0, 0x5f, 0x1a, 0x49, 0x12, 0x53, 0x48, 0x86, 0xa5, 0x11, 0xed, - 0x69, 0xbb, 0x16, 0xe2, - 0xdf, 0xa5, 0xe8, 0x1b, 0xeb, 0x54, 0xf0, 0xfd, 0x66, 0x91, 0xe9, 0x56, - 0x88, 0xd9, 0xad, 0x33, - 0xc8, 0x0c, 0xeb, 0xb7, 0x64, 0x89, 0xfa, 0x03, 0xce, 0x51, 0xba, 0xe2, - 0x5b, 0x2c, 0x8d, 0x69, - 0xbc, 0x39, 0x53, 0x68, 0x65, 0xbd, 0x8e, 0xbf, 0xae, 0xf0, 0x1a, 0x43, - 0x0b, 0x67, 0x9a, 0xa1, - 0x5f, 0x9e, 0xc0, 0x7f, 0x6f, 0xfb, 0x0e, 0xcf, 0x76, 0x3a, 0x00, 0xff, - 0xe2, 0x48, 0x82, 0x98, - 0x4d, 0xba, 0xaa, 0x37, 0xd3, 0x6e, 0x79, 0x5d, 0xb8, 0xae, 0x8e, 0x74, - 0x14, 0x2d, 0xa5, 0xf0, - 0x0d, 0x6d, 0x6d, 0xb8, 0x4e, 0x8e, 0xbb, 0xb8, 0xbb, 0xa5, 0x7a, 0x28, - 0x59, 0x69, 0xc8, 0xf5, - 0x71, 0x7c, 0xce, 0x2d, 0x74, 0xce, 0x42, 0xd3, 0xed, 0xdf, 0xe3, 0xd9, - 0x76, 0x78, 0x2f, 0xfb, - 0x74, 0x32, 0x1d, 0x3e, 0xdb, 0x34, 0xdb, 0x77, 0x64, 0x9a, 0x7d, 0x19, - 0x1a, 0x6c, 0x8b, 0xe4, - 0x93, 0xe4, 0x0c, 0x92, 0x69, 0x6d, 0x8d, 0x6e, 0xb6, 0xf6, 0x46, 0x77, - 0xe4, 0x77, 0x43, 0x1d, - 0xf2, 0xdb, 0xf1, 0xd7, 0x38, 0xda, 0xc2, 0x77, 0xbf, 0x09, 0xdd, 0xee, - 0xbc, 0x15, 0xdf, 0x28, - 0x5d, 0x4b, 0xaf, 0xb1, 0x34, 0x05, 0x3f, 0x3b, 0x0d, 0xde, 0x33, 0x1e, - 0x47, 0x4a, 0xf5, 0x70, - 0x17, 0xc6, 0x33, 0xa6, 0x09, 0x24, 0x81, 0xa6, 0x92, 0xfa, 0x96, 0x66, - 0xa4, 0xa9, 0x9a, 0x41, - 0x06, 0x3a, 0xc1, 0x07, 0x76, 0x7c, 0x41, 0x26, 0xd9, 0x26, 0x61, 0x83, - 0x3d, 0x05, 0x47, 0x01, - 0xb6, 0x25, 0x82, 0xef, 0xdb, 0x5c, 0x6d, 0x83, 0x9a, 0x4a, 0xc9, 0xa8, - 0x95, 0xda, 0x17, 0x15, - 0x59, 0x3f, 0xc0, 0xa3, 0x6d, 0x45, 0x3c, 0xa7, 0x36, 0xd7, 0xfc, 0xbf, - 0x34, 0xe6, 0xcb, 0x81, - 0x47, 0x97, 0x69, 0x6e, 0x48, 0x3a, 0xc8, 0x37, 0xe1, 0xeb, 0xad, 0x1d, - 0xf8, 0xf6, 0xd6, 0x96, - 0x7c, 0x13, 0xb1, 0x39, 0x69, 0x65, 0x6a, 0x4e, 0x9b, 0x9b, 0x5b, 0xe3, - 0x66, 0x26, 0xb8, 0xee, - 0x90, 0x4c, 0xf0, 0x51, 0x1b, 0xe0, 0x66, 0x2c, 0x9f, 0x88, 0x13, 0x85, - 0x54, 0x5a, 0x5f, 0x68, - 0x2a, 0xb6, 0x26, 0xcd, 0x95, 0x6b, 0x70, 0x5f, 0xf1, 0x59, 0xfa, 0x26, - 0x8b, 0x65, 0x3d, 0xb8, - 0xb6, 0xf9, 0xb5, 0x5e, 0xaf, 0x4c, 0xfa, 0xbf, 0x97, 0xfe, 0x2d, 0x3d, - 0x89, 0x07, 0x5a, 0x9e, - 0xc3, 0x6f, 0xd0, 0x1e, 0x80, 0x7f, 0xf1, 0xc6, 0xf8, 0xc2, 0x56, 0xef, - 0x69, 0xbf, 0x5f, 0x6f, - 0xbe, 0x7d, 0xe2, 0xd4, 0x15, 0xcf, 0x54, 0x29, 0x17, 0x0d, 0x27, 0xbe, - 0x1d, 0xf4, 0xe4, 0xa0, - 0x4d, 0x4f, 0xf7, 0xea, 0xbe, 0x78, 0xd0, 0x7d, 0x2c, 0xf6, 0xf5, 0x85, - 0x7b, 0x55, 0xe3, 0x4b, - 0xde, 0x98, 0xb8, 0xd8, 0x70, 0x9f, 0xaf, 0xda, 0xc8, 0xa0, 0x92, 0x8e, - 0x0f, 0xc4, 0xcb, 0xc1, - 0xfa, 0x41, 0xc0, 0xee, 0xf2, 0xb3, 0x2e, 0x47, 0xd3, 0xaa, 0xae, 0x9e, - 0x4b, 0x61, 0xc6, 0x25, - 0x6d, 0x3b, 0x7f, 0xf3, 0x83, 0xdd, 0xef, 0x99, 0x12, 0x46, 0xfd, 0x65, - 0x0f, 0x16, 0xb1, 0x5e, - 0xe8, 0x28, 0x53, 0x90, 0x5c, 0x67, 0x08, 0xfd, 0x7a, 0xa1, 0x1f, 0x13, - 0xdf, 0x7a, 0x2e, 0xba, - 0xf8, 0x26, 0x21, 0x6a, 0xd5, 0x07, 0xd7, 0xae, 0xc9, 0xd0, 0xcd, 0x7d, - 0xf3, 0xad, 0x5d, 0x73, - 0x49, 0x07, 0xdf, 0x17, 0xdf, 0xa4, 0xc8, 0x7c, 0x11, 0xef, 0xce, 0x5b, - 0x88, 0x56, 0x15, 0xae, - 0xe6, 0x56, 0x15, 0xae, 0xe2, 0x97, 0x03, 0xfe, 0xfd, 0x98, 0xbf, 0x86, - 0x5f, 0x96, 0x5f, 0xc1, - 0x0d, 0xce, 0x8f, 0x43, 0x8d, 0x4d, 0x0d, 0xcc, 0x8c, 0xfb, 0x96, 0x61, - 0xc9, 0x34, 0x65, 0x98, - 0xa2, 0x4c, 0xaf, 0xe4, 0x2d, 0xa5, 0x4b, 0x9c, 0x0b, 0xe9, 0x9a, 0xbc, - 0xed, 0x74, 0x47, 0xde, - 0x16, 0xba, 0x21, 0x6f, 0x23, 0xd9, 0xec, 0xdc, 0xc8, 0x6f, 0xcc, 0xdf, - 0x84, 0x36, 0x15, 0x96, - 0xf2, 0xab, 0x9d, 0xcf, 0xa0, 0x56, 0xb6, 0x26, 0xe4, 0xc6, 0xa2, 0xce, - 0x80, 0x69, 0xf5, 0x51, - 0xa6, 0x39, 0x4b, 0x48, 0xb3, 0xb5, 0xe2, 0x5f, 0x2d, 0x9a, 0x6c, 0x58, - 0xe5, 0x98, 0x8d, 0x66, - 0x14, 0x0c, 0xe0, 0xc1, 0x57, 0xa3, 0x8d, 0xa4, 0xb6, 0xe4, 0x5a, 0x7b, - 0x47, 0xd2, 0xd2, 0x9a, - 0x81, 0x1a, 0xda, 0x6f, 0x46, 0x6f, 0x3a, 0xec, 0x48, 0x56, 0x6d, 0xdc, - 0x18, 0x9b, 0xca, 0x17, - 0xc8, 0x13, 0xd1, 0x18, 0x19, 0x21, 0x9b, 0xba, 0x05, 0xaf, 0xb5, 0xcd, - 0xc5, 0xf3, 0xac, 0x0b, - 0xf0, 0x42, 0x65, 0x11, 0x59, 0x00, 0xb7, 0x73, 0xd5, 0x79, 0x68, 0xae, - 0x7d, 0x0e, 0x9a, 0xe5, - 0x80, 0x18, 0xdd, 0x3a, 0x0b, 0xfc, 0xb4, 0x6f, 0xc9, 0x21, 0xe9, 0x75, - 0x38, 0x86, 0x4c, 0x47, - 0x25, 0x8d, 0xa6, 0x43, 0xcc, 0xdc, 0x52, 0x6d, 0x8b, 0x7b, 0x38, 0xbb, - 0xa2, 0x1c, 0xc7, 0x8f, - 0x68, 0xba, 0x6d, 0x16, 0x9e, 0x65, 0x9d, 0x83, 0xe7, 0x5a, 0xd9, 0xed, - 0x4c, 0x3c, 0xdb, 0x36, - 0x9d, 0x7c, 0x0f, 0xaf, 0xb9, 0xcd, 0xfa, 0x05, 0x19, 0xa2, 0xb4, 0x17, - 0xea, 0xcb, 0xd7, 0x0a, - 0x37, 0xe7, 0xdd, 0xc0, 0x75, 0x2c, 0x6c, 0x69, 0x68, 0xa4, 0xc6, 0xf2, - 0xf7, 0xe5, 0x7d, 0xc4, - 0xcf, 0x04, 0xbc, 0x9c, 0x95, 0xaf, 0xa2, 0x2c, 0x31, 0x1a, 0x7c, 0xd1, - 0x1b, 0x68, 0xbf, 0xbc, - 0xee, 0xb8, 0xa3, 0xa3, 0x39, 0x77, 0x9d, 0xed, 0x66, 0xee, 0x5e, 0xf9, - 0x4e, 0xbe, 0xaf, 0xf4, - 0x00, 0x1a, 0x20, 0x8d, 0x42, 0xe3, 0xd4, 0xd7, 0xf8, 0x7e, 0xea, 0x3b, - 0xc6, 0x85, 0xb6, 0x95, - 0x68, 0xb6, 0xe3, 0x07, 0xfa, 0x83, 0x6d, 0x0e, 0x99, 0x6d, 0x9b, 0x4f, - 0x7e, 0x00, 0xdc, 0x9b, - 0x0d, 0x3f, 0x7f, 0x6b, 0x9b, 0x45, 0x4a, 0x6c, 0x53, 0xf1, 0x9d, 0x96, - 0x1b, 0x51, 0x4f, 0xf1, - 0x16, 0xdc, 0x43, 0xba, 0x0d, 0xf5, 0x51, 0x06, 0x90, 0x47, 0xa5, 0xa7, - 0xe8, 0x13, 0x8e, 0x47, - 0xe8, 0xfd, 0xd6, 0xfe, 0xe4, 0x09, 0x15, 0x51, 0xd9, 0x96, 0x23, 0x3c, - 0x27, 0x0f, 0x14, 0xee, - 0xb3, 0xdc, 0x41, 0x6f, 0xb5, 0x74, 0xc7, 0x37, 0xc2, 0xe3, 0xbb, 0x48, - 0x5d, 0x48, 0x6f, 0xcd, - 0x17, 0x4c, 0x20, 0x19, 0xe0, 0xdb, 0xb5, 0x92, 0x9b, 0xd2, 0x06, 0x4a, - 0x1a, 0xe9, 0x66, 0xcf, - 0x07, 0x8c, 0x9d, 0x4c, 0x3e, 0x85, 0xef, 0x55, 0x60, 0x8d, 0x26, 0xd1, - 0x34, 0x45, 0x68, 0x28, - 0xb7, 0x26, 0xad, 0x94, 0xfa, 0x28, 0xdd, 0x1c, 0x8d, 0xaf, 0xb5, 0xdc, - 0x4f, 0x14, 0x65, 0x3c, - 0x2a, 0xb4, 0x16, 0xf3, 0x03, 0x94, 0x26, 0xf8, 0x1a, 0x73, 0x07, 0xd2, - 0x45, 0xec, 0x48, 0x3a, - 0x98, 0x3b, 0xe1, 0x0e, 0xe2, 0x75, 0xb8, 0x9b, 0xd8, 0x15, 0xdf, 0xa4, - 0xdc, 0x8b, 0xff, 0x6d, - 0x7b, 0x10, 0xdf, 0x23, 0xdd, 0x86, 0x6f, 0x35, 0xdf, 0x4d, 0x1e, 0x91, - 0x07, 0xa2, 0x7e, 0xe6, - 0x1e, 0xe4, 0x7a, 0x53, 0x47, 0xda, 0xca, 0x7c, 0x3d, 0xed, 0x6a, 0x8e, - 0xa3, 0x69, 0x10, 0x03, - 0x37, 0x86, 0x78, 0xbb, 0x85, 0xa5, 0x29, 0xca, 0xb4, 0x34, 0x40, 0xf7, - 0x48, 0xcf, 0x62, 0xad, - 0x3f, 0x65, 0xd3, 0xd0, 0xde, 0xde, 0xd8, 0xf4, 0xea, 0xac, 0xa7, 0x1f, - 0x7b, 0x50, 0x7c, 0x1c, - 0xbf, 0x40, 0xba, 0x69, 0xdc, 0xff, 0xe8, 0x71, 0xdd, 0xdf, 0x66, 0xf7, - 0xcf, 0x28, 0xbe, 0xf8, - 0x6e, 0x35, 0xba, 0x4d, 0x1e, 0xfa, 0x3c, 0xbb, 0xef, 0x59, 0xd6, 0xef, - 0x32, 0xab, 0xf4, 0x11, - 0xef, 0xfc, 0xde, 0xc6, 0xcf, 0xa7, 0xbc, 0x60, 0xff, 0x71, 0xd0, 0x9d, - 0x3e, 0x71, 0x0f, 0x30, - 0xd4, 0xe3, 0x07, 0x76, 0x2e, 0x8a, 0x1a, 0x12, 0xb4, 0x37, 0x4d, 0xcf, - 0xac, 0x39, 0x3d, 0x5a, - 0xf5, 0xe0, 0xeb, 0xc5, 0x3b, 0x33, 0x73, 0xd8, 0x7c, 0xbb, 0x40, 0x7a, - 0x2e, 0xcc, 0xfe, 0x35, - 0xfd, 0xe5, 0x30, 0xe9, 0x37, 0xb9, 0xf3, 0x94, 0x1a, 0xf7, 0x37, 0x2c, - 0x3a, 0x5f, 0x54, 0xbf, - 0xa6, 0x95, 0xdf, 0x5c, 0xa7, 0x57, 0x5f, 0x72, 0x1a, 0xeb, 0x4b, 0x1e, - 0x1b, 0x20, 0xbf, 0xe6, - 0x9e, 0xbb, 0xa1, 0x5f, 0xd3, 0x4a, 0x4f, 0xfc, 0x9e, 0x15, 0xbc, 0x57, - 0x49, 0xaf, 0x76, 0x0d, - 0xe3, 0xb8, 0xb0, 0xb9, 0x1f, 0x5e, 0x75, 0x93, 0x7c, 0xcb, 0x45, 0xb4, - 0xd7, 0xb9, 0x1c, 0xaf, - 0x1d, 0xbd, 0x81, 0x5b, 0x5f, 0xb0, 0x09, 0x6d, 0x2c, 0x5a, 0x83, 0x7e, - 0x2c, 0x58, 0x87, 0xd6, - 0x8f, 0xfe, 0x96, 0x7f, 0xd0, 0x9e, 0x6c, 0xaa, 0x6f, 0xca, 0xa6, 0x19, - 0xa6, 0x0c, 0x21, 0xcb, - 0x9c, 0x4d, 0xd3, 0x4d, 0x71, 0xe6, 0x01, 0x85, 0x53, 0xc8, 0xc6, 0xbc, - 0x25, 0x64, 0x29, 0xc4, - 0xc1, 0xcb, 0xed, 0xcb, 0xc8, 0x72, 0xdb, 0x72, 0xb2, 0xd4, 0xbe, 0x08, - 0xaf, 0x70, 0xae, 0xc4, - 0x4b, 0xf3, 0x56, 0x01, 0x6e, 0x5a, 0xf9, 0xde, 0xf9, 0xed, 0x50, 0x5b, - 0x6b, 0x63, 0x9c, 0x61, - 0xc9, 0x82, 0x78, 0xb8, 0x01, 0x49, 0x51, 0xdb, 0xa2, 0x7b, 0x8a, 0x3e, - 0x32, 0xec, 0xb2, 0x2d, - 0x46, 0xab, 0x0a, 0x1e, 0xe6, 0x63, 0xa5, 0x6b, 0xc8, 0x75, 0x8e, 0xeb, - 0xb9, 0x76, 0x79, 0x4d, - 0xf8, 0x7a, 0x62, 0x3a, 0x49, 0x56, 0xee, 0xc6, 0xb3, 0x9c, 0x7b, 0xf9, - 0x0d, 0xf6, 0x4d, 0xdc, - 0x16, 0xc7, 0x3a, 0xee, 0x47, 0xe7, 0x1a, 0xb4, 0xd1, 0xbe, 0x93, 0xdb, - 0x64, 0x2f, 0xe1, 0xe6, - 0xda, 0xe7, 0xf3, 0x4b, 0xed, 0x0b, 0xd1, 0x7c, 0xfb, 0x22, 0xb4, 0xc8, - 0x5e, 0x82, 0x4b, 0x6c, - 0x4b, 0x50, 0x89, 0xbd, 0x84, 0x5f, 0x6c, 0x5f, 0x80, 0x16, 0xaa, 0xf3, - 0xf9, 0x79, 0x8e, 0x99, - 0xe8, 0xb0, 0xfc, 0x32, 0xf3, 0xff, 0x68, 0xa6, 0xa9, 0x31, 0x69, 0xa3, - 0xb6, 0x47, 0xd7, 0x38, - 0x5b, 0x1a, 0x9b, 0xe4, 0x8f, 0x40, 0x5f, 0xd8, 0x17, 0x03, 0x2e, 0xcd, - 0x46, 0xf3, 0xac, 0x73, - 0x00, 0x2b, 0xe7, 0xa0, 0xef, 0xd5, 0xd9, 0x70, 0xfb, 0x03, 0x5a, 0x00, - 0xf8, 0x37, 0xd3, 0xba, - 0x92, 0x4c, 0xcc, 0xbb, 0x49, 0xe8, 0x96, 0x7f, 0x2b, 0xea, 0x5a, 0xd8, - 0xc1, 0xd0, 0xdc, 0x56, - 0x1f, 0x67, 0x5a, 0xe2, 0xc8, 0x2d, 0xf9, 0x4e, 0xc3, 0x52, 0xeb, 0x4c, - 0xc0, 0x3f, 0x27, 0xca, - 0xb6, 0x24, 0x93, 0x2e, 0x8e, 0x3b, 0x49, 0x4f, 0x5b, 0x5b, 0xae, 0x81, - 0x5c, 0x9f, 0xef, 0xe6, - 0x98, 0x60, 0xdc, 0x65, 0x5f, 0xce, 0xaf, 0x06, 0xbc, 0x5b, 0x61, 0x5b, - 0xc0, 0x2f, 0x70, 0xae, - 0xc6, 0x6b, 0x1c, 0xdb, 0xc8, 0x0a, 0xfb, 0x4c, 0x32, 0xd7, 0xb6, 0x88, - 0x2c, 0xb2, 0x2d, 0x20, - 0x0b, 0x61, 0x97, 0x00, 0x06, 0x96, 0xd8, 0xe6, 0x02, 0x06, 0xce, 0x26, - 0x25, 0x80, 0xb9, 0x25, - 0xd6, 0x1f, 0xd1, 0x0a, 0xf0, 0x45, 0x17, 0x39, 0x96, 0xa3, 0x65, 0xe0, - 0x0f, 0x2e, 0x54, 0x17, - 0xe0, 0x1f, 0x1c, 0x33, 0xf1, 0x1c, 0xeb, 0x0f, 0x64, 0xa9, 0x75, 0x09, - 0x99, 0x0d, 0x78, 0xfb, - 0xbd, 0xfd, 0x5b, 0x34, 0xc3, 0xe1, 0xc2, 0x75, 0xf0, 0x21, 0xd1, 0x2a, - 0xd5, 0x40, 0x6f, 0x12, - 0x63, 0x85, 0x54, 0x73, 0x03, 0xd2, 0xda, 0xd1, 0x86, 0x34, 0x81, 0xf8, - 0x39, 0x55, 0x4c, 0x26, - 0xb7, 0xaa, 0x0a, 0x99, 0x03, 0x31, 0xfd, 0x47, 0xd6, 0x79, 0xf8, 0x53, - 0x39, 0x9e, 0xa6, 0x98, - 0x9b, 0xd3, 0xd6, 0x6a, 0x53, 0x92, 0x6d, 0x81, 0xb8, 0x1f, 0xce, 0xa5, - 0x3b, 0xa4, 0x62, 0x62, - 0xb3, 0x16, 0xa3, 0x7c, 0xab, 0x03, 0x9b, 0xad, 0x36, 0xa4, 0xaa, 0x56, - 0x6c, 0xb5, 0x4a, 0x98, - 0x5a, 0x39, 0x9e, 0x57, 0x46, 0xa1, 0x51, 0x4a, 0x2e, 0xec, 0x11, 0x6c, - 0x36, 0x0a, 0x1a, 0xa9, - 0x0c, 0x45, 0x43, 0xd4, 0x1c, 0x34, 0x52, 0x1d, 0x8c, 0xde, 0xb6, 0x0e, - 0x36, 0x0e, 0x91, 0x87, - 0xf1, 0x23, 0xa5, 0x81, 0x80, 0x95, 0x89, 0x70, 0xd5, 0x6b, 0x42, 0x9b, - 0xc9, 0x4d, 0x71, 0x3d, - 0x4b, 0x06, 0x4a, 0x12, 0xeb, 0xe3, 0x5e, 0xce, 0x27, 0xb4, 0xda, 0x85, - 0xf9, 0xd3, 0x8b, 0x2f, - 0x6f, 0xfc, 0x72, 0xe2, 0x73, 0x06, 0x4f, 0xef, 0xde, 0xb6, 0xd7, 0x6f, - 0x79, 0xd8, 0xfa, 0xb0, - 0xe1, 0xdf, 0xe4, 0x7a, 0xd7, 0x59, 0x66, 0x6b, 0x9a, 0xc3, 0xee, 0xb7, - 0x4f, 0xbc, 0xf8, 0x6a, - 0x35, 0xce, 0x4d, 0xb4, 0xbf, 0xea, 0xc1, 0x34, 0xc3, 0xa4, 0x8b, 0x2f, - 0xd4, 0xee, 0x6d, 0xa9, - 0xbd, 0x0d, 0xcb, 0xc6, 0xf4, 0x9f, 0x31, 0xb1, 0x54, 0x7b, 0xfe, 0x89, - 0x2f, 0xcd, 0x1a, 0x76, - 0x0e, 0x5a, 0x70, 0xed, 0x80, 0xa0, 0xf9, 0xf4, 0xa2, 0x2c, 0x7d, 0xfa, - 0x4d, 0x3a, 0x66, 0x50, - 0x32, 0xbb, 0xd3, 0x78, 0x5e, 0x7e, 0xe7, 0x07, 0xbb, 0x6a, 0x05, 0xcc, - 0xee, 0x92, 0x94, 0x68, - 0x63, 0x20, 0xbe, 0x89, 0x3b, 0x56, 0xd5, 0x37, 0xf7, 0x4d, 0x8c, 0xf6, - 0xcf, 0x7d, 0xfb, 0x1f, - 0xcf, 0xa0, 0xd4, 0x7a, 0x64, 0xf2, 0x13, 0x73, 0x7c, 0xe5, 0xd7, 0xbc, - 0xeb, 0x26, 0xfa, 0xf8, - 0x76, 0xa9, 0xfa, 0x34, 0xa9, 0xc3, 0xaa, 0x5d, 0xe3, 0xae, 0x85, 0x7b, - 0xe1, 0xba, 0xdd, 0x74, - 0x11, 0x1f, 0x70, 0xae, 0x47, 0x5b, 0x8b, 0x36, 0x73, 0x9b, 0x0a, 0x36, - 0xa0, 0xf5, 0x85, 0x5b, - 0xf1, 0x86, 0xfc, 0x8d, 0x68, 0x43, 0xd1, 0x2c, 0xfe, 0x61, 0x35, 0x06, - 0x3c, 0xb5, 0x6c, 0x9a, - 0x2d, 0x64, 0x0a, 0x99, 0x34, 0x8b, 0x64, 0x00, 0x12, 0xf6, 0x77, 0xbe, - 0x4f, 0x77, 0xd9, 0x57, - 0x93, 0xe5, 0xd6, 0x35, 0x74, 0xad, 0xba, 0x9a, 0xac, 0xb4, 0xad, 0xc6, - 0xab, 0x60, 0xaf, 0xb5, - 0xad, 0x25, 0x3f, 0x3a, 0xd6, 0xa3, 0xd5, 0x05, 0x32, 0x7f, 0x8b, 0xa3, - 0x39, 0x6e, 0x28, 0x66, - 0x92, 0x2c, 0x4b, 0x3d, 0xd2, 0x50, 0xca, 0x22, 0x49, 0x96, 0xd6, 0xf8, - 0xba, 0x82, 0xf1, 0xdc, - 0x1e, 0xfb, 0x32, 0xbe, 0xb4, 0xe8, 0x15, 0x63, 0x13, 0x7b, 0x4f, 0x74, - 0x7d, 0x7e, 0x6b, 0xae, - 0x89, 0x9c, 0x8d, 0x99, 0x8e, 0x5e, 0x86, 0x74, 0x3b, 0x2d, 0x56, 0xd7, - 0x93, 0x05, 0xf6, 0xa5, - 0xc6, 0x25, 0x8e, 0xc5, 0x5c, 0x89, 0xa3, 0x04, 0x30, 0x6e, 0x05, 0xbf, - 0xcc, 0xbe, 0x18, 0xb0, - 0x6f, 0x09, 0x5a, 0x02, 0xd8, 0xb7, 0xc4, 0xbe, 0x04, 0xaf, 0x80, 0xbd, - 0xd8, 0xb1, 0x02, 0x2d, - 0x03, 0x1c, 0x5d, 0xa6, 0x2c, 0x41, 0x4b, 0x6d, 0x8b, 0xf9, 0x45, 0xd6, - 0xb9, 0xe8, 0x90, 0xf5, - 0x25, 0x12, 0x61, 0x06, 0xec, 0x53, 0xae, 0xe3, 0x3a, 0xe5, 0xb7, 0xe3, - 0x9a, 0x5b, 0xb3, 0xf8, - 0x64, 0xbb, 0x09, 0x2d, 0xb2, 0x96, 0xa0, 0xb9, 0x0e, 0xd6, 0x33, 0x3c, - 0x1f, 0x2d, 0x80, 0xcd, - 0x7c, 0x47, 0xf0, 0x25, 0xf9, 0xb9, 0xb6, 0x79, 0x78, 0xbe, 0x75, 0x01, - 0xf9, 0xae, 0xe0, 0x5e, - 0xd2, 0xad, 0xe8, 0x06, 0xe3, 0x35, 0x79, 0x4d, 0x8c, 0xd9, 0x12, 0xe0, - 0xb0, 0x18, 0x49, 0xef, - 0x2d, 0x1a, 0x6f, 0x58, 0xa0, 0x42, 0x8c, 0x9d, 0x3f, 0x9a, 0xeb, 0x60, - 0x6b, 0x87, 0x7a, 0x42, - 0x7c, 0xda, 0x51, 0x6a, 0x88, 0xea, 0x59, 0x5b, 0x1b, 0xff, 0x65, 0x9b, - 0xc0, 0xaf, 0x65, 0x18, - 0x67, 0x5f, 0x40, 0x16, 0x3b, 0x18, 0xce, 0x95, 0x90, 0x85, 0xf0, 0x3a, - 0x0b, 0xd5, 0x25, 0xb0, - 0xe1, 0x3e, 0xdb, 0x72, 0xbc, 0xc2, 0xb6, 0x04, 0x70, 0x70, 0x31, 0xe0, - 0xf4, 0x7c, 0x5c, 0x62, - 0x87, 0x6d, 0x5b, 0x84, 0x97, 0xd8, 0x16, 0xa1, 0x12, 0xc7, 0x02, 0xb4, - 0xc0, 0xb9, 0x10, 0xcd, - 0xb5, 0xcd, 0x47, 0xf3, 0xd8, 0x67, 0xb1, 0xcd, 0x42, 0x0b, 0xe1, 0x73, - 0xfc, 0x60, 0xff, 0x01, - 0x33, 0xec, 0x2c, 0xb1, 0xcf, 0x85, 0xc7, 0x2c, 0x44, 0x0b, 0x1c, 0xf0, - 0x59, 0xe1, 0xb1, 0x8b, - 0x94, 0xaf, 0xe9, 0x5b, 0x96, 0x68, 0xda, 0x5a, 0xee, 0x80, 0x5a, 0xb3, - 0x6b, 0x89, 0x29, 0x05, - 0xb0, 0x2e, 0x91, 0xde, 0xa4, 0xe4, 0xe1, 0xf9, 0xea, 0xd7, 0xf8, 0x33, - 0x88, 0xe1, 0xbf, 0x53, - 0x5b, 0xa1, 0x26, 0xd6, 0xd6, 0xa4, 0xa1, 0x25, 0x1d, 0x33, 0x2d, 0x2b, - 0xd6, 0xff, 0xdc, 0x43, - 0xfe, 0x0a, 0x8e, 0xa5, 0x13, 0xd9, 0x55, 0x2b, 0xf8, 0xcf, 0x4e, 0xe4, - 0x04, 0xfc, 0x53, 0xac, - 0x2a, 0xc2, 0x2a, 0xc7, 0x73, 0x8a, 0x01, 0xe5, 0x2a, 0xb9, 0x10, 0xfb, - 0x8f, 0x64, 0x73, 0xf1, - 0xf0, 0x48, 0x65, 0x38, 0x7a, 0x4f, 0x79, 0x0f, 0x0d, 0x29, 0x78, 0x67, - 0x24, 0x8b, 0x6d, 0xdf, - 0x98, 0x3e, 0xf8, 0xdf, 0xc3, 0xa4, 0x57, 0x48, 0x0f, 0x4b, 0x06, 0x6d, - 0x26, 0x36, 0xa2, 0xf5, - 0xd9, 0xb5, 0xc9, 0xcc, 0xf2, 0xa9, 0x69, 0xa4, 0xaf, 0xf2, 0x2c, 0x19, - 0xc4, 0x6a, 0x1a, 0xdf, - 0x9c, 0x7f, 0xca, 0x53, 0x9f, 0x98, 0xb2, 0xc0, 0xa0, 0xf1, 0xd5, 0x9e, - 0x1e, 0xff, 0xc0, 0x5b, - 0x03, 0x3d, 0xf8, 0x07, 0xd7, 0x7f, 0x0d, 0xaf, 0xa6, 0x5e, 0x7c, 0xb6, - 0x1a, 0xe7, 0x8a, 0x67, - 0xbc, 0xeb, 0xc1, 0xb6, 0x15, 0xf9, 0x17, 0x87, 0x79, 0xee, 0x5f, 0x31, - 0x6f, 0xd0, 0x83, 0xde, - 0xb8, 0x67, 0x9f, 0x33, 0x65, 0xe0, 0xc6, 0xc2, 0x13, 0x43, 0x6a, 0x44, - 0xc6, 0xa6, 0xf3, 0x48, - 0xcb, 0x1f, 0xc2, 0xef, 0x7b, 0x8e, 0x8d, 0x78, 0x3b, 0x60, 0x3f, 0xdc, - 0xe8, 0xac, 0xe1, 0xba, - 0x6c, 0x40, 0xe7, 0xbc, 0xc5, 0xda, 0x39, 0x2c, 0xef, 0xf9, 0xc1, 0xd5, - 0xf1, 0xf1, 0x38, 0x97, - 0xb6, 0x55, 0x20, 0xbe, 0x89, 0x5b, 0x97, 0x3d, 0xd8, 0xdc, 0x37, 0xa2, - 0x69, 0x89, 0x4b, 0x31, - 0xba, 0xb8, 0x6f, 0x61, 0xc7, 0x05, 0xdd, 0xc7, 0xc4, 0xad, 0xf3, 0xe5, - 0x2f, 0xbf, 0x36, 0x3a, - 0x7d, 0x78, 0x66, 0x71, 0x16, 0xe3, 0x9b, 0xe4, 0x06, 0xe2, 0x9b, 0xe8, - 0xd4, 0xaa, 0xaf, 0x93, - 0xd7, 0x0b, 0xb7, 0x76, 0x8d, 0x0c, 0xe7, 0xd8, 0x41, 0xe7, 0x3a, 0x7e, - 0x5b, 0xe1, 0x66, 0x6e, - 0x73, 0xc1, 0x46, 0xb4, 0xb5, 0x60, 0x1b, 0xda, 0x9c, 0xbf, 0x1d, 0x6d, - 0xcc, 0xaf, 0xe4, 0x5f, - 0x93, 0x22, 0x48, 0x7d, 0x92, 0x29, 0xd4, 0x13, 0xb2, 0x4d, 0xd9, 0x66, - 0xc0, 0x40, 0xb1, 0x1d, - 0xed, 0x07, 0x7e, 0xc5, 0x5e, 0xfb, 0x3a, 0xb2, 0xc6, 0xb6, 0x16, 0xf0, - 0xef, 0x47, 0xba, 0xc2, - 0xba, 0x1c, 0xaf, 0xb2, 0xae, 0x84, 0xbd, 0x96, 0xac, 0x72, 0x6e, 0xc5, - 0xab, 0x8b, 0x5e, 0x43, - 0xed, 0x1c, 0xa9, 0xa4, 0xbe, 0x54, 0x9f, 0xd6, 0xb3, 0x64, 0x0b, 0x69, - 0x42, 0x16, 0x89, 0x16, - 0xaf, 0xc1, 0xed, 0xf2, 0x1c, 0xfc, 0x11, 0xfb, 0x4a, 0x7e, 0xe7, 0x18, - 0xab, 0xa1, 0x5b, 0x61, - 0x37, 0xd4, 0xd2, 0xde, 0x00, 0x65, 0x9b, 0xb4, 0x5e, 0x41, 0xa1, 0x89, - 0x94, 0x49, 0xde, 0xb3, - 0x6f, 0x23, 0x73, 0x9d, 0xb3, 0x0d, 0xf3, 0x9d, 0x4b, 0xb9, 0x05, 0x80, - 0x09, 0xf3, 0xac, 0x0b, - 0xf9, 0x12, 0x75, 0x09, 0xbf, 0x48, 0x5d, 0x08, 0x7e, 0x52, 0x09, 0x5e, - 0x6a, 0x5b, 0x82, 0x17, - 0xda, 0x96, 0xe1, 0x25, 0xf6, 0xe5, 0x68, 0xb1, 0x63, 0x11, 0x5a, 0x68, - 0x5d, 0xc6, 0x6f, 0xb6, - 0x6d, 0xe0, 0x19, 0xb6, 0xed, 0x72, 0x3c, 0x87, 0x52, 0x6c, 0x5d, 0x51, - 0xb7, 0xbc, 0x2e, 0xb9, - 0x6d, 0xf2, 0x9a, 0x70, 0xd9, 0x52, 0x2a, 0x4a, 0x54, 0x8d, 0x68, 0xb1, - 0xc2, 0xb0, 0xb3, 0x04, - 0x2d, 0x52, 0x17, 0xc3, 0xe3, 0x17, 0xa2, 0xc5, 0x80, 0x87, 0xf3, 0xe1, - 0x76, 0x81, 0x75, 0x3e, - 0xf8, 0x60, 0xcb, 0xc8, 0xc2, 0xa2, 0xbb, 0x51, 0xe7, 0xa2, 0xf6, 0x86, - 0xa6, 0xd6, 0x06, 0x46, - 0x56, 0x8f, 0x66, 0xfd, 0xc3, 0x8f, 0x8e, 0xfd, 0xde, 0xb0, 0x40, 0x59, - 0x80, 0xe7, 0x15, 0x7e, - 0xc4, 0xdd, 0x91, 0x7f, 0x0b, 0x77, 0x83, 0xa3, 0xb9, 0xb1, 0x95, 0xd2, - 0x98, 0x6f, 0x3f, 0xba, - 0x5b, 0xce, 0x00, 0xc7, 0x38, 0x7e, 0x0b, 0xc4, 0xe1, 0x25, 0xd6, 0x12, - 0x32, 0xcf, 0x3a, 0x17, - 0xe2, 0xf1, 0xc5, 0x64, 0xbe, 0x75, 0x36, 0xf9, 0x41, 0x29, 0xc1, 0xf0, - 0x39, 0xc9, 0x02, 0xc0, - 0xc3, 0x45, 0xb0, 0xe7, 0xc2, 0x9e, 0x63, 0x9f, 0x8b, 0x7f, 0x00, 0x7c, - 0x5b, 0xc6, 0xae, 0x0d, - 0xd6, 0x95, 0x68, 0xb1, 0x7d, 0x3e, 0x5a, 0x02, 0x9f, 0x7b, 0xbe, 0xca, - 0xfc, 0xd6, 0x25, 0x68, - 0xae, 0x95, 0xd5, 0xd8, 0x01, 0xff, 0x34, 0x5f, 0x71, 0x21, 0x5e, 0x00, - 0x78, 0xb9, 0xc0, 0xbe, - 0x10, 0xcf, 0x83, 0xdb, 0x85, 0xb6, 0x25, 0x74, 0x9d, 0x3c, 0x9c, 0xf6, - 0x56, 0xda, 0xe0, 0x2e, - 0xb6, 0x56, 0x7c, 0x43, 0x29, 0x13, 0xa7, 0x10, 0xf8, 0x7c, 0xcc, 0x0f, - 0x97, 0x72, 0xd1, 0x12, - 0xf5, 0x1b, 0xfc, 0x85, 0x32, 0x15, 0xcd, 0xb1, 0xdd, 0x6c, 0x6c, 0x60, - 0x6b, 0x88, 0xd3, 0x19, - 0x87, 0x45, 0x60, 0x3d, 0x8a, 0x11, 0xe4, 0x26, 0x69, 0x2c, 0xc9, 0x57, - 0x1c, 0xc8, 0xaa, 0x58, - 0x90, 0x24, 0x2b, 0x48, 0x96, 0x4d, 0x88, 0x00, 0xfc, 0xe5, 0x82, 0xbf, - 0x37, 0x44, 0x1e, 0x8e, - 0x86, 0xc9, 0x43, 0xf0, 0x50, 0xf9, 0x3d, 0xfc, 0x0e, 0xdc, 0x0e, 0x51, - 0xdf, 0xc6, 0x6f, 0x2b, - 0x6f, 0xa2, 0x37, 0x96, 0xb9, 0x7b, 0xf2, 0x36, 0xbc, 0x71, 0xdb, 0xcb, - 0xf2, 0xdd, 0xb4, 0xa7, - 0x54, 0x1f, 0x37, 0xb4, 0x64, 0xe2, 0x54, 0x78, 0xcd, 0x04, 0x0a, 0x1b, - 0x8e, 0x4d, 0x17, 0xf9, - 0x11, 0xf2, 0xfa, 0x5a, 0x88, 0x53, 0xbd, 0xe3, 0x57, 0x37, 0x37, 0xe3, - 0xc5, 0xcf, 0xef, 0x7e, - 0xe9, 0x3e, 0xd2, 0xb9, 0xfa, 0x9c, 0x7a, 0x8c, 0xe1, 0xd5, 0x8c, 0xaa, - 0xc7, 0xab, 0x1f, 0x67, - 0x2d, 0xcd, 0xf1, 0xd4, 0x42, 0x6a, 0x60, 0xdb, 0xd8, 0x29, 0x6f, 0x7b, - 0x78, 0x6e, 0x2c, 0x4f, - 0xe8, 0xb7, 0x26, 0xf2, 0xa9, 0xdd, 0xe5, 0x27, 0x2e, 0xed, 0xd9, 0x3f, - 0x50, 0x3e, 0x9d, 0xcd, - 0xe6, 0x09, 0x6a, 0x03, 0x21, 0xcc, 0x5b, 0x0c, 0xa0, 0xcb, 0xee, 0xaa, - 0x9b, 0xd8, 0x92, 0x73, - 0x5d, 0x9c, 0x3b, 0xff, 0xf3, 0x83, 0x59, 0xad, 0xc0, 0x95, 0xc3, 0x0a, - 0x3a, 0xf7, 0x4d, 0xcb, - 0xfb, 0xc5, 0x39, 0xe2, 0x38, 0xf0, 0xff, 0xb8, 0x28, 0x4b, 0x14, 0xf6, - 0x9d, 0x5f, 0x0b, 0x45, - 0xab, 0x3e, 0xfc, 0x9a, 0x56, 0x3e, 0xf2, 0x7a, 0x97, 0xc5, 0x37, 0x09, - 0x25, 0xaf, 0x17, 0x2e, - 0x3d, 0x9f, 0x58, 0x1f, 0x7a, 0x3e, 0x56, 0x7a, 0x91, 0x1c, 0x76, 0xac, - 0xe7, 0xb7, 0x16, 0x6c, - 0x37, 0xec, 0xc8, 0xdf, 0xc1, 0xef, 0xce, 0xaf, 0x44, 0xa5, 0x79, 0x3b, - 0xd0, 0x16, 0xfb, 0x09, - 0xf4, 0x2a, 0xe0, 0x5f, 0x43, 0xf0, 0xff, 0xb2, 0x4c, 0xd9, 0x42, 0x96, - 0xa5, 0xa1, 0xd8, 0xd2, - 0x7e, 0x23, 0x7a, 0x3e, 0x6f, 0xb9, 0xf1, 0xa2, 0xe9, 0x67, 0xe1, 0x98, - 0xf5, 0xb8, 0x70, 0x5a, - 0xfc, 0x5d, 0x70, 0x5d, 0xa3, 0x7f, 0x25, 0xc7, 0xec, 0x95, 0xb8, 0xac, - 0xa0, 0x02, 0x95, 0x16, - 0xbd, 0x8f, 0xdb, 0xdb, 0x13, 0x18, 0xe7, 0x0a, 0x50, 0x33, 0x1d, 0x6c, - 0x27, 0x1a, 0x37, 0x70, - 0xb6, 0xe1, 0x5b, 0x3b, 0xa6, 0xf0, 0xc7, 0xec, 0x5b, 0xf8, 0xd5, 0xef, - 0x4b, 0xb9, 0x9d, 0x0b, - 0xda, 0xa2, 0x86, 0xac, 0x5f, 0x45, 0x00, 0x8f, 0x52, 0x48, 0xc0, 0x19, - 0xea, 0xc3, 0xfc, 0xf2, - 0xbc, 0x43, 0xfc, 0x5e, 0xc7, 0x31, 0xee, 0xa4, 0x7a, 0x8a, 0x3f, 0xad, - 0x9c, 0xc2, 0x27, 0x94, - 0xb3, 0xe8, 0x94, 0xf5, 0x38, 0xfa, 0x49, 0x39, 0x43, 0xce, 0x89, 0xbf, - 0xd1, 0x3f, 0xe1, 0x7d, - 0xfe, 0x80, 0x75, 0x56, 0x39, 0x46, 0x0e, 0xe7, 0x95, 0xa3, 0x03, 0x79, - 0xeb, 0x78, 0x87, 0x55, - 0x46, 0xd3, 0xd5, 0xa5, 0x68, 0x69, 0xfe, 0xab, 0x7c, 0x87, 0xfc, 0x5e, - 0xfc, 0xf5, 0x85, 0x2d, - 0x73, 0x1b, 0x49, 0xd9, 0x28, 0x03, 0xe2, 0xd6, 0x64, 0xf5, 0x39, 0x34, - 0x5d, 0x5e, 0x8f, 0x96, - 0xdb, 0x56, 0xa0, 0x95, 0xd6, 0x65, 0x68, 0x39, 0x60, 0xd0, 0x0a, 0xed, - 0x76, 0x39, 0x5a, 0x0e, - 0xf8, 0xb3, 0x5c, 0xde, 0x40, 0xbe, 0x2d, 0xba, 0x85, 0x6f, 0x5b, 0xd0, - 0xc2, 0xd0, 0x58, 0xca, - 0x40, 0x8c, 0x95, 0x9b, 0x62, 0x8a, 0x24, 0xf7, 0x8e, 0x9b, 0x6d, 0x58, - 0xab, 0x2c, 0xc2, 0x8b, - 0x47, 0x4f, 0xe5, 0xfa, 0x17, 0xdc, 0xc8, 0x41, 0x5c, 0x6c, 0xe8, 0x94, - 0x7f, 0x7d, 0x6e, 0xd7, - 0x0f, 0x6e, 0x1c, 0xde, 0x3f, 0xff, 0x03, 0x63, 0x85, 0x63, 0x0b, 0x5f, - 0xe1, 0xa8, 0x84, 0xcf, - 0x5a, 0xc1, 0xef, 0xb5, 0x1f, 0xc3, 0x07, 0x6d, 0x07, 0xc8, 0x41, 0xf5, - 0x24, 0x39, 0xa5, 0x9c, - 0x24, 0x87, 0x94, 0x23, 0x70, 0x7b, 0x8c, 0x1c, 0x55, 0x4e, 0xe0, 0xe3, - 0xea, 0x71, 0xb2, 0xd7, - 0xba, 0x1b, 0x57, 0x58, 0xe7, 0xe2, 0xf7, 0xc1, 0x47, 0xfd, 0xd1, 0xbe, - 0x0a, 0xad, 0x70, 0xae, - 0x80, 0xcf, 0x00, 0x9f, 0xd7, 0x56, 0x82, 0xb6, 0x58, 0x2b, 0xd1, 0x5e, - 0xeb, 0x5e, 0x7c, 0xc0, - 0x7a, 0x00, 0xef, 0x53, 0x0f, 0xe0, 0x2a, 0xb5, 0x82, 0x94, 0xab, 0xe5, - 0x64, 0x8b, 0x75, 0x2b, - 0xd9, 0xac, 0xac, 0x27, 0x47, 0x94, 0xa7, 0x48, 0x3d, 0xdb, 0x4d, 0x7c, - 0x73, 0x7b, 0x43, 0x54, - 0xdf, 0x94, 0x4a, 0x92, 0x59, 0x77, 0x9f, 0xd8, 0x90, 0xa6, 0xc8, 0xaf, - 0xf3, 0xab, 0x95, 0xef, - 0xd0, 0x14, 0x75, 0x0a, 0xff, 0x81, 0xa3, 0x2d, 0x97, 0x2e, 0x65, 0x60, - 0x56, 0xef, 0xd6, 0xfa, - 0x65, 0xe0, 0xef, 0x7f, 0xad, 0x85, 0xa3, 0x36, 0xd9, 0x8a, 0x14, 0x59, - 0xc1, 0x80, 0x7d, 0x98, - 0xca, 0x3c, 0x32, 0xc8, 0x23, 0x01, 0xf7, 0x06, 0xe3, 0x21, 0x16, 0x88, - 0x73, 0x2d, 0xef, 0xa2, - 0xc1, 0x96, 0x21, 0x68, 0x08, 0xec, 0xc1, 0x96, 0x77, 0xf0, 0xe0, 0xf1, - 0x6f, 0xbe, 0xe5, 0xc1, - 0x26, 0x76, 0xfb, 0x46, 0x41, 0xdb, 0x11, 0x6d, 0x2c, 0xf5, 0x70, 0x9a, - 0x98, 0x8c, 0x13, 0x59, - 0xcf, 0x0e, 0x53, 0x48, 0x15, 0xe0, 0x2c, 0x10, 0xbb, 0x93, 0xd7, 0x59, - 0xfd, 0x62, 0xf1, 0x8c, - 0xfb, 0xbc, 0xb1, 0x49, 0x7b, 0xee, 0x57, 0x77, 0x3c, 0x73, 0x17, 0xe9, - 0x58, 0x7d, 0x4e, 0xf5, - 0x59, 0x31, 0xa8, 0xdf, 0xa0, 0x79, 0x2b, 0x1e, 0xf4, 0xf6, 0xe1, 0x3c, - 0x9c, 0xde, 0x6a, 0x5e, - 0x5b, 0x88, 0x6b, 0x22, 0x7b, 0x4d, 0x78, 0x8d, 0x86, 0x6a, 0xc4, 0x28, - 0x7f, 0xf9, 0xf4, 0xcc, - 0xa2, 0xb4, 0x11, 0x61, 0x9d, 0xb7, 0x68, 0xd1, 0x63, 0x77, 0xa9, 0xc1, - 0xf8, 0x26, 0xa3, 0x12, - 0xf2, 0x32, 0x73, 0x32, 0x9d, 0xb1, 0xa3, 0x02, 0xf2, 0x4d, 0x04, 0x57, - 0xdf, 0x4b, 0xb5, 0x1e, - 0x8c, 0x33, 0xde, 0xe8, 0x53, 0xcf, 0x25, 0xc4, 0xbc, 0x5e, 0x76, 0xb8, - 0x67, 0x50, 0x06, 0x3c, - 0x26, 0x8c, 0x6f, 0x92, 0x62, 0xd0, 0x6a, 0x24, 0x01, 0xe6, 0x07, 0x33, - 0x5c, 0x77, 0xe9, 0x74, - 0x07, 0xd3, 0x91, 0x89, 0x0a, 0x41, 0xd3, 0xea, 0xf2, 0xb4, 0x6b, 0x58, - 0xff, 0xcb, 0x21, 0xc7, - 0x66, 0xae, 0xb4, 0xa0, 0xd4, 0x50, 0x99, 0x57, 0xce, 0xef, 0xca, 0xaf, - 0xc0, 0x95, 0x79, 0xa5, - 0x68, 0x7b, 0x7e, 0x05, 0xff, 0xac, 0x14, 0x41, 0x1b, 0x98, 0xea, 0xd1, - 0x2c, 0x31, 0xdb, 0xd4, - 0x58, 0x6e, 0x6f, 0xba, 0xae, 0xa8, 0x23, 0xff, 0x54, 0xc1, 0x48, 0xfe, - 0x25, 0xe5, 0x59, 0xe1, - 0x19, 0xe5, 0x49, 0xe1, 0x19, 0xe9, 0x39, 0xd3, 0x6b, 0xa6, 0x37, 0x4d, - 0x6f, 0xb2, 0xb9, 0x88, - 0x05, 0x23, 0xf8, 0x77, 0x47, 0x3f, 0xc7, 0x3f, 0xea, 0x7c, 0x81, 0xb4, - 0x57, 0x32, 0x48, 0xb6, - 0x25, 0x93, 0x26, 0x9a, 0x63, 0x49, 0x4b, 0x47, 0x6b, 0xfe, 0xde, 0xe2, - 0x77, 0x8d, 0x9f, 0xda, - 0xcb, 0xb8, 0x6d, 0x8e, 0x32, 0x7e, 0xc5, 0xd8, 0xa7, 0x8d, 0xf5, 0xd4, - 0xc6, 0x04, 0x10, 0x55, - 0x48, 0x17, 0xd3, 0x71, 0x96, 0x98, 0x82, 0x93, 0x95, 0x67, 0x91, 0x90, - 0x3f, 0x98, 0x1b, 0xc6, - 0xe6, 0x05, 0xdb, 0x72, 0x78, 0x9c, 0x67, 0x32, 0x5a, 0x9c, 0x16, 0x1e, - 0xd9, 0x72, 0xd0, 0x08, - 0x25, 0x87, 0x70, 0x16, 0x23, 0x19, 0x25, 0x8e, 0xa2, 0x9c, 0xd9, 0x40, - 0x47, 0xc8, 0x2f, 0x92, - 0x57, 0x9d, 0x32, 0xff, 0xb4, 0xb3, 0x07, 0x7a, 0x43, 0xfd, 0x1c, 0x6d, - 0x66, 0xb9, 0xb5, 0xc2, - 0x77, 0xf8, 0xce, 0x85, 0x5d, 0x8c, 0xe0, 0x53, 0x72, 0x99, 0xa6, 0x0c, - 0x16, 0x2b, 0x0a, 0xe9, - 0xb6, 0xfb, 0xd1, 0x24, 0x65, 0x3b, 0x5a, 0x63, 0x5d, 0x83, 0x7e, 0x54, - 0xd7, 0xa2, 0x75, 0xd6, - 0x75, 0xb0, 0xd7, 0xa2, 0xb5, 0xf0, 0x33, 0xdc, 0x87, 0xd7, 0xc9, 0x9b, - 0xc8, 0x94, 0xfc, 0x4e, - 0xa8, 0xa1, 0xb5, 0x21, 0x9f, 0x2d, 0xa4, 0x93, 0x54, 0x21, 0x95, 0xa6, - 0x5a, 0x62, 0xc8, 0xad, - 0x63, 0x26, 0x19, 0xb6, 0xcb, 0xab, 0xc8, 0xa6, 0x82, 0xaf, 0xf8, 0xeb, - 0xf2, 0x9a, 0xf1, 0x0d, - 0x9d, 0xad, 0x73, 0x7b, 0x17, 0x77, 0x1f, 0xd5, 0xa9, 0xa8, 0x49, 0xee, - 0xbf, 0x6c, 0x23, 0xf8, - 0xa1, 0xce, 0x51, 0xbc, 0xc9, 0x69, 0xe1, 0x24, 0x87, 0x8d, 0xcb, 0xb3, - 0x15, 0xe3, 0x31, 0x2a, - 0x6c, 0xf9, 0x7d, 0xf2, 0xbe, 0xe5, 0x63, 0x32, 0xce, 0x32, 0x86, 0x4c, - 0x10, 0x3f, 0x24, 0x1f, - 0x8b, 0x1f, 0x91, 0x8f, 0x2c, 0x85, 0xe4, 0x13, 0xd9, 0x44, 0xee, 0x56, - 0x5e, 0xc4, 0x05, 0xb6, - 0x95, 0x68, 0x8d, 0x63, 0x35, 0x5a, 0xe9, 0x60, 0x7e, 0xe0, 0x32, 0x34, - 0xdf, 0xf9, 0x3e, 0x1a, - 0xef, 0x18, 0x8b, 0x3e, 0x93, 0xbf, 0x24, 0x5f, 0xc8, 0x9f, 0xe2, 0x4f, - 0xa5, 0x8f, 0xf1, 0x44, - 0xe9, 0x23, 0x32, 0x41, 0x1e, 0x4f, 0x8a, 0x2d, 0x05, 0xb4, 0x40, 0xc9, - 0x27, 0xef, 0x3b, 0x30, - 0xdf, 0xdd, 0xd1, 0x94, 0xcf, 0xb6, 0xa4, 0x31, 0xcf, 0x8f, 0x46, 0x4a, - 0x89, 0xa4, 0xbe, 0x18, - 0x89, 0x9b, 0x28, 0x63, 0xd0, 0x52, 0x75, 0x06, 0x9a, 0xac, 0xce, 0xe1, - 0x8b, 0xd4, 0x34, 0x9c, - 0x6c, 0x4e, 0x22, 0x09, 0x4c, 0xbb, 0x86, 0x26, 0xd2, 0x14, 0x21, 0x9a, - 0xb4, 0x11, 0x9f, 0x21, - 0x92, 0x64, 0xc5, 0xa2, 0x24, 0x22, 0x41, 0x46, 0xd8, 0x20, 0x8d, 0x40, - 0x43, 0xe5, 0xc1, 0xfc, - 0x3b, 0xd2, 0x20, 0xfc, 0xaa, 0xf4, 0x6f, 0xf2, 0x88, 0xf4, 0x28, 0x7e, - 0x44, 0x7e, 0x0c, 0x3f, - 0x69, 0x79, 0x98, 0x3c, 0x6c, 0x7e, 0x8c, 0xbe, 0xf4, 0xe3, 0xa0, 0x3e, - 0x5a, 0x4f, 0x1e, 0xf8, - 0x60, 0xec, 0xf6, 0x85, 0x0f, 0x6e, 0x7d, 0xab, 0xa9, 0x39, 0x95, 0x24, - 0xb1, 0x9e, 0x69, 0x78, - 0xcd, 0x18, 0x21, 0x81, 0x64, 0x6a, 0xba, 0xfc, 0xf7, 0x90, 0x17, 0x67, - 0x0f, 0x7a, 0xa4, 0x76, - 0xfd, 0x56, 0xab, 0x5d, 0xcc, 0xee, 0xff, 0x48, 0x2f, 0x72, 0x4d, 0xf5, - 0x39, 0xd5, 0x71, 0xfe, - 0xa0, 0x07, 0x06, 0xad, 0x98, 0xd8, 0xcf, 0xfb, 0x71, 0x9e, 0x18, 0xd6, - 0x3c, 0xe9, 0xfc, 0x0b, - 0x97, 0x83, 0x7f, 0x17, 0xc7, 0x4f, 0xd4, 0x7a, 0x07, 0xfb, 0x7e, 0x10, - 0xf1, 0x86, 0xef, 0x1c, - 0x56, 0x12, 0x97, 0xa9, 0x43, 0x23, 0x3d, 0x5e, 0xcf, 0x0c, 0x4a, 0xbd, - 0xfa, 0x4d, 0xae, 0x1c, - 0xd6, 0xc8, 0x3a, 0xda, 0x54, 0x3e, 0xf8, 0x26, 0x2c, 0x2e, 0x4c, 0x71, - 0x04, 0xe0, 0x9b, 0x30, - 0xfd, 0x03, 0x36, 0x1f, 0xc5, 0x1a, 0xcf, 0xfc, 0x3f, 0x23, 0xeb, 0x81, - 0xf1, 0xa7, 0xe7, 0xc2, - 0x66, 0xeb, 0xe9, 0xca, 0xb1, 0xfd, 0x2f, 0x74, 0xbe, 0xe4, 0x14, 0x97, - 0x56, 0x7d, 0xa0, 0xf9, - 0xc1, 0xac, 0xdf, 0xbc, 0x30, 0x6b, 0x04, 0x9b, 0x0d, 0x13, 0x90, 0x6f, - 0x62, 0xba, 0x3c, 0x4d, - 0xab, 0x80, 0xda, 0x35, 0xb5, 0xf4, 0x7c, 0xf2, 0x01, 0xff, 0xce, 0xdb, - 0x76, 0x1a, 0x77, 0x14, - 0x54, 0x1a, 0xf6, 0xe4, 0xed, 0xe1, 0xf6, 0xe4, 0x95, 0xa1, 0x3d, 0x79, - 0x95, 0xa8, 0x22, 0x7f, - 0x17, 0xff, 0x6f, 0x39, 0x82, 0x64, 0x01, 0xfe, 0x35, 0x90, 0xdb, 0x0a, - 0x5d, 0xf2, 0x6f, 0xe4, - 0xbb, 0x8c, 0x6e, 0xcb, 0x65, 0x29, 0xf1, 0x34, 0xc6, 0x5c, 0x7b, 0xce, - 0x43, 0x03, 0xda, 0xb2, - 0xb8, 0xb1, 0x31, 0xa5, 0x10, 0xfc, 0x7d, 0x39, 0x0a, 0xd7, 0x33, 0x37, - 0xa0, 0xe9, 0x62, 0x3c, - 0x6d, 0x62, 0x6b, 0x89, 0x6e, 0x2a, 0x7a, 0xcf, 0x30, 0x33, 0xef, 0x68, - 0xee, 0x81, 0xbc, 0x8d, - 0x86, 0x4d, 0x8e, 0x6d, 0x68, 0xcd, 0xe8, 0xfe, 0x7c, 0x8c, 0x89, 0x69, - 0xca, 0xa4, 0x9b, 0xd2, - 0xcd, 0x19, 0x38, 0xd9, 0x92, 0x26, 0x34, 0x94, 0xb3, 0x48, 0xbc, 0x1a, - 0x89, 0x35, 0x1e, 0x82, - 0x2d, 0x16, 0x25, 0x16, 0x26, 0x18, 0x62, 0x94, 0x08, 0x14, 0xe1, 0xab, - 0x1e, 0x65, 0x89, 0xc1, - 0xe0, 0x93, 0xf1, 0x9d, 0xa5, 0x89, 0xe0, 0x1f, 0xee, 0x43, 0x9b, 0x6c, - 0x9b, 0xf0, 0xaa, 0xa2, - 0x17, 0xb9, 0xa6, 0xf9, 0x2d, 0x8c, 0x0d, 0xd9, 0xec, 0x23, 0x73, 0x1a, - 0xcd, 0x84, 0x48, 0x31, - 0xd5, 0xf1, 0x30, 0xfa, 0xca, 0x5a, 0x06, 0x98, 0xb7, 0x01, 0x30, 0x6f, - 0x23, 0xda, 0x64, 0xdd, - 0x0c, 0x58, 0xb9, 0x01, 0xad, 0x57, 0xd7, 0xc1, 0xde, 0x80, 0xd7, 0xca, - 0xdb, 0xc8, 0x62, 0x47, - 0x7b, 0x9c, 0x0e, 0xcf, 0x49, 0x27, 0x19, 0x42, 0xb2, 0x98, 0x24, 0x24, - 0x4b, 0x71, 0xa4, 0x53, - 0xd1, 0x68, 0x43, 0xb9, 0xb4, 0x8e, 0x6c, 0xb2, 0x7d, 0x44, 0x9a, 0xd8, - 0xea, 0x73, 0xed, 0x47, - 0x77, 0xcd, 0xed, 0x56, 0xd4, 0xc6, 0xd8, 0x58, 0xae, 0x8f, 0x13, 0x4d, - 0x11, 0xd5, 0x73, 0xed, - 0x18, 0x3f, 0x2d, 0x92, 0xf5, 0xe8, 0x0b, 0x7e, 0xb9, 0x42, 0x04, 0xfe, - 0x7e, 0xe4, 0x75, 0x69, - 0x15, 0xde, 0x6b, 0xdb, 0x8c, 0x36, 0xd8, 0x37, 0xa0, 0xd5, 0xf6, 0x15, - 0x68, 0x8f, 0x73, 0x03, - 0x92, 0xf3, 0x7b, 0xa3, 0x14, 0x36, 0x47, 0xcf, 0xe4, 0x35, 0xb3, 0xce, - 0xab, 0xfe, 0x57, 0xcf, - 0xd6, 0x1a, 0x37, 0x29, 0x6a, 0xc3, 0xb5, 0xb0, 0x66, 0xf0, 0xa9, 0x24, - 0x4d, 0x60, 0xdd, 0x79, - 0xcd, 0xac, 0x9d, 0x51, 0x13, 0xcb, 0x63, 0xfc, 0xb7, 0xea, 0x2a, 0x7e, - 0xa6, 0x75, 0x3a, 0xff, - 0x95, 0x3a, 0x9d, 0x97, 0xe4, 0x04, 0x8d, 0x53, 0xc2, 0x7a, 0xa4, 0x19, - 0x87, 0x25, 0x45, 0x88, - 0x25, 0x2d, 0x4c, 0x77, 0x10, 0x62, 0xb1, 0x62, 0x62, 0x41, 0xd8, 0x68, - 0xc9, 0xc1, 0x23, 0xc1, - 0xdf, 0x7b, 0x5b, 0x7a, 0x03, 0xbd, 0x24, 0xbd, 0x8c, 0x9f, 0x30, 0x5f, - 0x47, 0x52, 0xe0, 0x33, - 0xb1, 0x7e, 0xc2, 0x58, 0x73, 0x0c, 0x8d, 0xf9, 0xfc, 0x31, 0x57, 0x5c, - 0xc9, 0xb0, 0xca, 0x1d, - 0xa3, 0x3e, 0xfc, 0x79, 0xc6, 0x2b, 0x29, 0xa6, 0x24, 0x1a, 0x0f, 0x1e, - 0x65, 0xb4, 0x10, 0x49, - 0x33, 0xc5, 0xc6, 0xb8, 0x81, 0xb9, 0x2d, 0x79, 0x50, 0x78, 0x96, 0x3c, - 0x3e, 0x6d, 0xd0, 0x53, - 0xb5, 0x63, 0xd8, 0x19, 0x9a, 0x4f, 0xf8, 0xe0, 0x7d, 0xdd, 0xd9, 0x24, - 0x4c, 0xf7, 0xca, 0x9e, - 0x31, 0xe8, 0x31, 0x56, 0xbb, 0xf5, 0xe5, 0xbf, 0xb1, 0xe7, 0x07, 0x8a, - 0x75, 0xb5, 0xbe, 0xe7, - 0xa9, 0x13, 0x9f, 0x31, 0x2f, 0xb5, 0xf7, 0xaf, 0xe1, 0x2b, 0x5a, 0x4e, - 0x70, 0xec, 0xf9, 0xcf, - 0x7c, 0x11, 0xf9, 0x7f, 0xee, 0x38, 0x8a, 0xd4, 0xae, 0x31, 0xb0, 0xdc, - 0xfc, 0xdf, 0x3a, 0x6f, - 0x31, 0x80, 0x2e, 0x7b, 0x0d, 0x1d, 0xfc, 0xe2, 0xec, 0x1a, 0x1a, 0x26, - 0x9e, 0xf9, 0xc1, 0x31, - 0x62, 0x24, 0xaa, 0xd6, 0x7e, 0x36, 0xb9, 0xb8, 0x37, 0x6c, 0xee, 0x65, - 0x9c, 0x1c, 0xa9, 0xcd, - 0x80, 0xf3, 0xa9, 0xe7, 0xc2, 0x7a, 0x79, 0xf3, 0x93, 0x47, 0x32, 0xde, - 0x46, 0x82, 0x1c, 0x78, - 0xae, 0x7c, 0x8d, 0x7c, 0x7f, 0x88, 0xb8, 0x70, 0x85, 0x33, 0x28, 0x03, - 0xf0, 0x4d, 0xb2, 0x6b, - 0x60, 0x61, 0x7a, 0x20, 0xbe, 0x49, 0x2d, 0xad, 0xfa, 0xbf, 0x42, 0xa7, - 0x9b, 0x07, 0xfc, 0xbb, - 0x28, 0x5c, 0x20, 0xfb, 0xed, 0x3b, 0x8d, 0x65, 0x85, 0x7b, 0x73, 0xf7, - 0xe5, 0x97, 0x73, 0x55, - 0x8e, 0x4a, 0x54, 0xe6, 0xd8, 0x8b, 0x9e, 0x51, 0x98, 0xfe, 0x41, 0x5b, - 0x73, 0xa7, 0xbc, 0xae, - 0xb8, 0x6b, 0x51, 0x27, 0xbe, 0x99, 0xdc, 0x80, 0xd4, 0x17, 0x1a, 0x8b, - 0xcd, 0xcc, 0xf5, 0x4c, - 0x19, 0x34, 0xcb, 0x9c, 0x42, 0xd3, 0xcc, 0xf5, 0xe5, 0x2e, 0xa4, 0x77, - 0x51, 0x6f, 0xee, 0xfa, - 0x31, 0x6d, 0x0c, 0x8d, 0x20, 0x56, 0x6b, 0x64, 0xae, 0x47, 0x32, 0x4c, - 0x71, 0x34, 0x5b, 0xea, - 0x80, 0x5b, 0xdb, 0x7a, 0x71, 0x79, 0xce, 0xfd, 0xc6, 0x43, 0xce, 0x2d, - 0x86, 0x6d, 0xce, 0x5d, - 0xdc, 0xae, 0xbc, 0x9d, 0xdc, 0xaa, 0xc2, 0xde, 0x5c, 0xa4, 0x90, 0x29, - 0xa4, 0x99, 0xd2, 0x85, - 0x4c, 0xc6, 0x71, 0x93, 0x5b, 0xd0, 0xeb, 0x6c, 0x1d, 0x68, 0x33, 0xb9, - 0xa1, 0xd0, 0xd8, 0xda, - 0x92, 0xef, 0x94, 0xd7, 0x81, 0x6b, 0xee, 0xa8, 0xcf, 0x67, 0x89, 0x9a, - 0x4f, 0x26, 0xa4, 0xd3, - 0x74, 0x9a, 0x46, 0x53, 0x29, 0xa0, 0x25, 0x89, 0x92, 0x53, 0xf0, 0xb5, - 0xd6, 0x01, 0xe8, 0x45, - 0x75, 0x02, 0x3a, 0xa9, 0x1c, 0xc1, 0xeb, 0xad, 0xdb, 0xd0, 0x36, 0x75, - 0x17, 0xbf, 0xb2, 0xf8, - 0x61, 0x63, 0x9a, 0xd2, 0x08, 0xd5, 0x83, 0x57, 0x4c, 0x37, 0xa7, 0xd2, - 0x34, 0x53, 0x92, 0x90, - 0x6a, 0xbb, 0x0b, 0x4f, 0x82, 0xf8, 0x72, 0x93, 0xb2, 0x15, 0x6f, 0x55, - 0xb7, 0xe2, 0xed, 0x6a, - 0x29, 0xde, 0xa9, 0x6c, 0xc3, 0xdb, 0xa4, 0xed, 0xdc, 0x16, 0x79, 0x33, - 0xb7, 0xc1, 0xba, 0x03, - 0xfd, 0xa0, 0x36, 0x05, 0xff, 0x29, 0x4d, 0x48, 0x33, 0xa7, 0x99, 0x52, - 0xc5, 0x54, 0x13, 0xdc, - 0x92, 0xa6, 0x79, 0x94, 0xdb, 0xa7, 0x6e, 0x16, 0xb6, 0xaa, 0x45, 0xa4, - 0x51, 0x5e, 0xdb, 0x51, - 0x3d, 0x8a, 0xaf, 0x31, 0x36, 0xb2, 0x36, 0xc6, 0x99, 0x96, 0x0c, 0xc0, - 0x8e, 0x24, 0x4d, 0x47, - 0x20, 0xd5, 0x9c, 0x4d, 0x1a, 0x5a, 0xe0, 0x58, 0x98, 0x33, 0xe1, 0xbb, - 0xa6, 0x10, 0xc6, 0xf7, - 0x4b, 0x01, 0x7f, 0x89, 0xf1, 0x99, 0x53, 0x01, 0x39, 0xa2, 0x94, 0xe6, - 0xf8, 0x2e, 0x67, 0x4f, - 0xee, 0x79, 0x79, 0x0d, 0x7f, 0x4e, 0xde, 0x89, 0xd7, 0x28, 0x9b, 0xc8, - 0x0e, 0x75, 0x15, 0x5e, - 0x6d, 0x3d, 0x85, 0xe7, 0x14, 0x0d, 0xe4, 0xeb, 0x39, 0x12, 0x50, 0x9a, - 0x94, 0x88, 0x13, 0xcc, - 0x71, 0xac, 0xb7, 0x59, 0x88, 0x37, 0xc7, 0x0a, 0x09, 0x80, 0x63, 0xb1, - 0x42, 0xa2, 0xa9, 0x31, - 0xe0, 0xdc, 0xb5, 0x45, 0xd7, 0x18, 0x9a, 0xdb, 0xeb, 0x71, 0x19, 0xf0, - 0x5d, 0x12, 0x4d, 0x91, - 0x34, 0x43, 0x6a, 0x4f, 0xee, 0xb3, 0x8e, 0x44, 0x1f, 0x2b, 0xbb, 0xf8, - 0xf5, 0xea, 0x1c, 0xee, - 0x7b, 0x65, 0x26, 0x3f, 0x5d, 0x9e, 0x8a, 0x72, 0xe4, 0x68, 0x12, 0x47, - 0x99, 0x32, 0x03, 0xc3, - 0x3e, 0x4d, 0xff, 0x94, 0x36, 0x36, 0x75, 0xa2, 0x39, 0x16, 0x0b, 0x60, - 0xdf, 0x30, 0xfc, 0x1e, - 0xc4, 0xbb, 0xef, 0x5a, 0xde, 0x41, 0x2f, 0xca, 0x2f, 0xa2, 0x97, 0xe4, - 0x3e, 0xb8, 0x1e, 0xe0, - 0x6d, 0x34, 0x8d, 0xa5, 0xd1, 0x34, 0x9a, 0x44, 0xc1, 0x7e, 0x74, 0x9d, - 0xcb, 0x27, 0x2b, 0x29, - 0xbc, 0x38, 0xa4, 0x3a, 0x96, 0xfd, 0x3a, 0xee, 0x99, 0x18, 0xf6, 0x9a, - 0x70, 0x16, 0x26, 0x99, - 0x9b, 0x91, 0x7a, 0xe6, 0xf6, 0xf8, 0x1e, 0xe1, 0x39, 0xf2, 0x94, 0xf0, - 0x30, 0x19, 0xf8, 0xc5, - 0x2b, 0x2f, 0xd4, 0xee, 0x5f, 0xde, 0x38, 0x67, 0xd0, 0xc0, 0x41, 0xab, - 0xff, 0x7d, 0xd7, 0x0d, - 0x5e, 0xf8, 0x17, 0x31, 0xf9, 0xe5, 0xe7, 0xd8, 0xe3, 0xbc, 0xf1, 0x4b, - 0xe3, 0xf1, 0x7a, 0x34, - 0x5e, 0x66, 0x94, 0x3e, 0x5e, 0x27, 0xc7, 0x97, 0xb7, 0xf1, 0xbd, 0xda, - 0x7d, 0xcf, 0xac, 0xd6, - 0x5c, 0x23, 0x57, 0x08, 0xf7, 0xdd, 0xf3, 0x59, 0xe2, 0x2b, 0x4c, 0x2f, - 0x3a, 0x4e, 0xaa, 0xa9, - 0x83, 0xcf, 0x7c, 0x80, 0xcc, 0xbc, 0xb8, 0x51, 0x57, 0x98, 0xd7, 0xf3, - 0xea, 0x4d, 0xd3, 0xab, - 0xdf, 0xa4, 0x2f, 0x87, 0xc5, 0xe6, 0x7e, 0xd4, 0xe4, 0x9b, 0x64, 0x0d, - 0x4b, 0xc9, 0x8f, 0xcf, - 0x8d, 0xb3, 0xc5, 0x72, 0x31, 0x72, 0x34, 0x8a, 0xb2, 0x44, 0x23, 0x3f, - 0xdc, 0x37, 0xe2, 0x73, - 0xce, 0xe4, 0xb8, 0x6c, 0xbf, 0x7a, 0xc9, 0xe1, 0xd2, 0xef, 0xaf, 0x79, - 0x4c, 0x5c, 0xdc, 0x37, - 0x7d, 0x33, 0x28, 0x63, 0x73, 0x02, 0xf2, 0x4d, 0xac, 0x89, 0x46, 0x76, - 0x4d, 0xc8, 0x1c, 0x1b, - 0x98, 0x6f, 0x72, 0xb9, 0x9a, 0x56, 0xa1, 0x68, 0x52, 0x27, 0x50, 0x8e, - 0x1e, 0xa7, 0x17, 0x85, - 0x8b, 0xa6, 0x33, 0x78, 0xaf, 0xa3, 0xd2, 0x50, 0x99, 0xbf, 0xcf, 0xb8, - 0xd7, 0x51, 0xc5, 0xed, - 0xb6, 0x1f, 0x40, 0xcf, 0xd8, 0x22, 0x50, 0x3b, 0x5b, 0x37, 0xd3, 0x8d, - 0x05, 0x1d, 0xf8, 0x16, - 0xb6, 0x7a, 0x44, 0x53, 0x09, 0xc5, 0x71, 0x52, 0x9a, 0x90, 0x2e, 0x24, - 0x0b, 0xf1, 0x42, 0xa2, - 0xd4, 0x5c, 0xe8, 0x59, 0xdc, 0x87, 0xeb, 0x36, 0xa1, 0xa3, 0xa1, 0x65, - 0x41, 0x03, 0x2e, 0xdb, - 0x52, 0x8f, 0xa4, 0x03, 0xf6, 0xa5, 0x5a, 0xba, 0x90, 0x66, 0xd6, 0x46, - 0x78, 0xb8, 0xba, 0x9d, - 0x3b, 0x6b, 0x2b, 0xe3, 0xb6, 0xe4, 0xef, 0x30, 0x6e, 0xcf, 0xdb, 0x6e, - 0x2c, 0x77, 0x96, 0x73, - 0x6b, 0x9d, 0x5d, 0x79, 0xd6, 0xff, 0x9c, 0x62, 0x4a, 0xa1, 0x09, 0x62, - 0x06, 0xed, 0x6c, 0xeb, - 0x86, 0x3a, 0xda, 0x9b, 0xe0, 0x86, 0xb6, 0x96, 0xb8, 0x93, 0xb3, 0x8b, - 0xa6, 0x31, 0x93, 0x65, - 0x49, 0x63, 0xd9, 0x38, 0x9a, 0x24, 0xb0, 0xc7, 0x25, 0xc1, 0xce, 0xa0, - 0xb1, 0x62, 0x2a, 0xe9, - 0xac, 0x74, 0x46, 0x9d, 0xad, 0x79, 0xe8, 0x88, 0xe5, 0x3c, 0xae, 0x04, - 0xdf, 0x6e, 0x97, 0x75, - 0x37, 0xda, 0xad, 0xee, 0xe6, 0xd7, 0x17, 0x0d, 0x30, 0xc6, 0x4b, 0xd9, - 0x28, 0x93, 0xcd, 0xe4, - 0x14, 0x34, 0x7d, 0x3d, 0x52, 0xdf, 0xda, 0x86, 0x14, 0xa9, 0x3f, 0x91, - 0x9d, 0xca, 0x4e, 0x52, - 0xae, 0x56, 0x90, 0xdd, 0xca, 0x5e, 0xb2, 0x4f, 0x2a, 0x27, 0x65, 0x96, - 0x4a, 0xbe, 0x4c, 0xda, - 0xc5, 0x97, 0x59, 0xf7, 0xa2, 0x4f, 0xa5, 0x0c, 0x88, 0xf1, 0x32, 0xa8, - 0x67, 0xf6, 0x59, 0xaa, - 0xb9, 0x1e, 0xce, 0x76, 0xbe, 0xc5, 0x1d, 0x51, 0x76, 0x09, 0x3b, 0x6c, - 0x05, 0xb8, 0xdd, 0x98, - 0x9b, 0x46, 0x75, 0xca, 0x6f, 0x67, 0x7c, 0xc0, 0xd4, 0x82, 0x26, 0x43, - 0x7c, 0x9c, 0x4c, 0x92, - 0x69, 0x92, 0x98, 0x49, 0x1a, 0x58, 0xea, 0x93, 0x2c, 0x29, 0x1d, 0xa7, - 0x9a, 0x52, 0xb0, 0x16, - 0x27, 0x32, 0xbe, 0x33, 0x4d, 0xa2, 0xa9, 0x28, 0x19, 0xce, 0x93, 0x0c, - 0xd2, 0xa5, 0xf0, 0x61, - 0x54, 0x54, 0xf0, 0x3d, 0x77, 0x46, 0xae, 0x42, 0x9b, 0xd5, 0xed, 0xb8, - 0xcc, 0xb6, 0x99, 0x2c, - 0xc8, 0x5b, 0x8a, 0x97, 0x17, 0x71, 0x28, 0xdd, 0x19, 0x85, 0xd2, 0xe4, - 0x0c, 0x78, 0x5e, 0x22, - 0x61, 0x1c, 0x8f, 0x24, 0xad, 0xc6, 0x10, 0xcf, 0xf4, 0xb7, 0x48, 0x23, - 0x7b, 0x27, 0x7c, 0x43, - 0xf1, 0xf5, 0x86, 0xf6, 0x85, 0x4d, 0x0d, 0xf5, 0xb4, 0xc7, 0x44, 0xd1, - 0x74, 0xcb, 0x75, 0xe4, - 0x0e, 0xa5, 0x2f, 0x7e, 0x5f, 0xae, 0x40, 0x65, 0xca, 0x72, 0x56, 0x0f, - 0xe2, 0xe6, 0xc9, 0xb3, - 0xd1, 0xb7, 0xd2, 0x77, 0x10, 0xdb, 0x32, 0x34, 0x4b, 0xa0, 0x89, 0xf0, - 0x9d, 0x5d, 0xdc, 0x97, - 0x18, 0x5a, 0xdf, 0xdc, 0x86, 0x0e, 0x16, 0x39, 0x7e, 0x30, 0xe0, 0xde, - 0x9b, 0x96, 0x37, 0xf1, - 0x2b, 0x96, 0x27, 0xf0, 0x23, 0xca, 0xbd, 0xf8, 0x1a, 0x11, 0xec, 0xb0, - 0xe8, 0x9a, 0x21, 0xed, - 0x0a, 0xd2, 0xde, 0x03, 0xd4, 0x25, 0xb1, 0x05, 0x9d, 0x5d, 0x7d, 0xca, - 0x5e, 0x79, 0x3a, 0x2d, - 0x96, 0x9d, 0xd5, 0xe2, 0x91, 0x58, 0x1a, 0x03, 0xfe, 0x61, 0x43, 0xd2, - 0xd6, 0x74, 0x1d, 0xb9, - 0x49, 0x78, 0x1c, 0xb0, 0x6f, 0x20, 0x79, 0xc0, 0x3c, 0x80, 0xdc, 0x3f, - 0xe1, 0xd9, 0x41, 0xb5, - 0x6b, 0xb8, 0xe7, 0xbf, 0x61, 0x3e, 0xe1, 0x2b, 0x3d, 0x3b, 0xd3, 0xf4, - 0x4b, 0xe7, 0xe8, 0xc4, - 0x07, 0x5f, 0x61, 0x8f, 0xf3, 0xd6, 0x35, 0xa8, 0x9a, 0x31, 0xe8, 0xf1, - 0x41, 0xeb, 0x1f, 0xbb, - 0xfd, 0xb5, 0x6d, 0x35, 0xeb, 0xc0, 0xa5, 0x1f, 0x96, 0xbc, 0xee, 0xaf, - 0xef, 0xd9, 0x9b, 0x27, - 0x77, 0x7e, 0xea, 0xd0, 0x67, 0xd9, 0x7d, 0x2d, 0x8b, 0x93, 0x87, 0x26, - 0x3b, 0x53, 0x46, 0x31, - 0x2d, 0xfc, 0x14, 0x2f, 0x1d, 0xfc, 0x18, 0x7b, 0x7a, 0x2e, 0xe3, 0x3f, - 0x85, 0x25, 0xaf, 0x17, - 0xca, 0xbc, 0x45, 0x47, 0x48, 0xf3, 0x16, 0x6b, 0xcc, 0x0f, 0xd6, 0xf4, - 0xef, 0xdd, 0xda, 0xcf, - 0x4c, 0x07, 0x9f, 0xfd, 0x9e, 0xcd, 0xbd, 0xf4, 0xcf, 0x7d, 0x73, 0xf7, - 0x25, 0x3b, 0x52, 0x47, - 0xb1, 0x9c, 0x5a, 0xa0, 0xfc, 0x1a, 0xcb, 0x35, 0xc6, 0x84, 0xa0, 0xf3, - 0xf5, 0xb7, 0x1e, 0x13, - 0xf8, 0x1e, 0xda, 0x7b, 0x2a, 0x31, 0x46, 0x7f, 0x7a, 0x2e, 0x1a, 0xae, - 0xdb, 0x92, 0x73, 0x59, - 0x8f, 0x4c, 0x10, 0xbe, 0x89, 0x8b, 0xfb, 0x66, 0x8f, 0xba, 0x6c, 0xed, - 0x9a, 0x96, 0xa6, 0xef, - 0x5d, 0x67, 0x99, 0xf9, 0x0c, 0xae, 0xb2, 0x57, 0x1a, 0x2a, 0x1c, 0xfb, - 0xb9, 0x72, 0xc7, 0x21, - 0xee, 0xf5, 0xa2, 0x96, 0x86, 0x3e, 0xa3, 0x7b, 0xf1, 0xd7, 0x17, 0x75, - 0x36, 0xb4, 0x52, 0x5a, - 0xf0, 0x4d, 0xcd, 0x10, 0x0b, 0x89, 0x0d, 0x68, 0x33, 0x73, 0x13, 0xd2, - 0xd4, 0xd2, 0x9e, 0xdc, - 0xee, 0xb8, 0x8f, 0xdc, 0x33, 0xb6, 0x37, 0xd7, 0x61, 0x7c, 0x0b, 0x43, - 0xd3, 0xbc, 0x46, 0xa8, - 0xa1, 0x92, 0x45, 0xd2, 0xd4, 0x46, 0xa4, 0x89, 0x92, 0x4e, 0xee, 0x94, - 0xa6, 0xe1, 0x3f, 0xc5, - 0x93, 0x68, 0x37, 0x60, 0xde, 0xee, 0xfc, 0x32, 0x88, 0xad, 0x77, 0x19, - 0x2a, 0xe1, 0x75, 0xb7, - 0xd9, 0x7a, 0xe0, 0x18, 0x9a, 0x05, 0x18, 0xd2, 0x88, 0x74, 0x51, 0x6f, - 0x27, 0xbd, 0x0b, 0xae, - 0xe3, 0x5b, 0x39, 0xda, 0xf0, 0x9d, 0xf2, 0x6f, 0xe0, 0x3b, 0x17, 0x34, - 0x27, 0x59, 0x32, 0xa0, - 0x91, 0x29, 0x59, 0x88, 0x13, 0xc1, 0xb2, 0x45, 0xa6, 0xa3, 0x90, 0x46, - 0xd2, 0x2d, 0xe9, 0xa4, - 0x99, 0xdc, 0x08, 0x77, 0x90, 0x86, 0xa1, 0x25, 0x96, 0x5f, 0xd0, 0x7e, - 0xc0, 0xbc, 0x3d, 0xea, - 0x3e, 0xb4, 0x4f, 0xad, 0x40, 0xe5, 0xf0, 0xf3, 0xbe, 0x82, 0x47, 0x8c, - 0x71, 0x0a, 0x9b, 0xe1, - 0x91, 0x84, 0xe3, 0xa5, 0x78, 0xd8, 0xb1, 0xb8, 0x99, 0xb5, 0x01, 0x16, - 0xa4, 0x0b, 0xb8, 0x4c, - 0x29, 0xc7, 0x65, 0x52, 0x25, 0xde, 0x2d, 0x95, 0xe1, 0xdd, 0xe2, 0x5e, - 0xbc, 0xd7, 0x52, 0x89, - 0xf7, 0x4a, 0xe5, 0xf0, 0xdc, 0x3d, 0xc4, 0xac, 0x64, 0x92, 0x2c, 0xb1, - 0x3e, 0x49, 0x17, 0x01, - 0xd9, 0xc4, 0x24, 0x78, 0x9f, 0x06, 0x28, 0xdd, 0xfe, 0x0a, 0x77, 0x42, - 0x2e, 0xa3, 0xbb, 0xec, - 0x1f, 0xa1, 0x9e, 0xe3, 0x6e, 0x34, 0x34, 0xb5, 0x36, 0xe3, 0x06, 0x9a, - 0x5a, 0x81, 0xff, 0x99, - 0x4a, 0x33, 0xcc, 0x59, 0x02, 0xd3, 0x12, 0x4d, 0x93, 0xe2, 0x69, 0x8c, - 0xc8, 0xbc, 0xdf, 0x28, - 0xb7, 0x46, 0x59, 0x0a, 0x4d, 0x24, 0x69, 0x34, 0x03, 0x30, 0xba, 0xa9, - 0xed, 0x46, 0xfc, 0xa8, - 0x6d, 0x12, 0x3a, 0x28, 0x1d, 0x45, 0x5b, 0x2d, 0xdb, 0xc9, 0x5e, 0xf5, - 0x08, 0x3d, 0xec, 0x5c, - 0x43, 0xbe, 0x2f, 0x90, 0x51, 0xb7, 0xa2, 0x68, 0x3e, 0x5d, 0x6a, 0x88, - 0x33, 0xcc, 0x29, 0x1a, - 0xf6, 0xc5, 0x09, 0xd1, 0xe0, 0x3b, 0xb2, 0xd8, 0x35, 0x1d, 0x3e, 0x47, - 0x2b, 0x72, 0x5d, 0xf1, - 0xcd, 0xc6, 0xeb, 0xc6, 0x35, 0x33, 0x34, 0xb0, 0x03, 0xb6, 0x5a, 0x92, - 0x49, 0x9a, 0xd8, 0x9c, - 0x34, 0x95, 0x9f, 0xc0, 0xc5, 0xf2, 0x62, 0x5c, 0xa1, 0xac, 0xe3, 0x57, - 0xaa, 0xab, 0xb8, 0x25, - 0xea, 0x22, 0x6e, 0x81, 0x3c, 0x13, 0x4d, 0x97, 0xbe, 0x27, 0x9c, 0x18, - 0x2d, 0xc4, 0x09, 0xc9, - 0xf0, 0x39, 0x92, 0xe1, 0xf5, 0x98, 0x56, 0x02, 0xcb, 0xd7, 0xb6, 0xa4, - 0xaf, 0x88, 0x43, 0xf9, - 0x37, 0xc4, 0x37, 0xd1, 0x1b, 0xe2, 0x6b, 0xe4, 0x71, 0xe5, 0x0e, 0xdc, - 0x63, 0x52, 0xcf, 0x57, - 0xee, 0x5b, 0xf9, 0x62, 0x3f, 0x0f, 0xae, 0xdc, 0x5c, 0x1c, 0xfd, 0x6e, - 0xf4, 0x47, 0xf7, 0xbf, - 0x5e, 0x1b, 0xcb, 0x34, 0x9d, 0xd1, 0x05, 0x37, 0xfc, 0x2b, 0x46, 0x48, - 0x01, 0xbf, 0xaf, 0x33, - 0xb9, 0x45, 0xf8, 0x17, 0x79, 0x82, 0x3e, 0x42, 0xfe, 0x65, 0x02, 0xec, - 0x13, 0xee, 0xc5, 0x77, - 0x17, 0x3d, 0x3a, 0x98, 0x3d, 0x67, 0xca, 0xd8, 0x8b, 0x97, 0x74, 0xaa, - 0x26, 0x19, 0x34, 0x9f, - 0x30, 0xc3, 0xe2, 0xe5, 0x3f, 0x8c, 0xb9, 0xe5, 0x9d, 0x3a, 0x3d, 0xd0, - 0x53, 0x07, 0x69, 0xf8, - 0xd5, 0x68, 0xfa, 0xff, 0x3d, 0xe1, 0x89, 0xb9, 0xfd, 0xf6, 0x3d, 0xbb, - 0xf5, 0xb0, 0xea, 0xf8, - 0x8f, 0x1b, 0x9e, 0xb8, 0x8d, 0xe5, 0xbe, 0x62, 0x15, 0x57, 0x3f, 0x1e, - 0x9b, 0xa3, 0x9e, 0x5e, - 0x98, 0x3e, 0x22, 0xbd, 0x28, 0x7d, 0x04, 0xab, 0x3d, 0x64, 0xe4, 0x25, - 0xe5, 0xf8, 0xcd, 0xaf, - 0x85, 0x9a, 0xd7, 0xd3, 0x33, 0x6f, 0x51, 0x97, 0x7e, 0x93, 0xbf, 0x1c, - 0x56, 0x24, 0x89, 0x32, - 0x47, 0xe1, 0x68, 0x39, 0x06, 0xc5, 0xda, 0xe3, 0x38, 0x56, 0xef, 0xf0, - 0x70, 0xdf, 0xa2, 0xcd, - 0x41, 0x75, 0xbe, 0x34, 0x2c, 0xba, 0xa4, 0x83, 0x5f, 0xb3, 0x47, 0xbb, - 0xba, 0x6e, 0xa2, 0xe1, - 0x42, 0x4c, 0x6e, 0x64, 0x90, 0xb9, 0xf2, 0xba, 0xb5, 0xea, 0x75, 0xcd, - 0xa0, 0xd4, 0xa1, 0x55, - 0x5f, 0xe7, 0x98, 0xf8, 0xd6, 0x73, 0xd1, 0xc7, 0x37, 0xd1, 0xcb, 0x71, - 0x89, 0x45, 0x01, 0xb4, - 0x6b, 0x48, 0x1f, 0xe1, 0x3b, 0xad, 0x96, 0xfb, 0xa7, 0xe9, 0x0c, 0x3a, - 0x60, 0xab, 0xe2, 0x8f, - 0xda, 0xc7, 0xf3, 0xb7, 0x03, 0x3e, 0xdd, 0xee, 0xe8, 0x45, 0x6e, 0x55, - 0x7a, 0xe3, 0x3b, 0xa4, - 0xdb, 0xc9, 0x1d, 0x62, 0x5f, 0x7a, 0xbb, 0x34, 0x40, 0xf8, 0xb7, 0xfc, - 0x30, 0x7a, 0x54, 0x19, - 0x80, 0xee, 0x73, 0xbc, 0x88, 0x5e, 0xb5, 0xdf, 0x8e, 0x1f, 0x28, 0xb8, - 0x8f, 0xbb, 0xa3, 0xf0, - 0x4e, 0xee, 0xb6, 0xbc, 0x1e, 0xb8, 0x8b, 0xb5, 0x2b, 0x7e, 0xca, 0x32, - 0x9a, 0x9c, 0x12, 0x2f, - 0x92, 0xfd, 0x8e, 0x03, 0xdc, 0x7e, 0x47, 0x95, 0xf1, 0x80, 0xe3, 0x80, - 0xe1, 0x80, 0x73, 0x9f, - 0xe1, 0x80, 0x7d, 0x2f, 0x47, 0x94, 0x96, 0xb8, 0xa9, 0xd8, 0x06, 0xb5, - 0x95, 0x3b, 0xe1, 0xee, - 0x6a, 0x77, 0x7c, 0x9d, 0xbd, 0x2b, 0xbe, 0x55, 0xee, 0x81, 0x7b, 0x58, - 0x6f, 0xc5, 0xb7, 0xe6, - 0xdf, 0xcc, 0xdf, 0xa4, 0x5c, 0x8f, 0xda, 0xc8, 0x6d, 0xc9, 0x9d, 0xf6, - 0x87, 0xf1, 0xbd, 0xb6, - 0xde, 0xa8, 0xab, 0xd4, 0x0e, 0x37, 0x92, 0x52, 0xf0, 0x0d, 0xca, 0x50, - 0xf4, 0x95, 0x74, 0x0e, - 0x9d, 0x92, 0x77, 0x70, 0xe5, 0x4a, 0x39, 0x5f, 0xae, 0xec, 0xe1, 0x2b, - 0x95, 0x32, 0x6e, 0x87, - 0x7c, 0x8c, 0x1f, 0x6d, 0x6d, 0x84, 0x18, 0x17, 0xb7, 0x91, 0xb5, 0x09, - 0xdf, 0xd9, 0x7a, 0x3b, - 0xba, 0xd9, 0xd6, 0x91, 0x6f, 0xa6, 0x44, 0x22, 0xc0, 0x3f, 0xb4, 0x4b, - 0xde, 0xc5, 0xef, 0x00, - 0xbc, 0x2b, 0xb7, 0xec, 0x44, 0x3b, 0xcc, 0xa5, 0x7c, 0xa5, 0xa5, 0x02, - 0x55, 0x48, 0xbb, 0xf0, - 0x3e, 0x79, 0x1b, 0xfd, 0x97, 0x1c, 0x45, 0x12, 0xe5, 0x34, 0x94, 0x29, - 0x37, 0xc6, 0xad, 0xe4, - 0x86, 0x28, 0xde, 0x12, 0x05, 0x3e, 0xf7, 0x8b, 0xe8, 0x84, 0x54, 0x85, - 0x37, 0xaa, 0xfd, 0x70, - 0x8c, 0x3d, 0x99, 0x8f, 0x82, 0x6b, 0x71, 0xa2, 0x25, 0x0e, 0x45, 0xca, - 0x91, 0x38, 0xde, 0x9a, - 0x81, 0x32, 0xd5, 0x06, 0xa4, 0x99, 0xd4, 0x81, 0x76, 0x14, 0xd3, 0x00, - 0x9f, 0x3b, 0xd1, 0x01, - 0x96, 0x01, 0xf4, 0x7a, 0x4b, 0x03, 0x9a, 0x62, 0x8e, 0xa1, 0x11, 0x4a, - 0x5b, 0xf2, 0xbc, 0x7d, - 0x1c, 0xda, 0x2c, 0x9e, 0x46, 0xdb, 0xa4, 0x2d, 0x68, 0xbb, 0xb2, 0x8d, - 0x2e, 0xb7, 0x8f, 0x26, - 0x0f, 0xa9, 0x37, 0xe0, 0xf6, 0xf0, 0xfc, 0x08, 0xc0, 0x65, 0xb8, 0x7e, - 0xe3, 0x24, 0xc0, 0xb6, - 0x0c, 0x31, 0x9b, 0x36, 0x92, 0x5a, 0xa2, 0xe6, 0x72, 0x2b, 0xd4, 0x42, - 0x6a, 0x80, 0x9a, 0xa9, - 0xdd, 0x85, 0x07, 0xf2, 0xba, 0xf3, 0x1d, 0x1d, 0x37, 0xa3, 0xeb, 0xa5, - 0x06, 0x42, 0xa2, 0x18, - 0x0b, 0x78, 0xdc, 0x09, 0x19, 0xe5, 0x39, 0x7c, 0x95, 0xb2, 0x13, 0xad, - 0x52, 0x57, 0xf3, 0xcb, - 0xd4, 0xa5, 0xdc, 0x22, 0x65, 0x3e, 0x37, 0x47, 0xfa, 0x0e, 0x4d, 0x13, - 0x27, 0xe1, 0x07, 0x4d, - 0x91, 0x42, 0x2c, 0x8b, 0xbb, 0xc5, 0x14, 0xcc, 0xf4, 0x0d, 0x32, 0xcc, - 0x31, 0x24, 0xdd, 0xdc, - 0x98, 0x3e, 0x6b, 0x7e, 0x07, 0xbf, 0x6c, 0x7b, 0x6a, 0xd4, 0x83, 0x5f, - 0x3f, 0xfc, 0xcc, 0xd3, - 0xee, 0xba, 0x43, 0x8d, 0xbd, 0xea, 0xbe, 0xbe, 0xe9, 0x53, 0x5e, 0x7a, - 0xbe, 0x76, 0x8c, 0xaa, - 0xf5, 0xe3, 0xad, 0xbc, 0xbb, 0x5f, 0x22, 0xc4, 0xf8, 0xd7, 0x0a, 0xfd, - 0xc8, 0x23, 0xf4, 0x41, - 0x72, 0xbf, 0xe9, 0x3e, 0x7c, 0x1f, 0x60, 0xdf, 0x3d, 0x42, 0x5f, 0xdc, - 0x47, 0xbd, 0x77, 0x54, - 0x9d, 0xb8, 0xf4, 0xc3, 0x31, 0x1a, 0x8e, 0xb6, 0x76, 0x44, 0x5c, 0xca, - 0xb3, 0x3b, 0x5b, 0x0f, - 0x67, 0xf7, 0x8d, 0xf9, 0xf0, 0xe2, 0xeb, 0xb5, 0x7b, 0xa0, 0x9b, 0xe6, - 0x25, 0x0d, 0x7b, 0x64, - 0x9d, 0x8f, 0xcf, 0xe4, 0xce, 0x0d, 0xda, 0x67, 0xcd, 0x78, 0xb4, 0xd4, - 0x71, 0x7e, 0x44, 0xed, - 0xf8, 0x58, 0xeb, 0xb7, 0xfe, 0xa1, 0xf5, 0x40, 0x6f, 0x8e, 0x46, 0x75, - 0xdd, 0xb5, 0x80, 0xe9, - 0xe0, 0x67, 0x6a, 0x7d, 0x67, 0xac, 0xe7, 0xc2, 0x93, 0x5f, 0xab, 0x33, - 0x67, 0xf2, 0x0a, 0x72, - 0x58, 0x7e, 0xe6, 0xaa, 0xe9, 0xe0, 0x79, 0xe9, 0xc9, 0x61, 0x01, 0x16, - 0xaa, 0x71, 0xbc, 0x36, - 0xf7, 0xed, 0x32, 0xb8, 0x6f, 0x3e, 0xf5, 0x5c, 0xc0, 0x9f, 0x62, 0xdf, - 0x35, 0xb3, 0x28, 0x75, - 0x84, 0xdf, 0xf9, 0xc1, 0x5e, 0x9a, 0x56, 0x57, 0x92, 0xeb, 0xbc, 0xbc, - 0x63, 0x92, 0xe9, 0x1b, - 0x8b, 0x6a, 0xf3, 0x4d, 0xc6, 0x05, 0xe3, 0x9b, 0x44, 0x84, 0x4d, 0xa7, - 0xfb, 0x49, 0x61, 0xa7, - 0x76, 0xae, 0xfd, 0x69, 0x3e, 0x8d, 0x8f, 0x2a, 0x2b, 0xf0, 0x6a, 0x79, - 0x0b, 0xde, 0x28, 0x6f, - 0x21, 0x9b, 0xa4, 0xad, 0x78, 0x8b, 0xba, 0x89, 0x6c, 0x54, 0x37, 0x93, - 0x2d, 0xd6, 0x5d, 0xa4, - 0x52, 0xd9, 0x8b, 0xf7, 0x48, 0xdb, 0xf1, 0x6a, 0x75, 0x2b, 0xf8, 0x55, - 0x5b, 0xe8, 0x2e, 0xeb, - 0x36, 0x7e, 0x93, 0x63, 0xbd, 0x71, 0xb5, 0x6d, 0x1d, 0x5a, 0xa7, 0xae, - 0x44, 0xa7, 0x01, 0xfb, - 0x8e, 0xdb, 0xf7, 0x03, 0x8e, 0x1e, 0xe6, 0x8e, 0xda, 0x8e, 0x73, 0x87, - 0xad, 0x87, 0x0c, 0xc7, - 0x6c, 0x47, 0x0c, 0x07, 0x01, 0xff, 0x66, 0xab, 0x73, 0xd0, 0x62, 0xb5, - 0x04, 0x2d, 0x84, 0x3d, - 0x47, 0x9d, 0x0d, 0x7b, 0x1e, 0x5e, 0x28, 0x2f, 0x21, 0x4b, 0xd4, 0x05, - 0x64, 0x81, 0x6d, 0xa9, - 0x71, 0xb1, 0xb5, 0xc4, 0xf8, 0x83, 0x75, 0x0e, 0xb7, 0x26, 0x6f, 0x1d, - 0x5a, 0xe9, 0x58, 0xc2, - 0x97, 0x28, 0x73, 0xd1, 0x6c, 0x79, 0x2a, 0xfa, 0x41, 0xfa, 0x0d, 0xff, - 0xc7, 0xb2, 0x87, 0xdf, - 0xa5, 0x94, 0x73, 0x95, 0xf2, 0x1e, 0xd8, 0x95, 0x5c, 0x19, 0xe0, 0xdf, - 0x2e, 0x79, 0x3f, 0x3f, - 0x55, 0x9e, 0x80, 0xbf, 0x96, 0x3f, 0x33, 0x7e, 0x29, 0x7f, 0xcf, 0x95, - 0xc8, 0xcb, 0xb8, 0xc5, - 0xf2, 0x2c, 0x6e, 0xaa, 0x32, 0x89, 0xff, 0x51, 0x39, 0x80, 0xca, 0xa4, - 0x9d, 0x7c, 0xa9, 0xb4, - 0x0b, 0xed, 0x06, 0xdc, 0x2b, 0x17, 0xcb, 0x50, 0xa9, 0xa5, 0x8c, 0xdf, - 0x25, 0xed, 0x40, 0xe5, - 0xd2, 0x36, 0xfc, 0x99, 0xe5, 0x63, 0xfc, 0x89, 0xe5, 0x73, 0xf4, 0x95, - 0xe5, 0x1b, 0x34, 0xcd, - 0xf2, 0x35, 0xfa, 0x44, 0x9a, 0xc0, 0x7f, 0x20, 0xcd, 0xe3, 0x77, 0x4b, - 0x7b, 0xf8, 0x1f, 0x25, - 0x01, 0x99, 0xc5, 0x02, 0x24, 0x58, 0x46, 0x20, 0xbb, 0x68, 0xe2, 0x78, - 0x89, 0xe3, 0x78, 0x85, - 0x70, 0x66, 0xd9, 0x86, 0x8b, 0xe4, 0x2f, 0xf0, 0x38, 0x79, 0x24, 0x1e, - 0x26, 0x7f, 0x82, 0x57, - 0xc9, 0x8b, 0xc9, 0x44, 0xd9, 0x8c, 0x47, 0xc9, 0xef, 0xe1, 0x41, 0x92, - 0x8c, 0x37, 0xcb, 0x67, - 0x50, 0x95, 0x6d, 0x3b, 0xbf, 0x59, 0xdd, 0xc4, 0xef, 0x92, 0xd7, 0xe0, - 0x31, 0xf2, 0x9b, 0xe4, - 0x11, 0x79, 0x00, 0x7a, 0xd2, 0xf2, 0x3a, 0xff, 0xaa, 0xf9, 0x35, 0x7e, - 0x90, 0xf4, 0x1a, 0xff, - 0xba, 0xfc, 0x26, 0x3f, 0x54, 0xe1, 0xb1, 0x6c, 0x95, 0x79, 0x62, 0xe5, - 0xf8, 0x37, 0xac, 0xcf, - 0xf0, 0x2f, 0xa9, 0x26, 0x22, 0xc9, 0x6f, 0xe2, 0x51, 0x16, 0x07, 0x21, - 0x96, 0x17, 0xc9, 0xd3, - 0x96, 0x27, 0xf1, 0x0b, 0xf2, 0xb7, 0xdc, 0x69, 0x4b, 0x39, 0x7c, 0x8f, - 0x35, 0xfc, 0x3a, 0x75, - 0x39, 0xb7, 0x58, 0x59, 0x68, 0x9c, 0x07, 0xdf, 0x6d, 0x06, 0x7c, 0xde, - 0xef, 0xc4, 0x7c, 0x7c, - 0x93, 0xb9, 0x0b, 0xbe, 0x51, 0xbc, 0x11, 0x75, 0x13, 0x7b, 0xe2, 0x1b, - 0x4c, 0xdd, 0x70, 0x1f, - 0x53, 0x57, 0xd2, 0x2a, 0xef, 0xb6, 0x61, 0xaf, 0xce, 0x7e, 0xfd, 0x91, - 0xd7, 0x6a, 0xeb, 0xaf, - 0xb8, 0x79, 0x15, 0x63, 0x56, 0x0f, 0xba, 0x8b, 0xfd, 0xfc, 0xd4, 0xe2, - 0xc7, 0xb5, 0x98, 0x73, - 0xa3, 0xe3, 0x62, 0x35, 0xd6, 0xb8, 0x78, 0xba, 0xcf, 0xf5, 0x6a, 0x2c, - 0xdc, 0x4c, 0x06, 0xd0, - 0x01, 0xa4, 0xbf, 0xa9, 0x3f, 0xee, 0x2f, 0xdc, 0x8d, 0xfb, 0x31, 0xec, - 0xa3, 0x77, 0xe0, 0xdb, - 0x69, 0x6f, 0x5c, 0xa7, 0xb7, 0xb9, 0xb0, 0x64, 0x08, 0xbb, 0xef, 0x56, - 0xaf, 0xde, 0xe4, 0x48, - 0x4b, 0x92, 0x56, 0xab, 0x18, 0x3a, 0xf9, 0xe2, 0xf3, 0xb5, 0x7b, 0xa0, - 0xbb, 0x15, 0x47, 0xbc, - 0x1b, 0x31, 0xb6, 0xe7, 0xdb, 0xb5, 0x79, 0x6e, 0x01, 0xf5, 0xb0, 0xf2, - 0x57, 0x0c, 0xd3, 0xf8, - 0x73, 0x5f, 0x44, 0xbc, 0xe0, 0x3b, 0xa7, 0x14, 0x8d, 0x52, 0x0a, 0x33, - 0x47, 0xb2, 0xb9, 0x70, - 0xcc, 0xfe, 0xb3, 0xc6, 0xfa, 0xd0, 0x73, 0x61, 0x7d, 0xc9, 0x12, 0xe3, - 0x79, 0x65, 0x04, 0xcd, - 0x27, 0x85, 0xa2, 0x69, 0x15, 0xb4, 0x37, 0x4d, 0xd2, 0x97, 0xc3, 0x8a, - 0x54, 0xe2, 0xf9, 0xd0, - 0xb8, 0x6f, 0xbe, 0xf3, 0x7a, 0x97, 0x74, 0xf0, 0xfd, 0xe8, 0x25, 0xd7, - 0xd6, 0xc1, 0xb7, 0xe8, - 0xcc, 0xeb, 0x39, 0x02, 0xe7, 0xf5, 0x42, 0xec, 0xd7, 0xe3, 0xbc, 0x67, - 0x50, 0xfa, 0x8f, 0xa5, - 0xe1, 0x3d, 0x0b, 0x92, 0x46, 0xfa, 0xd5, 0x73, 0x71, 0xd7, 0x4d, 0x74, - 0xe5, 0x34, 0x74, 0x69, - 0x52, 0xb7, 0xa0, 0xf9, 0xc2, 0x39, 0x13, 0x3b, 0xe7, 0x2e, 0x98, 0x7e, - 0xc6, 0x3f, 0x5b, 0xce, - 0x71, 0xbf, 0x9a, 0x7f, 0xe3, 0x7e, 0x16, 0x2f, 0x70, 0xbf, 0x99, 0x7f, - 0x25, 0xbf, 0x9b, 0x7e, - 0xc3, 0x17, 0xc4, 0x73, 0xe8, 0x67, 0xf3, 0x1f, 0xf8, 0x82, 0xf9, 0x02, - 0x81, 0x9f, 0xc9, 0x69, - 0xcb, 0x6f, 0xf8, 0xac, 0x74, 0x8e, 0xff, 0x59, 0x3a, 0x43, 0x4e, 0x49, - 0xe7, 0xe1, 0x31, 0xbf, - 0x93, 0xa3, 0xd6, 0xc3, 0xe8, 0xb8, 0x7a, 0x18, 0x1d, 0xb6, 0x1e, 0xe3, - 0x4f, 0x2a, 0x27, 0x8d, - 0x47, 0x95, 0x23, 0xc6, 0xe3, 0xea, 0x21, 0xee, 0xa0, 0xfd, 0x08, 0x77, - 0xd6, 0xf2, 0x2b, 0x7f, - 0xc1, 0xfc, 0x0b, 0xfa, 0xd9, 0xf2, 0x33, 0x3a, 0x6f, 0x39, 0x87, 0x4e, - 0xcb, 0xda, 0x73, 0xf9, - 0xb3, 0xf2, 0x19, 0xee, 0x94, 0x74, 0xda, 0x70, 0x52, 0x3d, 0xce, 0x9d, - 0x93, 0x4e, 0xa2, 0x83, - 0x72, 0x15, 0x7f, 0x58, 0x39, 0xc9, 0x9f, 0x96, 0x7e, 0xe6, 0xcf, 0x41, - 0xcc, 0x7b, 0x4e, 0xae, - 0x44, 0x65, 0x6a, 0x25, 0xb7, 0x47, 0xa9, 0x34, 0xee, 0x95, 0xf7, 0xc0, - 0xde, 0x6b, 0xdc, 0x03, - 0xb7, 0xe0, 0x03, 0xc2, 0x63, 0xce, 0xe1, 0xb3, 0xca, 0x09, 0xee, 0xa8, - 0x7c, 0xd8, 0x78, 0x18, - 0xde, 0xeb, 0xb0, 0x72, 0xc0, 0x78, 0x48, 0xfe, 0x99, 0x3f, 0xa2, 0xec, - 0xe0, 0x2b, 0x00, 0x33, - 0xcb, 0xc1, 0x07, 0xdc, 0x25, 0xed, 0xe6, 0x77, 0x03, 0xf6, 0x95, 0x4a, - 0xa5, 0x80, 0x99, 0xbb, - 0xb9, 0x52, 0xcb, 0x2e, 0x74, 0x12, 0x3e, 0xc3, 0x19, 0xf9, 0x0c, 0x7f, - 0x52, 0x3e, 0xc1, 0x1f, - 0x93, 0x4f, 0x72, 0x67, 0xa4, 0xb3, 0xdc, 0x2f, 0xe2, 0x61, 0x7e, 0xab, - 0x65, 0x27, 0xb7, 0xd7, - 0x72, 0x96, 0x3f, 0x6f, 0x39, 0x8b, 0xcf, 0x8b, 0xbf, 0xe0, 0x73, 0xe6, - 0xdf, 0xd1, 0x05, 0xf3, - 0xaf, 0xf8, 0x9c, 0x74, 0x0a, 0xfd, 0x24, 0x1d, 0x87, 0xc7, 0x1e, 0x86, - 0xd7, 0x3e, 0xcd, 0x9f, - 0x91, 0x0f, 0xf1, 0xbb, 0xe1, 0xb5, 0xf7, 0xc9, 0x47, 0xf9, 0x9f, 0x94, - 0x93, 0xf0, 0xbb, 0x9f, - 0x20, 0xb6, 0xde, 0x84, 0xb6, 0x5a, 0xb7, 0x73, 0xdb, 0xd5, 0x2d, 0x46, - 0xf0, 0xff, 0x50, 0x99, - 0x7c, 0x0c, 0x9d, 0x81, 0xcf, 0x77, 0xde, 0x72, 0x9e, 0x87, 0xef, 0x6c, - 0x84, 0xef, 0x6a, 0x80, - 0xef, 0x6a, 0x3c, 0xae, 0xb0, 0x3e, 0xc7, 0x63, 0xfc, 0x51, 0xf5, 0x08, - 0x7f, 0x40, 0x3d, 0xc1, - 0x9f, 0x82, 0xcf, 0xbe, 0x57, 0x39, 0x44, 0x8e, 0x5b, 0xf7, 0xe0, 0xfd, - 0xf2, 0x51, 0xee, 0xa8, - 0x72, 0x94, 0x3b, 0xa6, 0xec, 0x37, 0xae, 0x53, 0xd7, 0x03, 0xf6, 0xad, - 0xe3, 0xd7, 0x2a, 0xab, - 0x8c, 0xcb, 0xe4, 0x25, 0xc6, 0xf9, 0xf2, 0x6c, 0x7e, 0xba, 0x65, 0x1a, - 0xfa, 0x52, 0x1c, 0x8f, - 0x3f, 0x10, 0xdf, 0xe7, 0x0a, 0x44, 0x07, 0xaf, 0x98, 0x45, 0x34, 0xea, - 0xc3, 0x21, 0xaf, 0xbf, - 0xbd, 0x64, 0xd0, 0xbd, 0xbe, 0xfc, 0x2a, 0xe6, 0x53, 0x6d, 0xcc, 0x3b, - 0xff, 0x5e, 0x0d, 0x2e, - 0xc6, 0x96, 0x97, 0x6f, 0xf5, 0xc7, 0xd3, 0xed, 0x2b, 0xf6, 0xe3, 0xfb, - 0x08, 0x77, 0x01, 0xee, - 0xf5, 0xc3, 0x7d, 0xe9, 0x5d, 0x80, 0x7d, 0x77, 0xe2, 0xdb, 0x85, 0xde, - 0xf8, 0x56, 0xda, 0x13, - 0x3f, 0xcb, 0xe6, 0x51, 0x7a, 0xf7, 0x40, 0xbb, 0xeb, 0xc6, 0x0f, 0x4d, - 0x8c, 0x78, 0xc5, 0xe3, - 0x03, 0x30, 0xad, 0x94, 0x67, 0x98, 0xbf, 0xf6, 0xed, 0x89, 0x27, 0xab, - 0x1f, 0xe7, 0xd8, 0x38, - 0x82, 0x3d, 0xae, 0xff, 0x87, 0x11, 0xaf, 0x27, 0x7d, 0xf5, 0x7f, 0xcf, - 0x78, 0xf0, 0xb8, 0xe4, - 0xc3, 0xd2, 0xd7, 0x83, 0xf6, 0xbe, 0xb8, 0x79, 0x72, 0x1d, 0xf3, 0x23, - 0xde, 0xf3, 0xcb, 0x73, - 0x85, 0xb8, 0x29, 0x5e, 0x8c, 0xe0, 0xbd, 0xf3, 0x6b, 0xbe, 0xfa, 0x92, - 0x99, 0x0d, 0xc4, 0xfa, - 0xd7, 0x73, 0x09, 0x21, 0xaf, 0x17, 0x8a, 0x7e, 0x53, 0xf0, 0x1e, 0x14, - 0x56, 0xf7, 0x8d, 0x30, - 0x33, 0xee, 0x5b, 0x9c, 0x3e, 0xee, 0x5b, 0x30, 0xad, 0x7a, 0xb7, 0x3e, - 0x34, 0xf3, 0x97, 0xfc, - 0xe9, 0xb9, 0x68, 0x75, 0x13, 0xa5, 0x5a, 0xe7, 0x8b, 0x5e, 0x79, 0xae, - 0x33, 0xfc, 0x9a, 0x56, - 0x99, 0x36, 0x97, 0x76, 0xae, 0x5f, 0xbe, 0x09, 0xf3, 0xf7, 0xe1, 0x3d, - 0x93, 0x6d, 0x71, 0x01, - 0xe7, 0x9b, 0xe8, 0xe5, 0xb8, 0xc4, 0x49, 0x3d, 0x90, 0x2b, 0x12, 0xbe, - 0x48, 0xcf, 0x4b, 0x27, - 0xd0, 0x31, 0x15, 0xec, 0x5d, 0x3d, 0x85, 0xce, 0x4a, 0xa7, 0xe9, 0x59, - 0xe9, 0x0c, 0x05, 0x8c, - 0x22, 0xe7, 0xcc, 0xc7, 0x69, 0x95, 0x58, 0x45, 0x0f, 0x4a, 0x27, 0xe8, - 0x31, 0xf9, 0x38, 0x3e, - 0x21, 0x1f, 0x47, 0x80, 0x1f, 0xe4, 0x84, 0xf5, 0x38, 0xc3, 0x3d, 0xfe, - 0x28, 0xd8, 0xf5, 0x4f, - 0xea, 0x49, 0xfe, 0xa4, 0x7a, 0x92, 0x3b, 0x0e, 0x78, 0x06, 0x36, 0xce, - 0xc1, 0xeb, 0x70, 0x27, - 0xac, 0x87, 0x8c, 0x47, 0xad, 0x47, 0x8c, 0x47, 0xd4, 0x63, 0xdc, 0x21, - 0x2b, 0xe0, 0xa1, 0xf5, - 0x00, 0x77, 0x50, 0x3e, 0x68, 0x3c, 0xac, 0xee, 0xe7, 0x0e, 0x28, 0x87, - 0x8c, 0x07, 0xa5, 0x2a, - 0x6e, 0xaf, 0x02, 0xbe, 0x1d, 0xf8, 0x5f, 0xe0, 0xaf, 0x71, 0x7b, 0xa5, - 0x0a, 0x63, 0x85, 0x5c, - 0x65, 0xac, 0x92, 0xcb, 0xb9, 0x0a, 0xf0, 0xf9, 0xf6, 0x2a, 0x7b, 0xb9, - 0xbd, 0x72, 0x25, 0xfc, - 0x7f, 0x2f, 0xf8, 0x7f, 0x15, 0xc6, 0xfd, 0xf0, 0xf3, 0x6e, 0xc0, 0xb2, - 0x4a, 0x09, 0x7c, 0x3a, - 0xb9, 0x8c, 0x2b, 0x55, 0xb6, 0x72, 0x3b, 0xc1, 0x3f, 0x2c, 0x53, 0xb6, - 0x73, 0x5b, 0xe1, 0xff, - 0x15, 0xf2, 0x2e, 0xae, 0x5c, 0xda, 0xcb, 0x95, 0x49, 0x7b, 0xb8, 0x7d, - 0xb0, 0x2b, 0xe0, 0x35, - 0x2b, 0x2c, 0x80, 0x7d, 0x52, 0x05, 0xb7, 0x1b, 0x9e, 0x53, 0x06, 0xb7, - 0x15, 0xe0, 0x43, 0xee, - 0x84, 0x5d, 0x0a, 0x8f, 0xdd, 0xa1, 0xec, 0x42, 0xa5, 0xf2, 0x6e, 0xb4, - 0x5b, 0x2e, 0x85, 0xdf, - 0x55, 0xf2, 0x65, 0x32, 0xc4, 0xd8, 0xf0, 0xff, 0x32, 0xa9, 0x94, 0x94, - 0x4b, 0xe5, 0x78, 0x97, - 0xbc, 0x9d, 0x94, 0x4a, 0x65, 0x68, 0xa7, 0xb4, 0x83, 0xdf, 0x29, 0x6f, - 0xe7, 0x77, 0x00, 0xbe, - 0x6e, 0x85, 0xbd, 0x5d, 0xd9, 0xca, 0x6f, 0x55, 0xb7, 0xa2, 0xcd, 0xf2, - 0x36, 0x7e, 0x8b, 0xb4, - 0x8d, 0xdf, 0x26, 0x03, 0xfe, 0x59, 0x77, 0xf0, 0xbb, 0x6c, 0xbb, 0x50, - 0x99, 0xad, 0x14, 0xed, - 0x50, 0xcb, 0xb8, 0x72, 0x2b, 0xbc, 0x87, 0x6d, 0x3b, 0xb7, 0x4b, 0xd9, - 0x6d, 0x2c, 0x55, 0x4a, - 0x8d, 0x3b, 0x95, 0x1d, 0xf0, 0x19, 0x2a, 0xb8, 0x5d, 0x12, 0xfb, 0x8c, - 0xbb, 0xb8, 0x0a, 0xa9, - 0xcc, 0xb8, 0x4b, 0xa9, 0xe0, 0xcb, 0xd4, 0x5d, 0xec, 0xbb, 0x18, 0x77, - 0x40, 0x9c, 0xbf, 0x45, - 0xd9, 0xc6, 0x6d, 0x53, 0xd6, 0x71, 0x6b, 0xd4, 0x75, 0xdc, 0x6a, 0x75, - 0x25, 0xb7, 0x54, 0x9e, - 0xcf, 0xcd, 0xb7, 0xcc, 0xe4, 0xbf, 0xb3, 0x4c, 0xe5, 0x3f, 0x13, 0xc7, - 0xa3, 0x31, 0x62, 0x3e, - 0xaf, 0x16, 0x1a, 0x87, 0xbe, 0xb3, 0xd6, 0xc7, 0xfc, 0x20, 0x2f, 0xfd, - 0x95, 0xda, 0x78, 0xe2, - 0xcd, 0x3b, 0xab, 0xc1, 0xd3, 0x75, 0xc7, 0xb2, 0xf7, 0x3b, 0x7a, 0x0d, - 0xbf, 0x1d, 0xfc, 0xbd, - 0x3b, 0x01, 0xf7, 0xee, 0xa4, 0xb7, 0x83, 0xdf, 0x77, 0x1b, 0xee, 0x25, - 0xf4, 0xc4, 0xdd, 0x69, - 0x77, 0xf2, 0xb0, 0x96, 0x23, 0x2c, 0x19, 0x50, 0xb7, 0x07, 0x3a, 0xf2, - 0x99, 0x6a, 0xfc, 0x83, - 0x38, 0xab, 0xef, 0xca, 0x5a, 0x3d, 0xd0, 0xee, 0xfe, 0x95, 0xa7, 0x27, - 0x45, 0xbc, 0xa0, 0xe9, - 0xc0, 0xe8, 0xec, 0x85, 0x66, 0x7a, 0x58, 0x5a, 0x5e, 0x72, 0xeb, 0xcb, - 0x3d, 0x02, 0xd9, 0x1d, - 0xcb, 0x81, 0xd5, 0xcc, 0x6d, 0xd7, 0xd4, 0x73, 0xc9, 0xf6, 0xc6, 0x42, - 0xff, 0x7a, 0x2e, 0xfa, - 0xf3, 0x7a, 0xe6, 0xf0, 0xf6, 0xa6, 0x31, 0xcd, 0xe7, 0x08, 0x8b, 0x3e, - 0xee, 0x5b, 0x28, 0xfd, - 0x7a, 0xae, 0xcf, 0xe7, 0x7b, 0x7e, 0xb0, 0xa7, 0x6e, 0xc2, 0xf0, 0x2f, - 0xde, 0x7f, 0x7e, 0xad, - 0x7a, 0xd6, 0x9c, 0xde, 0x63, 0x12, 0x13, 0xae, 0x7e, 0x3d, 0xdf, 0x1c, - 0x17, 0x52, 0x43, 0x07, - 0xdf, 0x9b, 0x6f, 0xa2, 0xd5, 0x4d, 0x92, 0x7d, 0xd6, 0xc3, 0x75, 0x6b, - 0x52, 0x17, 0x66, 0x8f, - 0x88, 0xb3, 0x3c, 0x83, 0xb6, 0x68, 0x18, 0xf8, 0x07, 0x39, 0x6f, 0x39, - 0x43, 0xce, 0x8b, 0x67, - 0xc9, 0x59, 0xcb, 0x69, 0x72, 0x56, 0xfc, 0x85, 0x82, 0x2f, 0x46, 0x7e, - 0x65, 0x3f, 0x4b, 0xa7, - 0xc8, 0x11, 0xe9, 0x27, 0x72, 0x46, 0xfa, 0x09, 0x9d, 0x90, 0x4f, 0xa2, - 0xe3, 0xd2, 0x71, 0x7c, - 0x9c, 0xf9, 0x51, 0xca, 0x21, 0xf0, 0xdb, 0x4e, 0x68, 0x3e, 0xd5, 0x4f, - 0xd2, 0x49, 0x1e, 0xb0, - 0x91, 0xfd, 0xcc, 0x81, 0x1f, 0x08, 0xfe, 0x19, 0xe0, 0xa1, 0x72, 0x04, - 0xf0, 0xf0, 0x28, 0xc7, - 0xfc, 0xbc, 0x23, 0x2a, 0xe0, 0x1f, 0xf8, 0x85, 0xfb, 0xd5, 0xc3, 0xdc, - 0x01, 0xf8, 0xf9, 0x08, - 0xe0, 0xdb, 0x3e, 0x0d, 0xdb, 0x00, 0xab, 0x18, 0xae, 0xc9, 0x55, 0xf0, - 0x7f, 0x16, 0xeb, 0x56, - 0x70, 0x55, 0xe0, 0x73, 0x1d, 0x90, 0xf7, 0xc1, 0xde, 0xc3, 0xef, 0x91, - 0xf7, 0xc1, 0xef, 0xc1, - 0x17, 0x84, 0xc7, 0x32, 0xac, 0x02, 0x7f, 0x0e, 0xfc, 0x30, 0xd8, 0x10, - 0xeb, 0x96, 0x59, 0x2a, - 0xe0, 0x76, 0x37, 0x8b, 0x79, 0x01, 0xa3, 0xd8, 0x2e, 0xd7, 0xfc, 0xbe, - 0x3d, 0x10, 0x47, 0x96, - 0x8b, 0xe5, 0xe0, 0x0f, 0xc2, 0xe3, 0xa5, 0x4a, 0xb4, 0x5b, 0x2a, 0xe5, - 0x2b, 0xa4, 0x72, 0x88, - 0x8b, 0x77, 0xf3, 0x80, 0x6d, 0x3c, 0xbb, 0xdd, 0x2d, 0xef, 0x40, 0xbb, - 0xe4, 0x72, 0x54, 0x21, - 0x97, 0x82, 0xdf, 0x56, 0x01, 0x58, 0xb8, 0x0b, 0xb0, 0x6e, 0x27, 0xaa, - 0xb4, 0x1c, 0x20, 0x07, - 0xa5, 0xdd, 0x78, 0xb7, 0x5c, 0x4e, 0x76, 0x83, 0x1f, 0x5a, 0x01, 0xf7, - 0x31, 0xff, 0x71, 0xa7, - 0xb2, 0x13, 0xed, 0x54, 0x77, 0xa0, 0x6d, 0xea, 0x16, 0xb4, 0x4d, 0x01, - 0x3c, 0x94, 0x01, 0xf3, - 0xe0, 0x3d, 0x01, 0xdf, 0xf8, 0x52, 0xeb, 0x6e, 0x54, 0x61, 0xad, 0x44, - 0xe5, 0x70, 0xbb, 0xcb, - 0x5a, 0xca, 0xed, 0xb1, 0x56, 0xf1, 0x95, 0xd6, 0x4a, 0xbe, 0x5c, 0x85, - 0xcf, 0xa2, 0xc2, 0xfb, - 0xc1, 0x66, 0x38, 0x5f, 0x09, 0x9f, 0xb5, 0xc2, 0x52, 0xc9, 0x57, 0xc9, - 0x15, 0x7c, 0x85, 0xbc, - 0x17, 0x7c, 0x49, 0x86, 0xb9, 0x65, 0xf0, 0x59, 0x00, 0x37, 0xe5, 0x9d, - 0x80, 0xb1, 0xdb, 0xd1, - 0x56, 0x75, 0x23, 0xf8, 0x80, 0x3f, 0xf2, 0x2b, 0xe4, 0x05, 0x68, 0x8e, - 0x38, 0x13, 0x7d, 0x6b, - 0x99, 0x84, 0x3e, 0x16, 0xdf, 0x47, 0x05, 0xa2, 0x0d, 0x19, 0xe7, 0xd7, - 0xe4, 0xd0, 0x6a, 0xf3, - 0x83, 0x26, 0x96, 0xbe, 0x1a, 0x10, 0x5b, 0xc0, 0x67, 0xab, 0xee, 0x33, - 0xf1, 0xc1, 0xd3, 0x7d, - 0x78, 0x4c, 0x8f, 0x77, 0x7a, 0xd2, 0x5e, 0xb8, 0xb7, 0xb6, 0x7b, 0xe3, - 0x5e, 0xe0, 0xf7, 0xdd, - 0x42, 0x7b, 0xc0, 0xbe, 0x99, 0xf6, 0xfb, 0x81, 0xf5, 0xbb, 0x8c, 0xb9, - 0xab, 0x4e, 0x0f, 0xf4, - 0xac, 0x26, 0x8f, 0x44, 0x58, 0x52, 0xb9, 0xd6, 0x93, 0x7a, 0xbd, 0x30, - 0xd0, 0x83, 0xc7, 0x4b, - 0xa7, 0xf4, 0xf7, 0x7e, 0x9c, 0xf6, 0x9e, 0x33, 0x1b, 0x3d, 0xaa, 0xfd, - 0xce, 0xdb, 0x87, 0xf4, - 0xa5, 0x87, 0x35, 0x6e, 0xc5, 0xdb, 0x13, 0x17, 0x98, 0x2f, 0xcd, 0xc3, - 0x9c, 0xd7, 0xee, 0xc1, - 0x40, 0x76, 0x17, 0x90, 0xfb, 0xe6, 0xd6, 0xc1, 0x4f, 0xca, 0xcf, 0xc8, - 0xc9, 0x1e, 0x9b, 0x39, - 0xcc, 0xaf, 0x9e, 0x8b, 0xd6, 0x4f, 0x73, 0x25, 0xba, 0xec, 0x97, 0xab, - 0xd3, 0xe2, 0xaa, 0xfb, - 0x46, 0x4a, 0x7a, 0xe6, 0xbe, 0xe9, 0xcf, 0xf7, 0x67, 0xfa, 0xca, 0xf7, - 0xd7, 0xd2, 0xc1, 0xcf, - 0x0a, 0x36, 0x3f, 0x38, 0xa4, 0xbc, 0x5e, 0x08, 0x9a, 0x56, 0x61, 0xd1, - 0xae, 0x89, 0xd4, 0xe6, - 0xca, 0x67, 0x8d, 0xc9, 0x18, 0x1e, 0x68, 0x7e, 0x30, 0xc3, 0x75, 0xbd, - 0x73, 0xdb, 0x3d, 0xb1, - 0x74, 0x9a, 0xf0, 0x1e, 0xd9, 0xe7, 0xf6, 0x03, 0xff, 0xa4, 0xbf, 0xd3, - 0xff, 0xd2, 0x3f, 0xe8, - 0xef, 0xc2, 0x9f, 0xee, 0xff, 0xff, 0x81, 0xff, 0xa0, 0xff, 0xc5, 0x10, - 0xeb, 0xe2, 0x3f, 0x84, - 0xdf, 0xf1, 0x6f, 0xe6, 0x0b, 0xf8, 0x82, 0xe9, 0x02, 0xfe, 0x5d, 0xf8, - 0x0f, 0xf9, 0xcd, 0xfc, - 0x1b, 0x81, 0x98, 0x19, 0xff, 0x06, 0x71, 0x30, 0x8b, 0x85, 0x2f, 0x98, - 0x58, 0xdc, 0x7c, 0x81, - 0xdd, 0x8f, 0x7f, 0x11, 0xfe, 0x80, 0xe7, 0x9c, 0xc7, 0x3f, 0x8b, 0xe7, - 0xf9, 0x5f, 0xcd, 0x17, - 0xf8, 0x5f, 0xc4, 0x73, 0xfc, 0x39, 0xf1, 0x0c, 0xff, 0x33, 0xdc, 0x9e, - 0x12, 0x4f, 0xf1, 0x67, - 0xe1, 0xe7, 0xd3, 0xe2, 0x69, 0xf7, 0xcf, 0x27, 0xd1, 0x09, 0xf1, 0x34, - 0x3e, 0x2d, 0x9e, 0xc2, - 0x3f, 0x89, 0x67, 0xf1, 0x59, 0xf1, 0x34, 0x39, 0x05, 0xfb, 0x27, 0xf1, - 0x27, 0xed, 0xbe, 0x13, - 0xe2, 0x49, 0xd8, 0xa7, 0xf0, 0x49, 0xf1, 0x04, 0x61, 0xfb, 0x27, 0xf1, - 0x14, 0x39, 0x6a, 0x3e, - 0x4a, 0x8e, 0xc3, 0x3e, 0x62, 0x3e, 0x46, 0xe0, 0xf7, 0xe4, 0xb8, 0x78, - 0x94, 0x1c, 0xb5, 0xb0, - 0xfb, 0x8e, 0x91, 0xe3, 0xa6, 0xe3, 0xe4, 0xa4, 0x09, 0x1e, 0x6b, 0x3e, - 0x4e, 0x0e, 0xc3, 0x63, - 0x8e, 0x69, 0xfb, 0x04, 0x39, 0x2c, 0x1e, 0x26, 0xc7, 0x44, 0xf6, 0xf3, - 0x31, 0x7c, 0xdc, 0x74, - 0x04, 0x1f, 0x86, 0x5b, 0xf8, 0x1d, 0x3e, 0x2a, 0x1e, 0xa5, 0xc7, 0xc5, - 0xc3, 0x74, 0x8f, 0x58, - 0x4e, 0x0f, 0xc0, 0xeb, 0x1f, 0x03, 0x0c, 0xdc, 0x2f, 0x1d, 0x22, 0xfb, - 0x2d, 0xfb, 0xf0, 0x5e, - 0x4b, 0x05, 0xec, 0xfd, 0xb8, 0x12, 0x7c, 0xc2, 0x3d, 0x72, 0x19, 0x02, - 0xbc, 0xc2, 0xe0, 0x4b, - 0xa2, 0x4a, 0xa9, 0x14, 0xed, 0x03, 0x6c, 0xdd, 0x05, 0xb7, 0x95, 0x52, - 0x25, 0x2e, 0x97, 0x4a, - 0x31, 0xc4, 0xdb, 0xa8, 0x1c, 0x7c, 0xc6, 0x72, 0x69, 0x3f, 0xda, 0x2b, - 0xef, 0x03, 0x6c, 0xad, - 0xe4, 0xc1, 0x6f, 0x45, 0xfb, 0xe4, 0x03, 0x7c, 0x95, 0xa5, 0x02, 0xed, - 0x95, 0xf6, 0x20, 0x78, - 0x2d, 0x78, 0x7c, 0x39, 0x6c, 0xf6, 0xff, 0x4a, 0xb4, 0x07, 0x6e, 0xab, - 0x60, 0xef, 0x96, 0xc0, - 0x1f, 0x95, 0xb6, 0xa3, 0x6d, 0xd2, 0x06, 0xb4, 0x56, 0x5a, 0x83, 0x96, - 0x59, 0x16, 0xa2, 0x1f, - 0xc4, 0x59, 0xe8, 0x2b, 0x11, 0xf0, 0xcf, 0x3c, 0x1a, 0x17, 0x98, 0x6d, - 0xfc, 0x1b, 0xee, 0x3c, - 0x9f, 0x79, 0xde, 0x94, 0x07, 0x57, 0x14, 0x9f, 0x78, 0x57, 0x2f, 0x9f, - 0xa2, 0xea, 0xbb, 0xa1, - 0x9a, 0xb6, 0xb2, 0x2f, 0x9e, 0xee, 0x33, 0x13, 0xbb, 0xbf, 0x02, 0x78, - 0x47, 0x7a, 0x02, 0xee, - 0x01, 0x0e, 0xc2, 0xed, 0x2d, 0xa4, 0x07, 0xbd, 0x85, 0x76, 0x23, 0x37, - 0xd1, 0x1b, 0xb4, 0x1c, - 0xa1, 0xa1, 0x97, 0xf7, 0x6b, 0x69, 0xfe, 0xd9, 0xea, 0x7b, 0xef, 0x7a, - 0xb6, 0xf6, 0x3c, 0x37, - 0x6f, 0xae, 0x88, 0x3b, 0xfe, 0x7d, 0x62, 0xd5, 0x13, 0xfd, 0xea, 0xd4, - 0x46, 0xbc, 0x78, 0x72, - 0x1b, 0x3f, 0x9d, 0xf1, 0x92, 0xaf, 0xba, 0xf0, 0x1d, 0xe3, 0x23, 0xde, - 0x0c, 0x64, 0x77, 0xcc, - 0x76, 0x83, 0xe5, 0xcd, 0xa2, 0xec, 0x99, 0x5a, 0xde, 0xcc, 0xaf, 0x9e, - 0x8b, 0xa6, 0x83, 0x9f, - 0x90, 0xcb, 0xfa, 0xe1, 0x92, 0xa4, 0x48, 0x2e, 0x60, 0x1c, 0x1a, 0x26, - 0xfd, 0x65, 0x6f, 0xcd, - 0xd3, 0x48, 0x05, 0xf0, 0x2f, 0xd8, 0xdc, 0xb7, 0x50, 0xe7, 0x72, 0x06, - 0xf8, 0x7c, 0xac, 0x6e, - 0xc2, 0xb8, 0x79, 0xcc, 0xff, 0x4b, 0xf7, 0x39, 0x3f, 0xd8, 0xdd, 0x97, - 0x6c, 0x8e, 0xc2, 0x9a, - 0x7e, 0xbf, 0xe5, 0x0a, 0xb5, 0xea, 0x6b, 0x68, 0x5a, 0x85, 0x49, 0xbb, - 0x46, 0x4a, 0xe2, 0xb5, - 0xfc, 0x42, 0x50, 0xbe, 0x49, 0xe6, 0xc8, 0x0c, 0x67, 0xdc, 0xa8, 0xa8, - 0x80, 0x7c, 0x93, 0x9a, - 0xb5, 0xf0, 0x86, 0x66, 0x9b, 0x70, 0x92, 0x5c, 0x14, 0xfe, 0xe3, 0x39, - 0x3f, 0xc9, 0x9f, 0xf4, - 0x4f, 0xfc, 0x5f, 0xfa, 0x27, 0x01, 0x0c, 0x64, 0x3f, 0x93, 0x3f, 0xab, - 0xcf, 0x5d, 0xef, 0x9f, - 0x5d, 0x18, 0x19, 0x1a, 0xbf, 0x89, 0xbd, 0xa6, 0xde, 0xfb, 0xb5, 0xf7, - 0xaa, 0xf5, 0x7e, 0x75, - 0xfe, 0xef, 0xe7, 0xb5, 0x3c, 0xcf, 0xfd, 0x2f, 0xfe, 0xb3, 0xc6, 0xff, - 0xff, 0x24, 0x7f, 0xc0, - 0xba, 0x48, 0x2e, 0x8b, 0x9b, 0x55, 0xe3, 0x93, 0x69, 0x1b, 0xbb, 0xaf, - 0x13, 0x9e, 0xff, 0x57, - 0xdf, 0x7f, 0xe9, 0xf7, 0x35, 0xdf, 0xfd, 0xbf, 0xd5, 0xbf, 0xfb, 0x03, - 0x8e, 0xf0, 0x7f, 0xc8, - 0xef, 0xf4, 0x37, 0xfa, 0x0b, 0x3d, 0x4b, 0x4e, 0xd1, 0xe3, 0xe4, 0x08, - 0xdd, 0x4f, 0xf6, 0xd0, - 0xdd, 0x64, 0x1b, 0xdd, 0x48, 0xd6, 0xd0, 0x65, 0x74, 0x3e, 0xfd, 0x9e, - 0x7c, 0x4d, 0x3f, 0x27, - 0x13, 0x14, 0x9b, 0xa1, 0x4e, 0x3d, 0x56, 0xef, 0x82, 0x78, 0x54, 0xe3, - 0xa4, 0x79, 0xc7, 0xb2, - 0x6e, 0x9e, 0xee, 0xab, 0x93, 0x6f, 0x7e, 0xae, 0x3b, 0xe0, 0x5d, 0x0f, - 0xda, 0x53, 0x5b, 0x3d, - 0x60, 0x75, 0x27, 0xdd, 0xe8, 0xb5, 0xa4, 0x3e, 0x8d, 0xfe, 0xe2, 0xd9, - 0xff, 0xab, 0xdd, 0x03, - 0x5d, 0x5b, 0xc7, 0xc5, 0x17, 0x1e, 0x7b, 0xfa, 0xf7, 0xae, 0x67, 0x7d, - 0x2c, 0x5b, 0x86, 0xf6, - 0xac, 0x51, 0xeb, 0x00, 0xdc, 0x2d, 0xf9, 0x6e, 0xcc, 0x93, 0x06, 0x1f, - 0xf3, 0x30, 0x5f, 0xfe, - 0x71, 0x60, 0x9f, 0x1e, 0x1f, 0xd7, 0x7f, 0x35, 0x58, 0x6f, 0x5a, 0x66, - 0x61, 0x4a, 0xd0, 0xde, - 0x0c, 0x97, 0x56, 0x7d, 0xd4, 0xa8, 0x80, 0x7a, 0x2e, 0x1e, 0x8d, 0xe0, - 0x02, 0xff, 0x7a, 0x2e, - 0xa1, 0xe4, 0xb0, 0x12, 0xf2, 0xf4, 0xe8, 0x2f, 0x03, 0xfe, 0xb1, 0xba, - 0xaf, 0x9e, 0xb9, 0x6f, - 0xa1, 0xcf, 0xa0, 0x0c, 0xaa, 0xf3, 0xc5, 0xf2, 0x7a, 0xd5, 0xf9, 0x35, - 0x3f, 0x7c, 0x93, 0x74, - 0xa6, 0x73, 0xc8, 0xf8, 0x26, 0x42, 0x00, 0xbe, 0x89, 0xde, 0x63, 0xa2, - 0x47, 0x93, 0xfa, 0x52, - 0x8f, 0x4c, 0xc8, 0xb3, 0xe6, 0xfc, 0xf1, 0x4d, 0xb2, 0x83, 0xf1, 0x4d, - 0xea, 0xf4, 0x07, 0x44, - 0xd3, 0x7f, 0xf1, 0x3f, 0x9a, 0x8f, 0xa0, 0x7d, 0xe6, 0x03, 0xf8, 0xb0, - 0x00, 0x9e, 0x91, 0x50, - 0x81, 0xb7, 0x0b, 0xfb, 0xd1, 0x7e, 0xd3, 0x3e, 0x7e, 0x9f, 0xb9, 0x02, - 0x55, 0x98, 0xc1, 0x5b, - 0x31, 0x57, 0xe2, 0x4a, 0xf3, 0x3e, 0xbc, 0xc7, 0xbc, 0x07, 0xef, 0x33, - 0xed, 0x23, 0x15, 0xa6, - 0x72, 0x52, 0x09, 0xb7, 0x55, 0xa6, 0x2a, 0xba, 0xd7, 0xb4, 0x8f, 0xee, - 0x15, 0xf6, 0x91, 0x43, - 0xc2, 0x7e, 0x52, 0x25, 0x54, 0x91, 0x43, 0xb4, 0x0a, 0x2c, 0xb9, 0x0a, - 0x1d, 0x30, 0x1f, 0x40, - 0x87, 0x4c, 0x47, 0xd0, 0x21, 0xf3, 0x7e, 0x78, 0xed, 0xbd, 0xf0, 0xff, - 0xfd, 0xe8, 0x80, 0xa9, - 0x0a, 0x5e, 0x63, 0x9f, 0xb6, 0xd9, 0xfb, 0xed, 0x17, 0x2a, 0xf1, 0x7e, - 0xba, 0x1f, 0x1f, 0x10, - 0xf6, 0xb9, 0x6e, 0x29, 0xbb, 0xad, 0xc2, 0x7b, 0xe9, 0x01, 0x7c, 0x50, - 0x38, 0x88, 0x8f, 0xd0, - 0x43, 0x70, 0xdf, 0x01, 0x6d, 0x1f, 0x84, 0xdf, 0xef, 0xa7, 0x87, 0xf1, - 0x21, 0x7a, 0x10, 0x6e, - 0x0f, 0xb8, 0xef, 0xaf, 0x82, 0xff, 0x57, 0xe1, 0x7d, 0xf4, 0x20, 0xda, - 0x4f, 0xe0, 0x33, 0x53, - 0x78, 0x1f, 0x7a, 0x08, 0x1d, 0x64, 0xff, 0xa7, 0xe0, 0x8d, 0x91, 0x83, - 0x08, 0x3e, 0x1d, 0x3a, - 0x08, 0xbf, 0x73, 0xbd, 0xf6, 0x21, 0x7a, 0x80, 0x1c, 0xa0, 0x87, 0xc9, - 0x01, 0x72, 0x98, 0x1c, - 0xd1, 0xbe, 0xef, 0x21, 0xe1, 0x1c, 0xfe, 0x8d, 0x9e, 0x47, 0xff, 0x61, - 0xf8, 0x08, 0xfb, 0x77, - 0x7a, 0x01, 0xff, 0x4a, 0x7e, 0xc1, 0xbf, 0x91, 0x0b, 0xda, 0xfe, 0x9d, - 0xfc, 0x06, 0xeb, 0x02, - 0x5b, 0x70, 0xff, 0xaf, 0xf0, 0xd8, 0xdf, 0xf1, 0x79, 0xf8, 0xfd, 0x05, - 0x02, 0xde, 0x31, 0xdc, - 0xf7, 0x1f, 0xf2, 0x1f, 0xf8, 0xf9, 0x37, 0x76, 0x3f, 0xf9, 0x15, 0x6e, - 0xd9, 0x6b, 0xb0, 0x75, - 0x09, 0x2d, 0x01, 0xed, 0x88, 0x0b, 0x1d, 0x2f, 0xb2, 0x6b, 0x0b, 0xf9, - 0x13, 0xff, 0x01, 0xcf, - 0xbd, 0x40, 0xce, 0xe1, 0xb3, 0xf4, 0x2c, 0x3e, 0x43, 0x7e, 0xc2, 0xe0, - 0xaf, 0xe2, 0x2a, 0x5a, - 0x89, 0x77, 0xd1, 0xad, 0x64, 0x3d, 0x5d, 0x4e, 0x16, 0xd1, 0x79, 0x64, - 0x3a, 0x9d, 0x42, 0x3e, - 0xa1, 0xe3, 0x88, 0x93, 0xd6, 0x89, 0x61, 0x7d, 0xf8, 0x54, 0xa5, 0x13, - 0x67, 0xbc, 0x6a, 0x5f, - 0x3d, 0xb4, 0x6f, 0xed, 0xb9, 0x1b, 0x2e, 0x5d, 0x7a, 0x1f, 0x3c, 0xdd, - 0x19, 0xbd, 0x1f, 0xef, - 0x06, 0xb1, 0x2e, 0xc3, 0x40, 0xcf, 0xea, 0x4a, 0xda, 0x32, 0x2d, 0x0b, - 0x14, 0xf9, 0x51, 0xff, - 0xd7, 0x7c, 0xd6, 0x8d, 0xdd, 0xfa, 0x06, 0x63, 0xbe, 0x2b, 0x79, 0xd2, - 0xd7, 0x3c, 0x37, 0x8d, - 0xff, 0xb6, 0xf1, 0xa9, 0xde, 0xda, 0x3c, 0x24, 0x37, 0xe6, 0x9e, 0x28, - 0x5e, 0xf1, 0xee, 0x94, - 0x39, 0xf6, 0x81, 0xbe, 0x6a, 0x36, 0x8f, 0x2d, 0xe8, 0x33, 0xa0, 0xe3, - 0xfb, 0xf5, 0xde, 0x62, - 0xf9, 0xbb, 0x60, 0xfa, 0x25, 0x1a, 0xf7, 0xad, 0x40, 0x0f, 0xf7, 0x2d, - 0xcb, 0x9f, 0x56, 0xbd, - 0x97, 0x0e, 0x7e, 0x5a, 0x8e, 0x6f, 0x3d, 0x97, 0x9a, 0x3a, 0xf8, 0x91, - 0x5a, 0x8f, 0x4c, 0xa2, - 0x5e, 0xfd, 0x26, 0x63, 0x50, 0xcd, 0x53, 0x86, 0x7f, 0x6e, 0xee, 0x9b, - 0x1e, 0x5c, 0x08, 0xd3, - 0x0c, 0x4a, 0x5f, 0xfa, 0xfd, 0x01, 0xf8, 0x26, 0xe9, 0x01, 0xf9, 0x26, - 0x7a, 0xf3, 0x7a, 0xe1, - 0xd4, 0xae, 0x89, 0x0a, 0xc2, 0x71, 0xf1, 0xf0, 0x4d, 0xd2, 0xfc, 0xf1, - 0x4d, 0xac, 0x5e, 0xf5, - 0x70, 0x31, 0x9e, 0xaf, 0xed, 0x33, 0x47, 0xd2, 0xfa, 0xf4, 0x51, 0x7c, - 0xaf, 0xa9, 0x27, 0xb9, - 0xcd, 0xd4, 0x8b, 0xf6, 0x36, 0xf5, 0x22, 0x3d, 0x4c, 0x7d, 0x68, 0x7f, - 0xd3, 0x5d, 0xb4, 0xa7, - 0xf9, 0x51, 0xda, 0xcf, 0x7c, 0x8b, 0xd0, 0x1b, 0x56, 0x4f, 0x7a, 0xbb, - 0x70, 0x1b, 0xed, 0x45, - 0x6f, 0x13, 0x7a, 0xd1, 0x3b, 0x84, 0x87, 0xd8, 0xe3, 0x84, 0xdb, 0x4d, - 0xb7, 0x9b, 0x6e, 0x33, - 0xdd, 0xc1, 0xb6, 0xd0, 0x17, 0x1e, 0xd1, 0x9f, 0x3e, 0x2e, 0xdc, 0x4e, - 0x6f, 0xa3, 0x6c, 0xdf, - 0x49, 0xfb, 0xd0, 0xbe, 0xb0, 0xfb, 0xd0, 0xde, 0x74, 0x20, 0x7b, 0x3c, - 0xbd, 0x8b, 0xde, 0x25, - 0xdc, 0x25, 0xf4, 0x71, 0x2f, 0xf6, 0xd3, 0xc3, 0xf4, 0x21, 0x78, 0xa7, - 0xbe, 0xda, 0xff, 0xfa, - 0x92, 0x3e, 0x42, 0x5f, 0xdc, 0x57, 0xb8, 0x8b, 0xdc, 0x21, 0x3c, 0x41, - 0x1e, 0x84, 0xd7, 0xbb, - 0x5b, 0xb8, 0x87, 0xf6, 0x31, 0xf5, 0xa5, 0xf7, 0x0a, 0x77, 0xe3, 0x7b, - 0x84, 0xbb, 0xc9, 0xfd, - 0xc2, 0x53, 0xb8, 0x9f, 0xb9, 0x1f, 0xb9, 0xcb, 0x7c, 0x17, 0xe9, 0x6f, - 0xee, 0x4b, 0xee, 0x81, - 0xe7, 0xdc, 0x25, 0xdc, 0x0e, 0x8f, 0x7d, 0x88, 0xdc, 0x29, 0xf4, 0x23, - 0x7d, 0x85, 0x7b, 0xf0, - 0xdd, 0xa6, 0xbb, 0x49, 0x7f, 0xe1, 0x3e, 0xd2, 0x9f, 0xde, 0x8b, 0x9f, - 0xa3, 0x0f, 0xe3, 0xbb, - 0xe9, 0xdd, 0xe4, 0x1e, 0x3a, 0x00, 0x6e, 0x07, 0x90, 0xfb, 0xe9, 0x03, - 0xe4, 0x01, 0xd3, 0x43, - 0xf4, 0x49, 0xd3, 0x00, 0xfa, 0x2f, 0xd3, 0x40, 0xed, 0x53, 0x3d, 0x22, - 0x3c, 0x40, 0x5e, 0x14, - 0x06, 0x53, 0x44, 0x0d, 0x74, 0x38, 0x1d, 0x4a, 0xdf, 0x36, 0xbd, 0x49, - 0xdf, 0xa2, 0xaf, 0xc3, - 0x1e, 0x42, 0xdf, 0x15, 0x86, 0x51, 0x4e, 0x18, 0x42, 0x06, 0x0b, 0x83, - 0xc9, 0x50, 0x3a, 0x94, - 0x0c, 0x21, 0x43, 0xe0, 0xdf, 0xa1, 0xf0, 0xbf, 0x91, 0x82, 0x91, 0x0e, - 0xa6, 0x43, 0x4d, 0x70, - 0x3f, 0x3c, 0x66, 0x98, 0x6b, 0xc3, 0xa2, 0x54, 0x10, 0x72, 0x05, 0x03, - 0x35, 0x0a, 0x08, 0x5e, - 0x31, 0x97, 0xf2, 0x14, 0xc3, 0xcf, 0x58, 0x10, 0xe1, 0xff, 0x58, 0x30, - 0x11, 0x42, 0x11, 0x21, - 0x02, 0x85, 0x4d, 0x08, 0x2f, 0x60, 0xa2, 0x50, 0x0c, 0xf7, 0x99, 0x29, - 0x12, 0x90, 0x80, 0x69, - 0xae, 0x30, 0x42, 0x18, 0x2e, 0x0c, 0xa1, 0x6c, 0x0d, 0xa2, 0xaf, 0xd0, - 0x17, 0xe9, 0xd3, 0xf4, - 0x71, 0x3a, 0x90, 0xbe, 0x5c, 0x5b, 0x6b, 0xca, 0x8b, 0x47, 0x5b, 0xf2, - 0xcd, 0xc4, 0xa7, 0xcc, - 0xde, 0xfd, 0x7f, 0x10, 0x8f, 0x56, 0xe7, 0x05, 0x3d, 0x9a, 0x54, 0xbe, - 0x78, 0xba, 0xf3, 0x7b, - 0x3d, 0xd0, 0x8a, 0xb4, 0xa2, 0xda, 0xd6, 0x56, 0x5b, 0x9a, 0x65, 0x6f, - 0x36, 0xb2, 0xfb, 0xcc, - 0xfb, 0x1e, 0xf5, 0xc4, 0xb8, 0x35, 0xea, 0xc6, 0x13, 0xed, 0xaf, 0xb2, - 0x99, 0xe5, 0x7e, 0xfb, - 0x57, 0x3c, 0xef, 0x35, 0xa7, 0xc5, 0xc3, 0x5a, 0x8e, 0x72, 0xc1, 0x8c, - 0x7f, 0x8d, 0x59, 0x31, - 0xf4, 0xee, 0xba, 0xfd, 0x7f, 0x2f, 0xf6, 0xbc, 0xef, 0xfb, 0x6e, 0x8f, - 0x35, 0xb5, 0x45, 0xba, - 0x35, 0x2a, 0xa3, 0x71, 0xa2, 0x2d, 0x29, 0x37, 0x68, 0x5c, 0x0b, 0x76, - 0xe7, 0x77, 0xee, 0x5b, - 0xc8, 0xba, 0xec, 0x09, 0x5a, 0x0e, 0x2b, 0xd1, 0x9e, 0x94, 0xeb, 0x77, - 0x7e, 0x30, 0xab, 0x9b, - 0xd8, 0xaf, 0x54, 0x97, 0xdd, 0xdb, 0xd6, 0x5d, 0x75, 0x5f, 0x37, 0xf7, - 0x0d, 0x85, 0x05, 0x17, - 0xc2, 0x32, 0x83, 0xd2, 0xa3, 0x83, 0x9f, 0x92, 0xeb, 0x3d, 0x5b, 0xcd, - 0x1f, 0xdf, 0x44, 0xcb, - 0x75, 0xea, 0xec, 0x1b, 0x4a, 0xd6, 0xa1, 0x69, 0x95, 0x15, 0x2e, 0xed, - 0x1a, 0x78, 0x0d, 0x86, - 0x7f, 0x49, 0x6a, 0x6c, 0x00, 0xbe, 0x49, 0x72, 0x4e, 0xa2, 0x2d, 0xd1, - 0xc0, 0x34, 0xbf, 0xa3, - 0x82, 0xf0, 0x4d, 0x34, 0xed, 0x1a, 0xbd, 0x9a, 0xd4, 0xe1, 0xd4, 0xa8, - 0xb0, 0x55, 0xd7, 0xbc, - 0x48, 0x94, 0xce, 0xf9, 0x26, 0x51, 0x3e, 0xfa, 0x1c, 0x74, 0xf7, 0xf7, - 0xb3, 0x39, 0xd9, 0xd6, - 0xf0, 0x68, 0x4c, 0x6a, 0xd7, 0xc6, 0x42, 0xdf, 0xd7, 0x46, 0xf0, 0xd7, - 0xab, 0xe3, 0x30, 0x6d, - 0x36, 0xe3, 0xd8, 0x1a, 0x3c, 0x20, 0xed, 0xbb, 0x78, 0xf9, 0x1e, 0x84, - 0xe5, 0x29, 0x92, 0x9d, - 0xc9, 0xa3, 0x58, 0x9e, 0xb9, 0x8e, 0xd6, 0x14, 0xd3, 0x24, 0x98, 0x65, - 0x7f, 0xd4, 0x5f, 0x7f, - 0x71, 0x35, 0xfe, 0xb9, 0x6b, 0xbd, 0x3e, 0x7b, 0xa0, 0x57, 0xf4, 0xe9, - 0x57, 0xad, 0x65, 0x30, - 0xae, 0xfd, 0xdb, 0xbd, 0xe7, 0x3f, 0xf6, 0x40, 0x9d, 0x9e, 0x1a, 0xef, - 0xba, 0x71, 0xb0, 0x1a, - 0xee, 0x64, 0x83, 0xd6, 0x57, 0xd3, 0xeb, 0x83, 0x98, 0x37, 0x9f, 0xf0, - 0x9e, 0x21, 0xe2, 0xd9, - 0x6b, 0x1f, 0xba, 0xe3, 0xd6, 0x49, 0xad, 0x5f, 0x48, 0xb5, 0xd4, 0xb2, - 0x43, 0x38, 0xb6, 0x49, - 0xb6, 0xc4, 0xdc, 0xa0, 0xfd, 0x7a, 0x60, 0x77, 0x59, 0xce, 0xb0, 0x69, - 0x5a, 0x79, 0x72, 0x58, - 0x01, 0xe6, 0x07, 0x67, 0x0d, 0xd3, 0x6a, 0x07, 0x70, 0x0e, 0x05, 0xe4, - 0x9b, 0xe8, 0xcd, 0x61, - 0xb1, 0xba, 0xaf, 0x23, 0x86, 0x0b, 0xcc, 0x7d, 0xbb, 0x94, 0xd7, 0xcb, - 0x0e, 0xe3, 0x5c, 0x4e, - 0xfd, 0x3a, 0x5f, 0x69, 0xc3, 0x63, 0x64, 0x5f, 0xf3, 0x83, 0x2f, 0xf5, - 0x25, 0xb3, 0x7e, 0x3d, - 0xb7, 0xce, 0x17, 0xb9, 0xd2, 0xbc, 0x5e, 0x48, 0xb3, 0xe6, 0x42, 0xd5, - 0xae, 0x11, 0xfc, 0xf1, - 0x4d, 0x32, 0xc1, 0xee, 0x32, 0x82, 0xf1, 0x4d, 0xc2, 0x8a, 0x0b, 0x91, - 0xaa, 0x7f, 0x5c, 0xd0, - 0xa7, 0x51, 0x11, 0x78, 0xbe, 0x49, 0x5a, 0x5e, 0x75, 0x3d, 0xdc, 0x8b, - 0x2b, 0xaf, 0xa7, 0x97, - 0xdd, 0x75, 0x6d, 0xd4, 0xa7, 0x3d, 0x9b, 0x19, 0x1e, 0x8d, 0x0a, 0xf7, - 0xb5, 0x31, 0x15, 0xce, - 0x25, 0x86, 0xeb, 0x19, 0xc5, 0x59, 0xda, 0xdf, 0x84, 0x7d, 0x8f, 0xf4, - 0x42, 0x4f, 0x6d, 0x0e, - 0xfe, 0x2e, 0x96, 0x18, 0x1e, 0xce, 0x37, 0x8d, 0xd7, 0x14, 0x48, 0x6b, - 0xaa, 0xce, 0xf6, 0xaa, - 0xc7, 0x56, 0xc7, 0xac, 0x7e, 0x78, 0xba, 0x4d, 0x27, 0x76, 0x7f, 0xe5, - 0x81, 0xd5, 0x2f, 0xdf, - 0x55, 0xe7, 0x35, 0x58, 0x8c, 0xbb, 0xcc, 0xd0, 0xbf, 0x36, 0xe6, 0xfa, - 0x5b, 0x27, 0x0a, 0x37, - 0x0e, 0xd1, 0x7a, 0xae, 0xb7, 0xbc, 0xd0, 0x33, 0xc3, 0x16, 0x37, 0xaa, - 0xf9, 0xf4, 0x27, 0xab, - 0xdf, 0xf7, 0x99, 0x25, 0xfd, 0xee, 0xbd, 0xfe, 0xe3, 0xa6, 0xaf, 0x45, - 0xf9, 0xd0, 0x73, 0xf1, - 0x1c, 0x5b, 0x96, 0xab, 0x09, 0x9a, 0xc3, 0x02, 0x5b, 0xd7, 0x6b, 0x03, - 0x97, 0xdb, 0x9b, 0x16, - 0x59, 0x4b, 0x07, 0x3f, 0xcb, 0x87, 0x9e, 0x4b, 0x1d, 0xbe, 0x89, 0xde, - 0x1c, 0x96, 0x04, 0xf1, - 0xa6, 0x3d, 0x9a, 0xe1, 0x5f, 0xf0, 0xb9, 0x97, 0x3a, 0xf3, 0x7a, 0xe1, - 0x9c, 0xcb, 0x59, 0x5b, - 0xab, 0xde, 0x67, 0x7e, 0x4d, 0xe3, 0x9b, 0x64, 0xb9, 0xf9, 0x26, 0x09, - 0xfe, 0xf9, 0x26, 0x7a, - 0xfd, 0x85, 0xcb, 0xd0, 0xa4, 0xbe, 0x2c, 0xed, 0x9a, 0x10, 0xf8, 0x26, - 0x9e, 0xef, 0x12, 0x0a, - 0xef, 0x27, 0x5c, 0xda, 0xb3, 0xee, 0x9a, 0x17, 0x17, 0xdc, 0x67, 0xce, - 0x18, 0xce, 0xae, 0xd7, - 0xb5, 0x79, 0x84, 0x9a, 0xbf, 0xee, 0x4c, 0xd2, 0x70, 0x3d, 0x26, 0xec, - 0xda, 0xb3, 0xc1, 0x7b, - 0xd9, 0xf5, 0x6a, 0x54, 0xa4, 0x55, 0x5f, 0x1b, 0xdd, 0xb8, 0xae, 0x26, - 0x1a, 0x58, 0x4e, 0x3a, - 0x7d, 0x74, 0xc6, 0x08, 0xc6, 0x75, 0x4d, 0x2b, 0x48, 0x1d, 0xc9, 0x70, - 0x90, 0xe1, 0x1f, 0xf3, - 0x6f, 0xeb, 0x7d, 0x1f, 0x40, 0x6b, 0xaa, 0x56, 0x2d, 0x76, 0xca, 0x84, - 0x13, 0xaf, 0xd7, 0xa8, - 0xd9, 0xae, 0xe8, 0xdb, 0xcf, 0x1f, 0x4f, 0xd7, 0xd7, 0xf3, 0x3d, 0x31, - 0xae, 0x86, 0x91, 0xcc, - 0x07, 0x9c, 0x74, 0xc2, 0xaf, 0x96, 0x1f, 0xd3, 0x35, 0xd0, 0x70, 0xd2, - 0xf3, 0xfc, 0x1f, 0x5a, - 0x0d, 0x64, 0xdc, 0xdd, 0x18, 0x29, 0x96, 0x6f, 0x35, 0xa9, 0xc7, 0x8b, - 0xd7, 0x8c, 0x4b, 0x7b, - 0x37, 0x41, 0x8d, 0x37, 0xc6, 0xc3, 0x8e, 0x63, 0xfa, 0x05, 0xa2, 0xab, - 0xce, 0x50, 0x23, 0xf7, - 0x62, 0x49, 0xe0, 0x53, 0x6c, 0x71, 0x86, 0x60, 0x36, 0xc0, 0x6a, 0x0c, - 0xa9, 0x7a, 0xe6, 0x2d, - 0x8e, 0xd5, 0xd3, 0x9b, 0x16, 0x3c, 0xaf, 0xc7, 0x72, 0x4a, 0x2c, 0x96, - 0x66, 0xb9, 0x74, 0xbf, - 0xf3, 0x83, 0x59, 0xdd, 0x04, 0x62, 0x47, 0x8d, 0xfb, 0x16, 0xc4, 0x57, - 0x8b, 0x94, 0x5d, 0x75, - 0x5f, 0x4d, 0xff, 0xd9, 0x0a, 0xb6, 0xc6, 0x74, 0xf0, 0xcd, 0x70, 0x2c, - 0x7c, 0xc4, 0x61, 0xa1, - 0xe5, 0xf5, 0x22, 0xc2, 0x32, 0x97, 0x33, 0xd0, 0x31, 0xf1, 0xae, 0x9b, - 0x5c, 0x9a, 0x2b, 0x1f, - 0x80, 0x6f, 0xf2, 0x17, 0x68, 0x52, 0xeb, 0xd2, 0xae, 0x19, 0x13, 0x9c, - 0xe3, 0xa2, 0xe9, 0x43, - 0x83, 0x4f, 0x1f, 0x80, 0x6f, 0x62, 0x88, 0xb3, 0xc4, 0x70, 0xe1, 0xd4, - 0xa4, 0x8e, 0xb9, 0x02, - 0xed, 0x9a, 0x00, 0x1a, 0x15, 0x2e, 0x5c, 0x97, 0x35, 0x5c, 0x1f, 0x55, - 0xbb, 0x1e, 0xce, 0xfc, - 0xf7, 0xcc, 0x82, 0xa4, 0x91, 0x75, 0xae, 0xd7, 0x3e, 0xfa, 0xe7, 0xe3, - 0x75, 0x69, 0xcf, 0xea, - 0x9c, 0xc3, 0x7a, 0xb9, 0x1a, 0x15, 0x82, 0xab, 0x97, 0x57, 0xc3, 0x42, - 0x4d, 0xfb, 0x24, 0x25, - 0x27, 0x05, 0x7c, 0xf4, 0x24, 0xf0, 0x39, 0x12, 0xa6, 0xbd, 0xfc, 0x74, - 0x20, 0xad, 0x29, 0x9f, - 0x1c, 0x0b, 0xd3, 0x79, 0xa4, 0xf5, 0xe2, 0xcd, 0x6a, 0xfa, 0x48, 0xa0, - 0x59, 0x45, 0x1e, 0x1d, - 0x82, 0x92, 0xf1, 0x55, 0x6f, 0xf8, 0xf4, 0x2f, 0x21, 0x9e, 0xae, 0x81, - 0x9d, 0x96, 0x13, 0xdc, - 0x8a, 0x2f, 0xa7, 0x3c, 0xef, 0xab, 0x7f, 0xa5, 0xeb, 0xe8, 0x88, 0xc1, - 0xd5, 0xfd, 0xd1, 0x80, - 0x83, 0x09, 0x6a, 0x82, 0x31, 0x4e, 0x89, 0x37, 0x26, 0x5a, 0x13, 0x0d, - 0x2c, 0xef, 0x02, 0x3b, - 0x97, 0xfd, 0xcc, 0x66, 0x08, 0xb3, 0x58, 0x9f, 0x61, 0x61, 0x94, 0x9c, - 0xc4, 0xa5, 0x58, 0x63, - 0x0c, 0xc1, 0x7b, 0x56, 0xb3, 0x46, 0x06, 0xed, 0x07, 0x61, 0xbd, 0x69, - 0x63, 0xc2, 0x34, 0x6f, - 0xd1, 0xcd, 0x39, 0x05, 0x1b, 0xe0, 0x02, 0xf3, 0x4d, 0x92, 0x73, 0xb2, - 0xe0, 0xda, 0x18, 0xeb, - 0xd6, 0xc1, 0xf7, 0x8b, 0x2f, 0x0a, 0xab, 0xfb, 0xba, 0xf0, 0xcf, 0x5b, - 0x0f, 0xa6, 0x76, 0x7e, - 0xcd, 0x95, 0xd7, 0xcb, 0x30, 0x5c, 0x81, 0x56, 0xbd, 0x4f, 0x9d, 0xaf, - 0xf0, 0xcc, 0xa0, 0x8c, - 0x72, 0xc5, 0x2e, 0xe0, 0x63, 0x04, 0xe4, 0x9b, 0xc8, 0x09, 0x9c, 0x2e, - 0x5c, 0x08, 0xa7, 0x4e, - 0xb7, 0x4e, 0xed, 0x1a, 0x57, 0x2d, 0x5c, 0x8b, 0x23, 0x48, 0x30, 0xbe, - 0x49, 0x4a, 0x4d, 0xbe, - 0x49, 0x58, 0x35, 0xa9, 0xaf, 0x4c, 0xa3, 0xa2, 0xee, 0xb5, 0x91, 0xe5, - 0xd7, 0x62, 0xab, 0xf3, - 0x6b, 0x59, 0x35, 0xb4, 0x28, 0x3d, 0xb8, 0x5e, 0xa7, 0xcf, 0x21, 0xcc, - 0xfd, 0xfd, 0x49, 0xe1, - 0xaa, 0x79, 0xb1, 0x9c, 0x94, 0x9a, 0x64, 0x64, 0x7a, 0x72, 0x09, 0x0c, - 0x3b, 0xbe, 0x18, 0xf8, - 0xa2, 0xaf, 0x18, 0xb6, 0x06, 0xe7, 0xad, 0xf6, 0x72, 0x73, 0x76, 0x9f, - 0xf8, 0x22, 0xee, 0x05, - 0x9f, 0x3c, 0xdd, 0x00, 0x3a, 0x04, 0x9e, 0xe7, 0x7a, 0x74, 0xac, 0x98, - 0xef, 0x59, 0x5a, 0x5c, - 0xfa, 0xee, 0x8c, 0xef, 0xc7, 0x3c, 0xee, 0xad, 0xdd, 0xe7, 0xd9, 0xcf, - 0x2e, 0xeb, 0x7f, 0xcf, - 0xf5, 0x63, 0x12, 0xde, 0xa9, 0xfd, 0xf7, 0x4c, 0xb4, 0xc6, 0x1b, 0x18, - 0xae, 0xbb, 0x7c, 0xc2, - 0x38, 0x8e, 0x7d, 0x97, 0x64, 0x47, 0x72, 0x2e, 0xcb, 0x6b, 0xc2, 0xce, - 0x4d, 0xb6, 0x27, 0xe5, - 0x32, 0xbe, 0x42, 0x8a, 0x2d, 0x36, 0x37, 0x90, 0xc6, 0xa7, 0x66, 0x77, - 0x45, 0x59, 0x23, 0xc2, - 0x68, 0x03, 0x39, 0x7a, 0x35, 0xa3, 0x6a, 0xe6, 0xb6, 0x83, 0xf2, 0x4d, - 0x46, 0xf9, 0xe3, 0x9b, - 0xb0, 0xba, 0x6f, 0xbc, 0x12, 0xc9, 0xc7, 0x3b, 0xe3, 0x8c, 0xd1, 0x6a, - 0x0c, 0xaf, 0xe9, 0xe0, - 0xe7, 0xbb, 0xf4, 0x9f, 0x6b, 0xf7, 0x25, 0xbb, 0xfa, 0x78, 0xff, 0x76, - 0x5c, 0x80, 0x58, 0x5a, - 0x9f, 0x8f, 0xe2, 0xf2, 0x17, 0x7c, 0xcf, 0x0f, 0xd6, 0xb0, 0x10, 0xbe, - 0x0b, 0x8b, 0x97, 0x12, - 0x82, 0xf0, 0x4d, 0xc2, 0xaa, 0xd3, 0xad, 0x5e, 0x49, 0xbe, 0xbf, 0x66, - 0x7e, 0x4d, 0x2f, 0xdf, - 0x24, 0x32, 0xac, 0xf3, 0x99, 0x63, 0x35, 0x5c, 0x88, 0xd1, 0x53, 0xf3, - 0x0a, 0x9c, 0xd7, 0xd3, - 0x6a, 0xfb, 0xec, 0x3a, 0xc5, 0xf2, 0x69, 0xb5, 0x71, 0xdd, 0xbb, 0x1e, - 0x1e, 0x69, 0x89, 0xe7, - 0x99, 0xbf, 0x10, 0xec, 0x3a, 0x15, 0xd2, 0x1c, 0xd6, 0x30, 0xf4, 0xac, - 0xba, 0xfc, 0x85, 0x64, - 0x63, 0x8a, 0x1a, 0xcd, 0xf4, 0x92, 0x70, 0xd4, 0xb8, 0x5b, 0xea, 0xce, - 0xdb, 0x0d, 0xb6, 0xdc, - 0x9a, 0x55, 0x4c, 0xb3, 0xe5, 0xe9, 0xda, 0x3c, 0x5d, 0xf0, 0xe1, 0xfc, - 0xd6, 0x71, 0x59, 0x3e, - 0xef, 0x9b, 0xa1, 0x9a, 0x4e, 0x7e, 0xbb, 0xf7, 0x1b, 0xf9, 0xae, 0x65, - 0xb8, 0xf7, 0x43, 0x3f, - 0xdc, 0xfa, 0x50, 0xeb, 0xc2, 0xd4, 0x21, 0xfe, 0x70, 0x3e, 0xc9, 0x5a, - 0x2b, 0xae, 0x65, 0x7a, - 0x2e, 0x22, 0xd8, 0x3e, 0x5c, 0xa7, 0x58, 0x8e, 0x2d, 0x35, 0x3f, 0x35, - 0xc7, 0xb5, 0x5d, 0xbe, - 0x6e, 0xa2, 0xa7, 0x9e, 0x55, 0x1b, 0x0b, 0xdd, 0x73, 0xdf, 0x42, 0xd6, - 0xaa, 0x0f, 0xd8, 0x9b, - 0x76, 0x85, 0xb9, 0x6d, 0x0f, 0xc7, 0x22, 0x2f, 0x3d, 0x20, 0xdf, 0xc4, - 0xf3, 0x5d, 0x18, 0xf7, - 0x8d, 0xd5, 0x7d, 0x59, 0x0d, 0xc4, 0xe3, 0xef, 0x33, 0x3d, 0xd4, 0xda, - 0x7a, 0x2e, 0xec, 0x7a, - 0xcd, 0x72, 0x54, 0x99, 0xf9, 0xee, 0xd8, 0xc5, 0xdf, 0x75, 0x21, 0xdc, - 0x3a, 0x5f, 0x57, 0x72, - 0x4c, 0x6a, 0xf5, 0x25, 0x67, 0x05, 0x9d, 0x1f, 0xec, 0x5a, 0x49, 0x7f, - 0x93, 0x4e, 0x77, 0xad, - 0x7c, 0x7f, 0xe0, 0x59, 0x73, 0x2c, 0x0e, 0x93, 0x13, 0x8d, 0xda, 0xdf, - 0xc1, 0x67, 0x7e, 0xcd, - 0xed, 0xaf, 0xc3, 0x35, 0x2e, 0x5a, 0x4f, 0x7f, 0x40, 0xa8, 0xb8, 0x20, - 0x84, 0xa7, 0x16, 0xae, - 0xf5, 0xb2, 0x4b, 0x91, 0x7c, 0x0d, 0x5c, 0xf7, 0x51, 0x37, 0x61, 0xd7, - 0xa9, 0x58, 0xaf, 0xba, - 0xc9, 0x95, 0x6a, 0xcf, 0x86, 0x6b, 0x36, 0x2d, 0x9b, 0x31, 0x93, 0xac, - 0x44, 0xba, 0xfe, 0x4e, - 0x8e, 0x56, 0x23, 0xfc, 0xf2, 0x29, 0xfc, 0xf4, 0x3d, 0x6b, 0xf1, 0xf1, - 0xa6, 0x67, 0x7b, 0xb1, - 0xe7, 0xf7, 0xf5, 0x51, 0x3f, 0x0e, 0xb4, 0xb4, 0x5a, 0xc6, 0x86, 0x27, - 0x6e, 0xd3, 0xde, 0x3b, - 0xaf, 0xdd, 0xb0, 0x97, 0xbd, 0x75, 0x66, 0x36, 0x3d, 0xd3, 0xeb, 0xee, - 0x19, 0x5d, 0x9f, 0x68, - 0x6a, 0x8f, 0x0c, 0x9c, 0x3f, 0x83, 0x6b, 0x4b, 0xb2, 0x35, 0xd6, 0x18, - 0xa8, 0x77, 0x20, 0x46, - 0x8a, 0xe5, 0x12, 0xc1, 0xfe, 0x53, 0xf3, 0xd3, 0x46, 0xa6, 0x15, 0xba, - 0x74, 0xfe, 0x98, 0xde, - 0x1f, 0xeb, 0x3f, 0x49, 0x74, 0xd7, 0xc3, 0xb5, 0xd8, 0xc3, 0x14, 0x8b, - 0x18, 0x46, 0x44, 0x87, - 0x4f, 0xbf, 0x29, 0x6c, 0xbd, 0x69, 0x91, 0x2c, 0x56, 0x05, 0x1f, 0xa0, - 0x5a, 0x07, 0xbf, 0x16, - 0xdf, 0x24, 0xd9, 0x19, 0x67, 0x88, 0x51, 0xa2, 0x79, 0xd6, 0xf7, 0x12, - 0xc3, 0xf0, 0xcf, 0x5e, - 0x97, 0xfb, 0x76, 0x49, 0xcf, 0xc5, 0x1d, 0x87, 0x8d, 0xf5, 0x93, 0x5f, - 0xab, 0x11, 0xbb, 0x84, - 0x5f, 0xe7, 0x2b, 0xe8, 0x31, 0xd1, 0x91, 0xef, 0x67, 0x75, 0x93, 0x78, - 0x67, 0xc6, 0xa8, 0xec, - 0xe2, 0xb4, 0xe1, 0x81, 0xf4, 0x5c, 0x18, 0xdf, 0xc4, 0x9d, 0xd7, 0xe3, - 0xf5, 0x68, 0x52, 0x87, - 0x53, 0xa7, 0x3b, 0x78, 0x5e, 0x2f, 0x01, 0x69, 0xf9, 0x7e, 0x53, 0x75, - 0x7e, 0xcd, 0x37, 0xdf, - 0xa4, 0x20, 0x23, 0x27, 0x33, 0x2f, 0x3e, 0x27, 0xd0, 0x5c, 0xe8, 0x90, - 0xe6, 0x33, 0xeb, 0xd1, - 0x9e, 0xbd, 0xdc, 0x9a, 0x97, 0xbb, 0x1e, 0x5e, 0xbb, 0xcf, 0xa1, 0x3a, - 0x76, 0x71, 0xd7, 0x4d, - 0x7c, 0xf5, 0x39, 0x68, 0x1a, 0x93, 0x3a, 0xaf, 0x8d, 0xe1, 0xea, 0x59, - 0x8d, 0xb3, 0xa5, 0xe4, - 0x56, 0xc7, 0x36, 0xe6, 0x04, 0x54, 0x27, 0x86, 0xf5, 0xd3, 0x83, 0xc7, - 0x62, 0xd4, 0x6a, 0x8e, - 0xc5, 0x5c, 0x8d, 0x4f, 0x4b, 0xae, 0x63, 0x58, 0x58, 0x8b, 0xa7, 0xeb, - 0x4f, 0x87, 0xa0, 0xba, - 0xaf, 0x66, 0x66, 0xa3, 0x47, 0xab, 0xaf, 0xd3, 0xef, 0x77, 0x7f, 0xf3, - 0x81, 0xc5, 0x0f, 0xdc, - 0xdf, 0xfd, 0xd3, 0x56, 0x2f, 0x25, 0x40, 0x0c, 0xc0, 0xf2, 0x7a, 0xc1, - 0xfc, 0xd7, 0x48, 0x29, - 0x91, 0x4b, 0x56, 0x83, 0xe5, 0xf5, 0x22, 0x68, 0xa2, 0x33, 0x6d, 0x54, - 0xa2, 0x1c, 0x6d, 0xf4, - 0xe8, 0x9d, 0xa6, 0x17, 0x65, 0x8c, 0xc8, 0x28, 0xce, 0x18, 0xc1, 0xf2, - 0x49, 0x9a, 0xe6, 0xa9, - 0x86, 0x85, 0x09, 0x86, 0xcc, 0xd1, 0x69, 0x23, 0xc0, 0x7f, 0x08, 0x9c, - 0x4f, 0x77, 0x64, 0xfe, - 0xfd, 0x35, 0xaf, 0x5a, 0x9c, 0x53, 0x8d, 0x6f, 0xa2, 0x5e, 0xe2, 0x9b, - 0xa4, 0x14, 0xc6, 0xe7, - 0x6a, 0xb9, 0x3e, 0x56, 0xf7, 0xb0, 0xc5, 0x72, 0x41, 0xb8, 0x6f, 0x5a, - 0x1c, 0xa6, 0xc5, 0x2e, - 0xf0, 0xdd, 0x7d, 0xf4, 0x68, 0x5f, 0x8a, 0xc3, 0x2c, 0xf1, 0xba, 0x74, - 0xbe, 0xc2, 0x7f, 0x4c, - 0x82, 0xe7, 0xf5, 0xa2, 0x19, 0x07, 0x31, 0x2f, 0x66, 0x94, 0xff, 0xfc, - 0x5a, 0xa6, 0xd6, 0xbf, - 0xa6, 0xbd, 0xa7, 0x12, 0x65, 0x0c, 0xc4, 0x37, 0x89, 0x90, 0x92, 0xc3, - 0xa8, 0xd3, 0xad, 0x3b, - 0xdf, 0x5f, 0xa7, 0x3f, 0xc0, 0x9d, 0x5f, 0xe3, 0x92, 0xfd, 0xf3, 0x4d, - 0xb4, 0xba, 0x89, 0xaf, - 0xd8, 0x25, 0x8c, 0xb8, 0x40, 0x7d, 0xf4, 0xb2, 0x87, 0xae, 0x51, 0xe1, - 0xae, 0x9b, 0xb8, 0xb8, - 0xf2, 0x59, 0xc3, 0x7c, 0xd4, 0xc3, 0x6b, 0xf4, 0x39, 0x24, 0xe9, 0x99, - 0xcf, 0xac, 0xb7, 0xe6, - 0xa5, 0x6b, 0x36, 0x6d, 0x04, 0x49, 0x70, 0xa4, 0xe6, 0x7a, 0xff, 0x9d, - 0xea, 0xc4, 0xb0, 0xb5, - 0x74, 0x04, 0xa6, 0xcc, 0x33, 0xd7, 0xe1, 0xa7, 0x3d, 0xf0, 0x69, 0xf4, - 0x2b, 0x0c, 0xcf, 0x1b, - 0xcc, 0xac, 0x5b, 0x3f, 0x0e, 0xa8, 0x43, 0x50, 0xb3, 0x96, 0x51, 0x07, - 0xe7, 0x13, 0x58, 0x5e, - 0x2f, 0x78, 0xfc, 0xce, 0xa5, 0xa8, 0x51, 0xc6, 0x60, 0x76, 0x97, 0x9c, - 0x9f, 0x3e, 0xd2, 0xeb, - 0x7b, 0x7a, 0x69, 0xc7, 0xa7, 0x8d, 0xcc, 0xd4, 0x7a, 0x83, 0xb4, 0xbc, - 0x85, 0x96, 0xbb, 0xd0, - 0xfa, 0x92, 0x3d, 0x7d, 0x4e, 0x3e, 0x72, 0x4a, 0xa1, 0xd8, 0x40, 0x42, - 0xb8, 0x6a, 0x5e, 0xfe, - 0x73, 0xdb, 0xda, 0x77, 0x89, 0x91, 0xc1, 0xf7, 0xb3, 0xc6, 0x71, 0xd5, - 0x75, 0x0f, 0x35, 0x18, - 0xf7, 0x37, 0x82, 0xa4, 0x31, 0x1e, 0x9a, 0x14, 0xc9, 0x05, 0xd2, 0x73, - 0x49, 0xd5, 0x62, 0x97, - 0xd4, 0x11, 0x31, 0x01, 0xf2, 0x6b, 0x97, 0xf2, 0x7a, 0x61, 0xea, 0xe3, - 0xbd, 0xfc, 0x7c, 0xff, - 0x65, 0xf3, 0x4d, 0x42, 0xc2, 0x85, 0xbf, 0x47, 0xcf, 0xa7, 0xba, 0x2f, - 0x99, 0xe1, 0x77, 0x56, - 0x30, 0xbe, 0x89, 0xa6, 0x3d, 0x1b, 0x7c, 0xbe, 0x93, 0xde, 0x5e, 0xf6, - 0x94, 0x30, 0x6a, 0x54, - 0x44, 0xd9, 0x33, 0xb4, 0xd8, 0x40, 0xc3, 0x75, 0x4f, 0x5f, 0x72, 0x9d, - 0x3e, 0x87, 0x78, 0x43, - 0xb2, 0xe6, 0xa7, 0x07, 0xe3, 0xca, 0xbb, 0xe7, 0xb0, 0x86, 0x25, 0x7e, - 0x8f, 0x24, 0x2c, 0x96, - 0xf2, 0xee, 0x29, 0xf3, 0x15, 0xc3, 0x7a, 0x38, 0x6f, 0x75, 0xfb, 0xf7, - 0x9e, 0xeb, 0xd5, 0xef, - 0xeb, 0x76, 0xcf, 0xc4, 0x4a, 0xb1, 0x7c, 0xac, 0x0c, 0xfb, 0x9b, 0x41, - 0x5a, 0xfd, 0x58, 0xaf, - 0x0e, 0xc1, 0xa0, 0x92, 0x2e, 0xff, 0x0a, 0x14, 0x03, 0xd5, 0xc9, 0xeb, - 0xf9, 0x8f, 0xdf, 0x83, - 0x71, 0xc2, 0x70, 0x6a, 0x61, 0xfa, 0x48, 0x9f, 0xe7, 0x23, 0x60, 0x63, - 0x8c, 0x25, 0x8e, 0x4b, - 0x60, 0x7d, 0x4e, 0x85, 0x19, 0x23, 0x2f, 0xf5, 0xe2, 0xf9, 0xd0, 0x73, - 0x71, 0xff, 0x5d, 0xfe, - 0x17, 0x9a, 0x56, 0x5a, 0x0e, 0x4b, 0x0f, 0xf7, 0x8d, 0x69, 0xde, 0x2b, - 0x80, 0xed, 0x4a, 0x10, - 0xee, 0xaf, 0xaf, 0xbc, 0x9e, 0x97, 0x9e, 0x8b, 0xb7, 0x0e, 0x3e, 0xb3, - 0xb9, 0x00, 0x7a, 0x2e, - 0x7f, 0x4d, 0x7f, 0xff, 0x15, 0xe7, 0xfb, 0xab, 0xeb, 0x26, 0x2e, 0xbe, - 0x49, 0x90, 0xf9, 0x26, - 0x5a, 0x4e, 0x43, 0x47, 0x2d, 0x5c, 0xb7, 0x76, 0xcd, 0x98, 0xb0, 0xe9, - 0xf9, 0x50, 0x2d, 0xaf, - 0x67, 0x8d, 0x35, 0x04, 0xca, 0xaf, 0xb1, 0xd8, 0x85, 0xcd, 0x45, 0x0d, - 0xe6, 0x17, 0xe9, 0xae, - 0x85, 0x6b, 0xd7, 0xc6, 0x70, 0xd6, 0xc2, 0xab, 0xaf, 0x8d, 0x35, 0xf9, - 0x26, 0xde, 0xb1, 0x47, - 0x2d, 0xbe, 0x89, 0x2f, 0x5d, 0xcd, 0x50, 0x38, 0x2e, 0xde, 0xfc, 0x7c, - 0x7f, 0xdf, 0x93, 0x69, - 0xfb, 0x7a, 0xe7, 0x76, 0x7c, 0xc5, 0xb0, 0x75, 0xb4, 0x04, 0xd6, 0x3e, - 0x74, 0x07, 0x8b, 0x51, - 0x5d, 0x1c, 0x8b, 0x48, 0xc2, 0xf2, 0x17, 0xac, 0xde, 0x10, 0xfb, 0xf9, - 0xc3, 0x2f, 0x55, 0xd7, - 0x8f, 0x83, 0xe8, 0x10, 0xdc, 0xf2, 0x49, 0xd3, 0x97, 0x03, 0xea, 0x89, - 0x00, 0xce, 0x27, 0x05, - 0xca, 0xeb, 0xb9, 0x8f, 0x65, 0xbc, 0x2d, 0x35, 0x97, 0xf5, 0x8e, 0x04, - 0xb3, 0xbb, 0xb4, 0xc2, - 0x8c, 0x11, 0xba, 0x7c, 0xe6, 0xc2, 0xe4, 0x11, 0x89, 0x7e, 0xf4, 0x5c, - 0x3c, 0xfe, 0x3a, 0xf3, - 0xd3, 0xc3, 0xa3, 0x55, 0x1f, 0x72, 0xcd, 0x8b, 0x0b, 0xca, 0x7d, 0x73, - 0xba, 0x34, 0x4f, 0xe3, - 0x82, 0x72, 0xdf, 0x02, 0x6b, 0xd5, 0x7b, 0xfa, 0x92, 0x93, 0xbd, 0x63, - 0x17, 0x5f, 0xf3, 0x83, - 0xdd, 0x71, 0x98, 0xee, 0x3e, 0xde, 0xe2, 0x4c, 0x9d, 0xfd, 0x7a, 0x61, - 0xca, 0xf7, 0xbb, 0xfb, - 0x72, 0xe2, 0xaa, 0xf9, 0x26, 0x59, 0x7e, 0xf8, 0x26, 0x19, 0xa3, 0xb2, - 0x5c, 0xf1, 0x3b, 0x09, - 0xc8, 0x71, 0x01, 0x5c, 0xd0, 0xab, 0x49, 0x1d, 0x11, 0xc6, 0x59, 0x73, - 0xd5, 0x79, 0xbd, 0x4b, - 0x7c, 0x93, 0xdc, 0x3a, 0x7c, 0x93, 0xe2, 0x8c, 0x1a, 0x75, 0x13, 0x9f, - 0xb1, 0x8b, 0x56, 0x0b, - 0x8f, 0x0e, 0x67, 0x7f, 0xff, 0x15, 0xd4, 0xbc, 0x74, 0xf0, 0x4d, 0x94, - 0x9a, 0x7c, 0x13, 0x17, - 0xc7, 0x25, 0x4c, 0xbd, 0xec, 0xf0, 0x3d, 0xd9, 0xec, 0x33, 0xef, 0xeb, - 0x54, 0x93, 0x59, 0x75, - 0xe7, 0x92, 0x7b, 0x74, 0xee, 0x9f, 0x58, 0xd8, 0x67, 0xc0, 0x75, 0x1f, - 0xd4, 0x1f, 0xe4, 0xef, - 0x3d, 0x63, 0xc6, 0xf7, 0x7c, 0x53, 0xeb, 0xf3, 0x5b, 0x6a, 0xef, 0xef, - 0xab, 0x8e, 0xfb, 0xf8, - 0xc2, 0xbb, 0x06, 0x74, 0x1a, 0x5f, 0xff, 0x4d, 0xd6, 0xab, 0x1c, 0x9e, - 0xbc, 0x5e, 0x24, 0x61, - 0x75, 0x8d, 0xa0, 0x39, 0x5f, 0xb0, 0x01, 0x56, 0xa3, 0xd7, 0x35, 0x6f, - 0xd1, 0x7d, 0x3e, 0xfa, - 0xd6, 0x73, 0x71, 0xfb, 0xeb, 0x70, 0x3e, 0xa6, 0xda, 0xe3, 0x73, 0xfd, - 0xe9, 0xb9, 0xfc, 0x55, - 0x36, 0x10, 0x9c, 0x5b, 0x16, 0x83, 0xe3, 0x1d, 0xb1, 0x1a, 0x06, 0xc5, - 0x04, 0xe3, 0x7e, 0xe8, - 0xcc, 0xf7, 0x6b, 0x39, 0x36, 0x88, 0x5d, 0xfc, 0xce, 0x0f, 0x76, 0xc7, - 0x61, 0xa1, 0xe8, 0x7c, - 0x85, 0x9a, 0xeb, 0x0c, 0x53, 0xbe, 0x3f, 0x28, 0xdf, 0x24, 0x2b, 0x28, - 0xdf, 0x24, 0xcc, 0x9a, - 0xd4, 0x21, 0x68, 0xd7, 0xf8, 0xcc, 0xeb, 0x79, 0xf5, 0x25, 0xa7, 0xd5, - 0xc2, 0xc2, 0x6a, 0x5c, - 0x97, 0x6a, 0xf2, 0x4d, 0x5c, 0xb8, 0x10, 0xa9, 0xaf, 0x16, 0xae, 0xab, - 0xbf, 0x3f, 0x21, 0xb8, - 0x46, 0x85, 0x9e, 0x3a, 0xa0, 0xe6, 0x33, 0x67, 0x0d, 0x4b, 0x72, 0xd4, - 0xe5, 0x87, 0xd6, 0xe0, - 0x9b, 0xd8, 0xd3, 0xc3, 0xd7, 0xcb, 0x0e, 0xdf, 0x93, 0xe5, 0x77, 0x6a, - 0xf0, 0x24, 0xbe, 0x1a, - 0xf4, 0x4c, 0xed, 0x18, 0x56, 0xab, 0xf1, 0x2e, 0xeb, 0x75, 0x4f, 0xb0, - 0xef, 0x19, 0x6b, 0xcb, - 0x1c, 0xf5, 0x72, 0xed, 0x59, 0x21, 0x5b, 0x5e, 0xea, 0x39, 0x60, 0x4e, - 0x8f, 0x47, 0x5a, 0x8f, - 0x4e, 0x1c, 0x9a, 0x60, 0x4d, 0x30, 0xb2, 0xbc, 0x1a, 0xcb, 0xeb, 0xb1, - 0x1c, 0x4c, 0xa0, 0x7c, - 0x74, 0xb4, 0xd6, 0x97, 0xa3, 0x27, 0xaf, 0x97, 0x96, 0x13, 0xac, 0x37, - 0x83, 0xe5, 0xd3, 0x33, - 0x5c, 0x9a, 0x56, 0x97, 0x93, 0xdb, 0xf6, 0xd2, 0x73, 0xf1, 0xea, 0xd9, - 0x0a, 0xa0, 0xe7, 0x72, - 0xc9, 0x06, 0xf4, 0xf9, 0xe9, 0xc1, 0x6d, 0xc0, 0x9d, 0xdb, 0x16, 0xf5, - 0x70, 0xdf, 0x5c, 0x7d, - 0x2f, 0x41, 0xe7, 0xbe, 0x49, 0x21, 0xd4, 0x01, 0xed, 0x5e, 0x5c, 0x79, - 0x5f, 0xf9, 0xb5, 0x31, - 0xae, 0xd8, 0xc5, 0x5f, 0xff, 0x5a, 0xc8, 0xb8, 0x50, 0x93, 0x9f, 0x1f, - 0xf8, 0x98, 0x5c, 0x41, - 0xbe, 0xdf, 0xbb, 0x6e, 0xe2, 0x93, 0x6f, 0x62, 0xad, 0xcd, 0x37, 0xf9, - 0x87, 0xf6, 0xf1, 0x6a, - 0xd7, 0xee, 0x74, 0x6d, 0xbe, 0x67, 0x40, 0xbe, 0x09, 0x5c, 0xaf, 0x19, - 0x16, 0x85, 0x55, 0x7b, - 0x36, 0x8c, 0xb5, 0x70, 0xa6, 0x51, 0x11, 0x94, 0x6f, 0x52, 0x94, 0x39, - 0x3c, 0xab, 0x20, 0x39, - 0x30, 0xdf, 0x44, 0x6f, 0xcf, 0xaa, 0x18, 0xcf, 0xa7, 0x3a, 0x13, 0x47, - 0xd5, 0x78, 0x8d, 0x89, - 0x0f, 0xd5, 0x99, 0xb7, 0x5b, 0xca, 0x7c, 0xc2, 0xb5, 0x03, 0xef, 0x08, - 0x86, 0xb9, 0xac, 0x1e, - 0xd9, 0x7e, 0xee, 0xcb, 0x0f, 0xd5, 0xd2, 0x21, 0x30, 0x6a, 0xf5, 0x7d, - 0x8d, 0x73, 0x92, 0x60, - 0x64, 0xdc, 0x8c, 0x24, 0x7b, 0x52, 0x6e, 0x92, 0xc6, 0xd1, 0x48, 0x30, - 0xc4, 0x2b, 0xb1, 0x46, - 0xc6, 0x57, 0x8b, 0xac, 0x85, 0x85, 0xba, 0xf3, 0x7a, 0x05, 0x7e, 0xf2, - 0x7a, 0xb5, 0xec, 0x8e, - 0xf5, 0xb9, 0xe9, 0xea, 0x59, 0x0d, 0x58, 0xf3, 0x62, 0x3d, 0x5b, 0x09, - 0x1c, 0xf3, 0x15, 0x58, - 0x3c, 0xed, 0x53, 0xcf, 0x45, 0x75, 0xf5, 0x25, 0x47, 0xd9, 0xd2, 0x74, - 0x5d, 0x1b, 0x43, 0xe9, - 0x59, 0x0d, 0xda, 0x23, 0x23, 0x5f, 0xd2, 0x7c, 0x0e, 0x36, 0xf7, 0x4d, - 0x7f, 0xbe, 0xdf, 0x9f, - 0x56, 0xbd, 0x97, 0x0e, 0x7e, 0x61, 0xfa, 0xc8, 0x60, 0xf9, 0xb5, 0x90, - 0xfa, 0x78, 0x0b, 0xc3, - 0x77, 0x4c, 0x74, 0xf4, 0xf1, 0x6a, 0x36, 0xca, 0xfc, 0x05, 0x9f, 0x7c, - 0x13, 0xef, 0xbe, 0x64, - 0x29, 0x8e, 0x0b, 0x9f, 0x4e, 0xb7, 0xfe, 0x5a, 0xb8, 0x6e, 0xed, 0x1a, - 0x97, 0xcf, 0xec, 0x5f, - 0xcf, 0x85, 0xf5, 0x3a, 0x14, 0x6b, 0x7c, 0x93, 0xdc, 0x40, 0x7c, 0x93, - 0x50, 0xf2, 0x7a, 0xd9, - 0x7a, 0xb5, 0x6b, 0x2e, 0x53, 0xa3, 0xa2, 0x26, 0xdf, 0x24, 0x5b, 0x1f, - 0xdf, 0x44, 0x6f, 0xcf, - 0x2a, 0x7c, 0xcf, 0x34, 0x47, 0x42, 0xcd, 0xcf, 0x3f, 0xf6, 0x56, 0xad, - 0x07, 0xba, 0xa4, 0xf0, - 0xe2, 0x90, 0xda, 0x3c, 0xde, 0xc8, 0x20, 0xb9, 0x11, 0xc6, 0xbb, 0x60, - 0xe7, 0x46, 0x76, 0x61, - 0x93, 0x21, 0xbe, 0x1f, 0x1b, 0x89, 0x19, 0x7e, 0x24, 0xd9, 0x12, 0x0c, - 0x09, 0xb6, 0xa4, 0x5c, - 0x8d, 0x9b, 0xc1, 0x38, 0x1a, 0xe0, 0xf3, 0x32, 0x3c, 0x8c, 0x57, 0x3c, - 0xbe, 0x43, 0x24, 0x8e, - 0xb7, 0xa7, 0xe6, 0x06, 0xcd, 0xbf, 0x6a, 0x79, 0xbd, 0xf4, 0xa0, 0x79, - 0x3d, 0x76, 0x3d, 0xce, - 0xd4, 0xa1, 0x69, 0xc5, 0xe6, 0x35, 0xa4, 0xe8, 0xf0, 0x99, 0x35, 0x1b, - 0x80, 0x6b, 0x8f, 0x3f, - 0x3d, 0x17, 0x56, 0x37, 0x61, 0xf5, 0x66, 0x66, 0xeb, 0x7e, 0xf5, 0x5c, - 0xbc, 0x73, 0x58, 0x7a, - 0xfa, 0xc4, 0x74, 0xd4, 0xbc, 0x22, 0x99, 0xe6, 0xa9, 0xbb, 0xef, 0x25, - 0xa8, 0xce, 0x97, 0xfe, - 0x3e, 0xde, 0xe0, 0xc7, 0xc4, 0xc2, 0x66, 0xe1, 0x65, 0xb2, 0xd8, 0x65, - 0x54, 0x4d, 0x3d, 0x97, - 0x5a, 0x7c, 0x93, 0x50, 0x74, 0xbe, 0xe4, 0xf0, 0x1c, 0x93, 0x50, 0xe6, - 0xef, 0xb9, 0xfc, 0x05, - 0xdf, 0x7a, 0x2e, 0x97, 0xf8, 0x26, 0xe9, 0x41, 0xf9, 0x26, 0x61, 0xef, - 0xe3, 0xbd, 0x6c, 0xed, - 0x9a, 0x20, 0x7c, 0x13, 0x1f, 0x7a, 0x2e, 0xa1, 0xf6, 0xf7, 0x87, 0xad, - 0xe6, 0xa5, 0x06, 0xbd, - 0x36, 0x6a, 0x71, 0x18, 0xb3, 0x51, 0x76, 0x4e, 0xd5, 0xd4, 0x5f, 0x04, - 0x5c, 0xf7, 0xae, 0x9b, - 0x88, 0x7e, 0xe6, 0x35, 0xd4, 0xf1, 0x8b, 0x92, 0x8d, 0x69, 0xf6, 0xb8, - 0x9a, 0xc7, 0xcc, 0xd1, - 0x7a, 0x84, 0xbf, 0x79, 0xbb, 0x4d, 0xac, 0x11, 0x39, 0x81, 0xe2, 0x11, - 0xc6, 0xbd, 0xd5, 0x91, - 0xd7, 0xe3, 0x93, 0xdd, 0x7c, 0x93, 0x9a, 0x3c, 0xe4, 0xd4, 0x9c, 0x54, - 0x17, 0x17, 0x39, 0x87, - 0xe5, 0xd6, 0xb5, 0xbc, 0x9e, 0x1c, 0xc5, 0x45, 0x06, 0xea, 0xd9, 0x12, - 0xe3, 0x10, 0xbb, 0x06, - 0x44, 0x86, 0x45, 0xd3, 0x2a, 0xb4, 0x79, 0x8b, 0x35, 0x7b, 0xaf, 0x6a, - 0xea, 0xb9, 0xd4, 0xec, - 0xd9, 0xf2, 0xa3, 0xe7, 0xf2, 0x17, 0xf4, 0xac, 0x7a, 0xb8, 0x6f, 0xda, - 0x71, 0x0e, 0xd3, 0x5c, - 0x4e, 0x9d, 0xf9, 0x7e, 0xcf, 0x5c, 0x4e, 0xbf, 0xf3, 0x83, 0x3d, 0x3c, - 0x87, 0xac, 0x82, 0xa4, - 0x91, 0xb1, 0x52, 0x8c, 0xff, 0xbc, 0x69, 0x28, 0xc7, 0x44, 0x2f, 0x2e, - 0x5c, 0x6e, 0xbe, 0xbf, - 0xb6, 0x0e, 0xbe, 0x4e, 0xbe, 0x49, 0x58, 0x78, 0x3f, 0xd5, 0xd7, 0xb4, - 0x30, 0xe5, 0xfb, 0x5d, - 0x7c, 0x13, 0x57, 0xec, 0x12, 0x8c, 0x6f, 0xa2, 0xab, 0x47, 0xc6, 0x95, - 0xd7, 0xbb, 0xa2, 0xf9, - 0xcc, 0x75, 0x7c, 0xe6, 0xa0, 0xfd, 0x7a, 0x34, 0xc5, 0xdd, 0x23, 0x53, - 0x8d, 0xeb, 0x9e, 0x9e, - 0x8d, 0x5a, 0xb8, 0xce, 0x6a, 0xe1, 0xb1, 0x96, 0xc0, 0x7c, 0x93, 0x68, - 0x6b, 0xaa, 0x21, 0xcd, - 0x16, 0x5d, 0xf3, 0xef, 0x64, 0x49, 0xd5, 0x66, 0xab, 0x19, 0x26, 0x5d, - 0xbc, 0xa4, 0xc7, 0x32, - 0x7e, 0xe2, 0x1b, 0xec, 0xbe, 0xf6, 0xf9, 0x11, 0xc3, 0x02, 0xf4, 0x7b, - 0x20, 0xe6, 0xd7, 0x05, - 0xed, 0x93, 0x05, 0xcc, 0x4d, 0x56, 0x6a, 0xe4, 0xf5, 0x58, 0xfd, 0xd8, - 0xc5, 0xdb, 0x05, 0x5f, - 0x2a, 0x25, 0x3f, 0x35, 0x87, 0x71, 0x33, 0x5c, 0xfc, 0x8c, 0x94, 0x9c, - 0x64, 0x47, 0xd2, 0xa5, - 0x38, 0xaa, 0xf6, 0x77, 0x01, 0x2c, 0xcd, 0x28, 0x48, 0xce, 0x09, 0x9a, - 0xc3, 0xd2, 0x34, 0xad, - 0xa2, 0xff, 0x52, 0x4d, 0xab, 0x1a, 0x7d, 0xc9, 0xe0, 0xaf, 0xb3, 0xbf, - 0xd3, 0xa5, 0x9e, 0x2d, - 0x1f, 0x7a, 0x2e, 0xcc, 0xfe, 0xdd, 0x39, 0xac, 0xe0, 0x36, 0xa0, 0x2f, - 0x56, 0x65, 0xdc, 0xb7, - 0x38, 0x29, 0x08, 0x6e, 0x84, 0xd8, 0xc3, 0x78, 0x45, 0x3a, 0x5f, 0xb5, - 0x75, 0xf0, 0xc7, 0x06, - 0xd1, 0x73, 0xf9, 0x0b, 0xfa, 0xfb, 0x43, 0xca, 0xf7, 0x07, 0xe3, 0x9b, - 0x38, 0xd2, 0x83, 0xf3, - 0x4d, 0xe0, 0xef, 0x9a, 0x1c, 0xce, 0x3e, 0xde, 0x70, 0x6a, 0xd7, 0x68, - 0xef, 0x99, 0x31, 0x9c, - 0x71, 0x62, 0xfc, 0xe5, 0xd7, 0x34, 0xbe, 0x49, 0x7e, 0x7a, 0x4e, 0x16, - 0xe0, 0x5f, 0x60, 0xae, - 0x7c, 0x78, 0x7b, 0xd9, 0x43, 0xac, 0x79, 0xf1, 0x7a, 0xf8, 0x26, 0x19, - 0x8c, 0xd7, 0xc0, 0xfa, - 0xd7, 0xfc, 0xf0, 0x4d, 0x62, 0x6d, 0x69, 0xb9, 0x69, 0xd6, 0xba, 0xb9, - 0xf7, 0x67, 0x6b, 0xf5, - 0x40, 0x7b, 0x66, 0x72, 0xa4, 0x49, 0x01, 0xae, 0x2f, 0x62, 0x3c, 0xcf, - 0x7a, 0x18, 0x83, 0xf6, - 0xeb, 0xa9, 0xc9, 0x06, 0x77, 0x8f, 0xa3, 0x5f, 0x1f, 0x97, 0xe1, 0x47, - 0x2a, 0xc3, 0x40, 0x88, - 0x6d, 0x19, 0x3f, 0x81, 0xf9, 0x50, 0x69, 0xf9, 0x5a, 0xcf, 0x85, 0x77, - 0x2f, 0x1e, 0xd6, 0xf2, - 0x7a, 0x79, 0xc1, 0xb5, 0xea, 0xe1, 0x7a, 0xcc, 0x6c, 0x40, 0x9f, 0x7e, - 0x53, 0x78, 0x72, 0xdb, - 0x54, 0xcb, 0x61, 0xd9, 0x62, 0x0c, 0xd5, 0x75, 0x13, 0x3f, 0x3a, 0xf8, - 0x99, 0xc5, 0x99, 0xc3, - 0x63, 0xcd, 0x81, 0x75, 0xea, 0xa3, 0xf4, 0x5d, 0x1b, 0x49, 0x8c, 0x43, - 0xe3, 0xbe, 0x61, 0x1d, - 0xf8, 0x47, 0xf4, 0xf5, 0xf7, 0xc7, 0x86, 0x2b, 0xdf, 0xcf, 0xe2, 0x30, - 0x4d, 0xe7, 0x2b, 0xc3, - 0x9b, 0x6f, 0x32, 0xc6, 0x07, 0xdf, 0x44, 0xd4, 0xa7, 0xf3, 0x15, 0x65, - 0xd3, 0x5f, 0x07, 0x0c, - 0x5b, 0x1f, 0xaf, 0xa6, 0x97, 0x13, 0x97, 0x13, 0x8c, 0x6f, 0xa2, 0x61, - 0x91, 0x1a, 0x84, 0x6f, - 0xc2, 0xfa, 0x78, 0xff, 0x01, 0xda, 0x35, 0x3e, 0xf9, 0x26, 0x63, 0x6b, - 0xf1, 0x4d, 0x7c, 0xf5, - 0x39, 0xb8, 0xf3, 0x7a, 0xf1, 0x7f, 0x5d, 0x2f, 0xbb, 0xff, 0x9e, 0x55, - 0x7f, 0xd7, 0x46, 0x0f, - 0xdf, 0x44, 0xe3, 0xca, 0x7b, 0xf1, 0x4d, 0x6a, 0xeb, 0x6a, 0xba, 0xbf, - 0x0b, 0xbb, 0x9e, 0xf9, - 0x3a, 0x37, 0xfa, 0xb3, 0x7e, 0x97, 0x39, 0x1b, 0x07, 0x6a, 0xe8, 0x97, - 0xbf, 0x62, 0x98, 0x4b, - 0xef, 0xb4, 0x67, 0xff, 0xa0, 0xfd, 0x2a, 0xd6, 0xd8, 0xa0, 0xfa, 0x7a, - 0x71, 0x2c, 0xaf, 0x17, - 0xec, 0xef, 0xc4, 0x66, 0xf0, 0x16, 0xa6, 0x8d, 0x8c, 0x93, 0x18, 0x8f, - 0xcb, 0x35, 0x47, 0x23, - 0x63, 0x74, 0xc6, 0x08, 0xb6, 0x35, 0x3c, 0x2c, 0x70, 0xf5, 0x9f, 0xc5, - 0xc2, 0x6b, 0xb1, 0xbc, - 0x5e, 0xe0, 0x73, 0x48, 0xd3, 0xb4, 0xfa, 0x7b, 0x67, 0x50, 0xd6, 0xd1, - 0x65, 0xf7, 0xa3, 0xe7, - 0xa2, 0x69, 0x04, 0x67, 0x0e, 0x0b, 0xa4, 0xe7, 0x12, 0x4a, 0xac, 0x1a, - 0xa7, 0x47, 0xf3, 0x34, - 0xd4, 0x3e, 0xde, 0xf0, 0xcd, 0xe5, 0xd4, 0x62, 0x97, 0x24, 0xd9, 0x9b, - 0x6f, 0x92, 0xe9, 0xab, - 0x86, 0x34, 0x2a, 0xcb, 0xc3, 0x95, 0x0f, 0xc0, 0x37, 0xf9, 0x9f, 0x69, - 0x5a, 0xd5, 0xcc, 0xf7, - 0xd7, 0x9c, 0x1f, 0xec, 0xe5, 0xef, 0xbb, 0xf8, 0x26, 0xfe, 0xeb, 0xe1, - 0x21, 0x69, 0xd5, 0x87, - 0x4b, 0xd3, 0x2a, 0xb0, 0x46, 0xc5, 0x25, 0xbe, 0x49, 0x51, 0x6d, 0xbe, - 0x49, 0x4d, 0x3d, 0x17, - 0x17, 0x57, 0x3e, 0x46, 0x27, 0x2f, 0x3c, 0x04, 0x4d, 0xea, 0xe0, 0x35, - 0x2f, 0xad, 0x67, 0x35, - 0x68, 0x5e, 0x8f, 0xf5, 0xe5, 0x40, 0x6c, 0x50, 0x83, 0x6f, 0x32, 0xd6, - 0x13, 0xeb, 0x7b, 0xae, - 0xb7, 0xf1, 0x86, 0x04, 0xc0, 0x49, 0x77, 0x8d, 0xa1, 0xc6, 0xdf, 0xbd, - 0xdb, 0xa2, 0x41, 0xf7, - 0x0d, 0x5a, 0x3c, 0xe3, 0x3e, 0x6f, 0xfd, 0xd3, 0x47, 0x3f, 0x8d, 0x78, - 0x39, 0x28, 0x0f, 0xcd, - 0xaa, 0xb3, 0x5f, 0x2f, 0x58, 0xbf, 0x0a, 0xcb, 0xeb, 0xc1, 0xf1, 0xbe, - 0x14, 0x13, 0x45, 0x55, - 0x6b, 0xc7, 0x33, 0xfc, 0x60, 0x3e, 0x13, 0xdb, 0x0c, 0x0f, 0x99, 0x46, - 0x70, 0x52, 0xa0, 0x9e, - 0x2d, 0xad, 0x97, 0x3d, 0x4b, 0xa7, 0x0d, 0xe8, 0x9c, 0xb7, 0xe8, 0xb8, - 0x82, 0xdc, 0x76, 0x0d, - 0x1d, 0xfc, 0x8c, 0x11, 0x01, 0xe7, 0x07, 0xbb, 0x3f, 0x8b, 0x2e, 0x5d, - 0x76, 0xf7, 0xdc, 0x4b, - 0x4f, 0xdd, 0xd7, 0x5d, 0x17, 0x20, 0x81, 0xf2, 0x7a, 0xe1, 0x3b, 0x26, - 0x99, 0xfe, 0x8f, 0x89, - 0x30, 0x9d, 0x7c, 0x22, 0x4e, 0x21, 0x53, 0xc4, 0xc9, 0x64, 0x8a, 0xc4, - 0x6e, 0x6b, 0x6d, 0x8b, - 0x6b, 0x4f, 0x95, 0xa6, 0x62, 0xb6, 0x3f, 0x93, 0xbe, 0xc7, 0x97, 0xf8, - 0x26, 0x89, 0x7e, 0xf9, - 0x26, 0x71, 0xe1, 0xc6, 0x85, 0x2b, 0xd5, 0xf3, 0xf1, 0xea, 0x4b, 0xae, - 0x8e, 0xf5, 0x03, 0xd4, - 0xc3, 0x23, 0xd5, 0x10, 0x78, 0x3f, 0x7f, 0xab, 0x76, 0x8d, 0xa6, 0x49, - 0x3d, 0x32, 0xd5, 0x1e, - 0x84, 0x6f, 0x02, 0xf8, 0xc1, 0x70, 0x11, 0xde, 0x13, 0x85, 0x31, 0x7e, - 0xff, 0x2b, 0xb4, 0x6b, - 0x5c, 0x31, 0xa5, 0xa7, 0xcf, 0xa9, 0x38, 0x4b, 0xc3, 0x0e, 0xed, 0xfa, - 0x04, 0xbe, 0x94, 0xeb, - 0x1c, 0xf3, 0xcc, 0xeb, 0x76, 0xbd, 0x6e, 0x53, 0x4f, 0x0f, 0xb4, 0x3b, - 0xef, 0xc7, 0x34, 0xec, - 0x83, 0xe6, 0xf5, 0xd4, 0x14, 0x63, 0xaa, 0x35, 0xf8, 0x6c, 0x46, 0x96, - 0x0b, 0x0a, 0x96, 0xdb, - 0x09, 0x94, 0xd7, 0x73, 0xf9, 0xeb, 0x2e, 0x0d, 0x14, 0x86, 0x6b, 0x2e, - 0xde, 0xae, 0xfb, 0xef, - 0xa2, 0x5d, 0xa3, 0x12, 0x6a, 0x6a, 0x98, 0x00, 0x76, 0x66, 0x14, 0x5f, - 0x59, 0x5e, 0x6f, 0xba, - 0xf8, 0x89, 0x66, 0xab, 0x93, 0xc5, 0xc9, 0x74, 0x0a, 0xb3, 0x53, 0xcb, - 0x14, 0x5c, 0xc7, 0x8e, - 0xab, 0xf7, 0xa7, 0x64, 0x3a, 0x1c, 0x6f, 0x3d, 0x5a, 0xf5, 0xda, 0xb5, - 0x11, 0x7c, 0x00, 0x9f, - 0xf3, 0x83, 0xbd, 0xfc, 0xf5, 0x04, 0x5d, 0xbd, 0xec, 0x2e, 0xee, 0x5b, - 0xa4, 0x1b, 0xff, 0x98, - 0x06, 0x42, 0x8c, 0x1c, 0x85, 0xa2, 0x5c, 0xda, 0xcf, 0x35, 0xb1, 0x30, - 0x34, 0x5c, 0xd0, 0x39, - 0x97, 0xd3, 0x0f, 0x2e, 0x88, 0x0a, 0xbd, 0xdb, 0xfe, 0x3c, 0x7d, 0xde, - 0xe6, 0xda, 0xcf, 0xd9, - 0x9e, 0x0b, 0xb8, 0xfb, 0x5a, 0x25, 0xea, 0x9b, 0x6f, 0x52, 0xf3, 0x1a, - 0x97, 0xa8, 0xd3, 0x5f, - 0x08, 0xb3, 0x76, 0x8d, 0x8e, 0xbc, 0x9e, 0xab, 0x2f, 0x27, 0x9e, 0xe9, - 0xf1, 0x06, 0xe2, 0x9b, - 0xd8, 0xd3, 0x47, 0xb9, 0x6b, 0x0c, 0xe4, 0x8a, 0x79, 0x3f, 0x7a, 0xb5, - 0x6b, 0xec, 0x1a, 0x2e, - 0x84, 0xd6, 0xaf, 0xe7, 0x95, 0x5f, 0xab, 0x3b, 0xdf, 0x04, 0x62, 0x97, - 0x00, 0x7a, 0x2e, 0x97, - 0x51, 0x0b, 0xe7, 0x75, 0xf6, 0xac, 0x06, 0xad, 0x79, 0xf9, 0xce, 0x6d, - 0x7b, 0xeb, 0xe0, 0xa7, - 0xe6, 0x30, 0x0d, 0x14, 0x16, 0x4f, 0x6a, 0x3a, 0xf8, 0xce, 0xe4, 0x1c, - 0x0d, 0x3b, 0x20, 0xd6, - 0x8f, 0xf9, 0xda, 0xc5, 0xe3, 0xf5, 0x70, 0x76, 0x6f, 0xff, 0x28, 0x6e, - 0x50, 0xb0, 0xf7, 0x8c, - 0xb5, 0xa5, 0x1a, 0x52, 0x74, 0xf5, 0xeb, 0xa5, 0x8d, 0x8c, 0xd1, 0x31, - 0x83, 0x32, 0x23, 0x5f, - 0xc7, 0x0c, 0x4a, 0x96, 0xd7, 0x73, 0xba, 0xe7, 0x9b, 0x30, 0x1c, 0x1c, - 0xeb, 0x9a, 0x71, 0x92, - 0x31, 0xda, 0xab, 0x2f, 0x59, 0x8a, 0xe5, 0x33, 0x8b, 0xaf, 0x2c, 0xaf, - 0xa7, 0x58, 0xef, 0xae, - 0xb6, 0xdf, 0xe7, 0x83, 0xd8, 0xef, 0x73, 0xf6, 0xbe, 0x54, 0x52, 0x42, - 0x99, 0xab, 0xe6, 0x8a, - 0x1b, 0x83, 0xf2, 0x4d, 0x1c, 0x41, 0xf8, 0x26, 0x66, 0x86, 0x7f, 0x71, - 0x46, 0x8f, 0x0d, 0x78, - 0x6b, 0x3f, 0x33, 0x1d, 0xfc, 0x1a, 0x71, 0x18, 0xeb, 0xe3, 0x1d, 0x1b, - 0x3c, 0x8e, 0x88, 0x0a, - 0xc7, 0x5c, 0x4e, 0x73, 0x31, 0x7d, 0xdd, 0x6a, 0xa4, 0x46, 0x95, 0x6d, - 0x03, 0x31, 0xa8, 0x06, - 0xea, 0xda, 0xb9, 0x24, 0x57, 0xcd, 0xa5, 0xae, 0x3d, 0x8a, 0x8e, 0x72, - 0xef, 0x97, 0x94, 0x22, - 0xc2, 0xde, 0xd3, 0x6f, 0x7e, 0xcd, 0x1d, 0x87, 0xb1, 0xf7, 0x0c, 0xca, - 0x95, 0xd7, 0xa9, 0x55, - 0x1f, 0x4a, 0x5f, 0x8e, 0xde, 0x7c, 0xbf, 0x1e, 0xbe, 0x09, 0xb3, 0x65, - 0x56, 0x0f, 0xf3, 0xa9, - 0xe7, 0x12, 0x0a, 0xef, 0x47, 0x0e, 0xaf, 0x76, 0x8d, 0xdf, 0x9a, 0x97, - 0x77, 0x5f, 0x72, 0x91, - 0xcf, 0xb9, 0x55, 0x75, 0xfa, 0x1c, 0xf4, 0x69, 0xd5, 0xc7, 0x04, 0xce, - 0xeb, 0x85, 0x5c, 0xf3, - 0xca, 0xd2, 0x95, 0xdb, 0x66, 0xf8, 0xc7, 0x7a, 0x56, 0x18, 0x16, 0x32, - 0x0c, 0x64, 0x1a, 0xa1, - 0x4c, 0x1f, 0x34, 0x79, 0x42, 0xd7, 0xb7, 0xaa, 0xf9, 0x1b, 0xcb, 0x6f, - 0xbb, 0x27, 0x59, 0x07, - 0x0f, 0x37, 0xc1, 0x91, 0x36, 0x2a, 0x38, 0x0f, 0x37, 0x16, 0xb3, 0xba, - 0x6e, 0x50, 0x4e, 0x2c, - 0xeb, 0xd7, 0x73, 0xea, 0xe9, 0xd7, 0xd3, 0xb4, 0xea, 0xb9, 0xea, 0xfc, - 0x9a, 0xbb, 0x1e, 0x9e, - 0xed, 0x89, 0x3f, 0xdc, 0x3d, 0x5b, 0xda, 0x1c, 0x17, 0x35, 0xce, 0x10, - 0x48, 0xc3, 0x44, 0xeb, - 0x65, 0xf7, 0x93, 0xc3, 0x2a, 0x56, 0x5e, 0x77, 0xdb, 0xaf, 0xd1, 0xcb, - 0x7e, 0x0d, 0x5e, 0xf6, - 0x9b, 0x5b, 0x6d, 0xbf, 0xa3, 0xd4, 0x97, 0x68, 0xa1, 0x12, 0xca, 0xbc, - 0xc5, 0x18, 0xdf, 0x7c, - 0x13, 0x35, 0x10, 0xdf, 0x24, 0xce, 0xcd, 0x37, 0xf1, 0xfa, 0x2e, 0xa2, - 0xc6, 0x7d, 0x33, 0x7a, - 0xce, 0xbb, 0x68, 0x35, 0x96, 0x67, 0xf1, 0xb0, 0x86, 0x83, 0x4c, 0xff, - 0xd9, 0x3b, 0x0e, 0x53, - 0xe3, 0x8d, 0xec, 0x98, 0x04, 0xad, 0x3d, 0x32, 0x4d, 0xab, 0xfc, 0x2b, - 0xc4, 0x05, 0xd3, 0x38, - 0xfa, 0x96, 0x8a, 0x29, 0x52, 0x11, 0xdb, 0x04, 0x29, 0x88, 0xf2, 0x2a, - 0xcf, 0x36, 0x61, 0xb7, - 0x9c, 0xca, 0xb1, 0x4d, 0xdc, 0xc7, 0x97, 0xbe, 0xa6, 0x8c, 0x21, 0x5e, - 0xfe, 0x82, 0x7f, 0xbe, - 0xc9, 0x98, 0x6c, 0x6d, 0x96, 0x7a, 0x20, 0xbe, 0x89, 0xde, 0xbc, 0x5e, - 0x5c, 0x08, 0xda, 0x35, - 0x57, 0x90, 0xef, 0x27, 0x21, 0xf2, 0x4d, 0xf4, 0xf3, 0x7e, 0x74, 0xf6, - 0x07, 0x24, 0x84, 0xa0, - 0x69, 0x15, 0xac, 0xe6, 0x15, 0x6d, 0x73, 0xc7, 0x2e, 0xfe, 0xf4, 0x5c, - 0xec, 0xae, 0x38, 0x2c, - 0xb1, 0x40, 0xbf, 0xcf, 0xac, 0xcf, 0x5f, 0x08, 0x57, 0xcd, 0x2b, 0x16, - 0x31, 0xcc, 0xd6, 0xce, - 0x0d, 0x96, 0x93, 0xaa, 0x35, 0x13, 0xe4, 0xa6, 0xc5, 0x83, 0xee, 0x63, - 0xf8, 0x77, 0xe3, 0x07, - 0x49, 0x6f, 0x25, 0xdb, 0xe2, 0x73, 0x5d, 0xf1, 0xb1, 0xbf, 0x7a, 0x56, - 0x24, 0x49, 0x82, 0xb8, - 0x36, 0x38, 0x0f, 0xd7, 0x95, 0xd7, 0x0b, 0xde, 0xaf, 0x97, 0x9e, 0x9b, - 0xa9, 0x47, 0x97, 0xdd, - 0x57, 0x5e, 0x8f, 0xe9, 0xb9, 0x78, 0xf7, 0x25, 0x8f, 0x0d, 0x9e, 0x5f, - 0x73, 0xe7, 0xf5, 0xfc, - 0xea, 0xb2, 0x8f, 0x93, 0xdf, 0xa2, 0x58, 0x71, 0xdb, 0xaf, 0x66, 0xc3, - 0xbc, 0x97, 0x0d, 0x73, - 0x6e, 0x1b, 0x36, 0xba, 0x6d, 0xf8, 0x35, 0x5a, 0x6c, 0x0d, 0x57, 0x6e, - 0x9b, 0xc5, 0x1e, 0xf1, - 0x1c, 0x3b, 0xbf, 0xb4, 0x5c, 0xa1, 0xcf, 0x9c, 0x92, 0xbb, 0x6e, 0xe2, - 0xc5, 0x7d, 0xf3, 0x3e, - 0x16, 0x4c, 0xfb, 0x99, 0xe9, 0x62, 0x55, 0xfb, 0x51, 0x5a, 0x3d, 0x2c, - 0x63, 0x38, 0xe3, 0xca, - 0x07, 0xd2, 0x73, 0xa9, 0x3e, 0x26, 0xc1, 0x62, 0x97, 0x60, 0xfd, 0xfd, - 0xa6, 0x0f, 0xe8, 0x10, - 0xd5, 0x44, 0x4d, 0x8a, 0x6b, 0x0b, 0x8a, 0xc0, 0x36, 0x71, 0x6d, 0x4a, - 0xa8, 0x42, 0x28, 0x51, - 0x61, 0xc3, 0x2d, 0x06, 0x9c, 0x7c, 0x4b, 0x79, 0x9f, 0xf8, 0x3e, 0x26, - 0x5e, 0x3a, 0xf8, 0x7a, - 0xf9, 0x26, 0xea, 0xff, 0x68, 0x36, 0x6d, 0x50, 0x9f, 0x59, 0xeb, 0xb5, - 0x1f, 0x99, 0x9e, 0x97, - 0x94, 0x93, 0x1a, 0x90, 0x6f, 0x02, 0xb1, 0x4b, 0xb8, 0x38, 0x2e, 0xba, - 0x35, 0x2a, 0xe2, 0xf5, - 0xcf, 0xa0, 0x74, 0xc5, 0xd2, 0x01, 0xf9, 0x26, 0x69, 0x1a, 0x57, 0xde, - 0xc5, 0x37, 0x89, 0xf4, - 0xc7, 0x37, 0x09, 0xa7, 0x26, 0xb5, 0xfe, 0xd9, 0xb4, 0x7c, 0x66, 0x41, - 0x4a, 0x9d, 0x6b, 0x63, - 0x35, 0x57, 0x0d, 0xae, 0xb9, 0x6d, 0xc6, 0xa6, 0x0d, 0x4e, 0x71, 0xb2, - 0x9e, 0xe4, 0x94, 0x9c, - 0x64, 0xf7, 0x8c, 0x24, 0xc6, 0x57, 0x73, 0xf5, 0xe2, 0x79, 0x61, 0x21, - 0xe3, 0x0f, 0xc1, 0xdf, - 0x31, 0x28, 0x0f, 0x57, 0x4a, 0xe4, 0x32, 0xf2, 0x93, 0x82, 0xe6, 0x5f, - 0xd9, 0xec, 0xd7, 0x0c, - 0x9b, 0x8e, 0x7e, 0xbd, 0xe2, 0x20, 0x39, 0x2c, 0xf8, 0x2e, 0xac, 0xde, - 0xcc, 0x78, 0x02, 0x35, - 0xf2, 0x6b, 0x3e, 0xfc, 0x75, 0x2d, 0xb7, 0x6d, 0xf5, 0x3d, 0xe3, 0xec, - 0x03, 0x79, 0x48, 0xb5, - 0xfd, 0x9a, 0x5c, 0xf6, 0x5b, 0x6d, 0xc3, 0x54, 0xa1, 0x2e, 0xfb, 0xd5, - 0x6c, 0x18, 0x83, 0x0d, - 0xbf, 0x45, 0xc7, 0xd9, 0xd3, 0x8c, 0xe1, 0xd4, 0xa8, 0x70, 0xf5, 0xe5, - 0x04, 0xe6, 0x9b, 0x24, - 0xd8, 0xe2, 0x8c, 0x4c, 0xf3, 0x19, 0xfe, 0x2e, 0x3e, 0xeb, 0x1e, 0x2e, - 0xbd, 0xd4, 0xda, 0xbd, - 0x38, 0xde, 0xd7, 0xeb, 0xc4, 0x3a, 0x35, 0xa4, 0xb0, 0xf4, 0xf1, 0x9a, - 0x3e, 0x26, 0x39, 0x8a, - 0x42, 0x65, 0x45, 0xd6, 0xb6, 0xa4, 0x48, 0xee, 0x6d, 0xa1, 0x16, 0xd7, - 0x26, 0xa2, 0x22, 0x52, - 0xd7, 0x36, 0xd3, 0xa1, 0xca, 0x87, 0x24, 0xe8, 0x31, 0x11, 0xe3, 0x35, - 0x5c, 0x60, 0xd7, 0xea, - 0xf4, 0x40, 0x73, 0x26, 0x5d, 0x1c, 0xc4, 0x7f, 0xde, 0x6c, 0x5a, 0x4f, - 0xbe, 0x9f, 0xf9, 0xcc, - 0x7e, 0xf5, 0x5c, 0x5c, 0xf3, 0x3f, 0xb5, 0xd8, 0xc5, 0x63, 0x73, 0x7e, - 0x62, 0x17, 0x37, 0x2e, - 0xe8, 0xf2, 0xd3, 0xc3, 0x5a, 0xf3, 0xaa, 0x73, 0x6d, 0xac, 0xc5, 0x37, - 0xd1, 0xa1, 0xe7, 0x12, - 0x52, 0xfc, 0x1e, 0xce, 0x39, 0xac, 0x72, 0x72, 0x30, 0x4e, 0xac, 0xd6, - 0x97, 0x1c, 0x6f, 0x4f, - 0xc9, 0x65, 0x3d, 0xc8, 0x1a, 0x3f, 0x83, 0xcd, 0xd0, 0x28, 0x70, 0xf1, - 0x34, 0xe0, 0xbe, 0xdc, - 0xea, 0xeb, 0x2d, 0xd8, 0x96, 0x1e, 0x1e, 0x9a, 0x96, 0xd7, 0xcb, 0xd3, - 0x97, 0xd7, 0x4b, 0x0d, - 0x43, 0xcf, 0xaa, 0xbb, 0x7f, 0xde, 0xc8, 0x6c, 0xc0, 0x7b, 0x2e, 0xbc, - 0xcf, 0x39, 0x93, 0xcc, - 0x06, 0xac, 0xd1, 0x06, 0x5f, 0x79, 0x98, 0x8f, 0xe5, 0x1c, 0xa2, 0xc8, - 0xb2, 0xdb, 0x86, 0xa5, - 0x6a, 0x1b, 0xf6, 0xd8, 0xaf, 0xa5, 0xda, 0x7e, 0x45, 0x6a, 0x56, 0x87, - 0xd2, 0x09, 0xf6, 0x0c, - 0x63, 0x58, 0xe7, 0x2d, 0xd6, 0xba, 0x36, 0x56, 0xcf, 0x0f, 0xf6, 0xd2, - 0xc1, 0xf7, 0xe8, 0x3f, - 0xc7, 0xd9, 0xe3, 0x38, 0xa6, 0x83, 0x1f, 0xcc, 0xbf, 0x66, 0xe7, 0xb8, - 0x96, 0x2b, 0x18, 0x57, - 0xb3, 0x2f, 0xd1, 0xbb, 0x2f, 0x59, 0x97, 0x1e, 0x6f, 0x30, 0xad, 0x7a, - 0xd3, 0x67, 0x14, 0xc9, - 0x4e, 0xea, 0x94, 0x1d, 0xd4, 0x21, 0x3b, 0x88, 0x5d, 0xb6, 0x53, 0xbb, - 0x6c, 0xd3, 0xb6, 0x4d, - 0xb1, 0x52, 0xab, 0x0c, 0x5b, 0x51, 0xa9, 0x2a, 0xc3, 0x06, 0x9c, 0xcc, - 0x51, 0x26, 0x92, 0x64, - 0x9d, 0xb3, 0xe6, 0x5c, 0xe7, 0xa8, 0xef, 0xfc, 0x9a, 0x8b, 0x6f, 0x92, - 0x31, 0x82, 0xcd, 0x95, - 0x0f, 0xcc, 0x37, 0xf9, 0xdf, 0xcc, 0xa6, 0xf5, 0x99, 0xef, 0x17, 0x02, - 0xeb, 0xe0, 0xfb, 0x9a, - 0x1f, 0x1c, 0x76, 0x5c, 0x08, 0x41, 0xa3, 0x22, 0xe0, 0xb5, 0x51, 0xf0, - 0x70, 0xe5, 0xb3, 0x87, - 0xd5, 0xcc, 0x15, 0xd6, 0xd5, 0xc1, 0x8f, 0xb2, 0x82, 0x9f, 0xae, 0x23, - 0xcf, 0xac, 0xbb, 0x97, - 0x5d, 0xd7, 0x6c, 0xda, 0x54, 0x63, 0x70, 0x4e, 0x2c, 0x7c, 0x4f, 0x17, - 0x0f, 0x97, 0x8b, 0x12, - 0x01, 0x3f, 0x64, 0xad, 0xa6, 0x35, 0x8a, 0xf5, 0xe6, 0x69, 0xbd, 0xc9, - 0xd5, 0x7d, 0xc9, 0x09, - 0xb9, 0xec, 0x3e, 0x8d, 0x6f, 0x42, 0x03, 0xf1, 0x4d, 0x58, 0x5e, 0x2f, - 0x6e, 0x54, 0xf0, 0xd8, - 0x20, 0x6b, 0x44, 0x72, 0xd8, 0x34, 0x2a, 0xea, 0xe8, 0xb2, 0xd7, 0xd4, - 0x73, 0x19, 0x5b, 0x33, - 0x2e, 0xf4, 0xa5, 0xe7, 0xf2, 0x99, 0x84, 0xc0, 0x7e, 0x9d, 0xcc, 0x7e, - 0x61, 0xdb, 0x89, 0x5d, - 0xb1, 0x53, 0x1b, 0xd8, 0xb1, 0x4d, 0xb1, 0xb9, 0xec, 0x17, 0xb6, 0x66, - 0xbf, 0xb0, 0x15, 0x25, - 0x87, 0x7e, 0xec, 0xcc, 0x34, 0xf8, 0xc8, 0xeb, 0x5d, 0x66, 0x6f, 0x5a, - 0xe0, 0x6b, 0xa3, 0xa7, - 0x6e, 0x92, 0xe0, 0x70, 0xd7, 0x3b, 0xdc, 0x75, 0x8f, 0xa0, 0x3e, 0x8a, - 0x66, 0xa3, 0xae, 0x98, - 0x52, 0xf3, 0x29, 0x47, 0xd7, 0x9d, 0xd5, 0x90, 0xe6, 0xe6, 0xca, 0xfb, - 0xcd, 0xaf, 0xe9, 0xe9, - 0xef, 0x37, 0x4d, 0xa6, 0xa2, 0x3c, 0x9a, 0x8e, 0x96, 0x8b, 0x68, 0x51, - 0xf5, 0x2e, 0xa0, 0x05, - 0xd5, 0x3b, 0x9f, 0xe6, 0xcb, 0x79, 0x34, 0xcf, 0xbd, 0x91, 0xfc, 0x39, - 0xb9, 0xdc, 0x7e, 0xbd, - 0x3a, 0x7d, 0xc9, 0x63, 0x3d, 0xb8, 0x9e, 0x39, 0xdc, 0x3f, 0xdf, 0x24, - 0xcc, 0xb3, 0x69, 0xc3, - 0xd1, 0xc7, 0xeb, 0xee, 0x73, 0x88, 0x73, 0xa4, 0x69, 0xb1, 0x4b, 0xa0, - 0xf9, 0xc1, 0x0c, 0xd7, - 0x5d, 0xf9, 0xfe, 0x60, 0xb5, 0xf0, 0x98, 0x10, 0x34, 0xad, 0xc2, 0xa4, - 0x51, 0x01, 0xb1, 0x81, - 0x36, 0x6b, 0x0e, 0x7c, 0xa4, 0xc0, 0x7c, 0x93, 0xb4, 0x1c, 0xf6, 0x9e, - 0x01, 0xf9, 0x26, 0xba, - 0xfd, 0x05, 0x9d, 0xb8, 0x60, 0xd3, 0x91, 0x63, 0x73, 0xe7, 0xf5, 0xe2, - 0x6b, 0xcf, 0x66, 0x14, - 0xdd, 0xb9, 0x42, 0xaf, 0xbe, 0x64, 0xb6, 0xd3, 0x5c, 0x7d, 0xc9, 0x6e, - 0xcd, 0xb1, 0xba, 0xf5, - 0x70, 0x2d, 0xaf, 0xa7, 0xa3, 0x77, 0x4e, 0x7f, 0xbf, 0x9e, 0xce, 0x79, - 0x8b, 0x7e, 0x35, 0x2a, - 0x3c, 0x7d, 0xc9, 0xc9, 0x06, 0x76, 0x3e, 0x66, 0xf9, 0xd1, 0x73, 0x99, - 0x2c, 0x89, 0x60, 0xbf, - 0xa3, 0xbd, 0xec, 0xb7, 0xc8, 0xcb, 0x7e, 0x0b, 0xc0, 0x7e, 0xf3, 0xab, - 0xed, 0x37, 0x4f, 0x46, - 0xf4, 0x33, 0x67, 0x56, 0xee, 0x5f, 0x3d, 0x87, 0xb5, 0x6e, 0xfd, 0x3d, - 0x9e, 0x8b, 0x53, 0xa2, - 0xf8, 0x28, 0x29, 0x1a, 0xc5, 0xd8, 0xe2, 0xb8, 0xa0, 0xc7, 0xa4, 0xb6, - 0xbf, 0xc0, 0xf2, 0xa6, - 0x1e, 0x9f, 0xb2, 0xd6, 0xdc, 0x09, 0x7f, 0xf9, 0x35, 0x5d, 0xfd, 0xfd, - 0xa6, 0xaf, 0xe1, 0x5a, - 0xf1, 0x01, 0x19, 0x2f, 0x8d, 0xa7, 0xe3, 0xa5, 0xf7, 0xe9, 0xfb, 0x6c, - 0xcb, 0xe3, 0xc8, 0x38, - 0x69, 0x1c, 0x1d, 0x27, 0x8f, 0xa5, 0x63, 0x25, 0xd8, 0xf2, 0x18, 0x3a, - 0x46, 0xdb, 0xc5, 0x80, - 0x95, 0x93, 0x49, 0x18, 0x8e, 0x89, 0x56, 0x37, 0x61, 0x5c, 0x79, 0xf6, - 0xd9, 0xeb, 0xe6, 0xd7, - 0xbc, 0xf9, 0x26, 0x31, 0xba, 0xb8, 0xf2, 0x51, 0x61, 0xd7, 0xae, 0xd1, - 0xd9, 0xc7, 0x9b, 0x9f, - 0x10, 0x94, 0x6f, 0xa2, 0xe5, 0xf5, 0x54, 0x88, 0x5d, 0x84, 0x00, 0x73, - 0x6b, 0x42, 0xd1, 0xb4, - 0x0a, 0xb9, 0xbf, 0xdf, 0x6f, 0xbf, 0x9e, 0x4b, 0xab, 0xbe, 0x2e, 0xdf, - 0xc4, 0x58, 0x5b, 0x07, - 0x5f, 0xe3, 0x9b, 0x14, 0xf8, 0xd1, 0x73, 0xf9, 0x2b, 0x7a, 0xd9, 0xe1, - 0x7b, 0x06, 0xe5, 0xc4, - 0xc2, 0x7b, 0x32, 0xee, 0x85, 0xdf, 0xeb, 0x94, 0xa7, 0x2f, 0xd9, 0x01, - 0x31, 0x25, 0x9c, 0x57, - 0x97, 0xfa, 0x92, 0x5d, 0x3d, 0x35, 0x2e, 0xae, 0xeb, 0xa5, 0x9c, 0x52, - 0xac, 0x96, 0xd7, 0xd3, - 0x31, 0xb7, 0xbd, 0x38, 0xbc, 0xf3, 0x16, 0x83, 0xe7, 0xb6, 0x5d, 0x39, - 0x36, 0x56, 0x4b, 0xf0, - 0x95, 0x5f, 0xfb, 0x46, 0xb2, 0x91, 0x0f, 0xa4, 0xf1, 0x9a, 0x0d, 0xbf, - 0xef, 0xb2, 0x61, 0x97, - 0xfd, 0xc2, 0x1e, 0xeb, 0xb6, 0xe1, 0x31, 0x6e, 0x1b, 0x2e, 0x96, 0x45, - 0x3a, 0xd9, 0x99, 0x9d, - 0x1b, 0xb6, 0xde, 0x34, 0x9d, 0x3a, 0x2d, 0x09, 0xce, 0x78, 0x63, 0xec, - 0x25, 0xee, 0x1b, 0xb9, - 0xa2, 0x63, 0xc2, 0xe2, 0x6b, 0x6b, 0x92, 0x91, 0xe1, 0x46, 0x66, 0x0d, - 0xff, 0x38, 0xb3, 0x8e, - 0x0e, 0x7e, 0x50, 0x5c, 0x30, 0x4d, 0x27, 0xa3, 0xa5, 0x4f, 0xc9, 0xa7, - 0xd2, 0x27, 0xe4, 0x13, - 0xd8, 0x13, 0xa5, 0x89, 0x14, 0x36, 0xf9, 0x58, 0xfa, 0x98, 0x7e, 0x24, - 0x7d, 0xa4, 0xed, 0x0f, - 0xa5, 0x0f, 0xb5, 0x3d, 0x41, 0x9a, 0x40, 0xed, 0xd2, 0x37, 0x24, 0x26, - 0x3c, 0xf9, 0x7e, 0xca, - 0x6a, 0x0c, 0xac, 0x27, 0xab, 0xc6, 0xfc, 0xe0, 0x71, 0xb5, 0xae, 0x71, - 0x10, 0x87, 0xb1, 0xb8, - 0x1f, 0x62, 0x17, 0x3e, 0x60, 0xec, 0xf2, 0x3f, 0x98, 0x4d, 0x5b, 0x37, - 0xdf, 0xef, 0x27, 0xbf, - 0xe6, 0xe1, 0x9b, 0xe4, 0x05, 0xd0, 0x5f, 0x0c, 0x49, 0xd3, 0x2a, 0x8c, - 0xda, 0xb3, 0xfe, 0xaf, - 0x8d, 0xd5, 0x75, 0x93, 0x94, 0xa2, 0xac, 0x80, 0x7c, 0x13, 0x2d, 0x0e, - 0xd3, 0xe1, 0x33, 0x87, - 0xd4, 0xcb, 0x9e, 0x97, 0x99, 0x13, 0xb4, 0x16, 0x0e, 0xef, 0xc9, 0x8e, - 0x73, 0xb0, 0xf3, 0x31, - 0x02, 0xde, 0x93, 0xe5, 0x12, 0x2f, 0x69, 0xa0, 0x00, 0x0e, 0x7a, 0xfa, - 0x92, 0x8b, 0x5c, 0x31, - 0x25, 0xfb, 0x2e, 0xac, 0x4f, 0x36, 0xd5, 0xa5, 0x69, 0x4a, 0x02, 0xe2, - 0x42, 0x71, 0x78, 0x7b, - 0x56, 0x75, 0x6b, 0xd5, 0x0b, 0x97, 0xf8, 0x26, 0xde, 0x7a, 0x2e, 0x33, - 0xa4, 0xd1, 0x60, 0xbf, - 0x9f, 0x32, 0xfb, 0xa5, 0x9f, 0x80, 0xed, 0xba, 0x6c, 0xf8, 0x63, 0xb0, - 0xe1, 0x8f, 0xdc, 0x36, - 0xfc, 0xa1, 0xdb, 0x86, 0x27, 0xd0, 0x09, 0x10, 0x17, 0x7f, 0x03, 0xf8, - 0x97, 0x1c, 0x5c, 0x33, - 0x2a, 0x8c, 0x35, 0xaf, 0x48, 0x92, 0x98, 0x17, 0x6f, 0x08, 0x81, 0xfb, - 0x16, 0xfc, 0x98, 0x98, - 0x59, 0xec, 0x92, 0x39, 0x8c, 0xe5, 0x01, 0x02, 0xd5, 0x4d, 0x34, 0xae, - 0x65, 0x41, 0x82, 0xff, - 0xd8, 0xc5, 0x34, 0x9b, 0x4e, 0xb0, 0x4c, 0xa1, 0x93, 0xa5, 0x29, 0x64, - 0xb2, 0x65, 0x32, 0xdc, - 0x4e, 0x26, 0x5f, 0x48, 0x5f, 0xd0, 0x2f, 0xa5, 0x2f, 0xc8, 0x17, 0x96, - 0x49, 0x64, 0x92, 0xf4, - 0x39, 0x9d, 0x24, 0x4d, 0x22, 0x9f, 0x4b, 0x9f, 0x93, 0xcf, 0xa4, 0xcf, - 0xe8, 0x68, 0x69, 0x06, - 0x09, 0xd7, 0x31, 0xa9, 0xa3, 0x5d, 0x53, 0x5b, 0xcf, 0x65, 0xdc, 0xa5, - 0x18, 0x39, 0x18, 0xdf, - 0x24, 0x9c, 0x7d, 0xbc, 0x7a, 0x67, 0xd3, 0x06, 0xd4, 0xae, 0xf1, 0xc3, - 0x37, 0xf1, 0xa5, 0xe7, - 0xa2, 0xe1, 0x3a, 0xcb, 0xeb, 0xe9, 0x9e, 0xcf, 0x1c, 0x15, 0x26, 0xed, - 0x9a, 0x10, 0x66, 0x4a, - 0xd9, 0x63, 0x73, 0x83, 0xd5, 0x4d, 0xd8, 0x9c, 0xb2, 0xe0, 0x9c, 0x82, - 0x74, 0x9d, 0xba, 0x9b, - 0x59, 0x23, 0xf5, 0x68, 0xdd, 0xb1, 0xbc, 0x5e, 0x50, 0x9f, 0xd9, 0xca, - 0x62, 0xe9, 0xb8, 0x5a, - 0x7c, 0x13, 0xcd, 0xc7, 0xd5, 0xf8, 0x26, 0x1a, 0x47, 0x83, 0xc5, 0xfa, - 0xf0, 0xb3, 0xab, 0xb6, - 0xcf, 0xf4, 0x9f, 0xfd, 0xd4, 0xc3, 0xdd, 0xf9, 0xfe, 0xa8, 0xbf, 0x73, - 0x0e, 0xab, 0xe4, 0x3f, - 0x87, 0xc5, 0xf2, 0x6b, 0x73, 0x2c, 0x13, 0xc8, 0x14, 0x0b, 0xe3, 0x7e, - 0x4c, 0x66, 0x36, 0x4c, - 0x26, 0x33, 0xdb, 0x95, 0xbe, 0x04, 0xfb, 0xfd, 0xc2, 0x6d, 0xbb, 0x9a, - 0x1d, 0xc3, 0xed, 0x67, - 0x60, 0xc3, 0xa3, 0xe9, 0x0c, 0xc0, 0xbf, 0x84, 0xbf, 0xb9, 0x67, 0x35, - 0x29, 0x3f, 0xde, 0x10, - 0x65, 0x0e, 0xfc, 0x5a, 0x97, 0x93, 0xef, 0xf7, 0xfe, 0x7c, 0x2c, 0xa6, - 0x74, 0xe9, 0x9d, 0x7a, - 0xd7, 0x4d, 0xd8, 0x79, 0xea, 0xe1, 0xde, 0xf8, 0x98, 0x1f, 0x6c, 0x9a, - 0x4f, 0x27, 0x59, 0xbe, - 0x23, 0xdf, 0x59, 0xbe, 0xa5, 0xdf, 0x6a, 0x7b, 0x1a, 0x9d, 0x66, 0x99, - 0x46, 0xbe, 0xb1, 0x7c, - 0x43, 0x61, 0x93, 0xaf, 0x2d, 0x5f, 0xc3, 0xfe, 0x8a, 0x4e, 0xb5, 0x7c, - 0x45, 0xa6, 0x5a, 0xa6, - 0xd2, 0x0f, 0xc5, 0x65, 0xe4, 0x3c, 0x0d, 0xba, 0x88, 0x7b, 0x5f, 0xe9, - 0xe3, 0x88, 0x8e, 0x1d, - 0xca, 0x7b, 0x92, 0x10, 0x1f, 0x17, 0x8e, 0xef, 0x49, 0x42, 0xdc, 0xe1, - 0x7c, 0xcf, 0xbf, 0xea, - 0xef, 0x74, 0x25, 0xdf, 0xc3, 0xc7, 0xef, 0x7f, 0x86, 0x75, 0x0e, 0xd6, - 0x59, 0x7a, 0x86, 0x9e, - 0xa6, 0x3f, 0xd1, 0x93, 0xf4, 0x38, 0x3d, 0x4a, 0x8e, 0xd2, 0xc3, 0xf4, - 0x20, 0xad, 0xa2, 0x7b, - 0x69, 0x25, 0x2d, 0xa7, 0x65, 0x74, 0x17, 0xdd, 0x4e, 0xb7, 0xd2, 0xcd, - 0x74, 0x13, 0xdd, 0x48, - 0x37, 0xd0, 0xf5, 0x9e, 0x45, 0x36, 0xc0, 0xff, 0x36, 0xc1, 0xda, 0x0c, - 0xbf, 0xdd, 0x46, 0x77, - 0xc0, 0xe3, 0xca, 0xe8, 0x6e, 0x5a, 0x41, 0xf7, 0xc0, 0x33, 0xab, 0xe8, - 0x7e, 0x78, 0x8d, 0x43, - 0xe4, 0x30, 0x3d, 0x42, 0x8e, 0xd0, 0xa3, 0xd5, 0xeb, 0xd8, 0xa5, 0x45, - 0x8e, 0xd3, 0xe3, 0xb0, - 0x4f, 0x90, 0x13, 0xb0, 0x4f, 0xd2, 0x93, 0xb0, 0x7f, 0x22, 0x3f, 0xd1, - 0x53, 0xe4, 0x14, 0x3d, - 0x4d, 0x4e, 0xd3, 0x33, 0xe4, 0x0c, 0x3d, 0x4b, 0xce, 0xc2, 0x67, 0x3b, - 0xe7, 0x5a, 0x04, 0x3e, - 0x2d, 0xdb, 0xee, 0xf5, 0xb7, 0x9e, 0x43, 0x3e, 0xd7, 0x2a, 0xf0, 0x53, - 0xbe, 0xb3, 0x7c, 0xe7, - 0xb6, 0xdf, 0x6f, 0x99, 0xfd, 0xc2, 0xfe, 0xc6, 0x6d, 0xc3, 0x5f, 0x6b, - 0x36, 0xfc, 0x15, 0xd8, - 0x2e, 0x6c, 0xb0, 0xe1, 0x0f, 0xc9, 0x1c, 0xc0, 0xbf, 0x70, 0xea, 0x37, - 0xe9, 0xe9, 0x65, 0x4f, - 0x2e, 0x88, 0xcf, 0x0d, 0xa6, 0xf9, 0x1c, 0x62, 0xbe, 0x3f, 0x40, 0x1d, - 0xf0, 0x52, 0xdd, 0xa4, - 0x46, 0xae, 0x70, 0xac, 0x8f, 0xfc, 0x9a, 0x69, 0x09, 0x1c, 0xa7, 0x39, - 0x74, 0x8e, 0x38, 0x87, - 0xce, 0xb6, 0xcc, 0xa6, 0xb3, 0xc5, 0x59, 0x74, 0x96, 0x05, 0xb6, 0x38, - 0x93, 0xce, 0x84, 0xfd, - 0xbd, 0xe5, 0x7b, 0xd8, 0x33, 0xe8, 0x0c, 0xd8, 0xd3, 0x2d, 0xd3, 0xe9, - 0x24, 0x71, 0x35, 0xbd, - 0x78, 0x75, 0x5d, 0x5d, 0x61, 0x5e, 0x7f, 0xc2, 0xfa, 0x83, 0xfe, 0x97, - 0xfe, 0x87, 0xfe, 0x4e, - 0x2f, 0xd0, 0xdf, 0xe8, 0x2f, 0x60, 0xd7, 0xe7, 0xdc, 0x68, 0x78, 0x02, - 0x50, 0xea, 0x08, 0x3d, - 0x44, 0x0f, 0x68, 0x58, 0xb8, 0x07, 0x90, 0xad, 0x1c, 0xf0, 0xad, 0xac, - 0x7a, 0xed, 0x86, 0xff, - 0x57, 0x00, 0x46, 0xee, 0xa1, 0xfb, 0xe0, 0x11, 0x07, 0x00, 0xef, 0x00, - 0xed, 0xe0, 0x39, 0x27, - 0x00, 0x47, 0x01, 0xc3, 0xe0, 0x55, 0x18, 0x76, 0xb9, 0x90, 0xea, 0x17, - 0xf7, 0xfa, 0xb5, 0xc6, - 0xfa, 0xcd, 0xbd, 0x2e, 0x68, 0xeb, 0x77, 0x6d, 0xfd, 0x07, 0xd6, 0x7f, - 0xb5, 0xf5, 0x87, 0x7b, - 0xfd, 0x59, 0x63, 0xfd, 0x73, 0x8e, 0xdd, 0x06, 0xf1, 0x1b, 0x3a, 0x47, - 0xb3, 0x61, 0x66, 0xbf, - 0xb3, 0xdd, 0xf6, 0x3b, 0x8b, 0xce, 0xb4, 0x30, 0x1b, 0xfe, 0x5e, 0xb3, - 0xe1, 0x19, 0x9a, 0x0d, - 0x4f, 0x07, 0x1b, 0x9e, 0x44, 0x4b, 0x1c, 0x99, 0x86, 0x24, 0x35, 0xd6, - 0xaf, 0x9e, 0xcb, 0xa5, - 0x5e, 0xf6, 0x84, 0xb0, 0xcd, 0x5b, 0x4c, 0xc9, 0x8f, 0xcf, 0x0d, 0x16, - 0x37, 0x86, 0xd2, 0xdf, - 0x1f, 0x8a, 0xce, 0x57, 0x9a, 0x23, 0x7e, 0x54, 0x52, 0x9d, 0x79, 0xdd, - 0xee, 0x38, 0xcc, 0xba, - 0xd2, 0x38, 0x4b, 0x5c, 0x44, 0x16, 0x89, 0x0b, 0xc9, 0x42, 0x71, 0x21, - 0x5d, 0x20, 0x96, 0x68, - 0xbb, 0x44, 0xdb, 0xf3, 0xe9, 0x7c, 0x71, 0x3e, 0x99, 0x27, 0xce, 0x83, - 0x3d, 0x97, 0xce, 0x15, - 0xe7, 0x92, 0x6f, 0xc4, 0x35, 0xe4, 0x13, 0x7a, 0x75, 0x5d, 0x5d, 0xe1, - 0x5d, 0x13, 0xdd, 0xeb, - 0x63, 0xfa, 0x11, 0xac, 0x0f, 0xe9, 0x04, 0xfa, 0x01, 0xac, 0xf7, 0x61, - 0x8d, 0xa3, 0x63, 0x60, - 0x8d, 0xa6, 0x45, 0xb4, 0x90, 0x16, 0xd0, 0x7c, 0x9a, 0x07, 0xcb, 0x49, - 0x1d, 0x35, 0x96, 0x13, - 0x56, 0x1e, 0xfc, 0xae, 0x00, 0x56, 0x21, 0x3c, 0x72, 0x34, 0x2d, 0x86, - 0xe7, 0x8c, 0x85, 0xe7, - 0xb2, 0x57, 0x18, 0xaf, 0xbd, 0xd6, 0x04, 0x58, 0x1f, 0xd6, 0x59, 0x1f, - 0xf9, 0x5c, 0x1f, 0x6b, - 0x6b, 0xa2, 0xcf, 0xf5, 0xcf, 0x3b, 0x76, 0x1b, 0xcc, 0xb3, 0xe8, 0x22, - 0xb0, 0x61, 0x66, 0xbf, - 0x0b, 0xc5, 0x05, 0x60, 0xb7, 0x0b, 0xdc, 0xf6, 0x5b, 0xc2, 0xec, 0x17, - 0xf6, 0x3c, 0xcd, 0x86, - 0x99, 0xfd, 0xce, 0x05, 0xac, 0x5c, 0x0a, 0xfe, 0x1f, 0x8b, 0xf7, 0x03, - 0xf1, 0x4d, 0x42, 0xc9, - 0x61, 0xe9, 0x99, 0xc3, 0x9a, 0x92, 0x17, 0x17, 0x54, 0x7b, 0xb6, 0x46, - 0x1f, 0x6f, 0x18, 0x67, - 0x58, 0x54, 0xd7, 0x01, 0x59, 0xde, 0x54, 0xd3, 0x1c, 0xf2, 0xaa, 0x53, - 0x3a, 0xd7, 0xe6, 0x2e, - 0x14, 0x57, 0xd2, 0x95, 0xe6, 0x95, 0x64, 0x85, 0xb8, 0x82, 0xae, 0x30, - 0x2f, 0x27, 0xcb, 0xc5, - 0xe5, 0x64, 0x99, 0xb8, 0x8c, 0x2e, 0x13, 0x97, 0x92, 0xa5, 0xb0, 0x97, - 0x88, 0x4b, 0x28, 0x6c, - 0xb2, 0x58, 0x5c, 0x0c, 0xd7, 0x97, 0x15, 0xc1, 0xbf, 0xc3, 0xd5, 0x75, - 0x75, 0x5d, 0x5d, 0x7f, - 0xdb, 0xfa, 0xd1, 0xbc, 0x90, 0xae, 0x14, 0x57, 0x92, 0x95, 0xe6, 0x15, - 0x64, 0x05, 0x6c, 0xb0, - 0x5f, 0xba, 0x5c, 0x5c, 0xc6, 0x6c, 0x98, 0xd9, 0x2f, 0x5d, 0x0a, 0xb6, - 0xeb, 0xb2, 0xe1, 0xc5, - 0x60, 0xc3, 0xb3, 0xc9, 0x2a, 0x7b, 0x86, 0xc1, 0xd7, 0xfc, 0x60, 0x6f, - 0x1d, 0x7c, 0xd7, 0x5c, - 0xb5, 0xc8, 0x30, 0x69, 0x52, 0xa7, 0x1a, 0x53, 0x9c, 0x31, 0x06, 0x5d, - 0xdf, 0x46, 0xaa, 0x9b, - 0xd7, 0x0b, 0x7b, 0x1f, 0xaf, 0x37, 0xdf, 0x44, 0xdd, 0x6c, 0x5c, 0x65, - 0xde, 0x40, 0xd6, 0x9b, - 0xd7, 0xd3, 0xf5, 0xe6, 0x75, 0x64, 0x9d, 0xb6, 0xd7, 0x92, 0xb5, 0xb0, - 0x7f, 0x34, 0xff, 0x08, - 0xc7, 0x76, 0x0d, 0x59, 0x03, 0x7b, 0x35, 0xc4, 0xbd, 0xab, 0xcd, 0xab, - 0xc9, 0x22, 0xb8, 0xef, - 0xea, 0x19, 0x77, 0x75, 0x5d, 0x5d, 0xff, 0x9c, 0xb5, 0xc9, 0xb4, 0x8a, - 0x6c, 0x30, 0xaf, 0x67, - 0x36, 0xcc, 0xec, 0x97, 0x32, 0x1b, 0x06, 0xfb, 0xa5, 0x6b, 0xcd, 0x3f, - 0x32, 0x1b, 0x66, 0xf6, - 0x4b, 0xd7, 0x80, 0xed, 0x82, 0xfd, 0x82, 0x0d, 0x2f, 0x22, 0x6b, 0x95, - 0x24, 0x2e, 0xa0, 0x9e, - 0x0b, 0xeb, 0x5f, 0x2d, 0xcc, 0x1a, 0x99, 0x66, 0x8f, 0xc9, 0x0d, 0xd8, - 0xf3, 0x69, 0x8e, 0xd1, - 0xad, 0xdf, 0x94, 0xe2, 0x88, 0xd6, 0x85, 0x7f, 0x7f, 0xdb, 0x6c, 0xda, - 0xea, 0xb5, 0x9d, 0x6e, - 0x34, 0x6d, 0x23, 0xdb, 0x4c, 0xdb, 0xe8, 0x36, 0xf3, 0x36, 0xb2, 0xd5, - 0xbc, 0x55, 0xdb, 0x5b, - 0xcc, 0x5b, 0xc8, 0x16, 0xd3, 0x66, 0xb2, 0xd9, 0xcc, 0xf6, 0x26, 0xb2, - 0x49, 0xdb, 0x1b, 0xc9, - 0x2a, 0xd3, 0xa6, 0xab, 0xfe, 0xdf, 0xd5, 0x75, 0x75, 0xfd, 0x83, 0xd6, - 0x76, 0xd3, 0x46, 0x97, - 0xfd, 0x6a, 0x36, 0xbc, 0xd5, 0x6d, 0xc3, 0x5b, 0x34, 0x1b, 0xde, 0x6c, - 0xda, 0x4c, 0x99, 0x0d, - 0x6f, 0x72, 0xdb, 0xf0, 0x46, 0xf3, 0x2a, 0xb2, 0x59, 0x8a, 0xe7, 0x83, - 0xf2, 0x4d, 0xc6, 0xfa, - 0xe7, 0x9b, 0x5c, 0x4e, 0xcf, 0x6a, 0x8a, 0x3d, 0xca, 0xa8, 0xe7, 0xbb, - 0xfc, 0xfd, 0xb3, 0x69, - 0x4b, 0xe9, 0x0e, 0xd3, 0x6e, 0xb2, 0xdb, 0xb4, 0x9b, 0x96, 0x99, 0xca, - 0x60, 0x97, 0xd2, 0x52, - 0xd8, 0xbb, 0x4c, 0xbb, 0x60, 0xef, 0xa4, 0x3b, 0x5d, 0x9b, 0xec, 0x30, - 0xed, 0x80, 0xc7, 0xed, - 0x20, 0x1b, 0x4d, 0xdb, 0xaf, 0xe2, 0xdf, 0xd5, 0x75, 0x75, 0xfd, 0x83, - 0x56, 0xa9, 0xb0, 0x83, - 0xee, 0xd6, 0x6c, 0xb8, 0x4c, 0xb3, 0xe1, 0x52, 0xcd, 0x86, 0x77, 0x69, - 0x36, 0xbc, 0xb3, 0xda, - 0x86, 0x77, 0xb8, 0x6c, 0x18, 0x7c, 0x98, 0x1d, 0x62, 0x2c, 0xba, 0x6c, - 0xbe, 0x89, 0xb7, 0x0e, - 0xbe, 0x94, 0xc4, 0xeb, 0xe5, 0xb8, 0xa4, 0xd8, 0xea, 0xf0, 0x22, 0x49, - 0xd8, 0xf2, 0x7a, 0x01, - 0x7a, 0x64, 0x82, 0xeb, 0x7c, 0x55, 0xd0, 0x4a, 0xa1, 0x8a, 0xec, 0x13, - 0xf6, 0x51, 0xd7, 0xde, - 0x4b, 0xf6, 0x9a, 0xf6, 0x90, 0x3d, 0xc2, 0x1e, 0xba, 0x07, 0x6e, 0x2b, - 0x85, 0x4a, 0x5a, 0x61, - 0xaa, 0x70, 0xef, 0x72, 0xb2, 0x43, 0x28, 0xbd, 0x7a, 0xc6, 0x5d, 0x5d, - 0x57, 0xd7, 0x3f, 0x68, - 0x55, 0x08, 0x95, 0xa4, 0xaa, 0xda, 0x7e, 0xf7, 0x91, 0xbd, 0x60, 0xc3, - 0x9a, 0xfd, 0x0a, 0xcc, - 0x8e, 0x2b, 0xc1, 0x86, 0x3d, 0xf6, 0x5b, 0x41, 0xca, 0x01, 0x03, 0xcb, - 0xcc, 0x51, 0x38, 0x58, - 0xde, 0x8c, 0xe1, 0x1f, 0xeb, 0x11, 0xf1, 0xa7, 0xe7, 0xa2, 0xd5, 0x4d, - 0x6c, 0xc9, 0xb9, 0xee, - 0x5e, 0xf6, 0xa0, 0x7c, 0x8e, 0x24, 0xb5, 0xe6, 0x4c, 0x29, 0xa6, 0x81, - 0x10, 0x25, 0xd6, 0xd5, - 0x7e, 0x0e, 0xfb, 0x6c, 0xda, 0xa0, 0x7d, 0xbc, 0xfb, 0xc9, 0x41, 0xe1, - 0x08, 0x39, 0x22, 0x1c, - 0x26, 0x87, 0x85, 0xc3, 0xf4, 0x10, 0xdc, 0x1e, 0x32, 0x1d, 0x82, 0xfb, - 0x0e, 0xd2, 0x83, 0xa6, - 0x83, 0x70, 0x7b, 0x80, 0x1c, 0x10, 0x0e, 0x50, 0xd8, 0xa4, 0xca, 0xb4, - 0x5f, 0xc3, 0xc3, 0xab, - 0x67, 0xdc, 0xd5, 0x75, 0x75, 0xfd, 0x73, 0xd6, 0x7e, 0xe1, 0x20, 0xd8, - 0xef, 0x11, 0xcd, 0x7e, - 0x0f, 0x0b, 0x87, 0xd8, 0x26, 0x87, 0x04, 0x66, 0xbb, 0xae, 0xed, 0xb1, - 0xdf, 0x03, 0xa6, 0x2a, - 0xb2, 0xdf, 0x54, 0x09, 0x98, 0x18, 0x49, 0x82, 0xf5, 0xeb, 0x79, 0x73, - 0x4e, 0x23, 0x7d, 0xcd, - 0x0f, 0x76, 0xe7, 0x0a, 0xd9, 0xbc, 0x45, 0xbf, 0xf3, 0x83, 0xbd, 0x38, - 0x2e, 0x09, 0xb5, 0x7c, - 0x35, 0x4d, 0x0b, 0xc1, 0x19, 0x67, 0xf4, 0xe8, 0xe0, 0x7b, 0xfa, 0x92, - 0x03, 0xe9, 0x7c, 0x85, - 0xde, 0xdf, 0xaf, 0x67, 0x36, 0xed, 0x61, 0x72, 0x5c, 0x38, 0x49, 0x7f, - 0x12, 0x7e, 0x22, 0x27, - 0xe1, 0xf6, 0x84, 0x70, 0x92, 0x9c, 0x10, 0x4e, 0xc0, 0x7d, 0xc7, 0xe1, - 0xe7, 0xe3, 0x70, 0x7b, - 0x8c, 0x1c, 0x83, 0x7d, 0x54, 0x38, 0x4a, 0x61, 0xc3, 0xf1, 0xac, 0xba, - 0x7a, 0xc6, 0x5d, 0x5d, - 0x57, 0xd7, 0x3f, 0x68, 0x1d, 0xa6, 0xc7, 0xc1, 0x76, 0x7f, 0x22, 0x3f, - 0x81, 0xed, 0x9e, 0x14, - 0x4e, 0x50, 0xd8, 0xc4, 0x65, 0xbb, 0x9a, 0x1d, 0x33, 0xfb, 0xa5, 0xc7, - 0xc0, 0x76, 0x5d, 0x36, - 0x7c, 0x90, 0xec, 0x0f, 0xd6, 0x87, 0x17, 0x20, 0xaf, 0xe7, 0x5d, 0x37, - 0x49, 0xf7, 0xa5, 0xfb, - 0x61, 0xab, 0xcd, 0x0f, 0x77, 0xc5, 0xaa, 0xf1, 0xb5, 0x7c, 0x35, 0xa6, - 0x81, 0xe0, 0xad, 0x07, - 0xe3, 0x99, 0x33, 0xa9, 0x69, 0xd5, 0x5b, 0xa3, 0x0d, 0x81, 0xe6, 0x42, - 0x87, 0x77, 0x36, 0xed, - 0x31, 0x72, 0x96, 0x9e, 0x23, 0xe7, 0x84, 0x73, 0x5a, 0x8f, 0xfb, 0x59, - 0xe1, 0x2c, 0x39, 0x2b, - 0x9c, 0x21, 0x67, 0xdc, 0xfb, 0x34, 0xeb, 0x81, 0x17, 0x4e, 0x93, 0x53, - 0xc2, 0x29, 0xd8, 0x3f, - 0xc1, 0x71, 0x3d, 0x7c, 0x35, 0xff, 0x77, 0x75, 0x5d, 0x5d, 0xff, 0xa0, - 0x75, 0x94, 0xf5, 0x77, - 0x83, 0xfd, 0x9e, 0x73, 0xf1, 0x54, 0x08, 0xb3, 0x61, 0x8f, 0xfd, 0x9e, - 0x71, 0xdb, 0xef, 0x69, - 0xcd, 0x7e, 0x4f, 0x01, 0x46, 0x9e, 0x00, 0xbc, 0x0c, 0x82, 0x7f, 0xfa, - 0xb8, 0xe8, 0x24, 0x3e, - 0x2f, 0x33, 0x27, 0xab, 0x20, 0x79, 0x64, 0xa0, 0xf9, 0xc1, 0xac, 0x6e, - 0xc2, 0x70, 0x32, 0xb6, - 0x2e, 0xf7, 0x97, 0x44, 0x42, 0x1c, 0x1e, 0x2d, 0xc7, 0xf0, 0xb1, 0xf6, - 0x38, 0x2e, 0xbb, 0x16, - 0x57, 0xde, 0x9f, 0x9e, 0x8b, 0x2b, 0xaf, 0x57, 0x57, 0xb7, 0xc3, 0xd7, - 0xd2, 0xd5, 0xc3, 0x48, - 0x4f, 0x92, 0x5f, 0xe9, 0x6f, 0xe4, 0x37, 0xfa, 0x2b, 0xdc, 0x7a, 0xf6, - 0x2f, 0xe4, 0x97, 0xea, - 0xed, 0xe2, 0xde, 0x68, 0x5c, 0x1f, 0xe1, 0x67, 0x38, 0xbe, 0x47, 0xaf, - 0xe2, 0xdf, 0xd5, 0x75, - 0x75, 0xfd, 0x83, 0xd6, 0x49, 0xb0, 0xd9, 0xdf, 0xc0, 0x86, 0x7f, 0xf5, - 0xb2, 0xe1, 0x5f, 0xbc, - 0x6c, 0xd8, 0xc5, 0x9d, 0xfb, 0xd9, 0xc5, 0xdb, 0x03, 0x6c, 0x3c, 0x16, - 0x04, 0x37, 0xf4, 0x6a, - 0x54, 0xc4, 0x57, 0xc7, 0xaa, 0xfe, 0xe6, 0x07, 0xbb, 0xe6, 0x9b, 0x64, - 0x8c, 0xc9, 0x1a, 0x1e, - 0x2f, 0x33, 0xae, 0x99, 0xff, 0xf9, 0x04, 0x2e, 0x9d, 0x9e, 0x94, 0xdc, - 0x1a, 0x3a, 0xf8, 0x63, - 0xb2, 0xea, 0xe8, 0xb9, 0x68, 0x98, 0x17, 0xce, 0xd9, 0xb4, 0x70, 0x7d, - 0xf8, 0x2f, 0xfd, 0xaf, - 0x67, 0x33, 0xd6, 0x0f, 0x71, 0x6f, 0xc6, 0x02, 0x22, 0x6c, 0xbb, 0x58, - 0x41, 0x17, 0xd8, 0x2d, - 0x1c, 0xdb, 0x93, 0x57, 0xf1, 0xef, 0xea, 0xba, 0xba, 0xfe, 0x41, 0xeb, - 0xb4, 0x97, 0xfd, 0xfe, - 0xf7, 0x92, 0xfd, 0xc2, 0x76, 0xd9, 0xef, 0xef, 0x6e, 0x5e, 0x9f, 0xcb, - 0x86, 0x7f, 0x25, 0x27, - 0x83, 0xe0, 0x9f, 0xce, 0x39, 0xac, 0xbe, 0xe7, 0x2d, 0xd6, 0x98, 0x1f, - 0x7c, 0x69, 0xbe, 0x09, - 0xe3, 0xbf, 0xc5, 0x39, 0xe2, 0xb8, 0x58, 0x15, 0x62, 0x63, 0x8b, 0x9f, - 0xfa, 0x8b, 0x5b, 0xe7, - 0x2b, 0xd1, 0x1a, 0x6f, 0x70, 0xf1, 0xd5, 0x6a, 0xcf, 0xdc, 0x74, 0xcf, - 0x95, 0xb7, 0xa5, 0xe6, - 0xba, 0xf3, 0x7a, 0x01, 0xfd, 0x53, 0x5d, 0xb3, 0x69, 0xfd, 0xf3, 0x31, - 0x89, 0x7b, 0x33, 0x66, - 0x26, 0xf9, 0xc3, 0x6b, 0x5f, 0x3d, 0xe3, 0xfe, 0xbf, 0xbd, 0x37, 0x0d, - 0x92, 0x25, 0xab, 0xee, - 0x3c, 0xd3, 0x63, 0xf1, 0x88, 0xc8, 0x88, 0xcc, 0x8c, 0x88, 0xec, 0xe9, - 0x2f, 0x33, 0xa3, 0x29, - 0x61, 0x6d, 0xdd, 0x3d, 0xd6, 0x36, 0xa3, 0xb2, 0xe9, 0xe9, 0xb1, 0x51, - 0xcf, 0x34, 0x54, 0xb1, - 0x49, 0x08, 0xaa, 0x0c, 0x1b, 0x9b, 0x2f, 0x63, 0x26, 0xcc, 0xc0, 0xc6, - 0xba, 0xdb, 0x4c, 0x23, - 0xb3, 0xc6, 0xc8, 0xcc, 0xc8, 0xd8, 0xdd, 0x23, 0x63, 0xdf, 0x72, 0x7d, - 0x4b, 0x49, 0x42, 0x2a, - 0x16, 0x51, 0x80, 0x04, 0x2a, 0x10, 0x8b, 0x4c, 0x02, 0xa9, 0x80, 0x92, - 0x10, 0x5a, 0x0b, 0xb4, - 0x20, 0xa1, 0x05, 0xd0, 0x8a, 0x40, 0x42, 0x8f, 0x96, 0xd4, 0x5a, 0xba, - 0xa5, 0xce, 0xb9, 0xe7, - 0x5e, 0x77, 0x0f, 0x77, 0x0f, 0xbf, 0x7e, 0x8f, 0x67, 0xfa, 0x7b, 0xf5, - 0xd2, 0xed, 0xd8, 0x31, - 0xe7, 0x3d, 0x5e, 0x65, 0x66, 0x84, 0xdf, 0x8c, 0xfb, 0xf7, 0x7b, 0xb6, - 0xdf, 0x21, 0x23, 0x7b, - 0x78, 0x4c, 0xb2, 0x83, 0x5d, 0xfb, 0x17, 0x7a, 0xab, 0x9d, 0xfd, 0xcb, - 0xec, 0xc1, 0xb0, 0x6b, - 0x78, 0xde, 0x64, 0x56, 0x6c, 0x00, 0x7f, 0x05, 0xf8, 0x2f, 0xce, 0xcc, - 0xcb, 0x63, 0x09, 0xff, - 0xd9, 0xc7, 0xf9, 0xe2, 0x5c, 0xcd, 0x49, 0xa1, 0xe9, 0xe9, 0x57, 0xb3, - 0x78, 0xc9, 0xe0, 0x9f, - 0x07, 0xf2, 0x5c, 0x5c, 0x67, 0x4a, 0x14, 0x8f, 0xb7, 0xf7, 0x1e, 0xe3, - 0xc3, 0xa3, 0x0f, 0xb7, - 0x9e, 0x35, 0x9f, 0x35, 0xd8, 0x65, 0x19, 0xac, 0xdf, 0xb3, 0x12, 0x7b, - 0x86, 0x3e, 0x71, 0x64, - 0x64, 0x0f, 0x91, 0x3d, 0x13, 0xb8, 0x4f, 0x03, 0xf6, 0xf0, 0xd1, 0x8f, - 0x76, 0x3f, 0x32, 0xfc, - 0x50, 0x4b, 0xb5, 0x83, 0xe3, 0x9c, 0xb7, 0x28, 0x7c, 0xd5, 0xe2, 0x3e, - 0xf3, 0x7d, 0xad, 0x59, - 0x6f, 0xd9, 0x96, 0x2e, 0xe3, 0xdf, 0xcb, 0xeb, 0xf5, 0x3c, 0x73, 0x26, - 0x1d, 0x2e, 0xef, 0x1d, - 0x27, 0xd6, 0xb8, 0xce, 0xd5, 0x64, 0xfa, 0x8c, 0x9b, 0x4d, 0x1b, 0x14, - 0xeb, 0x84, 0xb5, 0xa3, - 0xcf, 0x15, 0x19, 0xd9, 0xcd, 0x3e, 0x15, 0x06, 0xc4, 0xf5, 0x30, 0xbc, - 0xc7, 0xd3, 0xea, 0xc1, - 0x7d, 0x9c, 0xb7, 0x08, 0x73, 0xab, 0xba, 0xc1, 0x71, 0xc7, 0x12, 0x22, - 0xae, 0xa7, 0xf1, 0xf9, - 0x53, 0x95, 0xb3, 0xe2, 0xc1, 0xd6, 0x45, 0x39, 0x64, 0xce, 0x64, 0xa6, - 0x8d, 0x9f, 0x59, 0xed, - 0x8f, 0x75, 0x92, 0xfe, 0x91, 0x91, 0x25, 0x40, 0xff, 0x8c, 0x2b, 0xc6, - 0xf5, 0xf0, 0xf3, 0x16, - 0x63, 0xe1, 0xb4, 0x48, 0xb5, 0x32, 0x58, 0x9f, 0xed, 0x99, 0xd5, 0x3d, - 0x7b, 0xbe, 0x41, 0xc9, - 0x33, 0x1f, 0x49, 0xe4, 0x4d, 0xb6, 0x0e, 0xc0, 0x4f, 0x2e, 0x4c, 0x32, - 0x4d, 0xd9, 0xfc, 0x60, - 0xf1, 0x9a, 0x41, 0x6b, 0x42, 0xfa, 0x47, 0x46, 0x76, 0xe3, 0xf5, 0x8f, - 0xf9, 0x93, 0xee, 0xba, - 0x64, 0x31, 0x6b, 0xee, 0x0a, 0x5c, 0x76, 0x89, 0xaf, 0x1a, 0x1b, 0xa7, - 0xc5, 0xa3, 0x95, 0xe8, - 0xb9, 0x9c, 0x6d, 0x6f, 0xac, 0xd1, 0x3d, 0x67, 0xd2, 0x35, 0xc3, 0xcb, - 0x95, 0x37, 0xf1, 0xcf, - 0x0f, 0x96, 0xd7, 0xc8, 0x90, 0xfe, 0x91, 0x91, 0xdd, 0x78, 0xfd, 0x9b, - 0xef, 0x36, 0xdc, 0x75, - 0xc9, 0xfa, 0x49, 0xe5, 0xd0, 0x9a, 0x6f, 0x27, 0xd7, 0xac, 0xb8, 0xe7, - 0xb0, 0x62, 0x38, 0x2d, - 0xb6, 0x56, 0x2e, 0xe3, 0xe9, 0x7d, 0xe3, 0x79, 0x13, 0x98, 0x2b, 0x7f, - 0xa7, 0xbc, 0xb7, 0x36, - 0x8f, 0xcc, 0x3d, 0x67, 0x92, 0x69, 0x21, 0x8f, 0x75, 0xae, 0xd5, 0xc8, - 0x90, 0xfe, 0x91, 0x91, - 0xdd, 0x78, 0xfd, 0x9b, 0xee, 0x34, 0x3d, 0x75, 0xc9, 0x4c, 0x0b, 0x2a, - 0xe7, 0xa5, 0x7d, 0x29, - 0xcf, 0x05, 0x2c, 0x5e, 0xfe, 0x32, 0x8e, 0xd3, 0x62, 0x6b, 0x65, 0x4c, - 0xb3, 0x69, 0xb9, 0x4d, - 0xb6, 0x5a, 0x10, 0xd7, 0x73, 0xe7, 0x4d, 0x02, 0x6a, 0xb4, 0x6b, 0x30, - 0x9b, 0x76, 0x7b, 0x9e, - 0xa9, 0x7b, 0xfb, 0x4d, 0x48, 0xff, 0xc8, 0xc8, 0x6e, 0x7e, 0xfc, 0xcf, - 0x5b, 0x97, 0x5c, 0x91, - 0xcc, 0x0f, 0xce, 0xb8, 0x7b, 0x2c, 0xec, 0xde, 0x37, 0x54, 0x6f, 0x59, - 0x4c, 0x9c, 0x96, 0x28, - 0x5a, 0xd9, 0xcf, 0x76, 0x31, 0xb3, 0x69, 0xd7, 0xf9, 0xfd, 0x62, 0x26, - 0x08, 0x9f, 0x8f, 0xe4, - 0xca, 0x9b, 0x54, 0x03, 0xfb, 0x4d, 0x2e, 0x0d, 0xd2, 0x3f, 0x32, 0xb2, - 0x04, 0xe5, 0x7f, 0xd9, - 0xb9, 0x09, 0xe6, 0x33, 0x83, 0xe6, 0x49, 0x79, 0x2e, 0xc0, 0xc1, 0x1f, - 0x17, 0x5a, 0x56, 0x5c, - 0xcf, 0xbc, 0x76, 0x5c, 0x0f, 0x3b, 0x87, 0xd5, 0xad, 0x95, 0xf7, 0x6d, - 0x36, 0xad, 0xe7, 0x7d, - 0x39, 0x79, 0x13, 0x5e, 0x4b, 0x73, 0xd7, 0xd7, 0x6f, 0x32, 0xbe, 0x6c, - 0x91, 0xfe, 0x91, 0x91, - 0x25, 0x48, 0xff, 0x2c, 0x2d, 0xe2, 0x7e, 0x63, 0x08, 0xcf, 0xa5, 0x7c, - 0xbe, 0xbd, 0x0f, 0xf5, - 0x70, 0x21, 0x3c, 0x17, 0x6e, 0x30, 0x2b, 0xb9, 0x3c, 0x8f, 0xa7, 0x46, - 0xc6, 0xa7, 0x95, 0xd8, - 0xb9, 0x9c, 0xa1, 0x16, 0x3a, 0x9b, 0xd6, 0xf5, 0x9a, 0xa0, 0x7f, 0x9b, - 0xfe, 0x7e, 0x93, 0xc5, - 0x65, 0x83, 0xf4, 0x8f, 0x8c, 0x2c, 0x41, 0xfa, 0x27, 0x61, 0xd5, 0x2b, - 0x39, 0xf8, 0x6b, 0x3c, - 0x97, 0x28, 0xbe, 0x2a, 0x8e, 0xd3, 0xe2, 0xd6, 0xca, 0x38, 0xe7, 0x72, - 0x6e, 0x4f, 0x35, 0xa5, - 0x2f, 0xed, 0xe1, 0x7c, 0x41, 0xde, 0x64, 0x5a, 0x68, 0x16, 0xe9, 0xfc, - 0x47, 0x46, 0x96, 0x2c, - 0xfd, 0x53, 0xb3, 0xea, 0x39, 0x07, 0x3f, 0x7f, 0x5a, 0xa9, 0x01, 0x5b, - 0xa5, 0x12, 0xc2, 0x73, - 0x81, 0xfa, 0x65, 0xdc, 0x8c, 0x72, 0x1c, 0xa7, 0x25, 0x8a, 0x56, 0x8a, - 0xb8, 0x1e, 0xae, 0x46, - 0x06, 0x33, 0x97, 0x33, 0x78, 0x4d, 0x28, 0xff, 0x41, 0x46, 0x96, 0x28, - 0xfd, 0xc3, 0x31, 0xad, - 0x78, 0xdc, 0xac, 0x7a, 0x9c, 0x3d, 0x94, 0xf2, 0x5c, 0x6e, 0x89, 0x58, - 0x21, 0x9f, 0x7b, 0x39, - 0x4e, 0xb5, 0x64, 0xf3, 0x83, 0x1d, 0x5f, 0x55, 0xd2, 0xcf, 0x91, 0x1a, - 0xa4, 0xba, 0x9a, 0xe0, - 0xb0, 0x1a, 0xb6, 0x56, 0x56, 0xe3, 0x62, 0x5a, 0x31, 0xbf, 0x76, 0x1b, - 0xd3, 0xfb, 0xc6, 0xd7, - 0x24, 0xa8, 0x86, 0x91, 0xf4, 0x8f, 0x8c, 0x2c, 0x49, 0xfa, 0x67, 0xd5, - 0xeb, 0x29, 0x7b, 0x2b, - 0x38, 0x7f, 0xd9, 0x1d, 0xd7, 0xeb, 0x59, 0x6c, 0x2a, 0x1f, 0x07, 0x1f, - 0x34, 0x11, 0x72, 0x05, - 0xb2, 0xf9, 0xc1, 0x8e, 0xaf, 0x2a, 0xa9, 0x91, 0x01, 0x06, 0x82, 0xbe, - 0xd0, 0x5b, 0x36, 0x07, - 0x3f, 0x35, 0x29, 0x36, 0x31, 0x4c, 0x2b, 0x3e, 0x97, 0x73, 0x99, 0x3a, - 0xc4, 0xd4, 0xc8, 0x60, - 0xe6, 0x72, 0x06, 0xd7, 0x30, 0x92, 0xfe, 0x91, 0x91, 0x25, 0x49, 0xff, - 0xac, 0x3e, 0x2f, 0x65, - 0xdc, 0x2c, 0x90, 0x69, 0x65, 0xeb, 0x85, 0x9d, 0x37, 0x39, 0xde, 0x3a, - 0xac, 0x32, 0xbf, 0x38, - 0x6c, 0x7e, 0x30, 0xf7, 0xa7, 0xe7, 0xe5, 0x86, 0xac, 0x46, 0xc6, 0xcd, - 0x7e, 0x06, 0x0e, 0xfe, - 0xf6, 0xd9, 0xf6, 0x01, 0xe8, 0x5f, 0x46, 0xca, 0x73, 0x71, 0xc7, 0xf5, - 0x36, 0x50, 0x71, 0x3d, - 0xcc, 0x5c, 0xce, 0x60, 0x7d, 0x26, 0xfd, 0x23, 0x23, 0x4b, 0x92, 0xfe, - 0xc1, 0x0c, 0xca, 0x38, - 0x98, 0x56, 0xc2, 0x57, 0x15, 0x9c, 0x16, 0x7d, 0xaa, 0xc8, 0x9b, 0x1c, - 0x0b, 0x5f, 0x3a, 0x48, - 0xcb, 0x80, 0xfd, 0x9c, 0x1a, 0xa7, 0x3b, 0x36, 0x07, 0xdf, 0x89, 0x35, - 0xde, 0x92, 0xf0, 0x5c, - 0x5c, 0x71, 0xbd, 0x22, 0x26, 0xae, 0x77, 0xa7, 0xbc, 0xa7, 0xea, 0x4d, - 0xce, 0x2c, 0x64, 0x6b, - 0x42, 0xfa, 0x47, 0x46, 0x96, 0x24, 0xfd, 0x83, 0x19, 0x94, 0xd5, 0x63, - 0x1c, 0xd3, 0x2a, 0xaf, - 0xee, 0x7d, 0x73, 0xc7, 0xf5, 0x24, 0xf3, 0x83, 0x21, 0x6f, 0x52, 0x75, - 0xfa, 0x4d, 0xd2, 0x7d, - 0x67, 0xd6, 0xdb, 0xda, 0x99, 0x0e, 0xb4, 0x70, 0xf3, 0xb4, 0x72, 0x00, - 0x3c, 0x05, 0x39, 0xcf, - 0x85, 0xf9, 0xd7, 0xec, 0xfd, 0x6d, 0x63, 0xea, 0x09, 0x91, 0xb1, 0x4e, - 0x5d, 0xba, 0x26, 0xa4, - 0x7f, 0x64, 0x64, 0x49, 0xd2, 0x3f, 0x88, 0xeb, 0xdd, 0x47, 0xa6, 0x95, - 0x73, 0x3e, 0xf3, 0xf4, - 0x9b, 0xdc, 0x59, 0x69, 0x59, 0xf1, 0x44, 0x6f, 0x64, 0x67, 0x99, 0x56, - 0x7a, 0x08, 0x3a, 0xb6, - 0xde, 0x77, 0xc7, 0xf4, 0x99, 0xf7, 0x26, 0xcb, 0x79, 0x2e, 0x3b, 0xfb, - 0xa5, 0x65, 0x9e, 0xd7, - 0x2b, 0xe6, 0x47, 0x5a, 0x3b, 0x2c, 0x4f, 0x22, 0x38, 0x5f, 0x88, 0x58, - 0xe7, 0x59, 0xf5, 0x20, - 0xb8, 0x86, 0x91, 0xf4, 0x8f, 0x8c, 0x2c, 0x39, 0xfa, 0xa7, 0x85, 0xc6, - 0xf5, 0x56, 0x7e, 0xa3, - 0x60, 0x5a, 0xc5, 0x32, 0x57, 0xed, 0x28, 0xcd, 0x6b, 0x64, 0xec, 0x7e, - 0x93, 0xd2, 0x79, 0xae, - 0xce, 0xe3, 0x7d, 0x90, 0xf7, 0x58, 0xea, 0x6b, 0xef, 0xc3, 0xcf, 0xaa, - 0xe7, 0xb1, 0x46, 0x3f, - 0xcf, 0xe5, 0xae, 0xe8, 0x57, 0xdb, 0x09, 0xe1, 0xb9, 0x58, 0x35, 0x32, - 0x51, 0x38, 0x5f, 0x4d, - 0xd2, 0x3f, 0x32, 0xb2, 0x04, 0xeb, 0x5f, 0x84, 0xb8, 0x1e, 0xd4, 0x83, - 0xa8, 0x6a, 0x50, 0x70, - 0x9c, 0x16, 0xcd, 0xb0, 0x7d, 0x55, 0xd0, 0x32, 0x38, 0xf7, 0xa5, 0xa7, - 0xd9, 0xb6, 0x7e, 0x2c, - 0xf2, 0x1e, 0x7e, 0x2d, 0x0a, 0x8b, 0xeb, 0xb9, 0x39, 0xf8, 0xbb, 0x77, - 0xc3, 0x79, 0x2e, 0x1b, - 0x11, 0x38, 0x5f, 0xf2, 0x35, 0x21, 0xfd, 0x23, 0x23, 0x4b, 0x8c, 0xfe, - 0x21, 0x59, 0xf5, 0x22, - 0xae, 0x57, 0x8c, 0x67, 0xae, 0x9a, 0x8c, 0xd3, 0x62, 0x71, 0xf0, 0x83, - 0xb4, 0x52, 0x5d, 0xaf, - 0x57, 0x6c, 0xc3, 0xbc, 0xf5, 0x50, 0x9e, 0xcb, 0x54, 0x6f, 0xea, 0xc7, - 0x0e, 0xe7, 0x2b, 0xf4, - 0xfd, 0xc9, 0x63, 0x9d, 0xa4, 0x7f, 0x64, 0x64, 0xc9, 0xd1, 0xbf, 0x98, - 0x99, 0x56, 0xe0, 0xab, - 0xc6, 0xc4, 0x69, 0xb1, 0xf5, 0x8f, 0x6b, 0xe5, 0x20, 0x4a, 0xef, 0x5b, - 0x30, 0xcf, 0x05, 0x62, - 0x8d, 0xe0, 0x2f, 0x97, 0xcf, 0x8a, 0x07, 0xd2, 0xf9, 0xc1, 0xfc, 0xfd, - 0x85, 0xad, 0x09, 0xe9, - 0x1f, 0x19, 0xd9, 0x8d, 0xd7, 0x3f, 0xa6, 0x41, 0xbc, 0x2e, 0xd9, 0x8a, - 0xeb, 0x69, 0xb1, 0xb0, - 0xea, 0x23, 0x72, 0x5a, 0x7a, 0x88, 0xde, 0xb7, 0xa3, 0x94, 0x51, 0xc5, - 0xd4, 0xeb, 0x41, 0xef, - 0x5b, 0x50, 0x5c, 0xcf, 0xcd, 0xc1, 0xbf, 0xa8, 0xec, 0x57, 0xef, 0x2a, - 0xe6, 0x07, 0x3b, 0x35, - 0x32, 0xb2, 0x58, 0x27, 0xe9, 0x1f, 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0x59, - 0xa5, 0x61, 0xef, 0x7f, - 0xa8, 0x07, 0x49, 0x87, 0xf0, 0x5c, 0x44, 0x0e, 0x36, 0x12, 0xd3, 0x2a, - 0x16, 0x4e, 0x8b, 0x38, - 0x8b, 0xa5, 0xbb, 0xa0, 0x95, 0xca, 0x7a, 0x3d, 0xd1, 0xfb, 0x16, 0xaa, - 0xcf, 0x10, 0x2b, 0xe4, - 0x9c, 0xaf, 0xd3, 0xad, 0x9a, 0x6c, 0x7e, 0x30, 0xcf, 0x9b, 0x84, 0x72, - 0xbe, 0x48, 0xff, 0xc8, - 0xc8, 0x6e, 0xbc, 0xfe, 0x2d, 0x76, 0x1b, 0x76, 0x7c, 0x6c, 0xf7, 0x4e, - 0x28, 0xcf, 0xc5, 0x89, - 0xeb, 0x29, 0x59, 0xf5, 0xf1, 0x72, 0x5a, 0xac, 0xbc, 0x73, 0xa6, 0x83, - 0xae, 0xd7, 0x53, 0xcd, - 0xe5, 0xb4, 0x39, 0x5f, 0xcc, 0x97, 0x96, 0xcd, 0x0f, 0xb6, 0xf3, 0x26, - 0xf2, 0x7e, 0x13, 0xd2, - 0x3f, 0x32, 0xb2, 0x1b, 0xaf, 0x7f, 0x4c, 0xab, 0x72, 0xd3, 0x42, 0xa3, - 0x74, 0x5e, 0x39, 0x58, - 0xf5, 0xed, 0x06, 0xf0, 0x5c, 0x2c, 0x0e, 0x7e, 0x9c, 0x4c, 0x2b, 0x1c, - 0xa7, 0xc5, 0xce, 0x6b, - 0x64, 0x3b, 0xa8, 0xb9, 0x9c, 0x67, 0xf8, 0xb9, 0x9c, 0x19, 0x6f, 0x5c, - 0xcf, 0x90, 0x72, 0xf0, - 0x03, 0xfb, 0x4d, 0x48, 0xff, 0xc8, 0xc8, 0x92, 0x92, 0xff, 0xe0, 0x71, - 0x3d, 0xa6, 0x2f, 0x39, - 0x19, 0xcf, 0x85, 0x73, 0xf0, 0xb3, 0x4d, 0xa8, 0x87, 0x2b, 0x8e, 0x14, - 0x35, 0x82, 0xc8, 0xb8, - 0x1e, 0x8a, 0xd3, 0x62, 0x9f, 0x15, 0xc7, 0x7a, 0x47, 0x5d, 0xaf, 0xc7, - 0x6b, 0x18, 0x11, 0x4c, - 0x2b, 0x5d, 0xc1, 0xf9, 0x12, 0x79, 0x93, 0x02, 0x70, 0xbe, 0x64, 0xfd, - 0x26, 0xc3, 0xcb, 0x0e, - 0xe9, 0x1f, 0x19, 0x59, 0x32, 0xf4, 0x8f, 0xc7, 0xf5, 0x6c, 0xbf, 0x51, - 0xc2, 0x73, 0x81, 0x5c, - 0x00, 0x9c, 0x9b, 0xb6, 0x8e, 0x0b, 0x52, 0x9e, 0x8b, 0x2f, 0xae, 0x17, - 0xee, 0xab, 0x62, 0x38, - 0x2d, 0x4e, 0xdd, 0x4d, 0xae, 0x8d, 0x62, 0x5a, 0xe1, 0xe6, 0x72, 0xb6, - 0x30, 0x73, 0x39, 0x45, - 0x8d, 0xa0, 0x5e, 0xb3, 0xf3, 0x26, 0x3b, 0xb7, 0x2a, 0xab, 0x99, 0x99, - 0x73, 0xe2, 0x3f, 0x93, - 0x91, 0x25, 0x45, 0xff, 0xf2, 0xb2, 0xb8, 0x9e, 0x87, 0x83, 0x5f, 0xd9, - 0x53, 0xf1, 0x5c, 0x22, - 0xc4, 0xf5, 0x70, 0x9c, 0x16, 0xa7, 0xee, 0x26, 0xd7, 0x56, 0xc6, 0xf5, - 0x62, 0x9e, 0xcb, 0xe9, - 0xe7, 0x7c, 0x79, 0xe6, 0x07, 0xcf, 0x2e, 0x9b, 0xa4, 0x7f, 0x64, 0x64, - 0x89, 0xd0, 0x3f, 0xa3, - 0x88, 0x88, 0xeb, 0x69, 0xc0, 0x1f, 0x65, 0x3e, 0x60, 0xe9, 0x74, 0xab, - 0x16, 0xc6, 0xc1, 0x4f, - 0x47, 0xe0, 0x2f, 0x2b, 0x39, 0x2d, 0xf6, 0x59, 0x6c, 0x9e, 0x6b, 0xed, - 0x4c, 0x15, 0x71, 0x3d, - 0x9b, 0x69, 0x15, 0x53, 0x0d, 0x63, 0xd8, 0x9a, 0x68, 0x3d, 0x9a, 0xff, - 0x46, 0x46, 0x96, 0x08, - 0xfd, 0xeb, 0x21, 0x67, 0x50, 0x0e, 0x20, 0xae, 0xb7, 0xb3, 0xb7, 0x11, - 0xca, 0x73, 0x29, 0xef, - 0x41, 0xfc, 0xb0, 0x7a, 0x5a, 0x38, 0xc8, 0x0c, 0x24, 0xf3, 0x83, 0x6d, - 0x5f, 0x55, 0xd1, 0xcf, - 0xa1, 0xad, 0x72, 0xae, 0x46, 0x66, 0x99, 0x6b, 0x15, 0xaf, 0xcc, 0xaa, - 0xf7, 0xfb, 0xb5, 0x78, - 0xce, 0x97, 0x7c, 0x4d, 0x28, 0xff, 0x41, 0x46, 0x96, 0x08, 0xfd, 0xb3, - 0x99, 0x56, 0x0a, 0x66, - 0x94, 0x16, 0xc8, 0xaa, 0xf7, 0xf2, 0x5c, 0x76, 0x3d, 0x79, 0x53, 0x2b, - 0x6f, 0x32, 0xf1, 0xcd, - 0x0f, 0x76, 0xf9, 0xaa, 0x61, 0xfd, 0x1c, 0xc0, 0x7e, 0xce, 0x4e, 0x81, - 0xfd, 0xcc, 0x7c, 0x70, - 0xa6, 0x7f, 0x57, 0x67, 0xd5, 0x7b, 0x4d, 0xd4, 0x30, 0xa6, 0xaf, 0x39, - 0x97, 0x93, 0xf4, 0x8f, - 0x8c, 0x2c, 0x19, 0xfa, 0xe7, 0xf4, 0x79, 0xa9, 0xeb, 0xf5, 0xc2, 0xfc, - 0x46, 0x2b, 0x6f, 0x02, - 0x7e, 0x6d, 0xe5, 0xb6, 0x2b, 0x57, 0xe0, 0x9f, 0x1f, 0x0c, 0x79, 0x93, - 0x7e, 0xb6, 0x53, 0x51, - 0xf4, 0xbe, 0xb9, 0xd9, 0xcf, 0xc0, 0x44, 0xd8, 0x5a, 0xe6, 0xa5, 0x3c, - 0x17, 0x11, 0xd7, 0xdb, - 0xba, 0x52, 0x5c, 0x2f, 0xac, 0x46, 0x46, 0xde, 0x0f, 0x48, 0xfa, 0x47, - 0x46, 0x96, 0x08, 0xfd, - 0x1b, 0xe0, 0xea, 0xf5, 0x50, 0x4c, 0x2b, 0x66, 0xbc, 0x06, 0x65, 0x9a, - 0x6a, 0x4a, 0xe7, 0x07, - 0x5b, 0x79, 0x93, 0x2a, 0x3b, 0x1f, 0x66, 0x42, 0xfa, 0x4d, 0x52, 0xa3, - 0x74, 0x27, 0x33, 0xd3, - 0x5b, 0x39, 0x8b, 0x07, 0xe3, 0xe5, 0xb9, 0xe4, 0x3d, 0x3c, 0x17, 0x11, - 0xd7, 0xdb, 0xb9, 0x76, - 0x5c, 0x6f, 0x15, 0x4b, 0x54, 0xad, 0x09, 0xe9, 0x1f, 0x19, 0x59, 0x22, - 0xf4, 0xcf, 0x62, 0xd5, - 0xe3, 0xe6, 0xaa, 0x65, 0x22, 0xcf, 0x55, 0x0b, 0x9e, 0x1f, 0xbc, 0xde, - 0x6f, 0x62, 0x71, 0xec, - 0xfd, 0xef, 0xc1, 0xd0, 0x86, 0xe9, 0x2e, 0x68, 0xe0, 0x56, 0x08, 0xcf, - 0x05, 0xea, 0x92, 0x33, - 0x3c, 0xae, 0x77, 0x1d, 0xa6, 0x95, 0xa7, 0x46, 0xa6, 0xbd, 0x7b, 0x2b, - 0x6c, 0x4d, 0x48, 0xff, - 0xc8, 0xc8, 0x92, 0xa0, 0x7f, 0x3e, 0x56, 0xbd, 0xd4, 0x22, 0x31, 0xad, - 0x82, 0xe3, 0x7a, 0xab, - 0xbc, 0xc9, 0x99, 0x2f, 0x56, 0xc8, 0xb4, 0x6c, 0x73, 0x91, 0x69, 0xa6, - 0x47, 0xa9, 0x0e, 0x9c, - 0xe9, 0x3c, 0xb5, 0xd3, 0x7d, 0xa6, 0x7f, 0xcb, 0x6c, 0x8b, 0xbd, 0xd3, - 0xae, 0x88, 0x35, 0xae, - 0xf3, 0x5c, 0x20, 0xd6, 0x08, 0x3d, 0x2c, 0x95, 0x93, 0x7c, 0xcd, 0xaa, - 0x4b, 0x0c, 0x3e, 0xb7, - 0x61, 0xf9, 0xfd, 0x21, 0x73, 0x39, 0x49, 0xff, 0xc8, 0xc8, 0x92, 0xa3, - 0x7f, 0xbc, 0x1e, 0x04, - 0x5b, 0xaf, 0x87, 0x64, 0x5a, 0x21, 0x38, 0x2d, 0x0d, 0xe0, 0xcf, 0xbb, - 0xf3, 0x26, 0x9c, 0xff, - 0x0c, 0xf1, 0xbe, 0xa5, 0xde, 0x04, 0x0e, 0xfe, 0xea, 0x2c, 0x96, 0xed, - 0xe4, 0x16, 0x99, 0x96, - 0xef, 0x9c, 0xd9, 0x0d, 0xe2, 0xe0, 0xc3, 0x99, 0x52, 0x70, 0xf0, 0x03, - 0x78, 0x2e, 0xa8, 0xb8, - 0x1e, 0xb6, 0x46, 0x86, 0xf4, 0x8f, 0x8c, 0x2c, 0x09, 0xfa, 0x87, 0x8b, - 0xeb, 0x21, 0xeb, 0xf5, - 0xac, 0xde, 0xb7, 0x54, 0x94, 0xde, 0xb7, 0x9e, 0xc6, 0xb5, 0x4c, 0x9f, - 0x66, 0x5a, 0xfa, 0xc2, - 0x9a, 0x79, 0xe9, 0xe2, 0x3f, 0x43, 0xef, 0x5b, 0x6e, 0x9e, 0x6e, 0xc9, - 0xeb, 0x64, 0x04, 0x07, - 0x1f, 0xfc, 0xda, 0xca, 0x1d, 0xdf, 0xcc, 0x4d, 0x3f, 0x07, 0xdf, 0x8a, - 0x75, 0xa6, 0x50, 0x9c, - 0xaf, 0xb0, 0x35, 0x21, 0xfd, 0x23, 0x23, 0x4b, 0x82, 0xfe, 0xf1, 0x7a, - 0x90, 0x2b, 0xc4, 0xf5, - 0x82, 0x6b, 0x50, 0x8a, 0xad, 0x6b, 0x71, 0x5a, 0x7a, 0xc0, 0x7e, 0x4e, - 0x75, 0x81, 0x83, 0xbf, - 0xca, 0xeb, 0xea, 0xed, 0xdc, 0x2c, 0xd5, 0x56, 0xdd, 0x0d, 0xaf, 0xd7, - 0x9b, 0xa6, 0x9b, 0x61, - 0x3c, 0x97, 0x4d, 0x9e, 0x77, 0xd9, 0xde, 0x4b, 0xcb, 0xe7, 0x07, 0xaf, - 0x6a, 0x64, 0x42, 0xd7, - 0x84, 0xf4, 0x8f, 0x8c, 0x2c, 0x09, 0xfa, 0x77, 0x2d, 0x56, 0x7d, 0x50, - 0x8d, 0x0c, 0x86, 0xd3, - 0x72, 0x8a, 0xe0, 0xb4, 0xd8, 0xbe, 0xe8, 0x34, 0xd7, 0xce, 0x4d, 0xb5, - 0x70, 0xfd, 0x5b, 0xe7, - 0xf7, 0x07, 0xf3, 0x5c, 0xee, 0x88, 0xbc, 0x8b, 0x7c, 0x7e, 0x30, 0x36, - 0xd6, 0x49, 0xfa, 0x47, - 0x46, 0x76, 0xe3, 0xf5, 0x8f, 0x9d, 0xeb, 0xb0, 0x71, 0xbd, 0x0a, 0x82, - 0x55, 0x8f, 0x9b, 0xab, - 0x86, 0xe4, 0xb4, 0xd8, 0xbe, 0xe8, 0x3c, 0xd7, 0xd2, 0x47, 0x8a, 0x79, - 0xbe, 0xa1, 0x71, 0x3d, - 0x37, 0x07, 0xdf, 0x1d, 0x2b, 0x0c, 0x98, 0x1f, 0x6c, 0xe5, 0x4d, 0x80, - 0xdf, 0x1f, 0x5e, 0x23, - 0x43, 0xfa, 0x47, 0x46, 0x76, 0xe3, 0xf5, 0x6f, 0xba, 0xdd, 0x04, 0xbf, - 0xb1, 0x34, 0xcb, 0x34, - 0xa4, 0x3c, 0x17, 0x57, 0x5c, 0x2f, 0x16, 0xa6, 0x15, 0xd3, 0x5c, 0x54, - 0x0d, 0x8a, 0x75, 0x8e, - 0xcb, 0x2c, 0x72, 0xad, 0xcc, 0x50, 0x31, 0x23, 0x24, 0xca, 0x5c, 0x4e, - 0x76, 0x3e, 0x0d, 0x9e, - 0x1f, 0x6c, 0x71, 0xf0, 0x47, 0x99, 0x56, 0xf1, 0x42, 0xc5, 0xef, 0x27, - 0xfd, 0x23, 0x23, 0xbb, - 0xf1, 0xfa, 0x67, 0xf1, 0x9f, 0x45, 0xae, 0x00, 0xf6, 0xff, 0x3a, 0xcf, - 0x85, 0xdb, 0xf8, 0x9a, - 0x71, 0xbd, 0x00, 0x5f, 0x5a, 0xc5, 0x69, 0xb1, 0xcf, 0x6e, 0xd9, 0x65, - 0xae, 0x99, 0x1e, 0x28, - 0xf4, 0xcf, 0x62, 0x5a, 0xa1, 0xe6, 0x72, 0x5a, 0xef, 0xcf, 0xc3, 0x73, - 0xf1, 0x73, 0xf0, 0xd9, - 0xfb, 0x0b, 0xef, 0x37, 0x21, 0xfd, 0x23, 0x23, 0xbb, 0xf1, 0xfa, 0xc7, - 0x74, 0xcd, 0x89, 0x8d, - 0x39, 0xfb, 0xbf, 0xbc, 0x07, 0xb9, 0x02, 0x37, 0x07, 0x5f, 0xd9, 0xfb, - 0xe6, 0xaa, 0x91, 0x89, - 0x8b, 0xd3, 0x62, 0xe7, 0x43, 0xa0, 0xf7, 0x2d, 0xd5, 0x0f, 0xd7, 0x35, - 0x2c, 0xd3, 0x4a, 0x16, - 0xd7, 0xf3, 0x70, 0xf0, 0x6f, 0x57, 0x95, 0xf3, 0x83, 0x49, 0xff, 0xc8, - 0xc8, 0x12, 0xa0, 0x7f, - 0x47, 0x99, 0x2e, 0xf8, 0x7e, 0xfa, 0x38, 0xdb, 0xca, 0xfb, 0x78, 0xa7, - 0x2e, 0xf6, 0xfb, 0x41, - 0xfe, 0x78, 0xfb, 0x70, 0xf7, 0x2c, 0x7f, 0x20, 0xe5, 0xb9, 0xb8, 0x6a, - 0x64, 0x4a, 0x31, 0x71, - 0x5a, 0x6c, 0x5f, 0x19, 0x6a, 0x02, 0x55, 0x5f, 0x8b, 0x9e, 0xcb, 0xa9, - 0xee, 0x7d, 0x33, 0x52, - 0xa3, 0x7c, 0x1b, 0xea, 0x68, 0x42, 0xfb, 0x4d, 0x8e, 0x2e, 0xbb, 0xa4, - 0x7f, 0x64, 0x64, 0x37, - 0x5c, 0xff, 0x86, 0x82, 0x69, 0xb5, 0xf2, 0x1b, 0x81, 0x61, 0x90, 0x83, - 0xba, 0xe2, 0xc3, 0x1d, - 0xdb, 0x27, 0xb4, 0xf3, 0xa6, 0xb7, 0x6d, 0x0e, 0x7e, 0x00, 0xcf, 0xc5, - 0x3a, 0xab, 0xe1, 0x6a, - 0x64, 0x70, 0x9c, 0x16, 0x2b, 0xaf, 0x6b, 0x40, 0xef, 0x5b, 0xac, 0x73, - 0x39, 0x95, 0x9c, 0xaf, - 0x9c, 0x58, 0x93, 0x1e, 0xf4, 0x9b, 0x04, 0xcf, 0x0f, 0xae, 0xcc, 0x88, - 0xff, 0x4c, 0x46, 0x96, - 0x00, 0xff, 0xb7, 0x2d, 0x8d, 0xeb, 0xf5, 0x44, 0x5d, 0x31, 0xf4, 0xed, - 0x42, 0x3c, 0xcc, 0xcd, - 0xc1, 0x87, 0x5c, 0x81, 0x87, 0xe7, 0x02, 0xdf, 0x7f, 0x94, 0xea, 0xa2, - 0x66, 0x94, 0x23, 0x39, - 0x2d, 0x42, 0x8b, 0xa0, 0xf7, 0x4d, 0x6f, 0x6e, 0x28, 0x99, 0x56, 0xd5, - 0x28, 0x73, 0x39, 0xc3, - 0xe3, 0x8e, 0x41, 0x73, 0x39, 0x5d, 0xfd, 0x26, 0x9c, 0x83, 0xbd, 0x20, - 0xfd, 0x23, 0x23, 0xbb, - 0xf1, 0xfa, 0x37, 0xd9, 0x6a, 0x61, 0xea, 0xf5, 0xa0, 0x1e, 0xa4, 0x7c, - 0x5a, 0xa8, 0x95, 0x4e, - 0xb7, 0x6b, 0xee, 0x78, 0xa1, 0x9d, 0x37, 0xe1, 0x3d, 0x16, 0x4c, 0x0b, - 0x21, 0x76, 0xa6, 0xee, - 0x2d, 0xc3, 0x71, 0x5a, 0x44, 0x5e, 0x23, 0xb3, 0xde, 0xfb, 0x16, 0x60, - 0x82, 0x69, 0xf5, 0x60, - 0xe6, 0x72, 0xf2, 0xbc, 0x49, 0x9f, 0xfc, 0x5f, 0x32, 0xb2, 0x1b, 0xaf, - 0x7f, 0xb3, 0x72, 0x73, - 0xf7, 0x14, 0x57, 0xaf, 0x67, 0xf7, 0xbe, 0x41, 0xae, 0xc0, 0x99, 0x13, - 0xe7, 0xce, 0x9b, 0xdc, - 0xda, 0xd9, 0x03, 0x3d, 0x2c, 0xce, 0xf3, 0x75, 0xd9, 0xfc, 0x60, 0xee, - 0xab, 0x2e, 0x31, 0xbe, - 0xea, 0x86, 0x01, 0x3e, 0xaf, 0xaa, 0xf7, 0xcd, 0xfe, 0xda, 0xe2, 0x03, - 0x9f, 0xcb, 0x49, 0xf9, - 0x0f, 0x32, 0xb2, 0x9b, 0xaf, 0x7f, 0x95, 0x06, 0x6a, 0xae, 0x5a, 0x70, - 0x5c, 0x4f, 0xb0, 0x9f, - 0x43, 0xf2, 0x26, 0xfe, 0xf9, 0xc1, 0x96, 0xaf, 0x5a, 0xab, 0x2a, 0x7d, - 0x55, 0xcd, 0xc8, 0xce, - 0x32, 0xed, 0xd4, 0xd4, 0xe9, 0x7d, 0x33, 0xae, 0x1d, 0xd7, 0x83, 0xf9, - 0x25, 0x68, 0xce, 0x97, - 0x6a, 0x2e, 0x27, 0xe9, 0x1f, 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0x79, 0xb5, - 0x51, 0x59, 0xa4, 0xaf, - 0xc3, 0xb4, 0x72, 0x34, 0x28, 0xbb, 0xd8, 0xae, 0xef, 0xde, 0x29, 0xef, - 0x39, 0xbc, 0x53, 0xff, - 0xfc, 0x60, 0x8b, 0x83, 0xcf, 0x7d, 0xd5, 0xd9, 0x46, 0x43, 0xa5, 0x7f, - 0x0e, 0xff, 0x79, 0xc9, - 0xbe, 0x6f, 0x9a, 0x6e, 0x07, 0xf2, 0x5c, 0x22, 0xc4, 0xf5, 0xd4, 0x4c, - 0x2b, 0x61, 0x3a, 0xa6, - 0x1f, 0x90, 0xf4, 0x8f, 0x8c, 0x2c, 0x01, 0xfa, 0xb7, 0xdb, 0xd8, 0x9e, - 0x6a, 0xa8, 0xde, 0x37, - 0x15, 0xd3, 0x4a, 0x9b, 0x6e, 0x37, 0xb8, 0xdf, 0xa8, 0xc8, 0x9b, 0x40, - 0x8d, 0xcc, 0xd6, 0x3c, - 0x1b, 0xde, 0x6f, 0x72, 0x94, 0x32, 0x80, 0x81, 0x00, 0xb5, 0x7f, 0x5c, - 0x03, 0xd9, 0xe5, 0x89, - 0x35, 0xba, 0xeb, 0x92, 0x99, 0x3e, 0x63, 0x98, 0x56, 0xf1, 0xce, 0xe5, - 0x24, 0xfd, 0x23, 0x23, - 0xbb, 0xf1, 0xfa, 0xb7, 0xd8, 0x6d, 0xc4, 0x37, 0x57, 0xad, 0xb2, 0x36, - 0x57, 0x0d, 0x72, 0x05, - 0xfa, 0xb4, 0xd0, 0x0c, 0xca, 0x9b, 0xec, 0x9c, 0x07, 0xcf, 0x0f, 0x16, - 0x9a, 0x9b, 0xe6, 0xda, - 0x06, 0xbd, 0x6f, 0x3a, 0x3b, 0xfb, 0x01, 0x07, 0x3f, 0x90, 0xe7, 0x02, - 0x35, 0xda, 0x63, 0xbd, - 0x05, 0xff, 0x3f, 0x1e, 0x7e, 0x3f, 0x76, 0x2e, 0x27, 0xe9, 0x1f, 0x19, - 0x59, 0x12, 0xf4, 0x0f, - 0x57, 0xaf, 0xa7, 0xee, 0x7d, 0xcb, 0x2a, 0x7a, 0xdf, 0x52, 0x3c, 0x6f, - 0x52, 0xac, 0x3b, 0x3a, - 0x66, 0xe5, 0x4d, 0x2a, 0x56, 0xbf, 0x49, 0x6e, 0x92, 0x06, 0x1d, 0x14, - 0xec, 0xe7, 0x61, 0x86, - 0xeb, 0x21, 0xcc, 0x7d, 0xb3, 0x7a, 0xdf, 0x2c, 0x9e, 0x4b, 0xc1, 0xcb, - 0x73, 0xb1, 0xe6, 0xcc, - 0x41, 0x5c, 0x6f, 0x73, 0xa6, 0x37, 0x64, 0x3c, 0x17, 0xfe, 0xfe, 0x90, - 0xbd, 0xc9, 0xa8, 0x1a, - 0x46, 0x93, 0xe6, 0xff, 0x92, 0x91, 0x25, 0x41, 0xff, 0x94, 0xf5, 0x7a, - 0xdc, 0x6f, 0x2c, 0x2a, - 0x6b, 0x64, 0x20, 0xae, 0xa7, 0x64, 0x5a, 0x31, 0x7d, 0x01, 0xfd, 0xcb, - 0x4d, 0xb2, 0xad, 0x82, - 0x2f, 0x6f, 0x52, 0x3a, 0xcb, 0xd5, 0x21, 0xd6, 0xa7, 0xcf, 0x32, 0xad, - 0xf4, 0x24, 0xdb, 0xb6, - 0x7b, 0xdf, 0xd2, 0x6b, 0x7e, 0xad, 0x3d, 0x73, 0x53, 0xd4, 0x25, 0x57, - 0xef, 0xa8, 0x79, 0x2e, - 0x60, 0x31, 0xf0, 0xfb, 0x57, 0xef, 0x80, 0xf4, 0x8f, 0x8c, 0x2c, 0x11, - 0xf1, 0xbf, 0x4c, 0x2c, - 0x4c, 0xab, 0x0d, 0xa8, 0x91, 0x39, 0x50, 0xf7, 0xbe, 0x09, 0x4e, 0xcb, - 0xca, 0x97, 0x16, 0xfd, - 0x26, 0x30, 0x27, 0x6e, 0xf3, 0x24, 0xd7, 0xb0, 0xd9, 0xcf, 0x10, 0xef, - 0xe3, 0x39, 0x10, 0xe8, - 0x7d, 0x3b, 0x0a, 0x39, 0x77, 0xf6, 0x52, 0x5d, 0x1d, 0xf2, 0x2e, 0xb7, - 0xb7, 0xf7, 0xd6, 0x79, - 0x2e, 0x5e, 0x0e, 0x7e, 0x14, 0xce, 0x97, 0x72, 0x4d, 0x7a, 0xa4, 0x7f, - 0x64, 0x64, 0x37, 0xbf, - 0xfe, 0xa5, 0xdc, 0xc4, 0x31, 0xad, 0x14, 0xf5, 0x7a, 0xd8, 0xb9, 0x6a, - 0x23, 0x98, 0xab, 0x26, - 0xe1, 0xb4, 0x70, 0xf6, 0x73, 0xba, 0x93, 0xb1, 0xf2, 0x1e, 0xbc, 0xf7, - 0xed, 0x44, 0xdd, 0xfb, - 0xa6, 0x41, 0x3d, 0xf5, 0xa9, 0x5e, 0xb3, 0x39, 0xf8, 0x81, 0x3c, 0x97, - 0xf3, 0xad, 0x03, 0xde, - 0x9b, 0x3c, 0x4d, 0x37, 0x53, 0x61, 0xec, 0x67, 0x1e, 0xeb, 0x44, 0x70, - 0xbe, 0xa8, 0xff, 0x97, - 0x8c, 0xec, 0xe6, 0xeb, 0xdf, 0x64, 0xab, 0xb5, 0x11, 0x0b, 0xd3, 0x6a, - 0x8d, 0xbf, 0x1c, 0xac, - 0x55, 0x9c, 0xd3, 0xa2, 0xae, 0x41, 0x49, 0xcf, 0x72, 0x2d, 0x31, 0xf7, - 0x4d, 0xdd, 0xfb, 0xc6, - 0xf5, 0xd9, 0x57, 0x4f, 0xe8, 0xe1, 0xb9, 0xdc, 0x71, 0xe7, 0x5d, 0x44, - 0xac, 0x31, 0x68, 0x7e, - 0x30, 0xb7, 0x31, 0x2e, 0xd6, 0xa9, 0xf7, 0x2f, 0x3b, 0xa4, 0x7f, 0x64, - 0x64, 0x37, 0x5c, 0xff, - 0x46, 0x45, 0x25, 0x83, 0xb4, 0x70, 0x86, 0x60, 0xd5, 0xc7, 0x36, 0x57, - 0x4d, 0xf8, 0xd2, 0xc0, - 0x7c, 0xe6, 0xbd, 0x6f, 0x4b, 0x75, 0xef, 0x9b, 0x22, 0xae, 0x27, 0xf2, - 0x26, 0xf3, 0xcd, 0x06, - 0xbc, 0xbf, 0xb0, 0xf9, 0xc1, 0x90, 0x37, 0x41, 0xf3, 0xfb, 0x87, 0x97, - 0x6d, 0xd2, 0x3f, 0x32, - 0xb2, 0x9b, 0x7f, 0xfe, 0xb3, 0xeb, 0x92, 0x83, 0x67, 0xe6, 0x22, 0x59, - 0xf5, 0x10, 0xd7, 0xc3, - 0xd4, 0xc8, 0x2c, 0x70, 0xbd, 0x6f, 0x90, 0xf7, 0xd5, 0x46, 0x7a, 0x27, - 0xb7, 0x50, 0xf7, 0xbe, - 0xa9, 0x59, 0xf5, 0x42, 0x9f, 0x1d, 0xce, 0x97, 0x64, 0x7e, 0x30, 0xe4, - 0x4d, 0x72, 0x8b, 0xad, - 0x3a, 0xe7, 0x7c, 0x29, 0xfa, 0x4d, 0x8a, 0xe3, 0xcb, 0x16, 0xe9, 0x1f, - 0x19, 0xd9, 0xcd, 0xcf, - 0xff, 0x82, 0x2e, 0x54, 0x2e, 0xd8, 0xfe, 0xf7, 0xf3, 0x5c, 0xac, 0x98, - 0xdc, 0xf6, 0xad, 0xdd, - 0x3d, 0x65, 0x5c, 0xcf, 0xe2, 0x2f, 0x6f, 0xc4, 0xc2, 0x69, 0x11, 0x79, - 0x5f, 0x6d, 0xc2, 0xf4, - 0x4f, 0x39, 0xf7, 0xcd, 0xea, 0x7d, 0x1b, 0x2b, 0x7b, 0xdf, 0x44, 0x5c, - 0xcf, 0xb9, 0xaf, 0xe0, - 0xf9, 0xc1, 0x55, 0x8b, 0xf3, 0x25, 0x9d, 0x1f, 0x6c, 0xaf, 0xc9, 0xe4, - 0xb2, 0x49, 0xfa, 0x47, - 0x46, 0x76, 0xf3, 0xcf, 0x7f, 0x4e, 0xbf, 0x9a, 0x9d, 0x2b, 0xb8, 0x70, - 0x71, 0xf0, 0x07, 0xe9, - 0x0e, 0x8e, 0x69, 0x85, 0xe3, 0x2f, 0xa3, 0x38, 0x2d, 0xa0, 0x7f, 0x90, - 0xf7, 0xc5, 0xcc, 0x7d, - 0x8b, 0xce, 0xb4, 0x5a, 0xd3, 0x67, 0x37, 0x07, 0x1f, 0x7e, 0x16, 0x3f, - 0x17, 0xca, 0xe6, 0x07, - 0xc3, 0xf7, 0xb3, 0xd7, 0x2c, 0xcf, 0x48, 0xff, 0xc8, 0xc8, 0x6e, 0xbc, - 0xfe, 0xb1, 0xf3, 0x13, - 0xdb, 0xff, 0x1d, 0x7d, 0x92, 0x6f, 0x42, 0xbf, 0xda, 0xaa, 0xc7, 0xc2, - 0xea, 0xd1, 0x38, 0x2b, - 0x1d, 0x40, 0x2e, 0x35, 0x3f, 0x4e, 0xb7, 0xc2, 0xf2, 0xa6, 0x31, 0xf2, - 0x97, 0x1d, 0xe6, 0x69, - 0x6a, 0xc6, 0xf4, 0x6f, 0xa2, 0x9a, 0x7b, 0x99, 0x8e, 0x85, 0x69, 0x65, - 0xbf, 0x3f, 0x1e, 0xeb, - 0x3c, 0x29, 0xd4, 0xa4, 0xf3, 0x83, 0x81, 0x83, 0x3f, 0xca, 0xb6, 0x89, - 0x7f, 0x4a, 0x46, 0x96, - 0x04, 0xfd, 0xf3, 0xe7, 0x0a, 0x32, 0x9d, 0xdc, 0xb4, 0xd0, 0x28, 0x9d, - 0xba, 0x7a, 0x2c, 0x9e, - 0xda, 0xb5, 0x73, 0x05, 0x81, 0x3c, 0x17, 0x7c, 0x5c, 0x0f, 0xc9, 0x69, - 0x81, 0xbc, 0xef, 0xb1, - 0xde, 0x84, 0x1c, 0x48, 0x56, 0x75, 0xae, 0xeb, 0x67, 0xbb, 0x55, 0xdc, - 0x5c, 0xce, 0x7a, 0xc4, - 0xb9, 0x9c, 0xc1, 0xf3, 0x83, 0xed, 0x7e, 0x93, 0x39, 0xe9, 0x1f, 0x19, - 0x59, 0xc2, 0xf4, 0xcf, - 0xa3, 0x05, 0xbc, 0xc7, 0x62, 0xb9, 0x55, 0x87, 0x79, 0xe1, 0xd5, 0xbb, - 0x01, 0x3c, 0x17, 0x17, - 0x07, 0x3f, 0x7b, 0xbc, 0x9a, 0xab, 0x76, 0x6d, 0x5f, 0x95, 0xe7, 0x7d, - 0xb3, 0x2d, 0xc8, 0x81, - 0x64, 0x94, 0x73, 0xdf, 0xfc, 0xfc, 0xfe, 0x90, 0x1a, 0x19, 0x4c, 0xef, - 0xdb, 0xad, 0xa0, 0xde, - 0x37, 0xf7, 0xfc, 0xe0, 0xb2, 0xd0, 0x42, 0xe2, 0x3f, 0x93, 0x91, 0x25, - 0x58, 0xff, 0xec, 0xb8, - 0x59, 0x89, 0x33, 0xa3, 0x78, 0xae, 0xc0, 0xd7, 0xaf, 0xe6, 0xce, 0x9b, - 0xf0, 0xde, 0xb7, 0x45, - 0xba, 0x1e, 0xaa, 0x43, 0xab, 0x1a, 0x99, 0x70, 0x5f, 0x75, 0x94, 0xe5, - 0x79, 0xdf, 0xe0, 0xde, - 0xb7, 0x80, 0xb8, 0x1e, 0x96, 0x69, 0xb5, 0xc4, 0x71, 0xbe, 0x42, 0x6b, - 0x18, 0x81, 0x6d, 0xb3, - 0xd8, 0x6a, 0x90, 0xfe, 0x91, 0x91, 0x25, 0x5f, 0xff, 0xd6, 0x58, 0xf5, - 0xd0, 0x63, 0x31, 0x16, - 0xfd, 0x6a, 0x9e, 0xbc, 0x09, 0xd3, 0xb5, 0xca, 0x45, 0x08, 0xcf, 0x85, - 0xfb, 0xaa, 0x38, 0xfe, - 0xb2, 0x60, 0x3e, 0xa7, 0xda, 0xba, 0xaa, 0xf7, 0xcd, 0x8c, 0xc6, 0xb4, - 0x42, 0xcf, 0xe5, 0x54, - 0x73, 0xbe, 0x9a, 0xa4, 0x7f, 0x64, 0x64, 0xc9, 0xd7, 0x3f, 0xce, 0xb4, - 0x92, 0xc4, 0xf5, 0xb4, - 0x7e, 0x48, 0xde, 0xe4, 0xdc, 0x3b, 0x3f, 0x98, 0x6b, 0xe1, 0x10, 0x7a, - 0xdf, 0xd4, 0xbe, 0x2a, - 0xcf, 0xfb, 0xce, 0x52, 0x6d, 0x88, 0x01, 0x3a, 0x3c, 0x98, 0xb0, 0xb8, - 0x1e, 0x92, 0x69, 0x55, - 0x8a, 0x93, 0xf3, 0x45, 0xfa, 0x47, 0x46, 0x96, 0x78, 0xfd, 0x43, 0xb1, - 0xea, 0x99, 0xdf, 0x08, - 0x71, 0x3d, 0x38, 0xfb, 0x79, 0xf2, 0x26, 0xab, 0x1e, 0x0b, 0x91, 0x37, - 0x99, 0x6e, 0xa2, 0x7a, - 0xdf, 0xec, 0xbc, 0xaf, 0xcd, 0x7e, 0x06, 0x0e, 0x7e, 0x7a, 0x98, 0xea, - 0xa4, 0x03, 0x6a, 0xb4, - 0x33, 0x71, 0x32, 0xad, 0xf0, 0x9c, 0xaf, 0x43, 0xca, 0x7f, 0x90, 0x91, - 0x25, 0x5f, 0xff, 0x44, - 0xbd, 0x1e, 0xae, 0xf7, 0x4d, 0xf8, 0x8d, 0x36, 0x9b, 0xca, 0x9a, 0x8f, - 0xe4, 0xcb, 0x9b, 0x80, - 0xbe, 0x84, 0xf7, 0x9b, 0xb0, 0xf3, 0xd5, 0x3c, 0xd7, 0xd2, 0x47, 0x1b, - 0x1d, 0xae, 0x7f, 0x36, - 0x0f, 0xe6, 0x38, 0xd7, 0x5c, 0xf1, 0x5c, 0xb2, 0x4e, 0x5d, 0xb2, 0x1e, - 0x81, 0x69, 0x95, 0xc3, - 0xcd, 0xe5, 0x44, 0x71, 0xbe, 0xa8, 0xfe, 0x8f, 0x8c, 0x2c, 0xf1, 0xfa, - 0xc7, 0x99, 0x56, 0xca, - 0x7a, 0xbd, 0x81, 0x24, 0xae, 0xd7, 0x03, 0xb6, 0xd5, 0x2a, 0x6f, 0x62, - 0x9f, 0x0b, 0x43, 0xfb, - 0x4d, 0xac, 0xde, 0x37, 0xc8, 0xfb, 0xc2, 0xdc, 0xcb, 0xd4, 0x30, 0xd5, - 0xb5, 0x39, 0xf8, 0x5e, - 0x9e, 0x8b, 0x88, 0x35, 0xe6, 0x81, 0x69, 0x35, 0xe3, 0xf5, 0xd4, 0xc6, - 0x75, 0xe3, 0x7a, 0x22, - 0xd6, 0x99, 0x57, 0xc6, 0x12, 0xc5, 0xac, 0x39, 0xea, 0x7f, 0x23, 0x23, - 0x4b, 0xb4, 0xfe, 0x61, - 0x99, 0x56, 0x98, 0xb8, 0xde, 0x51, 0xaa, 0x9b, 0x3f, 0xa9, 0xd4, 0xaa, - 0xec, 0xfc, 0x17, 0xd4, - 0x6f, 0x02, 0x5a, 0x96, 0x19, 0xb0, 0x33, 0xdd, 0xd1, 0x8a, 0x79, 0x0a, - 0x39, 0x10, 0xe7, 0x6c, - 0x76, 0xa4, 0x75, 0xd7, 0x78, 0x2e, 0xe0, 0x5f, 0xb3, 0xbf, 0x43, 0x8f, - 0x86, 0x94, 0xe7, 0x62, - 0xc7, 0xf5, 0xee, 0x94, 0xf7, 0x54, 0x71, 0xbd, 0x0c, 0xd4, 0x30, 0xa2, - 0x39, 0x5f, 0xc4, 0x3f, - 0x20, 0x23, 0x4b, 0xb4, 0xfe, 0x59, 0x4c, 0xab, 0xfc, 0x20, 0xa6, 0xb9, - 0x6a, 0xc7, 0xc2, 0x57, - 0x95, 0xe5, 0x4d, 0x4a, 0xa7, 0xb9, 0xba, 0x3e, 0xcf, 0xb4, 0xf4, 0x25, - 0xd3, 0xbf, 0xa1, 0xd6, - 0x95, 0xf4, 0xfe, 0x8a, 0x1a, 0x6d, 0xe0, 0xe0, 0x9f, 0x6e, 0x1f, 0xa8, - 0x78, 0x2e, 0x22, 0xae, - 0x57, 0x6c, 0xa3, 0x98, 0x56, 0x3c, 0xd6, 0x89, 0xe5, 0x7c, 0x11, 0xff, - 0x8a, 0x8c, 0x2c, 0xd9, - 0xfa, 0x87, 0x64, 0x5a, 0x4d, 0x91, 0xbd, 0x6f, 0xeb, 0x9c, 0x16, 0x97, - 0x96, 0xed, 0x1c, 0x70, - 0xfe, 0xbd, 0x1d, 0xef, 0x5b, 0xea, 0x4d, 0x65, 0xef, 0x5b, 0x3f, 0xc3, - 0xe3, 0x7a, 0xc5, 0xe5, - 0x66, 0x5d, 0xc6, 0x73, 0xe1, 0x1c, 0xfc, 0x59, 0xa9, 0x81, 0x8a, 0xeb, - 0x9d, 0x55, 0x0f, 0xca, - 0x68, 0xce, 0x17, 0xf1, 0x4f, 0xc9, 0xc8, 0x12, 0xad, 0x7f, 0x16, 0xab, - 0x3e, 0xae, 0xb9, 0x6a, - 0xe1, 0x9c, 0x16, 0xcd, 0x48, 0xf5, 0x53, 0xdd, 0xf4, 0x24, 0xd3, 0xce, - 0x59, 0x33, 0x2f, 0x21, - 0x07, 0x12, 0xae, 0x7f, 0x22, 0xae, 0x97, 0x82, 0xf7, 0x17, 0xc2, 0x73, - 0x81, 0xbc, 0x09, 0x9c, - 0x4f, 0x75, 0x19, 0xcf, 0xc5, 0x7a, 0x7d, 0xe8, 0x7d, 0x63, 0xfa, 0x8c, - 0xe3, 0xf7, 0x13, 0xff, - 0x99, 0x8c, 0x2c, 0xd9, 0xfa, 0x37, 0x0c, 0x61, 0xd5, 0xbb, 0xeb, 0x41, - 0x02, 0xf8, 0xcb, 0x41, - 0x35, 0x28, 0x56, 0xef, 0x5b, 0xf8, 0x99, 0x6e, 0x90, 0xe9, 0x42, 0xef, - 0x9b, 0x36, 0x60, 0x7a, - 0xa6, 0xea, 0x7d, 0x93, 0xb0, 0xea, 0xfd, 0x1c, 0xfc, 0xaa, 0x8a, 0xe7, - 0x12, 0x39, 0xd6, 0x09, - 0x6b, 0x42, 0xf3, 0x3f, 0xc8, 0xc8, 0x92, 0xac, 0x7f, 0xda, 0xa4, 0x84, - 0x8a, 0xeb, 0x45, 0x9a, - 0xab, 0x86, 0xea, 0x7d, 0x13, 0xcc, 0x67, 0x75, 0xef, 0x9b, 0xba, 0x5e, - 0x0f, 0x62, 0x8d, 0x85, - 0xd3, 0xea, 0x41, 0x95, 0x69, 0x96, 0x74, 0x7e, 0x30, 0xe4, 0x4d, 0xd8, - 0xd7, 0x81, 0x3e, 0x23, - 0x38, 0x5f, 0x2d, 0xc1, 0xf9, 0xa2, 0xf9, 0xbf, 0x64, 0x64, 0x37, 0x5e, - 0xff, 0xd8, 0x19, 0x2a, - 0x88, 0xe7, 0x22, 0xea, 0x41, 0xf0, 0x71, 0x3d, 0xcc, 0x5c, 0x35, 0x0c, - 0xa7, 0x45, 0xf4, 0xbe, - 0x09, 0xe6, 0x33, 0xae, 0xf7, 0x4d, 0x1d, 0xd7, 0xcb, 0x41, 0x6f, 0xf2, - 0x3c, 0xd5, 0x90, 0xf2, - 0x5c, 0x20, 0x6f, 0x72, 0x52, 0xac, 0x71, 0xce, 0xd7, 0x48, 0x3e, 0x3f, - 0xd8, 0xbb, 0x26, 0xa4, - 0x7f, 0x64, 0x64, 0x37, 0x5e, 0xff, 0xe6, 0xd5, 0x46, 0xe5, 0x56, 0x79, - 0x8d, 0xe7, 0xb2, 0x8a, - 0xeb, 0xe9, 0xd7, 0x8c, 0xeb, 0xd9, 0x7e, 0xa3, 0xc5, 0x69, 0x51, 0xcd, - 0x72, 0xb3, 0x7a, 0xdf, - 0xf8, 0xdf, 0x15, 0x5f, 0x1b, 0x61, 0x2e, 0xa7, 0xaf, 0xf7, 0xcd, 0x3b, - 0x3f, 0x78, 0xd7, 0xcd, - 0xf9, 0x0a, 0x99, 0x1f, 0xec, 0x5d, 0x13, 0xd2, 0x3f, 0x32, 0xb2, 0x1b, - 0xaf, 0x7f, 0xb3, 0x4a, - 0x23, 0x88, 0xe7, 0x02, 0x75, 0xc9, 0x10, 0xd7, 0xab, 0xc6, 0x15, 0xd7, - 0x5b, 0xf1, 0x97, 0x43, - 0xcd, 0xcd, 0x3c, 0x8d, 0x87, 0x69, 0xa5, 0xe0, 0xf7, 0xdb, 0x79, 0x93, - 0xe3, 0xad, 0x43, 0xc8, - 0x1b, 0x7b, 0xf3, 0x26, 0xdb, 0xfb, 0x7e, 0x0e, 0xfe, 0x8a, 0xf3, 0x45, - 0xfa, 0x47, 0x46, 0x76, - 0xe3, 0xf5, 0x8f, 0xe9, 0x57, 0x30, 0xcf, 0xa5, 0xf2, 0x96, 0x6d, 0xf6, - 0xff, 0xcb, 0xa7, 0x9b, - 0x35, 0x29, 0xcf, 0xc5, 0x55, 0x0f, 0x12, 0x13, 0x7f, 0xd9, 0xe9, 0x7d, - 0xc3, 0xbc, 0x7b, 0xdc, - 0x5c, 0x4e, 0x5c, 0xef, 0x9b, 0xcd, 0xf9, 0x0a, 0x9b, 0x1f, 0x0c, 0x79, - 0x13, 0x88, 0x75, 0xee, - 0xcc, 0x81, 0xa3, 0x45, 0xf9, 0x0f, 0x32, 0xb2, 0x24, 0xe5, 0x3f, 0xbc, - 0x1c, 0xfc, 0xea, 0x5b, - 0xc4, 0x1c, 0x8c, 0xaa, 0x9c, 0xe7, 0xc2, 0xe3, 0x7a, 0x38, 0xa6, 0x15, - 0x8e, 0xd3, 0xb2, 0x61, - 0x64, 0xa0, 0xf7, 0x6d, 0xa8, 0xc8, 0x7b, 0x58, 0x16, 0x65, 0x2e, 0x67, - 0x26, 0xe2, 0x5c, 0xce, - 0xc0, 0xf9, 0xc1, 0xee, 0x7e, 0x13, 0xea, 0xff, 0x20, 0x23, 0x4b, 0x6a, - 0xfe, 0xd7, 0x48, 0x0d, - 0xb3, 0x6d, 0x88, 0xeb, 0x6d, 0x9f, 0x6f, 0xcb, 0x79, 0x2e, 0x90, 0x37, - 0x19, 0xe5, 0xdb, 0x10, - 0xd7, 0xdb, 0x88, 0xc3, 0x57, 0x35, 0x35, 0x83, 0xf7, 0x7e, 0x0c, 0x30, - 0xfa, 0x87, 0x9d, 0xcb, - 0x99, 0xbb, 0xee, 0x5c, 0xce, 0x15, 0x07, 0xff, 0x74, 0xe7, 0xc0, 0xd1, - 0x42, 0xe2, 0x5f, 0x91, - 0x91, 0x25, 0xb8, 0xfe, 0x45, 0xb3, 0xe2, 0x7a, 0x5a, 0x3b, 0x8c, 0xe7, - 0xb2, 0x75, 0x5a, 0xaa, - 0x41, 0x5c, 0x2f, 0xd3, 0x97, 0xf3, 0x5c, 0xb8, 0xaf, 0x7a, 0x02, 0xbe, - 0x6a, 0x0a, 0x35, 0xf7, - 0x52, 0x95, 0xf7, 0xb5, 0xe3, 0x8e, 0xf1, 0xce, 0xe5, 0x44, 0xd4, 0x30, - 0xb2, 0xb3, 0x24, 0xac, - 0x49, 0xe9, 0xb8, 0x78, 0x48, 0xfc, 0x03, 0x32, 0xb2, 0x04, 0xeb, 0x5f, - 0x10, 0xab, 0xde, 0xc7, - 0x73, 0xb1, 0x73, 0x05, 0x70, 0x2e, 0x84, 0x1e, 0x0b, 0x09, 0xcf, 0x85, - 0x9f, 0xa1, 0x80, 0xbf, - 0xbc, 0x3d, 0xd5, 0x70, 0x73, 0xdf, 0x7a, 0x08, 0xfd, 0x43, 0x33, 0xad, - 0x62, 0x9c, 0xcb, 0x69, - 0xbd, 0xa6, 0xf0, 0xa5, 0x29, 0xfe, 0x47, 0x46, 0x96, 0x58, 0xfd, 0x53, - 0xc5, 0xf5, 0x6c, 0x0e, - 0xfe, 0x59, 0xb9, 0x06, 0xfa, 0x27, 0x9d, 0x1f, 0x0c, 0x79, 0x93, 0x9e, - 0xe0, 0x2f, 0x17, 0x55, - 0xbe, 0x6a, 0x1f, 0xf4, 0x4f, 0x6f, 0xda, 0x75, 0x2f, 0xa1, 0xec, 0x67, - 0x9b, 0x69, 0xd5, 0xc7, - 0x30, 0xad, 0x0a, 0x48, 0xa6, 0x95, 0xaa, 0x86, 0xd1, 0xbd, 0x26, 0x94, - 0xff, 0x25, 0x23, 0x4b, - 0xac, 0xfe, 0x0d, 0xf3, 0xed, 0x5d, 0xc4, 0x5c, 0xb5, 0xf4, 0xa2, 0xc2, - 0xf3, 0x1a, 0xd9, 0x30, - 0x0e, 0xfe, 0x2c, 0xd7, 0x80, 0x58, 0x62, 0x61, 0xa4, 0xb5, 0x42, 0xfd, - 0x50, 0xab, 0xf7, 0xcd, - 0xfe, 0x1a, 0x60, 0x20, 0x00, 0x0f, 0x26, 0x3d, 0x4a, 0x75, 0x20, 0xe7, - 0xe2, 0xa9, 0x4b, 0x46, - 0xb3, 0xea, 0xf1, 0x4c, 0x2b, 0xe5, 0x5c, 0x4e, 0xcf, 0x9a, 0x90, 0xfe, - 0x91, 0x91, 0x25, 0x55, - 0xff, 0xb0, 0x4c, 0x2b, 0xde, 0xfb, 0x36, 0x77, 0x7a, 0xdf, 0x3c, 0x3c, - 0x17, 0x77, 0xde, 0x04, - 0xfe, 0xbe, 0x73, 0x5a, 0x94, 0xce, 0x0f, 0xe6, 0xaf, 0xe9, 0xea, 0x7d, - 0x13, 0x3f, 0xdb, 0x62, - 0xc1, 0x58, 0x1c, 0x7c, 0xab, 0x2e, 0xb9, 0xc9, 0xeb, 0x92, 0x57, 0xac, - 0x7a, 0x33, 0x3c, 0xae, - 0x57, 0x3d, 0xdc, 0x45, 0x32, 0xad, 0x54, 0x73, 0x39, 0xbd, 0x6b, 0x42, - 0xfa, 0x47, 0x46, 0x96, - 0x58, 0xfd, 0x83, 0x7a, 0x3d, 0x6c, 0xef, 0xdb, 0x34, 0xc8, 0x6f, 0x74, - 0x71, 0xf0, 0xcf, 0x76, - 0x82, 0xd8, 0x54, 0x35, 0x3f, 0x07, 0xdf, 0xdd, 0xfb, 0xc6, 0xff, 0xff, - 0x40, 0xf0, 0x60, 0x20, - 0x27, 0x0c, 0x3a, 0xe8, 0xe6, 0xb9, 0x94, 0x4e, 0x4a, 0x35, 0x88, 0xeb, - 0xf1, 0x73, 0x61, 0xc8, - 0x99, 0x32, 0x0a, 0xbf, 0x5f, 0xc5, 0xf9, 0xf2, 0xae, 0x09, 0xe9, 0x1f, - 0x19, 0x59, 0x52, 0xf5, - 0x0f, 0xcb, 0xb4, 0x42, 0xc5, 0xf5, 0x86, 0x50, 0x23, 0x53, 0xde, 0x2b, - 0x2c, 0x8a, 0x87, 0xb2, - 0xf9, 0xc1, 0x3c, 0x6f, 0x32, 0xd1, 0xdb, 0x81, 0xcc, 0x53, 0xe6, 0x9f, - 0x02, 0x07, 0xdf, 0x5f, - 0x97, 0x0c, 0x73, 0xd9, 0x77, 0xce, 0x5d, 0x33, 0x37, 0xd7, 0xd9, 0xcf, - 0x76, 0x5c, 0x0f, 0xc1, - 0xb4, 0xaa, 0x46, 0xe4, 0x7c, 0x91, 0xfe, 0x91, 0x91, 0x25, 0x55, 0xff, - 0x44, 0xbd, 0x5e, 0x26, - 0xee, 0xb9, 0x6a, 0xf2, 0xf9, 0xc1, 0xb7, 0x2b, 0x6f, 0xd9, 0x3c, 0xce, - 0x35, 0x72, 0x73, 0x9e, - 0x33, 0x91, 0xe6, 0x3d, 0x04, 0x3b, 0xba, 0xd0, 0x2c, 0x9e, 0x55, 0x56, - 0x67, 0xca, 0x20, 0x9e, - 0x0b, 0xd7, 0x42, 0xad, 0x1b, 0x1b, 0xbf, 0x7f, 0x6d, 0x4d, 0x48, 0xff, - 0xc8, 0xc8, 0x92, 0xaa, - 0x7f, 0x91, 0x98, 0x56, 0x03, 0x4c, 0xef, 0xdb, 0x3a, 0xa7, 0xc5, 0xcf, - 0xc1, 0x2f, 0x9d, 0xe7, - 0xea, 0x3c, 0xd6, 0x77, 0x9c, 0x6b, 0xea, 0xf3, 0x6c, 0x4b, 0x15, 0xd7, - 0xab, 0x9e, 0xe4, 0x6a, - 0xb9, 0x69, 0x21, 0x98, 0xe7, 0x62, 0x71, 0xf0, 0xa1, 0x46, 0x50, 0xd5, - 0x9b, 0x7c, 0x35, 0xce, - 0x17, 0xe9, 0x1f, 0x19, 0x59, 0x42, 0xf5, 0x2f, 0x24, 0xae, 0xe7, 0xad, - 0x41, 0xa9, 0xe2, 0xe7, - 0xaa, 0x85, 0xf9, 0xd2, 0xd0, 0x6f, 0xd2, 0xc9, 0xb3, 0xf3, 0x9f, 0xbe, - 0xd0, 0x5b, 0x76, 0xde, - 0x23, 0xec, 0x67, 0x8a, 0x19, 0x94, 0x1b, 0x0d, 0x6f, 0xac, 0xd1, 0xc7, - 0x73, 0x61, 0xfe, 0x31, - 0xe8, 0xea, 0xd6, 0xc9, 0xa6, 0x94, 0xe7, 0x22, 0xde, 0xdf, 0x55, 0x38, - 0x5f, 0xa4, 0x7f, 0x64, - 0x64, 0xc9, 0xd4, 0x3f, 0x27, 0xae, 0x87, 0x60, 0x5a, 0x21, 0xe6, 0xaa, - 0xa1, 0x7a, 0xdf, 0x36, - 0x8c, 0xc2, 0x49, 0xae, 0x01, 0xbd, 0x6f, 0x1a, 0x70, 0xf0, 0xc7, 0x99, - 0xb0, 0x33, 0xa5, 0xcd, - 0xaa, 0x6f, 0x06, 0xf8, 0xe4, 0xdd, 0x55, 0x8d, 0x76, 0x79, 0x8d, 0x83, - 0xef, 0xe7, 0xb9, 0x5c, - 0x3d, 0xd6, 0x49, 0xfa, 0x47, 0x46, 0x96, 0x48, 0xfd, 0x8b, 0xce, 0xb4, - 0x52, 0xcf, 0x55, 0x43, - 0x70, 0x5a, 0x36, 0x4f, 0x73, 0x8d, 0x54, 0x1f, 0xd3, 0xfb, 0x86, 0x63, - 0xd5, 0xf3, 0x1a, 0x99, - 0xdb, 0x3b, 0x7b, 0xc1, 0x3c, 0x97, 0x55, 0xde, 0x24, 0x0a, 0xbf, 0x7f, - 0x15, 0xeb, 0x24, 0xfd, - 0x23, 0x23, 0xbb, 0xf1, 0xfa, 0xc7, 0x74, 0x67, 0x2d, 0x6f, 0x8a, 0x65, - 0xd5, 0x23, 0x99, 0x56, - 0xc0, 0x9f, 0xc7, 0x70, 0x5a, 0x8a, 0x67, 0xb9, 0x3a, 0xaa, 0xf7, 0x97, - 0xbd, 0x3f, 0x31, 0x83, - 0x52, 0xc5, 0xb4, 0x2a, 0xb6, 0xec, 0xde, 0x37, 0x19, 0xcf, 0x05, 0xb4, - 0x70, 0xeb, 0xa2, 0xba, - 0x5f, 0x3e, 0x29, 0xd4, 0xa4, 0xf3, 0x83, 0x03, 0xd7, 0x84, 0xf4, 0x8f, - 0x8c, 0xec, 0xc6, 0xeb, - 0xdf, 0xac, 0xdc, 0xf4, 0xf0, 0x5c, 0xa0, 0x2e, 0x19, 0xc9, 0xaa, 0xe7, - 0x4c, 0x2b, 0x25, 0x7f, - 0x19, 0xcb, 0x69, 0xd1, 0x3b, 0x30, 0xff, 0x57, 0xc3, 0xf4, 0xfe, 0xf6, - 0x91, 0x73, 0x39, 0x83, - 0xe3, 0x7a, 0xab, 0x1a, 0x6d, 0x7f, 0xde, 0xe4, 0x96, 0x64, 0x7e, 0xb0, - 0x88, 0x75, 0x76, 0x2a, - 0x9e, 0x58, 0x27, 0xe9, 0x1f, 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0xc5, 0x6e, - 0x63, 0x55, 0x97, 0x6c, - 0x71, 0xf0, 0x67, 0xf9, 0x46, 0xf5, 0xd6, 0xce, 0x9e, 0x4a, 0xff, 0x70, - 0xfc, 0xe5, 0x14, 0x76, - 0xae, 0x5a, 0xab, 0x74, 0xa2, 0x37, 0x54, 0xbe, 0xb4, 0xd0, 0xca, 0x9c, - 0x35, 0x83, 0x12, 0x53, - 0xaf, 0x17, 0xd6, 0xfb, 0xa6, 0x19, 0xe9, 0x91, 0xde, 0x86, 0x1c, 0xf1, - 0x0e, 0xc4, 0x0a, 0x65, - 0xf3, 0x83, 0x21, 0x6f, 0x62, 0xd5, 0x30, 0xae, 0xde, 0x1f, 0xe9, 0x1f, - 0x19, 0xd9, 0x8d, 0xd7, - 0x3f, 0x76, 0xee, 0xf2, 0xf3, 0x5c, 0x40, 0x5b, 0x76, 0xd9, 0x5e, 0x0f, - 0xe1, 0xb9, 0x88, 0xb8, - 0xde, 0x49, 0x7c, 0xfc, 0x65, 0xe0, 0xb4, 0x94, 0x8e, 0x33, 0x0d, 0xd4, - 0xfb, 0x8e, 0x93, 0x69, - 0xc5, 0x7e, 0x06, 0xd4, 0x30, 0xe6, 0x47, 0xa9, 0x96, 0x93, 0x37, 0x59, - 0x9b, 0x1f, 0xbc, 0xbd, - 0x0f, 0xcc, 0x2b, 0x88, 0x75, 0xae, 0xf2, 0x26, 0xa4, 0x7f, 0x64, 0x64, - 0x89, 0xc9, 0x7f, 0x78, - 0xea, 0x92, 0x2b, 0x7b, 0xa1, 0x3c, 0x17, 0x4b, 0x77, 0x80, 0x69, 0xb5, - 0x33, 0x55, 0xc4, 0xf5, - 0xd0, 0x9c, 0x96, 0xed, 0x46, 0x69, 0x99, 0x46, 0xe9, 0x9f, 0x60, 0x5a, - 0xe1, 0xea, 0xf5, 0x30, - 0x4c, 0x2b, 0x3f, 0xbf, 0x5f, 0x63, 0xff, 0x16, 0xc4, 0xc1, 0x17, 0xfd, - 0x26, 0xd6, 0xfc, 0xe0, - 0xfe, 0x65, 0x87, 0xf4, 0x8f, 0x8c, 0x2c, 0x79, 0xf9, 0xdf, 0xcc, 0x62, - 0xa7, 0x0e, 0x79, 0x03, - 0x29, 0xcf, 0xc5, 0xe2, 0xe0, 0x17, 0x2f, 0x76, 0x0f, 0x62, 0xe3, 0x2f, - 0x2f, 0xcb, 0xf5, 0xd2, - 0x22, 0xd5, 0xc4, 0xbc, 0x6b, 0x74, 0xbd, 0x1e, 0x8a, 0x69, 0x95, 0x0d, - 0xed, 0x7d, 0x73, 0xf2, - 0x26, 0xfe, 0x7e, 0x93, 0x39, 0xf1, 0x9f, 0xc9, 0xc8, 0x92, 0xa9, 0x7f, - 0x8e, 0xdf, 0x28, 0x72, - 0x05, 0xd3, 0x75, 0x9e, 0x0b, 0xf4, 0x58, 0x70, 0x16, 0xf2, 0x5c, 0xaf, - 0xcb, 0x78, 0x2e, 0xdc, - 0x78, 0xef, 0x1b, 0xc6, 0x57, 0xad, 0x1e, 0x96, 0xe6, 0x1a, 0x4a, 0xff, - 0x38, 0xd3, 0x0a, 0x3b, - 0x97, 0x53, 0xcd, 0xb4, 0xea, 0xec, 0x22, 0xe6, 0x72, 0xa6, 0x97, 0x15, - 0x9e, 0xeb, 0x71, 0xe6, - 0x07, 0x93, 0xfe, 0x91, 0x91, 0x25, 0x52, 0xff, 0x82, 0x59, 0xf5, 0x2e, - 0x9e, 0x4b, 0x10, 0x07, - 0x3f, 0x60, 0x7e, 0xf0, 0xca, 0x57, 0xc5, 0xf1, 0x97, 0x37, 0xa7, 0x5a, - 0x0b, 0xf3, 0xae, 0x51, - 0x71, 0xbd, 0x55, 0x0d, 0x23, 0xa2, 0x46, 0x46, 0xed, 0x4b, 0xf3, 0x35, - 0x71, 0x7a, 0xdf, 0xd8, - 0x5a, 0x1c, 0x5d, 0x76, 0x49, 0xff, 0xc8, 0xc8, 0x12, 0xa7, 0x7f, 0x16, - 0xab, 0x3e, 0xc4, 0x6f, - 0x04, 0x0e, 0x3e, 0xf3, 0x09, 0x2b, 0xb7, 0xab, 0x6f, 0xd9, 0xb9, 0xb0, - 0x62, 0x85, 0x41, 0x3c, - 0x97, 0x7e, 0xaa, 0x93, 0x9a, 0x6f, 0xe3, 0x66, 0x94, 0x33, 0x5f, 0xb5, - 0xe0, 0xeb, 0x37, 0xb1, - 0xce, 0x64, 0x46, 0x90, 0x56, 0xaa, 0xe3, 0x7a, 0x01, 0xfc, 0xfe, 0xa0, - 0x53, 0x22, 0xae, 0x86, - 0x31, 0x60, 0x4d, 0x28, 0xff, 0x41, 0x46, 0x96, 0x3c, 0xfd, 0xc3, 0xb2, - 0xea, 0x75, 0xde, 0xfb, - 0x06, 0x1a, 0x27, 0xe3, 0xb9, 0x40, 0xde, 0x64, 0xf3, 0x74, 0xa7, 0x56, - 0x3d, 0xcd, 0xd7, 0xa4, - 0x75, 0xc5, 0x96, 0x9e, 0x82, 0xaf, 0x9a, 0xf3, 0x9d, 0xd5, 0x80, 0x81, - 0x90, 0x19, 0xa7, 0x3b, - 0x2e, 0x1e, 0x0c, 0xff, 0xfe, 0xe8, 0xac, 0xfa, 0x90, 0x58, 0x62, 0x84, - 0xde, 0x37, 0x6f, 0xac, - 0x93, 0xf4, 0x8f, 0x8c, 0x2c, 0x71, 0xfa, 0x17, 0x9d, 0x69, 0x65, 0xac, - 0x72, 0x05, 0x5e, 0x9e, - 0x8b, 0x27, 0x6f, 0x7a, 0x26, 0x99, 0x1f, 0xec, 0xf2, 0x55, 0xb3, 0xbe, - 0xb9, 0x97, 0x6e, 0xf6, - 0x33, 0x70, 0xf0, 0x45, 0x5d, 0x72, 0xba, 0x8d, 0xab, 0x27, 0x14, 0x73, - 0x39, 0xb5, 0x38, 0xe6, - 0x72, 0x06, 0xae, 0x09, 0xe9, 0x1f, 0x19, 0x59, 0xe2, 0xf4, 0x0f, 0xcb, - 0xb4, 0x9a, 0x6c, 0x41, - 0x5c, 0x4f, 0xe6, 0x37, 0x3a, 0x79, 0x93, 0x2d, 0x76, 0x6e, 0x0a, 0x9d, - 0x1f, 0x0c, 0x79, 0x13, - 0xcb, 0x57, 0xf5, 0x9f, 0xd5, 0x80, 0x81, 0x90, 0x75, 0xf1, 0x60, 0x76, - 0x2d, 0xff, 0x1a, 0xb4, - 0xb2, 0x38, 0xcb, 0x36, 0x64, 0x3c, 0x17, 0xfe, 0xfe, 0x22, 0xc4, 0xf5, - 0xae, 0xc6, 0xf9, 0x22, - 0xfd, 0x23, 0x23, 0x4b, 0x9c, 0xfe, 0xd9, 0xf5, 0x7a, 0xea, 0xde, 0x37, - 0x4c, 0x5c, 0xcf, 0x84, - 0x1a, 0x99, 0xad, 0x45, 0xb6, 0xa1, 0xca, 0x9b, 0x80, 0xbf, 0x1c, 0xec, - 0xab, 0x6a, 0x86, 0xcd, - 0xc1, 0xf7, 0xd6, 0x25, 0x57, 0x5c, 0x3c, 0x97, 0xac, 0x87, 0xe7, 0x12, - 0x3d, 0xae, 0xa7, 0x29, - 0x39, 0x5f, 0xeb, 0x6b, 0x42, 0xfa, 0x47, 0x46, 0x96, 0x38, 0xfd, 0x43, - 0xd7, 0xeb, 0x55, 0xd0, - 0x73, 0xd5, 0x1c, 0x5f, 0x55, 0x32, 0x3f, 0x98, 0xf7, 0x9b, 0xb0, 0x2b, - 0x3f, 0x4b, 0xb7, 0x80, - 0x73, 0xaf, 0x1d, 0x69, 0x81, 0x79, 0x0f, 0x0d, 0x6a, 0xb4, 0xa7, 0x9b, - 0x4d, 0xde, 0x93, 0x11, - 0xc2, 0x73, 0x01, 0xff, 0x5a, 0xdd, 0xfb, 0x16, 0x21, 0xd6, 0x39, 0xc8, - 0x8b, 0x7e, 0x3b, 0xcf, - 0x9a, 0x90, 0xfe, 0x91, 0x91, 0x25, 0x4e, 0xff, 0x02, 0xe2, 0x7a, 0x81, - 0x7e, 0x23, 0x92, 0x69, - 0xc5, 0x6b, 0x50, 0x82, 0x7c, 0xe9, 0x80, 0x7e, 0x93, 0xd2, 0x59, 0xae, - 0xce, 0xd9, 0xcf, 0xcc, - 0xe7, 0xcd, 0x4c, 0xd2, 0x6d, 0x99, 0x16, 0x01, 0xab, 0x3e, 0x35, 0x48, - 0x4b, 0x79, 0x2e, 0x10, - 0x6b, 0x2c, 0x9c, 0x94, 0x6b, 0x95, 0x93, 0x5c, 0x2d, 0xd5, 0x0b, 0xcb, - 0xbb, 0x60, 0x63, 0x9d, - 0x41, 0x9c, 0x2f, 0xd2, 0x3f, 0x32, 0xb2, 0xa4, 0xe9, 0x9f, 0x8c, 0x55, - 0xbf, 0x5e, 0x83, 0xb2, - 0x5b, 0x53, 0x32, 0xad, 0x90, 0x9c, 0x96, 0x34, 0xd4, 0xc8, 0x5c, 0x94, - 0xf6, 0x73, 0xf3, 0x6c, - 0x53, 0x77, 0xcd, 0xbc, 0x0c, 0x8e, 0x3b, 0xae, 0xb1, 0xea, 0x25, 0x3c, - 0x97, 0x5d, 0xde, 0xc3, - 0x2c, 0xe5, 0xb9, 0x44, 0x89, 0x75, 0x06, 0xae, 0x09, 0xe9, 0x1f, 0x19, - 0x59, 0xd2, 0xf4, 0x0f, - 0xc7, 0xb4, 0xda, 0x40, 0x32, 0xad, 0x04, 0xa7, 0x05, 0x55, 0x83, 0x72, - 0x92, 0x85, 0xd7, 0x34, - 0xc0, 0xc7, 0x4d, 0x8d, 0xd2, 0x9d, 0xcc, 0x5c, 0x0f, 0xfc, 0xd9, 0x5a, - 0x68, 0xef, 0xdb, 0x8a, - 0x83, 0x0f, 0xe7, 0xba, 0x6a, 0x18, 0xcf, 0x05, 0xf2, 0x26, 0x78, 0xce, - 0x57, 0x40, 0xac, 0x93, - 0xf4, 0x8f, 0x8c, 0x2c, 0x69, 0xfa, 0x67, 0xd5, 0x83, 0x44, 0x8b, 0xeb, - 0x49, 0x6b, 0x50, 0xae, - 0xc5, 0x69, 0x09, 0xfc, 0x1e, 0x1c, 0xab, 0x7e, 0x43, 0xd4, 0xeb, 0xcd, - 0xf5, 0x7a, 0x30, 0xcf, - 0xc5, 0xca, 0x9b, 0x4c, 0x72, 0x4d, 0xe0, 0x7c, 0xa5, 0x50, 0x9c, 0x2f, - 0x9d, 0xf4, 0x8f, 0x8c, - 0x2c, 0x69, 0xfa, 0xd7, 0xf3, 0xe6, 0x1a, 0x70, 0x71, 0xbd, 0x14, 0x9a, - 0x69, 0x85, 0x9e, 0xab, - 0x36, 0x57, 0xd4, 0xa0, 0xd8, 0x5a, 0x19, 0x61, 0x2e, 0xa7, 0xcd, 0xef, - 0xe7, 0x79, 0x93, 0x00, - 0x9e, 0x0b, 0xd4, 0x6f, 0x83, 0x8f, 0x1c, 0x32, 0x3f, 0x38, 0x64, 0x4d, - 0x48, 0xff, 0xc8, 0xc8, - 0x6e, 0xbc, 0xfe, 0x4d, 0xb6, 0x5a, 0xee, 0xba, 0x64, 0xce, 0xaa, 0x57, - 0xcd, 0x7d, 0x3b, 0xba, - 0x16, 0x7f, 0x79, 0xed, 0xac, 0x86, 0xe2, 0xb4, 0xb8, 0xb5, 0xf2, 0x1a, - 0x73, 0x39, 0xdd, 0x1c, - 0xfc, 0x95, 0x16, 0xca, 0xe6, 0x07, 0xbb, 0x38, 0x5f, 0x6b, 0xb1, 0x4e, - 0xd2, 0x3f, 0x32, 0xb2, - 0x1b, 0xaf, 0x7f, 0xc0, 0x7f, 0x76, 0xd5, 0x25, 0xf3, 0xb8, 0xde, 0x34, - 0xd5, 0x90, 0xf2, 0x5c, - 0x78, 0x5c, 0x4f, 0xc7, 0xd5, 0xc8, 0x2c, 0x62, 0xe4, 0xb4, 0xd8, 0x5a, - 0x79, 0x86, 0x63, 0x5a, - 0x21, 0x6a, 0x18, 0x8d, 0x2c, 0xe7, 0x7c, 0x95, 0xf6, 0xc3, 0xe6, 0x07, - 0x43, 0xde, 0x24, 0x98, - 0xf3, 0x45, 0xfa, 0x47, 0x46, 0x76, 0xe3, 0xf5, 0x6f, 0xb4, 0xd9, 0xf6, - 0xd4, 0x25, 0xb3, 0x3f, - 0xc3, 0x78, 0x2e, 0x31, 0xc4, 0xf5, 0xd6, 0x7c, 0x55, 0x14, 0xa7, 0xc5, - 0xad, 0x95, 0xc8, 0xb9, - 0x9c, 0x4a, 0xa6, 0xd5, 0xa2, 0x52, 0x17, 0xef, 0x4f, 0x36, 0x3f, 0x58, - 0xf4, 0x9b, 0x80, 0x2f, - 0x5d, 0x5a, 0xeb, 0x37, 0x21, 0xfd, 0x23, 0x23, 0x4b, 0x44, 0xfe, 0xc3, - 0x55, 0x97, 0xcc, 0x6b, - 0xe9, 0xee, 0xca, 0x79, 0x2e, 0xbc, 0xc7, 0x42, 0x30, 0xad, 0x10, 0x35, - 0x32, 0xf1, 0x71, 0x5a, - 0x22, 0x69, 0xe5, 0x75, 0xe6, 0x72, 0xba, 0xe7, 0x07, 0xaf, 0xf5, 0x9b, - 0x6c, 0xaf, 0xe6, 0x07, - 0x13, 0xff, 0x8a, 0x8c, 0x2c, 0x59, 0xf9, 0x5f, 0x4b, 0x8b, 0xf2, 0xd3, - 0x5c, 0x53, 0xc6, 0x73, - 0xe1, 0x1c, 0xfc, 0xc5, 0x56, 0xdd, 0x8a, 0xeb, 0x19, 0xa1, 0x35, 0x32, - 0x31, 0x72, 0x5a, 0xec, - 0xb8, 0x9e, 0x9f, 0x55, 0x1f, 0x78, 0x4a, 0x44, 0xcf, 0xe5, 0x0c, 0xe7, - 0xf7, 0x73, 0x0e, 0xfe, - 0xb4, 0xd0, 0xac, 0x04, 0xf5, 0x9b, 0xcc, 0x2e, 0x9b, 0xa4, 0x7f, 0x64, - 0x64, 0x09, 0xd2, 0x3f, - 0xab, 0xf7, 0xcd, 0xf6, 0x1b, 0xd9, 0xfe, 0x0f, 0xe4, 0xb9, 0x54, 0x6e, - 0x57, 0xf6, 0xe0, 0x7c, - 0xb5, 0x29, 0xe3, 0xb9, 0xb8, 0x6a, 0x64, 0x30, 0xfc, 0x65, 0x0c, 0xa7, - 0xc5, 0x8e, 0xeb, 0xa1, - 0x98, 0x56, 0x50, 0xc3, 0x78, 0x1a, 0xd3, 0x5c, 0x4e, 0x78, 0x4d, 0xb6, - 0x26, 0xc0, 0x6a, 0xf0, - 0xf4, 0x9b, 0x2c, 0x88, 0xff, 0x4c, 0x46, 0x96, 0x28, 0xfd, 0x93, 0xb3, - 0xea, 0x3d, 0x1c, 0x7c, - 0xc8, 0xad, 0x86, 0xf2, 0x5c, 0x22, 0xf8, 0xaa, 0x58, 0x4e, 0x8b, 0x47, - 0x2b, 0x7b, 0x31, 0x31, - 0xad, 0x6e, 0x61, 0x39, 0x5f, 0x9e, 0x35, 0x61, 0x6b, 0x91, 0xed, 0xe4, - 0x06, 0x34, 0xff, 0x88, - 0x8c, 0x2c, 0x49, 0xfa, 0x67, 0x31, 0xad, 0xf6, 0x55, 0xe7, 0x26, 0xa8, - 0x91, 0x29, 0x9f, 0x15, - 0x6b, 0xa1, 0x1c, 0xfc, 0x61, 0xa6, 0x8d, 0xa9, 0x91, 0x51, 0xf8, 0xaa, - 0xc6, 0x5a, 0x5c, 0x0f, - 0xcb, 0xaa, 0x8f, 0x6d, 0x2e, 0xa7, 0x6c, 0x4d, 0x28, 0xff, 0x41, 0x46, - 0x96, 0x24, 0xfd, 0x4b, - 0xcd, 0x76, 0x70, 0xf5, 0x7a, 0xa2, 0x06, 0xa5, 0x25, 0xe7, 0xb9, 0x40, - 0xde, 0x64, 0x6b, 0x1f, - 0xfc, 0xe4, 0xc2, 0x24, 0xd3, 0x94, 0xcd, 0x0f, 0x5e, 0xd5, 0xc8, 0x04, - 0xf7, 0x73, 0x00, 0x03, - 0x21, 0x35, 0x58, 0xb1, 0x9f, 0xb9, 0x56, 0x22, 0xde, 0x5f, 0xa4, 0xb9, - 0x9c, 0x2a, 0x5f, 0x5a, - 0xba, 0x26, 0xa4, 0x7f, 0x64, 0x64, 0x49, 0xd2, 0xbf, 0x0c, 0xa6, 0x5e, - 0x4f, 0xd6, 0xfb, 0xe6, - 0xe1, 0xb9, 0x54, 0x57, 0x33, 0x41, 0x42, 0xe6, 0x07, 0xab, 0x7c, 0x55, - 0xce, 0x3d, 0x3d, 0x06, - 0xf6, 0xb3, 0xe0, 0xe0, 0x67, 0x17, 0xdb, 0x76, 0x5c, 0xcf, 0x08, 0x3b, - 0x9f, 0x96, 0xb0, 0xbd, - 0xc9, 0xd7, 0xe2, 0x7c, 0x91, 0xfe, 0x91, 0x91, 0x25, 0x49, 0xff, 0x44, - 0x3d, 0x48, 0x46, 0xd9, - 0xfb, 0x26, 0x65, 0x5a, 0xd9, 0x0a, 0x04, 0x1c, 0x7c, 0xc8, 0x11, 0xdf, - 0x29, 0xef, 0xad, 0x62, - 0x85, 0xeb, 0xf3, 0x83, 0x21, 0x6f, 0x22, 0x7a, 0xdf, 0xb4, 0xc0, 0x7e, - 0x0e, 0x60, 0x20, 0xe4, - 0x5c, 0x3c, 0x18, 0x9e, 0x77, 0x61, 0xe7, 0x4a, 0x29, 0xcf, 0xc5, 0x8e, - 0xeb, 0x5d, 0x91, 0xdf, - 0x1f, 0x64, 0x30, 0x97, 0xb3, 0x7a, 0x1c, 0xe4, 0x4b, 0x93, 0xfe, 0x91, - 0x91, 0x25, 0x49, 0xff, - 0x44, 0xbd, 0x9e, 0x86, 0xad, 0xd7, 0x0b, 0xaf, 0x57, 0x99, 0x88, 0xb8, - 0x9e, 0xc3, 0xa6, 0x3a, - 0x0d, 0xec, 0xb1, 0x38, 0xe0, 0xbd, 0x6f, 0xf3, 0xb4, 0xac, 0xdf, 0xc4, - 0xd0, 0xfa, 0xa9, 0xae, - 0xcd, 0xc1, 0x77, 0x72, 0xd0, 0x5e, 0x9e, 0x4b, 0xd3, 0x53, 0x97, 0x1c, - 0x2d, 0xae, 0x77, 0x0d, - 0xce, 0x17, 0xe9, 0x1f, 0x19, 0x59, 0x82, 0xf4, 0xcf, 0xe0, 0xac, 0x7a, - 0x55, 0xbd, 0xde, 0x00, - 0x57, 0xaf, 0xb7, 0x1e, 0xd7, 0x93, 0xcc, 0x0f, 0x76, 0xf5, 0x9b, 0x64, - 0x47, 0x4c, 0xc7, 0x64, - 0x73, 0xe2, 0x98, 0xdf, 0x0d, 0xf5, 0x84, 0x3b, 0x67, 0xa5, 0x03, 0x29, - 0xcf, 0x05, 0x6a, 0xb4, - 0xd9, 0x6b, 0x54, 0x30, 0x4c, 0xab, 0xd9, 0x4e, 0x03, 0xc9, 0xf9, 0x12, - 0xb1, 0x4e, 0xd2, 0x3f, - 0x32, 0xb2, 0xe4, 0xea, 0x1f, 0x9e, 0x69, 0xd5, 0x06, 0xfe, 0x32, 0x6e, - 0xae, 0x9a, 0xc4, 0x97, - 0x76, 0xe5, 0x4d, 0xb8, 0x7f, 0x6c, 0x69, 0x61, 0xe9, 0x34, 0x57, 0xd7, - 0x97, 0x7a, 0x2b, 0x3b, - 0x65, 0xbe, 0xf1, 0x30, 0xd5, 0x0d, 0xd0, 0x22, 0xce, 0xaa, 0xd7, 0xec, - 0x58, 0xe3, 0xf1, 0xd6, - 0xe1, 0xce, 0x1a, 0x07, 0x7f, 0xeb, 0x00, 0x7a, 0xdf, 0xa0, 0x47, 0x23, - 0x6c, 0xe6, 0x26, 0x8f, - 0x75, 0x9e, 0xe8, 0xd7, 0xe0, 0x7c, 0x91, 0xfe, 0x91, 0x91, 0x25, 0x46, - 0xff, 0x10, 0x71, 0x3d, - 0x7e, 0x8a, 0x43, 0xd6, 0xa0, 0x44, 0xe1, 0xb4, 0x40, 0xed, 0x20, 0xe4, - 0x4d, 0x36, 0x4f, 0x72, - 0x0d, 0x67, 0xe6, 0xe5, 0xb1, 0x8f, 0xff, 0xcc, 0xb4, 0x28, 0x28, 0xae, - 0x27, 0x66, 0x6e, 0xfa, - 0x39, 0xf8, 0xbb, 0xa1, 0x3c, 0x17, 0x27, 0xd6, 0x79, 0x9c, 0x46, 0xc5, - 0x3a, 0x83, 0x7d, 0x69, - 0xd2, 0x3f, 0x32, 0xb2, 0xe4, 0xe8, 0x1f, 0x92, 0x69, 0x35, 0xdd, 0x8e, - 0x52, 0x23, 0x83, 0xe2, - 0xb4, 0xd8, 0xbe, 0x2a, 0xcc, 0x3d, 0x4a, 0x0d, 0xd3, 0x9d, 0xcc, 0x2c, - 0xdb, 0xd2, 0x4f, 0xd6, - 0xf5, 0x4f, 0xc1, 0xaa, 0xe7, 0x35, 0xda, 0xf9, 0xe3, 0xed, 0x43, 0xc8, - 0xbb, 0x84, 0xf1, 0x5c, - 0x20, 0x6f, 0x02, 0xb1, 0xce, 0x9d, 0xe9, 0xc6, 0x35, 0x62, 0x9d, 0xa4, - 0x7f, 0x64, 0x64, 0x89, - 0xd1, 0x3f, 0x1e, 0xd7, 0xab, 0x20, 0xe3, 0x7a, 0x48, 0xa6, 0xd5, 0xd5, - 0x39, 0x2d, 0x9c, 0x83, - 0xef, 0x3b, 0x8b, 0x19, 0x98, 0x7a, 0x3d, 0x6d, 0x2a, 0xea, 0xf5, 0xa4, - 0x3c, 0x17, 0x2b, 0x6f, - 0x02, 0xb1, 0xc4, 0xd2, 0x34, 0xd5, 0x94, 0xcd, 0x0f, 0x76, 0xd6, 0x04, - 0x6a, 0x64, 0x8e, 0x48, - 0xff, 0xc8, 0xc8, 0x12, 0xaa, 0x7f, 0xc6, 0x2a, 0xae, 0xb7, 0xad, 0x8c, - 0xeb, 0xc5, 0xca, 0xb4, - 0x42, 0x72, 0x5a, 0xc4, 0x59, 0x31, 0xdd, 0xc5, 0x30, 0xad, 0xd6, 0xea, - 0x09, 0x65, 0x3c, 0x17, - 0xc8, 0xbb, 0x38, 0x3c, 0x97, 0xf5, 0xf9, 0xc1, 0xea, 0x35, 0x21, 0xfd, - 0x23, 0x23, 0xbb, 0xf1, - 0xfa, 0xc7, 0xf6, 0x38, 0xd4, 0x25, 0xa7, 0xa7, 0xc5, 0x66, 0x9c, 0x71, - 0xbd, 0x38, 0x39, 0x2d, - 0xe2, 0x2c, 0x96, 0xe9, 0x5e, 0x77, 0x2e, 0xa7, 0x9b, 0x83, 0xef, 0x8f, - 0x15, 0xfa, 0xe7, 0x07, - 0xf3, 0xd7, 0x19, 0x97, 0x42, 0xfa, 0x01, 0x49, 0xff, 0xc8, 0xc8, 0x6e, - 0xbc, 0xfe, 0xcd, 0x77, - 0x1b, 0xa2, 0x2e, 0x79, 0x7b, 0x1f, 0xf6, 0x7a, 0x50, 0xae, 0xc0, 0x13, - 0xd7, 0x43, 0x31, 0xad, - 0x60, 0xae, 0x1a, 0x92, 0xd3, 0xa2, 0xae, 0x41, 0x11, 0x36, 0xca, 0x76, - 0xd0, 0x4c, 0x2b, 0xe4, - 0x5c, 0xce, 0xc2, 0x2c, 0xdf, 0x90, 0xcd, 0x0f, 0xe6, 0x79, 0x93, 0xf9, - 0x56, 0x43, 0xce, 0xf9, - 0x22, 0xfd, 0x23, 0x23, 0xbb, 0xf1, 0xfa, 0x37, 0xdd, 0x69, 0x06, 0xd5, - 0x25, 0xaf, 0xf1, 0x5c, - 0x22, 0xc7, 0xf5, 0x62, 0xe2, 0xb4, 0x38, 0x79, 0x67, 0xbd, 0xa3, 0x66, - 0x5a, 0x45, 0x9b, 0xcb, - 0x69, 0xf7, 0x15, 0x07, 0xcf, 0x0f, 0xae, 0x3a, 0x9c, 0xaf, 0xe0, 0x7e, - 0x13, 0xd2, 0x3f, 0x32, - 0xb2, 0x9b, 0x1f, 0xff, 0x13, 0x75, 0xc9, 0x9b, 0x67, 0x15, 0x5e, 0x37, - 0xe7, 0x9d, 0x99, 0x5b, - 0xf6, 0x72, 0xf0, 0x8f, 0x52, 0x1d, 0x79, 0x3d, 0x88, 0x2f, 0xae, 0x17, - 0x17, 0xa7, 0xc5, 0xd6, - 0xbf, 0x49, 0xae, 0xad, 0x66, 0x5a, 0x69, 0x38, 0xa6, 0x95, 0x94, 0xdf, - 0xef, 0xe5, 0xe0, 0x4b, - 0xfa, 0x4d, 0xac, 0xf9, 0xc1, 0x97, 0x06, 0xe9, 0x1f, 0x19, 0x59, 0x32, - 0xf2, 0xbf, 0xa0, 0x45, - 0xe5, 0x45, 0xa6, 0x2e, 0xe7, 0xb9, 0xb0, 0xfd, 0xbf, 0x2c, 0x70, 0xb6, - 0x41, 0x6e, 0xa8, 0xb5, - 0xc3, 0xf2, 0x24, 0xc8, 0xb8, 0x1e, 0x8e, 0xd3, 0x62, 0xfb, 0xca, 0xb3, - 0x5c, 0x3b, 0x3e, 0xa6, - 0x55, 0x49, 0xcd, 0xf9, 0xea, 0xa5, 0xf8, 0x2c, 0xbc, 0xca, 0x79, 0x69, - 0x7f, 0xbd, 0xdf, 0x64, - 0x9b, 0x9d, 0x31, 0x2f, 0x5b, 0xa4, 0x7f, 0x64, 0x64, 0x89, 0xd0, 0x3f, - 0x9b, 0x55, 0xdf, 0x72, - 0xd5, 0x9b, 0xac, 0xf3, 0x5c, 0xee, 0x8a, 0x0b, 0x7a, 0x2c, 0x64, 0x3c, - 0x17, 0x27, 0xae, 0xa7, - 0x9c, 0x51, 0x8e, 0xe4, 0xb4, 0xd8, 0x75, 0x37, 0xf3, 0x5c, 0x4b, 0xcd, - 0xb4, 0x12, 0x71, 0xbd, - 0x4c, 0x3c, 0x73, 0x39, 0xf9, 0xdc, 0x4b, 0x58, 0x13, 0xce, 0xc1, 0xf7, - 0xcf, 0x0f, 0x26, 0xfe, - 0x33, 0x19, 0x59, 0x42, 0xf4, 0x2f, 0x9c, 0x55, 0xbf, 0xe2, 0xe0, 0x6f, - 0xd7, 0x20, 0x2e, 0x16, - 0xc6, 0x73, 0x01, 0x2d, 0xcc, 0x44, 0x98, 0x51, 0xae, 0xf4, 0x55, 0x2d, - 0x7d, 0xce, 0x2c, 0x72, - 0xad, 0xd8, 0x98, 0x56, 0x11, 0x6a, 0x18, 0xfd, 0xbd, 0x6f, 0xce, 0xfc, - 0x60, 0x3a, 0xff, 0x91, - 0x91, 0x25, 0x43, 0xff, 0x22, 0xd6, 0xeb, 0xd9, 0x1c, 0x7c, 0x59, 0xde, - 0x04, 0x7c, 0xe9, 0xca, - 0x32, 0x8d, 0xea, 0x7d, 0x53, 0xc6, 0x12, 0x2d, 0x2d, 0xd2, 0x97, 0xb9, - 0x66, 0x61, 0x14, 0x17, - 0xd3, 0x2a, 0x8e, 0x1a, 0x46, 0xca, 0x7f, 0x90, 0x91, 0x25, 0x42, 0xff, - 0x90, 0x33, 0x28, 0xbd, - 0x71, 0x3d, 0x09, 0xcf, 0x85, 0xcf, 0x4a, 0xdb, 0xdd, 0x2b, 0x9f, 0x15, - 0x0f, 0xf2, 0x13, 0xc9, - 0xfc, 0x60, 0xab, 0x46, 0x46, 0xd5, 0xcf, 0x01, 0x0c, 0x04, 0xe8, 0x89, - 0xdb, 0x60, 0x97, 0x7e, - 0x9c, 0x6b, 0x2a, 0xeb, 0x09, 0xd1, 0x4c, 0xab, 0x38, 0x38, 0x5f, 0xa4, - 0x7f, 0x64, 0x64, 0x89, - 0xd0, 0x3f, 0xe4, 0x0c, 0xca, 0xb4, 0x2c, 0xae, 0xe7, 0xe1, 0xe0, 0x97, - 0xf7, 0xab, 0xaa, 0xf9, - 0xc1, 0xdc, 0x57, 0xcd, 0x2b, 0x7d, 0x55, 0x60, 0x20, 0xe8, 0x0b, 0x1d, - 0xd8, 0xcf, 0x6d, 0x38, - 0xff, 0xe9, 0x03, 0xad, 0x1d, 0x76, 0xb6, 0xb3, 0x98, 0x56, 0xca, 0xbc, - 0x4b, 0x3c, 0x73, 0x39, - 0x49, 0xff, 0xc8, 0xc8, 0x12, 0xa1, 0x7f, 0x91, 0x98, 0x56, 0x8a, 0x1a, - 0x94, 0x7e, 0xa6, 0x03, - 0x71, 0xbd, 0xad, 0x93, 0x52, 0x4d, 0x3a, 0x3f, 0x18, 0xf2, 0x26, 0x63, - 0xc7, 0x57, 0x95, 0x9a, - 0x9b, 0xfd, 0x0c, 0x57, 0x18, 0xcf, 0x85, 0xeb, 0xf3, 0x12, 0xcf, 0xb4, - 0x2a, 0x5e, 0x9b, 0xf3, - 0x45, 0xfa, 0x47, 0x46, 0x96, 0x04, 0xfd, 0x8b, 0xc4, 0xb4, 0x5a, 0x2a, - 0x7a, 0xdf, 0x7a, 0x29, - 0xce, 0x69, 0x01, 0x5f, 0x5a, 0xb0, 0xa9, 0xd6, 0xe7, 0x07, 0xdb, 0x79, - 0x13, 0x78, 0xcd, 0xb0, - 0x7e, 0x13, 0xe8, 0x57, 0x4b, 0x8d, 0xd2, 0x1d, 0x9b, 0x83, 0x1f, 0xc6, - 0x73, 0x11, 0x71, 0x3d, - 0x19, 0xab, 0xde, 0xed, 0xd7, 0x5a, 0x9c, 0xaf, 0x6b, 0xcf, 0xe5, 0x24, - 0xfd, 0x23, 0x23, 0x4b, - 0x84, 0xfe, 0x45, 0x60, 0x5a, 0x6d, 0x4f, 0xd5, 0xbd, 0x6f, 0x01, 0x71, - 0x3d, 0x43, 0xc5, 0xc1, - 0x87, 0xbc, 0x49, 0xba, 0xef, 0xcc, 0x7a, 0xf3, 0xe5, 0x35, 0xb2, 0x9d, - 0xdc, 0x32, 0xdb, 0x0a, - 0xe3, 0xb9, 0x00, 0x07, 0x3f, 0x07, 0x4c, 0xab, 0x79, 0x2a, 0x16, 0x7e, - 0xbf, 0x7a, 0x4d, 0x48, - 0xff, 0xc8, 0xc8, 0x92, 0xa0, 0x7f, 0x61, 0x33, 0x28, 0xdd, 0x39, 0xd8, - 0x92, 0xc5, 0x5f, 0x56, - 0xd7, 0xa0, 0x84, 0x71, 0x5a, 0x44, 0xde, 0xa4, 0x70, 0x5a, 0xa9, 0x79, - 0x38, 0x7d, 0x4c, 0xcb, - 0x8a, 0x27, 0x7a, 0x23, 0x3b, 0xcb, 0xb4, 0xd2, 0x43, 0x87, 0x83, 0x6f, - 0x9d, 0xc5, 0xf4, 0x4e, - 0x6e, 0x9e, 0x6e, 0x59, 0xe7, 0xcb, 0x60, 0x9e, 0x0b, 0xfb, 0x7e, 0x38, - 0xd7, 0xed, 0x9c, 0x6c, - 0xd6, 0xa4, 0x3c, 0x17, 0xfe, 0xfe, 0xae, 0xca, 0xef, 0x27, 0xfd, 0x23, - 0x23, 0x4b, 0xa2, 0xfe, - 0xf1, 0xb8, 0xde, 0x71, 0x4c, 0xf5, 0x7a, 0xc8, 0x1a, 0x94, 0xcc, 0x12, - 0x7c, 0xd5, 0xec, 0x61, - 0x7a, 0xa4, 0xb7, 0xed, 0x7e, 0x93, 0xd2, 0x79, 0xae, 0xce, 0xe3, 0x7d, - 0x90, 0xf7, 0x58, 0xea, - 0xad, 0x55, 0x5e, 0x57, 0x6f, 0xe7, 0x66, 0xa9, 0x76, 0x90, 0x7f, 0xec, - 0x70, 0xf0, 0x6f, 0x55, - 0xf6, 0xec, 0xfa, 0x6c, 0x29, 0xcf, 0x25, 0x42, 0xac, 0x33, 0xab, 0x5c, - 0x13, 0xd2, 0x3f, 0x32, - 0xb2, 0x24, 0xe8, 0x5f, 0x14, 0x56, 0xbd, 0x3e, 0x88, 0x87, 0x69, 0xb5, - 0xc6, 0x69, 0x61, 0x5a, - 0x06, 0xe7, 0xbe, 0xf4, 0x34, 0xdb, 0x86, 0x5a, 0x17, 0xd0, 0x41, 0x27, - 0xaf, 0x3b, 0xcd, 0xb5, - 0x73, 0x53, 0x2d, 0x54, 0x77, 0xb5, 0x81, 0xde, 0x86, 0xf3, 0xdf, 0xd6, - 0xd9, 0x96, 0x9c, 0xe7, - 0x02, 0xb1, 0xc6, 0x49, 0x5c, 0x9c, 0x2f, 0xd2, 0x3f, 0x32, 0xb2, 0x04, - 0xe8, 0x5f, 0x04, 0x56, - 0x7d, 0x55, 0xc9, 0x5f, 0x4e, 0xcd, 0x77, 0x1a, 0xd7, 0xe6, 0xb4, 0x58, - 0x1c, 0xfc, 0x55, 0xdd, - 0x4d, 0xae, 0xa5, 0x8f, 0x15, 0x75, 0xd2, 0x16, 0x73, 0x90, 0xbd, 0xbf, - 0x8e, 0x9c, 0xe7, 0x52, - 0xe6, 0xfa, 0x08, 0x35, 0x82, 0x9c, 0x61, 0xd0, 0x93, 0xde, 0x8b, 0x88, - 0x75, 0x86, 0xae, 0x09, - 0xe9, 0x1f, 0x19, 0x59, 0x12, 0xf4, 0x0f, 0x57, 0x0f, 0x92, 0xef, 0x5c, - 0x89, 0xbf, 0x2c, 0xa9, - 0x41, 0x01, 0x4e, 0x8b, 0x72, 0xd6, 0x9c, 0xa5, 0x45, 0xd0, 0xfb, 0x96, - 0x1d, 0x2a, 0xe6, 0x0d, - 0x5b, 0xfc, 0x7e, 0x2f, 0xab, 0xde, 0xcb, 0x73, 0xd9, 0x75, 0x6b, 0xa1, - 0x6c, 0x7e, 0xb0, 0x37, - 0xd6, 0xd9, 0x26, 0xfd, 0x23, 0x23, 0x4b, 0xb0, 0xfe, 0xf5, 0x33, 0x5d, - 0xd0, 0x3f, 0x65, 0x5c, - 0x0f, 0xc9, 0xaa, 0x0f, 0xe3, 0x2f, 0xfb, 0x7d, 0x69, 0x6c, 0xef, 0x5b, - 0x76, 0x99, 0x63, 0x1a, - 0xa5, 0xd0, 0x3f, 0x15, 0xbf, 0xdf, 0xca, 0x9b, 0x70, 0xce, 0x17, 0xd3, - 0x49, 0xe9, 0xfc, 0x60, - 0xc8, 0x9b, 0xa0, 0x66, 0xe1, 0x91, 0xfe, 0x91, 0x91, 0xdd, 0x78, 0xfd, - 0x9b, 0x55, 0x1a, 0xe0, - 0x37, 0x6e, 0x2d, 0xf3, 0x87, 0x32, 0x9e, 0x4b, 0xe4, 0xb8, 0x1e, 0x92, - 0xd3, 0xa2, 0xaa, 0x41, - 0xb1, 0xcf, 0x8a, 0x10, 0x0f, 0x4c, 0xf5, 0xc3, 0x75, 0x57, 0x9b, 0x94, - 0x5a, 0x4a, 0xa6, 0x95, - 0x29, 0x38, 0x5f, 0x95, 0x65, 0xf6, 0xd0, 0xce, 0x9b, 0x94, 0xd7, 0xe6, - 0x07, 0x6f, 0xef, 0x17, - 0xe7, 0xb9, 0xba, 0xcd, 0xf9, 0xda, 0xa0, 0xfa, 0x67, 0x32, 0xb2, 0x44, - 0xeb, 0x9f, 0x27, 0x57, - 0x10, 0xc0, 0x73, 0x71, 0xe2, 0x7a, 0x4a, 0x56, 0xbd, 0x86, 0xe7, 0x2f, - 0x23, 0x38, 0x2d, 0x76, - 0xde, 0x19, 0x6a, 0x9f, 0x99, 0x5f, 0x1b, 0xfa, 0xb5, 0x48, 0xa6, 0x95, - 0xcd, 0xef, 0x5f, 0xe5, - 0x96, 0x03, 0xe7, 0x07, 0x57, 0xf9, 0x7c, 0xa4, 0x9d, 0xd3, 0x52, 0x48, - 0xbf, 0x09, 0xe9, 0x1f, - 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0xd1, 0x66, 0x1b, 0xe2, 0x7a, 0xa5, 0xd3, - 0xed, 0x83, 0x30, 0x0e, - 0x3e, 0x9a, 0x69, 0x75, 0x0b, 0x5b, 0x23, 0x13, 0xc4, 0x5f, 0x0e, 0xf2, - 0x95, 0x99, 0xfe, 0xb1, - 0xf3, 0x9f, 0x16, 0x23, 0xd3, 0x4a, 0x12, 0xd7, 0xf3, 0xd4, 0x68, 0xef, - 0x2a, 0xe6, 0x07, 0x93, - 0xfe, 0x91, 0x91, 0x25, 0x43, 0xff, 0x44, 0x3d, 0x88, 0x9c, 0xe7, 0x02, - 0x1c, 0xfc, 0xd2, 0x79, - 0x65, 0xbf, 0x7c, 0x92, 0x3f, 0x4c, 0xcb, 0x78, 0x2e, 0x11, 0xe2, 0x7a, - 0x16, 0xa7, 0x65, 0x1f, - 0xf5, 0x1e, 0x07, 0xe9, 0x6e, 0x6e, 0xa9, 0x37, 0x37, 0x5e, 0x84, 0xb9, - 0x9c, 0xa1, 0xfd, 0x26, - 0xc3, 0xcb, 0x0e, 0xe9, 0x1f, 0x19, 0xd9, 0x0d, 0xd7, 0xbf, 0xc9, 0x56, - 0x6b, 0x2d, 0xae, 0xe7, - 0xe1, 0xb9, 0xac, 0x7a, 0x2c, 0x76, 0xad, 0x5c, 0x41, 0x20, 0xcf, 0x45, - 0xd4, 0xc8, 0x74, 0x31, - 0x33, 0xca, 0x05, 0xa7, 0x45, 0xed, 0xab, 0x8a, 0xbc, 0x06, 0x3b, 0x93, - 0x2d, 0x33, 0x4a, 0x46, - 0x34, 0xd4, 0xeb, 0x61, 0x99, 0x56, 0x91, 0xe6, 0x72, 0xca, 0xfa, 0x4d, - 0xe6, 0xc4, 0x7f, 0x26, - 0x23, 0xbb, 0xf1, 0xfa, 0x37, 0xdd, 0x69, 0x86, 0xf6, 0x79, 0x59, 0x33, - 0x73, 0xc1, 0x6f, 0xac, - 0xdc, 0x76, 0xb1, 0x9f, 0xef, 0xf8, 0x78, 0x2e, 0x90, 0x37, 0x19, 0xe4, - 0xda, 0x10, 0xd7, 0x53, - 0xf5, 0x56, 0x70, 0x4e, 0x8b, 0xd2, 0x57, 0x15, 0x3f, 0xc3, 0xd3, 0xfb, - 0x16, 0x16, 0xd7, 0x3b, - 0x8b, 0x83, 0x69, 0x65, 0xe9, 0xb3, 0x84, 0xf3, 0xe5, 0xe1, 0xe0, 0xcf, - 0x2e, 0x9b, 0xa4, 0x7f, - 0x64, 0x64, 0x09, 0xc8, 0x7f, 0xa8, 0x67, 0x50, 0x8a, 0x7a, 0xbd, 0x49, - 0xba, 0x19, 0xc6, 0x73, - 0x81, 0x7e, 0x33, 0xf0, 0x1b, 0x53, 0x47, 0xc1, 0x39, 0xe4, 0x95, 0xaf, - 0x5a, 0x3d, 0xac, 0x2e, - 0x33, 0xca, 0x1a, 0x41, 0xe1, 0x2b, 0x33, 0xfd, 0x0b, 0xe8, 0x7d, 0x0b, - 0x8c, 0xeb, 0xa9, 0x6b, - 0x18, 0xdb, 0xbb, 0x31, 0xcd, 0xe5, 0xd4, 0x7a, 0x34, 0xff, 0x8d, 0x8c, - 0xec, 0xc6, 0xeb, 0xdf, - 0xbc, 0xda, 0x50, 0x32, 0xad, 0xd6, 0xe3, 0x7a, 0x22, 0x57, 0x10, 0xc0, - 0xc1, 0xdf, 0x65, 0xe7, - 0x42, 0xf9, 0xfc, 0x60, 0x61, 0x28, 0xfe, 0x32, 0xd3, 0x3f, 0x60, 0x20, - 0xf0, 0xde, 0xb7, 0x49, - 0x78, 0xef, 0x5b, 0xa4, 0xb8, 0x1e, 0x7a, 0x2e, 0x67, 0xea, 0x50, 0xb9, - 0x76, 0xf4, 0x09, 0x22, - 0x23, 0xbb, 0xe1, 0xfa, 0xb7, 0xdb, 0xd8, 0x9e, 0x6a, 0x57, 0x61, 0x5a, - 0x39, 0x67, 0xaf, 0x55, - 0xde, 0xc4, 0x1b, 0x2b, 0xb4, 0x72, 0x05, 0xab, 0xf9, 0xc1, 0x56, 0xde, - 0xa4, 0x78, 0xb1, 0x7b, - 0xa0, 0xac, 0x91, 0x39, 0x4a, 0x19, 0x9c, 0xfd, 0xbc, 0xc8, 0xb5, 0xf4, - 0x09, 0xe4, 0x5c, 0x99, - 0x1e, 0xca, 0xce, 0x94, 0x51, 0x98, 0x56, 0xc8, 0xb9, 0x9c, 0x4a, 0xce, - 0x17, 0xe9, 0x1f, 0x19, - 0xd9, 0xcd, 0xd7, 0xbf, 0xc5, 0x6e, 0x03, 0xcb, 0xb4, 0x4a, 0x29, 0xfd, - 0xc6, 0x72, 0x1d, 0xf4, - 0x25, 0x2f, 0x9b, 0x1f, 0xcc, 0xf3, 0x26, 0x99, 0x16, 0xf4, 0x96, 0x29, - 0x7b, 0xdf, 0xfa, 0xe9, - 0x2e, 0x67, 0xc1, 0xd8, 0x3c, 0x18, 0xa6, 0x85, 0x81, 0x3c, 0x97, 0x08, - 0x71, 0xbd, 0x28, 0x9c, - 0x2f, 0xf5, 0x5c, 0x4e, 0xd2, 0x3f, 0x32, 0xb2, 0x24, 0xe8, 0x5f, 0x5c, - 0x4c, 0x2b, 0xfd, 0xb8, - 0x72, 0x58, 0xb5, 0x7d, 0x69, 0xc9, 0xfc, 0x60, 0xde, 0x63, 0xc1, 0x7c, - 0xe9, 0xad, 0x65, 0xbe, - 0x1e, 0xd6, 0x6f, 0x02, 0x79, 0x5f, 0x60, 0x3f, 0x73, 0x16, 0x8c, 0xc5, - 0x83, 0x09, 0xe4, 0xb9, - 0x80, 0x16, 0x42, 0x5c, 0x8f, 0x9d, 0x35, 0x37, 0xe2, 0xe0, 0xf7, 0xa3, - 0xe7, 0x72, 0x52, 0xfc, - 0x8f, 0x8c, 0x2c, 0x09, 0xfa, 0xa7, 0x0f, 0x62, 0x9c, 0xab, 0x36, 0x5b, - 0x8f, 0xeb, 0x79, 0x38, - 0xf8, 0xb7, 0x2b, 0x7b, 0xb2, 0x7e, 0x13, 0x8b, 0xc7, 0x22, 0xf2, 0x1e, - 0x23, 0x9d, 0xeb, 0x22, - 0xe8, 0x1f, 0x70, 0xb1, 0x40, 0x0b, 0x83, 0x78, 0x2e, 0xbc, 0x2e, 0x79, - 0xb1, 0x59, 0x87, 0xb8, - 0x5e, 0x08, 0xcf, 0xc5, 0xa9, 0x91, 0x89, 0x8d, 0xf3, 0x45, 0xfa, 0x47, - 0x46, 0x96, 0x88, 0xf8, - 0x1f, 0x8a, 0x69, 0x85, 0xeb, 0x7d, 0xf3, 0xf4, 0x96, 0x05, 0xc5, 0xd6, - 0x52, 0xa3, 0x42, 0x0b, - 0x74, 0x2f, 0x88, 0x83, 0xbf, 0xb9, 0xc8, 0x34, 0xd3, 0x23, 0xa6, 0x75, - 0xec, 0x4c, 0x07, 0x79, - 0x5f, 0xc8, 0x81, 0x78, 0x7b, 0xdf, 0x82, 0x79, 0x2e, 0xe0, 0xfb, 0x02, - 0x4b, 0x5a, 0xce, 0x73, - 0x89, 0x10, 0xd7, 0xc3, 0xd6, 0x30, 0x52, 0xfe, 0x97, 0x8c, 0x2c, 0x01, - 0xf5, 0x2f, 0x65, 0x65, - 0x6f, 0x59, 0x66, 0x01, 0x7e, 0x23, 0x6e, 0xae, 0xda, 0x26, 0x82, 0xa3, - 0x25, 0x7a, 0xdf, 0xd6, - 0xfb, 0x4d, 0x38, 0xff, 0x19, 0x66, 0xbd, 0x2d, 0xf5, 0x66, 0x66, 0xa1, - 0xb7, 0x78, 0xef, 0xdb, - 0x89, 0xa4, 0xf7, 0xcd, 0x5d, 0x97, 0x7c, 0x61, 0xf9, 0xd7, 0x32, 0x9e, - 0x8b, 0x38, 0x53, 0x22, - 0xf9, 0xfd, 0x79, 0x54, 0xac, 0x33, 0x7d, 0x74, 0xd9, 0x25, 0xfd, 0x23, - 0x23, 0xbb, 0xe1, 0xfa, - 0x37, 0xd9, 0x6a, 0x6d, 0xc4, 0xc4, 0xb4, 0x82, 0x1a, 0x14, 0x75, 0xef, - 0x5b, 0x00, 0xa7, 0xc5, - 0xea, 0x37, 0xd1, 0xa7, 0x99, 0x96, 0xbe, 0xb0, 0x72, 0x1e, 0xc0, 0x7f, - 0xee, 0x47, 0xe8, 0x7d, - 0x3b, 0xdb, 0x3c, 0xe0, 0x1c, 0xfc, 0x20, 0x9e, 0x8b, 0x95, 0x37, 0x89, - 0x95, 0xf3, 0xd5, 0xa7, - 0xfe, 0x37, 0x32, 0xb2, 0x1b, 0xaf, 0x7f, 0xa3, 0xa2, 0x92, 0x41, 0x9a, - 0x3f, 0xf3, 0xb1, 0xea, - 0x03, 0xfd, 0x46, 0x5c, 0x0d, 0x8a, 0x92, 0xd3, 0xd2, 0x13, 0xec, 0xe7, - 0xec, 0x32, 0xd7, 0xc2, - 0xf6, 0xbe, 0x71, 0xa6, 0x95, 0x55, 0x4f, 0x28, 0xe5, 0xb9, 0xb0, 0x33, - 0x1d, 0xc4, 0xf5, 0x4a, - 0xf3, 0x5c, 0x3d, 0x74, 0xe6, 0x26, 0xef, 0x7d, 0x43, 0xc4, 0x3a, 0xa9, - 0xff, 0x97, 0x8c, 0xec, - 0xe6, 0xeb, 0xdf, 0x20, 0xa7, 0x62, 0x90, 0xe2, 0x99, 0x56, 0x6b, 0xfc, - 0x65, 0x59, 0x0d, 0x8a, - 0xb2, 0xf7, 0xcd, 0x04, 0xfd, 0x83, 0x1c, 0x48, 0x6e, 0x81, 0xeb, 0x7d, - 0x0b, 0x60, 0xd5, 0x1b, - 0x1e, 0x0e, 0xfe, 0x9d, 0xea, 0x5b, 0x54, 0xf3, 0x83, 0xf1, 0xb1, 0x4e, - 0xb6, 0x26, 0xe3, 0xcb, - 0x16, 0xe9, 0x1f, 0x19, 0xd9, 0xcd, 0xd7, 0x3f, 0x29, 0xcf, 0xc5, 0x3a, - 0x8f, 0xa1, 0x58, 0xf5, - 0xc3, 0x02, 0x8a, 0x69, 0x85, 0xe3, 0xb4, 0x08, 0xe6, 0x29, 0xb6, 0xf7, - 0x4d, 0x1d, 0xd7, 0xd3, - 0x8c, 0xf4, 0x64, 0xb3, 0x59, 0x85, 0x1c, 0xc9, 0xb9, 0x7c, 0x7e, 0x30, - 0xe4, 0x4d, 0x70, 0x9c, - 0x2f, 0xcd, 0xd8, 0x9a, 0x90, 0xfe, 0x91, 0x91, 0xdd, 0x78, 0xfd, 0x9b, - 0xee, 0x34, 0x4b, 0x32, - 0x9e, 0x8b, 0xab, 0x1e, 0x04, 0x11, 0xd7, 0x43, 0xcf, 0x55, 0x2b, 0xab, - 0x66, 0x94, 0x83, 0xfe, - 0x41, 0xde, 0x97, 0xcf, 0x7d, 0x4b, 0x29, 0x7b, 0xdf, 0x90, 0x73, 0x39, - 0xdb, 0xbb, 0x17, 0x5b, - 0xfb, 0x61, 0xf3, 0x83, 0x21, 0x6f, 0x52, 0x3c, 0xab, 0x1c, 0x54, 0x8e, - 0x73, 0x35, 0xe9, 0xfc, - 0x60, 0x7b, 0x4d, 0x88, 0x7f, 0x40, 0x46, 0x76, 0xf3, 0xf5, 0x6f, 0xb1, - 0xdb, 0x90, 0xf2, 0x5c, - 0x60, 0xff, 0x5b, 0xbd, 0x65, 0x99, 0xeb, 0xc6, 0xf5, 0x5c, 0xbe, 0xaa, - 0x92, 0xd3, 0x62, 0xe5, - 0x7d, 0x53, 0xb3, 0x5c, 0x5b, 0x9f, 0x68, 0xca, 0xb9, 0x6f, 0xbc, 0x5e, - 0xaf, 0x1f, 0x7d, 0x2e, - 0x27, 0x9f, 0x1f, 0x3c, 0xf1, 0x71, 0xf0, 0xf9, 0xb9, 0x10, 0xea, 0x12, - 0x25, 0xf3, 0x83, 0xf9, - 0x6b, 0xb2, 0x35, 0x99, 0x11, 0xff, 0x8a, 0x8c, 0xec, 0xc6, 0xeb, 0xdf, - 0x30, 0xdf, 0x81, 0xba, - 0x64, 0xd0, 0x90, 0x35, 0x9e, 0x0b, 0xd4, 0x25, 0x8f, 0x75, 0x5e, 0xaf, - 0x97, 0x8e, 0x25, 0xae, - 0x87, 0xe4, 0xb4, 0x40, 0xde, 0xf7, 0x58, 0x6f, 0xc2, 0xdc, 0xcb, 0xac, - 0x8a, 0x69, 0xd0, 0xcf, - 0x76, 0xaa, 0x4c, 0x9f, 0xd3, 0xd7, 0x9c, 0xcb, 0xc9, 0xf3, 0x26, 0xd3, - 0x42, 0x13, 0xce, 0x92, - 0xa1, 0xf3, 0x83, 0x41, 0x0b, 0x81, 0xf3, 0x45, 0xfc, 0x3f, 0x32, 0xb2, - 0x9b, 0xaf, 0x7f, 0xee, - 0x5c, 0x81, 0xc5, 0x73, 0xa9, 0xb8, 0xea, 0x92, 0xab, 0xb7, 0x76, 0xf6, - 0x80, 0x19, 0xb5, 0x39, - 0x93, 0xf3, 0x5c, 0xf0, 0x71, 0x3d, 0x24, 0xa7, 0x85, 0xe7, 0x7d, 0xb3, - 0x2d, 0xc8, 0x81, 0x64, - 0x94, 0x73, 0xdf, 0x62, 0x9c, 0xcb, 0x69, 0xcf, 0x02, 0x9d, 0x66, 0x9a, - 0xb2, 0xf9, 0xc1, 0x3c, - 0x6f, 0x32, 0x2f, 0x34, 0x76, 0x49, 0xff, 0xc8, 0xc8, 0x92, 0xa2, 0x7f, - 0xde, 0x5c, 0x81, 0xab, - 0x2e, 0xb9, 0x7a, 0xc7, 0xcb, 0xc1, 0x0f, 0xe2, 0xb9, 0xf0, 0x7a, 0x90, - 0x53, 0x44, 0x5c, 0x0f, - 0xcb, 0x69, 0x19, 0x65, 0x79, 0xde, 0x97, 0xf7, 0xbe, 0xa9, 0x66, 0xc4, - 0x61, 0xeb, 0xf5, 0x4e, - 0xae, 0x32, 0x97, 0x53, 0x32, 0x3f, 0x18, 0xe6, 0x67, 0x2e, 0x48, 0xff, - 0xc8, 0xc8, 0x92, 0xa7, - 0x7f, 0xde, 0x3c, 0x44, 0x76, 0xb1, 0x73, 0x08, 0xfa, 0x22, 0xe7, 0xb9, - 0x88, 0xbc, 0x89, 0x7f, - 0xae, 0x5a, 0xb0, 0xaf, 0x8a, 0xe3, 0xb4, 0x08, 0xe6, 0x73, 0xaa, 0xad, - 0x23, 0xe6, 0xbe, 0x21, - 0xe7, 0x72, 0x5a, 0xbd, 0x6f, 0x48, 0xce, 0x57, 0x90, 0xe6, 0x7a, 0xfa, - 0x4d, 0xd8, 0x5a, 0x90, - 0xfe, 0x91, 0x91, 0x25, 0x5b, 0xff, 0x78, 0xdc, 0xac, 0x0c, 0x7c, 0xe8, - 0x9a, 0x94, 0xe7, 0x02, - 0x79, 0x93, 0xf3, 0xad, 0x03, 0xe1, 0x37, 0xa6, 0x9b, 0x52, 0x9e, 0x8b, - 0xe5, 0xab, 0x72, 0xfe, - 0xb2, 0xe2, 0xac, 0x96, 0x9a, 0xe4, 0xda, 0x50, 0xf7, 0x22, 0xed, 0x7d, - 0xf3, 0xc6, 0xf5, 0xea, - 0x61, 0x71, 0x3d, 0xfb, 0x1c, 0x17, 0xe7, 0x5c, 0xce, 0x0c, 0xc4, 0x3a, - 0x49, 0xff, 0xc8, 0xc8, - 0x12, 0xaf, 0x7f, 0xc0, 0xaa, 0xdf, 0xf5, 0xb1, 0xea, 0xb5, 0x23, 0x17, - 0xcf, 0xc5, 0xf6, 0x8f, - 0x9f, 0xda, 0x0d, 0x9d, 0x1f, 0x2c, 0xce, 0x75, 0x38, 0xfe, 0x32, 0xe4, - 0x7d, 0x81, 0xf9, 0x8c, - 0xe9, 0x7d, 0xc3, 0x31, 0xad, 0x34, 0x6c, 0x8d, 0x0c, 0xbe, 0x86, 0x91, - 0xe2, 0x7f, 0x64, 0x64, - 0x89, 0xd7, 0x3f, 0x05, 0xab, 0xde, 0xea, 0xb1, 0xd8, 0x6c, 0x80, 0x0e, - 0x86, 0xcd, 0x0f, 0x86, - 0xbc, 0x09, 0xf7, 0x55, 0x11, 0x35, 0x32, 0x90, 0xf7, 0xd5, 0x47, 0x1b, - 0x1d, 0xd0, 0x3f, 0x60, - 0x5f, 0x69, 0x92, 0x5e, 0xb5, 0xa8, 0x71, 0x3d, 0x3d, 0xa6, 0xb9, 0x9c, - 0x82, 0xf3, 0x45, 0xf5, - 0x7f, 0x64, 0x64, 0x09, 0xd7, 0x3f, 0xa3, 0x78, 0x8e, 0x99, 0xab, 0x96, - 0xed, 0x42, 0x5c, 0x4f, - 0x1f, 0x65, 0x5b, 0xc1, 0xf3, 0x83, 0x05, 0x07, 0x3f, 0xb7, 0xdc, 0x3e, - 0x04, 0x5f, 0x35, 0xb4, - 0xdf, 0x84, 0xbd, 0x66, 0xc6, 0xca, 0xfb, 0xba, 0xd9, 0xcf, 0xd9, 0x69, - 0xba, 0xed, 0xe3, 0xb9, - 0x70, 0x8b, 0x95, 0x69, 0x85, 0x9c, 0xcb, 0x29, 0xd6, 0x84, 0xfa, 0x3f, - 0xc8, 0xc8, 0x92, 0x9e, - 0xff, 0xc0, 0x31, 0xad, 0x0a, 0xed, 0xea, 0x6d, 0x17, 0x7f, 0x59, 0x32, - 0x3f, 0x98, 0xf7, 0xe0, - 0xb2, 0xaf, 0x0b, 0xed, 0x37, 0xb1, 0x7a, 0xdf, 0x20, 0xef, 0x0b, 0x35, - 0x80, 0x9c, 0x87, 0x05, - 0x3a, 0xc8, 0xfe, 0x74, 0xcf, 0x99, 0x13, 0x35, 0xda, 0xa9, 0x2e, 0x8e, - 0x69, 0x85, 0x8b, 0xeb, - 0xa5, 0x97, 0x95, 0x3a, 0x9e, 0xf3, 0x75, 0xd9, 0x26, 0xfd, 0x23, 0x23, - 0x4b, 0xb0, 0xfe, 0x1d, - 0xa5, 0x38, 0xd3, 0x2a, 0x8f, 0x62, 0x5a, 0x49, 0xe2, 0x7a, 0xee, 0xbc, - 0x09, 0xfb, 0x59, 0xfc, - 0x5c, 0x68, 0xb3, 0xa9, 0x82, 0xfa, 0x4d, 0x2c, 0xfd, 0x83, 0xbc, 0x2f, - 0xe4, 0x40, 0xa0, 0x47, - 0x23, 0x35, 0xce, 0x74, 0xb2, 0xec, 0x0c, 0xe8, 0xf4, 0x67, 0x58, 0xfe, - 0xf5, 0x0e, 0xf3, 0xaf, - 0xb9, 0x16, 0x4d, 0xd2, 0xcd, 0x54, 0x88, 0x8f, 0x8c, 0xe7, 0xf7, 0x83, - 0x2f, 0xad, 0xa8, 0x61, - 0x74, 0xd6, 0x84, 0xf8, 0x2f, 0x64, 0x64, 0xc9, 0xd6, 0xbf, 0x98, 0x98, - 0x56, 0x96, 0xdf, 0x08, - 0xbd, 0x6f, 0x3b, 0xc7, 0xf9, 0x9a, 0x6c, 0x7e, 0x70, 0x6e, 0x92, 0x6e, - 0xa5, 0x06, 0xa9, 0x2e, - 0xf8, 0xbc, 0x1a, 0xe8, 0x9f, 0x77, 0xee, 0xa5, 0x91, 0x1e, 0xea, 0x6d, - 0x7f, 0xdf, 0x2e, 0x5c, - 0xe0, 0x5f, 0xcb, 0x78, 0x2e, 0x4e, 0x5c, 0xef, 0x1c, 0xc7, 0xef, 0x57, - 0x72, 0xbe, 0x9c, 0x35, - 0x21, 0xfe, 0x29, 0x19, 0x59, 0xa2, 0xf5, 0xcf, 0xaa, 0xd7, 0x4b, 0xc5, - 0x38, 0x57, 0x8d, 0xf9, - 0xaa, 0xed, 0x0d, 0xc9, 0xfc, 0xe0, 0xd2, 0x59, 0xae, 0x0e, 0x39, 0x0f, - 0xf0, 0x7b, 0x33, 0xe3, - 0x54, 0x07, 0x72, 0x20, 0x32, 0x1f, 0x34, 0x33, 0x12, 0x7d, 0xbb, 0x4e, - 0xce, 0x45, 0xc2, 0x73, - 0x81, 0x58, 0xa3, 0xe8, 0x7d, 0xcb, 0xa9, 0x99, 0x56, 0x17, 0x88, 0x58, - 0xe7, 0xc0, 0xae, 0x61, - 0x24, 0xfd, 0x23, 0x23, 0x4b, 0xb4, 0xfe, 0x0d, 0x0b, 0x7c, 0xae, 0x9a, - 0x86, 0xa9, 0x07, 0x39, - 0xc9, 0x5c, 0x71, 0xae, 0xda, 0xaa, 0xdf, 0xa4, 0xb0, 0xf4, 0xc6, 0xfb, - 0x32, 0xaa, 0xde, 0x37, - 0xd0, 0x22, 0x76, 0x76, 0xcc, 0x4d, 0x83, 0x6b, 0x71, 0x84, 0x7f, 0xbd, - 0x79, 0xa8, 0x2f, 0x77, - 0x0e, 0xab, 0x27, 0xb9, 0x5a, 0xe8, 0x7d, 0x44, 0x88, 0x75, 0x8a, 0x35, - 0xa1, 0xf9, 0x1f, 0x64, - 0x64, 0x49, 0xd6, 0xbf, 0xd0, 0xb8, 0x9e, 0xcb, 0x22, 0xcd, 0x55, 0x0b, - 0xe5, 0xb4, 0x68, 0x46, - 0x6a, 0x9c, 0x6d, 0xc3, 0xf9, 0x0f, 0x38, 0xf8, 0xca, 0xde, 0xb7, 0x91, - 0xd3, 0xfb, 0x26, 0xbe, - 0x1b, 0x18, 0x06, 0xb3, 0x42, 0xd3, 0x3b, 0x5b, 0x89, 0xf9, 0xc7, 0xec, - 0xbc, 0x56, 0xbd, 0xd8, - 0x92, 0xf3, 0x5c, 0xac, 0xb8, 0x1e, 0xbc, 0x3f, 0x7c, 0xac, 0x93, 0xe6, - 0xff, 0x92, 0x91, 0x25, - 0x59, 0xff, 0x62, 0x65, 0x5a, 0xf1, 0x1a, 0x19, 0x35, 0xa7, 0x65, 0x63, - 0x24, 0x7a, 0xdf, 0x38, - 0x07, 0x1f, 0xd5, 0xfb, 0x16, 0x1c, 0xd7, 0xe3, 0xfe, 0xb5, 0xdd, 0xc3, - 0xec, 0xab, 0x4b, 0x5c, - 0xe3, 0xb9, 0xb8, 0x38, 0x5f, 0xa8, 0x58, 0xe7, 0x39, 0xac, 0x09, 0xe9, - 0x1f, 0x19, 0xd9, 0xcd, - 0xd7, 0x3f, 0xcd, 0x08, 0x8f, 0xeb, 0x21, 0x99, 0x56, 0x63, 0xf5, 0xdc, - 0x37, 0x0c, 0xa7, 0x45, - 0xb3, 0x7a, 0xdf, 0xf8, 0xdf, 0xd5, 0xbd, 0x6f, 0x6a, 0x56, 0x7d, 0x4f, - 0xc4, 0x1d, 0x77, 0x4e, - 0x8b, 0x07, 0x9e, 0xbc, 0xc9, 0x5d, 0xc1, 0x73, 0x70, 0xf2, 0x26, 0x23, - 0xc1, 0xf9, 0xc2, 0xc7, - 0x3a, 0x49, 0xff, 0xc8, 0xc8, 0x6e, 0xbc, 0xfe, 0x8d, 0x8b, 0xad, 0x20, - 0x9e, 0x8b, 0x13, 0xd7, - 0xc3, 0x33, 0xad, 0x62, 0x99, 0xab, 0x66, 0xf7, 0xbe, 0x71, 0xfd, 0x43, - 0xf5, 0xbe, 0xe1, 0xea, - 0xf5, 0x78, 0xdc, 0xd1, 0x95, 0x37, 0xe1, 0xb5, 0x38, 0xee, 0xbc, 0xc9, - 0xc5, 0xf6, 0x3e, 0xd4, - 0x26, 0x16, 0xe4, 0xf3, 0x83, 0x7d, 0x6b, 0x42, 0xfa, 0x47, 0x46, 0x76, - 0xe3, 0xf5, 0x6f, 0xb1, - 0xdb, 0x08, 0xe2, 0xb9, 0x80, 0xf6, 0x08, 0x56, 0xbd, 0xaa, 0x1e, 0x24, - 0xcd, 0xfd, 0xc6, 0xab, - 0xf0, 0x97, 0x03, 0xcf, 0x57, 0x56, 0xef, 0x1b, 0xe6, 0xdd, 0x63, 0x7b, - 0xdf, 0x02, 0xe7, 0x72, - 0xf6, 0x80, 0xfd, 0x9c, 0x6f, 0x85, 0xe5, 0x4d, 0x82, 0xfa, 0x4d, 0xf2, - 0x4e, 0xac, 0x93, 0xf4, - 0x8f, 0x8c, 0xec, 0xe6, 0x9f, 0xff, 0x4a, 0xad, 0x35, 0x9e, 0x8b, 0x55, - 0x97, 0x0c, 0xbd, 0x65, - 0x5b, 0xd3, 0x54, 0x38, 0x83, 0x80, 0xf3, 0x97, 0xab, 0x18, 0xfe, 0x32, - 0x82, 0xd3, 0xb2, 0x61, - 0x64, 0x16, 0xb9, 0x56, 0x66, 0xa8, 0x88, 0x11, 0x5a, 0x5f, 0x5b, 0x38, - 0xab, 0xa2, 0xe7, 0x72, - 0x86, 0xf1, 0xfb, 0x21, 0x6f, 0x92, 0x3f, 0x29, 0x1f, 0x02, 0xd7, 0xcf, - 0x9d, 0x37, 0x59, 0xeb, - 0x37, 0x39, 0xd2, 0xba, 0x2b, 0xce, 0x17, 0xe9, 0x1f, 0x19, 0x59, 0x12, - 0xf2, 0x1f, 0x6e, 0x9e, - 0xcb, 0x8a, 0x83, 0xcf, 0xce, 0x84, 0x4c, 0x03, 0xca, 0x21, 0x3c, 0x17, - 0x3b, 0xae, 0xc7, 0x99, - 0x56, 0xb1, 0xf0, 0x97, 0x35, 0x43, 0x5f, 0xe6, 0x98, 0xff, 0x89, 0xd1, - 0x3f, 0x11, 0xd7, 0x8b, - 0x8b, 0x69, 0xa5, 0x01, 0xe7, 0xeb, 0x54, 0xaf, 0x41, 0xde, 0xc4, 0xe9, - 0x61, 0x0e, 0xe8, 0x37, - 0xe1, 0x35, 0x8c, 0xec, 0x99, 0x90, 0xea, 0x51, 0xfd, 0x0b, 0x19, 0x59, - 0xc2, 0xf2, 0xbf, 0xbc, - 0x2e, 0x19, 0xe6, 0x60, 0x94, 0x4e, 0xb7, 0x6b, 0x2a, 0x9e, 0x8b, 0x13, - 0xd7, 0x43, 0xd4, 0xc8, - 0xa0, 0x7c, 0x55, 0x57, 0xef, 0x9b, 0xf2, 0xbd, 0x5b, 0x4c, 0xab, 0xf8, - 0xe6, 0x72, 0x56, 0xfd, - 0xb1, 0xce, 0xf0, 0x7e, 0x93, 0x09, 0xf1, 0x5f, 0xc8, 0xc8, 0x12, 0x5b, - 0xff, 0x62, 0x31, 0x53, - 0x8a, 0x8b, 0xcd, 0xfa, 0x3a, 0xcf, 0xc5, 0xc5, 0xc1, 0x9f, 0x6d, 0x35, - 0xb0, 0xfc, 0xe5, 0x9d, - 0xa9, 0x2a, 0x96, 0x98, 0x32, 0xec, 0xde, 0x37, 0xe5, 0x7b, 0x8f, 0x34, - 0x97, 0x53, 0xcd, 0xb4, - 0xca, 0x85, 0xf1, 0xfb, 0x83, 0xfa, 0x4d, 0x88, 0x7f, 0x4a, 0x46, 0x96, - 0x64, 0xfd, 0x13, 0xbd, - 0x6f, 0x3d, 0xc1, 0x24, 0x90, 0xf1, 0x5c, 0xca, 0xb7, 0xca, 0xfb, 0x70, - 0xfe, 0x93, 0xf2, 0x5c, - 0xa2, 0xf8, 0xaa, 0x5c, 0xff, 0x74, 0x25, 0xf3, 0xd9, 0xad, 0xcf, 0x71, - 0xf5, 0x26, 0x47, 0xe1, - 0x7c, 0xe5, 0x67, 0xf9, 0x66, 0x71, 0x4c, 0xfc, 0x17, 0x32, 0xb2, 0xc4, - 0xea, 0xdf, 0x30, 0xcf, - 0x99, 0x56, 0x5a, 0x40, 0x9f, 0x84, 0x9b, 0x83, 0x5f, 0xbd, 0xbb, 0x9e, - 0x37, 0xf1, 0xf0, 0x5c, - 0xac, 0x1a, 0x19, 0x14, 0x7f, 0x79, 0x90, 0xee, 0xc2, 0xdc, 0x37, 0x97, - 0xaf, 0x6a, 0x5c, 0x37, - 0xae, 0x97, 0x5e, 0x22, 0x6a, 0x18, 0xaf, 0xc4, 0xf9, 0xa2, 0xfc, 0x07, - 0x19, 0x59, 0x52, 0xf5, - 0x0f, 0xc3, 0xaa, 0x87, 0xbc, 0x49, 0xe1, 0xb4, 0x7a, 0x00, 0xb5, 0x73, - 0xd2, 0xf9, 0xc1, 0x90, - 0x37, 0x19, 0xa4, 0x3b, 0xa8, 0x19, 0xe5, 0x43, 0x98, 0xfb, 0x96, 0x71, - 0xce, 0x88, 0xe9, 0x51, - 0xaa, 0x03, 0x39, 0x97, 0xc0, 0xf3, 0x60, 0x14, 0x56, 0xfd, 0x32, 0x9e, - 0xb9, 0x9c, 0xde, 0x35, - 0x21, 0xfd, 0x23, 0x23, 0x4b, 0xac, 0xfe, 0x21, 0xeb, 0xf5, 0xf2, 0xa7, - 0xbb, 0xb5, 0xed, 0xa9, - 0xd6, 0x08, 0xe2, 0xb9, 0x38, 0x79, 0x93, 0x93, 0x62, 0xad, 0x72, 0xbb, - 0xb2, 0x97, 0x1b, 0xa5, - 0x5a, 0xb2, 0xf9, 0xc1, 0x42, 0x5f, 0xf4, 0x76, 0x6e, 0x9e, 0x76, 0xf4, - 0x8f, 0xb3, 0x10, 0x96, - 0x7a, 0x33, 0x3b, 0xcb, 0xb4, 0x81, 0x83, 0xef, 0xa9, 0x4b, 0x16, 0xac, - 0x7a, 0x14, 0xd3, 0x4a, - 0x5d, 0xc3, 0x88, 0x9c, 0xcb, 0x39, 0xdd, 0x76, 0xc5, 0x3a, 0x49, 0xff, - 0xc8, 0xc8, 0x92, 0xaa, - 0x7f, 0x11, 0x99, 0x56, 0x2d, 0xf7, 0xbf, 0xb9, 0xe7, 0x07, 0xef, 0xba, - 0x39, 0x04, 0x16, 0x07, - 0x5f, 0xd6, 0x6f, 0x92, 0x9a, 0xea, 0x4e, 0xef, 0x1b, 0xcf, 0x19, 0x2f, - 0x2d, 0x16, 0x8c, 0xc5, - 0xc1, 0x2f, 0x5f, 0xec, 0xec, 0x3b, 0x35, 0xda, 0xf3, 0x38, 0xe3, 0x7a, - 0xb8, 0xb9, 0x9c, 0xde, - 0x35, 0x21, 0xfd, 0x23, 0x23, 0x4b, 0xaa, 0xfe, 0x89, 0x7a, 0xbd, 0xab, - 0x32, 0xad, 0xdc, 0x79, - 0x53, 0xbd, 0x55, 0x38, 0xde, 0x3a, 0x84, 0xb3, 0x60, 0xd8, 0xfc, 0x60, - 0x88, 0x33, 0x66, 0x66, - 0xb9, 0x96, 0x87, 0x79, 0x0a, 0x0c, 0x84, 0x61, 0xaa, 0x9b, 0x9e, 0x66, - 0xdb, 0x50, 0x17, 0xe3, - 0xf1, 0xaf, 0x2f, 0xca, 0xfb, 0xc0, 0x3e, 0xc8, 0xca, 0x78, 0x2e, 0x11, - 0xe3, 0x7a, 0x18, 0xce, - 0x97, 0xb7, 0x86, 0x91, 0xf4, 0x8f, 0x8c, 0x2c, 0xa9, 0xfa, 0x17, 0x89, - 0x69, 0xa5, 0xa8, 0x41, - 0x61, 0xbe, 0x6a, 0x0b, 0x6a, 0x50, 0x02, 0xe7, 0x07, 0xbb, 0x38, 0xf8, - 0x59, 0xe8, 0x7d, 0x1b, - 0x4b, 0xe6, 0x07, 0x33, 0x8d, 0xd3, 0x27, 0x85, 0x66, 0xf1, 0x64, 0xbb, - 0xc6, 0xfb, 0xd5, 0xee, - 0x0a, 0xff, 0x9a, 0x6b, 0x61, 0x10, 0xcf, 0xc5, 0xca, 0xd5, 0x44, 0x8f, - 0xeb, 0x85, 0xd4, 0xc8, - 0x78, 0xd6, 0x84, 0xf4, 0x8f, 0x8c, 0x2c, 0xa1, 0xfa, 0xc7, 0x99, 0x56, - 0xb1, 0xcd, 0x55, 0xf3, - 0x71, 0x5a, 0x02, 0xe7, 0x07, 0x33, 0x2d, 0x2b, 0x9e, 0xe6, 0xea, 0xfa, - 0x22, 0xdb, 0xca, 0x8c, - 0x99, 0x8e, 0xf5, 0xa5, 0x71, 0x42, 0x5e, 0xa3, 0x5d, 0x3c, 0xaf, 0x1e, - 0x80, 0x3f, 0x1d, 0x50, - 0xa3, 0x5d, 0x2b, 0xcc, 0x2c, 0x0e, 0x7e, 0x3f, 0xd3, 0xc1, 0xbc, 0x3f, - 0x11, 0xd7, 0xc3, 0x71, - 0xbe, 0x56, 0x6b, 0x42, 0xfa, 0x47, 0x46, 0x96, 0x4c, 0xfd, 0x0b, 0x8a, - 0xeb, 0x05, 0xd5, 0xa0, - 0xe0, 0x98, 0x56, 0x21, 0x9c, 0x16, 0x17, 0x07, 0x7f, 0xbb, 0x56, 0x04, - 0xfe, 0xbd, 0xc5, 0x7e, - 0xb6, 0x66, 0x9f, 0x4b, 0x4d, 0xf4, 0xe1, 0x6a, 0x4d, 0x11, 0x6b, 0x2c, - 0x36, 0xb6, 0x2e, 0x02, - 0x66, 0x6e, 0x32, 0xff, 0x1a, 0x34, 0x51, 0x1f, 0x32, 0x2d, 0x0c, 0x99, - 0xb9, 0x89, 0x8d, 0x75, - 0x5a, 0x9c, 0xaf, 0x16, 0xe9, 0x1f, 0x19, 0x59, 0x82, 0xf5, 0x0f, 0x5b, - 0xaf, 0x37, 0x2a, 0x46, - 0x98, 0xab, 0xa6, 0xe2, 0xb4, 0x64, 0xba, 0x9b, 0xa7, 0xb9, 0x46, 0x66, - 0x92, 0x6e, 0xc3, 0xac, - 0x37, 0xd0, 0x40, 0x79, 0xdc, 0x31, 0x20, 0xae, 0xd7, 0x4b, 0x75, 0x9d, - 0x1a, 0x6d, 0x1f, 0xe7, - 0x0f, 0xfc, 0xeb, 0x55, 0xac, 0x51, 0x5b, 0xab, 0xd1, 0xe6, 0xfa, 0x8c, - 0xe4, 0x7c, 0xad, 0xd6, - 0x84, 0xf4, 0x8f, 0x8c, 0x2c, 0x91, 0xfa, 0x87, 0x8c, 0xeb, 0x21, 0x6b, - 0x64, 0x70, 0x9c, 0x16, - 0xa6, 0x7f, 0x70, 0xfe, 0x13, 0x67, 0x49, 0xcd, 0xd0, 0x06, 0x29, 0xb9, - 0xcf, 0x6a, 0xc5, 0xf5, - 0x64, 0xbd, 0x6f, 0x9a, 0x5d, 0xa3, 0x7d, 0xb2, 0x53, 0x73, 0xf2, 0x2e, - 0x76, 0xac, 0xf1, 0x7c, - 0x7b, 0x8d, 0x83, 0xcf, 0xe3, 0x7a, 0x73, 0x2d, 0x62, 0xac, 0x93, 0xf4, - 0x8f, 0x8c, 0x2c, 0x91, - 0xfa, 0x67, 0xf5, 0xbe, 0xa1, 0xe2, 0x7a, 0x4a, 0xa6, 0x95, 0x06, 0x73, - 0xd5, 0x50, 0x9c, 0x96, - 0xd2, 0xa9, 0xad, 0x7f, 0x0a, 0x43, 0xd6, 0xeb, 0x6d, 0x4c, 0xb7, 0x39, - 0x1f, 0xdf, 0x93, 0x37, - 0x79, 0xca, 0x9f, 0x37, 0xc9, 0x35, 0x04, 0xe7, 0x4b, 0x53, 0x71, 0xbe, - 0xba, 0xde, 0x35, 0x21, - 0xfd, 0x23, 0x23, 0xbb, 0xf1, 0xfa, 0xc7, 0x74, 0xc7, 0xc3, 0x73, 0xe1, - 0xf5, 0x20, 0x51, 0xe2, - 0x7a, 0x59, 0x25, 0xd3, 0x65, 0xfb, 0x16, 0x8e, 0xd3, 0x52, 0x3a, 0xd1, - 0x1b, 0x2a, 0x5f, 0x5a, - 0x68, 0x25, 0xd4, 0xeb, 0x61, 0x59, 0xf5, 0x4e, 0xdc, 0x51, 0xc4, 0x1a, - 0x67, 0x85, 0x46, 0xe9, - 0xcc, 0x57, 0xa3, 0xcd, 0x74, 0x71, 0xe7, 0x0c, 0xd8, 0x36, 0xc1, 0xf3, - 0x83, 0x83, 0xd7, 0x84, - 0xf4, 0x8f, 0x8c, 0xec, 0xc6, 0xeb, 0xdf, 0xbc, 0xda, 0xf0, 0xf0, 0x5c, - 0xa0, 0x2e, 0x79, 0xec, - 0x9d, 0xab, 0x76, 0xbd, 0xb8, 0x1e, 0x9e, 0xd3, 0x52, 0x3a, 0xce, 0x34, - 0x50, 0xef, 0x9b, 0xd7, - 0xeb, 0x6d, 0xab, 0xe7, 0x72, 0x4a, 0xe3, 0x7a, 0x76, 0x8d, 0x76, 0xb1, - 0xb1, 0x75, 0xee, 0xd2, - 0x42, 0xc9, 0xfc, 0x60, 0xfe, 0x3d, 0xe3, 0x62, 0xdb, 0x1b, 0xeb, 0x24, - 0xfd, 0x23, 0x23, 0xbb, - 0xf1, 0xfa, 0x37, 0xab, 0x34, 0xfc, 0x75, 0xc9, 0xa5, 0x93, 0xad, 0x1a, - 0xf4, 0x96, 0xa5, 0xa4, - 0x3c, 0x17, 0x3b, 0xae, 0x87, 0x60, 0x5a, 0x45, 0xe0, 0xb4, 0x94, 0x96, - 0x69, 0x94, 0xfe, 0xa1, - 0x99, 0x56, 0x98, 0x1a, 0x46, 0xe6, 0xeb, 0x83, 0x3e, 0x17, 0x8f, 0x8b, - 0x87, 0xee, 0xbc, 0x09, - 0x67, 0xdb, 0xb8, 0xfb, 0x4d, 0xd6, 0x38, 0x5f, 0xa4, 0x7f, 0x64, 0x64, - 0x37, 0x5e, 0xff, 0x7a, - 0x29, 0x23, 0xa8, 0x2e, 0x79, 0x37, 0x8c, 0xe7, 0x12, 0x31, 0xae, 0x87, - 0xe2, 0xb4, 0x30, 0x5f, - 0xb5, 0xb4, 0x48, 0x35, 0x31, 0xef, 0x1a, 0x3d, 0x97, 0x13, 0xc9, 0xb4, - 0x02, 0x7d, 0x86, 0xf7, - 0xc7, 0xf3, 0x26, 0x13, 0x7b, 0x3e, 0x52, 0xd5, 0xc7, 0x73, 0xd8, 0xd9, - 0xe7, 0x35, 0xdc, 0xa3, - 0x8c, 0x55, 0x63, 0x4d, 0xfc, 0x67, 0x32, 0xb2, 0x24, 0xe5, 0x3f, 0x9c, - 0xba, 0xe4, 0xf3, 0x8a, - 0xa7, 0x6f, 0x77, 0x8d, 0xe7, 0x02, 0xfb, 0xbf, 0xa7, 0x75, 0x71, 0x35, - 0x32, 0x78, 0x4e, 0x4b, - 0x69, 0xae, 0xa1, 0xf4, 0x2f, 0xfe, 0xb9, 0x9c, 0xeb, 0xbd, 0x6f, 0x7c, - 0x96, 0x7a, 0x40, 0xbf, - 0x09, 0x70, 0x1c, 0x78, 0xde, 0x64, 0x44, 0xfc, 0x3f, 0x32, 0xb2, 0x24, - 0xe6, 0x7f, 0x21, 0xae, - 0x57, 0x39, 0xd1, 0x0f, 0x05, 0x07, 0x7f, 0xe7, 0xa0, 0x12, 0xc8, 0xc1, - 0xd7, 0x1b, 0x3b, 0xb7, - 0xd4, 0x73, 0x2f, 0x35, 0xc1, 0x69, 0x51, 0xfa, 0xaa, 0xc0, 0x69, 0x29, - 0x4e, 0xb5, 0x16, 0xe6, - 0x5d, 0x47, 0x9c, 0xcb, 0x19, 0xde, 0x9b, 0xa7, 0x8e, 0x75, 0xf2, 0xbc, - 0xc9, 0xe6, 0x99, 0xaf, - 0xdf, 0x84, 0xf8, 0xcf, 0x64, 0x64, 0x49, 0xd4, 0x3f, 0x2b, 0xae, 0x67, - 0xfb, 0x8d, 0x12, 0x9e, - 0xcb, 0x9d, 0xea, 0x5b, 0xaa, 0xec, 0x5c, 0xb4, 0x1d, 0xc2, 0x73, 0x11, - 0xbe, 0xea, 0x0e, 0x9a, - 0xd3, 0x52, 0x50, 0x9d, 0xd5, 0xec, 0xb8, 0x5e, 0x18, 0xab, 0xde, 0x57, - 0x23, 0x13, 0xd7, 0x5c, - 0x4e, 0xce, 0xf9, 0x9a, 0xa5, 0x1a, 0x4e, 0xde, 0x64, 0x72, 0xd9, 0x22, - 0xfd, 0x23, 0x23, 0x4b, - 0x9a, 0xfe, 0x85, 0xb0, 0xea, 0x3d, 0x1c, 0xfc, 0xf2, 0xbe, 0x8a, 0xe7, - 0x22, 0x7c, 0xd5, 0x0a, - 0x9a, 0xbf, 0x9c, 0x1b, 0xa2, 0xe6, 0xfe, 0x22, 0xe3, 0x7a, 0x7a, 0x84, - 0xb9, 0x9c, 0x38, 0xce, - 0x97, 0x77, 0x4d, 0x28, 0xfe, 0x47, 0x46, 0x96, 0x38, 0xfd, 0xb3, 0x7b, - 0xdf, 0x14, 0xf5, 0x7a, - 0xa2, 0x46, 0x66, 0x67, 0x6f, 0x8d, 0xe7, 0xe2, 0xcb, 0x9b, 0x80, 0xaf, - 0xaa, 0xae, 0x91, 0x11, - 0xfd, 0x1c, 0x59, 0xdf, 0xdc, 0x4b, 0x60, 0x20, 0x58, 0xf5, 0x76, 0x86, - 0x3f, 0xae, 0xa7, 0xae, - 0x27, 0xb4, 0xf8, 0xfd, 0xb1, 0xd4, 0x30, 0x06, 0xf5, 0x03, 0x52, 0xfe, - 0x97, 0x8c, 0x2c, 0x71, - 0xfa, 0x17, 0x65, 0xae, 0xda, 0xb9, 0xe0, 0x2f, 0x07, 0xf3, 0x5c, 0x44, - 0xde, 0x64, 0xfb, 0xa2, - 0xba, 0x57, 0x3e, 0x29, 0xd4, 0xa4, 0xf3, 0x83, 0x5d, 0xbe, 0xaa, 0xff, - 0xac, 0x06, 0x0c, 0x04, - 0x7d, 0x9e, 0x69, 0xb9, 0x38, 0xf8, 0x5d, 0x3b, 0xae, 0xa7, 0x7a, 0x7f, - 0x1b, 0xd8, 0x1a, 0x46, - 0xa8, 0x91, 0x59, 0x5e, 0x85, 0xf3, 0x45, 0xfa, 0x47, 0x46, 0x96, 0x38, - 0xfd, 0xc3, 0x32, 0xad, - 0x66, 0x5e, 0xa6, 0x95, 0x3b, 0x57, 0x20, 0xe5, 0xe0, 0x07, 0xcd, 0x0f, - 0xe6, 0x35, 0x32, 0xfa, - 0x6a, 0xd6, 0x9c, 0x5b, 0xff, 0x4e, 0x2c, 0xf6, 0xb3, 0xc5, 0x83, 0xb1, - 0xea, 0x92, 0x5b, 0xe5, - 0xdb, 0x55, 0x44, 0x6f, 0xf2, 0x36, 0x7a, 0x2e, 0xe7, 0xd5, 0x38, 0x5f, - 0xa4, 0x7f, 0x64, 0x64, - 0x89, 0xd3, 0x3f, 0xce, 0xb4, 0x52, 0xd7, 0xeb, 0x65, 0xa0, 0x06, 0xe5, - 0x24, 0x2c, 0xae, 0xa7, - 0x19, 0xe9, 0x91, 0xde, 0x06, 0xbf, 0x91, 0xd7, 0xce, 0xc9, 0xe6, 0x07, - 0x43, 0xde, 0x64, 0x54, - 0xe0, 0xbe, 0xf4, 0xda, 0x4f, 0x18, 0xa4, 0xba, 0xe9, 0x49, 0xa6, 0x6d, - 0x73, 0xf0, 0x45, 0xac, - 0xb1, 0xc2, 0xe3, 0x8d, 0x5b, 0xcb, 0x82, 0x94, 0xe7, 0xb2, 0xaa, 0x91, - 0xb9, 0x0a, 0xbf, 0x3f, - 0xc0, 0x78, 0x0d, 0x63, 0x79, 0xcf, 0xbb, 0x26, 0xa4, 0x7f, 0x64, 0x64, - 0x89, 0xd3, 0x3f, 0x5e, - 0xaf, 0x17, 0x13, 0xd3, 0x8a, 0xe9, 0x8b, 0xa8, 0x41, 0xd1, 0xda, 0xb2, - 0xf9, 0xc1, 0x3c, 0x6f, - 0x72, 0x52, 0xaa, 0x01, 0x7f, 0x39, 0x8c, 0x63, 0x0f, 0x1c, 0x7c, 0x5e, - 0x97, 0x7c, 0xab, 0xb2, - 0xa7, 0xe2, 0xb9, 0x5c, 0x2f, 0xae, 0x17, 0x60, 0x81, 0x6b, 0x42, 0xfa, - 0x47, 0x46, 0x96, 0x34, - 0xfd, 0xe3, 0xf5, 0x7a, 0xe7, 0xb8, 0xb9, 0x6a, 0x18, 0xa6, 0xd5, 0x5a, - 0xef, 0x9b, 0x6f, 0x7e, - 0xb0, 0xd3, 0x6f, 0x72, 0xb7, 0xf2, 0x96, 0xcd, 0x63, 0x9d, 0xf3, 0xff, - 0x52, 0x03, 0xc9, 0xcc, - 0x4b, 0xf0, 0xbb, 0xa7, 0xa5, 0xe6, 0xee, 0xed, 0xed, 0x3d, 0x39, 0xcf, - 0x45, 0x70, 0xf0, 0x79, - 0x5c, 0x6f, 0x1e, 0x0f, 0xbf, 0x3f, 0x78, 0x4d, 0x48, 0xff, 0xc8, 0xc8, - 0x92, 0xa6, 0x7f, 0x7e, - 0x56, 0xbd, 0xec, 0x5c, 0x57, 0xbc, 0xe0, 0x35, 0x28, 0x0a, 0xbf, 0x51, - 0x70, 0x5a, 0x64, 0x35, - 0x28, 0x4e, 0xde, 0xe4, 0x4c, 0xf4, 0x9b, 0x94, 0xce, 0x73, 0x75, 0x1e, - 0xeb, 0x3b, 0xce, 0x35, - 0xf5, 0x79, 0xb6, 0x15, 0x1c, 0xd7, 0x63, 0x5a, 0x24, 0xea, 0x09, 0x43, - 0x63, 0x8d, 0x90, 0x23, - 0xde, 0x5e, 0xe6, 0x0e, 0xa5, 0x3c, 0x97, 0x28, 0xb1, 0xce, 0xc0, 0x35, - 0x21, 0xfd, 0x23, 0x23, - 0x4b, 0x9a, 0xfe, 0x85, 0xb0, 0xea, 0x3d, 0xfe, 0x28, 0x7e, 0xae, 0xda, - 0x36, 0x6e, 0xae, 0xda, - 0x69, 0xbe, 0x06, 0x73, 0x3f, 0x32, 0x73, 0xc1, 0x7e, 0x86, 0x78, 0x5f, - 0xd0, 0xd7, 0x06, 0xc7, - 0xf5, 0x5c, 0x3c, 0x97, 0x20, 0x0e, 0x7e, 0x10, 0xcf, 0xc5, 0x89, 0x75, - 0x22, 0x38, 0x5f, 0x0b, - 0xee, 0x4b, 0x93, 0xfe, 0x91, 0x91, 0x25, 0x5c, 0xff, 0xb0, 0x4c, 0x2b, - 0x4c, 0x0d, 0x8a, 0x36, - 0x29, 0xb5, 0xd0, 0x9c, 0x96, 0x15, 0x7f, 0xd9, 0xd0, 0xfa, 0xa9, 0x6e, - 0x7a, 0x9c, 0xe9, 0x48, - 0xb5, 0x32, 0xac, 0xf7, 0x0d, 0x38, 0xf8, 0xe3, 0x7c, 0x0b, 0xde, 0x9f, - 0x13, 0x2b, 0x0c, 0xe2, - 0xb9, 0x40, 0xde, 0x64, 0xbc, 0x79, 0x0d, 0xce, 0x17, 0xe9, 0x1f, 0x19, - 0x59, 0xd2, 0xf4, 0xaf, - 0x70, 0x8a, 0x60, 0xd5, 0xf7, 0x33, 0x68, 0xa6, 0x55, 0x6c, 0x9c, 0x16, - 0xb7, 0x56, 0xaa, 0x98, - 0x56, 0xec, 0x7c, 0xca, 0x6b, 0x18, 0x47, 0xa9, 0x16, 0x8f, 0x35, 0x06, - 0xf0, 0x5c, 0x78, 0xde, - 0xe4, 0xb8, 0x74, 0xc8, 0x39, 0x5f, 0xb2, 0xbc, 0x8b, 0x1d, 0xeb, 0x84, - 0x7e, 0xc0, 0xb5, 0x35, - 0x21, 0xfd, 0x23, 0x23, 0xbb, 0xf1, 0xfa, 0xc7, 0xce, 0x72, 0xae, 0xfd, - 0x8f, 0x67, 0x5a, 0x45, - 0xe7, 0x2f, 0x4b, 0x63, 0x89, 0x28, 0x4e, 0x8b, 0xad, 0x95, 0x67, 0x38, - 0xa6, 0x95, 0x9f, 0xdf, - 0xbf, 0xc6, 0x73, 0x71, 0x71, 0xbe, 0xa4, 0xf3, 0x83, 0xad, 0xd7, 0x0c, - 0x5e, 0x13, 0xd2, 0x3f, - 0x32, 0xb2, 0x1b, 0xaf, 0x7f, 0xb3, 0x72, 0x13, 0xea, 0x92, 0x37, 0x67, - 0xa2, 0x2e, 0x19, 0x19, - 0xd7, 0x43, 0x33, 0xad, 0x22, 0x70, 0x5a, 0x10, 0xfa, 0xe7, 0xd4, 0xeb, - 0x21, 0x98, 0x56, 0xd2, - 0xb8, 0xde, 0x8a, 0x83, 0x7f, 0x5e, 0x5d, 0xd5, 0x25, 0xba, 0xe7, 0x07, - 0x7b, 0x38, 0xf8, 0x82, - 0xdf, 0xbf, 0x5e, 0x23, 0x43, 0xfa, 0x47, 0x46, 0x76, 0xe3, 0xf5, 0x6f, - 0xb1, 0xdb, 0x70, 0x72, - 0x05, 0x17, 0x3b, 0x7b, 0xa0, 0x45, 0xc5, 0x59, 0x56, 0xca, 0x73, 0xb1, - 0xe2, 0x7a, 0x68, 0xfe, - 0x72, 0x5c, 0x9c, 0x16, 0x9f, 0x56, 0x86, 0x7f, 0xed, 0x28, 0x02, 0xbf, - 0xff, 0x24, 0x5f, 0x53, - 0xe4, 0x4d, 0x5a, 0x9c, 0xf3, 0x35, 0x20, 0xfd, 0x23, 0x23, 0x4b, 0x9c, - 0xfe, 0x0d, 0xf4, 0x8e, - 0x53, 0x97, 0x7c, 0xd7, 0xce, 0x15, 0x54, 0xa4, 0x3c, 0x97, 0xd8, 0xe3, - 0x7a, 0x48, 0x4e, 0x8b, - 0x9d, 0x77, 0xe1, 0xf5, 0x7a, 0x31, 0x31, 0xad, 0xf8, 0x5c, 0x4e, 0xbb, - 0xf7, 0x4d, 0x32, 0x3f, - 0x98, 0xaf, 0x05, 0xd3, 0xe7, 0xad, 0x63, 0x7f, 0xbf, 0x09, 0xe9, 0x1f, - 0x19, 0x59, 0x62, 0xf2, - 0x1f, 0x47, 0x6c, 0xff, 0x4f, 0x37, 0x9b, 0xbc, 0x8e, 0x38, 0x84, 0xe7, - 0x02, 0x1c, 0x7c, 0x1e, - 0xd7, 0x53, 0xf5, 0x56, 0xd8, 0x71, 0xbd, 0x98, 0x38, 0x2d, 0x56, 0x5c, - 0x2f, 0x02, 0xd3, 0xea, - 0xea, 0x73, 0x39, 0x9d, 0xf9, 0xc1, 0x61, 0xfd, 0x26, 0xfd, 0xcb, 0x0e, - 0xe9, 0x1f, 0x19, 0x59, - 0x82, 0xf2, 0xbf, 0x56, 0xbd, 0x5e, 0xaa, 0xbf, 0xe2, 0xb9, 0xc0, 0x79, - 0xcb, 0xcf, 0xc1, 0x2f, - 0x9c, 0x56, 0x0e, 0x2a, 0xc7, 0xfa, 0x61, 0x68, 0xde, 0x34, 0x3a, 0x7f, - 0x59, 0xad, 0x7f, 0x76, - 0x5c, 0xcf, 0x8c, 0x89, 0x69, 0x85, 0x98, 0xcb, 0x99, 0x82, 0xf7, 0xc7, - 0xf4, 0x79, 0xad, 0xdf, - 0x64, 0x4e, 0xfc, 0x67, 0x32, 0xb2, 0x24, 0xe9, 0x5f, 0x40, 0x5c, 0x8f, - 0xe7, 0x0a, 0xd6, 0x39, - 0xf8, 0xec, 0x0a, 0xe3, 0xb9, 0xb8, 0xe2, 0x7a, 0xaa, 0x1a, 0x19, 0x24, - 0xa7, 0xc5, 0xaf, 0x95, - 0xe1, 0x71, 0x3d, 0xce, 0xb4, 0x4a, 0xa3, 0x7a, 0xdf, 0x94, 0x1c, 0x2d, - 0x51, 0xc3, 0x78, 0xb0, - 0xe1, 0x9f, 0x1f, 0x4c, 0xfa, 0x47, 0x46, 0x96, 0x28, 0xfd, 0x0b, 0x67, - 0xd5, 0xaf, 0x7a, 0x2c, - 0x80, 0x19, 0x50, 0x0d, 0xe3, 0xb9, 0x40, 0xde, 0xc4, 0x8a, 0xeb, 0xe1, - 0x6a, 0x64, 0x54, 0x9c, - 0x96, 0x48, 0x71, 0x3d, 0x8b, 0x69, 0xa5, 0xe1, 0x98, 0x56, 0xa8, 0x1a, - 0xc6, 0xfc, 0xc1, 0xda, - 0x5a, 0x1c, 0x5d, 0x76, 0x49, 0xff, 0xc8, 0xc8, 0x92, 0xa3, 0x7f, 0xe9, - 0xa5, 0x8a, 0x69, 0x25, - 0xf4, 0x05, 0xe2, 0x7a, 0xa5, 0xb9, 0xde, 0x90, 0xf2, 0x5c, 0x20, 0x6f, - 0x32, 0xcd, 0x37, 0xab, - 0xe0, 0x4b, 0xf7, 0xc2, 0xf5, 0x25, 0xcc, 0x57, 0xf5, 0xb3, 0x9f, 0xa3, - 0xb0, 0xea, 0x8b, 0x71, - 0xcd, 0xe5, 0x94, 0xae, 0x09, 0xe5, 0x3f, 0xc8, 0xc8, 0x92, 0xa4, 0x7f, - 0xd9, 0xe3, 0xaa, 0xba, - 0x5e, 0xcf, 0x62, 0xd5, 0xe7, 0x6d, 0xbf, 0x51, 0xc2, 0x73, 0x01, 0x6d, - 0x81, 0xb8, 0x99, 0x7c, - 0x7e, 0xf0, 0xaa, 0x46, 0x46, 0xd6, 0xcf, 0x01, 0x0c, 0x84, 0xcc, 0x38, - 0xdd, 0xb1, 0x39, 0xf8, - 0xca, 0xde, 0x37, 0x3b, 0xae, 0x17, 0xeb, 0x5c, 0x4e, 0x58, 0x93, 0xa0, - 0x7e, 0x40, 0xd2, 0x3f, - 0x32, 0xb2, 0x24, 0xe9, 0x5f, 0x44, 0xa6, 0x55, 0x67, 0x3d, 0x6f, 0xea, - 0xca, 0x9b, 0xac, 0xcd, - 0x0f, 0xf7, 0xcd, 0x0f, 0xb6, 0x74, 0x67, 0x33, 0x84, 0xbf, 0xec, 0x66, - 0x3f, 0x03, 0x07, 0xbf, - 0x70, 0x5a, 0xa9, 0x95, 0x97, 0xd9, 0xba, 0x16, 0x76, 0xa6, 0x8c, 0xc2, - 0xb4, 0xba, 0xc0, 0x71, - 0xbe, 0xca, 0x81, 0x6b, 0x42, 0xfa, 0x47, 0x46, 0x96, 0x20, 0xfd, 0x8b, - 0xc0, 0xb4, 0x52, 0xd6, - 0xa0, 0x18, 0x59, 0xf0, 0x1b, 0x2f, 0x4a, 0xfb, 0x45, 0x05, 0x07, 0xbf, - 0x18, 0xe2, 0xab, 0x02, - 0x03, 0x21, 0xbb, 0x58, 0xf1, 0x60, 0xe0, 0xe7, 0x54, 0xc3, 0x78, 0x2e, - 0xee, 0xb8, 0x1e, 0x8e, - 0xdf, 0x8f, 0x9a, 0xcb, 0x19, 0xbc, 0x26, 0xa4, 0x7f, 0x64, 0x64, 0x89, - 0xd1, 0xbf, 0x28, 0x4c, - 0x2b, 0xa8, 0xd7, 0xc3, 0xd4, 0xa0, 0x70, 0xbf, 0x51, 0x3e, 0x3f, 0x18, - 0x7a, 0x2c, 0xac, 0x7e, - 0x93, 0x86, 0x95, 0x37, 0x31, 0x82, 0xe2, 0x79, 0x36, 0x07, 0x1f, 0xbe, - 0x76, 0x55, 0xa3, 0x1d, - 0xc0, 0x73, 0x81, 0xef, 0xe7, 0xbd, 0xc9, 0x58, 0xa6, 0xd5, 0x75, 0x38, - 0x5f, 0xa4, 0x7f, 0x64, - 0x64, 0x89, 0xd1, 0x3f, 0x2b, 0xae, 0x87, 0x63, 0x5a, 0x95, 0x70, 0x4c, - 0x2b, 0x7f, 0x5c, 0xcf, - 0x33, 0x3f, 0xd8, 0xd7, 0x63, 0x71, 0xb1, 0xb3, 0x97, 0x67, 0x3e, 0x2e, - 0x70, 0xee, 0xb5, 0x23, - 0xcd, 0x08, 0x88, 0xcb, 0xf1, 0xb8, 0x5e, 0x71, 0x9e, 0xab, 0x4b, 0x79, - 0x2e, 0x50, 0x97, 0x3c, - 0x2d, 0x34, 0xa1, 0x46, 0x46, 0x8b, 0x83, 0xdf, 0x1f, 0xba, 0x26, 0xa4, - 0x7f, 0x64, 0x64, 0xc9, - 0xd1, 0xbf, 0x98, 0x99, 0x56, 0x10, 0xd7, 0x0b, 0xeb, 0x7d, 0x83, 0xbc, - 0xc9, 0xa4, 0xd0, 0xe4, - 0xe7, 0x38, 0x4b, 0xcb, 0x4a, 0x67, 0xb9, 0x3a, 0x67, 0x3f, 0x33, 0x9f, - 0x17, 0x38, 0xf8, 0x7e, - 0xed, 0x74, 0xf7, 0xbe, 0x71, 0x9e, 0xcb, 0x34, 0xdf, 0x5c, 0xe7, 0xe0, - 0x97, 0xf7, 0x80, 0x8f, - 0xbf, 0x39, 0x93, 0xf2, 0x5c, 0x44, 0x5c, 0xef, 0xac, 0x7a, 0x50, 0x9e, - 0x5f, 0x81, 0xdf, 0x4f, - 0xfa, 0x47, 0x46, 0x96, 0x3c, 0xfd, 0xb3, 0x58, 0xf5, 0xf1, 0xd4, 0xeb, - 0x21, 0x39, 0x2d, 0xf0, - 0x9a, 0x4c, 0xaf, 0xd2, 0x03, 0x91, 0x37, 0xc9, 0xcd, 0xb3, 0x2d, 0xdd, - 0x35, 0xf3, 0xd2, 0xa7, - 0x97, 0x86, 0x24, 0xae, 0xe7, 0xe1, 0xe0, 0xbb, 0xb5, 0xd0, 0xe1, 0xb9, - 0xcc, 0xdc, 0x3c, 0x17, - 0x27, 0xd6, 0xb9, 0xaf, 0xec, 0x4d, 0x1e, 0x84, 0xd5, 0x30, 0x92, 0xfe, - 0x91, 0x91, 0x25, 0x46, - 0xff, 0x90, 0xac, 0x7a, 0x2c, 0xd3, 0x6a, 0x1b, 0xc3, 0xb4, 0x5a, 0xe7, - 0xb4, 0x18, 0xd0, 0x7b, - 0x9b, 0x1a, 0xa5, 0x3b, 0xc0, 0xc1, 0xf7, 0xe6, 0x35, 0xd2, 0x5d, 0x35, - 0xab, 0x5e, 0x33, 0x74, - 0x78, 0x7f, 0xcc, 0x3f, 0x0f, 0x8a, 0x35, 0xae, 0xf2, 0x26, 0xe9, 0x4e, - 0x14, 0x7e, 0x7f, 0x70, - 0x8d, 0x0c, 0xe9, 0x1f, 0x19, 0x59, 0x52, 0xf4, 0x2f, 0x12, 0xab, 0x7e, - 0x81, 0x9c, 0xab, 0x76, - 0x3d, 0x4e, 0x8b, 0x57, 0x73, 0x06, 0x99, 0x2e, 0xa6, 0x4f, 0x18, 0xea, - 0xf5, 0xaa, 0xf0, 0xfe, - 0xa4, 0x3c, 0x17, 0xc8, 0x9b, 0x6c, 0x1d, 0x40, 0x5c, 0x6f, 0x73, 0x9a, - 0x69, 0xca, 0xe6, 0x07, - 0xab, 0xd7, 0x84, 0xf4, 0x8f, 0x8c, 0xec, 0xc6, 0xeb, 0x5f, 0x4f, 0xe4, - 0x1a, 0xb4, 0x58, 0x99, - 0x56, 0xc0, 0x5f, 0xde, 0xc5, 0x70, 0x5a, 0x10, 0xb3, 0xe6, 0xec, 0xb3, - 0x62, 0xb6, 0x83, 0x9b, - 0xcb, 0xb9, 0xbb, 0x56, 0xc3, 0xe8, 0xe1, 0xb9, 0xd8, 0x79, 0x93, 0xa7, - 0xc2, 0xe7, 0x07, 0xab, - 0x63, 0x9d, 0xa4, 0x7f, 0x64, 0x64, 0x37, 0x5e, 0xff, 0x26, 0x5b, 0x2d, - 0x5e, 0x97, 0xbc, 0x74, - 0x7a, 0xcb, 0x42, 0xfd, 0x4b, 0x14, 0xab, 0x3e, 0x4e, 0x4e, 0x8b, 0xfd, - 0xca, 0x63, 0xbd, 0x83, - 0xd0, 0x4a, 0x25, 0xbf, 0x9f, 0xe7, 0x4d, 0x66, 0xc5, 0x06, 0xef, 0xd5, - 0x0b, 0x99, 0x1f, 0x0c, - 0x5a, 0x68, 0x71, 0xbe, 0x6a, 0xa4, 0x7f, 0x64, 0x64, 0x09, 0xd5, 0x3f, - 0xe0, 0x3f, 0xdf, 0x85, - 0x1c, 0x6c, 0x65, 0xaf, 0x7a, 0xb1, 0xb5, 0x2f, 0xe5, 0xb9, 0x58, 0x71, - 0x3d, 0x14, 0xab, 0x3e, - 0x4e, 0x4e, 0x8b, 0xe3, 0x8b, 0xea, 0xed, 0xf8, 0xe6, 0x72, 0xe6, 0x79, - 0x5c, 0x2f, 0x3d, 0xcc, - 0xb4, 0x1d, 0x9e, 0x4b, 0x00, 0x07, 0x3f, 0x7f, 0x52, 0x3e, 0x04, 0xce, - 0x57, 0x70, 0xbf, 0x09, - 0xe9, 0x1f, 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0x71, 0xa9, 0xe5, 0xf4, 0xed, - 0x7a, 0x73, 0x05, 0xb5, - 0xc2, 0x44, 0xf7, 0x72, 0xf0, 0x8f, 0xd2, 0x28, 0x56, 0x7d, 0xac, 0x9c, - 0x16, 0xc7, 0x17, 0xcd, - 0xb5, 0x31, 0x73, 0x39, 0x31, 0x4c, 0xab, 0x75, 0xce, 0x57, 0xf0, 0xfc, - 0x60, 0xde, 0x6f, 0x72, - 0x5b, 0xd6, 0x6f, 0x42, 0xfa, 0x47, 0x46, 0x96, 0x88, 0xfc, 0xc7, 0x51, - 0xaa, 0x0b, 0xf5, 0x2a, - 0xe5, 0xf3, 0xad, 0x03, 0x87, 0x77, 0xfa, 0x94, 0xcd, 0x7e, 0x76, 0xf5, - 0x58, 0x30, 0x8d, 0xc0, - 0xf3, 0x97, 0x71, 0x35, 0x32, 0xca, 0x59, 0x73, 0x76, 0xdd, 0xcd, 0x3c, - 0xd7, 0xc2, 0xce, 0xe5, - 0xcc, 0x5c, 0xa7, 0x86, 0xd1, 0xce, 0x9b, 0x2c, 0x4b, 0xf5, 0xd0, 0x7e, - 0x13, 0xe2, 0x5f, 0x91, - 0x91, 0x25, 0x24, 0xff, 0x2b, 0xb4, 0x08, 0xfc, 0x46, 0x8d, 0x9d, 0xa1, - 0xa0, 0x87, 0xa2, 0x78, - 0xba, 0x5d, 0x73, 0x78, 0xa7, 0x4e, 0xae, 0x60, 0xeb, 0x00, 0xfa, 0x6f, - 0x73, 0x63, 0x39, 0xcf, - 0x05, 0x1d, 0xd7, 0xc3, 0x72, 0x5a, 0xac, 0xb3, 0x62, 0x66, 0x99, 0x6b, - 0x95, 0xe2, 0x62, 0x5a, - 0x45, 0x98, 0xcb, 0x59, 0x5a, 0x48, 0xfa, 0x4d, 0x66, 0x97, 0x4d, 0xd2, - 0x3f, 0x32, 0xb2, 0x04, - 0xe8, 0x9f, 0x84, 0x55, 0xaf, 0xf5, 0x81, 0x77, 0xec, 0xeb, 0xdb, 0x65, - 0x7f, 0x42, 0x7c, 0x0c, - 0x72, 0x05, 0x41, 0x3c, 0x17, 0x3b, 0xae, 0x57, 0x5d, 0xa6, 0x50, 0xbe, - 0xaa, 0x8a, 0xd3, 0x62, - 0x6b, 0x91, 0xbe, 0xcc, 0x35, 0x95, 0x71, 0xbd, 0x48, 0x4c, 0x2b, 0xe4, - 0x5c, 0xce, 0x81, 0xab, - 0xdf, 0xc4, 0x3d, 0x3f, 0x78, 0x41, 0xfc, 0x67, 0x32, 0xb2, 0x64, 0xf8, - 0xbf, 0xca, 0xde, 0x37, - 0x23, 0xc5, 0x7c, 0xdf, 0xc2, 0x49, 0xb9, 0x06, 0xf9, 0x01, 0x27, 0x56, - 0x78, 0x57, 0xb0, 0x9f, - 0xfd, 0x1c, 0xfc, 0x42, 0x08, 0xd3, 0xca, 0x5d, 0x23, 0x83, 0xe1, 0xb4, - 0xd8, 0x79, 0x0d, 0xfd, - 0x38, 0xd7, 0x8c, 0x1e, 0xd7, 0x93, 0xd5, 0xc8, 0xe0, 0xe7, 0x72, 0x06, - 0x70, 0xbe, 0x44, 0xbf, - 0xc9, 0x80, 0xe6, 0x1f, 0x91, 0x91, 0x25, 0x42, 0xff, 0x90, 0x33, 0x28, - 0x35, 0xc1, 0x8c, 0xaa, - 0xa5, 0x47, 0x7a, 0xbb, 0xe0, 0xe6, 0x9d, 0xfa, 0x7a, 0x2c, 0x78, 0x0d, - 0xca, 0x24, 0xd5, 0x94, - 0xcd, 0x0f, 0x5e, 0xf9, 0xaa, 0xe5, 0x3d, 0x85, 0xaf, 0x2a, 0xfe, 0xdb, - 0x51, 0xca, 0x80, 0x7e, - 0xb8, 0x4c, 0x4c, 0xbd, 0xc9, 0xc5, 0x58, 0xe6, 0x72, 0x52, 0xfe, 0x83, - 0x8c, 0x2c, 0x11, 0xfa, - 0x67, 0xcf, 0xa0, 0x8c, 0x5a, 0xaf, 0xc7, 0x7c, 0xc4, 0xec, 0x38, 0xdf, - 0xf2, 0xcc, 0x89, 0xb3, - 0xf2, 0xa6, 0x30, 0x33, 0x53, 0x36, 0x3f, 0x78, 0xe5, 0xab, 0x86, 0xf7, - 0x73, 0x00, 0x03, 0x21, - 0x35, 0xd0, 0xba, 0x5a, 0x3f, 0xd5, 0x05, 0x2e, 0x82, 0xea, 0xfd, 0x71, - 0x56, 0xfd, 0x29, 0xae, - 0x46, 0xa6, 0x88, 0xe8, 0x7d, 0x0b, 0x5f, 0x13, 0xd2, 0x3f, 0x32, 0xb2, - 0x24, 0xe8, 0x9f, 0x06, - 0xf5, 0x7a, 0x57, 0x65, 0x5a, 0xd9, 0x67, 0x43, 0x2b, 0x6f, 0x52, 0x72, - 0xf3, 0x4e, 0x5d, 0x3d, - 0x16, 0x6b, 0x1c, 0xfc, 0x89, 0xba, 0x46, 0x86, 0x73, 0x4f, 0x81, 0x07, - 0x33, 0xcf, 0xb6, 0x38, - 0x03, 0x3a, 0x84, 0xe7, 0x22, 0xe2, 0x7a, 0x15, 0x09, 0xab, 0x3e, 0x20, - 0xae, 0xa7, 0x98, 0xcb, - 0xa9, 0x5e, 0x13, 0xd2, 0x3f, 0x32, 0xb2, 0x44, 0xe8, 0x1f, 0xd4, 0xeb, - 0x21, 0xfc, 0xc6, 0x28, - 0x71, 0xbd, 0xcd, 0xc5, 0x66, 0xdd, 0x9f, 0x37, 0xb1, 0x7b, 0x2c, 0x78, - 0xde, 0x64, 0xbe, 0x5d, - 0xb7, 0x5e, 0x53, 0x7e, 0xfe, 0x9b, 0xaf, 0xd8, 0xcf, 0xf0, 0xa7, 0xc3, - 0x8e, 0xe6, 0x3c, 0x97, - 0x74, 0xdb, 0x5f, 0x97, 0x2c, 0xe2, 0x7a, 0xd7, 0x61, 0x5a, 0xb9, 0x7c, - 0x69, 0xe5, 0x5c, 0x4e, - 0xd2, 0x3f, 0x32, 0xb2, 0x24, 0xe8, 0x5f, 0x44, 0xa6, 0x95, 0xa2, 0x06, - 0x25, 0xcf, 0x6b, 0x50, - 0x2c, 0x5d, 0xe3, 0x79, 0x93, 0xbc, 0x8f, 0x77, 0x2a, 0x7a, 0x2c, 0x2a, - 0x7b, 0xbb, 0xaa, 0x7e, - 0x13, 0xe8, 0x4b, 0x66, 0xbe, 0x6f, 0x7a, 0xa6, 0xb7, 0x73, 0x27, 0x7a, - 0xb3, 0x2a, 0xe5, 0xb9, - 0x30, 0xff, 0x9a, 0x7d, 0x3f, 0xc4, 0xf5, 0x94, 0x35, 0x32, 0xc8, 0x58, - 0xa7, 0x7a, 0x4d, 0x48, - 0xff, 0xc8, 0xc8, 0x92, 0xa0, 0x7f, 0x22, 0xae, 0x87, 0xab, 0x07, 0x29, - 0xe0, 0x99, 0x56, 0x86, - 0x5f, 0x3f, 0xad, 0xba, 0x62, 0x0f, 0x83, 0xc0, 0xdd, 0x6f, 0xa2, 0x8f, - 0x52, 0x6d, 0x2d, 0xc0, - 0xbf, 0x85, 0xde, 0xdf, 0xdc, 0x3c, 0xd5, 0x0e, 0x66, 0x47, 0x5b, 0x75, - 0xc9, 0xcb, 0xc2, 0x21, - 0xaf, 0x61, 0x1c, 0x6b, 0xad, 0xd0, 0x38, 0x21, 0x67, 0x5a, 0xa9, 0x63, - 0x9d, 0x59, 0xe5, 0x9a, - 0x90, 0xfe, 0x91, 0x91, 0x25, 0x41, 0xff, 0x22, 0x31, 0xad, 0x06, 0x98, - 0xde, 0x37, 0x05, 0xa7, - 0xa5, 0x97, 0xe2, 0x67, 0xb5, 0x0a, 0x3b, 0xff, 0xb9, 0xf3, 0x26, 0xa5, - 0xd3, 0x5c, 0x1d, 0xd8, - 0xcf, 0xd9, 0x69, 0xba, 0x0d, 0x1c, 0xfc, 0x95, 0x2f, 0x9a, 0x6b, 0xe7, - 0xa6, 0x5a, 0x7b, 0x15, - 0x6b, 0x0c, 0xe0, 0xb9, 0xdc, 0xb5, 0xf2, 0x2e, 0x30, 0x67, 0x4e, 0xc2, - 0x73, 0xc1, 0xc5, 0xf5, - 0xd4, 0xb1, 0x4e, 0xd2, 0x3f, 0x32, 0xb2, 0xc4, 0xe8, 0x1f, 0x3a, 0xae, - 0x57, 0xc5, 0xcc, 0x55, - 0xc3, 0x31, 0xad, 0x38, 0x47, 0x0b, 0x7c, 0xd5, 0x55, 0xde, 0x64, 0xbb, - 0xc6, 0xf9, 0xf7, 0xa7, - 0x56, 0xbc, 0xef, 0x78, 0xc5, 0x7f, 0x86, 0xde, 0x37, 0x7d, 0xac, 0x05, - 0xea, 0xee, 0x8a, 0x83, - 0xbf, 0x75, 0x58, 0x55, 0xf0, 0x5c, 0xb8, 0x3f, 0x3d, 0x8d, 0xc0, 0xef, - 0x0f, 0x5d, 0x13, 0xd2, - 0x3f, 0x32, 0xb2, 0x9b, 0xaf, 0x7f, 0x51, 0xe2, 0x7a, 0x88, 0xb9, 0x6a, - 0xcb, 0xab, 0xcf, 0x55, - 0xd3, 0xfa, 0x5a, 0x37, 0x35, 0x4e, 0x8b, 0x99, 0x97, 0xa7, 0x8e, 0xfe, - 0x19, 0x99, 0x45, 0xae, - 0x95, 0x1d, 0x2a, 0xea, 0xa4, 0xf9, 0xdc, 0xb7, 0xca, 0x5b, 0x0a, 0xb3, - 0x42, 0xbd, 0x14, 0x3c, - 0x73, 0x53, 0x70, 0xf0, 0x17, 0xb8, 0xde, 0x64, 0x8b, 0xf3, 0xd5, 0x22, - 0xfd, 0x23, 0x23, 0x4b, - 0xb0, 0xfe, 0x61, 0xfb, 0x70, 0xa5, 0x71, 0x3d, 0xaf, 0x89, 0xde, 0xb7, - 0x6b, 0x73, 0x5a, 0x78, - 0xde, 0xc3, 0xd6, 0xa2, 0xec, 0x32, 0xd7, 0x4c, 0x0f, 0x14, 0xfa, 0x67, - 0xc5, 0xf5, 0xec, 0xef, - 0x09, 0xe2, 0xb9, 0x40, 0xac, 0xb1, 0x7c, 0x0b, 0x38, 0x5f, 0xa5, 0x7d, - 0xe9, 0xfc, 0x60, 0x74, - 0xac, 0x93, 0xf4, 0x8f, 0x8c, 0xec, 0xc6, 0xeb, 0x9f, 0xa5, 0x45, 0xaa, - 0x7a, 0x10, 0x3c, 0xd3, - 0xaa, 0x7a, 0xa0, 0xe4, 0xb4, 0x1c, 0xe1, 0x38, 0x2d, 0xf6, 0x59, 0x11, - 0x7a, 0xdf, 0xd2, 0xaa, - 0xf7, 0x27, 0x9b, 0xcb, 0xe9, 0xe6, 0xe0, 0x5f, 0x54, 0xf6, 0xab, 0xaa, - 0xf9, 0xc1, 0xe8, 0x58, - 0x27, 0xe9, 0x1f, 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0x61, 0xbe, 0x03, 0xb5, - 0x28, 0xfa, 0x80, 0xe7, - 0x17, 0x8c, 0xd0, 0xb8, 0xde, 0x69, 0x5e, 0xe9, 0x37, 0x16, 0x31, 0x4c, - 0x2b, 0x3e, 0xf7, 0x4d, - 0xcd, 0x69, 0x11, 0x5a, 0xa4, 0xf1, 0xde, 0xb7, 0xd4, 0x51, 0xf8, 0xd7, - 0x62, 0x7a, 0xdf, 0x20, - 0xd6, 0x58, 0x3c, 0xdf, 0xdd, 0x87, 0xb8, 0xa0, 0x74, 0x7e, 0x30, 0xe4, - 0x4d, 0x86, 0xd9, 0x90, - 0xb9, 0x6f, 0xa4, 0x7f, 0x64, 0x64, 0x89, 0xd1, 0xbf, 0x79, 0xb5, 0x01, - 0x7e, 0xe1, 0xce, 0xb9, - 0x9c, 0xe7, 0xb2, 0x8a, 0xeb, 0x21, 0x98, 0x56, 0xb7, 0x76, 0xf7, 0x10, - 0x73, 0xd5, 0x50, 0x9c, - 0x16, 0xa1, 0x7f, 0x29, 0x83, 0xf7, 0xbe, 0xc5, 0xc2, 0xb4, 0xda, 0x10, - 0xb1, 0x4e, 0xe0, 0x7c, - 0xf9, 0x79, 0x2e, 0x9e, 0xbc, 0x49, 0x89, 0x73, 0xbe, 0xf4, 0x51, 0x58, - 0xbf, 0x09, 0xe9, 0x1f, - 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0xe9, 0x4e, 0x73, 0xf7, 0xae, 0x77, 0x7e, - 0x38, 0xf4, 0x58, 0x6c, - 0xce, 0xbc, 0x75, 0xc9, 0xfa, 0x71, 0x2c, 0x71, 0x3d, 0xdb, 0x57, 0x45, - 0x71, 0x5a, 0xc4, 0x59, - 0x31, 0xdd, 0x85, 0xde, 0xb7, 0x0d, 0x4c, 0xbd, 0x1e, 0x96, 0x69, 0xe5, - 0xed, 0x7d, 0x13, 0x3c, - 0x97, 0x35, 0x0e, 0xfe, 0xee, 0x2a, 0x6f, 0x32, 0x5d, 0x9b, 0x1f, 0x4c, - 0xfa, 0x47, 0x46, 0x96, - 0x04, 0xfd, 0x9b, 0x6c, 0xf1, 0xb8, 0x59, 0x6e, 0x2e, 0x38, 0x7f, 0xde, - 0x1e, 0x8b, 0xb2, 0xc3, - 0xc1, 0x87, 0xb9, 0x6a, 0xdb, 0x4a, 0xfe, 0x72, 0x16, 0xd7, 0x5b, 0x86, - 0xe4, 0xb4, 0x88, 0xb3, - 0x22, 0xd3, 0xa6, 0x45, 0x46, 0xc9, 0x88, 0xc6, 0xd6, 0x30, 0x86, 0xf3, - 0xfb, 0x45, 0xde, 0xa4, - 0x70, 0xbc, 0x53, 0xdb, 0xbd, 0x53, 0x79, 0x4b, 0x68, 0xbf, 0x89, 0x79, - 0x69, 0x90, 0xfe, 0x91, - 0x91, 0x25, 0xe0, 0xfc, 0x67, 0xd7, 0x83, 0xf4, 0xac, 0x1e, 0x8d, 0xa0, - 0x1e, 0x0b, 0x76, 0xae, - 0xdb, 0x39, 0xd9, 0xac, 0x49, 0x79, 0x2e, 0x76, 0x0d, 0x0a, 0x86, 0xbf, - 0xbc, 0xc4, 0xf9, 0xaa, - 0x5c, 0x91, 0x78, 0xef, 0x47, 0x5a, 0xa5, 0x7f, 0xd8, 0xb9, 0x9c, 0x11, - 0x38, 0x5f, 0x85, 0x03, - 0xf9, 0xfc, 0xe0, 0x9d, 0xfd, 0xad, 0xc9, 0x65, 0x8b, 0xf4, 0x8f, 0x8c, - 0xec, 0x86, 0xeb, 0xdf, - 0xac, 0xd2, 0x08, 0x8c, 0xeb, 0xd9, 0x3d, 0x16, 0x9c, 0xf3, 0x57, 0x11, - 0x73, 0x30, 0xee, 0xda, - 0x33, 0x41, 0x02, 0x78, 0x2e, 0xbc, 0x46, 0x66, 0xb3, 0x8d, 0xe3, 0x2f, - 0x33, 0x5f, 0x75, 0xa9, - 0xf2, 0x55, 0x35, 0xa1, 0x7f, 0x13, 0xa6, 0x7f, 0xb3, 0x54, 0x5b, 0xf5, - 0xb5, 0xf8, 0xb9, 0x9c, - 0xd1, 0x39, 0x5f, 0x81, 0xfd, 0x26, 0xc4, 0x7f, 0x26, 0x23, 0x4b, 0x44, - 0xfe, 0x43, 0x15, 0xd7, - 0xd3, 0x06, 0x7a, 0x1b, 0xce, 0x7f, 0x5b, 0xa7, 0x5b, 0x35, 0xa7, 0x5f, - 0xcd, 0xe6, 0xb9, 0xb8, - 0xf3, 0x26, 0xd3, 0x52, 0x63, 0xf7, 0x02, 0x33, 0xa3, 0x1c, 0xc1, 0x69, - 0xb1, 0xf4, 0xcf, 0xdf, - 0xfb, 0x16, 0x21, 0xae, 0xb7, 0x6e, 0xc8, 0xde, 0xb7, 0xb0, 0xb9, 0x9c, - 0x4e, 0xde, 0x64, 0x7c, - 0xd9, 0x26, 0xfd, 0x23, 0x23, 0xbb, 0xe9, 0xfa, 0xb7, 0xdb, 0xd8, 0x99, - 0x6e, 0xa0, 0xea, 0xf5, - 0xc0, 0x6f, 0x84, 0x5c, 0x81, 0xcd, 0xf9, 0xab, 0xf8, 0x7b, 0x2c, 0xce, - 0xb6, 0x0f, 0xa0, 0xf7, - 0x57, 0xb0, 0xa9, 0x34, 0x29, 0x4b, 0x1f, 0xc5, 0x5f, 0x3e, 0x4a, 0x71, - 0xfd, 0x4b, 0xcf, 0xe4, - 0xbd, 0x6f, 0xfe, 0xf7, 0xf7, 0x60, 0xe7, 0x72, 0x52, 0xfe, 0x83, 0x8c, - 0xec, 0xc6, 0xeb, 0xdf, - 0x62, 0xb7, 0x71, 0xb5, 0xb9, 0x6a, 0x76, 0x8f, 0x85, 0x7f, 0x3e, 0x92, - 0x37, 0x6f, 0x92, 0xf1, - 0xf7, 0x58, 0x60, 0x67, 0x94, 0xf7, 0xd3, 0x4c, 0x6b, 0x53, 0xdd, 0xb4, - 0xe8, 0x7d, 0x0b, 0xd7, - 0x3f, 0x24, 0xd3, 0x2a, 0xde, 0xb9, 0x9c, 0xa4, 0x7f, 0x64, 0x64, 0x49, - 0xd0, 0xbf, 0x02, 0x6a, - 0xae, 0x5a, 0x48, 0xef, 0x9b, 0x95, 0x37, 0xd9, 0x3c, 0xab, 0x1e, 0x80, - 0x4e, 0xba, 0x73, 0x05, - 0x95, 0x8b, 0x9d, 0x3d, 0x0f, 0x07, 0xff, 0x28, 0xd5, 0x05, 0x5f, 0x55, - 0x55, 0x23, 0xc3, 0xf3, - 0xbe, 0xc0, 0x7e, 0x66, 0x17, 0xe7, 0xc1, 0x0c, 0xb4, 0xae, 0xb4, 0x16, - 0x4f, 0xc9, 0xaa, 0x0f, - 0x8e, 0xeb, 0xc9, 0x7c, 0x69, 0xdc, 0x5c, 0x4e, 0xca, 0xff, 0x92, 0x91, - 0x25, 0x41, 0xff, 0xd4, - 0xf5, 0x7a, 0x08, 0xa6, 0x95, 0x55, 0x83, 0x52, 0x5e, 0x64, 0xea, 0x19, - 0x27, 0x6f, 0xe2, 0xea, - 0xb1, 0xb0, 0xf3, 0x26, 0x8b, 0x7c, 0xbd, 0x7c, 0xbb, 0xca, 0xf4, 0x2f, - 0xbc, 0xdf, 0x44, 0x1b, - 0xe9, 0x5c, 0xff, 0x6c, 0xf6, 0x33, 0xfc, 0x3d, 0x88, 0xe7, 0x12, 0x39, - 0xae, 0x17, 0x17, 0xe7, - 0x8b, 0xf4, 0x8f, 0x8c, 0x2c, 0x11, 0xf1, 0x3f, 0x25, 0xd3, 0x6a, 0x86, - 0x63, 0x5a, 0x15, 0x2f, - 0x78, 0x5c, 0xaf, 0xb5, 0xca, 0x9b, 0x42, 0xae, 0x40, 0xb0, 0xa9, 0x56, - 0x79, 0x93, 0x2a, 0xaf, - 0xab, 0x0b, 0x9b, 0x1f, 0x6c, 0xd7, 0xbd, 0x68, 0xcc, 0xff, 0xe5, 0xe7, - 0x3f, 0x8b, 0x83, 0xef, - 0xe3, 0xb9, 0x38, 0x1c, 0xfc, 0xd4, 0x2c, 0x7e, 0x7e, 0xbf, 0x72, 0x4d, - 0x7a, 0xa4, 0x7f, 0x64, - 0x64, 0x49, 0xa8, 0x7f, 0x51, 0xd7, 0xeb, 0x55, 0xea, 0x57, 0x65, 0x5a, - 0xd9, 0xda, 0xc3, 0x7b, - 0x2c, 0xa6, 0x85, 0x06, 0xe4, 0x4d, 0x76, 0xd7, 0xd9, 0x54, 0x7c, 0x7e, - 0x70, 0xba, 0xaf, 0x75, - 0xed, 0x3e, 0xb7, 0xd4, 0x24, 0xd7, 0x76, 0xf7, 0xbe, 0x01, 0x0f, 0x86, - 0xf3, 0x5c, 0xce, 0xbd, - 0x3c, 0x17, 0xa8, 0x4b, 0xe6, 0x3f, 0x93, 0xe9, 0x9f, 0x55, 0x97, 0xd8, - 0x0d, 0x8b, 0xeb, 0x15, - 0x31, 0xb1, 0xce, 0x3b, 0xca, 0xb9, 0x9c, 0x66, 0xe6, 0xe8, 0xb2, 0x4b, - 0xfa, 0x47, 0x46, 0x76, - 0xc3, 0xf5, 0x6f, 0xb2, 0xd5, 0xda, 0x50, 0x31, 0xad, 0x50, 0xbd, 0x6f, - 0x29, 0xee, 0x37, 0xe6, - 0x55, 0x71, 0xbd, 0x71, 0xa9, 0x09, 0xb1, 0xc4, 0xb5, 0xbc, 0x09, 0xd3, - 0xb2, 0xe2, 0x89, 0xde, - 0xc8, 0xce, 0x32, 0xad, 0xf4, 0x30, 0xd5, 0x49, 0xcd, 0x98, 0xfe, 0xf5, - 0x03, 0x7a, 0xdf, 0x7c, - 0x3c, 0x97, 0xd5, 0x4c, 0x91, 0x8a, 0x9c, 0xe7, 0x12, 0x25, 0xae, 0x87, - 0x98, 0xcb, 0xc9, 0xd7, - 0xa4, 0x4f, 0xf3, 0xcf, 0xc9, 0xc8, 0x6e, 0xbc, 0xfe, 0x8d, 0x8a, 0x6d, - 0xd5, 0x57, 0x41, 0xbd, - 0x1e, 0x96, 0x69, 0x85, 0x9a, 0xab, 0x66, 0xfb, 0xaa, 0xbe, 0x7e, 0x93, - 0xd2, 0xb9, 0xc5, 0x7f, - 0x3e, 0x11, 0x79, 0x0f, 0x9e, 0x03, 0x59, 0xca, 0x7b, 0xdf, 0xec, 0xba, - 0xe4, 0xe2, 0x79, 0x75, - 0x1f, 0x72, 0x2d, 0x52, 0x9e, 0x0b, 0xf8, 0xd7, 0x58, 0xce, 0x17, 0x32, - 0xd6, 0x99, 0x1f, 0x92, - 0xfe, 0x91, 0x91, 0xdd, 0x78, 0xfd, 0x1b, 0xe6, 0x3b, 0x98, 0xb8, 0x1e, - 0x8a, 0x69, 0x75, 0xa7, - 0x72, 0xf5, 0xb9, 0x6a, 0x4c, 0xcb, 0xe0, 0xdc, 0x97, 0x9e, 0x66, 0xdb, - 0xfa, 0x52, 0x68, 0x20, - 0xcf, 0x81, 0x2c, 0x94, 0xbd, 0x6f, 0x26, 0x8f, 0xeb, 0xcd, 0x33, 0x75, - 0xc1, 0xc1, 0x0f, 0xe2, - 0xb9, 0x6c, 0x71, 0x9e, 0x03, 0x70, 0xbe, 0xb2, 0x03, 0x57, 0xbf, 0x4a, - 0x70, 0x8d, 0x0c, 0x22, - 0xd6, 0xa9, 0x19, 0xc5, 0x31, 0xf5, 0xbf, 0x91, 0x91, 0xdd, 0x78, 0xfd, - 0xeb, 0xeb, 0x9d, 0x6b, - 0xc4, 0xf5, 0x3c, 0x35, 0x28, 0xd0, 0xfb, 0xa6, 0xc5, 0xc1, 0x69, 0x39, - 0x12, 0x79, 0x0f, 0xde, - 0xfb, 0xab, 0xea, 0x7d, 0x5b, 0x67, 0xd5, 0x7b, 0x62, 0x8d, 0x6e, 0x0e, - 0x3e, 0xf8, 0xd8, 0x0e, - 0x07, 0x3f, 0x60, 0x7e, 0xf0, 0xaa, 0x46, 0x06, 0x11, 0xeb, 0xa4, 0xfe, - 0x5f, 0x32, 0xb2, 0x9b, - 0xaf, 0x7f, 0xbd, 0x94, 0xa1, 0xd2, 0x22, 0x4c, 0xbd, 0x1e, 0x96, 0x69, - 0x85, 0xe2, 0xb4, 0x58, - 0xcc, 0x67, 0xc8, 0x81, 0x60, 0x7b, 0xdf, 0x82, 0xe3, 0x7a, 0x2e, 0x0e, - 0x3e, 0xc4, 0x1a, 0x9f, - 0x0a, 0xe3, 0xb9, 0x6c, 0x44, 0xe2, 0x7c, 0xed, 0x4c, 0x2f, 0x9b, 0xa4, - 0x7f, 0x64, 0x64, 0x37, - 0x5c, 0xff, 0x98, 0xdf, 0x2a, 0xe5, 0xb9, 0x44, 0x89, 0xeb, 0x21, 0x99, - 0x56, 0x9b, 0xc8, 0xde, - 0x37, 0xc8, 0xfb, 0x42, 0x0e, 0x44, 0x9f, 0xa8, 0x7a, 0xdf, 0x22, 0xcc, - 0xe5, 0xbc, 0x28, 0xed, - 0x4b, 0x79, 0x2e, 0x3c, 0x6f, 0x92, 0x69, 0x01, 0xe7, 0x6b, 0x67, 0xaa, - 0xe2, 0x7c, 0xb1, 0x35, - 0x99, 0x11, 0xff, 0x80, 0x8c, 0x2c, 0x09, 0xf5, 0x2f, 0x52, 0x9e, 0x8b, - 0x2b, 0xae, 0x97, 0x8a, - 0x85, 0xbf, 0x8c, 0xe4, 0xb4, 0x40, 0xde, 0xf7, 0x58, 0x6f, 0xc2, 0xdc, - 0x4b, 0x75, 0xef, 0x9b, - 0x60, 0x5a, 0xa1, 0x6a, 0x18, 0xad, 0xb8, 0xa3, 0x87, 0xe7, 0x72, 0xcb, - 0xcb, 0xc1, 0x87, 0xb3, - 0xe4, 0xf6, 0x71, 0xe1, 0x50, 0x36, 0x3f, 0xd8, 0xa9, 0x91, 0x99, 0x93, - 0xfe, 0x91, 0x91, 0xdd, - 0x78, 0xfd, 0x03, 0xfe, 0xbd, 0x8c, 0xe7, 0x02, 0xfb, 0x7f, 0xe4, 0xb0, - 0xea, 0x43, 0x8d, 0x33, - 0xad, 0xae, 0xc6, 0x5f, 0x0e, 0x88, 0x25, 0x42, 0xde, 0x37, 0xdb, 0xca, - 0x2e, 0x73, 0xad, 0x8c, - 0x72, 0xee, 0x5b, 0x94, 0xb9, 0x9c, 0xeb, 0xbd, 0x6f, 0x1e, 0x0e, 0xfe, - 0xed, 0xaa, 0x72, 0x7e, - 0xb0, 0x55, 0x23, 0xd3, 0xde, 0x25, 0xfd, 0x23, 0x23, 0xbb, 0xf9, 0xfa, - 0xc7, 0xfc, 0xdb, 0x20, - 0x9e, 0x8b, 0xcd, 0xc1, 0x07, 0x7f, 0x11, 0xe2, 0x7a, 0x21, 0x3c, 0x17, - 0x11, 0xd7, 0xe3, 0x4c, - 0xab, 0x14, 0xaa, 0x46, 0x46, 0xc9, 0x69, 0x19, 0x65, 0x79, 0xde, 0x17, - 0x33, 0xf7, 0x8d, 0xf7, - 0xbe, 0xc5, 0x33, 0x97, 0xd3, 0x48, 0x0d, 0x2d, 0xce, 0xd7, 0x59, 0xc8, - 0xfc, 0xe0, 0x41, 0x0a, - 0x38, 0x5f, 0x4d, 0xe2, 0xff, 0x91, 0x91, 0x25, 0x40, 0xff, 0xd6, 0x72, - 0x05, 0xeb, 0x1c, 0xfc, - 0xdd, 0x3b, 0x21, 0x3c, 0x97, 0x28, 0x71, 0x3d, 0x24, 0xa7, 0x45, 0x30, - 0x9f, 0x53, 0x6d, 0x1d, - 0x31, 0xf7, 0x0d, 0xc9, 0xb4, 0xe2, 0x35, 0x32, 0xca, 0xb8, 0x9e, 0xc5, - 0xc7, 0xcf, 0xf4, 0xb5, - 0x8e, 0x6c, 0x7e, 0x30, 0xcf, 0x9b, 0x9c, 0x6e, 0xd5, 0x48, 0xff, 0xc8, - 0xc8, 0x92, 0xa4, 0x7f, - 0xde, 0xfc, 0xab, 0x5d, 0x97, 0xbc, 0x75, 0x51, 0xdd, 0xdf, 0x75, 0xcd, - 0xcc, 0xe5, 0xfb, 0x1f, - 0x72, 0x05, 0x13, 0x37, 0x07, 0x1f, 0x5b, 0x23, 0x93, 0x47, 0x71, 0x5a, - 0x34, 0x60, 0x9e, 0xce, - 0x52, 0x6d, 0x5e, 0x03, 0xa8, 0xf0, 0x6b, 0x05, 0xd3, 0x2a, 0x1f, 0x0f, - 0xd3, 0x2a, 0x88, 0xf3, - 0xe5, 0xee, 0x37, 0x71, 0xe5, 0x4d, 0x48, 0xff, 0xc8, 0xc8, 0x12, 0xaa, - 0x7f, 0x6e, 0xbf, 0xf1, - 0xb8, 0x72, 0x58, 0x3d, 0x2b, 0x1c, 0x14, 0x64, 0x3c, 0x17, 0x2b, 0x6f, - 0x02, 0x73, 0x2f, 0x55, - 0x71, 0x3d, 0x6d, 0xe5, 0xab, 0x9a, 0xe1, 0xb9, 0x0a, 0xa6, 0x7f, 0x13, - 0xad, 0x0d, 0x39, 0x90, - 0x8d, 0xb8, 0x98, 0x56, 0xec, 0xfd, 0x5d, 0x97, 0xf3, 0xe5, 0xe9, 0x37, - 0xa1, 0xf8, 0x1f, 0x19, - 0x59, 0xe2, 0xf5, 0x2f, 0x0f, 0x4c, 0xab, 0x99, 0xe0, 0x43, 0x07, 0xf3, - 0x5c, 0x76, 0x79, 0xac, - 0x10, 0xfc, 0xc6, 0xd2, 0x22, 0x57, 0xcf, 0x86, 0xcc, 0xcc, 0xc5, 0xf2, - 0x97, 0x21, 0xef, 0xab, - 0x8f, 0x36, 0x42, 0x7b, 0xdf, 0xdc, 0x71, 0x3d, 0x19, 0xab, 0xde, 0x5f, - 0x23, 0x83, 0xac, 0x61, - 0xc4, 0x71, 0xbe, 0x66, 0x54, 0xff, 0x47, 0x46, 0x96, 0x70, 0xfd, 0x93, - 0xb1, 0xea, 0x0d, 0x0f, - 0x07, 0xff, 0x4e, 0x75, 0x8d, 0xe7, 0xe2, 0x9f, 0x1f, 0xbc, 0xaa, 0x91, - 0xc9, 0x29, 0x39, 0x5a, - 0x19, 0x2b, 0xef, 0x6b, 0xf5, 0xbe, 0x85, 0x9d, 0xff, 0x70, 0xac, 0x7a, - 0x9b, 0x69, 0xd5, 0x47, - 0x71, 0xbe, 0xd6, 0xf4, 0xef, 0x83, 0x83, 0xb7, 0x1b, 0xef, 0x1d, 0xbc, - 0xd7, 0x78, 0xcf, 0xe0, - 0x3d, 0xe6, 0x7b, 0xd8, 0x9f, 0xef, 0x1d, 0xfe, 0x90, 0xf1, 0x43, 0xc3, - 0x8f, 0x1b, 0x1f, 0x87, - 0xbf, 0xaf, 0x5d, 0xef, 0x30, 0x3e, 0xd8, 0x43, 0xcc, 0x75, 0x27, 0x23, - 0x23, 0x7b, 0x30, 0xd6, - 0xfb, 0xa0, 0xf1, 0x76, 0xbe, 0x37, 0xdf, 0xc3, 0xf7, 0xf0, 0x6a, 0xaf, - 0x06, 0xef, 0xe1, 0x77, - 0x0c, 0x3e, 0x68, 0xd8, 0x71, 0x40, 0x75, 0x5c, 0x4f, 0x33, 0xd2, 0x93, - 0x62, 0x73, 0x97, 0xe9, - 0xde, 0x3a, 0x9b, 0xca, 0x9b, 0x37, 0xc9, 0xa0, 0x66, 0x94, 0x8b, 0xde, - 0x0f, 0xc8, 0xfb, 0x82, - 0xff, 0x9b, 0x01, 0xf6, 0xf3, 0x30, 0xd5, 0xd5, 0x8e, 0x34, 0x63, 0x3d, - 0x6e, 0x78, 0x8d, 0xb8, - 0x5e, 0x80, 0xf1, 0xb9, 0x9c, 0x01, 0xbd, 0x6f, 0x93, 0xd9, 0x2b, 0xcd, - 0x37, 0xcc, 0xdf, 0x60, - 0x5d, 0xdf, 0x69, 0x7e, 0x67, 0xd8, 0xb5, 0x78, 0xb9, 0x39, 0x1a, 0xd0, - 0x67, 0x8e, 0x8c, 0xec, - 0xa1, 0xb1, 0xc1, 0xc4, 0x7c, 0xe5, 0xe2, 0x0d, 0xce, 0x1e, 0xfe, 0x4e, - 0xc5, 0x1e, 0x7e, 0xf9, - 0x6c, 0x64, 0xf9, 0x8d, 0xa2, 0xf7, 0x4d, 0x59, 0xaf, 0x37, 0x2a, 0xb6, - 0x39, 0x7f, 0x39, 0x64, - 0x7e, 0x30, 0x70, 0xf0, 0x21, 0x6e, 0x56, 0x3e, 0xce, 0x1d, 0x86, 0xf6, - 0x9b, 0xd8, 0xbd, 0x6f, - 0x47, 0x1b, 0x06, 0xe7, 0x3e, 0x5b, 0xec, 0x67, 0x7d, 0xa1, 0xb7, 0x3c, - 0x3c, 0x17, 0xf8, 0x7e, - 0xf6, 0xb5, 0x71, 0x32, 0xad, 0xb2, 0xc7, 0x55, 0xa6, 0xcf, 0xeb, 0x35, - 0x32, 0xb7, 0x27, 0xff, - 0xce, 0x6c, 0x4e, 0x9b, 0x70, 0x19, 0x8d, 0x69, 0xc3, 0xb4, 0x2e, 0xa3, - 0x3e, 0xad, 0x9b, 0xf6, - 0x75, 0x38, 0x3d, 0xb4, 0xae, 0x37, 0x99, 0xe7, 0x7d, 0xfa, 0xcc, 0x91, - 0x91, 0x3d, 0x34, 0xd6, - 0xbf, 0x6d, 0xfe, 0xbb, 0x59, 0xd3, 0xda, 0xc3, 0x0d, 0xd7, 0x1e, 0xae, - 0xbb, 0xf6, 0xf0, 0xa1, - 0xb3, 0x87, 0xdf, 0x34, 0x39, 0xb7, 0xf4, 0x0f, 0xd7, 0xfb, 0xa6, 0x4d, - 0x03, 0x7a, 0xdf, 0x3c, - 0xf3, 0x83, 0xad, 0xbc, 0x09, 0x3f, 0x17, 0x86, 0xcc, 0x0f, 0x16, 0xdf, - 0xe7, 0x30, 0x4f, 0x61, - 0xee, 0x79, 0x66, 0x9a, 0xe5, 0xec, 0x67, 0xe0, 0x62, 0xad, 0xd5, 0x25, - 0x8f, 0x32, 0x6d, 0x5c, - 0x6f, 0xf2, 0x56, 0x13, 0x3b, 0x97, 0x33, 0x88, 0xf3, 0xf5, 0xd4, 0xf8, - 0xbb, 0xcc, 0xee, 0xa4, - 0x63, 0x76, 0xa6, 0x1d, 0x83, 0x5f, 0x93, 0xb6, 0xd9, 0x9e, 0xf2, 0xcb, - 0x68, 0x4f, 0x5b, 0x66, - 0x8b, 0x5f, 0x4d, 0x43, 0xac, 0xef, 0xbf, 0x35, 0x6f, 0xf7, 0xc9, 0xff, - 0x25, 0x23, 0x7b, 0x68, - 0xec, 0xe8, 0x29, 0xf3, 0xbb, 0xa6, 0x5d, 0xd8, 0xbf, 0x62, 0x0f, 0xb3, - 0xbd, 0xbc, 0xda, 0xbf, - 0x6d, 0x6b, 0xff, 0xb6, 0xac, 0xfd, 0xdb, 0x34, 0xff, 0xed, 0xe4, 0xb6, - 0xd8, 0xbf, 0x03, 0x5c, - 0xbd, 0x9e, 0x2a, 0xae, 0xc7, 0xf3, 0x26, 0xd3, 0x42, 0x13, 0xce, 0x6a, - 0x2b, 0x36, 0xd5, 0x7a, - 0xbf, 0x09, 0xe7, 0xb1, 0x58, 0xbd, 0x6f, 0xa0, 0x89, 0x90, 0x03, 0x81, - 0x3f, 0x21, 0xef, 0x9a, - 0x1a, 0xa5, 0x3b, 0x7e, 0x9e, 0x0b, 0xd4, 0xe2, 0x40, 0xcf, 0x46, 0x71, - 0xa6, 0x37, 0x64, 0x3c, - 0x97, 0xb0, 0xb8, 0xde, 0x5a, 0xac, 0xd3, 0xc7, 0xef, 0xb7, 0xed, 0xfb, - 0xc6, 0xff, 0xc1, 0x3c, - 0x9a, 0x1c, 0x59, 0x57, 0xcf, 0xec, 0x89, 0xcb, 0x80, 0xcb, 0x9c, 0x98, - 0xa6, 0x31, 0x35, 0xc4, - 0x35, 0xe9, 0x9a, 0xdd, 0xe9, 0x77, 0x99, 0x4f, 0x1d, 0xd1, 0x67, 0x8e, - 0x8c, 0xec, 0xe1, 0xd1, - 0xbf, 0xef, 0x33, 0xff, 0xc3, 0xf4, 0xc8, 0xd9, 0xc3, 0xee, 0xfd, 0xdb, - 0x9b, 0x98, 0x6c, 0x0f, - 0xdb, 0xfb, 0xd7, 0x60, 0xfb, 0xb7, 0x6b, 0x7e, 0xd7, 0xf8, 0x29, 0xf1, - 0x7d, 0x9c, 0x69, 0x85, - 0x98, 0xab, 0x86, 0xe9, 0x7d, 0x63, 0x3f, 0x03, 0xf4, 0x6f, 0x73, 0x92, - 0x69, 0x06, 0xb1, 0xa9, - 0x20, 0x6f, 0xb2, 0xb9, 0xc8, 0x36, 0xd3, 0x93, 0x34, 0xef, 0x7d, 0x83, - 0xf3, 0x5f, 0x66, 0xad, - 0xf7, 0xcd, 0xc7, 0x73, 0xb9, 0x5b, 0x0d, 0xe0, 0xb9, 0xe8, 0x1e, 0x9e, - 0x0b, 0x7f, 0x7f, 0x0b, - 0x24, 0xd3, 0x4a, 0x12, 0xeb, 0x7c, 0x7a, 0x5c, 0x33, 0x26, 0xe3, 0xb1, - 0x39, 0x9e, 0xc0, 0x35, - 0x32, 0x47, 0xd6, 0x35, 0x9c, 0x0c, 0xe1, 0x32, 0x86, 0x93, 0x81, 0x39, - 0xb0, 0xae, 0xfe, 0xf4, - 0xcd, 0xe6, 0x5b, 0x49, 0xff, 0xc8, 0xc8, 0x1e, 0x22, 0xfd, 0x7b, 0xda, - 0xa8, 0x4d, 0x26, 0xd6, - 0xfe, 0x1d, 0x3b, 0xfb, 0x77, 0x24, 0xf6, 0x2f, 0xdf, 0xc3, 0x03, 0x67, - 0x0f, 0xf7, 0xcd, 0x37, - 0x8f, 0xdf, 0x6a, 0xd7, 0x83, 0xa0, 0xe6, 0xaa, 0xe5, 0xa2, 0xcc, 0x55, - 0x73, 0x7a, 0xdf, 0xd6, - 0xe7, 0x07, 0x73, 0xfe, 0x33, 0xcc, 0x7c, 0x63, 0xe7, 0xbf, 0xec, 0x2c, - 0xd3, 0x0e, 0xed, 0x7d, - 0x83, 0xba, 0xe4, 0x59, 0xa9, 0xb1, 0x7b, 0x7b, 0x67, 0xcf, 0x1f, 0x6b, - 0xf4, 0x73, 0xf0, 0x05, - 0xd3, 0x4a, 0xf5, 0xfe, 0xe4, 0x9c, 0xaf, 0x77, 0x8e, 0x3a, 0xe6, 0xf1, - 0xf8, 0xd8, 0x5c, 0x8e, - 0x97, 0xec, 0x5a, 0x18, 0x8b, 0xc9, 0xc2, 0x9c, 0x8f, 0xd9, 0x35, 0x99, - 0x9b, 0xb3, 0xf1, 0x8c, - 0x5f, 0xd3, 0xf1, 0x94, 0x5f, 0x93, 0x49, 0xcd, 0x7c, 0x9a, 0xfc, 0x5f, - 0x32, 0xb2, 0x87, 0x48, - 0xff, 0xde, 0x69, 0x76, 0xd8, 0xfe, 0x3d, 0xe6, 0xfb, 0x77, 0x69, 0x2c, - 0xd8, 0xde, 0x5d, 0x8c, - 0xe7, 0xfc, 0x9a, 0x4f, 0xc4, 0xfe, 0x9d, 0x4d, 0xc4, 0xfe, 0x9d, 0x32, - 0x9d, 0xac, 0x8d, 0x9f, - 0x16, 0x33, 0x88, 0xb0, 0x4c, 0xab, 0x33, 0x4c, 0xef, 0x1b, 0xd4, 0xa0, - 0x48, 0x38, 0x2d, 0x56, - 0xde, 0x44, 0x9f, 0x66, 0x5a, 0xd9, 0x85, 0x35, 0xf3, 0xf2, 0x54, 0xdd, - 0xfb, 0xc6, 0x67, 0x89, - 0x9c, 0x17, 0x0f, 0xc2, 0x78, 0x2e, 0x9c, 0x83, 0x7f, 0x5e, 0x3d, 0xd8, - 0x59, 0x64, 0xeb, 0x52, - 0x9e, 0x8b, 0x22, 0xd6, 0xf9, 0x9e, 0xd1, 0xc0, 0xbc, 0x35, 0xbe, 0x65, - 0x5e, 0x8c, 0x2f, 0x9c, - 0xeb, 0x6c, 0x7c, 0xe6, 0x5c, 0xa7, 0xe3, 0x53, 0xf3, 0x64, 0x7c, 0x62, - 0x5d, 0x1d, 0xf3, 0x9d, - 0xa4, 0x7f, 0x64, 0x64, 0x0f, 0x91, 0xfe, 0xbd, 0xc7, 0x1c, 0xb0, 0xfd, - 0x7b, 0xcb, 0xb5, 0x7f, - 0x2f, 0x5c, 0xfb, 0xf7, 0x8c, 0xed, 0xdf, 0x53, 0x67, 0xff, 0x9e, 0x30, - 0xad, 0x7c, 0xa7, 0x81, - 0x89, 0xeb, 0xb9, 0x6b, 0x50, 0x94, 0x4c, 0x2b, 0x24, 0xa7, 0x25, 0x35, - 0xd5, 0xdb, 0x50, 0xf7, - 0x07, 0x1c, 0x7c, 0x44, 0xef, 0xdb, 0x1a, 0xab, 0x9e, 0xf3, 0x5c, 0xfc, - 0x1c, 0xfc, 0xa7, 0x76, - 0xc3, 0x79, 0x2e, 0xae, 0x58, 0x67, 0x2a, 0x40, 0x9f, 0xdf, 0x37, 0x9a, - 0x9b, 0xdf, 0x37, 0xfa, - 0x5e, 0xe3, 0x7b, 0x47, 0xdf, 0x6b, 0x7e, 0xcf, 0xe8, 0x7b, 0xe0, 0x32, - 0x9e, 0x1a, 0x3d, 0x65, - 0xc2, 0x75, 0x77, 0x7c, 0xd7, 0xbc, 0x3b, 0xba, 0x6b, 0xde, 0x19, 0xdf, - 0xe1, 0xd7, 0xed, 0xf1, - 0xc0, 0x7c, 0x37, 0xf9, 0xbf, 0x64, 0x64, 0x0f, 0x91, 0xfe, 0xbd, 0x8f, - 0xf9, 0x6b, 0xdf, 0xc7, - 0xf7, 0xef, 0xf7, 0x8a, 0xfd, 0x6b, 0x7e, 0xcf, 0xf8, 0x29, 0xb1, 0x87, - 0xad, 0xfd, 0x7b, 0xd7, - 0xda, 0xbf, 0x77, 0xc6, 0xb7, 0xcd, 0xc1, 0xe8, 0xdd, 0xa2, 0x1e, 0x64, - 0x19, 0x23, 0xd3, 0x0a, - 0xc9, 0x69, 0xb1, 0x7b, 0xdf, 0xb8, 0x96, 0xa9, 0xe2, 0x8e, 0x3c, 0xae, - 0x97, 0x95, 0xe9, 0xb3, - 0xe0, 0xe0, 0xcf, 0x36, 0x1b, 0xf0, 0xfe, 0xaa, 0x41, 0x33, 0x37, 0xdd, - 0x1c, 0x7c, 0x8b, 0xdf, - 0x1f, 0xf4, 0xfe, 0x3e, 0x38, 0xbc, 0x65, 0xbc, 0x63, 0xf4, 0x0e, 0xe3, - 0xed, 0xa3, 0xb7, 0x9b, - 0x6f, 0x1f, 0xbd, 0xcd, 0x78, 0xdb, 0xe8, 0x6d, 0xe6, 0xdb, 0x46, 0x4f, - 0x1b, 0x4f, 0x8f, 0x7e, - 0xc0, 0xfc, 0x01, 0x7e, 0x7d, 0xbf, 0xf9, 0xfd, 0xfc, 0x7a, 0xab, 0xf9, - 0x56, 0x76, 0xb6, 0x7e, - 0x1f, 0xe9, 0x1f, 0x19, 0xd9, 0x43, 0xa4, 0x7f, 0x1f, 0x34, 0x6e, 0xb1, - 0xfd, 0xfb, 0x8e, 0xd1, - 0xdb, 0x61, 0x0f, 0x5b, 0xfb, 0xf7, 0x6d, 0x6c, 0xff, 0x3e, 0x6d, 0xed, - 0xdf, 0x1f, 0xb0, 0xf6, - 0xef, 0xf7, 0x9b, 0x6f, 0x65, 0x7b, 0x78, 0x31, 0x7a, 0x5f, 0xa4, 0xb8, - 0x1e, 0x8a, 0x69, 0x85, - 0xe4, 0xb4, 0xd8, 0xbd, 0x6f, 0xb6, 0x86, 0x85, 0x7d, 0x2d, 0x8a, 0x55, - 0xcf, 0x7c, 0x6b, 0xce, - 0xc7, 0x9f, 0x66, 0x9b, 0x52, 0x9e, 0x0b, 0xe4, 0x4d, 0xd8, 0x7f, 0xe3, - 0x9c, 0xaf, 0x80, 0xd7, - 0xfc, 0xe8, 0xf0, 0xad, 0xe6, 0x7b, 0x87, 0xef, 0x31, 0xdf, 0x3b, 0x7a, - 0x8f, 0xf1, 0x9e, 0x21, - 0xbb, 0x46, 0xcf, 0x18, 0xcf, 0x8c, 0xde, 0x6d, 0x3c, 0x33, 0x7c, 0xc6, - 0x7c, 0xd7, 0xe8, 0x5d, - 0xc6, 0x0f, 0xb2, 0xeb, 0x5d, 0xa3, 0x1f, 0x64, 0x7f, 0xbe, 0xd3, 0x78, - 0xe7, 0xe8, 0x96, 0xf9, - 0xc1, 0x23, 0xf2, 0x7f, 0xc9, 0xc8, 0x1e, 0x1e, 0xfd, 0xfb, 0xa8, 0xf9, - 0xd6, 0xe1, 0x7b, 0xcd, - 0xf7, 0x8c, 0xde, 0x0b, 0xfb, 0x97, 0xfd, 0xf9, 0x1e, 0xb6, 0x7f, 0x9f, - 0x31, 0xdf, 0x0d, 0xfb, - 0x78, 0xc8, 0xf7, 0xae, 0xb5, 0x8f, 0x7f, 0x90, 0xed, 0xdf, 0x77, 0x9a, - 0xb7, 0x86, 0xa2, 0xff, - 0x03, 0xc7, 0xb4, 0xca, 0x76, 0xab, 0x4c, 0xff, 0x54, 0x35, 0x32, 0x38, - 0x4e, 0xcb, 0x86, 0x91, - 0x59, 0xe4, 0x5a, 0x99, 0xa1, 0x82, 0xf9, 0x67, 0x59, 0x1e, 0x98, 0x56, - 0x33, 0x04, 0xab, 0x1e, - 0x7a, 0xdf, 0xec, 0xf7, 0x27, 0xe1, 0xb9, 0x00, 0xcf, 0x01, 0x72, 0x29, - 0xa5, 0xe5, 0xfa, 0xfc, - 0xe0, 0x8f, 0xb1, 0x35, 0xfa, 0xc0, 0xf0, 0x03, 0xe6, 0xb3, 0xc3, 0x67, - 0xf9, 0xf5, 0x23, 0xc3, - 0x1f, 0x61, 0xd7, 0xfb, 0x8d, 0xf7, 0x0f, 0xdf, 0x6f, 0xbe, 0x7f, 0xf8, - 0x3e, 0xe3, 0x7d, 0xec, - 0xfa, 0xe1, 0xe1, 0x0f, 0x99, 0x3f, 0xcc, 0xfb, 0xe2, 0xbe, 0xdf, 0xf8, - 0x28, 0xe9, 0x1f, 0x19, - 0xd9, 0x43, 0xa4, 0x7f, 0x1f, 0x33, 0xdf, 0x35, 0xfc, 0x00, 0xdb, 0xc3, - 0xcf, 0x5a, 0x7b, 0x18, - 0xf6, 0xef, 0x8f, 0x58, 0xfb, 0xf7, 0xfd, 0x7c, 0xff, 0xbe, 0x6f, 0xf8, - 0xc3, 0xe6, 0x0f, 0x0d, - 0x7f, 0x98, 0xed, 0xdf, 0x1f, 0x32, 0xbf, 0x7f, 0xf8, 0x63, 0x46, 0xaa, - 0x9f, 0xea, 0xf0, 0xb8, - 0xde, 0x08, 0x13, 0xd7, 0x43, 0xd4, 0xc8, 0x60, 0x38, 0x2d, 0xa6, 0x66, - 0xc0, 0xec, 0xcb, 0xf4, - 0x00, 0xa5, 0x7f, 0x50, 0xaf, 0x87, 0xeb, 0x7d, 0x03, 0x7e, 0x7f, 0x80, - 0x3e, 0x2b, 0xf3, 0x26, - 0x56, 0xbf, 0xc9, 0x27, 0x07, 0xef, 0x37, 0x7f, 0x6c, 0xf8, 0x63, 0xe6, - 0x8f, 0x0d, 0x3e, 0x6a, - 0x7e, 0x94, 0x5d, 0x1f, 0x19, 0x7e, 0xc4, 0xfc, 0xc8, 0xe0, 0x23, 0xe6, - 0x87, 0x87, 0x1f, 0x36, - 0x3f, 0x3c, 0xf8, 0x90, 0xf9, 0xa1, 0xe1, 0x87, 0xcc, 0x1f, 0x1d, 0xfe, - 0x28, 0xbb, 0x3e, 0xc8, - 0x7c, 0xe5, 0x77, 0x99, 0x1f, 0x23, 0xff, 0x97, 0x8c, 0xec, 0xe1, 0xb1, - 0xde, 0x27, 0x99, 0xce, - 0xc1, 0xfe, 0xfd, 0x31, 0xe6, 0xcb, 0xc1, 0x1e, 0xfe, 0x88, 0xb5, 0x87, - 0x61, 0xff, 0x7e, 0x98, - 0xef, 0xdf, 0x0f, 0xf1, 0xfd, 0xfb, 0xa3, 0x6c, 0xff, 0x7e, 0xd0, 0x7c, - 0xd7, 0xe0, 0xe3, 0xc6, - 0xce, 0x59, 0xe9, 0x00, 0x98, 0x51, 0x9b, 0x93, 0x74, 0x33, 0x34, 0x6f, - 0x8a, 0x64, 0x5a, 0xa1, - 0x38, 0x2d, 0xae, 0xde, 0x37, 0xf5, 0x3d, 0xa1, 0xe7, 0x72, 0xb6, 0x64, - 0x71, 0x3d, 0xaf, 0x2f, - 0xcd, 0xf4, 0x99, 0xf9, 0xe7, 0x41, 0xf3, 0x83, 0x7f, 0x76, 0xf0, 0x11, - 0xe3, 0xb9, 0xc1, 0x73, - 0xc6, 0x4f, 0x0d, 0x7e, 0xca, 0xfc, 0xa9, 0xc1, 0x4f, 0x9a, 0x1f, 0xe7, - 0xd7, 0xc7, 0xf9, 0xf5, - 0xb1, 0xc1, 0xc7, 0xd8, 0xf5, 0x13, 0xc6, 0x4f, 0xb0, 0xeb, 0xc7, 0x07, - 0x3f, 0xce, 0xae, 0xf7, - 0x9b, 0x3f, 0xd7, 0x7b, 0xbb, 0xf1, 0x76, 0x93, 0x8c, 0x8c, 0xec, 0xa1, - 0xb0, 0xde, 0x2f, 0x33, - 0xad, 0x7b, 0x8e, 0xed, 0xe1, 0x9f, 0xe2, 0x7b, 0xf8, 0x27, 0xd9, 0xbe, - 0xfd, 0x49, 0x6b, 0xff, - 0x7e, 0x9c, 0xef, 0xdf, 0x8f, 0xf1, 0xfd, 0xfb, 0x13, 0x83, 0x1f, 0x37, - 0x61, 0x0f, 0xbf, 0x7f, - 0xf0, 0x29, 0xc3, 0xf6, 0x0b, 0xc3, 0x78, 0x2e, 0x11, 0xe2, 0x7a, 0x38, - 0x4e, 0x0b, 0xf4, 0xbe, - 0x01, 0xf3, 0x19, 0xc3, 0x4f, 0x89, 0xc6, 0xb4, 0x42, 0xd5, 0x30, 0x96, - 0xe7, 0x9c, 0xf3, 0xb5, - 0x9a, 0x1f, 0x6c, 0x71, 0xf0, 0x7f, 0x81, 0xad, 0xdb, 0xa7, 0x07, 0x9f, - 0x36, 0x3e, 0xdd, 0xff, - 0x19, 0xe3, 0x67, 0xd8, 0xf5, 0xd3, 0x83, 0x9f, 0x36, 0x7f, 0x7a, 0xf0, - 0xbc, 0xf1, 0x3c, 0xbb, - 0x3e, 0x35, 0xf8, 0x94, 0xf9, 0xa9, 0xc1, 0x27, 0x8d, 0x4f, 0x0e, 0x3e, - 0x69, 0x7e, 0x72, 0xf0, - 0x09, 0xe3, 0x13, 0x83, 0x8f, 0x1a, 0xbf, 0xd2, 0xbb, 0x34, 0xc9, 0xc8, - 0xc8, 0x1e, 0x12, 0xeb, - 0xfd, 0x06, 0x3b, 0xb7, 0x7c, 0xda, 0xfc, 0x74, 0xff, 0xd3, 0xc6, 0xcf, - 0x0c, 0x7e, 0xc6, 0xfc, - 0x99, 0xfe, 0x4f, 0xc3, 0x1e, 0x86, 0xfd, 0x6b, 0x3e, 0xcf, 0xb4, 0x8e, - 0xed, 0x61, 0x6b, 0xff, - 0x7e, 0x92, 0xed, 0xdf, 0x4f, 0xb0, 0xf3, 0xe1, 0xa7, 0x8d, 0xfc, 0xbc, - 0x58, 0x87, 0x7a, 0x90, - 0x6a, 0x08, 0xcf, 0x05, 0x7a, 0x2c, 0x78, 0x0d, 0x0a, 0x62, 0xee, 0x1b, - 0x8a, 0xd3, 0xd2, 0x5f, - 0xf5, 0xfe, 0x2a, 0xf5, 0xcf, 0x8e, 0xeb, 0xdd, 0xd7, 0xb9, 0x9c, 0xa2, - 0x46, 0xfb, 0xb3, 0xfd, - 0x9f, 0x35, 0x7e, 0xb9, 0xff, 0x4b, 0xc6, 0x2f, 0xb1, 0xeb, 0x17, 0xfb, - 0xbf, 0x68, 0xb2, 0xcb, - 0xf8, 0x85, 0xfe, 0x2f, 0x98, 0xbf, 0xd0, 0xff, 0x79, 0xe3, 0xe7, 0xd9, - 0xf5, 0x73, 0xfd, 0x9f, - 0x33, 0x7f, 0xae, 0xff, 0x19, 0xe3, 0x33, 0xfd, 0xcf, 0x98, 0x9f, 0xe9, - 0x3f, 0x67, 0xfc, 0x46, - 0xef, 0x3f, 0x19, 0xff, 0xc9, 0xe4, 0x97, 0xca, 0x30, 0x5f, 0x77, 0x3f, - 0x7e, 0x16, 0xf6, 0x32, - 0x5f, 0x84, 0xf7, 0x66, 0x3e, 0xc0, 0x7b, 0xb8, 0x5f, 0x6b, 0x7b, 0x95, - 0x9f, 0x75, 0x95, 0x7b, - 0x79, 0x58, 0xef, 0x33, 0xca, 0xbd, 0xdc, 0xff, 0xf7, 0xdf, 0xfb, 0x1d, - 0xf3, 0x67, 0xfb, 0xbf, - 0x0c, 0xfb, 0xd7, 0xfc, 0x25, 0xb6, 0x77, 0x7f, 0x91, 0x5f, 0xbf, 0x00, - 0x7b, 0x18, 0xf6, 0xaf, - 0xf9, 0xf3, 0xfd, 0x9f, 0x83, 0x3d, 0x6c, 0x7c, 0x66, 0x00, 0xfb, 0xf7, - 0x33, 0xc6, 0x73, 0xec, - 0xdf, 0x36, 0x06, 0x22, 0xae, 0x97, 0x95, 0xf1, 0x5c, 0x6c, 0x0e, 0xfe, - 0x71, 0xf9, 0xb0, 0x7a, - 0xa2, 0xd7, 0x42, 0xe3, 0x7f, 0xc0, 0x5f, 0xc6, 0x70, 0x5a, 0x06, 0xe9, - 0x6e, 0x6e, 0xa9, 0x66, - 0x3e, 0x3b, 0x71, 0x3d, 0x2c, 0xd3, 0xea, 0x14, 0xd7, 0xfb, 0x26, 0x8b, - 0x75, 0xfe, 0xfa, 0xd1, - 0x0b, 0xc6, 0xaf, 0x1d, 0xfd, 0x9a, 0xc9, 0xaf, 0xfe, 0xaf, 0x1a, 0xbf, - 0xca, 0xaf, 0x5f, 0x31, - 0x7e, 0x85, 0x5d, 0x9f, 0x3b, 0xfa, 0x9c, 0xf9, 0xb9, 0xfe, 0xe7, 0x8c, - 0xcf, 0xf6, 0x3f, 0xcb, - 0xaf, 0x17, 0x98, 0x56, 0x7e, 0x76, 0x5e, 0x69, 0x60, 0xea, 0x86, 0xe2, - 0x65, 0xd7, 0x54, 0x02, - 0xd9, 0x35, 0x7e, 0x3d, 0x17, 0xb5, 0x4a, 0x5a, 0x3b, 0x3d, 0xd4, 0xe5, - 0xf3, 0x4d, 0x4e, 0x4a, - 0x35, 0xe8, 0xfb, 0xb1, 0x38, 0x3d, 0xdd, 0xd0, 0x98, 0x06, 0xb6, 0xef, - 0x07, 0xc3, 0xa8, 0x38, - 0xbf, 0x12, 0xa3, 0xc2, 0x48, 0xb1, 0x67, 0x14, 0xd4, 0x39, 0x95, 0xdc, - 0x73, 0xab, 0xc0, 0x77, - 0x61, 0xf7, 0xc2, 0xe7, 0x56, 0x4d, 0xc5, 0xdc, 0x2a, 0x7f, 0x7f, 0x78, - 0x6a, 0x8a, 0xaf, 0xef, - 0xdf, 0x9e, 0x6e, 0xe0, 0x18, 0x93, 0xea, 0x3c, 0xe0, 0x5a, 0xcd, 0xaa, - 0xe7, 0x5e, 0xfa, 0x99, - 0x8e, 0x3e, 0x13, 0xbd, 0xf2, 0xd5, 0xbb, 0xbb, 0xeb, 0xf3, 0x08, 0x99, - 0x1f, 0xc6, 0xeb, 0x57, - 0xc1, 0x0f, 0x83, 0x9a, 0x55, 0xf6, 0xef, 0xda, 0x83, 0x9c, 0x4d, 0x6b, - 0xc7, 0xfb, 0x95, 0xaf, - 0x59, 0xe1, 0xf9, 0xce, 0xec, 0x24, 0xdf, 0x5a, 0xe7, 0x25, 0xdb, 0x7d, - 0xff, 0xb9, 0x06, 0x9c, - 0x8b, 0x36, 0x47, 0x5a, 0x38, 0xe7, 0x93, 0xef, 0x01, 0x75, 0x0c, 0x4b, - 0x3e, 0x83, 0xf2, 0xd7, - 0xcd, 0x17, 0x8e, 0x7e, 0x4d, 0xec, 0xe1, 0xfe, 0xaf, 0x59, 0xfb, 0xf7, - 0x57, 0xf9, 0xfe, 0xfd, - 0x95, 0xa3, 0xcf, 0x19, 0xb0, 0x7f, 0x3f, 0x67, 0xed, 0xdf, 0xcf, 0xf6, - 0x5f, 0x30, 0x7e, 0xf6, - 0xe8, 0xb3, 0xc6, 0x1a, 0xab, 0x3e, 0x88, 0xe7, 0x72, 0x57, 0x68, 0x61, - 0x95, 0xbd, 0x37, 0x87, - 0x4d, 0xe5, 0xe7, 0xb9, 0x44, 0xd9, 0x03, 0x43, 0x98, 0xfb, 0xa6, 0x66, - 0x3e, 0x47, 0xd3, 0x85, - 0xea, 0xb5, 0x6b, 0x18, 0xbf, 0xd0, 0xfb, 0xbc, 0xf9, 0xdb, 0x47, 0xbf, - 0x6d, 0xfc, 0xf6, 0xd1, - 0x6f, 0x99, 0xbf, 0xc5, 0xae, 0x2f, 0x1c, 0x7d, 0x81, 0x5d, 0xbf, 0x69, - 0xfe, 0x26, 0xbb, 0x7e, - 0xe3, 0xe8, 0x37, 0xac, 0xeb, 0xf3, 0xc6, 0xe7, 0x8f, 0x3e, 0x6f, 0x7e, - 0x9e, 0xad, 0xdf, 0xaf, - 0x2f, 0x2a, 0x8d, 0xf2, 0x52, 0x3f, 0x0c, 0xef, 0x37, 0x89, 0xa0, 0x0b, - 0x48, 0x76, 0x4d, 0x59, - 0x95, 0x0b, 0x0f, 0xea, 0x71, 0xb1, 0xf3, 0xe1, 0xcb, 0x92, 0x77, 0xbe, - 0xc9, 0xdd, 0xaa, 0xc5, - 0xe9, 0x11, 0x73, 0xe1, 0xdd, 0xf9, 0x70, 0x6f, 0x4c, 0x23, 0x26, 0x5d, - 0x98, 0x85, 0xea, 0x82, - 0x3b, 0xe7, 0x75, 0x20, 0xf7, 0x23, 0xd8, 0x79, 0x7d, 0xc4, 0x74, 0x7d, - 0x51, 0xe2, 0xbe, 0xcb, - 0x8a, 0x39, 0xe4, 0xee, 0x0f, 0xcf, 0xb6, 0xec, 0xfe, 0x70, 0xae, 0x0b, - 0x27, 0x68, 0x5d, 0x68, - 0xc5, 0x51, 0xdf, 0x8f, 0xcb, 0x03, 0x6e, 0x88, 0xd7, 0x9c, 0x66, 0x9b, - 0xa0, 0xeb, 0x9e, 0x79, - 0x84, 0x96, 0x1f, 0xb6, 0x0d, 0x7e, 0xd8, 0xac, 0xd0, 0x80, 0x3d, 0x90, - 0xea, 0x85, 0xaf, 0x6d, - 0xac, 0xb3, 0x69, 0x23, 0xc4, 0xfb, 0xab, 0xab, 0x67, 0xa3, 0xd0, 0xf5, - 0x69, 0xa1, 0x59, 0x3c, - 0xdd, 0xae, 0x79, 0xe6, 0x4c, 0xb2, 0xbf, 0xef, 0x58, 0xf1, 0xb5, 0x6c, - 0x40, 0x7c, 0x2d, 0x4a, - 0x0c, 0x8b, 0xef, 0x81, 0x79, 0xd0, 0x1e, 0xf8, 0x82, 0xf9, 0x79, 0xbe, - 0x7f, 0x7f, 0x9b, 0xef, - 0xdf, 0xdf, 0xe2, 0xfb, 0xf7, 0x0b, 0x7c, 0xff, 0xfe, 0xa6, 0xb3, 0x7f, - 0x7f, 0x43, 0xec, 0x5f, - 0xb6, 0x8f, 0x5f, 0x38, 0xfa, 0x75, 0x23, 0x2c, 0xae, 0xb7, 0xc6, 0xc1, - 0xbf, 0x1b, 0x32, 0x3f, - 0x18, 0xf6, 0x0c, 0x72, 0x0f, 0x68, 0x63, 0xbd, 0x0d, 0xcc, 0x2b, 0xe7, - 0xff, 0x87, 0x7c, 0x96, - 0xb0, 0xac, 0xfa, 0x7c, 0x84, 0xb9, 0x9c, 0x32, 0xce, 0xd7, 0xef, 0xf6, - 0xbe, 0x68, 0xfc, 0x7e, - 0xef, 0xf7, 0xcc, 0xdf, 0x13, 0x97, 0xf1, 0xe5, 0xde, 0x97, 0x8d, 0x2f, - 0xf5, 0xbe, 0x64, 0xb2, - 0x8b, 0xfd, 0xf9, 0x45, 0xe3, 0x8b, 0xbd, 0xdf, 0x35, 0x7f, 0xf7, 0x88, - 0x5f, 0xc6, 0xef, 0xb0, - 0x35, 0xfc, 0xad, 0xe5, 0x6e, 0x1d, 0x72, 0xce, 0xa1, 0xfd, 0x26, 0xd1, - 0x74, 0x41, 0xcd, 0xae, - 0x39, 0x0f, 0x66, 0xd7, 0x78, 0xb5, 0x28, 0x9c, 0xe7, 0xc3, 0x7e, 0xaf, - 0x5d, 0xfe, 0xbc, 0x3e, - 0xab, 0xac, 0xd8, 0x12, 0x4e, 0x3e, 0x9c, 0xfd, 0x5e, 0x3d, 0xfc, 0x45, - 0xab, 0xef, 0x47, 0x95, - 0x7f, 0x1a, 0x08, 0x5d, 0x48, 0xa1, 0x74, 0xe1, 0xea, 0x8c, 0x0a, 0x5f, - 0xce, 0x8b, 0x73, 0x3b, - 0xe0, 0x79, 0x0d, 0xba, 0xee, 0xe6, 0xaf, 0xb9, 0xe6, 0xd6, 0x1c, 0x42, - 0xce, 0xab, 0x72, 0xcc, - 0xb5, 0xc8, 0x50, 0xe9, 0x82, 0xf2, 0x9c, 0x8e, 0x9d, 0xc3, 0x8a, 0xa9, - 0x59, 0xf5, 0xc7, 0xb6, - 0x7b, 0xb6, 0xae, 0xc3, 0x3c, 0x32, 0x5f, 0xcd, 0x16, 0xcc, 0x66, 0x64, - 0x7e, 0x58, 0x7e, 0x35, - 0x8f, 0xac, 0x7b, 0x9d, 0x3d, 0x10, 0x53, 0x1d, 0xaf, 0x21, 0x9f, 0xb7, - 0xa8, 0x39, 0xe7, 0x75, - 0xd0, 0xf5, 0xdd, 0x20, 0x5d, 0xb7, 0xe3, 0x6b, 0x96, 0xae, 0x6b, 0x7c, - 0x0f, 0x14, 0xb0, 0x7b, - 0x20, 0xe0, 0x79, 0xfc, 0xbb, 0xe6, 0x17, 0x7b, 0xbf, 0x6f, 0xfc, 0x9e, - 0xb3, 0x87, 0xbf, 0x6c, - 0x7c, 0xf9, 0xe8, 0x4b, 0x62, 0x0f, 0xb3, 0x3f, 0xbf, 0xd8, 0xfb, 0xa2, - 0xbd, 0x7f, 0xd9, 0xf5, - 0x3b, 0xc6, 0xe7, 0x7b, 0x5f, 0xc0, 0xf5, 0xbe, 0xf5, 0xc4, 0x1e, 0xd8, - 0x3a, 0x2e, 0x1c, 0xca, - 0xe6, 0x07, 0xf3, 0xbc, 0x09, 0xfb, 0x1c, 0x62, 0xf6, 0x40, 0x7a, 0xa2, - 0xf3, 0xb9, 0x6f, 0xce, - 0x73, 0x0b, 0x18, 0x08, 0x43, 0xb6, 0x0e, 0x01, 0xe7, 0x28, 0x6c, 0x5c, - 0xaf, 0x18, 0xc3, 0x5c, - 0xce, 0x3f, 0xe8, 0xfd, 0x91, 0xf1, 0x27, 0xbd, 0x3f, 0x31, 0xbe, 0xd2, - 0xfb, 0x8a, 0xf9, 0x95, - 0xde, 0x1f, 0xc3, 0x65, 0xfc, 0x31, 0xfb, 0xb7, 0x3f, 0xb2, 0xae, 0x3f, - 0xec, 0xfd, 0xa1, 0xc9, - 0x2e, 0xe3, 0x0f, 0x8f, 0x7e, 0xdf, 0xf8, 0x83, 0xa3, 0x2f, 0x1a, 0x5f, - 0x02, 0xfd, 0x0b, 0x99, - 0x1f, 0xcc, 0x7f, 0xaf, 0xdc, 0x7f, 0x57, 0x9f, 0x17, 0xd2, 0xcb, 0x4a, - 0x3d, 0x6e, 0x5d, 0x50, - 0xd5, 0x2a, 0xf1, 0xd7, 0x64, 0xbf, 0x7b, 0x67, 0x2e, 0xfc, 0x9d, 0x20, - 0x3f, 0x4c, 0x6f, 0xc0, - 0x6b, 0x16, 0x46, 0xbc, 0x57, 0x27, 0xc4, 0x77, 0x89, 0x53, 0x17, 0x52, - 0x11, 0x72, 0x5e, 0x2b, - 0x6e, 0x87, 0xad, 0xeb, 0x50, 0xe7, 0x54, 0xbe, 0xbd, 0xf2, 0xc3, 0xa0, - 0x1f, 0xbd, 0x7a, 0xb1, - 0xb5, 0x5f, 0x5c, 0xe4, 0xeb, 0xfa, 0xd0, 0xc5, 0xd5, 0xbd, 0x8f, 0xf5, - 0xfd, 0x85, 0x53, 0xc4, - 0x1c, 0x56, 0xeb, 0xd9, 0x18, 0xf8, 0x3c, 0x86, 0xf3, 0xba, 0xd0, 0xf5, - 0xc3, 0x6d, 0x99, 0xae, - 0x8f, 0xc4, 0x79, 0xdd, 0xbe, 0x97, 0x62, 0x8c, 0xb3, 0x69, 0x45, 0x1d, - 0x6f, 0x2e, 0x9e, 0x78, - 0x3f, 0x3f, 0x33, 0x57, 0xde, 0x12, 0x16, 0x5f, 0x03, 0x5d, 0xcf, 0x60, - 0xce, 0xe9, 0xa1, 0x31, - 0xac, 0x3f, 0x60, 0xfb, 0xf4, 0x4f, 0xd8, 0x1e, 0xfe, 0x0a, 0xdf, 0xc3, - 0x7f, 0xcc, 0xfe, 0xfc, - 0xe3, 0xa3, 0x3f, 0x86, 0xbd, 0x6b, 0xfe, 0xd1, 0x11, 0xec, 0xe1, 0x3f, - 0x74, 0xf6, 0xf0, 0xef, - 0x1f, 0xfd, 0x01, 0xd7, 0xc3, 0x48, 0x73, 0xd5, 0xf8, 0xb3, 0x51, 0x3e, - 0x3f, 0xb8, 0xc2, 0x7e, - 0x2f, 0xb0, 0xef, 0xac, 0x38, 0x8c, 0x34, 0xa6, 0x94, 0x99, 0xe5, 0x5a, - 0xb9, 0xa9, 0xe6, 0xbc, - 0x7f, 0xce, 0x41, 0xb0, 0xd8, 0xcf, 0xd9, 0x69, 0xba, 0x2d, 0xea, 0x92, - 0x05, 0x3b, 0x5a, 0xf8, - 0x2e, 0xd9, 0xc3, 0xab, 0xaf, 0x89, 0x57, 0x17, 0xc2, 0x6a, 0x18, 0xbf, - 0x62, 0xfe, 0xa9, 0xf1, - 0xf5, 0xde, 0x9f, 0x1b, 0x7f, 0xde, 0xfb, 0x3a, 0xfb, 0xf3, 0xcf, 0x4c, - 0x76, 0x19, 0x7f, 0xd6, - 0xfb, 0x53, 0xe3, 0x4f, 0xd9, 0x9f, 0x7f, 0xca, 0xfe, 0xfc, 0x5a, 0xef, - 0x6b, 0xe6, 0xd7, 0x7a, - 0x5f, 0x35, 0xbe, 0xda, 0xfb, 0xaa, 0xf9, 0x55, 0xa6, 0x87, 0x7f, 0xc0, - 0xf4, 0xaf, 0x38, 0x53, - 0xf4, 0x9b, 0x80, 0xef, 0xc2, 0xf6, 0x9e, 0xa6, 0xf0, 0x5d, 0xb0, 0xe7, - 0x05, 0xee, 0xbb, 0xa8, - 0x75, 0x01, 0xcf, 0xf3, 0x99, 0x6b, 0x2b, 0xdf, 0x65, 0x90, 0xed, 0xac, - 0xc5, 0xd7, 0xe0, 0x5e, - 0xd8, 0xdf, 0xb7, 0x4f, 0x8b, 0xd2, 0xf8, 0xda, 0x4a, 0x17, 0x8a, 0x08, - 0x5d, 0xa8, 0xaa, 0x6b, - 0xd9, 0x91, 0x3c, 0xde, 0xb0, 0x67, 0xa3, 0xe6, 0xf2, 0xc3, 0x56, 0x31, - 0x29, 0x49, 0x7c, 0x4d, - 0xf8, 0x2e, 0x11, 0x74, 0x41, 0x3d, 0x87, 0xb5, 0x18, 0xe3, 0xbc, 0x86, - 0x0c, 0xc4, 0xb6, 0x99, - 0x0f, 0xb4, 0x79, 0xe2, 0xd5, 0x75, 0xc7, 0x0f, 0x5b, 0xe4, 0x1b, 0x3a, - 0xf3, 0xc3, 0x90, 0x75, - 0xbc, 0xed, 0xd8, 0xea, 0x78, 0xed, 0xd8, 0x36, 0xbe, 0x36, 0xcd, 0xa3, - 0xeb, 0xfe, 0xf3, 0xfa, - 0xce, 0x45, 0x65, 0xaf, 0x7a, 0x56, 0x3c, 0x90, 0xc6, 0xd7, 0xac, 0x67, - 0xa3, 0xdc, 0x7f, 0xff, - 0x0a, 0xdb, 0xa7, 0x5f, 0x37, 0xff, 0x9c, 0xed, 0xe1, 0xaf, 0xb3, 0x3f, - 0xff, 0x8c, 0xed, 0xe3, - 0x3f, 0x13, 0x7b, 0xd7, 0x14, 0xfb, 0xf8, 0x6b, 0xb0, 0x87, 0xad, 0xfd, - 0xfb, 0x55, 0xa6, 0x87, - 0xbf, 0x1f, 0x8d, 0x69, 0xe5, 0xdf, 0x77, 0x3e, 0x0e, 0x7e, 0xf5, 0xae, - 0x97, 0x83, 0xbf, 0x62, - 0x53, 0x79, 0x39, 0xf8, 0xfa, 0x82, 0x69, 0xdd, 0x78, 0xf5, 0xb3, 0x80, - 0x81, 0x00, 0xf5, 0x80, - 0x5c, 0x07, 0x4f, 0x72, 0x4d, 0x4f, 0x5d, 0x32, 0xc6, 0x77, 0x41, 0xf2, - 0xfb, 0x79, 0xac, 0x33, - 0x44, 0x17, 0xbe, 0x6a, 0xfe, 0x85, 0xf9, 0x97, 0xbd, 0xbf, 0x34, 0xfe, - 0xd2, 0xfc, 0x0b, 0xe3, - 0x2f, 0xe0, 0xea, 0xfd, 0x85, 0xf1, 0x1f, 0x7b, 0xff, 0x51, 0x5c, 0xe6, - 0x37, 0x8c, 0x6f, 0xf4, - 0xe0, 0xba, 0x67, 0xdc, 0x63, 0xd7, 0x9f, 0x33, 0x7d, 0xfc, 0x93, 0xc5, - 0x6e, 0xdd, 0x59, 0x93, - 0x2b, 0xf4, 0x9b, 0x78, 0x7d, 0x97, 0xdd, 0x5a, 0x5c, 0xba, 0xa0, 0x45, - 0xe0, 0xf9, 0x6c, 0x07, - 0x9e, 0x17, 0xe0, 0x19, 0x67, 0xe5, 0x4d, 0xce, 0x77, 0x82, 0x75, 0xdd, - 0x15, 0x5f, 0x43, 0xc4, - 0xfb, 0x23, 0xea, 0x82, 0x88, 0xf7, 0xa7, 0xae, 0xc9, 0xe3, 0xb5, 0xf7, - 0x28, 0x3c, 0x1b, 0xe1, - 0xb3, 0x58, 0x0a, 0x8a, 0xaf, 0xd9, 0x79, 0x13, 0xee, 0xbb, 0xc4, 0xa5, - 0x0b, 0x5a, 0x84, 0x39, - 0xac, 0xc8, 0x78, 0xff, 0x32, 0x75, 0xb8, 0x16, 0x5f, 0xbb, 0xe3, 0xf5, - 0xc3, 0x60, 0x0f, 0x94, - 0xe6, 0x7a, 0xdd, 0xa5, 0xeb, 0xc1, 0x7b, 0x00, 0x5d, 0xc7, 0x9b, 0xba, - 0xaf, 0xf3, 0x16, 0x21, - 0xbe, 0x96, 0x0d, 0x8b, 0xaf, 0x2d, 0x7c, 0xf1, 0x35, 0xe5, 0x1e, 0xe0, - 0x3b, 0xd8, 0x80, 0x3d, - 0xcc, 0xf6, 0xaf, 0x09, 0xfb, 0xf7, 0x2f, 0xec, 0xfd, 0xcb, 0xae, 0x6f, - 0x58, 0x7b, 0xf8, 0x1e, - 0xdf, 0xc3, 0x7f, 0xce, 0xb4, 0xf1, 0x2b, 0xf1, 0xe5, 0xbc, 0x98, 0x06, - 0xe9, 0xcb, 0x9d, 0xc3, - 0xdd, 0xdb, 0xdb, 0x7b, 0x61, 0xf3, 0x83, 0xa1, 0xdf, 0x04, 0xce, 0x7a, - 0x59, 0x7f, 0xef, 0xdb, - 0x91, 0x66, 0x00, 0xfb, 0x39, 0x33, 0xcb, 0xb6, 0xdc, 0xbf, 0xd7, 0x0a, - 0xd7, 0xd2, 0xad, 0x7d, - 0x69, 0x7c, 0x2d, 0xca, 0x79, 0x41, 0xe1, 0xbb, 0x7c, 0xdd, 0xfc, 0x1b, - 0xe3, 0x6f, 0xcd, 0xbf, - 0x35, 0xfe, 0x86, 0xfd, 0x69, 0x5f, 0x7f, 0x6d, 0xfe, 0xb5, 0x73, 0x89, - 0x9c, 0xfb, 0x5f, 0x19, - 0x7f, 0x05, 0x17, 0x5b, 0xdb, 0xaf, 0x31, 0xfd, 0xcb, 0xc8, 0xfa, 0x4d, - 0x26, 0xea, 0x7e, 0x13, - 0xf7, 0xbd, 0x58, 0xba, 0xd0, 0x54, 0xea, 0x82, 0x84, 0x5d, 0x73, 0x8d, - 0x3c, 0x60, 0x4b, 0x7d, - 0x66, 0x2e, 0xef, 0x6d, 0x2e, 0x8b, 0xec, 0x5e, 0x2a, 0x7b, 0x5e, 0xfe, - 0xa2, 0xf0, 0xc3, 0x20, - 0x6f, 0xc2, 0xcf, 0x28, 0xc8, 0x73, 0x3a, 0xce, 0x7f, 0xdf, 0x56, 0x6a, - 0x11, 0x36, 0xde, 0xbf, - 0xed, 0x9c, 0x99, 0x9d, 0xf8, 0x5a, 0xc3, 0x1d, 0x5f, 0x5b, 0xf9, 0x2e, - 0xdb, 0x7b, 0x7e, 0x5d, - 0x0f, 0x8c, 0xf7, 0x47, 0x8d, 0xeb, 0x85, 0xe7, 0xbc, 0xd4, 0xf1, 0xfe, - 0x93, 0xa0, 0x78, 0xbf, - 0x37, 0xbe, 0xe6, 0xe4, 0x81, 0xdc, 0xf1, 0xb5, 0xa9, 0x37, 0xbe, 0x16, - 0x7b, 0x1d, 0x6f, 0x7c, - 0xb1, 0x6d, 0xee, 0x7b, 0xc0, 0xf9, 0x75, 0x87, 0xed, 0x0f, 0x7f, 0x7c, - 0xcd, 0x93, 0x37, 0x61, - 0xcf, 0x65, 0xb8, 0xd7, 0xe0, 0x78, 0xd2, 0xd7, 0xd9, 0x9e, 0xfd, 0x5b, - 0xb6, 0x87, 0xff, 0xc6, - 0xb5, 0x87, 0xff, 0xda, 0xb5, 0x87, 0x45, 0xdd, 0x0c, 0xdb, 0xbf, 0xe6, - 0x5f, 0xf5, 0xfe, 0x8a, - 0x69, 0xe3, 0xd7, 0x6c, 0xa6, 0x55, 0x0b, 0x13, 0xdb, 0x56, 0x72, 0xaa, - 0x16, 0xe5, 0x06, 0xec, - 0x01, 0xf9, 0xfc, 0x60, 0xe1, 0x7b, 0x14, 0x4e, 0xa0, 0xc6, 0x5a, 0xeb, - 0x58, 0x3f, 0xcf, 0x58, - 0x5f, 0x0b, 0xab, 0x2e, 0x99, 0xcf, 0xdc, 0x54, 0xf0, 0x5c, 0x1c, 0x5d, - 0xa8, 0x5c, 0x9b, 0xdf, - 0xff, 0x0d, 0xf3, 0xef, 0x8d, 0xbf, 0x17, 0x17, 0xb3, 0xff, 0x62, 0xfc, - 0x17, 0xe7, 0xfa, 0xcf, - 0xc6, 0x7f, 0xe6, 0xd7, 0xdf, 0xd9, 0x66, 0xfc, 0x1d, 0x5b, 0xdb, 0xaf, - 0xcf, 0xcb, 0x0d, 0x95, - 0xef, 0xc2, 0xf7, 0x28, 0x7b, 0xf6, 0x49, 0xe3, 0x6b, 0x56, 0x0e, 0x29, - 0x4a, 0x5c, 0x6f, 0x23, - 0x26, 0x5d, 0xd8, 0x89, 0x56, 0x97, 0xe3, 0x8b, 0xaf, 0x79, 0x75, 0x1d, - 0xce, 0xbc, 0x95, 0xd3, - 0xcd, 0x83, 0xec, 0x48, 0x12, 0x5f, 0xbb, 0x0f, 0xb5, 0xec, 0x79, 0x94, - 0xef, 0x92, 0xf1, 0xf1, - 0x78, 0xdd, 0xf9, 0x70, 0x57, 0xde, 0xe4, 0xee, 0x7a, 0x7c, 0x2d, 0x28, - 0x1f, 0x2e, 0x8f, 0xf7, - 0x87, 0xf4, 0xa2, 0x87, 0xea, 0xc2, 0x55, 0x6b, 0x56, 0xbd, 0xcf, 0x95, - 0xf4, 0xa4, 0xd0, 0x02, - 0x5d, 0x08, 0x8b, 0xaf, 0x81, 0x1f, 0x96, 0xe6, 0xfe, 0xbb, 0x8e, 0x65, - 0xdd, 0x21, 0x7a, 0x4e, - 0x11, 0x39, 0x2f, 0x54, 0xfe, 0x7d, 0xc3, 0x7a, 0x36, 0x6a, 0x2d, 0x47, - 0xd7, 0xfd, 0xf1, 0x35, - 0x51, 0x97, 0x7c, 0x08, 0x75, 0x28, 0xd9, 0xc0, 0x67, 0xd4, 0x37, 0xcc, - 0xbf, 0x77, 0xed, 0xe1, - 0xd5, 0xfe, 0x65, 0x3b, 0xd8, 0xda, 0xc3, 0xab, 0xfd, 0xfb, 0x77, 0x4c, - 0x1b, 0xbf, 0x8e, 0xcc, - 0x79, 0x6d, 0x5e, 0x35, 0xb6, 0xed, 0xd1, 0x32, 0xfb, 0x5e, 0x38, 0xff, - 0x79, 0xa9, 0x37, 0xf5, - 0x39, 0xfb, 0x9d, 0x8c, 0x52, 0x9d, 0xb0, 0xe7, 0xa8, 0xed, 0xbb, 0xac, - 0xcf, 0xdc, 0x74, 0x71, - 0xf0, 0xc7, 0xf9, 0x16, 0x4a, 0x17, 0xb8, 0xef, 0x22, 0xd7, 0x85, 0xe0, - 0xaa, 0xf2, 0xff, 0x6a, - 0xfc, 0x57, 0x71, 0x71, 0xfb, 0x07, 0xf3, 0x1f, 0x0c, 0xeb, 0x32, 0xff, - 0x81, 0x3d, 0xbf, 0x31, - 0x75, 0x39, 0x16, 0x93, 0xda, 0xe2, 0x74, 0x15, 0xbc, 0xf1, 0x35, 0x6b, - 0xbe, 0x09, 0xfc, 0x1e, - 0xc4, 0x7c, 0x93, 0x94, 0x74, 0xbe, 0x89, 0x3f, 0xde, 0x1f, 0xda, 0xe3, - 0xb2, 0x50, 0xe5, 0x01, - 0xaf, 0x17, 0xef, 0xd7, 0xfc, 0x7e, 0xd8, 0x5d, 0xbf, 0xae, 0xfb, 0xe2, - 0x6b, 0xaa, 0x78, 0x7f, - 0x6c, 0xb5, 0xec, 0xd1, 0xe3, 0xfd, 0xa0, 0xeb, 0x50, 0xdf, 0x0a, 0xbe, - 0x8b, 0x24, 0xbe, 0x66, - 0xe5, 0x4d, 0x52, 0xdd, 0x22, 0x56, 0x17, 0x62, 0xae, 0x59, 0x55, 0x3e, - 0x1b, 0xd9, 0x6b, 0xf2, - 0x9c, 0xd7, 0x91, 0x3c, 0xbe, 0x06, 0xba, 0x5e, 0x3c, 0x2d, 0xd7, 0xaa, - 0x27, 0xf9, 0x5a, 0x68, - 0xcd, 0x56, 0xcc, 0x35, 0xab, 0x5c, 0x17, 0x8e, 0xd5, 0x39, 0xaf, 0xb5, - 0xd8, 0x36, 0xc4, 0xd7, - 0x86, 0xeb, 0x75, 0xc9, 0xf6, 0x9e, 0xf1, 0xe5, 0xc3, 0x0d, 0xe9, 0x0e, - 0xf6, 0xec, 0x61, 0x67, - 0xff, 0xf2, 0x0b, 0x55, 0x9b, 0x86, 0x8c, 0x6d, 0x87, 0x73, 0x5a, 0x56, - 0x33, 0x3d, 0x8a, 0xa7, - 0x4c, 0xff, 0x4e, 0x56, 0xf1, 0x3e, 0xd5, 0x19, 0x85, 0x9f, 0x17, 0xdc, - 0xf1, 0xb5, 0x35, 0x0e, - 0x3e, 0xf8, 0x2e, 0x5b, 0xfb, 0x61, 0xf1, 0x35, 0x27, 0xde, 0x1f, 0x72, - 0x5e, 0x78, 0xc6, 0x7c, - 0x96, 0xd9, 0x07, 0x8c, 0x0f, 0x8f, 0x3e, 0xd2, 0xfa, 0x40, 0xef, 0x59, - 0xe3, 0x59, 0x33, 0xc4, - 0x8e, 0x3e, 0xd4, 0x79, 0xdf, 0xac, 0xd8, 0xb8, 0x42, 0x1d, 0xaf, 0x67, - 0x2d, 0xa4, 0x79, 0x93, - 0x49, 0x76, 0x6d, 0xbe, 0x49, 0xcc, 0x9c, 0x6e, 0xae, 0x0b, 0x99, 0xeb, - 0xc7, 0xfb, 0xb9, 0x1f, - 0x06, 0x7b, 0x74, 0xe7, 0x62, 0x67, 0xdf, 0xf3, 0xbc, 0xbe, 0x5d, 0xf6, - 0xd6, 0x25, 0x0f, 0x73, - 0x6d, 0x5e, 0xc7, 0x6b, 0xc6, 0x50, 0xc7, 0x8b, 0xce, 0x79, 0xe1, 0xb8, - 0x1d, 0x29, 0xa8, 0xe3, - 0x05, 0xdf, 0x45, 0x1a, 0x5f, 0xab, 0xf0, 0xfa, 0x35, 0xae, 0x45, 0x93, - 0x54, 0xd3, 0xa3, 0xeb, - 0x57, 0xaf, 0x59, 0x65, 0xba, 0x90, 0xc1, 0xe9, 0xc2, 0x15, 0x62, 0xdb, - 0x56, 0x7c, 0x4d, 0xd4, - 0x25, 0xdb, 0xba, 0x6e, 0xcd, 0x66, 0x94, 0xc6, 0xd7, 0x1e, 0xa6, 0x9a, - 0x55, 0xdf, 0x3a, 0x80, - 0xae, 0x6f, 0x9e, 0xec, 0xd4, 0x9c, 0x9a, 0xad, 0xa7, 0x7c, 0xf1, 0xb5, - 0xc1, 0xbb, 0xdb, 0x6c, - 0x67, 0xc2, 0xbe, 0x35, 0x3e, 0x38, 0xfc, 0x48, 0xfb, 0x43, 0x47, 0xcf, - 0x76, 0x43, 0xf7, 0x70, - 0xef, 0xdd, 0x46, 0x15, 0x57, 0xcb, 0x5e, 0x47, 0xd6, 0xac, 0x22, 0x7a, - 0xdf, 0xf4, 0x4e, 0x89, - 0xe9, 0x1f, 0xcc, 0x3a, 0x4f, 0x4f, 0x32, 0x6d, 0xc8, 0x85, 0x44, 0x5d, - 0x93, 0x35, 0x9e, 0xcb, - 0x5d, 0x75, 0x7c, 0x0d, 0x0c, 0x1b, 0xeb, 0xac, 0x5e, 0xbf, 0xbe, 0x1f, - 0x1f, 0xef, 0x07, 0x5d, - 0x9f, 0x6c, 0x36, 0x79, 0xfe, 0x2b, 0x30, 0xbe, 0xb6, 0xaa, 0x4b, 0x8e, - 0x54, 0xc7, 0x1b, 0xa8, - 0x0b, 0x65, 0xf3, 0x51, 0x54, 0x1d, 0xef, 0x63, 0x57, 0xaa, 0xe3, 0x2d, - 0x30, 0xdf, 0x65, 0xd5, - 0x6f, 0xc2, 0x9e, 0x51, 0x01, 0xba, 0x0e, 0xba, 0x10, 0x56, 0x1b, 0x10, - 0x6f, 0x1d, 0x2f, 0xbb, - 0x5f, 0x45, 0xce, 0x0b, 0xbe, 0xc6, 0x60, 0xab, 0xf2, 0x7f, 0x2f, 0xab, - 0x87, 0xde, 0x67, 0xa3, - 0xa6, 0xe8, 0x37, 0xb1, 0xe2, 0x6b, 0xfd, 0xc7, 0x3b, 0xfe, 0xf3, 0xba, - 0x5c, 0x17, 0x5c, 0xeb, - 0x1f, 0x5a, 0xc7, 0x1b, 0xb4, 0x07, 0xca, 0xdd, 0x47, 0x43, 0xf5, 0xef, - 0x3b, 0x5a, 0xb2, 0x67, - 0xe3, 0x1b, 0xcd, 0xe7, 0x98, 0x7d, 0xc2, 0x80, 0x7e, 0x13, 0xf8, 0x3d, - 0x55, 0xfd, 0xf1, 0x35, - 0x57, 0x3e, 0x9c, 0xd7, 0x25, 0x5b, 0xe7, 0xf4, 0x74, 0x7c, 0x7b, 0x40, - 0x5d, 0xb3, 0x8a, 0x8c, - 0x61, 0x69, 0xf3, 0x32, 0x3f, 0x03, 0x84, 0xf7, 0x9b, 0xe4, 0x1b, 0xf0, - 0x9a, 0xc5, 0xb1, 0xa2, - 0xdf, 0x64, 0x18, 0xa5, 0x66, 0x35, 0x1b, 0x57, 0x6d, 0x5a, 0xab, 0x74, - 0xaa, 0x37, 0xdc, 0xdf, - 0x77, 0x9d, 0x78, 0x3f, 0x70, 0xf0, 0xf3, 0xdc, 0x77, 0xd9, 0xd9, 0x0b, - 0xac, 0x73, 0x70, 0xf2, - 0x26, 0xa9, 0x6e, 0x94, 0x3a, 0x5e, 0xed, 0x81, 0xae, 0x49, 0xbe, 0x03, - 0xb1, 0xf7, 0xca, 0xd1, - 0xcb, 0xbb, 0xaf, 0x18, 0xbd, 0xaa, 0xfd, 0x6d, 0xb3, 0xd7, 0x34, 0x5e, - 0x77, 0xf6, 0x2d, 0xec, - 0x5c, 0xf8, 0x92, 0xb7, 0x3c, 0x79, 0xf6, 0xe4, 0xc1, 0x13, 0xa7, 0x4f, - 0xd4, 0x5e, 0x77, 0xfc, - 0x7f, 0x1c, 0x6e, 0x9e, 0x56, 0x0e, 0x1e, 0x59, 0xbe, 0xaa, 0xfe, 0x78, - 0xef, 0xf1, 0xee, 0x63, - 0xe6, 0x63, 0x06, 0xbb, 0xd8, 0x8e, 0x82, 0xff, 0x5d, 0xed, 0x8c, 0xc7, - 0x7a, 0x8f, 0x1b, 0xff, - 0xe7, 0xf9, 0x4b, 0xf6, 0x5f, 0xdd, 0x7f, 0xac, 0xf3, 0x98, 0x69, 0x5b, - 0x99, 0xff, 0xb7, 0xd7, - 0x9b, 0x5f, 0x62, 0x7b, 0x1d, 0xfe, 0xf6, 0xa8, 0xf9, 0xd8, 0xf0, 0x35, - 0xed, 0x27, 0x8f, 0x5f, - 0x73, 0x08, 0x3f, 0x67, 0xc3, 0x7c, 0xc4, 0xf5, 0x33, 0xca, 0xec, 0xc9, - 0x78, 0x69, 0x8a, 0x7f, - 0x7b, 0xcc, 0x7c, 0xe5, 0xfc, 0x89, 0xc6, 0x13, 0xd3, 0x97, 0x37, 0xe1, - 0xef, 0x8f, 0x04, 0xbc, - 0xf7, 0x47, 0xe1, 0xa7, 0x07, 0xc4, 0xf5, 0x1e, 0x65, 0xef, 0xf1, 0x15, - 0xc3, 0x57, 0xb5, 0x5f, - 0x3d, 0x7d, 0x4d, 0xf3, 0xb5, 0xa7, 0xec, 0x5e, 0xb8, 0x0e, 0x3e, 0xba, - 0xf7, 0xe4, 0xe9, 0x13, - 0x07, 0xaf, 0x3b, 0x7e, 0xed, 0xe1, 0x6b, 0xe6, 0xff, 0xbc, 0x21, 0x74, - 0xbd, 0xd2, 0xb1, 0xef, - 0xc5, 0x7e, 0x0f, 0xa0, 0x0b, 0xaf, 0x9b, 0x3c, 0xde, 0x5a, 0xbd, 0xff, - 0x80, 0x57, 0x3e, 0xfa, - 0x47, 0xdd, 0xd7, 0x9d, 0x3e, 0x79, 0xf0, 0xca, 0xa3, 0xc7, 0xba, 0xf6, - 0x57, 0x3d, 0xca, 0x95, - 0xdb, 0xbe, 0x5b, 0xb8, 0xdf, 0x7b, 0xa6, 0xc9, 0x7c, 0x97, 0x27, 0x97, - 0xdf, 0x76, 0xb8, 0xfa, - 0x59, 0xab, 0xff, 0x2e, 0xcc, 0x10, 0x5e, 0xd2, 0x7c, 0xb7, 0xb1, 0x3d, - 0x7d, 0xb4, 0xe9, 0xfe, - 0x3a, 0x7b, 0x0d, 0x1e, 0x33, 0x1f, 0x37, 0x5e, 0x3e, 0x78, 0x25, 0xbb, - 0x97, 0x6f, 0x6d, 0x54, - 0x2f, 0x9e, 0xd8, 0x7f, 0xf2, 0x96, 0xf5, 0x39, 0xbb, 0xf5, 0xd2, 0xbd, - 0x2f, 0xf7, 0x3f, 0xd5, - 0xd9, 0x5a, 0x7e, 0xeb, 0xe1, 0xab, 0x47, 0xaf, 0x68, 0xbf, 0xfc, 0xe8, - 0xf1, 0xee, 0xe3, 0xec, - 0x5e, 0x1e, 0x9f, 0xfc, 0x4f, 0xcd, 0x97, 0x1c, 0xbf, 0xba, 0xe6, 0xfe, - 0x59, 0x8f, 0xf9, 0xd7, - 0x9f, 0x7d, 0xdd, 0xb7, 0x2f, 0x9f, 0x3c, 0x7c, 0xcd, 0xe8, 0xb1, 0xb6, - 0xff, 0xfe, 0x1e, 0x71, - 0x7f, 0x5f, 0xff, 0x95, 0x5d, 0xd8, 0x03, 0xff, 0x57, 0xef, 0x4b, 0x86, - 0xb1, 0xb6, 0xf2, 0x8f, - 0x38, 0x7f, 0x7f, 0xee, 0xe8, 0xf9, 0x0e, 0xc4, 0xb6, 0x3d, 0xdf, 0x6b, - 0xad, 0xc9, 0x1b, 0xd9, - 0x3a, 0xbc, 0xc0, 0x2e, 0xf8, 0x4a, 0x5e, 0xaf, 0x37, 0xcb, 0x36, 0x72, - 0xb3, 0xff, 0xb1, 0xf1, - 0x9a, 0xe5, 0x6b, 0xeb, 0x4f, 0xb0, 0xcf, 0x17, 0x7c, 0xc6, 0x9e, 0xbc, - 0xa8, 0xee, 0x55, 0x2e, - 0xfe, 0xe7, 0xfd, 0xef, 0x98, 0xbf, 0xa6, 0xfe, 0xea, 0xf1, 0xab, 0x5a, - 0x4f, 0x9c, 0xbc, 0xb6, - 0xf6, 0x72, 0x47, 0xd7, 0x1f, 0x0d, 0x5c, 0x3d, 0xd8, 0x03, 0x2f, 0x5b, - 0xbc, 0xb2, 0xfe, 0x88, - 0xb5, 0xee, 0xfe, 0x35, 0xe6, 0x9f, 0x4d, 0xf6, 0x79, 0xfc, 0x8e, 0x93, - 0x27, 0x6b, 0xdf, 0x36, - 0x78, 0xa4, 0xf3, 0xc8, 0xda, 0x57, 0x3d, 0x12, 0x3d, 0xe7, 0xe5, 0x65, - 0xd5, 0x4b, 0xfb, 0x4d, - 0x40, 0xbf, 0x77, 0x42, 0x78, 0x2e, 0x91, 0x6a, 0x56, 0x63, 0xcd, 0x79, - 0x95, 0x9a, 0xa5, 0x93, - 0x8c, 0xd2, 0x6f, 0x74, 0xaf, 0xc9, 0x86, 0x89, 0xe8, 0x41, 0x3c, 0xce, - 0x1e, 0x06, 0xc5, 0x1a, - 0x57, 0x79, 0x93, 0x62, 0x8d, 0x6b, 0xd1, 0x38, 0xd5, 0x0a, 0xad, 0xc5, - 0x7b, 0x91, 0xd6, 0x64, - 0xf7, 0xe2, 0xbf, 0x3d, 0x78, 0xc1, 0x15, 0xb3, 0x78, 0xe1, 0x68, 0xb7, - 0xfb, 0x8f, 0x07, 0x9f, - 0x6d, 0xbb, 0xe3, 0x18, 0xdf, 0xcd, 0x3e, 0xbb, 0x4f, 0x4e, 0x2e, 0x9b, - 0xee, 0x7f, 0x7b, 0xb6, - 0x77, 0x62, 0xc0, 0x9f, 0xaf, 0xe7, 0x3f, 0xe9, 0x69, 0xf6, 0xb7, 0x7b, - 0xc6, 0xbf, 0x61, 0x9f, - 0x67, 0x6f, 0x04, 0xe4, 0x59, 0xfe, 0x5f, 0x9f, 0x63, 0x7f, 0x33, 0xf8, - 0x7e, 0x70, 0xff, 0xb7, - 0x37, 0x5a, 0x1a, 0xf0, 0x9c, 0x73, 0xf6, 0xbb, 0xe4, 0xfa, 0x57, 0x36, - 0x5f, 0xf0, 0x7c, 0xdd, - 0x0b, 0x3e, 0xdd, 0x10, 0x9f, 0x6f, 0xf8, 0xb7, 0x47, 0x8f, 0xfe, 0xd7, - 0xb5, 0x78, 0xff, 0xa3, - 0x6c, 0xbf, 0xad, 0xbe, 0xf7, 0x9e, 0xf1, 0x4f, 0xc6, 0xf9, 0xd6, 0xb7, - 0x0e, 0xef, 0xb9, 0xee, - 0xe7, 0x1b, 0xc6, 0x4b, 0xd9, 0x19, 0xf1, 0x7f, 0x98, 0x7d, 0xae, 0xe1, - 0x7b, 0x37, 0x46, 0x71, - 0xd9, 0xaa, 0x87, 0xbf, 0xb2, 0xf0, 0x23, 0x9e, 0x19, 0x5c, 0x76, 0x5c, - 0xaf, 0xc1, 0xf7, 0x3a, - 0xfc, 0xcd, 0x3e, 0xbd, 0xc2, 0xfd, 0x9a, 0xb3, 0x9d, 0x86, 0x77, 0x2d, - 0x9e, 0x5e, 0x3b, 0xeb, - 0x1a, 0xa6, 0x61, 0x0c, 0x4f, 0x76, 0x6b, 0xff, 0xde, 0xf3, 0xf3, 0xde, - 0xb8, 0xd2, 0x46, 0xfb, - 0x15, 0xfa, 0xff, 0xaa, 0x5b, 0x9d, 0x5f, 0x36, 0x2e, 0x7b, 0x6f, 0x37, - 0x78, 0xde, 0xe4, 0x78, - 0x52, 0xbb, 0xec, 0x3f, 0xdf, 0xdd, 0x3d, 0x79, 0xfe, 0xd0, 0xfd, 0x75, - 0x9f, 0x9d, 0x7e, 0x53, - 0xf3, 0xc3, 0x7d, 0xf7, 0xcf, 0x12, 0x3f, 0xcd, 0x5e, 0xff, 0x47, 0x7d, - 0xf1, 0xa9, 0x17, 0x82, - 0x15, 0xd9, 0xb1, 0x26, 0xf3, 0xf9, 0xd8, 0xf7, 0xfa, 0xf4, 0xcf, 0xfe, - 0x69, 0xd6, 0x77, 0x1c, - 0xb1, 0xf7, 0x71, 0xfc, 0x8f, 0x0e, 0xbf, 0xe4, 0x7d, 0xc7, 0x7c, 0x4d, - 0xca, 0xec, 0xd3, 0xf1, - 0x28, 0xfc, 0xcd, 0x13, 0xd7, 0xf3, 0xbd, 0xca, 0xb0, 0xd1, 0xde, 0x3d, - 0x9b, 0x78, 0x3f, 0x37, - 0xfd, 0x5a, 0x07, 0xe2, 0x6b, 0x6f, 0xea, 0x5d, 0x1a, 0x41, 0xef, 0x16, - 0xe2, 0x7a, 0xcf, 0x1f, - 0x5d, 0x76, 0x8d, 0xb5, 0xd8, 0xf9, 0xd3, 0x6b, 0x9f, 0x9f, 0xcf, 0x9a, - 0x65, 0x23, 0xec, 0x13, - 0x25, 0x6a, 0x56, 0x8b, 0xd7, 0x98, 0x41, 0x29, 0x62, 0x4a, 0xb2, 0x3e, - 0x42, 0x3f, 0xcf, 0x25, - 0x52, 0x2d, 0xfb, 0x19, 0xbe, 0x66, 0x15, 0xc3, 0x69, 0x29, 0x2d, 0xd3, - 0x28, 0xfd, 0xbb, 0xfa, - 0x5c, 0x4e, 0xff, 0xfc, 0xe0, 0xd5, 0x2c, 0xf6, 0xb0, 0xf9, 0xc1, 0x91, - 0xfb, 0x7e, 0xb0, 0x4c, - 0x6a, 0x4c, 0xbc, 0x7f, 0xf9, 0xc1, 0x3a, 0x7c, 0x6e, 0xdc, 0xcf, 0xcf, - 0x67, 0xf9, 0x27, 0x89, - 0x9d, 0x27, 0xfa, 0xaf, 0xe8, 0xbc, 0xaa, 0x7f, 0xd9, 0xbd, 0x9c, 0xbe, - 0xac, 0xf9, 0xc4, 0xe4, - 0xb2, 0x75, 0x39, 0x79, 0xb2, 0xf9, 0xe4, 0xd9, 0x13, 0x07, 0xdf, 0x39, - 0xb9, 0xd7, 0xba, 0x1c, - 0xfc, 0xfb, 0xce, 0x3b, 0xd8, 0x67, 0xf0, 0x5e, 0xef, 0x7f, 0xe9, 0x32, - 0xf5, 0x33, 0xee, 0x31, - 0x2d, 0x82, 0x33, 0x8a, 0xd0, 0x01, 0xb0, 0xd7, 0x73, 0x25, 0x5a, 0xed, - 0x3f, 0xb1, 0xfb, 0x1e, - 0x9f, 0xbc, 0xae, 0xf9, 0xe4, 0xe2, 0xd5, 0xf5, 0x47, 0x9d, 0x1d, 0xe7, - 0xd7, 0x3f, 0xae, 0x6f, - 0xc6, 0x6b, 0x86, 0x97, 0x4c, 0xb3, 0xde, 0xbc, 0x76, 0x6a, 0x12, 0x5f, - 0xf9, 0x28, 0x68, 0x87, - 0x69, 0xf4, 0xff, 0x69, 0x07, 0xb4, 0xcc, 0xeb, 0x47, 0xac, 0x9e, 0xf6, - 0x4f, 0xf3, 0xcf, 0xfa, - 0x06, 0xbc, 0x0f, 0xa3, 0x35, 0x7b, 0x75, 0xe3, 0x95, 0xa3, 0x57, 0xb7, - 0x6a, 0x4c, 0x6b, 0xbe, - 0xb1, 0xd8, 0xad, 0x7f, 0x84, 0xe9, 0xc4, 0x33, 0x8b, 0x27, 0xea, 0x4f, - 0x9c, 0xbc, 0xae, 0xf6, - 0xda, 0x31, 0xbb, 0x37, 0xa6, 0x31, 0xff, 0x7a, 0x74, 0xd9, 0xbe, 0x67, - 0xbe, 0xde, 0x58, 0x9d, - 0x71, 0x25, 0xcf, 0xc6, 0xf3, 0xd7, 0xee, 0x3f, 0x6e, 0xbe, 0x60, 0x88, - 0x75, 0x7b, 0xc4, 0xc9, - 0x61, 0xb9, 0xf5, 0xaf, 0xc7, 0x9e, 0x8d, 0xf0, 0x6f, 0x6f, 0x76, 0x9d, - 0xc3, 0x02, 0xe3, 0xfd, - 0xe7, 0x2f, 0x73, 0xad, 0x99, 0x7d, 0x12, 0x35, 0xf8, 0x3b, 0x77, 0x4e, - 0x2b, 0x10, 0xd7, 0x03, - 0xfd, 0xe3, 0xab, 0x55, 0x36, 0xb5, 0x9e, 0xd9, 0xbd, 0xec, 0x7d, 0xc2, - 0x28, 0x4e, 0x3e, 0xd5, - 0xbc, 0x1c, 0x3c, 0xd3, 0x79, 0xd2, 0x3a, 0x4b, 0x3d, 0x72, 0xda, 0xac, - 0x5d, 0xf6, 0x3e, 0x67, - 0x7c, 0xfb, 0xe4, 0xd5, 0xcd, 0x57, 0x0e, 0x5e, 0xd1, 0x7e, 0xbc, 0xf7, - 0xcd, 0x3c, 0x0e, 0x23, - 0xd6, 0xbf, 0x6c, 0x82, 0x46, 0xbd, 0x99, 0x9d, 0x8b, 0x5e, 0xcb, 0xce, - 0x45, 0x70, 0x4e, 0xf7, - 0xbf, 0x1f, 0xf7, 0xab, 0xbe, 0x99, 0xad, 0xd9, 0x37, 0x46, 0xff, 0xba, - 0xe5, 0x56, 0x3b, 0x99, - 0xfe, 0x55, 0xe6, 0xcf, 0x36, 0xdc, 0x9f, 0xa1, 0xb5, 0x95, 0xf3, 0xc4, - 0xf5, 0x7c, 0xaf, 0xc2, - 0x9e, 0x51, 0xff, 0x72, 0x70, 0xd4, 0x81, 0xf7, 0xfd, 0xda, 0x93, 0x27, - 0x0e, 0x9f, 0x3c, 0x69, - 0xd5, 0xf8, 0x33, 0xea, 0xfc, 0xa5, 0x5c, 0x13, 0x5f, 0x33, 0x63, 0xf7, - 0x32, 0x7c, 0x45, 0xfb, - 0x6d, 0xec, 0xfd, 0x3c, 0x6b, 0x9d, 0x0d, 0xa0, 0xc7, 0xe5, 0x53, 0x2e, - 0xfd, 0xf3, 0xae, 0xb1, - 0xf5, 0xe9, 0x3d, 0x7a, 0x45, 0xf7, 0x09, 0x76, 0x4e, 0xff, 0x6f, 0xf8, - 0x1e, 0x10, 0xde, 0x8a, - 0xfd, 0xb5, 0xe5, 0xfb, 0x95, 0xf3, 0x62, 0x7e, 0x23, 0xd4, 0xcd, 0x6d, - 0x2e, 0x43, 0x78, 0x2e, - 0x90, 0x37, 0x79, 0x11, 0x6a, 0xd9, 0x21, 0xe7, 0x55, 0x5a, 0xa4, 0x9a, - 0x18, 0xfd, 0x8b, 0x25, - 0xde, 0xbf, 0xea, 0xfb, 0x3f, 0x74, 0xf7, 0xca, 0x07, 0xcd, 0x0f, 0x86, - 0xb3, 0xb7, 0xe0, 0x7c, - 0xc5, 0xd4, 0xf7, 0x83, 0x5d, 0x13, 0x88, 0xeb, 0x2d, 0x3e, 0x51, 0x0f, - 0xfb, 0x84, 0xf3, 0x4f, - 0x18, 0xd3, 0x3d, 0xae, 0x47, 0xa3, 0x62, 0x9b, 0xe7, 0x4d, 0x4e, 0x9e, - 0xa9, 0x5d, 0x8e, 0xbf, - 0xbb, 0xc5, 0xff, 0xb4, 0xce, 0x59, 0xff, 0xdb, 0x34, 0xdf, 0xac, 0x32, - 0x5d, 0xb0, 0x35, 0xcc, - 0x3e, 0x15, 0xae, 0xf4, 0x4f, 0x7c, 0xfe, 0x32, 0x93, 0x46, 0x73, 0x32, - 0xee, 0xb5, 0x0c, 0xfe, - 0x0a, 0xb0, 0x17, 0xbe, 0x24, 0xb4, 0x8c, 0x7f, 0xf5, 0xe5, 0x4a, 0x17, - 0xa6, 0x70, 0xde, 0x7c, - 0x2c, 0xd0, 0xf3, 0x7d, 0x84, 0x29, 0x1a, 0xd7, 0x0a, 0xa6, 0x0b, 0x6f, - 0x38, 0xdd, 0xaa, 0x79, - 0xcf, 0xcc, 0xaf, 0xb7, 0x7e, 0x9e, 0xc1, 0x9f, 0xfa, 0xcf, 0x5a, 0x7b, - 0xe4, 0x89, 0x99, 0x78, - 0xf6, 0xf1, 0x77, 0xd1, 0xcf, 0x76, 0x3f, 0xc1, 0xce, 0x16, 0xc3, 0xe5, - 0xce, 0x21, 0x7f, 0x5e, - 0x2f, 0x98, 0xb6, 0x4c, 0x9e, 0x68, 0x4d, 0xd8, 0x3d, 0x7e, 0x79, 0x30, - 0x6c, 0xf7, 0x07, 0x47, - 0xed, 0xde, 0x91, 0xd9, 0xfd, 0xe6, 0xa0, 0x7e, 0x13, 0x27, 0xae, 0xb7, - 0xb6, 0x4a, 0xec, 0x0e, - 0xc4, 0xeb, 0x82, 0xce, 0x1c, 0x2d, 0xab, 0x87, 0xee, 0x7f, 0x33, 0x82, - 0xd4, 0x14, 0x74, 0xe1, - 0xfc, 0x49, 0x6b, 0xcd, 0xde, 0xec, 0x7c, 0xa5, 0x77, 0x5d, 0x0c, 0xf3, - 0xf5, 0x10, 0xd7, 0x5b, - 0x5c, 0x36, 0xec, 0xd3, 0xcb, 0x23, 0xce, 0x73, 0x03, 0xde, 0xc3, 0x27, - 0x8c, 0xa3, 0x41, 0xbf, - 0x3d, 0x9c, 0x8c, 0x9a, 0xff, 0xe6, 0xf4, 0x0d, 0x5c, 0x3b, 0x26, 0xf3, - 0x49, 0x7d, 0x32, 0x9b, - 0x34, 0xc6, 0xb3, 0xff, 0xa7, 0x01, 0x7e, 0xd8, 0x27, 0x98, 0x76, 0x98, - 0xcc, 0x0f, 0xe3, 0xeb, - 0xd1, 0xeb, 0x19, 0xec, 0xbf, 0xd5, 0xd9, 0x1f, 0x46, 0x39, 0x40, 0xff, - 0xec, 0xa7, 0x51, 0xea, - 0xe8, 0xcb, 0xdd, 0x6f, 0x0c, 0xff, 0xf7, 0xb6, 0x42, 0xff, 0x0c, 0xd0, - 0xbf, 0xad, 0xc9, 0x49, - 0x13, 0xde, 0x97, 0xe1, 0xd8, 0xa3, 0x21, 0xf5, 0x7a, 0xee, 0x57, 0xd9, - 0x60, 0x77, 0x79, 0x8f, - 0x3f, 0xcd, 0xe0, 0xdf, 0x32, 0xa0, 0x0b, 0x6c, 0x6d, 0xbf, 0xdc, 0xbb, - 0xd7, 0xb5, 0x7d, 0x09, - 0x3b, 0xbe, 0x36, 0x1e, 0x5e, 0x76, 0x3e, 0x39, 0xca, 0xb7, 0x21, 0x6f, - 0x02, 0xfd, 0x76, 0x9f, - 0xea, 0xad, 0xf4, 0xcf, 0xbb, 0xc6, 0xd6, 0xfb, 0x0b, 0xe0, 0xb2, 0xbb, - 0x9f, 0x51, 0xf7, 0x85, - 0x5d, 0x63, 0xc5, 0xb0, 0xf8, 0xe7, 0x31, 0x88, 0xe7, 0xe2, 0xee, 0x37, - 0x39, 0x57, 0xf4, 0x9b, - 0x58, 0xbd, 0x6f, 0x71, 0xf1, 0x97, 0x21, 0xb6, 0x5d, 0x9a, 0x6b, 0x28, - 0xfd, 0x8b, 0xb4, 0x26, - 0x23, 0xdc, 0x5c, 0x4e, 0x7d, 0x92, 0x6b, 0x86, 0xd6, 0x25, 0x2f, 0xcb, - 0x87, 0xd5, 0x63, 0xbd, - 0xb6, 0x11, 0x07, 0xe7, 0x0b, 0xbd, 0x26, 0xd5, 0x43, 0xac, 0xfe, 0xbd, - 0xda, 0xe7, 0x57, 0xbd, - 0x63, 0x5a, 0x6a, 0x42, 0xed, 0x1d, 0xf7, 0x05, 0x99, 0x16, 0xf2, 0x7e, - 0x93, 0x8b, 0xd7, 0xed, - 0x7b, 0xfd, 0x91, 0xe7, 0x5c, 0x3f, 0x4f, 0xe8, 0x9f, 0xbe, 0x7c, 0x69, - 0xfd, 0x1b, 0xa6, 0xf0, - 0x6b, 0xd6, 0x3d, 0xae, 0xcb, 0x95, 0x2e, 0xcc, 0x64, 0xfa, 0xf7, 0x18, - 0x7f, 0x4f, 0x76, 0xbc, - 0xff, 0x49, 0xe6, 0x5f, 0x78, 0xd5, 0xd1, 0xfd, 0xd3, 0xbe, 0xc4, 0x77, - 0x04, 0xfc, 0xed, 0x75, - 0x13, 0xf1, 0xbb, 0xb7, 0x4f, 0x99, 0xe2, 0x3d, 0x59, 0x75, 0xc9, 0x43, - 0xb8, 0x87, 0xd7, 0x72, - 0xfd, 0x73, 0x7f, 0xf7, 0xa7, 0x26, 0xc5, 0xa6, 0xbf, 0x2e, 0x59, 0x73, - 0x98, 0x56, 0xeb, 0xfa, - 0xe7, 0xb6, 0xc1, 0xf1, 0xae, 0xc7, 0x37, 0x7d, 0xb3, 0xac, 0x8e, 0xf7, - 0xc2, 0xd6, 0xbf, 0x95, - 0xe7, 0xee, 0x5d, 0x97, 0x2f, 0x99, 0x55, 0xa8, 0xd7, 0xe3, 0xfa, 0xf7, - 0x7a, 0xae, 0xe9, 0xf7, - 0xf8, 0x19, 0xc7, 0xd6, 0x3f, 0x27, 0xd6, 0xc0, 0xcf, 0x0b, 0xb7, 0x07, - 0xde, 0xdf, 0xd3, 0xcb, - 0xd8, 0xe7, 0x0d, 0x7c, 0xc5, 0xd1, 0xbc, 0x58, 0xff, 0xe7, 0x83, 0x7b, - 0xed, 0xf5, 0xe8, 0x84, - 0xdc, 0xff, 0xfd, 0xee, 0x79, 0xae, 0xae, 0xd4, 0x3f, 0xe6, 0x87, 0x83, - 0x2e, 0xbc, 0x10, 0xb0, - 0xee, 0xc1, 0xf1, 0x7e, 0xff, 0xab, 0xbc, 0x31, 0xe0, 0x95, 0x0d, 0x23, - 0xc5, 0x7c, 0x0f, 0xf8, - 0x9b, 0x1d, 0x5f, 0x83, 0xdf, 0xcd, 0xf3, 0x50, 0xd3, 0x65, 0xf5, 0x9b, - 0xc0, 0xf9, 0xaf, 0xd7, - 0x4f, 0x77, 0xd6, 0xd7, 0xd8, 0x7a, 0x7f, 0x01, 0x7b, 0x20, 0x48, 0xff, - 0x22, 0xe6, 0xbc, 0xb0, - 0x8c, 0x8a, 0xeb, 0xf1, 0x5c, 0xee, 0x47, 0xcd, 0xea, 0x69, 0xb5, 0x56, - 0x9c, 0x6a, 0x28, 0xf6, - 0xd5, 0xfd, 0xe4, 0xf9, 0xf0, 0xf9, 0xc1, 0x01, 0x7d, 0xff, 0x95, 0xdb, - 0xa2, 0x57, 0x7e, 0x73, - 0x16, 0xd6, 0x6f, 0x12, 0xff, 0x9a, 0x94, 0x67, 0xcf, 0x35, 0x30, 0xfa, - 0xf7, 0x4a, 0xf6, 0x79, - 0xbb, 0x74, 0x3d, 0xe1, 0xcb, 0x56, 0xfd, 0xda, 0x2b, 0xe0, 0xdf, 0x27, - 0x5b, 0x2d, 0xae, 0xeb, - 0xb7, 0x9e, 0xdc, 0x83, 0xcf, 0x18, 0x3f, 0x7b, 0x4c, 0x47, 0xcd, 0xcf, - 0xb2, 0x33, 0xd6, 0xff, - 0x3b, 0xc8, 0xb4, 0x45, 0x0c, 0xe9, 0x31, 0xae, 0x79, 0xa2, 0xbe, 0xff, - 0xb1, 0xe6, 0x6a, 0x9f, - 0xaf, 0xfb, 0xbf, 0x5c, 0x17, 0xb8, 0xbf, 0x17, 0xa4, 0x7f, 0x8f, 0x30, - 0xa5, 0x10, 0x67, 0x0d, - 0x73, 0xfa, 0x4d, 0x8d, 0x37, 0x2c, 0xf3, 0x9e, 0x98, 0xcc, 0x0b, 0xeb, - 0x9f, 0x71, 0xfe, 0xba, - 0xdf, 0x31, 0x12, 0x67, 0x66, 0xaf, 0xfe, 0xb9, 0xee, 0xb1, 0xff, 0xaa, - 0x0e, 0xec, 0xb1, 0x4f, - 0x32, 0x5d, 0x87, 0x7b, 0x79, 0xc9, 0xfc, 0x1b, 0x75, 0x5b, 0xd7, 0x3d, - 0x75, 0xc9, 0x0b, 0xbb, - 0x3f, 0x7f, 0x5d, 0xff, 0xdc, 0xfe, 0x2f, 0xc4, 0xf5, 0x82, 0xf6, 0xdb, - 0xda, 0x39, 0xdd, 0x7a, - 0x66, 0x78, 0xd7, 0xc0, 0x7b, 0x46, 0xe2, 0x39, 0xaf, 0x85, 0x58, 0x0f, - 0x91, 0x25, 0xba, 0x74, - 0xe9, 0x9f, 0xe1, 0x79, 0x1e, 0xf3, 0x67, 0xa3, 0xc5, 0x73, 0x39, 0x67, - 0xbf, 0x9b, 0x2f, 0xcf, - 0x2b, 0xf5, 0xe7, 0xfb, 0x97, 0xdd, 0x09, 0x5b, 0x77, 0xbb, 0xdf, 0x04, - 0xea, 0x72, 0xfe, 0x19, - 0xd7, 0xc2, 0x37, 0x19, 0xee, 0x38, 0x8c, 0xfb, 0xd4, 0xd9, 0x1b, 0x37, - 0x5a, 0xb0, 0x07, 0xc2, - 0xf5, 0xcf, 0xe4, 0xfa, 0xe7, 0xd7, 0x85, 0x17, 0xfc, 0xd1, 0x4e, 0x0f, - 0xbb, 0xc6, 0x7b, 0xb6, - 0x7d, 0xb3, 0xeb, 0x95, 0x8f, 0xc6, 0x93, 0xd6, 0x64, 0x64, 0xb6, 0xee, - 0xf1, 0x33, 0xa1, 0xbd, - 0x16, 0x22, 0x1f, 0x7e, 0xc4, 0xee, 0xe5, 0x53, 0xec, 0x7c, 0x68, 0xc7, - 0xd7, 0x40, 0xd3, 0x27, - 0x27, 0x65, 0xbe, 0xc6, 0xaf, 0x1e, 0xeb, 0xad, 0x55, 0xbf, 0x89, 0xf5, - 0x64, 0x0b, 0xd8, 0x03, - 0x41, 0xbf, 0x8f, 0xdc, 0x83, 0x65, 0xd7, 0xf0, 0x5a, 0x5c, 0x76, 0x7e, - 0xdd, 0x07, 0x1f, 0x50, - 0xca, 0x73, 0x81, 0xbc, 0xc9, 0x20, 0xdb, 0x41, 0xe5, 0xc2, 0x23, 0x70, - 0x5a, 0x0a, 0xaa, 0xf3, - 0xab, 0xa7, 0x3f, 0x5f, 0x5d, 0xdf, 0x7f, 0xcd, 0x35, 0x51, 0xf5, 0x9b, - 0x78, 0x79, 0x2e, 0x76, - 0x5c, 0xef, 0x6e, 0x7c, 0x4c, 0x6a, 0xc1, 0xed, 0x38, 0x69, 0xc1, 0x5e, - 0x72, 0x2b, 0xdb, 0x89, - 0xe9, 0xfe, 0x17, 0xe6, 0x51, 0xcd, 0xbe, 0xa5, 0xf1, 0x72, 0x1e, 0x8b, - 0x0e, 0x3a, 0x8d, 0x89, - 0x4f, 0x69, 0x06, 0x74, 0xe1, 0xec, 0x35, 0xdc, 0x67, 0xb1, 0xef, 0x85, - 0x3f, 0xb3, 0xd9, 0xde, - 0x85, 0x67, 0xf5, 0x60, 0xfc, 0x4f, 0x5b, 0x10, 0x87, 0x1b, 0x4e, 0x27, - 0x8d, 0x61, 0xff, 0xe9, - 0x8e, 0x88, 0xcc, 0x49, 0xf4, 0x0f, 0x74, 0x41, 0xaa, 0x7f, 0x1b, 0x4e, - 0xf6, 0xf9, 0x5f, 0xce, - 0xbf, 0xa5, 0xfe, 0xe8, 0xb1, 0x7e, 0xe8, 0xff, 0x8c, 0x3f, 0xed, 0xde, - 0x5d, 0x4c, 0x0b, 0x3e, - 0xc7, 0xde, 0xfb, 0x3b, 0x8f, 0x8c, 0xae, 0xed, 0x65, 0xc3, 0x2b, 0xfb, - 0xef, 0xf1, 0xde, 0xe0, - 0x9f, 0x75, 0x5e, 0x32, 0xbf, 0xc7, 0x5e, 0xf3, 0xc4, 0x34, 0x7a, 0x66, - 0xf7, 0x8c, 0x7d, 0xcf, - 0xbd, 0xf1, 0xbf, 0x68, 0xdd, 0x19, 0x3d, 0xdf, 0xf2, 0xf4, 0x9b, 0x40, - 0xbf, 0xf9, 0xd9, 0xe6, - 0x41, 0x76, 0xf0, 0x89, 0x0e, 0x9c, 0x53, 0xec, 0x67, 0x94, 0x5f, 0xff, - 0x46, 0xa7, 0x42, 0xff, - 0x9e, 0xf6, 0xed, 0xf4, 0xb5, 0x7a, 0xbd, 0xf3, 0x7f, 0xb1, 0x7f, 0xcf, - 0xbc, 0x74, 0xc5, 0x00, - 0x5e, 0x58, 0xf3, 0x7f, 0x8f, 0x66, 0x2f, 0x6d, 0xb8, 0xd7, 0xe3, 0x69, - 0x8f, 0xfe, 0xd9, 0x77, - 0x61, 0x1a, 0xe3, 0xd3, 0x97, 0xd4, 0xfe, 0x55, 0xdf, 0xe8, 0xb8, 0xfd, - 0x7f, 0xa3, 0x97, 0xea, - 0x82, 0xff, 0x3b, 0x98, 0x95, 0x1a, 0x3b, 0x27, 0xcd, 0x1a, 0xf7, 0x8d, - 0xd9, 0x75, 0x97, 0x9d, - 0x79, 0xef, 0x4d, 0xff, 0xfb, 0x26, 0xe7, 0xb9, 0x58, 0x75, 0x4e, 0xec, - 0x55, 0x8d, 0xe7, 0x7c, - 0xb1, 0xed, 0xe7, 0xcc, 0xb0, 0x4f, 0xc7, 0x73, 0xc6, 0xe5, 0xf0, 0x6e, - 0x07, 0xf6, 0xc0, 0xeb, - 0x5d, 0x5f, 0x73, 0xcf, 0xa7, 0x33, 0xde, 0x3d, 0xe0, 0xd5, 0x76, 0xf7, - 0xbf, 0x71, 0x76, 0xcd, - 0x4c, 0x6b, 0x08, 0x05, 0x7b, 0xc4, 0x5c, 0xad, 0x8b, 0xc1, 0xef, 0xf4, - 0xa4, 0x57, 0x31, 0xcc, - 0x7e, 0xbf, 0x03, 0xcf, 0xd7, 0x2f, 0xb3, 0xdf, 0xcf, 0x1b, 0x98, 0xde, - 0xc3, 0x4a, 0x3c, 0xc3, - 0x3e, 0x53, 0x93, 0xe9, 0xb8, 0x31, 0x1a, 0xd7, 0x9a, 0xf9, 0xd1, 0x19, - 0xd3, 0xf5, 0xe7, 0x0c, - 0x73, 0x38, 0x6a, 0x4f, 0x26, 0xfd, 0xa6, 0x3b, 0xee, 0x10, 0xa0, 0x7f, - 0xb1, 0xd5, 0xb2, 0xe3, - 0xd9, 0x35, 0xbc, 0xe7, 0xf4, 0xa0, 0x34, 0x81, 0x9a, 0x2d, 0x09, 0xcf, - 0x85, 0xe7, 0x4d, 0x36, - 0xf9, 0x59, 0x57, 0x1f, 0xb2, 0xfd, 0x1f, 0x52, 0xb3, 0xc5, 0x6b, 0xd9, - 0x91, 0xec, 0x9a, 0x9c, - 0xea, 0xac, 0x16, 0x69, 0x4d, 0x70, 0xdc, 0x0e, 0x54, 0xac, 0x93, 0x9d, - 0x25, 0x39, 0xe7, 0xeb, - 0xa4, 0x78, 0x18, 0x5a, 0x97, 0xcc, 0x9e, 0xe9, 0xf7, 0xa3, 0xbe, 0xff, - 0x69, 0x9f, 0x37, 0x62, - 0xef, 0x30, 0x3b, 0xb6, 0xf7, 0x52, 0xf6, 0xac, 0x7a, 0xdc, 0x54, 0xe8, - 0x1f, 0xaf, 0x0f, 0x78, - 0x39, 0xf7, 0xf9, 0x6c, 0x9e, 0xcb, 0x90, 0xf9, 0xcc, 0xcf, 0x33, 0x3f, - 0x90, 0x9f, 0x3f, 0x4e, - 0xab, 0x07, 0x2f, 0x9d, 0xde, 0x6b, 0xae, 0xf2, 0xcc, 0xd5, 0xae, 0xd6, - 0x33, 0xba, 0x81, 0xfa, - 0x07, 0xba, 0xb0, 0x90, 0xeb, 0x9f, 0x5d, 0xf5, 0xf0, 0x8a, 0xc5, 0xb7, - 0xd4, 0xfd, 0xf5, 0xfd, - 0x7e, 0x3f, 0xf4, 0xe9, 0xa3, 0x54, 0xf7, 0x9b, 0xe6, 0xbf, 0xd2, 0x58, - 0xcf, 0xfe, 0x3d, 0xed, - 0xcd, 0x57, 0xc2, 0x19, 0xc5, 0xd2, 0x6f, 0xdb, 0x5e, 0x2f, 0x74, 0xd2, - 0x08, 0xea, 0x37, 0xa9, - 0x2c, 0x9f, 0x3f, 0xbc, 0x1c, 0x0c, 0x3b, 0x76, 0xfd, 0x9a, 0xb5, 0xb7, - 0x0c, 0x5b, 0xff, 0xc6, - 0x67, 0xbb, 0xb5, 0xf5, 0x8c, 0x68, 0x40, 0x1d, 0x2f, 0xd3, 0x05, 0x77, - 0xce, 0x5a, 0xbc, 0x3b, - 0xaf, 0x3f, 0xf8, 0x8e, 0x65, 0xf5, 0x70, 0xc7, 0x13, 0x0f, 0x7d, 0x63, - 0x80, 0xff, 0x7b, 0x69, - 0xfe, 0x7f, 0xa7, 0x2f, 0xab, 0xdd, 0x33, 0xbd, 0x39, 0x53, 0xf7, 0x89, - 0xed, 0x69, 0xcf, 0x7f, - 0xbb, 0x34, 0x41, 0x3f, 0xdc, 0x7e, 0xd8, 0x80, 0xfd, 0x9e, 0x3e, 0x71, - 0x94, 0xe9, 0x80, 0xef, - 0x61, 0xc5, 0xb6, 0x5b, 0xcf, 0xad, 0xf9, 0xaa, 0xde, 0x95, 0x7b, 0x86, - 0x9d, 0x73, 0xd3, 0x47, - 0x6f, 0xec, 0x7a, 0x57, 0xfd, 0x24, 0xa4, 0x8e, 0x57, 0xaa, 0x7f, 0x4e, - 0xbc, 0x7f, 0x95, 0xaf, - 0xbe, 0xb7, 0x96, 0x3f, 0x77, 0x6a, 0x08, 0x7a, 0x6f, 0x32, 0xa0, 0x2e, - 0xd9, 0xfd, 0xaa, 0xdf, - 0x98, 0xbd, 0xac, 0x01, 0xe7, 0xf5, 0x77, 0xb9, 0x62, 0x35, 0x6f, 0x72, - 0xf9, 0x51, 0xeb, 0xfa, - 0x87, 0x8e, 0x61, 0xc5, 0xcf, 0xae, 0x71, 0x9f, 0x99, 0x7d, 0x3c, 0x17, - 0x2f, 0x23, 0xd8, 0xca, - 0x15, 0x4c, 0xd6, 0x79, 0x2e, 0x4e, 0x0c, 0x4b, 0xd5, 0xe3, 0x62, 0xf9, - 0xaa, 0x59, 0xcc, 0xdc, - 0xcb, 0x08, 0xf5, 0xfd, 0xbb, 0x31, 0x72, 0x3b, 0x56, 0xbe, 0x8b, 0x8c, - 0xe7, 0x02, 0x6b, 0xb1, - 0x75, 0x00, 0x31, 0x0d, 0x55, 0xbf, 0x89, 0xe0, 0x76, 0xc4, 0xe3, 0xbf, - 0xaf, 0xe2, 0xfd, 0x6f, - 0xb4, 0x2a, 0xb9, 0xd6, 0xab, 0x78, 0xef, 0x99, 0x32, 0x56, 0xfd, 0x9b, - 0x8d, 0x0f, 0x0c, 0xf4, - 0x8e, 0xa2, 0xdf, 0x64, 0xad, 0xef, 0x9f, 0xeb, 0xc2, 0xd9, 0xb7, 0xd7, - 0x5e, 0x08, 0xf7, 0x1e, - 0x63, 0x65, 0xd7, 0x70, 0x56, 0xfd, 0xf9, 0xfa, 0x99, 0xf9, 0x51, 0x6b, - 0xcf, 0xdb, 0xfd, 0x26, - 0xf0, 0x9c, 0x82, 0xcf, 0x64, 0xf5, 0xf8, 0xf9, 0xc3, 0xc9, 0xe9, 0x4b, - 0x0e, 0xd6, 0x78, 0x2e, - 0x70, 0x5e, 0xb7, 0x7c, 0x97, 0x54, 0x2c, 0x75, 0xbc, 0xa2, 0xbe, 0x1f, - 0x57, 0xc7, 0x5b, 0x55, - 0x3e, 0x1b, 0x79, 0x1d, 0x2f, 0x3b, 0xa3, 0x04, 0xf5, 0x9b, 0x4c, 0xa6, - 0x1f, 0x6e, 0x7c, 0xcb, - 0xad, 0x0a, 0xef, 0xfb, 0xe7, 0x35, 0xab, 0xab, 0x7e, 0x93, 0xd0, 0xd8, - 0x76, 0x34, 0x26, 0xb5, - 0xc1, 0x3c, 0xf8, 0x47, 0xd6, 0xf4, 0xef, 0xd9, 0xde, 0x37, 0xaf, 0xf6, - 0x40, 0x44, 0x76, 0xcd, - 0x1a, 0xcf, 0xc5, 0x3a, 0xaf, 0xfb, 0xfb, 0x4d, 0xee, 0x99, 0x6f, 0xf4, - 0xf6, 0xfd, 0xdf, 0x0f, - 0x26, 0xb5, 0xe0, 0xe5, 0x5c, 0xbd, 0x36, 0xcd, 0xce, 0x9b, 0xb8, 0xfb, - 0x4d, 0x02, 0x79, 0x2e, - 0x22, 0x6f, 0x12, 0xa5, 0xc7, 0x25, 0xc0, 0x6f, 0x34, 0xae, 0x15, 0xd7, - 0x43, 0xd4, 0xc8, 0xa0, - 0xe6, 0x72, 0x4a, 0xfa, 0x7e, 0x3c, 0xfd, 0x26, 0xb7, 0x71, 0x3c, 0x97, - 0xe8, 0xf5, 0xfd, 0x18, - 0x5d, 0x10, 0xbe, 0x4b, 0x59, 0xda, 0xc9, 0x20, 0x67, 0xd5, 0x97, 0x3d, - 0xfd, 0x26, 0x85, 0x26, - 0xd4, 0x07, 0xa8, 0xfa, 0x4d, 0x56, 0x7e, 0x44, 0x59, 0xa5, 0x0b, 0x07, - 0x28, 0xa6, 0x55, 0x0c, - 0x8c, 0x0a, 0xdb, 0x44, 0x7f, 0x3e, 0xf3, 0x5d, 0x46, 0xff, 0x38, 0x98, - 0xe7, 0x62, 0xd5, 0x39, - 0x54, 0x81, 0x0f, 0xad, 0xe8, 0x37, 0x89, 0xc2, 0xb4, 0xc2, 0xb2, 0x6b, - 0xa2, 0x33, 0x2a, 0x56, - 0xfd, 0x26, 0xff, 0x9d, 0xa7, 0x3f, 0xdc, 0xea, 0x37, 0x39, 0x09, 0xe1, - 0x2f, 0x46, 0xd2, 0x05, - 0xfb, 0x8c, 0x52, 0x0e, 0xfe, 0x04, 0xc5, 0x13, 0xdb, 0x76, 0xea, 0x92, - 0xb7, 0x2e, 0xd6, 0xfb, - 0x4d, 0xbe, 0xe9, 0xd4, 0xd7, 0x6f, 0x62, 0xf5, 0xa2, 0x2b, 0xb9, 0x6e, - 0x91, 0xd8, 0x35, 0xf1, - 0xcc, 0x6b, 0xd0, 0xa6, 0x3b, 0x7c, 0xdf, 0xa9, 0xfa, 0x4d, 0xc0, 0x57, - 0x2d, 0x89, 0xdc, 0x9e, - 0x11, 0xf5, 0xd9, 0x08, 0x0c, 0x04, 0xd0, 0x0e, 0xcf, 0xf3, 0x6b, 0xa5, - 0x0b, 0x9d, 0xf8, 0xd6, - 0xe4, 0xfa, 0x3c, 0x1f, 0xc8, 0x9b, 0xe4, 0x8e, 0x77, 0x78, 0xbf, 0x89, - 0x94, 0xe7, 0x62, 0xe5, - 0x4d, 0xe2, 0x60, 0xd5, 0x47, 0xd3, 0x05, 0x2c, 0xb7, 0x43, 0xe7, 0xe7, - 0x85, 0xf4, 0x40, 0xf4, - 0x87, 0x06, 0xf1, 0x5c, 0x80, 0x83, 0x0f, 0xcf, 0xbe, 0xea, 0xa9, 0xaa, - 0x57, 0x1e, 0xd9, 0xe3, - 0x32, 0xba, 0x52, 0x7d, 0x3f, 0x3e, 0x0f, 0xe8, 0xe7, 0xb9, 0xac, 0xcd, - 0x37, 0x29, 0xc8, 0xe6, - 0x9b, 0x5c, 0x8d, 0x55, 0x7f, 0xcd, 0x9c, 0x17, 0x8f, 0xf7, 0xcb, 0x18, - 0x15, 0x2e, 0x0e, 0xbe, - 0xe3, 0xeb, 0x4b, 0x78, 0x2e, 0xa0, 0xeb, 0x7c, 0x0f, 0x20, 0xe2, 0xcc, - 0x38, 0x76, 0x4d, 0x16, - 0x59, 0xb3, 0x8a, 0x62, 0xd7, 0x98, 0x3c, 0x86, 0xb5, 0x80, 0x7e, 0x93, - 0x90, 0xf9, 0x26, 0x4c, - 0xd7, 0x2b, 0xb7, 0x2b, 0x7b, 0x19, 0xc5, 0x5e, 0x8f, 0x77, 0x0f, 0xe4, - 0x50, 0xbd, 0x6f, 0x22, - 0xae, 0xe7, 0xf4, 0x79, 0xf1, 0x5c, 0x01, 0xe8, 0xba, 0x9f, 0x83, 0xcf, - 0xfb, 0x4d, 0xce, 0x14, - 0xfd, 0x26, 0x12, 0x2e, 0x3b, 0x67, 0x21, 0x2c, 0xf5, 0xa6, 0xcd, 0xc1, - 0xe7, 0x7e, 0xd8, 0x40, - 0x70, 0xbe, 0x52, 0x6a, 0xe6, 0x56, 0xfd, 0x41, 0xd7, 0xeb, 0xa5, 0xb8, - 0xef, 0xa2, 0xd7, 0xfc, - 0xf3, 0x83, 0xfd, 0xfd, 0x26, 0x96, 0xef, 0x12, 0xde, 0x6f, 0x82, 0x64, - 0xd5, 0x5f, 0x39, 0xa6, - 0xa1, 0x60, 0x5a, 0xad, 0xf1, 0x5c, 0x3c, 0xf9, 0xf0, 0x5d, 0x3e, 0x77, - 0x62, 0x5b, 0xc6, 0x73, - 0x71, 0xf5, 0xe7, 0xe7, 0xe2, 0x64, 0x52, 0x63, 0x79, 0xbc, 0x92, 0xfd, - 0xe2, 0xcc, 0x37, 0x39, - 0xf5, 0xf9, 0x2e, 0x6e, 0x9e, 0x8b, 0xeb, 0xbc, 0x0e, 0xf1, 0x7e, 0xf5, - 0x79, 0x21, 0xf3, 0x22, - 0xb0, 0x6b, 0xb2, 0xbc, 0xf7, 0x2d, 0x37, 0xc9, 0x35, 0x65, 0x3c, 0x17, - 0x9e, 0x37, 0x59, 0x6c, - 0xdb, 0xb1, 0x6d, 0xe3, 0x81, 0xd5, 0xac, 0x2e, 0xaf, 0xc0, 0xaa, 0xb7, - 0x74, 0x7d, 0x9d, 0x61, - 0x52, 0xe1, 0x3e, 0xf2, 0x3a, 0xcf, 0xe5, 0x81, 0xec, 0x01, 0x04, 0xd3, - 0x2a, 0xe8, 0x79, 0xec, - 0xe2, 0xe0, 0x23, 0xfb, 0x4d, 0x36, 0xc6, 0xc1, 0x7b, 0x00, 0x18, 0x08, - 0x9c, 0x05, 0x63, 0x71, - 0xf0, 0xed, 0x58, 0x23, 0x70, 0xbe, 0x32, 0x92, 0xb5, 0xf0, 0xae, 0xc9, - 0x83, 0x9e, 0x41, 0xe9, - 0xe7, 0xf9, 0x48, 0x78, 0x2e, 0xe0, 0xbb, 0x5c, 0xc8, 0x79, 0x2e, 0x32, - 0x6e, 0xc7, 0xb5, 0x75, - 0xe1, 0x7a, 0x33, 0x28, 0x1d, 0x0e, 0xbe, 0xa7, 0x57, 0x3e, 0x88, 0xe7, - 0x02, 0xba, 0x7e, 0x84, - 0x65, 0xdd, 0x05, 0xc7, 0xf5, 0xae, 0xa3, 0x0b, 0xca, 0x5e, 0xf9, 0x99, - 0xf0, 0x5d, 0xa4, 0x3c, - 0x17, 0xab, 0xef, 0xdf, 0xf2, 0x5d, 0xc2, 0x7b, 0xe5, 0x6d, 0x5d, 0x88, - 0x93, 0x3d, 0x8b, 0x8c, - 0xf7, 0xdb, 0xef, 0x2b, 0x90, 0xe7, 0x62, 0xcd, 0x37, 0x81, 0xcf, 0x2d, - 0xf8, 0x61, 0xfa, 0x48, - 0x52, 0xb3, 0x85, 0x65, 0xd5, 0xa3, 0x99, 0xd4, 0x88, 0x78, 0x7f, 0x18, - 0xbb, 0xc6, 0xcd, 0xc1, - 0xbf, 0xa8, 0xec, 0x05, 0xf2, 0x5c, 0x7c, 0x75, 0xc9, 0xb9, 0x17, 0x69, - 0x0e, 0xab, 0x32, 0x86, - 0xd5, 0x17, 0x71, 0xe6, 0xe2, 0x71, 0x40, 0xbf, 0x89, 0x9b, 0x83, 0x3f, - 0xdb, 0x0a, 0x7e, 0x36, - 0xf6, 0x20, 0xf6, 0x91, 0xea, 0xda, 0x1c, 0x7c, 0xe7, 0xec, 0x01, 0xbe, - 0x4b, 0x48, 0x7c, 0x6d, - 0xc3, 0x7c, 0xb1, 0x66, 0xd3, 0x86, 0xc4, 0xfb, 0x5d, 0x73, 0x26, 0xab, - 0x77, 0x76, 0xd7, 0xfa, - 0x4d, 0xfc, 0x1c, 0x7c, 0x6d, 0x7a, 0x5d, 0x56, 0x7d, 0xf4, 0x98, 0x06, - 0x32, 0xde, 0xcf, 0x99, - 0xd4, 0x5b, 0x0b, 0xbd, 0x1e, 0x9a, 0x37, 0x61, 0x5a, 0x08, 0x7e, 0x04, - 0x7b, 0xcd, 0x58, 0x7c, - 0x97, 0x38, 0x67, 0xd3, 0x7a, 0xcf, 0x0b, 0x12, 0x9e, 0xcb, 0x1d, 0xbb, - 0x57, 0xbe, 0x78, 0x10, - 0x36, 0xdf, 0xe4, 0xfa, 0xb3, 0x69, 0xaf, 0x98, 0xf3, 0x0a, 0x7e, 0x1e, - 0x7b, 0xfa, 0xfe, 0xbd, - 0xdc, 0x0f, 0x2f, 0xcf, 0xc5, 0xc9, 0x9b, 0x44, 0x63, 0x52, 0xc7, 0xa3, - 0x0b, 0xc8, 0x18, 0x56, - 0x7a, 0xbe, 0xcd, 0xe7, 0x7b, 0x6e, 0xca, 0xe2, 0x6b, 0x56, 0xde, 0xe4, - 0x45, 0x9a, 0xc3, 0xba, - 0x8f, 0xad, 0xcb, 0xe1, 0x9f, 0x47, 0xe9, 0xfc, 0x60, 0xe8, 0x37, 0x29, - 0xef, 0x43, 0x6c, 0x44, - 0xb0, 0x9f, 0x35, 0x23, 0xf0, 0xb3, 0x74, 0xa4, 0x19, 0xfa, 0x34, 0xdf, - 0x2c, 0x9e, 0xb9, 0xcf, - 0x51, 0xc1, 0xf1, 0x35, 0x3b, 0xa6, 0xb1, 0x35, 0x79, 0xf0, 0x6b, 0x82, - 0xe1, 0x7c, 0xc1, 0x3d, - 0xe7, 0xa6, 0xa2, 0xdf, 0xa4, 0x2c, 0xc9, 0x9b, 0x64, 0x9d, 0x3a, 0xde, - 0x70, 0xdf, 0x05, 0xc5, - 0xaa, 0xbf, 0x9f, 0xec, 0x1a, 0x97, 0xae, 0x7b, 0xf3, 0x26, 0x62, 0x36, - 0x63, 0x58, 0x7c, 0xed, - 0x7e, 0xd7, 0xb2, 0x47, 0x67, 0x54, 0xb8, 0x38, 0xf8, 0xc8, 0xf9, 0x26, - 0x1b, 0xd7, 0x62, 0xd5, - 0x5f, 0x2d, 0xe7, 0x85, 0x8b, 0x6d, 0x6b, 0xfc, 0xd9, 0xb8, 0x73, 0xba, - 0x59, 0x0b, 0x8b, 0xaf, - 0x65, 0x98, 0xf6, 0x3f, 0xf0, 0x39, 0xac, 0x03, 0x74, 0xbd, 0x5e, 0xc3, - 0x3a, 0x33, 0xcb, 0xe7, - 0x07, 0x83, 0xef, 0xc1, 0x3e, 0x1b, 0xf0, 0x3c, 0x96, 0xcd, 0x0f, 0x5e, - 0xed, 0x01, 0x8c, 0xff, - 0x5e, 0xa9, 0xc7, 0xc8, 0xb4, 0x0a, 0xe4, 0xb2, 0xcb, 0xfa, 0x4d, 0x80, - 0xff, 0x07, 0xec, 0xe7, - 0xcc, 0x98, 0xe9, 0x58, 0x3f, 0xf8, 0x3e, 0x78, 0x8c, 0x4d, 0xf8, 0x2e, - 0x12, 0x9e, 0x4b, 0x09, - 0x9e, 0xd7, 0x0d, 0xf8, 0x3d, 0xa0, 0x74, 0xe1, 0xce, 0x03, 0xe7, 0x7c, - 0xd9, 0x6b, 0xa2, 0xec, - 0x37, 0xe1, 0xcf, 0xbe, 0xb0, 0x7e, 0x93, 0x87, 0x61, 0x36, 0x6d, 0x40, - 0x7c, 0x4d, 0xf4, 0x11, - 0x56, 0xf6, 0xc2, 0xe7, 0x07, 0x8b, 0xf7, 0x92, 0x3f, 0xc5, 0x30, 0xa9, - 0x33, 0xa1, 0x71, 0xbd, - 0x2b, 0x31, 0x2a, 0x54, 0xf1, 0x7e, 0xde, 0x2b, 0xcf, 0x7d, 0x17, 0x69, - 0x7c, 0x8d, 0xeb, 0xfa, - 0xfc, 0xc1, 0x32, 0xa9, 0x57, 0x35, 0xab, 0x39, 0x54, 0x7f, 0x3e, 0xdf, - 0x03, 0xd2, 0xf9, 0xc1, - 0x62, 0x86, 0x0e, 0x68, 0x48, 0x01, 0xe2, 0x30, 0x7d, 0x79, 0x3e, 0x3c, - 0x4a, 0x5c, 0x0f, 0xb5, - 0x07, 0xd0, 0xb5, 0x69, 0xfe, 0x67, 0xa3, 0x6b, 0xbe, 0x49, 0x40, 0x5d, - 0xf2, 0x76, 0x50, 0x7c, - 0x2d, 0x72, 0x5c, 0xef, 0x81, 0xcd, 0x5b, 0xe4, 0x79, 0x93, 0xcd, 0xb3, - 0xea, 0x01, 0xf8, 0xc3, - 0xa5, 0xb3, 0x5c, 0xdd, 0x66, 0x3f, 0x43, 0xde, 0x43, 0x9d, 0x07, 0x94, - 0xf0, 0x5c, 0x2c, 0xdf, - 0x05, 0xd6, 0x42, 0xc6, 0x73, 0x11, 0x6b, 0x12, 0xef, 0x6c, 0xda, 0x6b, - 0xc6, 0xfb, 0x3d, 0x1c, - 0x7c, 0xb7, 0xef, 0x12, 0x18, 0x5f, 0xb3, 0x7e, 0x0f, 0xbc, 0xc7, 0x65, - 0x10, 0x93, 0x2e, 0x5c, - 0x77, 0x36, 0xad, 0xfb, 0xb3, 0x3b, 0xdf, 0xe6, 0xbd, 0xf2, 0xd2, 0xf8, - 0x9a, 0x95, 0x37, 0xb1, - 0xeb, 0x78, 0x1f, 0x5c, 0x7d, 0x3f, 0x36, 0xde, 0x2f, 0x66, 0xcd, 0xf1, - 0x58, 0x84, 0x64, 0x7e, - 0xb0, 0xe8, 0x37, 0x61, 0xbe, 0xcb, 0x79, 0xf1, 0x20, 0x3b, 0xcc, 0xb4, - 0xa5, 0xf9, 0x70, 0x7c, - 0xcd, 0x6a, 0x7b, 0xf7, 0xf6, 0x7d, 0xce, 0x79, 0xf5, 0xc2, 0x39, 0xf8, - 0x41, 0xf3, 0x83, 0x83, - 0x63, 0xdb, 0x21, 0xe7, 0xf4, 0x07, 0x95, 0xf3, 0x82, 0xba, 0xe4, 0x71, - 0xbe, 0x05, 0x7b, 0xc5, - 0x1b, 0x2b, 0x5c, 0xcf, 0x87, 0xa7, 0x90, 0x4c, 0xab, 0x58, 0x6b, 0x56, - 0x71, 0x39, 0x2f, 0xde, - 0x73, 0xba, 0x35, 0xd5, 0x9a, 0xa9, 0x7e, 0xaa, 0x9b, 0x1e, 0x67, 0x3a, - 0xd9, 0x85, 0xde, 0x92, - 0xf1, 0xef, 0xa5, 0x6b, 0xe2, 0xe1, 0xe0, 0x97, 0xf7, 0xdd, 0xb5, 0x01, - 0x41, 0x3c, 0x97, 0x95, - 0x2e, 0x60, 0xf8, 0xfd, 0x0f, 0x66, 0x36, 0xad, 0xfb, 0xf7, 0x0a, 0xe7, - 0xd7, 0x1d, 0xa6, 0xdf, - 0xe1, 0xfd, 0x26, 0xe0, 0xbb, 0x3c, 0x9c, 0xb3, 0x69, 0x53, 0xab, 0xf9, - 0xcc, 0xf2, 0xf9, 0xc1, - 0xb6, 0xef, 0x32, 0xd7, 0xeb, 0x61, 0xf3, 0x4d, 0xb0, 0xac, 0xfa, 0x07, - 0x90, 0x07, 0x34, 0x64, - 0xf3, 0x4d, 0xa0, 0x4e, 0x23, 0x70, 0x7e, 0xf0, 0x7d, 0xa8, 0x59, 0x8d, - 0x2b, 0xde, 0xcf, 0xfd, - 0x30, 0xc8, 0x11, 0x03, 0x23, 0xf8, 0xb6, 0x3c, 0xbe, 0x06, 0xba, 0x2e, - 0xea, 0x78, 0x37, 0x1e, - 0xa4, 0x2e, 0xe0, 0x62, 0xdb, 0x76, 0x9e, 0x8d, 0x9d, 0x71, 0x42, 0xe7, - 0x9b, 0x30, 0xff, 0x0a, - 0xf2, 0x6c, 0xa1, 0x35, 0x5b, 0xd8, 0x18, 0x96, 0xb5, 0x07, 0xd2, 0xf1, - 0xce, 0x5b, 0x6c, 0xbb, - 0xff, 0x4d, 0x1b, 0xa4, 0xba, 0xd2, 0x35, 0x51, 0xc4, 0x3a, 0xb5, 0x41, - 0x8e, 0xeb, 0x42, 0xf1, - 0xb8, 0x54, 0x0b, 0x9b, 0x33, 0x99, 0x46, 0xf1, 0xfb, 0x5f, 0x84, 0xd9, - 0xb4, 0x76, 0xad, 0xd2, - 0x48, 0xdd, 0x6f, 0x02, 0x75, 0xbc, 0xf9, 0x49, 0x26, 0xb4, 0xdf, 0x24, - 0xd2, 0x6c, 0xda, 0x61, - 0x8c, 0xb3, 0x69, 0x8f, 0xd7, 0x7d, 0x17, 0x15, 0x07, 0x3f, 0x70, 0xce, - 0xe4, 0x43, 0x34, 0x9b, - 0xd6, 0xef, 0x87, 0x15, 0xcf, 0x99, 0xef, 0xc2, 0xfc, 0xae, 0xf5, 0xf9, - 0xc1, 0xae, 0xba, 0x64, - 0xa6, 0x99, 0xb8, 0x9a, 0x5a, 0x5c, 0xbd, 0xde, 0x66, 0xac, 0x75, 0xbc, - 0xdb, 0x4d, 0x88, 0xeb, - 0x85, 0xce, 0x0f, 0x3e, 0x2d, 0x1d, 0x70, 0x56, 0xfd, 0x2c, 0xdd, 0xd0, - 0xc2, 0xfa, 0x4d, 0x62, - 0xad, 0x65, 0x47, 0xd6, 0xeb, 0x05, 0xf4, 0xb8, 0x84, 0xf6, 0x9b, 0x9c, - 0x49, 0x78, 0x2e, 0xd1, - 0xfc, 0xf7, 0x56, 0x9c, 0x73, 0x58, 0x51, 0xcf, 0xc6, 0x48, 0xf1, 0xfe, - 0x9c, 0xc3, 0xf9, 0xe2, - 0xf1, 0x35, 0xc8, 0x9b, 0x04, 0xcc, 0x99, 0xdc, 0x3e, 0x2f, 0x8b, 0x5e, - 0x79, 0x59, 0x7c, 0xed, - 0x21, 0x5b, 0x13, 0xe1, 0x87, 0xe5, 0xa4, 0x75, 0xc9, 0xb2, 0x7c, 0x78, - 0xfc, 0x4c, 0x6a, 0x1c, - 0x8f, 0x37, 0x34, 0xde, 0xcf, 0xfb, 0x4d, 0xf2, 0x4d, 0x9e, 0x63, 0x0d, - 0x99, 0x1f, 0xcc, 0xfb, - 0x4d, 0x66, 0x70, 0x4e, 0x2f, 0xc4, 0x5b, 0xcb, 0xde, 0x8f, 0x25, 0xde, - 0x2f, 0xea, 0x78, 0xd9, - 0x6b, 0x4a, 0xe7, 0x07, 0x83, 0xae, 0xb3, 0x7b, 0xa9, 0x60, 0x7a, 0xe5, - 0xef, 0x43, 0x1d, 0xaf, - 0x32, 0xe7, 0xb5, 0x80, 0x67, 0xa3, 0xfb, 0x8c, 0xe2, 0x9b, 0x1f, 0x2c, - 0xef, 0x37, 0x59, 0x9b, - 0x6f, 0x12, 0x69, 0x3e, 0x33, 0xb2, 0x36, 0x4d, 0xc9, 0xb4, 0x0a, 0x8f, - 0x61, 0x39, 0x79, 0x93, - 0xd2, 0x45, 0x75, 0xad, 0xdf, 0x64, 0xdb, 0xcf, 0xc1, 0x67, 0xaf, 0x89, - 0xab, 0x07, 0xc1, 0xef, - 0x01, 0x35, 0xa7, 0x05, 0x37, 0x6f, 0x31, 0x86, 0x78, 0xbf, 0x21, 0xe5, - 0xe0, 0xdf, 0x92, 0xcc, - 0x0f, 0xbe, 0x0f, 0xba, 0x80, 0x9d, 0x4d, 0xab, 0x5a, 0x13, 0xde, 0x6f, - 0xb2, 0xdc, 0x0e, 0xe9, - 0x37, 0xc9, 0x39, 0x79, 0x13, 0x11, 0xef, 0x47, 0xd4, 0xf1, 0xde, 0x8d, - 0xad, 0xbe, 0x1f, 0x17, - 0xef, 0x67, 0xf7, 0xc9, 0x67, 0xcd, 0xb1, 0x35, 0x0f, 0xef, 0x37, 0x61, - 0xbe, 0xcb, 0x99, 0xca, - 0x77, 0x89, 0xa2, 0x0b, 0xf1, 0xd6, 0xf1, 0x7a, 0x9e, 0x8d, 0x41, 0xfd, - 0x26, 0x77, 0xbd, 0xfd, - 0x26, 0xba, 0x24, 0x1f, 0xfe, 0x62, 0xd4, 0xac, 0x86, 0xc6, 0xb6, 0x23, - 0xf6, 0x9b, 0x88, 0x3a, - 0xde, 0xe2, 0x03, 0xa9, 0x65, 0x8f, 0x18, 0xdb, 0x16, 0xf3, 0x16, 0x97, - 0xfa, 0x61, 0xc8, 0xfc, - 0x60, 0x9e, 0x37, 0x81, 0xcf, 0x9f, 0xea, 0x35, 0x63, 0xae, 0x65, 0x47, - 0xc5, 0xb6, 0xe3, 0x5d, - 0x13, 0x91, 0x37, 0x01, 0xce, 0x17, 0xdc, 0xbb, 0x74, 0x7e, 0x30, 0x3c, - 0xe3, 0x2c, 0xdf, 0x25, - 0x2e, 0xce, 0x57, 0x9c, 0x6b, 0xa2, 0x59, 0x75, 0x39, 0x22, 0x6f, 0xb2, - 0x29, 0xed, 0x37, 0xe1, - 0xfe, 0xfb, 0x34, 0xd5, 0x0c, 0xed, 0x37, 0x79, 0x31, 0x66, 0xd3, 0x06, - 0xe4, 0x01, 0x83, 0xe7, - 0x4c, 0x22, 0xfa, 0x4d, 0xee, 0x7b, 0x2d, 0x7b, 0x48, 0x1d, 0xef, 0x40, - 0xd1, 0x6f, 0x72, 0x12, - 0xd2, 0x6f, 0x32, 0x5c, 0x9d, 0xd7, 0xc5, 0x79, 0x41, 0x7b, 0x78, 0x6a, - 0x56, 0x7d, 0x67, 0x94, - 0xfc, 0x54, 0xd1, 0x6f, 0x32, 0xdf, 0xaa, 0x5b, 0x7b, 0xc0, 0x50, 0xf9, - 0xef, 0xd8, 0xda, 0xb4, - 0xf4, 0xfd, 0x98, 0xb7, 0x28, 0x99, 0x1f, 0x0c, 0xf7, 0x02, 0xfb, 0x2e, - 0x8c, 0xe7, 0x72, 0x1f, - 0x6a, 0xd9, 0x51, 0x35, 0xab, 0x6e, 0x5d, 0x40, 0xd5, 0xf1, 0x9e, 0x22, - 0xea, 0x78, 0x79, 0x7d, - 0x7f, 0xaa, 0x29, 0x8f, 0xaf, 0xed, 0xec, 0x83, 0xef, 0x02, 0x67, 0xe5, - 0xec, 0x40, 0x0b, 0xed, - 0x37, 0x89, 0x95, 0xd3, 0x7d, 0xe5, 0x78, 0xbf, 0x3b, 0xbe, 0x26, 0x9b, - 0x6f, 0x12, 0x10, 0x5f, - 0x8b, 0xac, 0x0b, 0xf7, 0x6f, 0x36, 0x6d, 0x60, 0xbf, 0xc9, 0x05, 0xa6, - 0xdf, 0x04, 0xf9, 0x6c, - 0x7c, 0x90, 0xb3, 0x69, 0xdd, 0x31, 0x36, 0xf6, 0x9a, 0xaa, 0x7e, 0x13, - 0x3b, 0x0f, 0x18, 0xfa, - 0x3b, 0x78, 0x31, 0x6a, 0x56, 0x7d, 0xfd, 0xf9, 0xb2, 0xf8, 0x1a, 0xdc, - 0x0b, 0xf8, 0xbf, 0x9b, - 0xb2, 0xf8, 0x5a, 0x94, 0x18, 0xd6, 0x95, 0xd8, 0x35, 0x21, 0x67, 0x66, - 0x19, 0xa3, 0xc2, 0x53, - 0x97, 0x8c, 0xeb, 0x37, 0x89, 0xbd, 0x66, 0x15, 0x91, 0xf3, 0x8a, 0x7f, - 0x4d, 0xd6, 0xe3, 0xfd, - 0x6b, 0xf3, 0x83, 0x9d, 0xb3, 0x47, 0x35, 0x34, 0xbe, 0x76, 0x5f, 0xea, - 0xfb, 0xb1, 0xec, 0x9a, - 0x85, 0x84, 0x5d, 0xe3, 0xaa, 0x4b, 0xae, 0xac, 0xf5, 0x9b, 0x78, 0x79, - 0x2e, 0x5c, 0x67, 0xe3, - 0xec, 0xfb, 0xc1, 0xeb, 0x02, 0xba, 0x3e, 0x60, 0x67, 0xa1, 0x1f, 0x3a, - 0xf1, 0x35, 0xc9, 0x79, - 0x1d, 0x6a, 0x26, 0x55, 0x3d, 0x05, 0x2f, 0xc6, 0x6c, 0x5a, 0xef, 0xb3, - 0xf1, 0x9a, 0xfd, 0x26, - 0x2f, 0xd2, 0x6c, 0x5a, 0x49, 0xce, 0x0b, 0xdd, 0x6f, 0xe2, 0xe4, 0x4d, - 0xa2, 0xb3, 0xea, 0xef, - 0x6b, 0xcd, 0xaa, 0xe7, 0xb3, 0x01, 0x7e, 0x23, 0xf4, 0x0b, 0x86, 0xf0, - 0x5c, 0x40, 0xd7, 0x73, - 0x31, 0xf6, 0xb8, 0x60, 0xfd, 0xf7, 0x48, 0x6b, 0x12, 0x43, 0xbc, 0xdf, - 0xa9, 0x4b, 0x3e, 0x85, - 0x3e, 0x80, 0xaa, 0xb2, 0xdf, 0x24, 0x8a, 0x2e, 0xe8, 0x0f, 0x92, 0x5d, - 0x63, 0xbd, 0x66, 0x5e, - 0xda, 0x6f, 0x22, 0x74, 0x3d, 0xbb, 0x70, 0x7a, 0x10, 0x0d, 0x44, 0x7d, - 0x7f, 0x3c, 0x75, 0xbc, - 0x57, 0x89, 0xf7, 0x4b, 0x78, 0x2e, 0xc2, 0x77, 0x81, 0x5e, 0xf9, 0xf0, - 0x7e, 0x93, 0xf5, 0x78, - 0xff, 0x75, 0x6b, 0xd9, 0x91, 0xec, 0x9a, 0xa0, 0xb8, 0x5e, 0xcf, 0xdd, - 0x6f, 0xe2, 0x8f, 0x49, - 0x41, 0x7c, 0xad, 0xe8, 0x8d, 0xaf, 0x89, 0x3d, 0xd0, 0x8e, 0xb3, 0x66, - 0x15, 0x1f, 0xdb, 0x56, - 0x3d, 0x8f, 0x35, 0xa3, 0x70, 0x5a, 0x3d, 0xa8, 0x9c, 0x15, 0x0f, 0xa4, - 0xfd, 0x26, 0x50, 0x97, - 0x3c, 0xcc, 0xb4, 0xe3, 0xae, 0x65, 0xdf, 0x8e, 0x89, 0x5d, 0xa3, 0xf1, - 0x18, 0x96, 0xe0, 0x45, - 0xc8, 0x78, 0x2e, 0xa0, 0xeb, 0xf0, 0xd9, 0xd8, 0x5e, 0xe6, 0x0e, 0x33, - 0x61, 0xfd, 0x26, 0xd8, - 0x9a, 0x55, 0x24, 0xd7, 0x2d, 0xf6, 0xfa, 0x7e, 0xe4, 0x0c, 0x4a, 0x7e, - 0x46, 0x61, 0xe7, 0x22, - 0x39, 0xcf, 0x45, 0x70, 0xf0, 0x45, 0xbf, 0x9d, 0xf6, 0x40, 0xeb, 0xfb, - 0xa3, 0xc4, 0xfb, 0x9d, - 0x9a, 0x47, 0x78, 0x5e, 0x07, 0xf6, 0x9b, 0xb0, 0xb3, 0x3f, 0xdb, 0x57, - 0x85, 0x99, 0x24, 0xbe, - 0x76, 0xdf, 0xea, 0xfb, 0xaf, 0x5e, 0xaf, 0xa7, 0xee, 0x37, 0xc9, 0xaf, - 0x9d, 0xd7, 0x1f, 0x50, - 0x2d, 0x7b, 0xf4, 0x78, 0x7f, 0x3f, 0xdb, 0x01, 0x5d, 0x28, 0x9d, 0x84, - 0xc4, 0xd7, 0x40, 0xd7, - 0xa1, 0x57, 0x1e, 0x33, 0x9b, 0xf6, 0x34, 0xde, 0xd9, 0xb4, 0x58, 0x8e, - 0x16, 0x3f, 0x33, 0x4b, - 0x79, 0x2e, 0xa2, 0xdf, 0x04, 0x3e, 0x6b, 0xae, 0x7e, 0x13, 0x43, 0xbe, - 0x07, 0xf2, 0x0f, 0x76, - 0xde, 0x62, 0x60, 0xce, 0xcb, 0xc5, 0x73, 0x09, 0xc9, 0x9b, 0xac, 0xf5, - 0x9b, 0xb0, 0x3d, 0x10, - 0x5b, 0xcd, 0xea, 0x8b, 0x58, 0xc7, 0x9b, 0x5e, 0xb8, 0x39, 0x5f, 0x12, - 0x9e, 0x0b, 0xf8, 0x94, - 0xec, 0xb3, 0x2b, 0xfa, 0x4d, 0xb2, 0xf2, 0x7e, 0x93, 0x38, 0xd7, 0x24, - 0x52, 0xbc, 0x5f, 0xe2, - 0xbb, 0xb8, 0xea, 0x92, 0x9d, 0xf3, 0xfe, 0x9d, 0x90, 0x7e, 0x93, 0x98, - 0xfd, 0xf7, 0x38, 0xb9, - 0x1d, 0x5c, 0x17, 0xc0, 0x77, 0x09, 0x89, 0xaf, 0x81, 0xae, 0xf3, 0x3c, - 0xe0, 0xc3, 0x58, 0xc7, - 0x6b, 0x9d, 0x51, 0xa0, 0x7e, 0xd4, 0xc9, 0x9b, 0x04, 0xf4, 0x9b, 0xec, - 0x9c, 0xef, 0xf0, 0x5e, - 0xf9, 0xd0, 0x7e, 0x93, 0xfb, 0xb1, 0x07, 0xae, 0x1a, 0xef, 0x97, 0xf5, - 0x9b, 0xdc, 0x96, 0xc7, - 0xd7, 0x1e, 0xe0, 0x1e, 0xf0, 0xc7, 0xb6, 0xc3, 0xd9, 0x35, 0x9c, 0x83, - 0x9f, 0x6b, 0xc1, 0x1e, - 0xf0, 0xd7, 0x6c, 0x79, 0xe6, 0x07, 0x83, 0xae, 0x4f, 0x8a, 0x4d, 0x7c, - 0x0c, 0x4b, 0xb1, 0x07, - 0x9c, 0x67, 0x42, 0xb1, 0x59, 0x5a, 0x28, 0x66, 0xa4, 0xb3, 0xf7, 0x58, - 0x38, 0x2b, 0x1d, 0xea, - 0xaa, 0xb8, 0xe3, 0x30, 0xd7, 0x2e, 0x9d, 0x15, 0xea, 0xaa, 0x35, 0xc9, - 0x2c, 0xf8, 0x6b, 0x36, - 0x03, 0x7d, 0x17, 0xf6, 0x19, 0xd4, 0xe7, 0xf9, 0x66, 0xe1, 0xb4, 0x58, - 0x2f, 0xdd, 0x2a, 0xd5, - 0xf8, 0x75, 0x51, 0x3a, 0x2c, 0x9e, 0x6e, 0x1e, 0xe6, 0xe7, 0x7a, 0x73, - 0x2d, 0x06, 0x3c, 0xca, - 0xb7, 0x4b, 0xa7, 0x79, 0xe5, 0xbd, 0x66, 0x96, 0xa5, 0x46, 0x71, 0xa6, - 0x38, 0x4b, 0xb2, 0xdf, - 0x7d, 0xf1, 0xbc, 0x54, 0x53, 0x9e, 0x5f, 0xc7, 0xf0, 0x9a, 0xb9, 0xba, - 0xea, 0xb3, 0xab, 0x1f, - 0xb3, 0xd7, 0x3c, 0xce, 0xd5, 0x0b, 0x27, 0xbe, 0x7b, 0x39, 0xdb, 0x3c, - 0x2c, 0x2c, 0x98, 0x76, - 0x8c, 0xd9, 0x7e, 0x1b, 0xa4, 0x3b, 0x45, 0xf6, 0x6f, 0xca, 0xbc, 0xf4, - 0xa4, 0xd0, 0x2e, 0x9d, - 0xe8, 0xaa, 0xfb, 0x34, 0xf4, 0x93, 0x52, 0x43, 0x39, 0xf3, 0x8a, 0x69, - 0x01, 0xee, 0x35, 0x37, - 0x5b, 0xa5, 0x65, 0xb6, 0x21, 0x74, 0x1d, 0xe2, 0xf3, 0x7a, 0x2b, 0x7f, - 0xbc, 0x59, 0x67, 0xf7, - 0xe0, 0xba, 0x97, 0xe2, 0x21, 0x7c, 0x36, 0x0a, 0xb3, 0x8c, 0xf8, 0x8c, - 0xca, 0xf6, 0x3d, 0xf3, - 0x0d, 0xe0, 0xeb, 0x95, 0x3d, 0x2e, 0x33, 0xf6, 0xd9, 0x58, 0x66, 0x1a, - 0xaa, 0xb5, 0xcd, 0x9f, - 0x96, 0x0e, 0x73, 0x23, 0xc5, 0xe7, 0x71, 0x90, 0xed, 0x96, 0xce, 0x37, - 0x0f, 0x7d, 0xef, 0x09, - 0xea, 0x57, 0xbb, 0x19, 0xb8, 0x97, 0x65, 0xa1, 0x51, 0x5c, 0xdd, 0x4b, - 0x0d, 0xee, 0x65, 0xf3, - 0x38, 0x5f, 0xcf, 0xd9, 0xf9, 0xac, 0x9e, 0xb7, 0x8e, 0x17, 0xb7, 0x07, - 0xf4, 0x0e, 0x66, 0x0f, - 0x58, 0xfb, 0xae, 0xa9, 0xda, 0x77, 0x9b, 0xe7, 0xa5, 0xc3, 0xb0, 0x19, - 0x16, 0x10, 0x5f, 0xcf, - 0x4c, 0xf3, 0x2d, 0xb8, 0x4f, 0xf6, 0xd9, 0x3d, 0x74, 0x3e, 0x67, 0xe7, - 0xec, 0x5e, 0x4e, 0x0a, - 0xf5, 0xdc, 0x2c, 0xdb, 0xca, 0x0c, 0xe1, 0x5e, 0xb4, 0x2e, 0xec, 0x81, - 0xd2, 0x4c, 0x31, 0x0f, - 0x32, 0xd6, 0x3d, 0x00, 0x71, 0x0a, 0xb6, 0x07, 0x54, 0x33, 0x28, 0x79, - 0x6f, 0x16, 0x7b, 0xcd, - 0x81, 0xd6, 0x81, 0xfe, 0x2b, 0xd8, 0xff, 0x9b, 0x67, 0xde, 0x7b, 0x29, - 0x9e, 0xb2, 0x7b, 0x59, - 0xe4, 0x1b, 0xa5, 0x93, 0x5c, 0x5d, 0x53, 0xf4, 0x9b, 0x84, 0xed, 0x01, - 0x60, 0x20, 0x58, 0xbf, - 0x57, 0x63, 0xa5, 0x0b, 0x29, 0xa5, 0x2e, 0xc0, 0xef, 0xe1, 0x81, 0xae, - 0x09, 0xdb, 0x2f, 0xb0, - 0x26, 0xf9, 0x05, 0xf0, 0xae, 0x7d, 0xbf, 0x57, 0xb6, 0x16, 0x79, 0xa8, - 0x2b, 0x1c, 0xa6, 0x3b, - 0xa9, 0x49, 0xa1, 0x85, 0xd6, 0x85, 0x49, 0x4c, 0xba, 0x30, 0x65, 0xba, - 0x70, 0x9c, 0x6d, 0xa8, - 0x5e, 0x33, 0x77, 0x52, 0xaa, 0xe7, 0x79, 0xbf, 0x89, 0xd6, 0xb5, 0x75, - 0x7d, 0xf3, 0xb4, 0x78, - 0xe8, 0xd1, 0x42, 0xf6, 0x19, 0x85, 0x7d, 0xa7, 0x8f, 0x43, 0xea, 0xc5, - 0xb9, 0x2e, 0x80, 0x16, - 0xc5, 0xa9, 0x0b, 0xc5, 0x43, 0x55, 0xce, 0x2b, 0x1d, 0xa8, 0x45, 0x90, - 0x6b, 0xc8, 0x74, 0xb2, - 0x33, 0x76, 0xfe, 0x38, 0x95, 0xe8, 0xfa, 0x88, 0xb3, 0x36, 0xbc, 0x7e, - 0x18, 0xd7, 0x85, 0xcd, - 0xc3, 0x38, 0x75, 0x41, 0x75, 0x7e, 0xe5, 0xcf, 0xe3, 0xd3, 0x7c, 0xd8, - 0x79, 0x87, 0xeb, 0x7a, - 0xee, 0xb8, 0x54, 0x07, 0xfd, 0xf0, 0xea, 0x3a, 0xbb, 0x97, 0x65, 0xbe, - 0xc1, 0xfc, 0xe3, 0x36, - 0xd7, 0x75, 0xa6, 0x33, 0x98, 0x3d, 0xb0, 0x11, 0x6d, 0x0f, 0x34, 0x95, - 0x9f, 0x47, 0x84, 0x16, - 0x6d, 0x8c, 0xe1, 0xd9, 0xc8, 0x74, 0xc1, 0xd1, 0xf5, 0x4d, 0x8f, 0xae, - 0xf3, 0x3d, 0x03, 0xba, - 0xce, 0xee, 0xb3, 0x30, 0x4d, 0xb7, 0x42, 0x7f, 0xef, 0x91, 0xf6, 0x80, - 0x7a, 0xdf, 0xc1, 0x1e, - 0x50, 0x3e, 0x8f, 0x03, 0x9e, 0x8d, 0x5c, 0xd7, 0xc7, 0xd9, 0x76, 0x6e, - 0xc1, 0x9e, 0x51, 0xee, - 0xfd, 0x7f, 0x51, 0xac, 0x71, 0x5d, 0x9f, 0xae, 0x74, 0xdd, 0x5f, 0x93, - 0xcc, 0xf6, 0x40, 0x5d, - 0xb6, 0x07, 0x80, 0x81, 0xa0, 0xcf, 0xd9, 0xb3, 0xda, 0xe2, 0xe0, 0xc3, - 0x19, 0x65, 0x13, 0x77, - 0x5e, 0xa8, 0x3d, 0xd0, 0x35, 0x61, 0xaf, 0x09, 0x6b, 0x02, 0xbf, 0x2b, - 0xad, 0x0f, 0x6b, 0xa1, - 0xb7, 0x73, 0xbe, 0xe7, 0x35, 0xfc, 0x5e, 0x0b, 0x27, 0xec, 0x3c, 0xc2, - 0x7e, 0xf7, 0xe9, 0x55, - 0xed, 0xbc, 0x21, 0xd1, 0x05, 0xd0, 0xa2, 0xfb, 0xa8, 0x0b, 0xc1, 0x67, - 0xe6, 0xb5, 0xf9, 0x7b, - 0xec, 0xf7, 0x0a, 0xcf, 0xb8, 0x9c, 0x44, 0xd7, 0x73, 0x96, 0xae, 0xfb, - 0x7f, 0xaf, 0xd8, 0x73, - 0x3a, 0x5a, 0x17, 0xce, 0x0a, 0x87, 0xea, 0x73, 0x7a, 0xa9, 0x59, 0x9a, - 0x87, 0x3c, 0x1b, 0x41, - 0xd7, 0x47, 0x50, 0xf3, 0x59, 0xaa, 0x6d, 0x9e, 0x15, 0x7d, 0xcf, 0x6b, - 0x71, 0x5e, 0xcf, 0x58, - 0xe7, 0x75, 0xed, 0x45, 0xd0, 0x05, 0x71, 0x66, 0x46, 0xbc, 0x26, 0xec, - 0x81, 0x89, 0xd6, 0x02, - 0x5d, 0xd7, 0x67, 0xb9, 0x66, 0xb0, 0xae, 0xeb, 0x4d, 0x78, 0x4e, 0x65, - 0x14, 0x35, 0x5b, 0xfc, - 0xcc, 0x7c, 0x1f, 0x75, 0x41, 0xfa, 0x6c, 0xf4, 0x3e, 0x8f, 0xc5, 0x79, - 0x7d, 0x9a, 0x6b, 0xe5, - 0x4f, 0x5c, 0xe7, 0xf5, 0x5b, 0x70, 0xc6, 0x75, 0xeb, 0xba, 0xb6, 0x7e, - 0x5e, 0xef, 0xe3, 0xf6, - 0x40, 0xea, 0x3a, 0x7b, 0x20, 0x20, 0xe7, 0xcf, 0xcf, 0xe9, 0x92, 0x7e, - 0x13, 0xc8, 0x9b, 0x72, - 0x5d, 0x67, 0x6b, 0xe6, 0xfa, 0xbd, 0xd8, 0xba, 0xde, 0xd0, 0xa1, 0x57, - 0xd5, 0x3e, 0xaf, 0xc3, - 0x1e, 0x38, 0x93, 0x9f, 0x99, 0x39, 0x07, 0xc6, 0xc5, 0x83, 0xe1, 0xbe, - 0x0b, 0x7b, 0x26, 0xa4, - 0x82, 0xd6, 0xe2, 0x21, 0x58, 0x93, 0x8d, 0xb5, 0x5e, 0x79, 0x6b, 0x2d, - 0x8e, 0x37, 0x1b, 0x25, - 0x9f, 0xef, 0xc2, 0x7f, 0xaf, 0xee, 0xb5, 0xf0, 0xfb, 0x2e, 0x2a, 0x5d, - 0x18, 0x61, 0xfd, 0x77, - 0x85, 0x2e, 0xb8, 0xce, 0xcc, 0x61, 0xf1, 0x2e, 0xfe, 0xbc, 0x9e, 0x15, - 0x9a, 0x6c, 0x6d, 0x6b, - 0x81, 0xcf, 0xeb, 0xe9, 0xca, 0x0f, 0x13, 0xba, 0xa0, 0x88, 0x3d, 0x31, - 0x6d, 0x8d, 0x53, 0x17, - 0xf8, 0xb3, 0x51, 0x55, 0xaf, 0x02, 0xfe, 0xd2, 0x05, 0xf8, 0x2e, 0xa9, - 0x8e, 0xd0, 0x75, 0xdf, - 0xf3, 0xda, 0xd6, 0x75, 0xf6, 0xef, 0x70, 0x4e, 0xd7, 0x7a, 0xe1, 0xbe, - 0x4b, 0x24, 0x5d, 0x50, - 0xe5, 0x01, 0x91, 0xe7, 0xf4, 0xb5, 0x67, 0x23, 0xd7, 0xf5, 0xcc, 0xba, - 0x1f, 0x76, 0xab, 0xc4, - 0xfd, 0x30, 0xb7, 0xae, 0xfb, 0xef, 0x25, 0xde, 0x3d, 0xc0, 0xf6, 0xdd, - 0x99, 0x54, 0x17, 0x70, - 0x31, 0xac, 0x9e, 0x38, 0xaf, 0x83, 0xae, 0xc3, 0x67, 0xc3, 0x1f, 0x53, - 0x72, 0xce, 0xeb, 0xf6, - 0xbd, 0x0c, 0x73, 0x1d, 0xfc, 0x1e, 0x48, 0xe3, 0xf6, 0x80, 0x6a, 0x06, - 0x65, 0x94, 0x18, 0xd6, - 0x22, 0xd3, 0x10, 0xba, 0x5e, 0xac, 0xaf, 0x9f, 0xd7, 0x73, 0x5c, 0xd7, - 0xe1, 0x77, 0x96, 0x91, - 0xd5, 0xa0, 0x0c, 0xd8, 0xf9, 0x63, 0xc2, 0x7e, 0xb7, 0x16, 0x07, 0xdf, - 0x3a, 0x53, 0x5a, 0xcf, - 0xeb, 0x5c, 0x70, 0x8d, 0x65, 0x5c, 0xe7, 0x85, 0x58, 0xd7, 0x44, 0x13, - 0xbe, 0x0b, 0xdb, 0x2f, - 0xc5, 0x33, 0x9f, 0x4f, 0x69, 0xad, 0x05, 0x8f, 0xaf, 0x81, 0xae, 0x5b, - 0xba, 0xa0, 0x3c, 0xbf, - 0x8e, 0x23, 0xe8, 0x82, 0xca, 0x7f, 0x47, 0x9e, 0x99, 0x85, 0xef, 0xa2, - 0x83, 0xef, 0x62, 0xc7, - 0xd7, 0x1a, 0x6b, 0xf1, 0x35, 0xa6, 0xeb, 0x5c, 0x17, 0xc4, 0x7c, 0x13, - 0x43, 0x75, 0x66, 0x8e, - 0x4b, 0x17, 0x72, 0x98, 0x33, 0x33, 0x68, 0x91, 0xef, 0xd9, 0x18, 0x18, - 0x5f, 0x13, 0x5a, 0x58, - 0x2b, 0xb0, 0xe7, 0xb5, 0x2f, 0xbe, 0x66, 0xac, 0xf9, 0xef, 0xc3, 0x2b, - 0xc5, 0xf5, 0x82, 0x75, - 0x61, 0x79, 0xbd, 0xd8, 0xb6, 0xe3, 0x87, 0xb1, 0x7b, 0x29, 0x79, 0xef, - 0x65, 0x2d, 0xbe, 0x06, - 0xf7, 0x92, 0x46, 0xed, 0x01, 0x0d, 0xb9, 0x07, 0x72, 0x11, 0x62, 0xdb, - 0xea, 0xd7, 0x84, 0x3d, - 0x00, 0xe7, 0x03, 0x59, 0x7c, 0x8d, 0xeb, 0x3a, 0xd3, 0x16, 0x6b, 0x0f, - 0x18, 0xaa, 0x73, 0x7a, - 0x5c, 0x7b, 0xe0, 0x4a, 0xb1, 0x6d, 0x91, 0x2b, 0x58, 0x3f, 0xaf, 0xb3, - 0x7b, 0x81, 0x3d, 0x00, - 0xe7, 0x75, 0x79, 0xbd, 0xb8, 0xfd, 0x5c, 0x48, 0x77, 0x80, 0x81, 0x0f, - 0x97, 0x73, 0x26, 0x84, - 0xff, 0xbf, 0xd0, 0x5b, 0x99, 0x09, 0xfb, 0xde, 0x81, 0x88, 0x15, 0x6a, - 0xc3, 0x6c, 0x27, 0xb7, - 0xc8, 0xb4, 0x94, 0xb9, 0x94, 0x59, 0xae, 0xa5, 0x8f, 0x15, 0x9f, 0xdd, - 0x23, 0xcd, 0x80, 0xd7, - 0x61, 0x7b, 0x34, 0x7c, 0x66, 0xeb, 0x48, 0x67, 0xaf, 0x99, 0x56, 0xbf, - 0xe6, 0x9c, 0xbd, 0xe6, - 0x88, 0x69, 0x9c, 0xad, 0xeb, 0x4b, 0xef, 0x7c, 0x13, 0xb8, 0x97, 0x2c, - 0xbb, 0x17, 0xb8, 0x47, - 0x8b, 0xff, 0x2a, 0xf7, 0x5d, 0xc6, 0xec, 0x35, 0xe7, 0xca, 0xd7, 0x34, - 0x32, 0x8b, 0x5c, 0x2b, - 0x3b, 0x54, 0x7c, 0x76, 0x8f, 0x52, 0x06, 0xbc, 0xbe, 0x6a, 0x8f, 0x6a, - 0x13, 0xf6, 0x9a, 0xb3, - 0x54, 0xdb, 0x7b, 0xc6, 0xe5, 0xcc, 0xb2, 0xb6, 0xcd, 0x2c, 0x73, 0x9f, - 0xd7, 0xb3, 0x53, 0x31, - 0xb7, 0x4a, 0x3b, 0x0a, 0x60, 0x7a, 0x33, 0xdd, 0xc9, 0x1d, 0xeb, 0x4d, - 0xd5, 0x79, 0x41, 0x9b, - 0xe4, 0xda, 0xbe, 0xd7, 0x0c, 0x7c, 0xbe, 0x64, 0xd9, 0x5a, 0xa6, 0x55, - 0x7b, 0x74, 0xc0, 0x5e, - 0x53, 0x70, 0x25, 0x25, 0xbe, 0x4b, 0xaa, 0x9b, 0x1a, 0x33, 0x6d, 0x67, - 0x6b, 0xe6, 0xbf, 0x17, - 0x7d, 0x26, 0xe2, 0x30, 0x3c, 0x9e, 0xcd, 0xd7, 0x09, 0x72, 0x46, 0xec, - 0x35, 0x55, 0xf1, 0x2e, - 0xf6, 0xb9, 0xcf, 0x2d, 0xb3, 0xca, 0xcf, 0x46, 0x6a, 0xc6, 0xee, 0x73, - 0xa2, 0xb5, 0x55, 0xba, - 0xc0, 0x3f, 0x1b, 0x8a, 0xcf, 0xe3, 0xc6, 0x30, 0xdb, 0x85, 0xd7, 0x4c, - 0x8d, 0x98, 0xff, 0x31, - 0x5b, 0xff, 0xbd, 0x00, 0x63, 0x38, 0x3d, 0x4e, 0x75, 0xe0, 0x35, 0xf5, - 0xb1, 0xd6, 0x51, 0xbd, - 0x26, 0x6e, 0x0f, 0x64, 0x31, 0x7b, 0xc0, 0x10, 0x7b, 0x40, 0xb5, 0xef, - 0x7c, 0x9f, 0xc7, 0x23, - 0xb1, 0xff, 0x33, 0x33, 0x31, 0x07, 0xc3, 0xbd, 0xff, 0xe1, 0x7e, 0x32, - 0xec, 0x77, 0xe6, 0xcf, - 0x15, 0x5c, 0x69, 0x0f, 0x9c, 0x5c, 0x69, 0x0f, 0x04, 0xde, 0x27, 0xfb, - 0x3c, 0xb6, 0x32, 0x41, - 0x9f, 0x47, 0xf7, 0x4c, 0x8f, 0x25, 0xfb, 0xdd, 0x48, 0xb5, 0x4c, 0x5b, - 0xab, 0x3d, 0xcb, 0x59, - 0xba, 0x20, 0x7e, 0xaf, 0x59, 0xef, 0xef, 0x15, 0xbe, 0x1f, 0x7e, 0xaf, - 0x53, 0xf0, 0x6b, 0x9c, - 0xb8, 0xa9, 0xf1, 0x40, 0x74, 0x61, 0x7c, 0xc5, 0x35, 0xf1, 0xcd, 0x37, - 0x71, 0xee, 0xe5, 0x04, - 0xd6, 0x22, 0xeb, 0xd1, 0x75, 0xff, 0xbd, 0x60, 0x75, 0x41, 0xbf, 0xbe, - 0x2e, 0xb8, 0xce, 0x62, - 0xec, 0x35, 0xa7, 0x92, 0xd7, 0xec, 0x09, 0x66, 0x59, 0x9a, 0x69, 0x9e, - 0x7e, 0x12, 0xa0, 0xeb, - 0x53, 0xb8, 0x97, 0x54, 0xd7, 0x99, 0x6f, 0x30, 0xc8, 0x74, 0x5f, 0x04, - 0x5d, 0xc0, 0x3f, 0x1b, - 0xd9, 0x7d, 0xc2, 0x33, 0x8a, 0xeb, 0xfa, 0xa9, 0x4f, 0xd7, 0xad, 0x79, - 0x84, 0xd6, 0x6b, 0x76, - 0x63, 0xd0, 0x05, 0x33, 0x8a, 0x2e, 0xa4, 0x30, 0x9f, 0xc7, 0xd5, 0xb3, - 0x71, 0xa5, 0xeb, 0x73, - 0xaf, 0x16, 0xf2, 0xf3, 0xc4, 0xdc, 0xa5, 0xeb, 0x81, 0x73, 0x27, 0x90, - 0xba, 0xc0, 0x5f, 0x53, - 0xbd, 0x07, 0x32, 0x32, 0x5d, 0x08, 0x7a, 0x36, 0xae, 0xbf, 0xa6, 0x01, - 0xef, 0xd3, 0xd6, 0x75, - 0xcf, 0x9e, 0xb1, 0x75, 0x1d, 0x72, 0x05, 0x7d, 0xcf, 0xcc, 0x5c, 0xdc, - 0xb3, 0xb1, 0x8f, 0xdc, - 0x03, 0x93, 0x90, 0x3d, 0xe0, 0xfb, 0x3c, 0xaa, 0x9e, 0x8d, 0x1a, 0x7f, - 0x36, 0xc2, 0x39, 0x76, - 0x5d, 0xd7, 0xe1, 0x5e, 0x14, 0xe7, 0x05, 0x03, 0xce, 0xfb, 0x7c, 0x2d, - 0x7c, 0xbf, 0x57, 0xf8, - 0x3a, 0xfb, 0x79, 0xbd, 0x36, 0x3f, 0x78, 0x75, 0x5e, 0x68, 0xc5, 0xb6, - 0x26, 0xa0, 0x0b, 0x33, - 0xed, 0x5a, 0x6b, 0xe2, 0xfe, 0xbd, 0xae, 0xdd, 0x8b, 0x98, 0x09, 0xe0, - 0xf9, 0xbd, 0xf2, 0xd7, - 0xc4, 0xea, 0x42, 0x5f, 0xa5, 0x0b, 0x19, 0x94, 0x2e, 0x60, 0xcf, 0x0b, - 0xa0, 0x7f, 0x70, 0xbe, - 0x08, 0x7a, 0x5e, 0x3b, 0xba, 0x3e, 0x76, 0x5e, 0xd3, 0xb8, 0xb6, 0x2e, - 0xf4, 0xc4, 0x1e, 0x8d, - 0xa8, 0x0b, 0xb8, 0x33, 0x33, 0x3c, 0xa3, 0x6c, 0x5d, 0xf7, 0x9c, 0xd7, - 0x75, 0x7e, 0x4f, 0xd9, - 0x89, 0x4f, 0xd7, 0xef, 0xab, 0x2e, 0x80, 0xfe, 0xe9, 0x98, 0x33, 0x8a, - 0xec, 0xd9, 0x68, 0xd8, - 0xbe, 0x47, 0xe0, 0x79, 0x7d, 0x16, 0x70, 0x5e, 0x7f, 0x11, 0x74, 0xc1, - 0x7a, 0x36, 0xaa, 0x5e, - 0xd3, 0xe0, 0xcf, 0x46, 0xf6, 0x19, 0xf2, 0xeb, 0xba, 0xe7, 0xbc, 0xde, - 0x87, 0xbc, 0x29, 0x72, - 0x0f, 0x2c, 0x91, 0x7b, 0x60, 0x82, 0xd8, 0x03, 0xe8, 0xe7, 0x31, 0xff, - 0x3c, 0x1a, 0x9a, 0x7d, - 0xae, 0x73, 0xdd, 0x4b, 0xc0, 0x9a, 0xb4, 0xc2, 0x7c, 0x17, 0xce, 0x8e, - 0x5e, 0xe6, 0xc2, 0x7e, - 0xaf, 0xe2, 0x19, 0x17, 0x45, 0x17, 0x90, 0x6b, 0x12, 0xdb, 0x19, 0x05, - 0xce, 0x0b, 0xec, 0x35, - 0x03, 0x75, 0xdd, 0xf5, 0x7b, 0x15, 0xfe, 0xbb, 0x86, 0xd3, 0x85, 0xa3, - 0x58, 0x75, 0x21, 0x92, - 0xef, 0x12, 0xa6, 0xeb, 0xf0, 0x19, 0xe7, 0x7e, 0x58, 0x3f, 0xe8, 0x19, - 0xe5, 0xd2, 0x85, 0xfb, - 0xe7, 0xbf, 0x47, 0xf3, 0x5d, 0xdc, 0x7e, 0xd8, 0x52, 0xa2, 0xeb, 0x3e, - 0x3f, 0x2c, 0x85, 0x39, - 0xa7, 0xf7, 0xac, 0x73, 0x7a, 0x1f, 0x73, 0x4e, 0xcf, 0xb6, 0x70, 0xe7, - 0x74, 0xc5, 0xe7, 0x91, - 0x9d, 0x1d, 0xe0, 0xf3, 0x98, 0x99, 0x05, 0xc7, 0x61, 0x32, 0xf6, 0x79, - 0xfd, 0xc5, 0xda, 0x03, - 0xd8, 0xe7, 0x31, 0x7f, 0x36, 0x6a, 0x86, 0x3f, 0x57, 0xe0, 0x9c, 0x71, - 0xd9, 0xef, 0x85, 0x6b, - 0xae, 0x2c, 0x0e, 0x13, 0x2d, 0x86, 0xc5, 0xfd, 0xf7, 0xa8, 0x7b, 0x20, - 0xe2, 0xbe, 0x73, 0xb4, - 0xec, 0x2a, 0x6b, 0xc2, 0xcf, 0x0b, 0x96, 0xef, 0xe2, 0x9f, 0x1f, 0xec, - 0xf8, 0x61, 0x43, 0xf1, - 0xbb, 0x8f, 0x29, 0xae, 0x77, 0x1f, 0xd6, 0xc4, 0xd9, 0x2f, 0x2b, 0x5d, - 0x5f, 0x04, 0xf8, 0x2e, - 0xa0, 0x85, 0x43, 0x85, 0xef, 0xf2, 0x20, 0x74, 0x21, 0xe0, 0x9c, 0x1e, - 0x14, 0x87, 0x71, 0xfb, - 0x61, 0x6b, 0xbe, 0x8b, 0xeb, 0x79, 0xbd, 0x7a, 0xbf, 0xd6, 0x79, 0x21, - 0x56, 0xff, 0x5d, 0x8b, - 0xc7, 0x77, 0x19, 0x31, 0x5d, 0x60, 0xf7, 0x29, 0x3b, 0xaf, 0xdb, 0xba, - 0xce, 0x75, 0x61, 0xfc, - 0x60, 0x75, 0x81, 0xef, 0x01, 0x55, 0x6c, 0xdb, 0x3a, 0xa7, 0x8b, 0xd9, - 0x8c, 0xf2, 0xf8, 0x1a, - 0xec, 0x19, 0xfe, 0x3c, 0x96, 0xc7, 0xd7, 0x56, 0x71, 0xbd, 0xfb, 0xab, - 0x0b, 0xb8, 0x18, 0x96, - 0xf4, 0xbc, 0xee, 0xd6, 0x75, 0x6d, 0xed, 0xbc, 0x7e, 0x3f, 0xf6, 0x40, - 0x3c, 0xb1, 0xed, 0x6b, - 0xfa, 0x2e, 0x41, 0xf1, 0x35, 0x38, 0x7b, 0xc0, 0xb3, 0x2f, 0x24, 0xbe, - 0xf6, 0xf0, 0xad, 0x89, - 0xeb, 0x19, 0xb7, 0x74, 0xed, 0x39, 0x59, 0x7c, 0xed, 0x45, 0xd2, 0x05, - 0x64, 0xbc, 0xdf, 0x80, - 0xf3, 0x6b, 0x6e, 0xce, 0x7c, 0x97, 0xb0, 0xbc, 0x89, 0xed, 0xbb, 0xc4, - 0x19, 0xd7, 0x43, 0xfa, - 0xef, 0x38, 0x2d, 0xb2, 0x7d, 0x97, 0xe0, 0xf8, 0x1a, 0xbf, 0x17, 0xf6, - 0xd9, 0xd0, 0x27, 0xa9, - 0xf6, 0x2a, 0x6f, 0xf2, 0x22, 0xe9, 0x02, 0x2e, 0xae, 0x67, 0x48, 0xcf, - 0xeb, 0x4b, 0xaf, 0xae, - 0xfb, 0xbf, 0x2f, 0x13, 0xeb, 0x1e, 0xd0, 0xe3, 0xc9, 0x79, 0x81, 0xae, - 0x8f, 0xc5, 0x73, 0x2a, - 0x30, 0x0e, 0x33, 0x5e, 0x9d, 0xd7, 0x5f, 0x84, 0x3d, 0x80, 0x3b, 0x33, - 0xc7, 0x95, 0x07, 0x84, - 0xb5, 0x08, 0x8a, 0x9b, 0x5a, 0xb1, 0xc6, 0xa0, 0x1c, 0x52, 0x68, 0xbc, - 0xff, 0x7e, 0xae, 0x09, - 0xd2, 0x77, 0xc9, 0x86, 0xc5, 0xd7, 0x40, 0xd7, 0x47, 0x99, 0x58, 0x75, - 0x21, 0xc6, 0x3c, 0xe0, - 0x2a, 0xae, 0xe7, 0xce, 0x9b, 0xac, 0x3d, 0xaf, 0x6d, 0xdf, 0x25, 0x64, - 0x2e, 0xf4, 0x83, 0xd1, - 0x05, 0x6c, 0xbc, 0x5f, 0x9c, 0xd7, 0x15, 0x79, 0x93, 0x35, 0x3f, 0xcc, - 0x8e, 0xeb, 0xc5, 0xa7, - 0x0b, 0x38, 0x2d, 0x0a, 0x7f, 0x36, 0x8a, 0x7b, 0x61, 0xbf, 0x27, 0x3b, - 0xd6, 0x29, 0xcf, 0x87, - 0x47, 0x8a, 0xeb, 0xa9, 0xfd, 0xf7, 0x19, 0x5e, 0x8b, 0x94, 0x31, 0x2c, - 0xfe, 0x9a, 0x99, 0x96, - 0x52, 0xd7, 0xe7, 0xd6, 0x73, 0x2a, 0xec, 0xf7, 0x8e, 0x7c, 0x36, 0x6a, - 0x51, 0xce, 0xe9, 0x23, - 0xcc, 0xdc, 0x8f, 0x58, 0xd7, 0xc4, 0xd0, 0xc6, 0x59, 0x91, 0x77, 0x09, - 0x8a, 0xaf, 0xb9, 0xfa, - 0x4d, 0x44, 0xbc, 0x7f, 0x23, 0x96, 0x58, 0x67, 0xac, 0x79, 0x40, 0x4b, - 0x8b, 0x78, 0xbd, 0x4f, - 0x58, 0xde, 0x04, 0xf6, 0xe0, 0xc2, 0xe3, 0xbb, 0x5c, 0x2f, 0xae, 0x77, - 0xbf, 0xf3, 0x80, 0xbd, - 0x00, 0x3f, 0xec, 0x34, 0x3c, 0xbe, 0x86, 0xd7, 0x85, 0x8d, 0xb8, 0x74, - 0x01, 0x17, 0xef, 0xef, - 0x89, 0x9a, 0x4f, 0x1e, 0xa7, 0x08, 0x8b, 0xaf, 0x81, 0xae, 0x0f, 0x91, - 0xb9, 0xf0, 0xd8, 0xcf, - 0x28, 0x19, 0xd4, 0x6b, 0xea, 0xec, 0x8c, 0x22, 0x8d, 0xaf, 0x2d, 0x85, - 0xef, 0x21, 0xe2, 0x97, - 0xe1, 0x35, 0x5b, 0x1b, 0x71, 0xea, 0xc2, 0xd5, 0x63, 0xdb, 0xae, 0x3a, - 0xa7, 0xf5, 0x3d, 0x93, - 0x9d, 0x85, 0xe4, 0xc3, 0x23, 0xed, 0x01, 0xdc, 0xf3, 0x38, 0x2c, 0xb6, - 0xfd, 0xff, 0x03, 0x75, - 0x97, 0x23, 0xba -}; +/******************************************************************* + * Image File : genplus.bmp + * Width : 640 + * Height : 480 + * + * This header contains a compressed Zip image. + * Use zlib1.2.3 uncompress function to restore. + * + * Backdrop design by brakken[at]tehskeen.com + *******************************************************************/ + +#define gpback_RAW 614400 +#define gpback_COMPRESSED 71779 +#define gpback_WIDTH 640 +#define gpback_HEIGHT 480 + +unsigned char gpback[71779] = { + 0x78, 0xda, 0xe4, 0xbd, 0x07, 0x98, 0x1b, 0xd5, 0xbd, 0x3e, 0xec, 0x6d, + 0xd2, 0x6a, 0xab, 0xa4, + 0x5d, 0x77, 0x1b, 0xdb, 0xb8, 0x62, 0x3a, 0x06, 0x4c, 0xef, 0x10, 0x20, + 0xa1, 0x04, 0x48, 0x4c, + 0x35, 0x60, 0x8c, 0x6d, 0xc0, 0x75, 0x8b, 0xa4, 0xd1, 0xcc, 0x29, 0x53, + 0x34, 0x55, 0x7d, 0x7b, + 0x5f, 0xdb, 0x60, 0x1b, 0x30, 0xcd, 0x74, 0x02, 0x09, 0x1d, 0x17, 0x6c, + 0x53, 0x43, 0x0d, 0x10, + 0x48, 0x21, 0xe5, 0xa6, 0x53, 0x6e, 0x72, 0xef, 0xe5, 0x3b, 0x67, 0xb4, + 0x45, 0xbb, 0xab, 0x32, + 0xbb, 0x96, 0xcd, 0xff, 0x79, 0x3e, 0xf6, 0x39, 0x8c, 0x56, 0xd6, 0x6a, + 0xe6, 0x9c, 0x99, 0xf3, + 0x9e, 0xf7, 0xf7, 0xfe, 0xca, 0x19, 0x87, 0xc7, 0xa5, 0xfd, 0xc9, 0x53, + 0x6c, 0xc0, 0x6e, 0x14, + 0xb0, 0x49, 0xef, 0xa1, 0x3c, 0x31, 0x1f, 0xe6, 0x2b, 0x05, 0xa0, 0xc8, + 0xb0, 0xb1, 0xf6, 0x88, + 0xdd, 0x6f, 0x8f, 0x92, 0x46, 0x8f, 0x61, 0x9b, 0xdf, 0xa6, 0x17, 0xb2, + 0x05, 0x72, 0x3e, 0xc8, + 0x13, 0xf3, 0x60, 0x1e, 0x3f, 0x0e, 0x0d, 0xf9, 0x36, 0x21, 0x1f, 0xd9, + 0xc3, 0x76, 0xff, 0x88, + 0xf7, 0x87, 0x9f, 0x53, 0x25, 0xe7, 0xd4, 0xf3, 0xb9, 0x4c, 0x9f, 0xa1, + 0xd7, 0x51, 0x18, 0xb2, + 0xb3, 0x85, 0xd2, 0x38, 0x98, 0xf1, 0x53, 0x62, 0x01, 0xa4, 0xd7, 0x95, + 0x87, 0x53, 0x9f, 0x33, + 0x4f, 0xc8, 0x83, 0xf9, 0x72, 0x01, 0x28, 0x34, 0xec, 0x23, 0xfb, 0x62, + 0x14, 0xb1, 0x05, 0x4a, + 0x3e, 0xc8, 0x1f, 0xec, 0x0b, 0x2a, 0x0a, 0xd9, 0xfd, 0x05, 0xd9, 0xce, + 0x29, 0x91, 0x73, 0x86, + 0x6c, 0xfe, 0x71, 0x38, 0x73, 0x3f, 0xf3, 0x35, 0x3b, 0x67, 0xd7, 0xf2, + 0x32, 0xf7, 0x93, 0xcf, + 0x43, 0x36, 0x32, 0x66, 0x05, 0x62, 0xb6, 0x73, 0x16, 0x92, 0x73, 0x16, + 0xb1, 0xf9, 0x01, 0xd2, + 0x17, 0xbd, 0x88, 0xa3, 0x7f, 0x33, 0xd8, 0x17, 0xbb, 0xdf, 0x16, 0x2c, + 0x62, 0x0b, 0xd5, 0x02, + 0xce, 0x3c, 0xa7, 0x6a, 0x9e, 0x13, 0x65, 0x3b, 0x67, 0xbe, 0x98, 0xf9, + 0xfa, 0xc7, 0x05, 0x0a, + 0x81, 0x3d, 0x58, 0xc8, 0x66, 0xb9, 0x4f, 0x38, 0x5f, 0xb7, 0x73, 0x36, + 0x25, 0x0f, 0x64, 0xed, + 0x27, 0xb9, 0xd6, 0x7c, 0xa1, 0xef, 0x9c, 0xe4, 0xf7, 0x7c, 0x29, 0x1f, + 0x16, 0x68, 0x85, 0x9c, + 0x2d, 0xd4, 0xd7, 0x97, 0x68, 0xa2, 0x2f, 0xf4, 0xde, 0x98, 0x7d, 0x91, + 0xe8, 0x7d, 0xc9, 0x43, + 0xa9, 0xfa, 0x52, 0x40, 0xee, 0xa7, 0x4d, 0x1e, 0x97, 0xf9, 0x9c, 0xf4, + 0x79, 0x24, 0xe7, 0xcc, + 0x13, 0xb2, 0x3c, 0x8f, 0x23, 0xe7, 0x40, 0xea, 0xe7, 0x31, 0x68, 0x67, + 0x8b, 0x02, 0xa9, 0xee, + 0x53, 0x1e, 0xca, 0xa3, 0x7d, 0x51, 0x49, 0x5f, 0x82, 0x43, 0xe7, 0x8c, + 0x2d, 0x64, 0x63, 0x8b, + 0xf4, 0x42, 0x2e, 0x3f, 0x90, 0x0f, 0xc9, 0xb3, 0x38, 0xd0, 0x97, 0xc4, + 0x39, 0x73, 0x35, 0x07, + 0xe8, 0xbc, 0x4b, 0x3f, 0x07, 0x92, 0xe6, 0x1d, 0x97, 0x75, 0xde, 0x91, + 0xf1, 0xa6, 0x73, 0xa0, + 0x88, 0xdc, 0x97, 0xa2, 0x61, 0x7d, 0xa1, 0xcf, 0x7c, 0x11, 0x9d, 0xff, + 0x01, 0x32, 0xff, 0xc9, + 0x73, 0x68, 0x7d, 0x0e, 0xe4, 0xe7, 0x74, 0x0e, 0x64, 0x7d, 0x1e, 0x93, + 0xe6, 0x40, 0x9e, 0x90, + 0x0f, 0x0f, 0x60, 0x4c, 0x4c, 0x2c, 0x34, 0xef, 0x6b, 0xb8, 0x6f, 0x0c, + 0x92, 0xc7, 0x82, 0x8c, + 0x91, 0x39, 0x16, 0xfd, 0xf7, 0x55, 0x1c, 0x0d, 0x2e, 0x7c, 0x0f, 0x63, + 0x42, 0xfa, 0x99, 0x12, + 0xd7, 0x43, 0x7d, 0xb8, 0x4e, 0xfa, 0x42, 0xe7, 0x62, 0xd6, 0x73, 0x52, + 0x5c, 0x08, 0x59, 0xc4, + 0x05, 0x75, 0x94, 0xb8, 0x90, 0xee, 0x3e, 0xc9, 0x45, 0xc9, 0x58, 0x84, + 0x06, 0x70, 0x5d, 0x1f, + 0xbe, 0x46, 0x25, 0xb0, 0x70, 0x18, 0xae, 0xa7, 0xc4, 0x85, 0xfc, 0xdc, + 0xe2, 0x82, 0x35, 0x2c, + 0x4a, 0x79, 0x3d, 0x04, 0x0b, 0xfb, 0x71, 0x3d, 0x94, 0x02, 0xd7, 0x15, + 0x82, 0x85, 0x49, 0x6b, + 0xd4, 0x00, 0x2e, 0x04, 0xac, 0xe0, 0x42, 0xae, 0xd6, 0x63, 0x13, 0x17, + 0xb2, 0x63, 0x91, 0x94, + 0x58, 0x8f, 0x87, 0xe0, 0xfa, 0x40, 0x5f, 0x6c, 0x6c, 0x3f, 0xae, 0xe7, + 0xab, 0x07, 0x65, 0x0e, + 0xa0, 0x6c, 0xcf, 0xa3, 0xd5, 0xf5, 0x38, 0xf1, 0x6c, 0x24, 0xe3, 0xfa, + 0xd0, 0x35, 0xca, 0xc4, + 0xf9, 0x50, 0x91, 0x9f, 0xae, 0x61, 0xc9, 0xb8, 0x9e, 0xf2, 0x9c, 0xea, + 0x68, 0xce, 0x99, 0xe1, + 0x67, 0xe8, 0x1c, 0x48, 0xfb, 0x63, 0x69, 0x6d, 0x1c, 0x0d, 0x47, 0xc1, + 0x7d, 0xf7, 0x81, 0xf0, + 0xbe, 0x54, 0xeb, 0x35, 0x1d, 0x8b, 0x22, 0x8d, 0xdc, 0x57, 0x65, 0x80, + 0x2f, 0xa0, 0x9c, 0xe0, + 0xc2, 0xc1, 0x1b, 0x93, 0x01, 0x5c, 0x37, 0xd7, 0xb8, 0x21, 0xdc, 0x83, + 0xae, 0x7d, 0x05, 0x43, + 0x71, 0x7d, 0x8c, 0xb8, 0x50, 0x70, 0xa0, 0xb8, 0x60, 0xed, 0x9c, 0xe9, + 0xf9, 0x7a, 0x28, 0x89, + 0xaf, 0x13, 0xbc, 0x1c, 0xe8, 0x4b, 0x3f, 0x5f, 0xc8, 0x11, 0x4f, 0x2f, + 0x1a, 0x05, 0x4f, 0xcf, + 0xf2, 0x6c, 0x20, 0xf3, 0x79, 0x24, 0xf7, 0x73, 0x04, 0xae, 0x87, 0xfa, + 0xf8, 0xba, 0x9c, 0xc0, + 0x75, 0xeb, 0x3c, 0xbd, 0xe8, 0xd0, 0xf2, 0xf4, 0xe4, 0xb5, 0xb1, 0x1f, + 0xd7, 0xb5, 0x91, 0x7c, + 0x9d, 0x5e, 0xbf, 0x4d, 0x1f, 0x81, 0xeb, 0xdf, 0x3f, 0x2e, 0x90, 0x6b, + 0x4e, 0xb9, 0x36, 0x52, + 0xbe, 0x1e, 0xa0, 0x7c, 0xbd, 0x68, 0x90, 0x0b, 0xa5, 0xc0, 0xf5, 0xe1, + 0x7d, 0xa1, 0xe7, 0xb4, + 0x34, 0x07, 0xc2, 0x07, 0x34, 0x07, 0x46, 0xac, 0xc7, 0x59, 0xd7, 0xc6, + 0xd1, 0x8c, 0x09, 0x3f, + 0xcc, 0x8e, 0xe0, 0x93, 0xd6, 0xeb, 0xf0, 0x50, 0x9b, 0xd2, 0xb4, 0x5d, + 0x94, 0x8c, 0xf7, 0x15, + 0x7d, 0x5f, 0x63, 0x92, 0xd2, 0x76, 0x49, 0xb6, 0xc3, 0x86, 0x61, 0xa1, + 0x79, 0x5f, 0x29, 0xae, + 0xd3, 0x35, 0x2e, 0xc9, 0x0e, 0xcb, 0x39, 0x2e, 0x58, 0xe1, 0xcc, 0xaa, + 0xdd, 0x92, 0xed, 0x62, + 0x0b, 0xf7, 0xdb, 0x2e, 0x49, 0x6b, 0x54, 0x92, 0x1d, 0xd6, 0x67, 0xbb, + 0xf4, 0x9f, 0x13, 0x1f, + 0x5a, 0x5c, 0x28, 0xb2, 0xc4, 0x99, 0xed, 0xca, 0x38, 0x6e, 0x08, 0xae, + 0xa7, 0xb0, 0xc3, 0xe8, + 0x39, 0x0b, 0x87, 0xe3, 0xfa, 0x88, 0x73, 0x5a, 0xc4, 0x05, 0x9d, 0xcc, + 0x01, 0x65, 0x8c, 0xb8, + 0x30, 0x82, 0xa7, 0x93, 0x67, 0x23, 0x38, 0xe2, 0x79, 0x44, 0x54, 0x2f, + 0x4a, 0xe8, 0x30, 0x19, + 0x70, 0x5d, 0x18, 0xc6, 0xd7, 0x0f, 0xd5, 0x1c, 0x18, 0xed, 0xbc, 0x23, + 0x63, 0x51, 0xa0, 0x11, + 0xbb, 0x31, 0x9c, 0xb8, 0x0f, 0x43, 0x38, 0xae, 0x61, 0xf2, 0xf5, 0x84, + 0xed, 0x21, 0xe4, 0xe5, + 0x72, 0x6d, 0x24, 0xf3, 0xce, 0xc2, 0x1c, 0x48, 0xf0, 0xf4, 0xec, 0x6b, + 0x63, 0x8e, 0xc6, 0x24, + 0xd9, 0x0e, 0x1b, 0x8e, 0x85, 0x89, 0xb1, 0x18, 0x61, 0x87, 0x7d, 0x2f, + 0x63, 0x62, 0xb3, 0x32, + 0x26, 0x81, 0x42, 0x13, 0x17, 0x32, 0xea, 0x6b, 0xf4, 0x39, 0xfe, 0xbe, + 0x70, 0x61, 0x34, 0x76, + 0x44, 0x06, 0x7d, 0xad, 0xcf, 0x76, 0x61, 0x87, 0xe3, 0x7a, 0x6a, 0x5c, + 0xc8, 0xce, 0xd3, 0x0f, + 0x00, 0x17, 0x70, 0xaa, 0xb5, 0x71, 0xe4, 0x7a, 0x3c, 0xcc, 0x0e, 0x8b, + 0x24, 0xf5, 0x25, 0x8d, + 0xbe, 0xf6, 0xbd, 0xe0, 0x82, 0xb5, 0xb5, 0xd1, 0xc4, 0x75, 0x93, 0xff, + 0x65, 0xd2, 0xd7, 0x28, + 0xae, 0x7f, 0x1f, 0x73, 0xc0, 0xa2, 0xb6, 0x9d, 0xd7, 0x67, 0xbf, 0x53, + 0x7d, 0x2d, 0x2d, 0xae, + 0x93, 0xbe, 0x98, 0x58, 0x14, 0x48, 0xa3, 0xc3, 0x0c, 0xda, 0xef, 0x07, + 0x67, 0x0e, 0x64, 0xc5, + 0xbf, 0xbc, 0x5c, 0xea, 0xfd, 0x83, 0xb6, 0x4b, 0x26, 0x3b, 0x8c, 0xe0, + 0x87, 0x45, 0x4d, 0x23, + 0xf7, 0x63, 0x32, 0x0a, 0xbd, 0x3f, 0xbd, 0xbe, 0x66, 0xa3, 0xb6, 0x0b, + 0x3b, 0xcc, 0x76, 0x39, + 0x40, 0x5d, 0xaf, 0x20, 0x47, 0xb6, 0x4b, 0x9a, 0x39, 0x2a, 0x0c, 0xe3, + 0xeb, 0x91, 0xd4, 0xb8, + 0x3e, 0x8c, 0xaf, 0x5b, 0xc7, 0x85, 0x88, 0x45, 0x5c, 0xc8, 0x85, 0xde, + 0x4f, 0x71, 0x5d, 0x26, + 0xf7, 0x89, 0x5e, 0x7b, 0x78, 0x24, 0xae, 0x27, 0xf8, 0x7a, 0xc2, 0x6f, + 0x62, 0x49, 0xef, 0xef, + 0xd3, 0xf5, 0x0a, 0x72, 0xc5, 0xd3, 0xad, 0x68, 0xdb, 0xe4, 0x3b, 0x12, + 0x58, 0x44, 0xae, 0x33, + 0x95, 0xbe, 0xd6, 0xcf, 0xd7, 0xc9, 0xda, 0x45, 0xe7, 0x40, 0x26, 0x7d, + 0x6d, 0xb4, 0x3c, 0xfd, + 0x20, 0xfa, 0xbc, 0x12, 0x9a, 0x92, 0x52, 0x08, 0x8a, 0xb2, 0xe1, 0xfa, + 0xb0, 0xbe, 0xe4, 0x74, + 0x0e, 0xf4, 0xd9, 0xaa, 0xf9, 0xbc, 0x05, 0xfc, 0x1b, 0xcd, 0x98, 0x58, + 0xd5, 0xfb, 0x13, 0x76, + 0xc4, 0x50, 0x7d, 0x2d, 0x79, 0x2c, 0x82, 0x43, 0x6c, 0x97, 0xb4, 0xf7, + 0x35, 0x2f, 0xa7, 0x9a, + 0x86, 0xb5, 0x31, 0x49, 0xc3, 0x17, 0xac, 0xeb, 0x6b, 0x63, 0xb6, 0x5d, + 0x2c, 0xe2, 0x82, 0x25, + 0x8e, 0x92, 0xd1, 0x0f, 0x68, 0xfa, 0x4d, 0x0a, 0x74, 0x82, 0x0b, 0xe4, + 0xda, 0x53, 0xda, 0x61, + 0x03, 0x7c, 0x3d, 0xc7, 0xb8, 0x30, 0x0a, 0xfb, 0x3d, 0xfb, 0xda, 0x58, + 0x90, 0xd0, 0xfb, 0x85, + 0x74, 0x3a, 0x4c, 0xc2, 0x0e, 0x33, 0x9f, 0x0d, 0xca, 0x51, 0xd2, 0xe9, + 0x6b, 0x07, 0x69, 0x0e, + 0x8c, 0x89, 0xa3, 0x24, 0xeb, 0x6b, 0xc9, 0x7e, 0x93, 0xc8, 0x70, 0x7d, + 0x6d, 0xe4, 0x9c, 0x19, + 0x15, 0x2e, 0x58, 0xe1, 0xe9, 0x07, 0xec, 0xf3, 0x1a, 0xe4, 0xeb, 0x03, + 0xcf, 0x58, 0x32, 0x5f, + 0xa7, 0x6b, 0x54, 0x12, 0x5f, 0x37, 0xe7, 0x80, 0x9e, 0xcb, 0x39, 0x90, + 0x7d, 0xde, 0x8d, 0x06, + 0x2b, 0x2d, 0xeb, 0xfd, 0xa9, 0x74, 0x3d, 0xbe, 0x6f, 0x2c, 0x32, 0xf9, + 0x4d, 0x52, 0xd8, 0x61, + 0x96, 0x6d, 0x97, 0x43, 0xeb, 0x07, 0x34, 0xfb, 0x42, 0xfb, 0x41, 0xef, + 0x63, 0xf2, 0x7a, 0xdd, + 0xb7, 0xc6, 0x0d, 0xfa, 0x4d, 0x24, 0x6b, 0x1a, 0x5b, 0x9e, 0x36, 0x0a, + 0x5c, 0xc8, 0x91, 0xde, + 0x3f, 0x60, 0xbb, 0x64, 0xc6, 0x75, 0xae, 0x9f, 0xa3, 0x64, 0xfc, 0xbe, + 0x83, 0x8d, 0x0b, 0xd6, + 0xf4, 0xfe, 0x41, 0x7f, 0x78, 0xaa, 0x98, 0xad, 0x74, 0xfa, 0xda, 0x68, + 0xec, 0x77, 0xc5, 0xa2, + 0xfd, 0x1e, 0xcc, 0x81, 0xb6, 0xdd, 0x8f, 0xeb, 0x46, 0x0a, 0xdf, 0xbe, + 0x31, 0xd2, 0x1f, 0x6e, + 0x49, 0xef, 0xcf, 0x71, 0x6c, 0xda, 0x68, 0x34, 0xac, 0x21, 0x7e, 0x93, + 0x54, 0xfe, 0xf0, 0x41, + 0x9e, 0x8e, 0xb2, 0xfa, 0x60, 0x73, 0x64, 0xbf, 0x27, 0x3e, 0x6b, 0x07, + 0xee, 0x26, 0x57, 0x4d, + 0x36, 0xfc, 0x2b, 0x08, 0x3a, 0x7d, 0x55, 0x51, 0x9b, 0x27, 0x9b, 0x1d, + 0x51, 0xde, 0x58, 0x55, + 0x57, 0x2a, 0x8f, 0x4b, 0x3b, 0x76, 0x79, 0x42, 0x01, 0x2c, 0xd2, 0x4b, + 0x99, 0xaa, 0x66, 0x57, + 0x8d, 0xb3, 0xa9, 0xaa, 0xb6, 0xaa, 0xb5, 0xaa, 0xa6, 0xaa, 0xa5, 0xaa, + 0x86, 0x5e, 0x83, 0x33, + 0x5e, 0x5e, 0x5f, 0x1a, 0x2c, 0xf6, 0xd9, 0xe4, 0x42, 0x96, 0x3e, 0xa7, + 0x85, 0x21, 0x97, 0xb7, + 0x2a, 0x5c, 0xe8, 0xcd, 0x86, 0xdf, 0x15, 0xe4, 0x7b, 0x1c, 0x81, 0x71, + 0x99, 0xef, 0x97, 0x5c, + 0xc2, 0x56, 0x35, 0x56, 0xd4, 0x66, 0x1b, 0x93, 0xa2, 0x30, 0x39, 0x67, + 0x28, 0xcb, 0x39, 0x49, + 0x3f, 0x2b, 0xc9, 0x39, 0x8b, 0xe5, 0x7c, 0xae, 0x50, 0xb6, 0xb3, 0x8e, + 0x50, 0x99, 0xb7, 0xb2, + 0xd1, 0x9d, 0xe8, 0x0b, 0x69, 0x6e, 0xda, 0xb7, 0x86, 0x8a, 0xba, 0xb2, + 0x70, 0xa9, 0xb7, 0xaa, + 0xa1, 0xac, 0x8e, 0x3c, 0xa7, 0x20, 0xd3, 0x79, 0x6d, 0x11, 0xb7, 0xc7, + 0x15, 0xcc, 0xf7, 0x65, + 0x7e, 0x76, 0x0b, 0xa0, 0xb3, 0xb9, 0xaa, 0xd6, 0x2e, 0x65, 0x9e, 0x57, + 0x79, 0x6a, 0xb9, 0xbf, + 0xaa, 0xa1, 0xb4, 0x3e, 0xdb, 0x7d, 0x2f, 0x8e, 0xba, 0x3d, 0x95, 0x7a, + 0x1e, 0x93, 0x8c, 0x01, + 0x05, 0xb2, 0x8d, 0x73, 0x04, 0x4b, 0x7d, 0xe5, 0x0d, 0xae, 0xba, 0xfe, + 0xbe, 0xd0, 0x7b, 0xe3, + 0x6a, 0xa8, 0xac, 0x2d, 0x0f, 0x97, 0x78, 0x8b, 0x55, 0x82, 0x21, 0x22, + 0xc1, 0xf6, 0xe1, 0xb6, + 0x8b, 0x56, 0xc1, 0x54, 0xc5, 0x1d, 0xd9, 0xce, 0x89, 0x4a, 0x62, 0x55, + 0xf5, 0x15, 0xda, 0xb8, + 0xcc, 0xeb, 0x81, 0x58, 0x04, 0x5d, 0xcd, 0x55, 0x35, 0x85, 0x42, 0xe6, + 0x67, 0x3c, 0xdf, 0xa8, + 0x64, 0xaa, 0x62, 0xc5, 0x9e, 0x74, 0xf7, 0xa7, 0x20, 0x50, 0xc4, 0x15, + 0x1b, 0x25, 0x0c, 0x7d, + 0x36, 0xdc, 0x2d, 0x7d, 0x7d, 0x69, 0x76, 0xd7, 0xb8, 0x1a, 0x9d, 0xb5, + 0xe5, 0x91, 0x52, 0x8f, + 0x43, 0xb5, 0xf9, 0x0b, 0x25, 0xb3, 0x2f, 0x70, 0x9c, 0x64, 0x1b, 0xc5, + 0x1c, 0xb0, 0x5b, 0x9b, + 0x03, 0x4a, 0x96, 0xe7, 0x31, 0x50, 0x4c, 0xce, 0xe9, 0xac, 0xcd, 0xcb, + 0x7a, 0x4e, 0x97, 0x8f, + 0xf6, 0xd3, 0xa6, 0x3b, 0xfc, 0x65, 0xd1, 0xca, 0xfa, 0x81, 0xbe, 0xb4, + 0x90, 0xbe, 0x90, 0xbf, + 0xaf, 0x88, 0x96, 0xd5, 0x3b, 0x34, 0x1b, 0x53, 0xd6, 0x50, 0x55, 0x57, + 0x22, 0x8f, 0x63, 0x73, + 0x36, 0x07, 0x2c, 0xcc, 0x3b, 0x73, 0x0e, 0x64, 0xc1, 0xf9, 0x3c, 0xa5, + 0x94, 0x9c, 0xb3, 0xbc, + 0x6e, 0xe0, 0x77, 0xb1, 0x00, 0xd8, 0xb4, 0x62, 0x7f, 0x69, 0xa4, 0xdc, + 0x4b, 0xef, 0xf3, 0x60, + 0x5f, 0xdc, 0x35, 0xee, 0x86, 0xf2, 0xba, 0x12, 0xa3, 0x98, 0x29, 0x0a, + 0x10, 0x3c, 0x4c, 0xe5, + 0xd3, 0xb2, 0x3c, 0x07, 0xca, 0xfc, 0x65, 0xe1, 0x42, 0xc6, 0x8a, 0xef, + 0x77, 0x5c, 0xc0, 0x71, + 0xc8, 0xc7, 0x84, 0xdc, 0x07, 0x8e, 0xe2, 0x42, 0x9e, 0x58, 0x48, 0xc6, + 0xc2, 0xe1, 0x2f, 0x8d, + 0x56, 0x78, 0x92, 0xc7, 0x82, 0x3e, 0x8b, 0x95, 0xb1, 0xf2, 0x7a, 0x47, + 0xd4, 0x55, 0xef, 0x0c, + 0x15, 0xf9, 0xf2, 0xf9, 0x0c, 0xfc, 0xa3, 0x6f, 0x4c, 0x6c, 0xd6, 0x70, + 0xa1, 0x2e, 0x2b, 0x2e, + 0x10, 0x2c, 0x72, 0x1a, 0x79, 0x99, 0xc7, 0x4e, 0x28, 0x34, 0xe7, 0x68, + 0x51, 0x92, 0x8d, 0x66, + 0xe2, 0xba, 0x5a, 0xcc, 0x96, 0x84, 0xcb, 0xbd, 0xc9, 0xb8, 0x4e, 0x71, + 0xbe, 0x32, 0x81, 0xeb, + 0x8c, 0x2d, 0x90, 0xc0, 0xf5, 0x61, 0x7d, 0x41, 0x8e, 0x5c, 0xe2, 0x82, + 0x9e, 0x09, 0x17, 0x06, + 0xcf, 0x59, 0xda, 0x50, 0x55, 0x5f, 0xae, 0xa6, 0x99, 0x2f, 0x7c, 0x3e, + 0x2c, 0x54, 0x28, 0xae, + 0x97, 0x7b, 0xdd, 0xe4, 0x7e, 0x8c, 0xc0, 0xf5, 0x90, 0x23, 0xb1, 0x46, + 0xf5, 0xe1, 0x7a, 0xfe, + 0x68, 0xd6, 0x46, 0x25, 0xcb, 0x1c, 0x95, 0xac, 0xe1, 0x82, 0xb9, 0x36, + 0x46, 0x8a, 0xb2, 0xf6, + 0xd3, 0x3c, 0xa7, 0x6e, 0x63, 0x28, 0xae, 0x57, 0x24, 0xe1, 0xba, 0xdb, + 0xc4, 0xc2, 0x04, 0xae, + 0xdb, 0xc9, 0x7c, 0xa4, 0x73, 0x80, 0xe0, 0x1f, 0xcc, 0xe1, 0x1c, 0xc8, + 0x8c, 0x7f, 0xc3, 0x70, + 0x21, 0xd3, 0xda, 0xe8, 0x1e, 0x58, 0x1b, 0x07, 0x71, 0xbd, 0x3c, 0xee, + 0xac, 0xaf, 0x4a, 0xc6, + 0x75, 0xf2, 0x6c, 0x54, 0x10, 0x5c, 0x2f, 0xd6, 0x92, 0x70, 0x3d, 0x05, + 0x2e, 0x58, 0x99, 0x03, + 0xf6, 0xd1, 0xcd, 0x81, 0xcc, 0xf3, 0x4e, 0x23, 0xf3, 0x2e, 0x5e, 0x52, + 0x9f, 0xd2, 0x57, 0x40, + 0xf5, 0x7d, 0xcd, 0xc1, 0x50, 0x5c, 0xa7, 0x73, 0x38, 0x15, 0xae, 0x17, + 0x12, 0x2c, 0xcc, 0xeb, + 0xbf, 0x2f, 0xa3, 0x98, 0x03, 0x65, 0xa1, 0x02, 0x4b, 0xf8, 0x67, 0x75, + 0x4c, 0x28, 0x5f, 0x70, + 0x06, 0xf3, 0x0f, 0xd6, 0x98, 0x10, 0xae, 0x5f, 0x44, 0xf8, 0x6f, 0x09, + 0x53, 0x16, 0x4b, 0x5e, + 0xe3, 0x28, 0x2f, 0x34, 0xc7, 0xc2, 0xe3, 0x48, 0xdc, 0xd7, 0xc1, 0xb1, + 0x18, 0x13, 0x2e, 0x64, + 0xe7, 0x28, 0xa5, 0x71, 0x13, 0x17, 0xb2, 0x60, 0x11, 0xe1, 0x0b, 0xe4, + 0x99, 0x2b, 0x48, 0x7d, + 0x4e, 0x94, 0xdf, 0x8f, 0xeb, 0x31, 0xd7, 0xe0, 0x33, 0x9a, 0x84, 0xeb, + 0x25, 0xba, 0x3d, 0xb1, + 0xc6, 0xf5, 0xe1, 0x3a, 0x5d, 0xbb, 0xb3, 0xf2, 0x05, 0x8a, 0x0b, 0xcd, + 0xce, 0xda, 0x6c, 0x1c, + 0xa5, 0x90, 0x62, 0x51, 0x24, 0x0b, 0x16, 0xf1, 0x09, 0x2c, 0x2a, 0x91, + 0xb3, 0x71, 0x14, 0x07, + 0x57, 0xd5, 0x54, 0x59, 0x6b, 0x53, 0x13, 0xeb, 0xf5, 0xe0, 0x33, 0x9a, + 0xe0, 0xeb, 0x03, 0xb8, + 0x4e, 0x70, 0xc1, 0x1d, 0x2e, 0xf2, 0x66, 0xce, 0x37, 0x49, 0xe0, 0x82, + 0xc3, 0x3a, 0x2e, 0x64, + 0xec, 0xa7, 0x2d, 0x4c, 0x70, 0x21, 0x54, 0xe0, 0xcd, 0xc6, 0x99, 0xe9, + 0x39, 0x07, 0xf8, 0x82, + 0x90, 0x0f, 0x8b, 0x08, 0xae, 0x97, 0x24, 0xf3, 0xf5, 0xbe, 0xbe, 0xd0, + 0x7e, 0x96, 0x06, 0x87, + 0xe2, 0x7a, 0x2a, 0x5c, 0xb0, 0xca, 0xd3, 0x6d, 0x63, 0xc7, 0x05, 0x3c, + 0x7c, 0x6d, 0x1c, 0xc2, + 0xd3, 0x93, 0xee, 0x61, 0xa1, 0x6c, 0x63, 0x13, 0xb8, 0xee, 0x1c, 0x8a, + 0xeb, 0x7d, 0x7c, 0xdd, + 0xae, 0x0c, 0xe5, 0xeb, 0x79, 0x16, 0xe7, 0x40, 0xc9, 0x81, 0xcf, 0x81, + 0x24, 0x5d, 0xb2, 0x92, + 0xac, 0x8d, 0x59, 0xd6, 0x63, 0xf2, 0x6c, 0xd0, 0x39, 0x50, 0x1e, 0x29, + 0xf1, 0x8e, 0xc0, 0x75, + 0xba, 0x46, 0x45, 0x4a, 0x89, 0xed, 0x41, 0xe6, 0x3f, 0xb1, 0xb5, 0x2c, + 0x71, 0xe6, 0x90, 0xd3, + 0x57, 0x16, 0xcc, 0x1f, 0x72, 0xfd, 0xe9, 0xe2, 0x1c, 0xf2, 0xf5, 0x8a, + 0x43, 0x85, 0x0b, 0x83, + 0xe7, 0xcc, 0x68, 0x47, 0xd0, 0x35, 0xce, 0xc6, 0x15, 0x07, 0x4b, 0x99, + 0xca, 0x11, 0xb6, 0x4b, + 0xff, 0x58, 0x90, 0xfb, 0x3a, 0x60, 0xbb, 0xd8, 0xad, 0xd9, 0x11, 0x21, + 0x57, 0x76, 0x8e, 0x32, + 0x1a, 0x5c, 0x20, 0xd7, 0x92, 0x2d, 0xd7, 0xc8, 0xe4, 0x28, 0x84, 0x8b, + 0x51, 0x5c, 0x2f, 0x4f, + 0xc6, 0xf5, 0x3e, 0x3b, 0x8c, 0xae, 0xd7, 0x0e, 0xad, 0xc8, 0x4f, 0xcf, + 0x99, 0xdd, 0x7e, 0xcf, + 0x25, 0x2e, 0xe4, 0x0f, 0xc5, 0x85, 0xf4, 0x6b, 0x23, 0x4b, 0x79, 0xfa, + 0x08, 0x5c, 0xa7, 0x7c, + 0xbd, 0x65, 0xa8, 0xed, 0xe2, 0x22, 0xb6, 0x8b, 0x43, 0x4b, 0xe0, 0x7a, + 0x5e, 0x02, 0xd7, 0x47, + 0xe0, 0x02, 0x5d, 0xa7, 0xb2, 0xf2, 0x74, 0x6b, 0xb8, 0x80, 0x1d, 0x51, + 0x82, 0x0b, 0x5a, 0x16, + 0x8e, 0xd2, 0xb7, 0x36, 0x16, 0xa5, 0xf0, 0xa5, 0x10, 0xbe, 0x0e, 0xfa, + 0x71, 0x7d, 0x38, 0x16, + 0x9a, 0xb8, 0x4e, 0xed, 0x30, 0x79, 0xa8, 0x1d, 0x96, 0x4b, 0x5c, 0xc8, + 0xb7, 0x82, 0x0b, 0x64, + 0x2e, 0x50, 0x5c, 0x28, 0xcb, 0xc6, 0x99, 0x03, 0xc5, 0x1c, 0xbd, 0xee, + 0xd2, 0xf0, 0x48, 0x5c, + 0x4f, 0xe6, 0xeb, 0xa3, 0x59, 0x1b, 0x4b, 0xb3, 0xce, 0x81, 0x62, 0x73, + 0x6d, 0xb4, 0x34, 0x07, + 0x22, 0x45, 0xde, 0x6c, 0xe7, 0xac, 0x68, 0xec, 0xe3, 0xcc, 0xd4, 0xf6, + 0x18, 0xc0, 0xf5, 0x61, + 0x7c, 0x9d, 0x3c, 0x63, 0x94, 0xa7, 0x17, 0x2b, 0xa9, 0x75, 0x98, 0x41, + 0x9e, 0xee, 0xf6, 0x94, + 0x19, 0x79, 0x43, 0xee, 0xd3, 0x90, 0x38, 0x07, 0x9a, 0x7b, 0xd3, 0x77, + 0x5f, 0x0b, 0x72, 0x3c, + 0x26, 0xee, 0x5c, 0x8d, 0x09, 0xb9, 0xf7, 0x54, 0xbb, 0x29, 0x35, 0x88, + 0xed, 0x12, 0x2a, 0xf3, + 0xa5, 0xd4, 0xd7, 0x42, 0x0e, 0x2f, 0x9d, 0x8f, 0x14, 0x17, 0xf2, 0xb2, + 0xda, 0xef, 0x14, 0x17, + 0x0a, 0x2d, 0xe1, 0x42, 0xb1, 0x64, 0x41, 0xd3, 0x18, 0xc4, 0x85, 0x8c, + 0x76, 0x84, 0xcb, 0xc8, + 0xf3, 0x25, 0xeb, 0x6b, 0xc5, 0xc3, 0xf4, 0x35, 0xda, 0x17, 0x3a, 0x47, + 0x87, 0xe9, 0x6b, 0x30, + 0x35, 0x2e, 0x8c, 0x41, 0xd7, 0xb3, 0x68, 0xbf, 0xa7, 0xe6, 0xcc, 0xe9, + 0x74, 0xbd, 0xbc, 0x01, + 0xbe, 0x4e, 0x71, 0x7d, 0x40, 0xbb, 0x48, 0xc6, 0xf5, 0x7e, 0x7d, 0x2d, + 0xc9, 0x76, 0xa1, 0xcf, + 0x70, 0xa1, 0x15, 0x5c, 0xb0, 0x66, 0xbf, 0x67, 0xc7, 0x85, 0x7e, 0x6d, + 0x3b, 0xf3, 0x39, 0x51, + 0x11, 0xe1, 0x0b, 0xd4, 0x06, 0x1a, 0x8e, 0xeb, 0x7d, 0xb6, 0x87, 0xc9, + 0xd7, 0xa9, 0x1d, 0x66, + 0x89, 0xa7, 0xf7, 0xeb, 0x7a, 0x39, 0xc1, 0x05, 0x8b, 0xda, 0xb6, 0xb9, + 0x1e, 0x9b, 0x1a, 0xd6, + 0x10, 0x5c, 0x1f, 0xd4, 0x94, 0x12, 0x58, 0x48, 0xf1, 0xc4, 0x15, 0x75, + 0xd4, 0xa7, 0xd5, 0xd7, + 0x92, 0xe7, 0x40, 0x36, 0x0d, 0x6b, 0x34, 0x73, 0x20, 0x54, 0x60, 0x8d, + 0x33, 0x0f, 0x9b, 0x77, + 0x79, 0xfd, 0x7c, 0x3d, 0x3c, 0x72, 0x8d, 0x72, 0xc6, 0x2b, 0xea, 0xd2, + 0xf1, 0x75, 0x3a, 0x07, + 0x4a, 0xb5, 0xa1, 0xcf, 0xc6, 0x70, 0x7f, 0x98, 0x69, 0x87, 0x19, 0xf6, + 0x51, 0xd9, 0x2e, 0x96, + 0xb4, 0x4e, 0x0b, 0x63, 0x62, 0x1b, 0x83, 0x1d, 0x91, 0x4e, 0x5f, 0xa3, + 0xcf, 0x5a, 0xc2, 0x76, + 0x19, 0xf4, 0x9b, 0xa4, 0xea, 0x8b, 0x69, 0xbf, 0x1b, 0xb9, 0xc1, 0x05, + 0x53, 0xef, 0x8f, 0x1d, + 0x80, 0xde, 0x3f, 0xa0, 0xaf, 0x91, 0xf5, 0x7a, 0x88, 0xed, 0x92, 0x84, + 0xeb, 0x4a, 0x21, 0xc1, + 0xc2, 0xc1, 0xfb, 0x9a, 0x59, 0xef, 0x1f, 0xc4, 0x25, 0xaa, 0xeb, 0x65, + 0xc7, 0x05, 0xca, 0x51, + 0xb2, 0xe2, 0x82, 0x35, 0xbd, 0x9f, 0xdc, 0x17, 0xba, 0x36, 0x52, 0x5e, + 0x9e, 0x4e, 0x5f, 0x33, + 0x71, 0xbd, 0xdf, 0x76, 0xc9, 0x21, 0x5f, 0xc8, 0x95, 0xcf, 0xcb, 0x3c, + 0xa7, 0xc9, 0x99, 0xfb, + 0xf4, 0x35, 0x3d, 0xa1, 0xaf, 0x0d, 0xb7, 0x3d, 0xe8, 0x1c, 0x28, 0xd5, + 0x8b, 0x98, 0x74, 0xfa, + 0x5a, 0x2a, 0xbd, 0x3f, 0xe3, 0x1c, 0x08, 0xe5, 0xca, 0xe7, 0x55, 0x96, + 0xca, 0xe7, 0x95, 0xd0, + 0xd7, 0xf4, 0x84, 0xbe, 0x96, 0xda, 0x6f, 0x62, 0xef, 0xd3, 0xd7, 0x92, + 0xf8, 0xfa, 0x68, 0x34, + 0x2c, 0x0b, 0x73, 0x20, 0x57, 0xda, 0x36, 0xf5, 0x9b, 0xd8, 0xc3, 0x95, + 0x5e, 0x3a, 0xd7, 0x93, + 0xb5, 0xc2, 0x01, 0x4d, 0x29, 0xc9, 0x6f, 0x42, 0xe7, 0x40, 0xf1, 0x30, + 0xae, 0x36, 0x3c, 0xce, + 0xa1, 0xff, 0xef, 0x9d, 0xcd, 0xee, 0x5a, 0x57, 0xbc, 0xac, 0x2e, 0xad, + 0xbe, 0x96, 0x1b, 0xad, + 0x33, 0xc5, 0x98, 0xe4, 0x8d, 0x79, 0x4c, 0x92, 0xfd, 0x26, 0xce, 0x26, + 0x77, 0x6d, 0x36, 0x7d, + 0xad, 0x9f, 0x2f, 0x64, 0xb5, 0x5d, 0x24, 0x8b, 0x9a, 0x86, 0x45, 0x3f, + 0x60, 0x1f, 0x5f, 0x60, + 0x33, 0xc7, 0x5a, 0x39, 0x4c, 0x5c, 0x30, 0xf5, 0xb5, 0xa6, 0x34, 0xfa, + 0x1a, 0xb1, 0xc3, 0x0a, + 0x29, 0x47, 0xb1, 0x80, 0x0b, 0xd6, 0xed, 0xf7, 0x8a, 0xac, 0x58, 0x54, + 0x64, 0xc9, 0xff, 0x9e, + 0xe0, 0xe9, 0x26, 0x67, 0x4e, 0xc6, 0xf5, 0xe1, 0x7c, 0x9d, 0xf4, 0x85, + 0x9e, 0xd3, 0x9e, 0x41, + 0x5f, 0x1b, 0xd0, 0xfb, 0x2d, 0xe8, 0x7a, 0xa3, 0xc0, 0x85, 0xb1, 0xe9, + 0xfd, 0x43, 0xf4, 0x35, + 0x82, 0xeb, 0x2d, 0x49, 0x7c, 0x3d, 0x8d, 0xbe, 0x76, 0xd0, 0xe6, 0x80, + 0x15, 0x9e, 0x1e, 0x2b, + 0xae, 0xcf, 0xf4, 0x2c, 0x52, 0x4d, 0xa9, 0x9c, 0x3c, 0x8f, 0xce, 0x46, + 0x67, 0x5d, 0x0a, 0x7d, + 0x2d, 0xe1, 0x37, 0xa1, 0x7d, 0x91, 0x6c, 0x1c, 0x9d, 0x03, 0xb9, 0xf2, + 0x85, 0x5b, 0x99, 0x03, + 0x56, 0x35, 0xac, 0xfc, 0xa0, 0x93, 0xa1, 0x1a, 0x56, 0xb2, 0xdf, 0x64, + 0x24, 0xae, 0x97, 0x7a, + 0xe8, 0x1c, 0xb0, 0xcb, 0x79, 0x5c, 0x9a, 0xef, 0x33, 0x63, 0x79, 0x8b, + 0x8d, 0x52, 0x73, 0x8d, + 0x73, 0x65, 0xd3, 0xd7, 0xbe, 0x27, 0x5c, 0x48, 0xf8, 0x01, 0xb3, 0xc6, + 0x24, 0x20, 0xca, 0x5f, + 0x29, 0xe7, 0x2c, 0x4b, 0xa5, 0xaf, 0x0d, 0xf8, 0x4d, 0x0a, 0xb8, 0xd1, + 0xe8, 0x7a, 0xb9, 0xf2, + 0x85, 0x5b, 0x8e, 0xcb, 0x69, 0x48, 0xe8, 0x7a, 0xf9, 0x69, 0xfd, 0xe1, + 0xce, 0xda, 0xf2, 0x84, + 0xed, 0xe2, 0x29, 0x1c, 0xc4, 0xf5, 0xec, 0x7a, 0x7f, 0x0e, 0x70, 0x61, + 0xac, 0x7a, 0x3f, 0xb5, + 0xc3, 0x8a, 0xb2, 0xf8, 0x4d, 0x86, 0xeb, 0x6b, 0xa6, 0xae, 0x17, 0xb3, + 0xa2, 0xeb, 0x91, 0xf5, + 0xb8, 0xc5, 0x2a, 0x2e, 0xe4, 0x40, 0xef, 0x27, 0x76, 0x58, 0xa1, 0x56, + 0xe2, 0xa7, 0x73, 0x60, + 0x88, 0x1d, 0x96, 0xc2, 0x1f, 0x9e, 0xd0, 0xfb, 0x6d, 0x39, 0xc4, 0x05, + 0x0b, 0x71, 0x39, 0x21, + 0x0b, 0x1a, 0x16, 0xf9, 0x31, 0xe7, 0x80, 0x92, 0xc7, 0xa6, 0xd7, 0xd7, + 0x12, 0xb8, 0xee, 0x26, + 0xeb, 0x54, 0x61, 0x06, 0x7d, 0x6d, 0x90, 0xa7, 0xe7, 0x32, 0x36, 0x6d, + 0x2c, 0xda, 0x76, 0xbf, + 0x3f, 0xbc, 0x74, 0xa8, 0x3f, 0x9c, 0x1c, 0x4b, 0x23, 0x36, 0x26, 0x29, + 0x16, 0x17, 0x66, 0xb1, + 0x5d, 0x3c, 0x95, 0x8d, 0xae, 0xda, 0xe4, 0xb1, 0x48, 0xdc, 0x57, 0xba, + 0xc6, 0x11, 0x3b, 0x4c, + 0x29, 0x66, 0xad, 0xe0, 0xc2, 0xf7, 0x31, 0x26, 0x45, 0x61, 0xb7, 0xd7, + 0x6d, 0xda, 0x11, 0x03, + 0xfa, 0x1a, 0x33, 0x24, 0x7e, 0xcd, 0xbc, 0xaf, 0x15, 0x75, 0xa6, 0xed, + 0xa2, 0x15, 0xf9, 0x0b, + 0xb2, 0xd9, 0x2e, 0x56, 0x35, 0x0d, 0xab, 0xb8, 0x30, 0x26, 0xbd, 0x7f, + 0xa8, 0xbe, 0x36, 0x64, + 0x8d, 0x1b, 0xf0, 0x9b, 0x0c, 0xd3, 0xd7, 0xfa, 0x71, 0xc1, 0xaa, 0xae, + 0x97, 0x33, 0x3f, 0x60, + 0x51, 0xb6, 0xb5, 0xd1, 0xc4, 0xf5, 0xe2, 0x88, 0xd3, 0xb4, 0x5d, 0x86, + 0xe3, 0x7a, 0x65, 0x9f, + 0xbe, 0x66, 0xfa, 0x4d, 0x12, 0xb6, 0x4b, 0x6e, 0x71, 0x21, 0x57, 0x3e, + 0x2f, 0x72, 0x4e, 0x7a, + 0xfd, 0xf9, 0xd2, 0xa0, 0xbe, 0x96, 0x0a, 0xd7, 0x1d, 0x11, 0xa7, 0xc7, + 0x1d, 0xb1, 0x7b, 0xf2, + 0x33, 0xd5, 0x64, 0xc8, 0x79, 0xcc, 0xaa, 0x9b, 0xac, 0xc7, 0x05, 0xa3, + 0x8f, 0x4d, 0x4b, 0xe3, + 0x0f, 0x37, 0xed, 0xc2, 0x14, 0x71, 0x4e, 0x63, 0xd6, 0xb0, 0xac, 0xc4, + 0xa6, 0x59, 0xd2, 0xb6, + 0xab, 0xd2, 0x6b, 0xdb, 0xfd, 0x7e, 0x93, 0x50, 0x99, 0xcf, 0x4d, 0x9e, + 0xb1, 0xb2, 0xb8, 0xdd, + 0x97, 0x9c, 0x63, 0x91, 0x69, 0x4c, 0x28, 0x5f, 0x18, 0xaa, 0xaf, 0xb9, + 0x47, 0xc4, 0x25, 0x53, + 0x2c, 0xca, 0xa4, 0xaf, 0xe5, 0x1c, 0x17, 0xc6, 0x1a, 0xc7, 0x3b, 0x30, + 0x16, 0xa6, 0x1d, 0x96, + 0xd6, 0x6f, 0x62, 0xef, 0xd3, 0xd7, 0x92, 0xd7, 0x38, 0xcb, 0xb8, 0x10, + 0xb3, 0x86, 0x0b, 0x2e, + 0x6b, 0x7a, 0x3f, 0x93, 0xd1, 0x0f, 0xd8, 0xe7, 0x37, 0xa1, 0x73, 0xd4, + 0x39, 0x6c, 0x8d, 0x1a, + 0xa2, 0xaf, 0x99, 0xb6, 0x8b, 0x9d, 0xa3, 0x7d, 0xcc, 0x66, 0xd7, 0x16, + 0x8c, 0x2e, 0x5e, 0xcf, + 0x82, 0xde, 0x9f, 0xdd, 0xe7, 0x95, 0x4f, 0xe3, 0x78, 0x09, 0x47, 0x19, + 0xc0, 0xf5, 0x11, 0xfa, + 0x5a, 0x02, 0xd7, 0x13, 0x1c, 0x25, 0x9f, 0xcd, 0xcb, 0x14, 0x8b, 0x37, + 0x9a, 0xb5, 0x31, 0x97, + 0x71, 0xbc, 0x43, 0xd7, 0x46, 0x53, 0x5f, 0xa3, 0x7c, 0x7d, 0xa8, 0x1d, + 0x46, 0xda, 0x30, 0xbf, + 0xc9, 0x08, 0x7f, 0x78, 0xae, 0x63, 0x56, 0x73, 0xa0, 0x6d, 0x9b, 0x71, + 0xc9, 0x14, 0xd7, 0x63, + 0x4e, 0x4f, 0x55, 0xcb, 0x50, 0xbf, 0x49, 0x2a, 0x7f, 0xb8, 0xc5, 0x39, + 0x90, 0xeb, 0x98, 0xd5, + 0xec, 0x3e, 0x2f, 0x31, 0xa1, 0x6d, 0x17, 0x99, 0x75, 0xfa, 0x06, 0xf3, + 0x4d, 0x46, 0x33, 0x26, + 0x03, 0xfa, 0x5a, 0x24, 0xd9, 0x0e, 0xab, 0x4a, 0xd2, 0x1a, 0x47, 0xe8, + 0x6b, 0xa3, 0x8a, 0xef, + 0x77, 0x1f, 0x70, 0x7c, 0xff, 0xd0, 0x38, 0xde, 0x4c, 0x63, 0x92, 0xc8, + 0x37, 0xa1, 0xb6, 0x0b, + 0xcd, 0x37, 0x71, 0xa7, 0xb2, 0xc3, 0x7c, 0xfd, 0x71, 0xc9, 0x96, 0x7c, + 0xe1, 0x39, 0x8e, 0xef, + 0xb7, 0xe6, 0x0b, 0x4f, 0xc4, 0xf1, 0x52, 0x5c, 0x48, 0xab, 0xaf, 0xf5, + 0xf1, 0x75, 0x8a, 0x0b, + 0x05, 0x59, 0xf2, 0x4d, 0x72, 0x1a, 0xcb, 0x3e, 0x56, 0xbd, 0x3f, 0x29, + 0xdf, 0xa4, 0x62, 0x44, + 0xbe, 0x49, 0x45, 0x5d, 0xc6, 0x7c, 0x93, 0xd4, 0x7a, 0xff, 0x41, 0xc1, + 0x85, 0xa1, 0x39, 0x2e, + 0xe9, 0x74, 0xbd, 0x41, 0x3b, 0x8c, 0xfa, 0x65, 0xb2, 0xe6, 0x9b, 0xf4, + 0xe1, 0x42, 0x81, 0x35, + 0x5c, 0xb0, 0x1a, 0x9b, 0x66, 0xc1, 0xe7, 0x65, 0x25, 0x2e, 0xc7, 0x69, + 0x72, 0x80, 0x6c, 0xf9, + 0x26, 0x74, 0xde, 0x95, 0x66, 0x8f, 0xcb, 0x31, 0xe7, 0x40, 0x7e, 0x2e, + 0x62, 0xd9, 0xad, 0x6b, + 0xdb, 0xfd, 0xb6, 0xea, 0x60, 0x1e, 0xa1, 0x5c, 0x00, 0xc6, 0x38, 0x26, + 0x64, 0x8d, 0x2b, 0xa2, + 0xb6, 0x8b, 0xa7, 0xaa, 0xd9, 0x39, 0xf4, 0xbe, 0x0e, 0x8f, 0x4b, 0x26, + 0xf8, 0x61, 0x6a, 0x1a, + 0xb2, 0x85, 0x38, 0x5e, 0xcb, 0xb8, 0x90, 0xab, 0x78, 0xbd, 0x62, 0x60, + 0xc6, 0xf7, 0x4b, 0x85, + 0x5c, 0xe6, 0x7c, 0x13, 0xa7, 0xc7, 0x15, 0xb6, 0x79, 0xf3, 0xf8, 0xcc, + 0xb6, 0xcb, 0x28, 0x71, + 0x21, 0x27, 0x71, 0xbc, 0xc3, 0xf5, 0xfe, 0x3e, 0x7d, 0x8d, 0x1d, 0xee, + 0x37, 0x19, 0x92, 0x6f, + 0x22, 0xa7, 0x8e, 0x73, 0xb0, 0x8f, 0x02, 0x17, 0x6c, 0x87, 0xc2, 0xe7, + 0x95, 0xe4, 0x37, 0x71, + 0xf7, 0xdf, 0x97, 0x0c, 0xf9, 0x26, 0x79, 0x56, 0xf9, 0x42, 0x2e, 0xe3, + 0x78, 0x2d, 0x69, 0xdb, + 0xe3, 0xb0, 0x19, 0xaf, 0x67, 0xd8, 0x7c, 0x99, 0xf4, 0x35, 0xbb, 0x6a, + 0xf7, 0xbb, 0xc9, 0x1c, + 0xcd, 0x76, 0xce, 0xc2, 0x60, 0x2e, 0xe7, 0x80, 0xb5, 0x98, 0xd5, 0xa1, + 0x3e, 0x2f, 0x0b, 0xf9, + 0x26, 0x6a, 0x9f, 0xdf, 0x24, 0x95, 0xa6, 0x94, 0xe3, 0x98, 0x55, 0xeb, + 0x3e, 0xaf, 0xec, 0x1a, + 0xd6, 0x68, 0xc6, 0xc4, 0xcc, 0x41, 0x24, 0xf8, 0x6c, 0xc6, 0x25, 0x1b, + 0x7d, 0xfa, 0xda, 0x70, + 0xbf, 0x09, 0xb9, 0xaf, 0x66, 0x1c, 0xaf, 0x4c, 0x6c, 0x17, 0x9c, 0xc9, + 0x76, 0x29, 0x1d, 0xd0, + 0xfb, 0x73, 0x1e, 0xdf, 0x6f, 0x5d, 0xef, 0x4f, 0x9b, 0x6f, 0x42, 0x6d, + 0x97, 0xf2, 0x41, 0x7d, + 0x6d, 0xa4, 0x3f, 0xbc, 0x3f, 0x8e, 0x57, 0x3c, 0x94, 0x71, 0xbc, 0x19, + 0x39, 0x4a, 0x52, 0xbe, + 0x89, 0x73, 0x58, 0xbe, 0x89, 0xb3, 0x36, 0xd9, 0x1f, 0xde, 0x6f, 0x87, + 0xe5, 0x3e, 0x8e, 0xd7, + 0x9e, 0x9b, 0x38, 0xde, 0x3e, 0x5d, 0xcf, 0xae, 0x65, 0xf0, 0x9b, 0x50, + 0x3b, 0x2c, 0x54, 0xe9, + 0xa3, 0x1a, 0xdb, 0xb8, 0x2c, 0xfb, 0x9b, 0x58, 0x8b, 0x59, 0x75, 0xe4, + 0x30, 0x8e, 0x77, 0x98, + 0xae, 0x97, 0x36, 0xdf, 0x84, 0xc6, 0x6c, 0x39, 0x6b, 0x33, 0xe9, 0x6b, + 0x07, 0x39, 0x96, 0x7d, + 0xf4, 0xda, 0x36, 0x79, 0x76, 0x86, 0xe4, 0x9b, 0xb4, 0x58, 0xc8, 0x37, + 0xb1, 0x18, 0xb3, 0xea, + 0x88, 0xba, 0xeb, 0x73, 0x1a, 0xb3, 0x9a, 0x5d, 0xc3, 0x3a, 0x30, 0xbd, + 0x3f, 0x49, 0x6b, 0x1c, + 0xf0, 0x9b, 0xd0, 0xfb, 0x4a, 0x1a, 0x8d, 0x4b, 0x1c, 0xf0, 0x9b, 0x0c, + 0xd3, 0xd7, 0x46, 0x85, + 0x0b, 0xb1, 0x43, 0x34, 0x26, 0x49, 0x71, 0xc9, 0x15, 0x56, 0xf2, 0x4d, + 0xb2, 0xeb, 0xfd, 0xa3, + 0x8a, 0xef, 0x1f, 0x55, 0x1c, 0xaf, 0x95, 0x98, 0x84, 0xb8, 0xa3, 0x3e, + 0x5b, 0xbe, 0x49, 0x69, + 0x82, 0xa7, 0xb3, 0xd9, 0x70, 0xc1, 0xd4, 0xf5, 0xc6, 0x60, 0xbf, 0x9f, + 0x28, 0x9c, 0x86, 0x8e, + 0x17, 0x8e, 0x83, 0xc7, 0xf1, 0xb4, 0x1d, 0x0f, 0x4f, 0x10, 0x16, 0xc1, + 0x93, 0x8d, 0xd3, 0x99, + 0x33, 0x84, 0x13, 0xc1, 0xf1, 0xfc, 0x09, 0x60, 0x11, 0x7f, 0x02, 0x3c, + 0x0e, 0x2f, 0x82, 0x0b, + 0xf8, 0xc3, 0xe1, 0x31, 0xc2, 0x04, 0x34, 0x5e, 0xa8, 0x42, 0xd5, 0xfc, + 0x78, 0x34, 0x5e, 0x9a, + 0x02, 0x66, 0x86, 0xa7, 0x7b, 0xab, 0xf8, 0x89, 0x68, 0x12, 0xef, 0x42, + 0xd5, 0xd2, 0x78, 0x30, + 0x41, 0x9d, 0xc8, 0x4e, 0x36, 0xa6, 0x32, 0xd3, 0xc8, 0xfb, 0xd3, 0x23, + 0x73, 0xbc, 0xc9, 0xb9, + 0xf2, 0x29, 0xe3, 0xd7, 0x46, 0x19, 0xc7, 0x7b, 0xa8, 0x7c, 0x5e, 0xc9, + 0x71, 0xc9, 0x29, 0x75, + 0x98, 0x14, 0xf9, 0x26, 0xdf, 0x03, 0x2e, 0x24, 0x34, 0xac, 0x6c, 0x6b, + 0x63, 0xc0, 0xce, 0x51, + 0x6d, 0xbb, 0x34, 0x5c, 0xe6, 0x49, 0x95, 0x6f, 0xd2, 0x1f, 0x97, 0x5c, + 0x60, 0x29, 0x96, 0xfd, + 0x20, 0xcc, 0x81, 0x68, 0x76, 0x5f, 0x78, 0xae, 0xf4, 0xfe, 0x64, 0xbf, + 0x89, 0x7b, 0x98, 0x6e, + 0x3a, 0xbc, 0x9e, 0x8b, 0xc9, 0x55, 0x4c, 0xbd, 0xdf, 0x9e, 0xa3, 0x31, + 0xb1, 0xe5, 0x72, 0x4c, + 0x4c, 0xbe, 0x50, 0x66, 0xd8, 0x7d, 0x19, 0xfd, 0x26, 0x7d, 0xb6, 0x4b, + 0x3e, 0x9f, 0x23, 0xbe, + 0xd0, 0x98, 0xeb, 0xda, 0x35, 0x7d, 0x7c, 0x21, 0x4b, 0xbe, 0x49, 0x45, + 0xb8, 0xc4, 0x93, 0x29, + 0xdf, 0x64, 0xdc, 0x98, 0x63, 0xd9, 0x8f, 0x40, 0xff, 0x0d, 0x3f, 0x43, + 0x7f, 0x81, 0xdf, 0xa0, + 0x6f, 0xd9, 0x7f, 0x81, 0xff, 0x62, 0xff, 0x0e, 0xfe, 0xc1, 0x7e, 0x0d, + 0x3e, 0x41, 0x1f, 0xc3, + 0x4f, 0xe0, 0xef, 0xd1, 0xdf, 0xb8, 0xbf, 0x83, 0x7f, 0xb1, 0xdf, 0xc2, + 0x7f, 0x72, 0xff, 0x02, + 0x5f, 0xa0, 0xfd, 0xe8, 0x97, 0xe0, 0x03, 0xfc, 0x09, 0xf9, 0xf9, 0x18, + 0x7d, 0x8c, 0xdf, 0xe7, + 0x3e, 0x40, 0x1f, 0xc1, 0xfd, 0x68, 0x3f, 0x69, 0x7b, 0x85, 0x7d, 0xe8, + 0x03, 0xfc, 0x5b, 0xf8, + 0x1b, 0xfe, 0x4d, 0xb8, 0x57, 0x7c, 0x1d, 0xef, 0x11, 0xf6, 0xe1, 0xd7, + 0x85, 0x4f, 0xf0, 0x8f, + 0xc3, 0x4e, 0xef, 0xf0, 0x7c, 0x93, 0xf2, 0x54, 0xf9, 0x26, 0x56, 0x71, + 0xe1, 0x40, 0x63, 0xd9, + 0x47, 0xaf, 0xf7, 0xa3, 0xc2, 0x20, 0xc1, 0x05, 0x32, 0xb6, 0xa5, 0x69, + 0xf4, 0xb5, 0x7e, 0xbf, + 0x09, 0xb5, 0xdf, 0xad, 0xc5, 0xb2, 0xbb, 0x2d, 0xc6, 0xb2, 0xe7, 0xaa, + 0x46, 0x45, 0x22, 0x5e, + 0x2f, 0x11, 0x4b, 0x97, 0x29, 0xdf, 0xc4, 0x59, 0xe7, 0x8e, 0x95, 0x64, + 0xce, 0x37, 0x19, 0x95, + 0xae, 0x97, 0xa3, 0x3a, 0x2d, 0x07, 0xcd, 0x0f, 0xe8, 0xac, 0xa5, 0x71, + 0x89, 0x43, 0xfd, 0x26, + 0xee, 0xa1, 0x7e, 0x93, 0x90, 0xd3, 0xe7, 0x0e, 0xdb, 0xb2, 0xda, 0x2e, + 0x14, 0x17, 0xb2, 0x8e, + 0x89, 0x3c, 0x90, 0xf7, 0x93, 0xf3, 0xda, 0x35, 0x16, 0xf2, 0x4d, 0xd2, + 0xd5, 0x73, 0x49, 0xd2, + 0xfb, 0x0b, 0x72, 0x59, 0xd3, 0x6a, 0xec, 0x7e, 0x40, 0x2b, 0xf9, 0x26, + 0xf2, 0xd0, 0x7c, 0x93, + 0xcc, 0x7a, 0x7f, 0xfa, 0xf8, 0xfe, 0x3c, 0xfe, 0x51, 0xf4, 0x21, 0xfc, + 0x1c, 0x3e, 0x1b, 0x68, + 0x03, 0xed, 0x72, 0x37, 0x68, 0x95, 0x5b, 0x61, 0xab, 0xd2, 0x0d, 0x5e, + 0x00, 0x3b, 0xd1, 0x27, + 0x70, 0x3f, 0xbf, 0x59, 0xeb, 0x82, 0x1b, 0xd5, 0x6d, 0x70, 0xab, 0xda, + 0x03, 0x9e, 0x40, 0xef, + 0x08, 0x7f, 0x06, 0x9f, 0xe0, 0x57, 0xc4, 0x17, 0xf1, 0xcb, 0xc2, 0x0b, + 0xf8, 0x17, 0xfc, 0x0b, + 0xf8, 0x79, 0x61, 0x27, 0xbf, 0x1f, 0xee, 0xe1, 0x5f, 0xc5, 0x9f, 0x08, + 0xbf, 0x44, 0x5b, 0xe0, + 0x13, 0xf0, 0x73, 0xf4, 0x1e, 0xff, 0x12, 0x7e, 0x87, 0x7f, 0x13, 0xef, + 0xe2, 0xdf, 0xc5, 0x1f, + 0x0b, 0x25, 0xa6, 0x2d, 0x4d, 0xe3, 0x5c, 0xd3, 0xd6, 0x73, 0xa1, 0xb8, + 0x1e, 0xb0, 0x99, 0xbe, + 0xf0, 0x43, 0x1a, 0xc7, 0x1b, 0xb0, 0x56, 0xa3, 0x22, 0xe1, 0x67, 0x2b, + 0xf4, 0x66, 0xd4, 0xd7, + 0x48, 0x5f, 0xa8, 0x3d, 0x52, 0x66, 0x64, 0xce, 0x37, 0xc9, 0x75, 0xcc, + 0xea, 0x01, 0xd4, 0xa8, + 0x48, 0x9f, 0x6f, 0xd2, 0x98, 0xa6, 0x9e, 0xcb, 0x41, 0x88, 0x65, 0x37, + 0xeb, 0x37, 0x65, 0xab, + 0xd3, 0x32, 0xaa, 0xf8, 0xfe, 0x51, 0x8f, 0xc9, 0x80, 0xdf, 0x64, 0x84, + 0xbe, 0x46, 0xe3, 0x0a, + 0x09, 0xf7, 0x77, 0x67, 0xcd, 0x37, 0xc9, 0x71, 0x7c, 0xbf, 0x89, 0x0b, + 0xf9, 0x63, 0xd5, 0xfb, + 0xd1, 0x18, 0xf2, 0x4d, 0x2c, 0xc6, 0xf1, 0x1e, 0xfa, 0xda, 0x35, 0x79, + 0x34, 0x47, 0x9b, 0xda, + 0x2e, 0x91, 0x72, 0x4f, 0xa6, 0x7c, 0x93, 0x82, 0x60, 0xe5, 0x98, 0x70, + 0xe1, 0x3c, 0xf8, 0x2f, + 0xf8, 0x8e, 0xb6, 0x9e, 0x9b, 0xde, 0x69, 0x63, 0x1d, 0x3d, 0xa5, 0x4c, + 0x79, 0x4f, 0x39, 0x63, + 0xeb, 0x72, 0x32, 0x4f, 0x82, 0xaf, 0xb8, 0xfb, 0x23, 0x27, 0x82, 0xca, + 0x2e, 0x97, 0xdf, 0xdd, + 0xe9, 0x64, 0xaa, 0xda, 0x8a, 0xfc, 0x40, 0xf8, 0x6f, 0xdc, 0x1c, 0x3f, + 0x87, 0x9d, 0xdf, 0x31, + 0x97, 0x9d, 0xd7, 0xb1, 0x80, 0x5d, 0xd0, 0x3e, 0xcb, 0x3f, 0x2d, 0x7a, + 0x37, 0xf8, 0x10, 0xbd, + 0xca, 0x7f, 0x2c, 0x3e, 0x87, 0x16, 0xb7, 0xd9, 0xd8, 0xb2, 0x96, 0x9b, + 0xfd, 0xfb, 0xf0, 0xe7, + 0xf8, 0x7e, 0xcc, 0x60, 0x05, 0x3f, 0x48, 0x5e, 0xf9, 0xd0, 0x40, 0xbd, + 0x08, 0x3e, 0x85, 0xbe, + 0x96, 0x94, 0x6f, 0x42, 0x79, 0x3a, 0xd5, 0x61, 0x32, 0xe5, 0x9b, 0x14, + 0x59, 0x8c, 0x59, 0x3d, + 0xe8, 0xb5, 0x6b, 0x86, 0xe7, 0x9b, 0xb4, 0x5a, 0xcc, 0x37, 0x19, 0x85, + 0xae, 0x67, 0xa5, 0x7e, + 0xd3, 0xd8, 0x63, 0x56, 0x47, 0xfa, 0xc3, 0xc9, 0xf3, 0x58, 0x47, 0xb1, + 0x2f, 0x6d, 0x3d, 0x17, + 0xda, 0x17, 0x33, 0x4e, 0xcc, 0x8a, 0x2f, 0x3c, 0x87, 0x75, 0x5a, 0x46, + 0xa9, 0x69, 0x1c, 0x98, + 0xde, 0x3f, 0x58, 0xcf, 0xa5, 0xbc, 0xc1, 0x39, 0x90, 0x2b, 0xef, 0xce, + 0x94, 0x6f, 0xf2, 0xbd, + 0xc4, 0xf1, 0x5a, 0xd1, 0xfb, 0x69, 0x3d, 0xf8, 0x84, 0xed, 0x52, 0x96, + 0x56, 0x5f, 0x4b, 0xe4, + 0x9b, 0xe4, 0x54, 0xd3, 0x08, 0xb9, 0x7c, 0xb9, 0xf5, 0x85, 0x27, 0xf8, + 0x42, 0xba, 0x7a, 0x2e, + 0xfd, 0xf9, 0x26, 0x6e, 0x32, 0xb6, 0xb4, 0x2f, 0x79, 0xe9, 0xf2, 0x4d, + 0x46, 0xc4, 0xf1, 0xe6, + 0xa3, 0x3d, 0xdc, 0xe7, 0xe8, 0x86, 0x58, 0x21, 0x3b, 0x6d, 0xd3, 0x45, + 0xbe, 0x33, 0x7b, 0xce, + 0xf2, 0x9c, 0xd5, 0x79, 0x8e, 0xf7, 0xd4, 0xae, 0x0b, 0xeb, 0xf7, 0x80, + 0xbd, 0xcc, 0xf4, 0x2e, + 0x3b, 0x7b, 0x46, 0xd7, 0xb9, 0x9e, 0xd3, 0x3a, 0x4f, 0xf7, 0x9c, 0xde, + 0x33, 0xb3, 0x7e, 0x8b, + 0xf6, 0x38, 0x57, 0xd4, 0x5e, 0xc6, 0x9c, 0xd1, 0x7b, 0xb2, 0x77, 0x71, + 0xf7, 0x62, 0xdf, 0xe2, + 0x9e, 0xe3, 0xeb, 0x8f, 0x6b, 0xd8, 0xce, 0x7c, 0xc4, 0xbd, 0x81, 0x3e, + 0x0a, 0x9d, 0xed, 0xb7, + 0x77, 0x5f, 0xed, 0x3d, 0xa3, 0xb3, 0xc8, 0x57, 0x2f, 0x7d, 0x08, 0x19, + 0x7c, 0x23, 0x5e, 0x81, + 0x21, 0x7e, 0x86, 0xff, 0x2f, 0x3c, 0x87, 0xe6, 0x37, 0x49, 0x23, 0xf3, + 0x4d, 0x32, 0xd6, 0xe9, + 0x32, 0x52, 0xe7, 0x9b, 0xe4, 0xbe, 0xa6, 0xd5, 0x01, 0xc6, 0xf1, 0xf6, + 0xfb, 0x4d, 0x54, 0x87, + 0xdf, 0xd5, 0xc7, 0x17, 0x32, 0xe5, 0x9b, 0x64, 0xcf, 0x7d, 0x1b, 0x4d, + 0xcc, 0x6a, 0x62, 0x0e, + 0x14, 0xe6, 0x44, 0xdb, 0x1e, 0x87, 0xcd, 0xd8, 0x34, 0x35, 0xcf, 0x9f, + 0x39, 0xdf, 0xc4, 0xe1, + 0xa5, 0xcf, 0x5b, 0x91, 0x94, 0x97, 0x31, 0xdf, 0xc4, 0x92, 0xad, 0x6a, + 0xd5, 0xe7, 0x95, 0xdb, + 0xf8, 0x7e, 0xeb, 0x63, 0x42, 0x9e, 0xa3, 0x84, 0xed, 0x92, 0xa4, 0x9b, + 0xa6, 0x8a, 0x4b, 0x96, + 0x6d, 0x66, 0x3d, 0x9f, 0xbc, 0x43, 0x54, 0x93, 0x7a, 0x88, 0xde, 0x8f, + 0x2d, 0x60, 0x11, 0xe5, + 0xcc, 0x7c, 0xe6, 0x7c, 0x13, 0xb3, 0x76, 0x8d, 0x5e, 0xc8, 0x64, 0xca, + 0x37, 0x19, 0x5d, 0x1c, + 0xaf, 0x35, 0x3f, 0xe0, 0xd8, 0xf4, 0x7e, 0x0b, 0xf9, 0x26, 0x6a, 0x8a, + 0x7c, 0x93, 0xe1, 0x7a, + 0xbf, 0x70, 0x23, 0xfa, 0x3f, 0x51, 0x45, 0xb6, 0xce, 0xe3, 0x98, 0xdb, + 0x9a, 0x4f, 0x67, 0x16, + 0x77, 0x9e, 0xee, 0x3b, 0xa5, 0xed, 0x54, 0xe6, 0xc4, 0xee, 0x33, 0xfd, + 0x6f, 0xcb, 0x6b, 0x38, + 0x5b, 0xdb, 0xb5, 0xcc, 0x92, 0xd6, 0x93, 0x7d, 0xa7, 0x75, 0x90, 0xf7, + 0x3b, 0x17, 0x32, 0x5a, + 0xe3, 0x25, 0xfe, 0x79, 0x2d, 0xab, 0x99, 0x9f, 0x36, 0x5d, 0xc1, 0x5c, + 0xdd, 0xf8, 0x63, 0xdf, + 0x95, 0x2d, 0x57, 0xf8, 0x7f, 0x1c, 0x7b, 0x12, 0xbe, 0xcb, 0xfd, 0x16, + 0x75, 0x35, 0xda, 0xfc, + 0x17, 0xb6, 0xad, 0xf0, 0x5d, 0xdb, 0x3e, 0xc9, 0x7b, 0x4e, 0x70, 0x23, + 0x8b, 0xc9, 0x7f, 0x90, + 0x67, 0xd1, 0x66, 0xe1, 0x23, 0xfc, 0x70, 0xa4, 0xca, 0x9b, 0x61, 0x6d, + 0x34, 0xed, 0xb0, 0xe2, + 0x50, 0xa5, 0x97, 0xc6, 0x6c, 0x0d, 0xcf, 0x37, 0x19, 0x1e, 0x97, 0xdc, + 0x87, 0x0b, 0xac, 0x95, + 0x98, 0xd5, 0x82, 0x9c, 0xd4, 0xae, 0xb1, 0xa8, 0x6d, 0xd3, 0x73, 0x92, + 0x39, 0x40, 0xd7, 0x9f, + 0x74, 0xfa, 0x9a, 0x99, 0x6f, 0x12, 0xae, 0xf4, 0xb8, 0xc9, 0xbc, 0xcb, + 0x58, 0x23, 0xd8, 0xf2, + 0x1c, 0xc8, 0x61, 0xcc, 0x6a, 0x8a, 0x1c, 0x97, 0x74, 0xf5, 0x5c, 0xcc, + 0x7c, 0x93, 0x0c, 0xf5, + 0x5c, 0x06, 0x72, 0x5c, 0x42, 0x39, 0x8a, 0x59, 0x1d, 0xe5, 0x98, 0x54, + 0x8d, 0xd1, 0x0f, 0x98, + 0xee, 0x9c, 0x74, 0x4c, 0xd2, 0xeb, 0x6b, 0x83, 0xb9, 0xf2, 0xd9, 0xf2, + 0x4d, 0x2c, 0xd5, 0xaa, + 0x1f, 0x63, 0x9d, 0x6e, 0xeb, 0x7a, 0xff, 0x90, 0x7c, 0x13, 0x6f, 0xda, + 0x3a, 0x5d, 0xc3, 0xea, + 0xb9, 0x1c, 0x70, 0x8e, 0xcb, 0x98, 0xe3, 0x78, 0xb3, 0xd4, 0xed, 0xe8, + 0xc3, 0x75, 0xba, 0x4e, + 0xb9, 0x9a, 0xb2, 0xe5, 0x9b, 0x0c, 0xb5, 0x5d, 0x4a, 0xf8, 0x3f, 0xa3, + 0xcf, 0xd4, 0xab, 0x90, + 0xad, 0xfd, 0x5a, 0xe6, 0xcc, 0x36, 0xa7, 0x77, 0x61, 0xe7, 0x82, 0xba, + 0x23, 0x7b, 0xa7, 0x79, + 0x1c, 0x1b, 0x27, 0xf9, 0x9f, 0xd7, 0xaf, 0x04, 0x53, 0x3a, 0x6f, 0xf1, + 0x4e, 0xe9, 0x9d, 0xca, + 0xcc, 0xe9, 0x9e, 0xe7, 0x9d, 0xb7, 0x71, 0xb6, 0xf7, 0x27, 0xed, 0x73, + 0x7d, 0xeb, 0x5a, 0xae, + 0x63, 0x1c, 0xbd, 0x95, 0x3e, 0x57, 0x4f, 0x95, 0xd7, 0xdd, 0x5b, 0xee, + 0x2f, 0x6b, 0xdc, 0x0a, + 0x3f, 0xe4, 0xbe, 0x44, 0x2b, 0x5a, 0x6d, 0xfe, 0xdb, 0x5b, 0x0f, 0x67, + 0xce, 0x6f, 0xfe, 0x81, + 0xaf, 0x2a, 0xfe, 0x30, 0xdb, 0x02, 0x43, 0x38, 0x2a, 0x60, 0xb4, 0x5f, + 0xd8, 0x85, 0x7f, 0xa3, + 0x5e, 0xc2, 0x65, 0xd3, 0xfb, 0xf3, 0x68, 0x1c, 0x2f, 0xb1, 0xdf, 0xf3, + 0xd3, 0xd6, 0x73, 0x31, + 0xfd, 0x26, 0x5e, 0xd3, 0x17, 0xae, 0xe6, 0xfb, 0x33, 0xc6, 0x6c, 0xe5, + 0xb2, 0x26, 0x35, 0x3f, + 0x38, 0x07, 0x46, 0xa9, 0xf7, 0xa3, 0xd4, 0x79, 0xff, 0xb4, 0x3f, 0x19, + 0xea, 0xb9, 0x1c, 0x8c, + 0x98, 0x55, 0xb3, 0x46, 0x45, 0xfe, 0x01, 0xd5, 0xa8, 0x18, 0xf0, 0x9b, + 0x90, 0xbe, 0x54, 0xf5, + 0xd7, 0x18, 0x1f, 0xce, 0xd7, 0x93, 0xfc, 0x26, 0xa6, 0xb6, 0xad, 0xe7, + 0xa6, 0x26, 0xf5, 0xa8, + 0xc7, 0xc4, 0xa2, 0x1f, 0xd0, 0x6a, 0x1c, 0xef, 0x88, 0x3a, 0x5f, 0x29, + 0xf3, 0xfe, 0xb3, 0xe6, + 0x9b, 0xe4, 0x38, 0xbe, 0x7f, 0x34, 0x71, 0xbc, 0xe9, 0x39, 0xb3, 0x89, + 0xeb, 0x5a, 0x49, 0xc2, + 0x76, 0x69, 0x76, 0xa7, 0xd6, 0xd7, 0xfa, 0xfc, 0x26, 0xd6, 0x62, 0xe7, + 0xb2, 0xd4, 0xaa, 0x1f, + 0x65, 0x7c, 0xff, 0x68, 0xe2, 0x78, 0x29, 0x2e, 0x64, 0xce, 0x37, 0x71, + 0xf8, 0xa8, 0xc6, 0x56, + 0x28, 0x25, 0x70, 0x3d, 0x80, 0x3e, 0x47, 0xef, 0x18, 0x17, 0xe1, 0x92, + 0xae, 0xeb, 0x99, 0xb9, + 0x84, 0xdf, 0x2d, 0x6f, 0x5c, 0xee, 0xaf, 0x0d, 0x3f, 0xc4, 0xbd, 0x28, + 0x3f, 0xc4, 0xed, 0xd5, + 0xcf, 0x07, 0xb3, 0xda, 0xaf, 0xf7, 0x4e, 0xe8, 0x3d, 0x8e, 0x59, 0x1b, + 0x5f, 0xc7, 0xdc, 0xd9, + 0xe4, 0xf7, 0xf3, 0xcd, 0x87, 0xb1, 0x77, 0xb4, 0x9f, 0xeb, 0x75, 0x77, + 0x2c, 0x61, 0xd6, 0xc5, + 0x56, 0xb2, 0x2b, 0x1b, 0x57, 0xf8, 0x57, 0x18, 0x4f, 0x73, 0x1f, 0xf1, + 0xaf, 0xc2, 0xa3, 0xbb, + 0xe7, 0xfb, 0xae, 0x6b, 0x1f, 0xef, 0x3b, 0xbf, 0xed, 0x16, 0x6f, 0x51, + 0x23, 0xe6, 0xfe, 0x00, + 0xef, 0x41, 0x5d, 0xd2, 0xcf, 0xd1, 0x1b, 0xc2, 0x6e, 0xb4, 0x4b, 0x7c, + 0x1b, 0x15, 0x8e, 0x56, + 0xef, 0xa7, 0xfa, 0x5a, 0x20, 0x85, 0x1d, 0x96, 0xb4, 0xbf, 0x89, 0x3d, + 0x4d, 0xbe, 0x49, 0x52, + 0x1c, 0x6f, 0xce, 0xe6, 0xc0, 0x81, 0x69, 0xdb, 0x49, 0x7e, 0x13, 0x82, + 0xa5, 0xa9, 0xf2, 0x4d, + 0x86, 0xd4, 0xc1, 0xef, 0xd3, 0xb0, 0x0e, 0xd5, 0x1c, 0x18, 0xa2, 0x6d, + 0x67, 0x3d, 0x67, 0x25, + 0x43, 0x35, 0x03, 0x9b, 0x96, 0xa9, 0x4e, 0x97, 0x8d, 0x71, 0x98, 0x3c, + 0x3d, 0x6f, 0xcc, 0x1a, + 0xd6, 0x88, 0x3d, 0x37, 0x0f, 0x42, 0x7c, 0xbf, 0xd5, 0x38, 0xde, 0xc2, + 0x6c, 0xf9, 0x26, 0xe1, + 0x84, 0xed, 0x92, 0x31, 0xdf, 0x84, 0x60, 0xa1, 0xa5, 0xbc, 0x1f, 0xf1, + 0xfb, 0xa8, 0x5d, 0x63, + 0x33, 0xfd, 0x80, 0x85, 0x81, 0x2c, 0xf9, 0x26, 0x91, 0x4a, 0x33, 0x57, + 0x3e, 0xad, 0xbe, 0x76, + 0x10, 0xe2, 0xfb, 0x0b, 0xc7, 0xe8, 0xf3, 0x4a, 0x5d, 0xcf, 0xc5, 0x6d, + 0xde, 0x9b, 0xc4, 0x7a, + 0x3d, 0x87, 0xf9, 0x07, 0x7e, 0x19, 0xfd, 0x5a, 0xbe, 0x11, 0xdb, 0xda, + 0x97, 0x32, 0x37, 0xb7, + 0xb9, 0x7d, 0x93, 0x7b, 0x26, 0xfb, 0x2a, 0x5a, 0x4f, 0x67, 0x9e, 0xc5, + 0xff, 0xc3, 0xbe, 0x17, + 0x3a, 0x17, 0xcc, 0xee, 0xbe, 0xda, 0xeb, 0xee, 0x9a, 0xec, 0x9b, 0xda, + 0x3e, 0xd9, 0x3b, 0xa1, + 0x7b, 0xbe, 0x97, 0x6b, 0x99, 0xe3, 0x5b, 0xd2, 0x76, 0x8e, 0x77, 0x4e, + 0xdb, 0x2a, 0xcf, 0xc2, + 0xf6, 0x85, 0x75, 0xc7, 0xf5, 0x2c, 0x66, 0x4e, 0x8d, 0x6d, 0x67, 0xff, + 0x21, 0xb6, 0x41, 0x47, + 0xf7, 0x62, 0xdf, 0x19, 0x5d, 0x53, 0x7c, 0xf3, 0x3a, 0x6e, 0xf0, 0x4d, + 0xee, 0x38, 0x93, 0x79, + 0x0f, 0x7f, 0x0c, 0x3f, 0x92, 0xf6, 0xa1, 0x97, 0xf8, 0x3d, 0xf0, 0x35, + 0xfe, 0x4b, 0x7c, 0x45, + 0x96, 0x7e, 0xda, 0x33, 0xed, 0xd7, 0x90, 0x14, 0x97, 0xec, 0x4e, 0x5e, + 0x6f, 0xd3, 0xe5, 0x9b, + 0x1c, 0x68, 0xad, 0xfa, 0x54, 0x73, 0x40, 0xcc, 0x89, 0xcf, 0x0b, 0xd3, + 0x39, 0x50, 0x11, 0xcc, + 0x96, 0x6f, 0x62, 0xf3, 0x53, 0x2e, 0x4f, 0xe6, 0x1d, 0xc8, 0x45, 0x2c, + 0x7b, 0x6e, 0xb5, 0x6d, + 0xb3, 0xae, 0x9b, 0x27, 0x5b, 0xbe, 0x09, 0x7d, 0xe6, 0x2a, 0xb3, 0xe5, + 0x9b, 0x64, 0x88, 0x65, + 0x1f, 0xbe, 0xcf, 0x64, 0x5e, 0x7f, 0xdc, 0x50, 0xb6, 0x9a, 0x5b, 0x07, + 0x21, 0xbe, 0x3f, 0xfb, + 0x39, 0x13, 0xb6, 0xcb, 0xa0, 0xdf, 0x24, 0x75, 0xbe, 0x49, 0x02, 0x8b, + 0xf2, 0x32, 0xe7, 0x9b, + 0x8c, 0x06, 0x17, 0x72, 0x55, 0x8f, 0x77, 0x50, 0xd7, 0xcb, 0xa2, 0xaf, + 0x59, 0xc9, 0x37, 0x39, + 0x44, 0xf1, 0xfd, 0xd6, 0xf3, 0xf3, 0x07, 0xfc, 0x26, 0x65, 0xc9, 0xf9, + 0x26, 0x91, 0x07, 0xbc, + 0xef, 0xe1, 0xd7, 0xd0, 0xc7, 0x68, 0x3b, 0x72, 0x76, 0x8e, 0x67, 0x6e, + 0x6d, 0xb9, 0xc2, 0x77, + 0x7e, 0xe7, 0xf9, 0x9e, 0x25, 0xdd, 0x93, 0xbc, 0xf6, 0xf8, 0xbd, 0xfe, + 0x3f, 0x69, 0x17, 0x80, + 0x69, 0x9d, 0x75, 0xbe, 0xab, 0x5a, 0xaf, 0x62, 0x2e, 0x6f, 0xbf, 0xdc, + 0x77, 0x59, 0xe7, 0x52, + 0x46, 0x6c, 0x9b, 0xee, 0xbf, 0xbe, 0xe5, 0x1c, 0xdf, 0x61, 0x8d, 0xeb, + 0x99, 0xab, 0xdb, 0xaf, + 0xf2, 0x5f, 0xd8, 0x33, 0x91, 0xa9, 0x6e, 0xda, 0xc2, 0x7e, 0xa5, 0x2d, + 0x87, 0xb6, 0x8e, 0xab, + 0xfc, 0xe7, 0xf7, 0x4c, 0xf6, 0x56, 0x77, 0x5c, 0xee, 0x3d, 0xaf, 0xbb, + 0x82, 0xb9, 0x5f, 0xfa, + 0x08, 0xec, 0x16, 0x76, 0xe3, 0xdd, 0xc2, 0x5e, 0xb8, 0x87, 0x7f, 0x0b, + 0x7d, 0x8a, 0x4b, 0x51, + 0x0e, 0xb4, 0x6d, 0xb3, 0x26, 0x75, 0xb1, 0x9e, 0xc5, 0x6f, 0x12, 0xac, + 0xe8, 0xd7, 0xb6, 0xd1, + 0xa1, 0x9a, 0x03, 0x63, 0xd2, 0xfb, 0x33, 0xe4, 0x9b, 0x50, 0x6c, 0xcf, + 0x96, 0x6f, 0x72, 0x90, + 0xe6, 0xc0, 0xd8, 0xe2, 0x72, 0x86, 0xd4, 0xc1, 0xb7, 0x96, 0x6f, 0x32, + 0x4e, 0x49, 0x3f, 0x07, + 0x86, 0xee, 0xb9, 0x59, 0xc4, 0x52, 0xad, 0xd1, 0xac, 0xf3, 0x25, 0x64, + 0xce, 0x95, 0xff, 0x7e, + 0xc6, 0x84, 0xd8, 0x11, 0xc9, 0x7a, 0x7f, 0xaa, 0x7a, 0x2e, 0xfd, 0xf9, + 0x26, 0x19, 0xea, 0xb9, + 0x8c, 0xc6, 0x7e, 0xb7, 0x1f, 0xaa, 0x7a, 0x3e, 0xc9, 0xf9, 0x26, 0x8d, + 0x55, 0xb5, 0x43, 0xee, + 0xab, 0x89, 0xeb, 0xa5, 0x43, 0xeb, 0xe0, 0x0b, 0x85, 0xa3, 0xa8, 0x81, + 0x99, 0xb3, 0xda, 0x35, + 0x56, 0x6b, 0xd5, 0x9b, 0x31, 0x82, 0x14, 0xd7, 0x2f, 0x56, 0xfe, 0xc8, + 0xbd, 0x86, 0xf6, 0xa0, + 0xdd, 0xe0, 0xf7, 0xa8, 0xbd, 0xa1, 0x98, 0xb1, 0x77, 0x1f, 0xc5, 0x2c, + 0x6c, 0x9d, 0xcf, 0x5c, + 0xd5, 0xb4, 0x92, 0x2d, 0xeb, 0x3c, 0x92, 0x7b, 0x2b, 0x78, 0x29, 0x98, + 0xd6, 0xba, 0xc6, 0xfb, + 0x83, 0x8e, 0x0b, 0x99, 0x73, 0xda, 0xce, 0x25, 0xed, 0x72, 0x06, 0x36, + 0xcc, 0x60, 0xaf, 0x6f, + 0x39, 0xdb, 0x3f, 0xad, 0x79, 0x8d, 0xff, 0xc6, 0xc6, 0x2b, 0xb9, 0xda, + 0x96, 0x53, 0x18, 0x67, + 0xe3, 0xa3, 0xfe, 0x77, 0x42, 0xf3, 0xe1, 0xb4, 0xae, 0xe5, 0xbe, 0xe3, + 0x36, 0x56, 0xd7, 0x57, + 0x77, 0x9f, 0xee, 0xb9, 0xad, 0xc3, 0xe6, 0xdf, 0xa0, 0x7e, 0xc1, 0xed, + 0xe4, 0x77, 0xf1, 0xaf, + 0x89, 0xbb, 0xe1, 0xeb, 0x78, 0x27, 0xfe, 0x02, 0x6b, 0x39, 0xd1, 0xb6, + 0xfb, 0xe3, 0x78, 0xc7, + 0x0d, 0xa9, 0xe7, 0x32, 0x7c, 0x7f, 0x13, 0x57, 0x6d, 0x55, 0xb6, 0x7c, + 0x93, 0x83, 0x52, 0xd3, + 0xaa, 0x70, 0xcc, 0x3e, 0xaf, 0x11, 0xf9, 0x26, 0x2d, 0x09, 0xee, 0xe0, + 0x6e, 0x4c, 0xd8, 0x1e, + 0xa9, 0xfc, 0xe1, 0xb6, 0x03, 0xa8, 0x55, 0x9f, 0x26, 0x66, 0x35, 0x27, + 0x35, 0x2a, 0x28, 0x57, + 0xa3, 0x73, 0xa0, 0x2c, 0x92, 0x22, 0xdf, 0x24, 0xc9, 0x6f, 0x52, 0xa0, + 0x97, 0xa7, 0x9d, 0x03, + 0xe6, 0xbe, 0xd0, 0xfa, 0xe0, 0x5e, 0xca, 0x09, 0xdb, 0x25, 0xb3, 0xbe, + 0x96, 0x56, 0xef, 0x3f, + 0x30, 0x4d, 0xe3, 0x80, 0xc6, 0x64, 0x48, 0xbe, 0x49, 0x0a, 0x7f, 0xd8, + 0xf0, 0x7c, 0x93, 0xbc, + 0x43, 0x1f, 0xdf, 0x6f, 0xb5, 0x76, 0x0d, 0x36, 0x6b, 0x52, 0x07, 0xcd, + 0x7c, 0x93, 0xf4, 0x7e, + 0x13, 0xd5, 0xc6, 0xd2, 0xbe, 0xe5, 0xd8, 0x7e, 0xcf, 0xa1, 0x1f, 0x90, + 0xce, 0xd1, 0x02, 0xf4, + 0x4b, 0x44, 0xd0, 0x8f, 0x7f, 0x1d, 0xbd, 0x82, 0x3e, 0x82, 0xff, 0x27, + 0xed, 0xe2, 0x6e, 0xef, + 0x3c, 0xdb, 0x77, 0x7e, 0xcf, 0x49, 0x5e, 0x5b, 0xcb, 0x35, 0xcc, 0xc5, + 0x5d, 0x76, 0x66, 0x53, + 0xfc, 0x7a, 0x76, 0x66, 0xe7, 0x15, 0x1e, 0x77, 0xef, 0x34, 0xcf, 0xec, + 0xae, 0x59, 0x9e, 0x69, + 0x5d, 0xc7, 0x31, 0xb0, 0xe9, 0x70, 0xdf, 0x0d, 0x6d, 0x67, 0x33, 0x0b, + 0xda, 0x96, 0x32, 0x95, + 0xdd, 0x76, 0xdf, 0x0f, 0xda, 0xce, 0x62, 0x2a, 0x1a, 0x5e, 0xf2, 0x6f, + 0x8b, 0xd9, 0xc0, 0xc5, + 0x6d, 0xb7, 0xf8, 0x4a, 0xba, 0x7f, 0xec, 0x3b, 0xab, 0x73, 0xa2, 0xef, + 0xfa, 0xce, 0x99, 0xde, + 0xd3, 0xf5, 0x37, 0xd9, 0x7d, 0x68, 0x17, 0xbf, 0x4b, 0x20, 0x18, 0x8b, + 0x77, 0xa1, 0xd7, 0xf0, + 0x9f, 0xd1, 0xf4, 0x5c, 0x68, 0xdb, 0x29, 0xd7, 0xe3, 0xa1, 0x75, 0xf0, + 0x33, 0xe6, 0x9b, 0xf4, + 0xdb, 0x1e, 0x87, 0x70, 0x0e, 0x8c, 0x52, 0xef, 0x47, 0x85, 0x06, 0xe1, + 0xaf, 0x04, 0xbf, 0xcd, + 0x7c, 0x93, 0xe6, 0x7e, 0x9f, 0x49, 0x72, 0x5c, 0x32, 0xc5, 0xf5, 0x7c, + 0x8e, 0xe6, 0xa2, 0x57, + 0xa8, 0xdf, 0xcb, 0x3e, 0xac, 0x96, 0xd6, 0x63, 0xca, 0x99, 0xd3, 0xed, + 0x1f, 0x6c, 0xe6, 0x9b, + 0xc4, 0x2b, 0xeb, 0x28, 0xef, 0x48, 0x8a, 0xb1, 0x46, 0x23, 0x63, 0x79, + 0x13, 0x75, 0xf0, 0xcb, + 0xa8, 0x7d, 0xdd, 0x3a, 0x42, 0x6b, 0x1c, 0x61, 0x87, 0x7d, 0x8f, 0x7b, + 0xd3, 0x5a, 0xaa, 0x55, + 0x5f, 0xac, 0x3b, 0x98, 0x74, 0xfa, 0x9a, 0x19, 0x97, 0x3c, 0xc6, 0x38, + 0xde, 0x03, 0xf7, 0x03, + 0x8e, 0x2e, 0x5e, 0x6f, 0xa0, 0x9e, 0x4b, 0xca, 0x7c, 0x13, 0x67, 0xdf, + 0xfe, 0x26, 0xe9, 0xf3, + 0x88, 0x72, 0xbb, 0x3f, 0xf3, 0x68, 0xf5, 0xfe, 0x6b, 0xd0, 0x97, 0xf0, + 0x65, 0xbc, 0x13, 0xee, + 0xe7, 0xdf, 0x57, 0x43, 0xf8, 0xe6, 0xa0, 0x08, 0x60, 0x74, 0x29, 0xb8, + 0xbd, 0xf9, 0x52, 0xce, + 0xd6, 0xfe, 0x23, 0xff, 0x8f, 0x3b, 0x6c, 0x4c, 0x73, 0x6c, 0x89, 0x7f, + 0x6e, 0xd7, 0x75, 0x9e, + 0xaa, 0xce, 0x63, 0xeb, 0x56, 0xc6, 0x57, 0xb3, 0xcb, 0x63, 0xb5, 0x10, + 0x37, 0x4d, 0x63, 0x97, + 0xb4, 0x9c, 0xe3, 0x9d, 0xd0, 0xb6, 0xd6, 0xff, 0xe3, 0xee, 0x4a, 0xcf, + 0x8f, 0xdb, 0xce, 0x20, + 0xf3, 0xf4, 0x25, 0xff, 0x9a, 0x16, 0x1b, 0xb7, 0xb4, 0xed, 0x87, 0xbe, + 0xe2, 0x4e, 0x85, 0xb9, + 0xb9, 0xbd, 0xd8, 0x7f, 0x76, 0xf7, 0x49, 0x3e, 0x77, 0xc3, 0x56, 0xff, + 0xa7, 0x78, 0x97, 0xb0, + 0x97, 0xdf, 0x8b, 0x76, 0xe1, 0x3d, 0x04, 0x6b, 0x3f, 0x40, 0x5b, 0x70, + 0xde, 0x41, 0x8a, 0x59, + 0x1d, 0x3a, 0x66, 0xd4, 0x96, 0xae, 0x8c, 0x96, 0xd6, 0xa7, 0xd5, 0xd7, + 0xa8, 0x1d, 0x46, 0xf0, + 0xd2, 0xda, 0x1c, 0xc8, 0x61, 0x1c, 0xaf, 0xe5, 0x9a, 0x56, 0x64, 0xde, + 0x99, 0xcf, 0xe3, 0xb0, + 0xfd, 0x4d, 0x28, 0x1f, 0xec, 0xd3, 0x70, 0x4d, 0xdb, 0x83, 0xd6, 0x42, + 0xa6, 0xf9, 0x26, 0x62, + 0x86, 0x98, 0xad, 0xef, 0x25, 0x66, 0x35, 0xa5, 0x86, 0x85, 0xd2, 0xd6, + 0xc1, 0x27, 0xb8, 0xee, + 0x08, 0x16, 0xfa, 0x0b, 0xe4, 0x7c, 0x40, 0xe7, 0x4b, 0xaa, 0xf9, 0x6a, + 0xee, 0x41, 0x49, 0xee, + 0x7d, 0xa2, 0x9e, 0x4b, 0xba, 0x3d, 0x37, 0x89, 0x9d, 0x6c, 0xa5, 0xce, + 0x97, 0xb5, 0x5a, 0xf5, + 0x07, 0x65, 0x4c, 0xb2, 0xe7, 0x9b, 0xb8, 0x6a, 0xdd, 0xc4, 0xfe, 0x2d, + 0xce, 0x94, 0x6f, 0x62, + 0x39, 0xbe, 0xbf, 0xe4, 0xe0, 0xed, 0x4d, 0x9b, 0x42, 0x5f, 0x33, 0x71, + 0xbd, 0xc9, 0x9d, 0xb6, + 0x9e, 0x4b, 0x72, 0x1d, 0xfc, 0xe2, 0x43, 0xbf, 0x37, 0xed, 0x40, 0x8d, + 0x8a, 0x12, 0xfe, 0x33, + 0xb4, 0x0f, 0xee, 0xc2, 0x7b, 0xb9, 0xb7, 0xe1, 0x1f, 0x8c, 0xcb, 0xb8, + 0xc2, 0x76, 0x3b, 0x5b, + 0xdc, 0x55, 0xc1, 0x94, 0x74, 0x3b, 0x7d, 0xf3, 0xba, 0x6e, 0xf4, 0x1e, + 0xb9, 0xb1, 0xdc, 0xfb, + 0x78, 0xe4, 0x6a, 0x6e, 0x52, 0x47, 0x8d, 0x6f, 0x76, 0x8f, 0xdb, 0x33, + 0xb9, 0x6b, 0x0a, 0x33, + 0x7e, 0xa3, 0x93, 0xb9, 0xac, 0x7d, 0x8e, 0xf7, 0xd6, 0xd6, 0x1f, 0xfa, + 0x6c, 0xdd, 0x2e, 0xff, + 0xd4, 0x1e, 0x1b, 0x73, 0x69, 0xeb, 0x39, 0xbe, 0x69, 0x8d, 0x9b, 0x98, + 0x53, 0xba, 0xa6, 0xf9, + 0x57, 0x74, 0xcd, 0xf3, 0x55, 0x77, 0x39, 0x3d, 0xae, 0x2e, 0x07, 0x73, + 0x42, 0xc7, 0xa5, 0x3e, + 0x5b, 0x13, 0xc7, 0xfe, 0x81, 0x7f, 0x15, 0xef, 0xc5, 0x7b, 0xd1, 0x5e, + 0x7e, 0x17, 0xda, 0xcd, + 0xbf, 0x8c, 0xfe, 0x84, 0x2f, 0x40, 0x07, 0xe4, 0xf3, 0xb2, 0x16, 0xc7, + 0x8b, 0x06, 0xe6, 0x40, + 0x3a, 0x7d, 0xad, 0x3f, 0xdf, 0x84, 0xdc, 0x9f, 0xe2, 0x2c, 0xf9, 0x26, + 0x96, 0x6a, 0xd5, 0x8f, + 0x62, 0x0e, 0x58, 0xdb, 0x6f, 0x91, 0xe6, 0x9c, 0x16, 0x8e, 0xcc, 0x37, + 0xe9, 0xf3, 0x87, 0xd3, + 0xf9, 0x4f, 0x71, 0xd0, 0x9c, 0x37, 0x4d, 0x89, 0x7c, 0x93, 0x44, 0x0d, + 0x93, 0x14, 0xfe, 0xf0, + 0xd1, 0x68, 0x58, 0x16, 0xe7, 0xc0, 0x81, 0xef, 0xb7, 0xd8, 0x97, 0x6f, + 0x42, 0x9e, 0x47, 0xca, + 0xe3, 0xe8, 0x3d, 0x31, 0xeb, 0x3f, 0x53, 0x5b, 0x37, 0x64, 0xf3, 0x17, + 0xe9, 0x85, 0x6c, 0x46, + 0x3f, 0x60, 0xaa, 0x7a, 0x2e, 0xfd, 0x76, 0x18, 0x99, 0x2f, 0x34, 0x46, + 0x3b, 0xad, 0xbe, 0x96, + 0xf3, 0x31, 0x49, 0xd4, 0xf9, 0x2a, 0x1e, 0xb3, 0xde, 0x9f, 0x1c, 0x97, + 0x6c, 0x31, 0xdf, 0xe4, + 0x80, 0x6a, 0xd5, 0xa7, 0xc0, 0x85, 0x03, 0xaf, 0x69, 0x35, 0xd0, 0x97, + 0x42, 0xaa, 0xbd, 0x93, + 0xb1, 0xcd, 0x9c, 0x6f, 0x92, 0x0f, 0x2c, 0xc6, 0xf1, 0x1e, 0x94, 0xda, + 0x35, 0x1e, 0xfe, 0x77, + 0x68, 0x17, 0x7a, 0x1d, 0xef, 0x87, 0x6f, 0xa3, 0x4f, 0x05, 0x1e, 0x5c, + 0xd8, 0xba, 0x84, 0xbd, + 0xb2, 0xf5, 0xc7, 0xec, 0x35, 0x6d, 0x97, 0xb3, 0x57, 0x77, 0x9c, 0xe5, + 0x2b, 0x6a, 0xfb, 0xa9, + 0xff, 0x1b, 0xcd, 0x0b, 0x6c, 0x6d, 0x97, 0xfa, 0x57, 0x36, 0x2e, 0xf5, + 0xde, 0x40, 0x6c, 0xe1, + 0x9b, 0x5a, 0xaf, 0xf5, 0x37, 0x34, 0x9e, 0xc6, 0x1c, 0xdd, 0xbc, 0xdc, + 0x77, 0x53, 0xd3, 0x35, + 0xde, 0x6b, 0x5b, 0x7e, 0xea, 0x61, 0x5a, 0x17, 0xf9, 0x8e, 0x6e, 0x5d, + 0xc9, 0x94, 0x75, 0x5f, + 0xcc, 0xdc, 0xd8, 0x6e, 0x63, 0x2e, 0x6b, 0x5c, 0xe5, 0xbd, 0xba, 0xed, + 0x3a, 0xef, 0x9a, 0x46, + 0xaf, 0xaf, 0xac, 0xed, 0x3c, 0xdf, 0x3b, 0xfc, 0x3e, 0xf4, 0x06, 0x7e, + 0x0b, 0xed, 0x27, 0x1c, + 0x70, 0x27, 0xbf, 0x13, 0xbd, 0x83, 0xdf, 0x47, 0xb6, 0x54, 0xcf, 0x5c, + 0x2e, 0x63, 0x56, 0xd3, + 0xe8, 0x7a, 0x63, 0xcd, 0x37, 0x49, 0xf0, 0x74, 0x8b, 0xb5, 0xea, 0x73, + 0xb4, 0x0f, 0x2b, 0xdd, + 0x23, 0x27, 0x63, 0xfe, 0xa7, 0x89, 0xeb, 0x0e, 0x7f, 0x65, 0x93, 0xbb, + 0xd6, 0xd9, 0xd8, 0xa7, + 0x15, 0xa6, 0xd8, 0x3f, 0x98, 0xe2, 0xba, 0xd5, 0x39, 0x90, 0xd3, 0x7d, + 0x58, 0xad, 0x69, 0x58, + 0x09, 0x5b, 0x55, 0xcf, 0x67, 0x28, 0x96, 0xd9, 0xb4, 0x42, 0xd6, 0x16, + 0xec, 0xdb, 0xf3, 0x32, + 0x45, 0xfd, 0xe7, 0x74, 0x7a, 0xff, 0x90, 0xb8, 0xe4, 0xe4, 0xda, 0x56, + 0x03, 0xf5, 0x5c, 0x1c, + 0x23, 0xf6, 0x99, 0xfc, 0x3e, 0xe2, 0x78, 0xcd, 0x31, 0x89, 0x67, 0x19, + 0x13, 0x72, 0x5f, 0xa9, + 0x1d, 0x51, 0x19, 0x2b, 0xab, 0xcf, 0x98, 0x6f, 0x62, 0xda, 0x2e, 0x16, + 0xed, 0x88, 0x5c, 0xee, + 0x4d, 0x6b, 0x61, 0x0f, 0x4a, 0xd3, 0x17, 0x4e, 0xf9, 0x42, 0xda, 0x7a, + 0x2e, 0x7d, 0x76, 0x18, + 0xad, 0x5d, 0x43, 0xf3, 0x4d, 0x32, 0xd9, 0x2e, 0xb9, 0xde, 0x9b, 0xd6, + 0xac, 0x5d, 0x33, 0x89, + 0xfd, 0x1b, 0xde, 0x8d, 0xf6, 0xa3, 0x3d, 0x68, 0x1f, 0x78, 0x07, 0xfd, + 0x5e, 0xbe, 0x1d, 0x54, + 0x75, 0x2f, 0xf4, 0x2f, 0xe8, 0x38, 0x82, 0x99, 0xdf, 0xb5, 0x80, 0xa9, + 0xea, 0x28, 0x62, 0xcf, + 0x8a, 0xbf, 0xee, 0xff, 0x5c, 0xd8, 0x8f, 0x16, 0xb7, 0x14, 0xb2, 0x73, + 0xda, 0x4f, 0x67, 0x16, + 0x77, 0x9f, 0xc4, 0x9c, 0xda, 0x3e, 0x87, 0xd9, 0x1a, 0xea, 0x26, 0x5c, + 0x71, 0x8a, 0xff, 0xf2, + 0xf6, 0x1f, 0x79, 0x7e, 0xd8, 0x75, 0x85, 0xe7, 0xdc, 0x9e, 0x29, 0xbe, + 0x23, 0x7b, 0x8e, 0xf7, + 0xd9, 0x7b, 0x96, 0x32, 0x67, 0x76, 0x55, 0xf8, 0x9a, 0x1b, 0xd7, 0xfb, + 0x7e, 0xd0, 0x75, 0x8d, + 0x77, 0x49, 0xfb, 0x39, 0xbe, 0x19, 0x1b, 0x5d, 0x9e, 0x8d, 0x81, 0x5f, + 0x83, 0x9d, 0x98, 0x20, + 0x20, 0xff, 0x06, 0xe1, 0x80, 0xaf, 0x13, 0x0e, 0xf8, 0x17, 0xc4, 0xa4, + 0xea, 0xcb, 0x28, 0x7c, + 0x5e, 0x56, 0xe3, 0x78, 0x33, 0xac, 0x8d, 0x09, 0x3b, 0x2c, 0x54, 0x61, + 0x29, 0xdf, 0x24, 0x11, + 0xc7, 0x3b, 0xee, 0x50, 0xe2, 0x02, 0xa2, 0x75, 0xb4, 0xca, 0xb3, 0x69, + 0x58, 0xb4, 0x9f, 0xc4, + 0xd6, 0xa0, 0x76, 0xc5, 0x40, 0xbe, 0x49, 0x53, 0x7f, 0x7e, 0x46, 0x72, + 0xbe, 0x49, 0xb9, 0x97, + 0x9e, 0x33, 0x63, 0x8d, 0x60, 0x0b, 0x75, 0xd9, 0x47, 0x1f, 0xb3, 0x3a, + 0x86, 0xda, 0x35, 0x3c, + 0x8d, 0xbb, 0xc8, 0x87, 0xb4, 0x0e, 0xfe, 0x58, 0xf4, 0x7e, 0x9a, 0x2b, + 0x4f, 0x71, 0xa1, 0x2c, + 0x5a, 0x9e, 0xbe, 0x9e, 0x0b, 0x19, 0xaf, 0x02, 0xeb, 0x7b, 0x56, 0x5b, + 0x8c, 0xe3, 0xcd, 0x95, + 0xde, 0x3f, 0x0e, 0xf5, 0xd7, 0xa4, 0xce, 0x98, 0x6f, 0x42, 0xf0, 0xd1, + 0xcc, 0x95, 0x97, 0x0b, + 0x32, 0xe6, 0x9b, 0x8c, 0x66, 0x6f, 0xda, 0x83, 0x5a, 0xcf, 0x27, 0xd3, + 0x3e, 0x93, 0x69, 0xea, + 0xb9, 0x8c, 0x1b, 0x59, 0xa3, 0x22, 0x73, 0x8e, 0x8b, 0xd5, 0xda, 0x35, + 0x81, 0x7b, 0xc1, 0x5b, + 0x70, 0x0f, 0x7a, 0x0b, 0xbd, 0x8e, 0xf6, 0xf8, 0xdf, 0x06, 0xbf, 0x55, + 0x57, 0x31, 0xb3, 0xba, + 0x4f, 0xf2, 0x9d, 0xd8, 0x79, 0x42, 0xed, 0x09, 0x5d, 0xc7, 0xd6, 0x2e, + 0x6e, 0xde, 0xe0, 0x7b, + 0x17, 0x7d, 0xc0, 0xbd, 0x0a, 0x3f, 0xc5, 0x2f, 0x85, 0xaf, 0xf3, 0x2f, + 0xec, 0x38, 0x9c, 0x99, + 0xbd, 0x71, 0x4e, 0xdd, 0xbc, 0xae, 0x62, 0x6f, 0x40, 0xfc, 0x2b, 0xf4, + 0xb4, 0xce, 0xf2, 0x3b, + 0x7a, 0xcb, 0x7c, 0x65, 0xbd, 0x65, 0x9e, 0xd2, 0xde, 0x49, 0xde, 0x49, + 0xdd, 0xe5, 0xde, 0x05, + 0xed, 0x37, 0xd6, 0x97, 0xf4, 0x1c, 0xe7, 0x79, 0xb8, 0x69, 0x3a, 0xb1, + 0x8d, 0xc9, 0xfa, 0xdd, + 0xe3, 0x60, 0x26, 0x77, 0x15, 0xf9, 0x6e, 0x56, 0x7e, 0x03, 0x76, 0xf2, + 0x84, 0x67, 0xf2, 0xfb, + 0xd1, 0x3e, 0xbc, 0x0f, 0xed, 0xc7, 0xfb, 0xd1, 0x17, 0x7c, 0x25, 0x3c, + 0x24, 0x71, 0xbc, 0x59, + 0x9e, 0xc7, 0x71, 0x5a, 0x85, 0x99, 0x57, 0x93, 0x1c, 0xbf, 0x96, 0x2a, + 0x2e, 0xd9, 0xac, 0x69, + 0xa5, 0x65, 0xcb, 0x37, 0x19, 0x05, 0x2e, 0x44, 0x2c, 0xc4, 0xeb, 0xc5, + 0xdd, 0x16, 0xf6, 0x77, + 0x2a, 0x06, 0xd4, 0x3e, 0x4a, 0xe2, 0xcc, 0x69, 0xeb, 0xb9, 0x64, 0xcf, + 0x37, 0xb1, 0x68, 0xbf, + 0xcb, 0x63, 0xa9, 0x49, 0x6d, 0x3d, 0x66, 0x35, 0x2b, 0x2e, 0x58, 0xaa, + 0xaf, 0x67, 0xea, 0xfd, + 0x30, 0x9d, 0xbe, 0x46, 0xed, 0x6d, 0xf3, 0x5e, 0x47, 0x69, 0xae, 0x7c, + 0x1a, 0x7d, 0x6d, 0xd4, + 0xba, 0x5e, 0x45, 0x4e, 0xc7, 0xa4, 0x78, 0xb8, 0xed, 0x92, 0x36, 0xdf, + 0x24, 0xa5, 0xbe, 0x86, + 0x46, 0xab, 0xeb, 0x59, 0xf6, 0x03, 0xc6, 0x5c, 0xf5, 0x56, 0x38, 0x4a, + 0x26, 0x3f, 0xa0, 0xe9, + 0x37, 0xd1, 0x68, 0xae, 0x7c, 0x55, 0xfa, 0x7c, 0x93, 0x3e, 0x3b, 0x2c, + 0x7f, 0x54, 0x7b, 0x56, + 0x5b, 0xdb, 0x9b, 0xf6, 0x78, 0xf1, 0xaf, 0xe8, 0x55, 0x4c, 0x31, 0x69, + 0x2f, 0xde, 0xc7, 0xed, + 0xc6, 0xaf, 0xa3, 0xbd, 0x70, 0x8f, 0xf8, 0x0a, 0x78, 0x59, 0x7c, 0x95, + 0x7b, 0x35, 0xf0, 0x12, + 0xfb, 0x96, 0xf8, 0x19, 0xd8, 0xcf, 0xed, 0x81, 0xaf, 0xa3, 0x57, 0xd1, + 0x87, 0xfc, 0xe7, 0xe0, + 0x85, 0xc0, 0x53, 0xdc, 0x53, 0xe2, 0x33, 0xec, 0xcf, 0x02, 0x4f, 0x70, + 0xbf, 0x20, 0x4c, 0xee, + 0xd7, 0xfc, 0xcf, 0xc1, 0xdd, 0x5a, 0xaf, 0x7f, 0xb3, 0x72, 0x37, 0xbb, + 0x31, 0xd4, 0xc3, 0x6d, + 0x0a, 0x76, 0xb3, 0x0f, 0x68, 0x0f, 0xfb, 0x9b, 0x8c, 0x07, 0xd9, 0x3d, + 0xf2, 0x46, 0xae, 0x23, + 0xd4, 0xc9, 0x76, 0x12, 0x9e, 0xd8, 0x19, 0x6c, 0xf6, 0x6f, 0x15, 0xf7, + 0xc1, 0xdd, 0x04, 0xff, + 0x5e, 0xe7, 0xf7, 0x60, 0x7a, 0xdc, 0xc5, 0xef, 0x41, 0x5f, 0x0a, 0x22, + 0x3a, 0x10, 0x5f, 0x78, + 0x99, 0xc5, 0x5a, 0x77, 0xa3, 0xd6, 0xb6, 0xd3, 0xd5, 0x73, 0x49, 0xda, + 0xdf, 0x24, 0xa5, 0xbe, + 0x36, 0xaa, 0x39, 0x90, 0x42, 0xd7, 0x4b, 0x31, 0x07, 0xa8, 0xbd, 0x90, + 0xcd, 0x96, 0xa6, 0x1a, + 0x16, 0xad, 0xcb, 0x94, 0x7a, 0x3d, 0x1e, 0x9a, 0x6f, 0x92, 0x72, 0xff, + 0xe0, 0xe4, 0xb8, 0x64, + 0x72, 0xce, 0x5c, 0xd6, 0xaa, 0xcf, 0x65, 0x9d, 0x96, 0x01, 0x8e, 0x32, + 0xca, 0xbd, 0x69, 0x87, + 0x8e, 0x45, 0x8a, 0x3a, 0xf8, 0x2d, 0x19, 0xf4, 0xb5, 0xcc, 0x7a, 0x7f, + 0x0a, 0x5d, 0xef, 0xe0, + 0xee, 0x4d, 0x3b, 0xc4, 0x76, 0xa1, 0xf7, 0x35, 0x5c, 0x31, 0x32, 0xdf, + 0xa4, 0x31, 0xb1, 0x97, + 0x72, 0xb2, 0x3f, 0x3c, 0x91, 0xe3, 0x92, 0x8d, 0x2f, 0x58, 0x8c, 0xd7, + 0xd3, 0xca, 0xd9, 0xab, + 0xc5, 0x2f, 0xe0, 0xb7, 0xf0, 0x4f, 0xe8, 0x2f, 0xe8, 0x4b, 0xf4, 0x1b, + 0xf4, 0x05, 0xfa, 0x0c, + 0x7d, 0x8a, 0xbe, 0x80, 0x9f, 0xa2, 0x8f, 0xc9, 0xab, 0x0f, 0x79, 0xfa, + 0xdb, 0xaf, 0xf0, 0x67, + 0xe8, 0x13, 0xfc, 0x21, 0xfa, 0x88, 0xff, 0x90, 0x1c, 0x3f, 0x45, 0x1f, + 0xa1, 0xf7, 0xf1, 0xfb, + 0xf8, 0x57, 0xe4, 0xf8, 0x2b, 0xf4, 0x39, 0xfc, 0x0d, 0xfa, 0x03, 0xfc, + 0x0b, 0xfa, 0x33, 0xfc, + 0x3d, 0xfa, 0x35, 0x24, 0xff, 0x02, 0xdf, 0x45, 0xef, 0xc2, 0x37, 0xf8, + 0xd7, 0xe1, 0x7e, 0xfe, + 0x5d, 0xf8, 0x26, 0xff, 0x16, 0xdc, 0x47, 0x5e, 0xef, 0x21, 0x6d, 0x1f, + 0x4f, 0x63, 0x86, 0xf7, + 0x91, 0xf7, 0x5f, 0x27, 0xf8, 0xb1, 0x8b, 0xbe, 0x47, 0xec, 0xc7, 0x3d, + 0xe8, 0x15, 0xfe, 0x65, + 0xf4, 0x2a, 0xbf, 0x13, 0xed, 0x24, 0xc7, 0x97, 0xf8, 0x97, 0xd0, 0xcb, + 0xfc, 0x2b, 0xe4, 0xf8, + 0x3c, 0x7a, 0x81, 0xbc, 0x7e, 0x01, 0xbf, 0x40, 0x8e, 0x3f, 0x87, 0x2f, + 0xf2, 0x2f, 0xc2, 0x9f, + 0xd3, 0xa3, 0xf0, 0x22, 0x7a, 0x41, 0x78, 0x1e, 0x3f, 0x2f, 0x3c, 0x8b, + 0xc8, 0xff, 0xd1, 0x73, + 0xf8, 0x67, 0xe4, 0xfd, 0x57, 0xd0, 0xc7, 0xf0, 0x1d, 0xfc, 0x26, 0x7c, + 0x17, 0x7f, 0x00, 0x3f, + 0xc4, 0xf4, 0xea, 0xde, 0x06, 0x1f, 0xf3, 0x9f, 0x70, 0x1f, 0xf2, 0xbf, + 0x02, 0x9f, 0xf2, 0x1f, + 0x72, 0x1f, 0xe1, 0x0f, 0xb9, 0x37, 0xf1, 0x5b, 0xe8, 0x6d, 0x4c, 0xfe, + 0x8f, 0xdf, 0x26, 0x9f, + 0xfd, 0x10, 0x92, 0xf7, 0xc0, 0x07, 0xf8, 0x03, 0xf0, 0x39, 0x7e, 0x87, + 0xd8, 0xcc, 0xfb, 0xe1, + 0x7b, 0xf8, 0xd7, 0xdc, 0x27, 0xf8, 0x63, 0x40, 0xfa, 0xc7, 0x7d, 0x8c, + 0x3f, 0xe2, 0x3e, 0xc7, + 0x9f, 0x80, 0xf7, 0xc9, 0x7b, 0x1f, 0xe1, 0x37, 0xe0, 0xc7, 0xf8, 0x73, + 0xee, 0xd7, 0xf8, 0x57, + 0xdc, 0x67, 0xf8, 0x77, 0xe4, 0xf3, 0xef, 0xc1, 0xd7, 0xd0, 0x2e, 0xd3, + 0xff, 0xb1, 0x9b, 0xe2, + 0x1f, 0x7a, 0x5d, 0xd8, 0x87, 0x76, 0x0b, 0xef, 0xe0, 0xe5, 0xfc, 0x65, + 0xe8, 0x0a, 0xfe, 0x52, + 0x74, 0x09, 0x7f, 0x09, 0xfa, 0x11, 0xff, 0x23, 0xf4, 0x43, 0xf9, 0x4a, + 0xee, 0xc7, 0xca, 0x25, + 0xec, 0x0f, 0xf8, 0x4b, 0xe1, 0x85, 0xfc, 0x45, 0xf0, 0x07, 0xfc, 0x85, + 0xf0, 0x42, 0xe1, 0x42, + 0x78, 0xbe, 0x70, 0x01, 0xba, 0x80, 0x3f, 0x0f, 0x5e, 0xc0, 0x5f, 0x80, + 0xce, 0xe1, 0xcf, 0x85, + 0x17, 0x69, 0x97, 0xf8, 0x2f, 0x12, 0xcf, 0x06, 0x67, 0xf3, 0x67, 0xc3, + 0xb3, 0xf8, 0xd3, 0xe0, + 0x59, 0xc2, 0x39, 0xe8, 0x4c, 0xf3, 0xf5, 0x59, 0xe8, 0x0c, 0xf3, 0x78, + 0x06, 0x3c, 0x83, 0xfc, + 0xfb, 0xc5, 0xda, 0xf9, 0xfe, 0x33, 0xc8, 0xeb, 0xd3, 0x30, 0x69, 0xfc, + 0x29, 0xe8, 0x64, 0x7e, + 0x31, 0x3a, 0x55, 0x38, 0x05, 0x9d, 0x2e, 0x2c, 0x46, 0x8b, 0xf9, 0x93, + 0xe1, 0x49, 0xc2, 0x49, + 0xe8, 0x24, 0xe5, 0x74, 0xf6, 0x4c, 0xe5, 0x44, 0xf6, 0x04, 0xfe, 0x44, + 0x74, 0x0a, 0x7f, 0x1c, + 0x3c, 0x9e, 0x3f, 0x0e, 0x1d, 0xcf, 0x2f, 0x42, 0x8b, 0x68, 0x13, 0x8e, + 0x87, 0xc7, 0x4b, 0x27, + 0x81, 0x53, 0x94, 0xc5, 0xec, 0xa9, 0xfa, 0xe9, 0xcc, 0xa9, 0xfa, 0xa9, + 0xcc, 0x29, 0xfa, 0xc9, + 0xcc, 0x62, 0xfd, 0x14, 0xff, 0x62, 0xf5, 0x6c, 0x76, 0x96, 0x56, 0xec, + 0x1f, 0x12, 0x97, 0x4c, + 0xe3, 0x78, 0xe3, 0x56, 0xe6, 0x80, 0xcb, 0x42, 0x4d, 0xab, 0x02, 0x48, + 0xf1, 0x37, 0x6b, 0xee, + 0x1b, 0xc1, 0x22, 0x5a, 0xab, 0x34, 0xbb, 0xb6, 0xed, 0xae, 0xaf, 0x0c, + 0xd9, 0xbd, 0x99, 0xf3, + 0x4d, 0x8a, 0x58, 0x1a, 0x73, 0x98, 0x2d, 0x0f, 0xf7, 0x10, 0xef, 0xc3, + 0x3a, 0x04, 0xff, 0xac, + 0xc7, 0xf1, 0x66, 0x18, 0x93, 0xbe, 0xb8, 0xe4, 0x54, 0xb9, 0xf2, 0x43, + 0xf6, 0x0f, 0xa6, 0xba, + 0x29, 0xe1, 0x5c, 0xb9, 0x8c, 0x0f, 0xb0, 0x1e, 0xdf, 0x9f, 0xbd, 0x6e, + 0x47, 0x5e, 0x5f, 0xae, + 0xd1, 0x90, 0x7c, 0x93, 0xd6, 0xe1, 0x6b, 0x5c, 0x89, 0xd7, 0xb4, 0x5d, + 0xd4, 0xbc, 0x2c, 0xb6, + 0x8b, 0x95, 0xf8, 0x80, 0x3c, 0xf4, 0x23, 0x61, 0x37, 0xfa, 0x0e, 0x7f, + 0x87, 0xff, 0x0c, 0xbe, + 0xe2, 0xff, 0x49, 0x7e, 0xbe, 0xc2, 0x7f, 0xe7, 0xff, 0xc1, 0x7f, 0xc5, + 0x7f, 0x0d, 0xbf, 0xc2, + 0x5f, 0xa1, 0x7f, 0xe1, 0x7f, 0xe2, 0xaf, 0xf1, 0x57, 0xf8, 0x1b, 0xfc, + 0xdf, 0xe8, 0x1b, 0xfc, + 0x35, 0x69, 0xdf, 0xe0, 0x6f, 0xc9, 0xef, 0x5f, 0xe3, 0x7f, 0xe0, 0x7f, + 0xe1, 0x6f, 0xd0, 0xb7, + 0x7d, 0xed, 0xdf, 0xf8, 0x3f, 0xf8, 0xdf, 0xe4, 0x33, 0xdf, 0x26, 0x3e, + 0x83, 0xbe, 0x26, 0xed, + 0x1b, 0x81, 0xfc, 0xce, 0x93, 0xdf, 0x85, 0x7f, 0x23, 0xf2, 0x17, 0xe4, + 0x33, 0xff, 0x36, 0xdb, + 0x7f, 0xf8, 0xff, 0xa0, 0x7f, 0xf3, 0xdf, 0x92, 0x7f, 0xfb, 0x0f, 0xfa, + 0x0f, 0xfe, 0x0f, 0x39, + 0xfb, 0xff, 0xa0, 0xff, 0xc5, 0xf4, 0x1a, 0xfe, 0xb7, 0xef, 0xf8, 0x5d, + 0xff, 0x71, 0x14, 0x3f, + 0xff, 0x0d, 0xc9, 0x15, 0x99, 0xe7, 0xfd, 0x96, 0x5c, 0x09, 0xb9, 0x0e, + 0xfe, 0x6b, 0xf2, 0xff, + 0xc4, 0xb5, 0x7c, 0x05, 0xe9, 0xf9, 0xbf, 0x35, 0xfb, 0xf0, 0x2d, 0xfa, + 0x6f, 0xb3, 0xfd, 0x9b, + 0x1e, 0xc9, 0x2b, 0xda, 0xab, 0xef, 0xf0, 0xff, 0x5f, 0x7e, 0xfe, 0x6f, + 0xd8, 0xcf, 0xff, 0x0e, + 0xf9, 0x79, 0x1b, 0x63, 0x34, 0x35, 0xea, 0xaa, 0x4f, 0x68, 0x4a, 0xc5, + 0x4c, 0x91, 0x5e, 0xd6, + 0x3f, 0x07, 0x50, 0x66, 0x9e, 0xee, 0xb6, 0x30, 0x07, 0x0a, 0x21, 0xad, + 0x79, 0x6b, 0xa5, 0xbe, + 0x9e, 0x2b, 0x32, 0xca, 0xdc, 0xb7, 0x6c, 0xf9, 0x26, 0xc1, 0x84, 0x0e, + 0x93, 0xce, 0x1f, 0x6e, + 0x95, 0xa7, 0x5b, 0xad, 0xbf, 0x6c, 0xc5, 0xe7, 0xd5, 0x77, 0xdd, 0x28, + 0xa7, 0x71, 0xbc, 0x14, + 0x8b, 0xf4, 0x02, 0x26, 0xd3, 0xfe, 0xc1, 0x34, 0x7e, 0xcd, 0xac, 0xf3, + 0x95, 0x65, 0x6f, 0xc6, + 0xef, 0x63, 0x6f, 0xda, 0x11, 0xba, 0xde, 0x81, 0xe4, 0x9b, 0x58, 0xf0, + 0x85, 0xcf, 0x43, 0xbf, + 0x30, 0xe7, 0xfe, 0xbf, 0x84, 0x8d, 0x7c, 0xbd, 0x26, 0x4a, 0x92, 0x1a, + 0x90, 0x64, 0x55, 0x25, + 0x47, 0x51, 0x0a, 0x28, 0xa2, 0xc0, 0x2b, 0x12, 0x2f, 0x68, 0xb2, 0xa0, + 0x69, 0xaa, 0x20, 0x69, + 0x01, 0x21, 0xa0, 0x06, 0x04, 0x51, 0x85, 0x58, 0xd0, 0x30, 0xe6, 0x34, + 0x0e, 0x23, 0x0d, 0xf3, + 0xbc, 0x8a, 0x04, 0xa8, 0x41, 0xd2, 0x78, 0x01, 0xab, 0x9c, 0x00, 0x54, + 0x5e, 0x60, 0x55, 0x46, + 0x80, 0x0a, 0x12, 0x59, 0x85, 0x13, 0x39, 0x85, 0xbc, 0x27, 0x43, 0x01, + 0xcb, 0xd8, 0x3c, 0xf2, + 0xe4, 0xc8, 0xcb, 0x40, 0x84, 0x32, 0x14, 0x05, 0x19, 0x61, 0x10, 0x20, + 0x7f, 0x26, 0x93, 0x37, + 0x65, 0x01, 0x63, 0x99, 0xc7, 0xf4, 0x3d, 0xd8, 0xf7, 0x1a, 0xcb, 0x1c, + 0xe6, 0xc8, 0x6b, 0xf2, + 0x1e, 0xc2, 0xb2, 0x88, 0x44, 0x99, 0x47, 0x01, 0x25, 0x80, 0x45, 0x45, + 0xc2, 0xb2, 0x22, 0x63, + 0x55, 0x93, 0xb1, 0xac, 0x89, 0x98, 0x5c, 0x1b, 0xd6, 0x14, 0x15, 0x6b, + 0xaa, 0x8a, 0x15, 0x55, + 0xc1, 0x92, 0x2a, 0xe3, 0x00, 0x69, 0xba, 0xaa, 0x91, 0xdf, 0x03, 0x58, + 0x26, 0x47, 0x43, 0x51, + 0xc8, 0xdf, 0xa8, 0x58, 0x25, 0x47, 0x85, 0xfc, 0x1e, 0x54, 0x62, 0x38, + 0x2a, 0xc7, 0x51, 0x54, + 0x36, 0x50, 0x47, 0xe0, 0x1e, 0xbc, 0x45, 0xba, 0x1b, 0x6f, 0x0b, 0x6c, + 0xc6, 0x1b, 0xa5, 0x5e, + 0xbc, 0x59, 0xba, 0x1b, 0xdd, 0x4d, 0x5e, 0xdf, 0x2d, 0x6d, 0xc2, 0xf7, + 0x04, 0xb6, 0xa0, 0x2d, + 0xd2, 0x56, 0xbc, 0x4d, 0x7a, 0x10, 0x3f, 0x10, 0xd8, 0x86, 0xef, 0x93, + 0xee, 0xc7, 0xf7, 0x91, + 0xe3, 0x36, 0x89, 0xb6, 0xfb, 0xf0, 0xbd, 0xd2, 0xbd, 0x78, 0xbb, 0xb4, + 0x1d, 0xdf, 0x2b, 0xde, + 0x8f, 0xef, 0x17, 0xc9, 0xe7, 0xc8, 0xf1, 0x01, 0xf1, 0x21, 0xf4, 0x80, + 0xb8, 0x03, 0x3d, 0x22, + 0x3e, 0x8c, 0x1e, 0x16, 0x77, 0x08, 0x8f, 0x8a, 0x8f, 0x90, 0xf6, 0xa8, + 0xf0, 0xa0, 0xf8, 0xa0, + 0xf9, 0xfa, 0x31, 0xf2, 0xde, 0x13, 0xe2, 0x13, 0xc2, 0xe3, 0xa4, 0x3d, + 0x21, 0x3e, 0x2d, 0x3c, + 0x23, 0x3e, 0x29, 0x3e, 0x2d, 0x3d, 0x43, 0x7e, 0x9e, 0x93, 0x9e, 0x11, + 0x9f, 0x93, 0x9e, 0x95, + 0x7e, 0x26, 0x3c, 0x27, 0xbd, 0x20, 0xbc, 0x20, 0xbd, 0x28, 0xbc, 0x20, + 0x3e, 0x2f, 0xbc, 0x44, + 0x8f, 0xa4, 0xfd, 0x82, 0xbc, 0x7e, 0x9e, 0x1c, 0x5f, 0x11, 0x5f, 0x15, + 0x76, 0x0a, 0xaf, 0x92, + 0xff, 0xbf, 0x22, 0xbd, 0x4c, 0x8e, 0xbb, 0x84, 0x5d, 0xe2, 0x6b, 0xc2, + 0x6e, 0xf1, 0x75, 0x61, + 0xb7, 0xb4, 0x47, 0xd8, 0x27, 0xee, 0x15, 0xf6, 0x0a, 0x6f, 0x9a, 0xed, + 0x0d, 0x61, 0xbf, 0xf0, + 0x16, 0xff, 0xb6, 0xf0, 0x96, 0xf0, 0x8e, 0x40, 0xff, 0xff, 0x9e, 0xf0, + 0x3e, 0xf9, 0xf9, 0x80, + 0x1c, 0xdf, 0xe3, 0xdf, 0x43, 0xbf, 0x14, 0xde, 0x47, 0x1f, 0xf0, 0x1f, + 0x20, 0xf2, 0x1b, 0x7e, + 0x97, 0xff, 0x98, 0xac, 0x61, 0xff, 0xc1, 0x6f, 0x0b, 0x57, 0x40, 0x27, + 0xcd, 0x07, 0x32, 0xd7, + 0x5b, 0x0b, 0xf9, 0x26, 0xd4, 0x7e, 0xb7, 0xa2, 0xeb, 0x89, 0x76, 0x40, + 0x75, 0x90, 0xac, 0x75, + 0xdd, 0x8c, 0x4a, 0x9f, 0x2b, 0x6b, 0x2d, 0xa5, 0xf4, 0x1a, 0x56, 0x72, + 0x1d, 0x7c, 0x67, 0x3f, + 0x17, 0xea, 0xf7, 0x15, 0xa4, 0xf1, 0x87, 0x7f, 0x1f, 0xfb, 0xb0, 0x26, + 0xc6, 0xa4, 0x00, 0xe6, + 0xae, 0xce, 0xd7, 0x48, 0xbd, 0x3f, 0xf5, 0xfe, 0xc1, 0xd6, 0xf2, 0x4d, + 0x72, 0x3e, 0x26, 0x56, + 0xf7, 0xb0, 0x48, 0xa3, 0xf7, 0x27, 0xfb, 0x4d, 0x5c, 0x2d, 0x69, 0xf2, + 0x4d, 0x92, 0xeb, 0xe0, + 0x67, 0xf1, 0x85, 0x97, 0x0b, 0x1c, 0xfe, 0x86, 0x27, 0x8c, 0x80, 0x7f, + 0x11, 0xf3, 0xda, 0x7a, + 0x11, 0x85, 0x81, 0xc4, 0xa9, 0x04, 0xa1, 0x48, 0xe3, 0x54, 0xbf, 0xec, + 0x55, 0xbd, 0x22, 0xd0, + 0x81, 0xc8, 0x18, 0xac, 0xe8, 0x37, 0x18, 0xa1, 0x3e, 0xc8, 0x8a, 0xc0, + 0xa8, 0x17, 0x7c, 0x46, + 0x3d, 0xbf, 0xc1, 0xa8, 0xe5, 0xeb, 0x8c, 0x1a, 0x7e, 0xad, 0xb1, 0x96, + 0xb4, 0xf5, 0xe2, 0xda, + 0xe0, 0x6a, 0xb1, 0xc6, 0x58, 0x27, 0xae, 0x09, 0xae, 0x15, 0x37, 0x18, + 0x35, 0xe2, 0x1a, 0xe3, + 0x2e, 0x71, 0xb5, 0x7e, 0x17, 0x7f, 0xa7, 0xb1, 0x8a, 0xbf, 0x43, 0x5f, + 0x89, 0xef, 0x50, 0xd7, + 0x88, 0xeb, 0xd4, 0x3b, 0xc5, 0xbb, 0xd4, 0x55, 0xc2, 0x2a, 0xf5, 0x4e, + 0xbc, 0x52, 0x5d, 0x81, + 0xef, 0x52, 0xef, 0xe4, 0xd7, 0xa8, 0x2b, 0xf1, 0x32, 0x75, 0x25, 0xbf, + 0x5c, 0x5d, 0xc5, 0xaf, + 0x52, 0x57, 0xf0, 0xcb, 0xd4, 0xdb, 0xf9, 0x95, 0xea, 0xad, 0xf4, 0x88, + 0x6f, 0x57, 0x97, 0xf1, + 0xb7, 0xa9, 0x37, 0xf1, 0xb7, 0xa8, 0x37, 0xe1, 0xa5, 0xea, 0x32, 0x74, + 0xb3, 0xba, 0x14, 0xdf, + 0xaa, 0x2e, 0x47, 0x2b, 0xb4, 0xdb, 0xd0, 0xcd, 0xda, 0x2d, 0xe8, 0x36, + 0x72, 0x5c, 0x66, 0x2c, + 0xc3, 0xb7, 0x19, 0x2b, 0xf0, 0x72, 0x63, 0x15, 0x5e, 0x69, 0xdc, 0x46, + 0xda, 0x2a, 0xf2, 0xfb, + 0xcd, 0xf8, 0x26, 0x6d, 0x29, 0x26, 0x9f, 0xc1, 0xb7, 0x6a, 0xb7, 0xe2, + 0x65, 0xe4, 0xb8, 0x54, + 0xbf, 0x85, 0x5f, 0x6a, 0xdc, 0xc4, 0x2f, 0xd5, 0x6f, 0xc5, 0x37, 0xea, + 0xd7, 0xe3, 0x5b, 0xf4, + 0x9b, 0xd1, 0x52, 0xfd, 0x36, 0x74, 0x3b, 0x69, 0xb7, 0xe9, 0xcb, 0xc9, + 0x7b, 0x4b, 0xf1, 0x6d, + 0xea, 0x75, 0xe8, 0x26, 0x6d, 0x09, 0xfa, 0x89, 0xfa, 0x13, 0xf4, 0x53, + 0xfd, 0x5a, 0x74, 0x83, + 0xbe, 0x04, 0x5d, 0xab, 0x5f, 0x87, 0xae, 0xd3, 0xaf, 0x27, 0xaf, 0x6f, + 0x24, 0x7f, 0x73, 0x3b, + 0x5a, 0x6a, 0x5c, 0x8b, 0xaf, 0x27, 0x7f, 0x7f, 0xa3, 0x7e, 0x13, 0xba, + 0x49, 0xbf, 0x89, 0x1c, + 0x6f, 0xe4, 0x6f, 0xd0, 0xaf, 0x25, 0xed, 0x3a, 0xfe, 0x06, 0xed, 0x5a, + 0x7e, 0x89, 0x76, 0x15, + 0x69, 0xd7, 0xf1, 0x3f, 0xd5, 0xae, 0xc6, 0xd7, 0x69, 0x37, 0xe2, 0x1b, + 0x48, 0x5b, 0xa2, 0xfd, + 0x54, 0x5c, 0xa2, 0x2f, 0x11, 0x6f, 0xd0, 0x6f, 0x10, 0xaf, 0x53, 0xaf, + 0x15, 0xae, 0x57, 0xaf, + 0x27, 0xc7, 0x25, 0xc2, 0x8d, 0xea, 0x12, 0x71, 0x89, 0x46, 0x5e, 0x6b, + 0xd7, 0x8a, 0x37, 0x68, + 0x37, 0x8b, 0xb7, 0xe9, 0x4b, 0xc9, 0xf1, 0x06, 0xd2, 0x6e, 0x15, 0x6f, + 0x25, 0xaf, 0x6f, 0xd1, + 0x97, 0x89, 0xcb, 0xf5, 0xdb, 0xc5, 0xdb, 0xb5, 0xdb, 0xc5, 0x95, 0xda, + 0x32, 0x91, 0xf4, 0x45, + 0x24, 0x7d, 0x11, 0x97, 0x92, 0x23, 0x7d, 0xef, 0x36, 0xe5, 0x56, 0x61, + 0xa9, 0x72, 0x9d, 0x70, + 0x33, 0x39, 0x2e, 0x53, 0x96, 0x91, 0xe3, 0xcd, 0xe2, 0x2a, 0x85, 0xbe, + 0x7f, 0x87, 0xb8, 0x52, + 0x59, 0x29, 0xac, 0x51, 0x56, 0x89, 0xcb, 0x95, 0xdb, 0x85, 0xe5, 0xca, + 0x0a, 0xf2, 0xfb, 0x6a, + 0x61, 0xb5, 0xb2, 0x5a, 0xbc, 0x43, 0x59, 0x2b, 0xd6, 0x28, 0xf5, 0x62, + 0x9d, 0xb2, 0x41, 0x58, + 0x2d, 0xd7, 0xa2, 0x1a, 0x79, 0x1d, 0xae, 0x91, 0xd7, 0xe0, 0x3b, 0x8c, + 0x35, 0xf8, 0x4e, 0x65, + 0x25, 0xee, 0xe5, 0x7f, 0x8b, 0x29, 0x2b, 0xbe, 0x57, 0x3c, 0x12, 0x50, + 0x5f, 0x83, 0x59, 0x23, + 0x9d, 0x62, 0x07, 0xf5, 0x67, 0x35, 0x56, 0xd6, 0x25, 0x72, 0x22, 0x87, + 0xe5, 0xfd, 0x53, 0xff, + 0x3b, 0xd5, 0xf5, 0xb2, 0xc6, 0xb2, 0x3b, 0xb8, 0xca, 0x68, 0xa9, 0x27, + 0xab, 0x9f, 0x8d, 0xf0, + 0x0e, 0xa7, 0x91, 0x93, 0xfd, 0x1a, 0x90, 0x99, 0x87, 0xd6, 0x58, 0x51, + 0x9b, 0xa9, 0x9e, 0x0b, + 0xc5, 0xf5, 0x6c, 0xda, 0x76, 0xbf, 0x2f, 0x3c, 0x97, 0x31, 0xab, 0x09, + 0x5e, 0x54, 0x08, 0x0e, + 0xe6, 0xde, 0xb4, 0xc3, 0xeb, 0xb9, 0x24, 0xfc, 0x26, 0xc3, 0x62, 0xac, + 0xd3, 0xe4, 0x9b, 0x1c, + 0x60, 0xad, 0xfa, 0x83, 0x58, 0xbb, 0x26, 0xa1, 0xf7, 0x3b, 0xb2, 0xe4, + 0x9b, 0x14, 0x1a, 0xe9, + 0x73, 0x10, 0xf3, 0xf0, 0x4f, 0xf0, 0xaf, 0xf8, 0xef, 0xf8, 0xef, 0x84, + 0x0f, 0x70, 0x83, 0xb6, + 0x46, 0xf4, 0xeb, 0x86, 0x20, 0xeb, 0x92, 0xa0, 0xc8, 0x62, 0x20, 0xa0, + 0xe0, 0x00, 0x50, 0xc4, + 0x80, 0x28, 0x83, 0x80, 0x48, 0x5e, 0x43, 0x55, 0x0c, 0x20, 0x1d, 0x89, + 0xbc, 0x2e, 0x90, 0x86, + 0x44, 0x48, 0x30, 0xd1, 0xa7, 0xb3, 0x22, 0xab, 0x73, 0xa2, 0x4f, 0xf3, + 0x88, 0x5e, 0xad, 0x5e, + 0xf0, 0x68, 0x5e, 0x72, 0xf4, 0x8a, 0x8c, 0xe6, 0x13, 0x58, 0x0d, 0x09, + 0x9c, 0xe6, 0x17, 0x3c, + 0xba, 0x8f, 0x70, 0xc4, 0x3a, 0x5c, 0xab, 0x7b, 0xb0, 0x5f, 0xf1, 0x0b, + 0x3e, 0x85, 0x60, 0xa7, + 0xea, 0x11, 0x3c, 0x8a, 0x97, 0xf7, 0x29, 0x75, 0xbc, 0x47, 0xad, 0xc7, + 0x35, 0x6a, 0x9d, 0xb0, + 0x56, 0x59, 0x27, 0xac, 0x57, 0xea, 0x84, 0x3a, 0xf2, 0x6f, 0x1b, 0xd4, + 0x1a, 0xa1, 0x86, 0xfc, + 0xbe, 0x4e, 0x59, 0x23, 0x6c, 0x20, 0x9f, 0xdf, 0xa0, 0xac, 0x35, 0xdb, + 0x7a, 0xa5, 0x16, 0xaf, + 0x51, 0xd6, 0xe1, 0x3a, 0xf2, 0x37, 0xb5, 0xda, 0x06, 0x54, 0xa7, 0xd5, + 0xa1, 0x3a, 0xb5, 0x06, + 0xaf, 0x51, 0xd7, 0xa2, 0x75, 0x6a, 0x0d, 0xaa, 0x57, 0xeb, 0x91, 0x47, + 0xdd, 0x80, 0x37, 0x90, + 0xf3, 0x6d, 0x50, 0xd7, 0xd1, 0x7f, 0x43, 0xab, 0x95, 0x35, 0x78, 0x9d, + 0xb2, 0x16, 0xd7, 0x2a, + 0x6b, 0xf9, 0x35, 0xda, 0x06, 0x91, 0xbc, 0x2f, 0xac, 0x55, 0xd7, 0x08, + 0xeb, 0xc9, 0x9c, 0x5f, + 0xad, 0xd4, 0x90, 0xf7, 0x37, 0xa0, 0x5a, 0xad, 0x06, 0xad, 0xd7, 0x6a, + 0xd1, 0x06, 0xbd, 0x1e, + 0xb3, 0xe4, 0xf5, 0x06, 0x6d, 0x35, 0x5a, 0x47, 0xbe, 0x7b, 0xbd, 0xbe, + 0x0e, 0x6f, 0xd0, 0x37, + 0x90, 0xf7, 0x6b, 0x50, 0x9d, 0x5e, 0x87, 0xea, 0x35, 0x2f, 0xf9, 0x77, + 0x7a, 0x24, 0xfd, 0x21, + 0x9f, 0xab, 0xd1, 0xc9, 0xf9, 0x34, 0x1f, 0xb9, 0xfe, 0x5a, 0x61, 0x83, + 0x46, 0xae, 0x59, 0x5b, + 0x23, 0xd4, 0x91, 0xe3, 0x6a, 0x7d, 0xb5, 0xb0, 0x41, 0x27, 0x7d, 0xd2, + 0xd7, 0x93, 0x7e, 0xaf, + 0xc7, 0x35, 0x7a, 0x1d, 0xae, 0xd3, 0x6b, 0xf8, 0x0d, 0xfa, 0x5a, 0xa1, + 0x56, 0xaf, 0x15, 0xd6, + 0x90, 0xfe, 0x91, 0x3e, 0xf2, 0xeb, 0x49, 0xab, 0xd1, 0xe8, 0xfb, 0xf5, + 0x42, 0xbd, 0x5e, 0x43, + 0x9a, 0x97, 0xf7, 0x92, 0xf1, 0xf2, 0x93, 0xef, 0xf5, 0x92, 0xef, 0xf5, + 0xe9, 0x5e, 0x32, 0x7e, + 0x5e, 0x9e, 0xd5, 0x11, 0x8f, 0x74, 0x20, 0x30, 0xba, 0x4f, 0xa8, 0xd3, + 0x3d, 0x3c, 0xa7, 0x93, + 0x71, 0x24, 0x8d, 0xd3, 0x59, 0xc1, 0xab, 0x33, 0xb0, 0x56, 0xaf, 0x81, + 0x3e, 0x72, 0xe4, 0x74, + 0x0e, 0x01, 0xd2, 0x07, 0x4e, 0x63, 0x11, 0xa3, 0xf9, 0x79, 0xa4, 0x41, + 0x9e, 0xd7, 0x39, 0x9e, + 0x21, 0x47, 0xfa, 0x1a, 0xeb, 0x80, 0x7c, 0x0f, 0xe4, 0xa1, 0x2e, 0x0a, + 0xa2, 0x2e, 0x0b, 0xaa, + 0xae, 0x10, 0x5e, 0xcf, 0x13, 0x9e, 0x2c, 0x10, 0x2e, 0xcc, 0xf3, 0x01, + 0x4d, 0xe0, 0x91, 0x8a, + 0xd0, 0x1d, 0xaa, 0x97, 0x7f, 0x9a, 0xff, 0x1a, 0x7f, 0x8d, 0x7f, 0x87, + 0x03, 0x7c, 0x39, 0x72, + 0x44, 0x5d, 0x1e, 0x67, 0xac, 0xb4, 0x7e, 0x20, 0x47, 0xa3, 0x8f, 0x13, + 0x26, 0xf6, 0x56, 0x74, + 0xf8, 0x6c, 0xd4, 0x6f, 0x22, 0x15, 0x72, 0x15, 0x8d, 0xae, 0xba, 0xac, + 0xf5, 0xa5, 0x08, 0x07, + 0xa8, 0x0c, 0x17, 0x67, 0xdb, 0x0f, 0x08, 0x15, 0x87, 0x9d, 0xde, 0xec, + 0xf5, 0xa5, 0x8a, 0xac, + 0xef, 0x15, 0x6f, 0xda, 0x8d, 0x99, 0xf7, 0x37, 0x29, 0xa7, 0xb5, 0x90, + 0x83, 0x36, 0x5f, 0xc6, + 0x7c, 0x93, 0x9c, 0xee, 0xc3, 0xda, 0x77, 0x7d, 0x72, 0x11, 0x38, 0xb4, + 0x71, 0xbc, 0x7d, 0xba, + 0x5e, 0x43, 0x69, 0x5d, 0xda, 0x7a, 0x2e, 0x7d, 0x7e, 0x13, 0xb3, 0xce, + 0x97, 0xf6, 0xff, 0xee, + 0xde, 0xb4, 0x09, 0x3b, 0x22, 0x2f, 0xf5, 0xfe, 0xc1, 0xcd, 0x7d, 0xb9, + 0xf2, 0x64, 0x6d, 0x19, + 0x9e, 0x6f, 0x92, 0xcf, 0x9f, 0x8c, 0x5f, 0xa0, 0xd8, 0x87, 0xff, 0x81, + 0x77, 0x10, 0x2e, 0x00, + 0x74, 0x4d, 0x32, 0x34, 0x45, 0x90, 0x35, 0x4d, 0x50, 0x74, 0x62, 0x03, + 0x6b, 0x5c, 0x00, 0x2a, + 0xaa, 0x18, 0x0c, 0x20, 0x09, 0x04, 0x38, 0x09, 0x2a, 0x50, 0x22, 0x36, + 0xad, 0x28, 0x11, 0x70, + 0x94, 0x14, 0x41, 0xc0, 0x64, 0xae, 0x88, 0xc4, 0xe6, 0x84, 0x1a, 0xcb, + 0xfb, 0x35, 0x1f, 0xf2, + 0xe9, 0x3e, 0x48, 0xb0, 0x0e, 0x91, 0x39, 0x89, 0xbc, 0x3a, 0x0b, 0x15, + 0xad, 0x09, 0x85, 0xc9, + 0xdc, 0xf2, 0x93, 0x79, 0xea, 0x31, 0x7c, 0x04, 0x0b, 0x39, 0x62, 0x1b, + 0xfb, 0x08, 0x76, 0x31, + 0x7c, 0xbd, 0xea, 0x41, 0x35, 0x04, 0x6f, 0xea, 0x09, 0xbe, 0xd4, 0x6a, + 0xb5, 0x78, 0xad, 0xb6, + 0x1a, 0xaf, 0xd6, 0x09, 0x4e, 0xe9, 0xab, 0xf9, 0x55, 0xda, 0x4a, 0x7e, + 0xb5, 0xb6, 0x5a, 0xb8, + 0x4b, 0xbf, 0x93, 0xbf, 0x83, 0xbc, 0x5e, 0xa3, 0xad, 0xc5, 0x77, 0x69, + 0xeb, 0x79, 0x1f, 0xb1, + 0xbd, 0xa1, 0xb6, 0x81, 0x7c, 0xfe, 0x2e, 0xbc, 0x46, 0xbb, 0x13, 0xdf, + 0xa1, 0xdd, 0x81, 0xc8, + 0xdf, 0xa0, 0x3b, 0x8d, 0xd5, 0x70, 0xa5, 0xb6, 0x0a, 0x12, 0x4c, 0x44, + 0x04, 0x87, 0x21, 0xc1, + 0x56, 0x5c, 0xaf, 0xfa, 0xe9, 0xf7, 0x12, 0x5b, 0xbe, 0x86, 0x5f, 0xa7, + 0xad, 0x27, 0x18, 0x56, + 0xc3, 0xdf, 0xa9, 0xdf, 0x4e, 0x78, 0xe0, 0x6d, 0x84, 0x4f, 0xae, 0x10, + 0x48, 0xe3, 0x57, 0xca, + 0xcb, 0xd0, 0x3a, 0x59, 0x40, 0x7e, 0xc5, 0x87, 0xea, 0x15, 0x0f, 0x26, + 0xb8, 0x89, 0x6a, 0x55, + 0x3f, 0xe2, 0x55, 0x86, 0x7c, 0xcf, 0x3a, 0xca, 0x3b, 0xd1, 0x2d, 0xea, + 0xad, 0x26, 0xdf, 0x5c, + 0xaa, 0xde, 0x82, 0x6e, 0x55, 0x97, 0xe1, 0xdb, 0xb5, 0x95, 0x68, 0x05, + 0xe5, 0x8a, 0xda, 0x0a, + 0x7c, 0x3b, 0xf9, 0xbe, 0xdb, 0x75, 0xc2, 0x59, 0x75, 0xc2, 0x57, 0xb5, + 0xa5, 0x84, 0x83, 0xdd, + 0x22, 0xdc, 0xa2, 0xac, 0x12, 0x28, 0x96, 0x13, 0x3c, 0xe4, 0xeb, 0x09, + 0xbe, 0xd7, 0x29, 0x3e, + 0xec, 0x25, 0xfd, 0x5b, 0xad, 0x2c, 0x17, 0x56, 0x28, 0x2b, 0x08, 0xb7, + 0x5c, 0xca, 0x93, 0xef, + 0xe1, 0x6f, 0x22, 0x9f, 0x5d, 0xa6, 0xdc, 0x46, 0x1b, 0xe1, 0xb8, 0x2b, + 0x84, 0x55, 0xca, 0x1d, + 0xfc, 0x1d, 0xea, 0x6a, 0xbc, 0x82, 0x70, 0xe1, 0x3b, 0x49, 0x9f, 0xef, + 0x20, 0xd8, 0x7f, 0x17, + 0xc5, 0x68, 0xd2, 0xd7, 0x1a, 0x0d, 0x11, 0x5e, 0x0e, 0xb1, 0x4f, 0x5d, + 0xcf, 0xaf, 0x53, 0xd7, + 0x92, 0xcf, 0xad, 0xe2, 0xd7, 0x12, 0x3c, 0x5f, 0x43, 0x70, 0x7d, 0x95, + 0x5a, 0x8b, 0x81, 0x06, + 0x08, 0xde, 0x31, 0x98, 0xd1, 0x59, 0x82, 0xcd, 0x1c, 0xc1, 0x33, 0x84, + 0xfd, 0xe4, 0x88, 0x55, + 0x91, 0xbc, 0xae, 0x21, 0x63, 0xb9, 0x8e, 0x60, 0x68, 0x1d, 0x5f, 0x43, + 0xf0, 0xb5, 0xd6, 0xa0, + 0x63, 0xe2, 0xe1, 0xc9, 0x3a, 0x85, 0x13, 0x58, 0x0e, 0x31, 0x50, 0x39, + 0x1e, 0x6a, 0x7e, 0xfa, + 0x1d, 0xc8, 0x27, 0xfb, 0x31, 0x08, 0x10, 0xac, 0x35, 0x6a, 0xd1, 0xed, + 0x81, 0x46, 0xfc, 0x36, + 0xfe, 0x27, 0x79, 0x3a, 0xde, 0x40, 0x97, 0x6a, 0x2e, 0x7f, 0x59, 0x7f, + 0xbe, 0x49, 0x52, 0x0d, + 0x14, 0x57, 0xb3, 0xab, 0x96, 0x3e, 0x5f, 0xce, 0x86, 0x4a, 0x73, 0xff, + 0xa7, 0xca, 0x78, 0x65, + 0x5d, 0xb6, 0x98, 0xad, 0x7c, 0xad, 0xcc, 0x4f, 0x31, 0x26, 0xab, 0x9e, + 0x1e, 0x75, 0x7a, 0xb2, + 0xc7, 0xc8, 0x1c, 0x40, 0xed, 0x9a, 0x21, 0xfb, 0x07, 0x0f, 0xaf, 0x97, + 0x9e, 0x7e, 0x7f, 0x93, + 0x31, 0x6b, 0x58, 0x19, 0xd7, 0x04, 0x1b, 0xf8, 0x5e, 0xf6, 0xe5, 0xec, + 0xaf, 0xf3, 0x95, 0x4a, + 0x5f, 0x4b, 0xca, 0x37, 0xa9, 0xc8, 0x96, 0x6f, 0x42, 0xf7, 0xf0, 0xc9, + 0xf5, 0x9e, 0xd5, 0xf2, + 0x18, 0xeb, 0x76, 0x0c, 0xab, 0x83, 0x9f, 0x32, 0xdf, 0x44, 0x3e, 0x92, + 0xdb, 0x86, 0xa9, 0x6f, + 0xe1, 0x1f, 0xf8, 0x71, 0xc5, 0x10, 0x58, 0xdd, 0x10, 0x23, 0x7a, 0x48, + 0x0a, 0x6b, 0x86, 0x14, + 0xd4, 0x34, 0x31, 0x14, 0xe4, 0x02, 0xf5, 0xea, 0xc6, 0xc0, 0x9f, 0x84, + 0x3e, 0x9f, 0x02, 0x3f, + 0xa0, 0x99, 0xa3, 0xff, 0xe1, 0xff, 0xcd, 0xfd, 0x47, 0xf8, 0xd6, 0xff, + 0x8d, 0xf8, 0x1f, 0xf6, + 0x7f, 0xf8, 0xff, 0x66, 0xbf, 0x91, 0xbe, 0x66, 0xbf, 0x96, 0xbe, 0xf2, + 0xff, 0x4b, 0xfe, 0x87, + 0xff, 0x6f, 0xca, 0x3f, 0xd9, 0xbf, 0x6a, 0x5f, 0x70, 0x9f, 0x69, 0x7f, + 0xf4, 0x3f, 0xa7, 0x8b, + 0x40, 0x32, 0x02, 0x18, 0xab, 0x98, 0xa7, 0xba, 0x20, 0xe5, 0x1f, 0xeb, + 0x09, 0x6f, 0x6b, 0xd3, + 0xde, 0xe1, 0xff, 0x2e, 0xff, 0x93, 0xfd, 0xa7, 0xfc, 0x2f, 0xff, 0x3f, + 0x03, 0xdf, 0xb0, 0xdf, + 0x4a, 0x5f, 0x73, 0x5f, 0x49, 0xff, 0xe4, 0xfe, 0x29, 0xff, 0x93, 0xfb, + 0x87, 0xf2, 0x77, 0xee, + 0xaf, 0xf2, 0x5f, 0xd0, 0xdf, 0xa4, 0xbf, 0xf3, 0x7f, 0x0f, 0xfc, 0x0d, + 0xfd, 0x97, 0xfc, 0x27, + 0xf8, 0x5b, 0xed, 0x7d, 0xff, 0x27, 0xea, 0xc7, 0xf0, 0x7e, 0x55, 0xe6, + 0xfd, 0x04, 0xa3, 0x42, + 0xfa, 0xf3, 0xe8, 0x73, 0xe5, 0xaf, 0xf8, 0x5f, 0xc2, 0x57, 0xf8, 0x1f, + 0xd2, 0xdf, 0xc0, 0x5f, + 0xe4, 0x3f, 0xf8, 0x7f, 0xa3, 0x7f, 0xca, 0x35, 0x05, 0xeb, 0x04, 0x3a, + 0xb7, 0x19, 0x85, 0x11, + 0xfd, 0x2a, 0x8b, 0x19, 0xcd, 0x4b, 0xb8, 0x66, 0x9d, 0x54, 0xa7, 0x78, + 0x08, 0x27, 0x63, 0x84, + 0xa7, 0xd4, 0x3f, 0xc0, 0x3f, 0x06, 0xfe, 0x8b, 0xfb, 0xb3, 0xf4, 0x7b, + 0xf8, 0x47, 0xe9, 0x8f, + 0xe8, 0x53, 0xed, 0x57, 0x60, 0xbf, 0x16, 0x85, 0x1e, 0x8d, 0x23, 0x5c, + 0xa9, 0x1e, 0xd7, 0x69, + 0x1e, 0xc4, 0xe8, 0x7e, 0x24, 0xab, 0x00, 0xaf, 0xd6, 0xbc, 0xfc, 0x83, + 0xf2, 0x8b, 0xe8, 0x55, + 0x61, 0x0f, 0x7c, 0x4d, 0x7c, 0x0d, 0xee, 0x11, 0x5e, 0x87, 0x3b, 0x85, + 0x5d, 0x70, 0x97, 0xfc, + 0x1a, 0x7c, 0x55, 0x7d, 0x05, 0xbe, 0x18, 0x78, 0x0d, 0xec, 0x96, 0x76, + 0xe3, 0xd7, 0xc5, 0x5d, + 0xe2, 0x4e, 0xf1, 0x25, 0xfc, 0x82, 0xf8, 0x0b, 0xfc, 0xb4, 0xf4, 0x2c, + 0xff, 0x73, 0xed, 0x6e, + 0x81, 0x55, 0x37, 0x08, 0x75, 0x01, 0xc2, 0xe3, 0x14, 0x80, 0xa1, 0xc2, + 0xa0, 0x0d, 0xc6, 0x1a, + 0x21, 0xa2, 0x3e, 0x2e, 0xec, 0xd0, 0x1e, 0x86, 0x8f, 0x28, 0x3b, 0xd0, + 0xc3, 0x81, 0x27, 0xf0, + 0xd3, 0x81, 0xc7, 0xf9, 0xa7, 0x02, 0x4f, 0xf0, 0x4f, 0x06, 0x9e, 0xe4, + 0x9f, 0x94, 0x9e, 0x14, + 0x1f, 0x97, 0x1e, 0xc1, 0x3b, 0x02, 0x8f, 0xc0, 0x87, 0xa4, 0xc7, 0xd1, + 0xe3, 0xe2, 0x23, 0xe8, + 0x61, 0xfe, 0x31, 0xfc, 0x90, 0xf2, 0x20, 0xfe, 0xb9, 0xf6, 0x18, 0xd6, + 0xf4, 0x84, 0xce, 0xda, + 0x13, 0xb8, 0x97, 0xdf, 0x2e, 0x3c, 0x22, 0x3c, 0x26, 0xed, 0x90, 0x1e, + 0x0a, 0xec, 0x40, 0x3b, + 0xa4, 0x87, 0xf9, 0x07, 0x95, 0x46, 0xe4, 0x53, 0x21, 0x46, 0x9a, 0x84, + 0x79, 0xd2, 0x67, 0xa0, + 0x02, 0x81, 0x55, 0x44, 0xc8, 0x1b, 0x08, 0x0a, 0x84, 0x6b, 0xb3, 0x5a, + 0x07, 0x4f, 0xfe, 0x0a, + 0x3f, 0x24, 0x6d, 0xe7, 0xef, 0x0f, 0xdc, 0x8f, 0xef, 0x97, 0xef, 0xe7, + 0x1f, 0x90, 0xb7, 0xe3, + 0x2d, 0x81, 0x2d, 0xe8, 0x6e, 0x79, 0x2b, 0xda, 0x26, 0xdf, 0x87, 0xb6, + 0x2a, 0xf7, 0x08, 0x5b, + 0x95, 0xfb, 0xf0, 0xdd, 0xca, 0x3d, 0x60, 0xb3, 0xda, 0x0d, 0x5b, 0xe5, + 0x16, 0xb4, 0x51, 0xdd, + 0x0e, 0x7a, 0x94, 0xf5, 0xd8, 0xa3, 0xb4, 0xe2, 0xfd, 0xfc, 0x5f, 0xf0, + 0x5f, 0xd0, 0xa3, 0xe8, + 0x0c, 0x62, 0x57, 0x8d, 0x88, 0x73, 0x52, 0xfb, 0x7c, 0x0d, 0x04, 0x0b, + 0x9d, 0x4d, 0xa4, 0x35, + 0x3a, 0xeb, 0x2a, 0x09, 0x27, 0x2c, 0x4f, 0xda, 0x77, 0x66, 0x78, 0x5c, + 0x72, 0x81, 0x56, 0xc6, + 0x54, 0x18, 0x05, 0x4c, 0x36, 0x0d, 0x8b, 0xae, 0xe3, 0xf6, 0x40, 0xf6, + 0x18, 0x19, 0xeb, 0xfb, + 0xb0, 0xa6, 0xd7, 0xb0, 0xcc, 0x3a, 0xf8, 0x6a, 0x31, 0x4b, 0xe7, 0xfa, + 0x48, 0x5f, 0xc1, 0xd0, + 0x3a, 0xf8, 0x84, 0xbf, 0xfa, 0xad, 0x6b, 0x58, 0xf9, 0x3e, 0x4b, 0xf8, + 0xa7, 0xd9, 0x39, 0xab, + 0xba, 0xde, 0x98, 0x71, 0xc1, 0x62, 0x7e, 0x7e, 0xf6, 0x7c, 0x93, 0xe2, + 0x11, 0xf9, 0x26, 0x87, + 0xb2, 0x4e, 0xf7, 0xb0, 0x7a, 0x3e, 0x75, 0x59, 0xb0, 0x14, 0x96, 0xc4, + 0xdc, 0xf5, 0xce, 0x78, + 0x52, 0xbe, 0x49, 0xe3, 0x8c, 0xba, 0x38, 0xff, 0x8d, 0x89, 0x6b, 0xaf, + 0xa8, 0x41, 0xc1, 0x1b, + 0xd2, 0x85, 0x78, 0x30, 0x26, 0x34, 0x68, 0x0d, 0x62, 0x5c, 0x8b, 0x48, + 0x71, 0x82, 0x7f, 0x75, + 0x81, 0x88, 0xf8, 0x3b, 0x82, 0x79, 0x0f, 0x47, 0x04, 0xbf, 0xa2, 0x21, + 0x0e, 0x68, 0x08, 0x60, + 0x05, 0x02, 0x7f, 0x00, 0x40, 0x21, 0xa4, 0x03, 0x23, 0x24, 0xb3, 0x7e, + 0xb5, 0x86, 0x23, 0x98, + 0x01, 0x7c, 0x5a, 0x3d, 0xa8, 0xd7, 0xea, 0xb9, 0x1a, 0x63, 0x3d, 0xb7, + 0x56, 0x5f, 0xc3, 0xdd, + 0xa2, 0xaf, 0xe6, 0x90, 0xf6, 0x53, 0xee, 0x54, 0xed, 0x7a, 0xc2, 0x05, + 0x65, 0x41, 0x33, 0x64, + 0xac, 0x68, 0x04, 0xbb, 0x8c, 0x3b, 0x89, 0xbd, 0xb5, 0x1f, 0xbd, 0xdb, + 0xd0, 0xc3, 0xb5, 0xc7, + 0xbb, 0x7c, 0xcd, 0xa1, 0x06, 0x36, 0x2a, 0x47, 0xb8, 0xb0, 0x16, 0x25, + 0x2d, 0x06, 0x1a, 0xd5, + 0x38, 0x8c, 0x2a, 0x31, 0x10, 0x57, 0xa3, 0x30, 0x22, 0x87, 0x51, 0x58, + 0x09, 0xe3, 0x68, 0x30, + 0x04, 0xa5, 0x68, 0x33, 0x1b, 0xd7, 0x2e, 0x87, 0x67, 0x2b, 0x37, 0x62, + 0x8a, 0x55, 0xd1, 0x60, + 0x1b, 0x6c, 0x52, 0xba, 0x71, 0x87, 0xdc, 0x8e, 0x3b, 0x94, 0x36, 0xd8, + 0xa6, 0x34, 0x82, 0x06, + 0xa3, 0xc1, 0x1f, 0x8c, 0xf5, 0x10, 0xbc, 0x5d, 0xc7, 0x7b, 0x14, 0x96, + 0x87, 0x06, 0x2b, 0x00, + 0x95, 0xe5, 0x19, 0x99, 0x60, 0x00, 0xc1, 0x81, 0x1a, 0x72, 0xfe, 0x9f, + 0xa9, 0xdb, 0x50, 0xaf, + 0xd4, 0x05, 0x3a, 0x02, 0x3d, 0xdc, 0x66, 0xbd, 0x07, 0xc4, 0x8c, 0x10, + 0xb8, 0x33, 0xb8, 0x04, + 0x1a, 0x41, 0x3f, 0xf2, 0x18, 0x5e, 0xd2, 0xea, 0x08, 0x87, 0xc2, 0xbc, + 0x3f, 0xb8, 0x16, 0xdf, + 0xa3, 0xfc, 0x8d, 0xfb, 0x34, 0xb4, 0xdb, 0xff, 0xae, 0xfc, 0x36, 0xfb, + 0x96, 0xfc, 0x36, 0xb7, + 0x3f, 0xf0, 0x3a, 0xb7, 0x57, 0xda, 0xc7, 0xee, 0x0b, 0xbc, 0xc1, 0xee, + 0x0f, 0xec, 0xe5, 0x76, + 0xca, 0x7b, 0xfc, 0xbb, 0x03, 0xbb, 0xb8, 0xdd, 0xf2, 0x2e, 0x82, 0xa1, + 0xef, 0xb2, 0x6f, 0x05, + 0x77, 0x71, 0x1f, 0x69, 0x3f, 0x83, 0xeb, 0x84, 0xab, 0xf0, 0x6d, 0xb2, + 0x87, 0xf7, 0xca, 0x0c, + 0xb1, 0x39, 0x89, 0xbd, 0xaa, 0xad, 0xe6, 0x39, 0x65, 0x87, 0xf0, 0x72, + 0xe4, 0x45, 0xf6, 0xf9, + 0xc8, 0x4b, 0xcc, 0xce, 0xd0, 0x7e, 0xff, 0x9b, 0xfa, 0x5b, 0xdc, 0x3b, + 0xca, 0x9b, 0xec, 0x5b, + 0xca, 0xdb, 0xdc, 0xdb, 0xca, 0xbb, 0xec, 0x2f, 0xa5, 0x77, 0xe1, 0x9b, + 0x81, 0xfd, 0x70, 0x9f, + 0xb2, 0x87, 0x7d, 0x53, 0x7e, 0xdf, 0xff, 0xa1, 0xf6, 0x11, 0xfb, 0x9e, + 0xf6, 0x82, 0xff, 0xd5, + 0xf0, 0xeb, 0x6c, 0x50, 0x59, 0x86, 0xd7, 0x99, 0xfc, 0x8f, 0x45, 0xbf, + 0xd0, 0xbe, 0x04, 0xbf, + 0xd7, 0xfe, 0x00, 0xff, 0x1c, 0xf8, 0x23, 0xfa, 0xb5, 0xfa, 0x29, 0xfa, + 0x52, 0xfa, 0x12, 0xbd, + 0x2d, 0x2f, 0x05, 0x35, 0xaa, 0x8a, 0x25, 0xc2, 0xc3, 0x55, 0x55, 0xc4, + 0xa2, 0x86, 0x78, 0x41, + 0x0f, 0xf0, 0xaa, 0xce, 0xe1, 0x5a, 0x32, 0x4e, 0xcf, 0x45, 0xde, 0x64, + 0x7e, 0xaf, 0xfc, 0xc9, + 0xf7, 0xb1, 0xfa, 0x11, 0xf7, 0x2b, 0xe5, 0x33, 0xee, 0x0b, 0xf1, 0x37, + 0xe0, 0x0b, 0xfe, 0xb7, + 0xe0, 0x37, 0xc2, 0x6f, 0xd1, 0xef, 0x84, 0xdf, 0xa1, 0xdf, 0x08, 0x5f, + 0xa0, 0x5f, 0x8b, 0x9f, + 0xa0, 0x4f, 0x84, 0x5f, 0xa1, 0x8f, 0xf8, 0xf7, 0xf9, 0xb7, 0xf4, 0x5f, + 0x90, 0xeb, 0xfc, 0x80, + 0x79, 0x48, 0xf4, 0x80, 0x3b, 0x03, 0x00, 0xb3, 0x0a, 0x83, 0xfd, 0xd2, + 0x46, 0xfc, 0x5b, 0xfc, + 0x07, 0xfc, 0x39, 0xbe, 0x07, 0xcd, 0x4a, 0xfd, 0x7c, 0xa3, 0x7c, 0xea, + 0x6b, 0x30, 0x4a, 0x19, + 0x3a, 0x3f, 0x68, 0xcd, 0x93, 0x4a, 0xc2, 0x07, 0x4d, 0x1c, 0x8c, 0x96, + 0x7b, 0x4a, 0x93, 0xf3, + 0x76, 0x09, 0x27, 0x29, 0xd4, 0xcb, 0x99, 0xb2, 0x6c, 0x76, 0x2d, 0x8d, + 0x11, 0x24, 0xf8, 0x97, + 0x55, 0x4f, 0x1a, 0xd5, 0x7e, 0x8b, 0x59, 0xec, 0x46, 0x3e, 0xe1, 0x83, + 0xa5, 0xfc, 0x35, 0xd3, + 0xfe, 0x26, 0x14, 0xef, 0xa9, 0xad, 0x9a, 0x2d, 0xdf, 0x24, 0x5b, 0xcc, + 0x6a, 0xb2, 0xaf, 0x23, + 0x5f, 0xb7, 0x73, 0x87, 0xa6, 0x4e, 0x77, 0x52, 0xee, 0x9b, 0x05, 0xad, + 0x33, 0xcf, 0xdc, 0x57, + 0xbe, 0xaa, 0xa6, 0x3c, 0x5a, 0x51, 0x9f, 0x29, 0xdf, 0x24, 0x3f, 0x43, + 0x9d, 0xaf, 0x83, 0x15, + 0xdf, 0xdf, 0x57, 0xbb, 0x26, 0xab, 0x66, 0xd0, 0x17, 0x97, 0xc3, 0x9a, + 0xb8, 0xae, 0xd8, 0xd8, + 0xcb, 0x85, 0x8f, 0x4c, 0x5f, 0xef, 0x97, 0xf2, 0x66, 0xc1, 0x1f, 0x0e, + 0x09, 0xb1, 0x48, 0x54, + 0x68, 0x09, 0xc6, 0x85, 0x88, 0x1e, 0x91, 0x5a, 0xb4, 0x98, 0x84, 0x54, + 0x41, 0x7a, 0x19, 0x7d, + 0xc7, 0xef, 0x0f, 0x5e, 0xc6, 0x96, 0x87, 0xf2, 0xc1, 0xb8, 0x64, 0x1e, + 0x2d, 0x15, 0xe3, 0x89, + 0xd1, 0x69, 0x7c, 0x95, 0x91, 0xdf, 0xf7, 0x7b, 0x1e, 0xca, 0x0b, 0xe4, + 0xa1, 0x21, 0x9f, 0x91, + 0x8b, 0x60, 0xa5, 0x7e, 0x32, 0x62, 0xb5, 0x56, 0x5e, 0xd3, 0x14, 0x51, + 0x0b, 0x86, 0x04, 0x81, + 0xd8, 0xb9, 0x48, 0x7b, 0x15, 0x7e, 0x15, 0x7a, 0xc2, 0xbf, 0xa4, 0x6b, + 0x46, 0x7d, 0x45, 0x9b, + 0x8d, 0xc9, 0x57, 0xfa, 0xfa, 0x27, 0xe7, 0xc3, 0x7c, 0x95, 0x3c, 0x4b, + 0xc3, 0xf9, 0x3a, 0xad, + 0x2d, 0xa4, 0x15, 0xc0, 0x69, 0xd1, 0x0a, 0xae, 0x40, 0x3f, 0x09, 0xfa, + 0x65, 0xdd, 0xb4, 0xf1, + 0xee, 0x8d, 0xfc, 0xb8, 0xdf, 0x5f, 0x9f, 0x68, 0xf4, 0xef, 0x02, 0x79, + 0x70, 0x7e, 0xc3, 0x2a, + 0x66, 0x6b, 0xc3, 0x83, 0x7e, 0xa8, 0xad, 0x87, 0xac, 0x06, 0x44, 0xce, + 0x20, 0x76, 0xa0, 0xea, + 0x27, 0x76, 0xb3, 0x4f, 0x58, 0xa3, 0x37, 0xe0, 0xad, 0x4a, 0xe2, 0x3a, + 0xf3, 0xf4, 0x62, 0x60, + 0x0f, 0x15, 0x70, 0xf4, 0xb5, 0x4d, 0xbd, 0x1a, 0x35, 0x10, 0x9b, 0xd7, + 0x6f, 0x70, 0xc8, 0xaf, + 0xfb, 0xb0, 0x4f, 0x5b, 0x23, 0xb4, 0x12, 0x7c, 0xf9, 0x5f, 0x6d, 0x2b, + 0x73, 0x7a, 0xeb, 0x64, + 0x9f, 0x53, 0xb7, 0x71, 0x05, 0x6a, 0x3e, 0xc8, 0xd7, 0x0a, 0x41, 0x81, + 0x92, 0x0f, 0x68, 0xfd, + 0x8e, 0x3c, 0x29, 0x0f, 0x9a, 0x7d, 0x16, 0xc9, 0xbc, 0x0f, 0x39, 0xb8, + 0x29, 0xed, 0xd3, 0x7d, + 0x93, 0x3a, 0x4e, 0xf0, 0x1d, 0x1b, 0xca, 0x03, 0xd3, 0xc4, 0x9b, 0x31, + 0x24, 0xdf, 0x53, 0x43, + 0xf8, 0x26, 0x36, 0x36, 0x88, 0xb5, 0xea, 0x43, 0xfc, 0x6f, 0x23, 0x4f, + 0x70, 0x3f, 0x6d, 0x9d, + 0xc3, 0x4c, 0xd1, 0x4b, 0x40, 0x89, 0x6a, 0x47, 0x0e, 0xa5, 0x14, 0x17, + 0x29, 0x85, 0xb8, 0x50, + 0xb5, 0xa1, 0x42, 0xc5, 0x86, 0x6d, 0x72, 0x11, 0x2a, 0x10, 0x0a, 0x78, + 0x9b, 0x36, 0x1e, 0x1d, + 0xd5, 0x72, 0x9c, 0xef, 0xf8, 0xd6, 0xb9, 0x5e, 0x5b, 0x74, 0x82, 0xff, + 0x94, 0xd0, 0x34, 0xb6, + 0x5a, 0xb9, 0x02, 0x8b, 0x8a, 0x42, 0xb8, 0x9d, 0x81, 0x3a, 0x5b, 0xae, + 0xf1, 0x9e, 0xd9, 0x71, + 0x36, 0x73, 0x72, 0xfc, 0x68, 0xff, 0x82, 0xe0, 0x5c, 0xee, 0x08, 0xe3, + 0x08, 0xf6, 0x38, 0x63, + 0x16, 0x1b, 0x50, 0x63, 0x26, 0xfe, 0x05, 0x34, 0x05, 0x1b, 0x8a, 0x88, + 0x24, 0x32, 0xdc, 0x75, + 0x7a, 0x00, 0xed, 0xd7, 0x7f, 0xef, 0xef, 0xe8, 0xba, 0x6c, 0xc3, 0x05, + 0x1d, 0x17, 0xd7, 0x1e, + 0xdb, 0x30, 0x17, 0x1c, 0xae, 0x4d, 0x47, 0x87, 0x29, 0xf3, 0xd0, 0xc2, + 0xc0, 0x02, 0x3c, 0x4f, + 0x9a, 0x8b, 0xe6, 0x48, 0x33, 0xd1, 0xe1, 0xd2, 0x6c, 0x34, 0x43, 0x9c, + 0x07, 0xe7, 0xe2, 0x59, + 0x68, 0xb6, 0x3c, 0x0f, 0x4d, 0x8e, 0x9c, 0xe4, 0xb9, 0x33, 0xb2, 0x98, + 0xad, 0x92, 0xce, 0x02, + 0x77, 0x49, 0xab, 0xd0, 0xad, 0x81, 0x95, 0x18, 0x10, 0x0c, 0x94, 0xc5, + 0xe7, 0xf0, 0x6f, 0xc8, + 0xcf, 0x4b, 0x70, 0x09, 0x2e, 0x4c, 0x5f, 0xa3, 0x87, 0xab, 0x0c, 0x3b, + 0x3c, 0x66, 0xcd, 0x42, + 0x82, 0x1f, 0x14, 0x27, 0x2a, 0x62, 0x15, 0xf5, 0xb4, 0x51, 0x1c, 0x2c, + 0x0b, 0x97, 0x7a, 0x68, + 0x2c, 0x8d, 0xcd, 0x28, 0xf3, 0x39, 0x94, 0x7c, 0x36, 0x23, 0x57, 0x20, + 0xcf, 0x2a, 0xc5, 0xbf, + 0x82, 0x1c, 0xed, 0xc3, 0x3a, 0xc6, 0xfd, 0x16, 0xd3, 0xd6, 0x73, 0x19, + 0xcc, 0x37, 0x49, 0xb1, + 0x7f, 0xb0, 0xc5, 0xfa, 0x4d, 0x45, 0x5a, 0x21, 0x57, 0x10, 0x20, 0xcf, + 0x13, 0xe1, 0x51, 0x05, + 0x86, 0x9d, 0xad, 0xcc, 0x29, 0x2e, 0xe4, 0xa8, 0x9e, 0x4f, 0x7f, 0x9d, + 0x2f, 0x21, 0x4b, 0xbe, + 0x09, 0x79, 0xaf, 0x2a, 0x56, 0x52, 0x5f, 0x30, 0x7c, 0x3f, 0xb2, 0x31, + 0xd5, 0xb4, 0xb2, 0x5b, + 0xda, 0xb3, 0xba, 0x30, 0x38, 0xfa, 0x9a, 0x56, 0xf3, 0xf9, 0x27, 0x4c, + 0xec, 0xfb, 0xbb, 0xf4, + 0x33, 0xde, 0x08, 0xa9, 0x42, 0x5b, 0xb8, 0x51, 0x68, 0x26, 0x2d, 0x66, + 0x34, 0x08, 0x84, 0x8f, + 0x09, 0xb2, 0x16, 0x10, 0x9e, 0x13, 0xbe, 0xe3, 0xbf, 0x0d, 0x70, 0xc8, + 0x1e, 0xcc, 0x07, 0x13, + 0xa4, 0x89, 0xd2, 0x14, 0xde, 0xc5, 0x3b, 0xf9, 0x0a, 0x5c, 0x26, 0x4e, + 0xc3, 0xc7, 0x45, 0x4e, + 0x81, 0xa7, 0x84, 0x8e, 0x85, 0x53, 0x95, 0x4a, 0x58, 0x29, 0x4f, 0xe0, + 0xa7, 0x2b, 0x53, 0x84, + 0x2a, 0xd5, 0x29, 0x54, 0x92, 0x4f, 0x38, 0x50, 0x01, 0x2e, 0x97, 0x4f, + 0x80, 0x67, 0x2a, 0x17, + 0x41, 0x45, 0xbb, 0x87, 0x6f, 0xd6, 0x0c, 0x3e, 0xa4, 0x47, 0x05, 0x2d, + 0xc4, 0x89, 0x7c, 0xe0, + 0x25, 0xf0, 0xbf, 0xf2, 0xef, 0xfc, 0xfe, 0xee, 0xc3, 0x6b, 0x27, 0x74, + 0xcd, 0xad, 0x3b, 0x2c, + 0x3a, 0x01, 0xb8, 0xc4, 0x4a, 0xde, 0xad, 0x4e, 0xc0, 0x53, 0xd5, 0x49, + 0x60, 0xbc, 0xe4, 0x44, + 0xe5, 0x42, 0x19, 0x2e, 0x17, 0xca, 0x71, 0x09, 0x5f, 0x22, 0x94, 0x93, + 0x6f, 0x2c, 0xd1, 0x5d, + 0xec, 0xd1, 0xd1, 0x4b, 0xfc, 0x27, 0x68, 0xa7, 0x22, 0xaf, 0xd6, 0x80, + 0x02, 0x1a, 0x24, 0x7c, + 0x92, 0xe1, 0x7f, 0x11, 0x5b, 0xc9, 0x8d, 0x13, 0x2b, 0x91, 0x4b, 0x22, + 0x2d, 0xe0, 0x42, 0x2e, + 0x79, 0x22, 0x9e, 0xa9, 0x2d, 0x40, 0x33, 0xe3, 0x15, 0xcc, 0xa2, 0xa8, + 0xec, 0xff, 0x45, 0xf4, + 0x6e, 0x8e, 0x6a, 0x5a, 0x84, 0x7f, 0x21, 0x9e, 0xd8, 0xb3, 0x3e, 0xc2, + 0x89, 0xea, 0xf4, 0x16, + 0xf4, 0xbc, 0x32, 0x15, 0x95, 0xe8, 0x33, 0xe1, 0x51, 0xd1, 0xf9, 0xdc, + 0x64, 0xcd, 0xc9, 0x96, + 0xa8, 0x55, 0x60, 0xba, 0xfa, 0x43, 0x14, 0x53, 0x05, 0x84, 0x54, 0x09, + 0x49, 0x6a, 0x3d, 0xaa, + 0x97, 0x77, 0xa3, 0xef, 0x08, 0xaf, 0xbb, 0xb2, 0xdd, 0x55, 0x3b, 0x3e, + 0x36, 0x9e, 0x2b, 0x11, + 0x8b, 0xb1, 0x4d, 0x70, 0xf0, 0xa5, 0xe4, 0xda, 0x1c, 0x42, 0x21, 0x2e, + 0xe2, 0x69, 0x23, 0x98, + 0xc5, 0x17, 0x0a, 0xc5, 0x52, 0x05, 0xc1, 0xe6, 0x39, 0xde, 0x79, 0x1d, + 0xc7, 0xd4, 0x5f, 0xdf, + 0x70, 0xb5, 0xef, 0x34, 0x79, 0x25, 0x88, 0x12, 0x0e, 0xe6, 0xd7, 0x05, + 0x8c, 0x94, 0x0d, 0x78, + 0xbd, 0x42, 0x78, 0x53, 0xf8, 0x0d, 0xae, 0xae, 0x73, 0x9e, 0x67, 0x7c, + 0xb4, 0x1a, 0x38, 0xa4, + 0x42, 0xde, 0x2e, 0x94, 0x08, 0xc5, 0x7c, 0xb1, 0x58, 0x20, 0x10, 0xeb, + 0x41, 0x28, 0xe4, 0x8b, + 0x44, 0xbb, 0x60, 0x17, 0x08, 0x96, 0x0a, 0xa5, 0x78, 0x46, 0xe4, 0x78, + 0x78, 0x52, 0xc7, 0x02, + 0xaf, 0xa3, 0xc1, 0xe6, 0xbf, 0x50, 0xdb, 0x00, 0x6e, 0x92, 0x6e, 0xe7, + 0xe3, 0x5a, 0x9c, 0x60, + 0x9f, 0x84, 0xfd, 0x5a, 0x33, 0xba, 0xaf, 0xe9, 0x58, 0xef, 0x8c, 0x96, + 0x99, 0xbe, 0xea, 0x50, + 0x39, 0x53, 0xa1, 0x55, 0x10, 0xbe, 0x30, 0x91, 0x39, 0x26, 0x7c, 0x22, + 0xab, 0x69, 0x61, 0x1c, + 0xd2, 0x0d, 0xac, 0xea, 0x0a, 0xd6, 0x55, 0x05, 0x78, 0x74, 0x80, 0x7e, + 0x21, 0xfd, 0x83, 0x7b, + 0xa9, 0xfd, 0xfa, 0xfa, 0x05, 0xbd, 0xc7, 0xd4, 0xcc, 0x6f, 0x98, 0xe4, + 0x73, 0xcb, 0x0e, 0xa1, + 0x48, 0x2e, 0x12, 0x4a, 0x95, 0x4a, 0xa1, 0x52, 0x29, 0xe5, 0x89, 0x1d, + 0x47, 0x30, 0x86, 0x3c, + 0x5f, 0xb4, 0x21, 0x3b, 0xb6, 0x0b, 0x85, 0x30, 0xdf, 0x98, 0xc0, 0x9d, + 0x11, 0xba, 0xd1, 0x7f, + 0x8c, 0x74, 0x14, 0x64, 0xf4, 0x2e, 0xe4, 0x0f, 0x5c, 0x83, 0x7e, 0x28, + 0x5f, 0x8b, 0xee, 0x52, + 0x75, 0x08, 0xb4, 0x0d, 0x28, 0x22, 0xbe, 0x8c, 0x3f, 0xc1, 0xbf, 0xc2, + 0x0f, 0xa2, 0x93, 0x70, + 0x2a, 0xec, 0xa2, 0xba, 0x5e, 0x65, 0xd0, 0x36, 0x64, 0x7f, 0x13, 0xea, + 0x13, 0xa1, 0xb5, 0xf1, + 0x28, 0x16, 0x9a, 0x18, 0x18, 0x29, 0xf3, 0x94, 0x86, 0x49, 0x23, 0xf6, + 0x64, 0x71, 0x9f, 0x7d, + 0x9c, 0x52, 0x2b, 0x24, 0xf3, 0x8e, 0x7e, 0x3e, 0x2f, 0x87, 0x35, 0xa9, + 0x2d, 0xe5, 0x79, 0xa5, + 0xd5, 0xb0, 0x92, 0xfc, 0x26, 0x0d, 0xee, 0xba, 0x8c, 0xfb, 0x07, 0x9b, + 0xf9, 0x26, 0xd9, 0xf3, + 0x39, 0xcc, 0x3a, 0x08, 0x66, 0xed, 0x67, 0x1b, 0x5b, 0x14, 0xb2, 0xb3, + 0xe5, 0x66, 0xae, 0x7c, + 0x86, 0x3d, 0x37, 0x47, 0x53, 0xe7, 0x2b, 0x57, 0xfb, 0x72, 0x06, 0x8a, + 0x53, 0xe4, 0x03, 0x26, + 0xef, 0x1f, 0x3c, 0x34, 0xdf, 0xc4, 0x8c, 0x0d, 0x48, 0x97, 0x6f, 0x92, + 0xe3, 0x9a, 0xd4, 0xb6, + 0xe1, 0x35, 0xa9, 0xd3, 0xd4, 0x5b, 0x48, 0xce, 0x71, 0x69, 0x20, 0xd8, + 0xf7, 0xad, 0xf0, 0x1a, + 0xdf, 0x18, 0x54, 0x84, 0xc6, 0x70, 0xbb, 0xd8, 0x16, 0x6e, 0x15, 0xda, + 0x22, 0x6d, 0x42, 0x93, + 0xd1, 0x24, 0x84, 0x42, 0x06, 0x7a, 0x34, 0xf0, 0x57, 0xfc, 0xa5, 0xd4, + 0x84, 0x8e, 0xd2, 0xf3, + 0xa0, 0x4b, 0x9c, 0x28, 0x54, 0xf0, 0x15, 0x92, 0x9b, 0xe0, 0x91, 0x43, + 0x76, 0x0b, 0xb3, 0x8d, + 0x45, 0xc2, 0x49, 0xe1, 0x85, 0x68, 0x7a, 0x60, 0x02, 0xae, 0x14, 0x5c, + 0x42, 0xb5, 0x34, 0x1e, + 0xbb, 0xc5, 0x72, 0x54, 0x2a, 0x11, 0xcc, 0x12, 0x0b, 0xe0, 0x78, 0x6d, + 0x06, 0xfc, 0x51, 0x78, + 0x03, 0xac, 0x37, 0x36, 0xc2, 0x4d, 0x46, 0x0c, 0x37, 0x18, 0x71, 0xdc, + 0x18, 0x14, 0xb1, 0x10, + 0x7a, 0x04, 0x7d, 0x13, 0xf8, 0x0d, 0xdb, 0xd0, 0x7e, 0x52, 0x9d, 0xbb, + 0x67, 0x41, 0xed, 0x9c, + 0x86, 0x09, 0x8c, 0x53, 0x2e, 0x41, 0xe5, 0xa2, 0x0b, 0x8e, 0xd7, 0xa7, + 0xc0, 0x6a, 0xd9, 0x09, + 0x4b, 0xf9, 0x52, 0x58, 0x2c, 0x94, 0xa0, 0x12, 0xd2, 0x8a, 0xa5, 0x12, + 0x5c, 0x66, 0x54, 0xa0, + 0xf9, 0xb1, 0xc5, 0x2c, 0x17, 0xae, 0xe3, 0xee, 0x50, 0x5a, 0x70, 0xa3, + 0x86, 0x91, 0x68, 0xc8, + 0x04, 0xa3, 0x04, 0xe1, 0x8d, 0xd8, 0x5a, 0xc2, 0xdd, 0x08, 0xee, 0x89, + 0x4e, 0xe4, 0x56, 0xaa, + 0xe1, 0x34, 0x7d, 0x1e, 0x58, 0x18, 0x5b, 0xe8, 0x3b, 0x3c, 0x78, 0x18, + 0xb1, 0xb1, 0xc6, 0xa1, + 0x0b, 0x23, 0x06, 0xdc, 0x1e, 0xee, 0x05, 0x3c, 0xb1, 0xcd, 0x03, 0x9a, + 0x86, 0x05, 0x1d, 0x61, + 0xc6, 0xe8, 0x42, 0x2f, 0xeb, 0x33, 0xe0, 0x74, 0xe3, 0x28, 0x30, 0xd7, + 0x98, 0x08, 0xca, 0x94, + 0x52, 0x50, 0x15, 0x9c, 0x05, 0xa6, 0x19, 0xe7, 0xa1, 0x26, 0x43, 0x42, + 0xb2, 0x2c, 0xa2, 0x3a, + 0xa3, 0x8e, 0xfb, 0x58, 0xf9, 0xd2, 0xbf, 0xb6, 0x69, 0xbc, 0xaf, 0xb2, + 0x71, 0x06, 0x53, 0x15, + 0x28, 0x83, 0x0e, 0xa1, 0x94, 0x2f, 0x17, 0x2b, 0xf8, 0x4a, 0x91, 0x8e, + 0x44, 0x19, 0xef, 0x10, + 0xed, 0x7c, 0x59, 0xa0, 0x98, 0x77, 0xa8, 0x55, 0xe8, 0xb0, 0xf0, 0x6c, + 0x66, 0x6e, 0xd3, 0x29, + 0xf5, 0xa7, 0xb6, 0x7a, 0xbd, 0x2d, 0x0d, 0xab, 0x38, 0x5e, 0x09, 0x21, + 0x60, 0x40, 0x1e, 0x29, + 0x5e, 0xe4, 0x95, 0xbb, 0xc1, 0xbb, 0xca, 0xfb, 0xac, 0xda, 0x72, 0x94, + 0xcf, 0xd9, 0x32, 0xcd, + 0x37, 0x81, 0x8c, 0x53, 0x05, 0xc1, 0x6b, 0xa7, 0xe4, 0xc4, 0xe5, 0xa2, + 0x83, 0x27, 0x3f, 0xc8, + 0x2e, 0x38, 0x50, 0x05, 0x69, 0x65, 0xbc, 0x13, 0xcc, 0x08, 0x1d, 0xe3, + 0x3f, 0xad, 0xf9, 0x78, + 0xef, 0xc4, 0xa6, 0x99, 0xbe, 0x73, 0x43, 0x06, 0x78, 0xce, 0x68, 0xc0, + 0x21, 0x2d, 0x26, 0xc8, + 0xba, 0x86, 0x69, 0xe3, 0x09, 0x1e, 0xdd, 0x17, 0x39, 0xda, 0x3f, 0x3d, + 0x34, 0x85, 0x73, 0xcb, + 0x6e, 0xe0, 0x52, 0x26, 0xc0, 0x99, 0xa1, 0xd9, 0xcc, 0x09, 0xc1, 0x45, + 0x9c, 0xa1, 0xb7, 0xf2, + 0x0d, 0x7a, 0x23, 0x8e, 0x6a, 0x51, 0x1e, 0x07, 0x65, 0xee, 0x59, 0xe9, + 0xf7, 0xe0, 0xcd, 0x08, + 0xf2, 0xce, 0xbb, 0x7b, 0x5e, 0xdd, 0xa2, 0xe6, 0x23, 0xbc, 0x93, 0xd5, + 0x0a, 0x58, 0x89, 0x5d, + 0x7c, 0x95, 0x34, 0x19, 0x4d, 0x0a, 0xb8, 0xc9, 0x35, 0x54, 0x22, 0xd2, + 0x1b, 0xb2, 0xd6, 0x94, + 0x62, 0x32, 0xee, 0x7c, 0x39, 0x3f, 0x0d, 0x57, 0x6a, 0x93, 0xc0, 0x59, + 0xc1, 0x45, 0xec, 0xf5, + 0x2a, 0x83, 0xef, 0x50, 0x5a, 0x41, 0x34, 0x28, 0xf2, 0xeb, 0xd4, 0xeb, + 0xd1, 0x65, 0xf2, 0x6d, + 0xf0, 0x0e, 0x0d, 0x41, 0x49, 0xe3, 0x91, 0x47, 0xf7, 0xe2, 0x4d, 0xd2, + 0x4e, 0xfc, 0x1e, 0xfe, + 0x25, 0x79, 0x8e, 0xaa, 0x47, 0xce, 0x3b, 0x62, 0x03, 0x55, 0x18, 0x85, + 0xbe, 0x34, 0xf3, 0x0d, + 0x9a, 0x58, 0x68, 0xf2, 0xc2, 0x52, 0x6f, 0x69, 0x98, 0x34, 0x7a, 0x0c, + 0x95, 0xf8, 0x4a, 0x0c, + 0x87, 0xcf, 0xde, 0x3f, 0x5f, 0xfa, 0x6d, 0x4a, 0x32, 0xd7, 0xa9, 0xff, + 0xc1, 0x5a, 0xfd, 0xa6, + 0xc2, 0x43, 0x5a, 0xbb, 0xc6, 0xcc, 0xf3, 0x8a, 0x14, 0x7b, 0x32, 0xe6, + 0x9b, 0x10, 0x7b, 0x3f, + 0x5b, 0x6e, 0x19, 0xad, 0x81, 0x60, 0x0b, 0x0f, 0xd6, 0x83, 0xc9, 0x54, + 0xcf, 0x65, 0x94, 0x35, + 0xad, 0xbc, 0x59, 0xc7, 0xe4, 0x80, 0xf6, 0xa6, 0x1d, 0x9e, 0x6f, 0x62, + 0x63, 0x69, 0x3e, 0x37, + 0xed, 0x7f, 0xda, 0x7a, 0x2e, 0x14, 0xd7, 0xfb, 0xec, 0xf7, 0xec, 0x79, + 0x3f, 0x56, 0xf7, 0xac, + 0x1e, 0xfd, 0x5e, 0x73, 0x11, 0x82, 0x7f, 0x4f, 0x6a, 0x2c, 0xdf, 0x1c, + 0xe9, 0x14, 0x5b, 0x83, + 0x1d, 0x62, 0x47, 0xa4, 0x5d, 0xe8, 0x8a, 0xf6, 0x10, 0x1e, 0xd8, 0xc0, + 0xdf, 0x1f, 0xf8, 0x3b, + 0xf8, 0x4e, 0x6a, 0x45, 0x53, 0xb5, 0x3c, 0x50, 0x1a, 0x98, 0x24, 0xb8, + 0xc9, 0xac, 0x9f, 0x22, + 0xcc, 0x84, 0xf3, 0xf8, 0xd9, 0xe0, 0x78, 0xf5, 0x5c, 0x78, 0x59, 0xec, + 0x02, 0xb8, 0x28, 0x34, + 0x17, 0x54, 0xd3, 0xb9, 0xa7, 0x4e, 0xc6, 0xd5, 0x5a, 0x25, 0xac, 0x56, + 0x26, 0x73, 0x93, 0xe4, + 0xc9, 0x60, 0xaa, 0x36, 0x95, 0x5b, 0x10, 0xbf, 0x85, 0x8b, 0xc5, 0xda, + 0xe0, 0x46, 0xbd, 0x03, + 0x37, 0x86, 0xda, 0x70, 0x5b, 0xa8, 0x01, 0x35, 0x84, 0xb6, 0xc0, 0x3f, + 0xcb, 0xff, 0x61, 0x22, + 0x9d, 0x47, 0x78, 0x9d, 0xbd, 0x87, 0xd5, 0xcd, 0x6f, 0x9c, 0xe1, 0x9b, + 0xa8, 0x8d, 0x87, 0x53, + 0x02, 0xd3, 0xe1, 0x2c, 0xed, 0x30, 0x6e, 0x9a, 0x36, 0x01, 0x54, 0x2a, + 0x15, 0xb0, 0x2c, 0x50, + 0x8a, 0xca, 0x03, 0x15, 0xb0, 0x44, 0xb1, 0x41, 0x97, 0x36, 0x85, 0x9b, + 0x1d, 0x3b, 0x93, 0x5d, + 0x11, 0xf9, 0x09, 0xd0, 0xd4, 0x56, 0xd4, 0x4c, 0xe6, 0xbf, 0x66, 0x04, + 0x91, 0x18, 0x52, 0x60, + 0x40, 0x91, 0x85, 0x5f, 0xc6, 0xd6, 0x13, 0xfe, 0x3c, 0x01, 0x8f, 0x97, + 0x26, 0xe1, 0xc3, 0x28, + 0xf6, 0x45, 0x17, 0xfa, 0x0f, 0x8f, 0x4e, 0x63, 0xc6, 0xcb, 0x04, 0x8b, + 0xc5, 0x62, 0xf3, 0xd9, + 0x38, 0xa9, 0x41, 0x64, 0x9f, 0x88, 0xf7, 0x70, 0x5e, 0x62, 0x13, 0x6a, + 0xba, 0x88, 0xa1, 0xd1, + 0x09, 0x7f, 0x1e, 0x39, 0x06, 0xcc, 0x31, 0x66, 0x71, 0x6e, 0xb1, 0x04, + 0x56, 0x2a, 0x13, 0xe1, + 0x44, 0x6d, 0x32, 0x98, 0xa0, 0x9d, 0x0b, 0x5b, 0x08, 0xf7, 0x43, 0x1a, + 0x87, 0x36, 0xc9, 0xff, + 0x07, 0x1e, 0x6f, 0x70, 0xd7, 0xbb, 0x1a, 0xa6, 0x72, 0xd3, 0x54, 0x27, + 0x2c, 0x0a, 0x38, 0xa0, + 0x43, 0x2a, 0x85, 0x25, 0x92, 0x1d, 0xda, 0xa5, 0x42, 0x98, 0x47, 0xb0, + 0x75, 0x9c, 0x98, 0x67, + 0xda, 0xda, 0xae, 0xd0, 0x1c, 0x76, 0x76, 0xd3, 0x51, 0xbe, 0x33, 0x1a, + 0x4e, 0x62, 0x7f, 0x64, + 0xe8, 0xd8, 0xd0, 0x54, 0xaa, 0xbd, 0x11, 0x9b, 0x97, 0xd8, 0x9e, 0x5a, + 0x04, 0xbd, 0x13, 0xfc, + 0x3d, 0xdb, 0xde, 0x7c, 0x9c, 0xc7, 0xd1, 0x38, 0x9e, 0x99, 0x18, 0xa8, + 0x44, 0x04, 0x47, 0x39, + 0x82, 0x9f, 0xd0, 0x46, 0xb8, 0x5e, 0x3e, 0x4f, 0x56, 0x70, 0xba, 0x86, + 0x93, 0xd7, 0x05, 0xa4, + 0x15, 0xab, 0x33, 0xd0, 0xc2, 0xc6, 0x23, 0xfd, 0x87, 0x35, 0x1d, 0xe6, + 0x3d, 0x23, 0x72, 0x3b, + 0x68, 0x52, 0x1f, 0xe7, 0xe3, 0x04, 0xeb, 0x75, 0x5d, 0x45, 0x7a, 0x50, + 0xc6, 0x5a, 0x30, 0x84, + 0xa5, 0xe0, 0x26, 0xfc, 0x10, 0xc1, 0x6f, 0x47, 0x80, 0xf0, 0x70, 0xb2, + 0x2a, 0xb9, 0x88, 0x2d, + 0x3b, 0x3b, 0x34, 0xc9, 0x3f, 0x5b, 0x39, 0x16, 0x86, 0xf4, 0x16, 0x1c, + 0x35, 0x9a, 0x71, 0xdc, + 0x08, 0xe0, 0x6d, 0xd2, 0x37, 0xe8, 0xcb, 0x30, 0xf6, 0x1d, 0x75, 0xcf, + 0x61, 0xeb, 0x8f, 0x6b, + 0x3f, 0xaa, 0x7e, 0x82, 0x5a, 0x04, 0x8a, 0x02, 0x36, 0x5c, 0x12, 0x28, + 0x07, 0x25, 0x22, 0xc1, + 0x5c, 0xb2, 0x76, 0xf7, 0x6b, 0x0b, 0x94, 0x03, 0x14, 0xf1, 0xc5, 0xb8, + 0x5c, 0x99, 0x06, 0x4e, + 0x8b, 0x5c, 0x0d, 0x2e, 0xd1, 0x4f, 0x04, 0x77, 0x6a, 0x51, 0x14, 0x26, + 0xe7, 0x16, 0x83, 0x06, + 0xc1, 0xbb, 0xeb, 0x50, 0x8d, 0x72, 0x15, 0xba, 0x53, 0x0d, 0x20, 0x44, + 0xec, 0x69, 0x41, 0xe3, + 0x61, 0x9d, 0xce, 0xc0, 0x1e, 0x69, 0x37, 0xda, 0x87, 0x2f, 0x1b, 0x69, + 0x8f, 0x18, 0xe5, 0x0c, + 0xad, 0xa3, 0x90, 0x8d, 0x77, 0x50, 0xdc, 0x28, 0x22, 0xf3, 0xdb, 0xa6, + 0xda, 0xfd, 0xf4, 0x35, + 0xc1, 0x41, 0xb3, 0x95, 0x04, 0x4b, 0x7c, 0x0e, 0x62, 0x1f, 0x9b, 0x5a, + 0xa1, 0x52, 0xcc, 0x96, + 0x87, 0x8a, 0x7d, 0xd9, 0xe6, 0x7a, 0x6e, 0xf7, 0x5b, 0xac, 0x18, 0xb5, + 0x86, 0x95, 0x6e, 0xff, + 0x60, 0x1a, 0xcb, 0x6c, 0xd6, 0x69, 0xe9, 0xf7, 0x15, 0xa4, 0xc9, 0xb1, + 0xa0, 0xb6, 0x2f, 0xad, + 0x83, 0x4f, 0x71, 0x30, 0xa3, 0xbe, 0x46, 0xd6, 0x85, 0xac, 0xb9, 0x6f, + 0xdf, 0xdf, 0x98, 0x24, + 0xea, 0x7c, 0x19, 0xc9, 0xf9, 0x26, 0x29, 0xeb, 0xaf, 0xf9, 0x68, 0xac, + 0x80, 0x4d, 0xca, 0xe3, + 0x32, 0xdd, 0x57, 0x6b, 0x39, 0x2e, 0x79, 0xa3, 0xaa, 0x49, 0xdd, 0x5f, + 0xd3, 0x2a, 0x88, 0xbf, + 0x43, 0x8f, 0x85, 0xc2, 0xa8, 0x37, 0xda, 0x85, 0x5b, 0x43, 0x9d, 0xb8, + 0x3b, 0xdc, 0x2b, 0xf4, + 0x84, 0x3b, 0xc5, 0x86, 0xf0, 0x76, 0xfc, 0x77, 0xfd, 0x65, 0x70, 0x51, + 0x28, 0x1f, 0x96, 0xcb, + 0x87, 0xe1, 0x2a, 0xd1, 0x2d, 0xba, 0xf8, 0x4a, 0xfc, 0x03, 0xf9, 0x68, + 0x38, 0x53, 0x9c, 0x85, + 0xe6, 0xca, 0x47, 0xa1, 0x13, 0xf5, 0xc5, 0x84, 0x5b, 0x5d, 0x0e, 0x2f, + 0x8f, 0x2e, 0x82, 0x67, + 0xc7, 0x3d, 0x10, 0x34, 0xae, 0xe6, 0xae, 0x8a, 0x1c, 0x07, 0x0e, 0xd3, + 0x89, 0x1d, 0x19, 0xba, + 0x90, 0x5b, 0x17, 0xed, 0x85, 0x3d, 0x04, 0xf3, 0xda, 0xb5, 0x66, 0x21, + 0x6e, 0xb4, 0xf1, 0x8d, + 0xe1, 0x20, 0x7e, 0x34, 0xf4, 0x7b, 0xee, 0xe1, 0x96, 0xf3, 0x3c, 0xae, + 0x8d, 0x73, 0xea, 0x16, + 0x34, 0xcf, 0xf2, 0x4d, 0x33, 0xca, 0xc1, 0x74, 0xfd, 0x7c, 0x6e, 0xba, + 0x4a, 0xb0, 0x2b, 0x38, + 0x87, 0x9b, 0x66, 0x54, 0x71, 0xb3, 0x8c, 0x79, 0xdc, 0x11, 0xc6, 0xd1, + 0xf0, 0x48, 0x6d, 0x11, + 0xbc, 0x48, 0xf9, 0x31, 0x3a, 0x47, 0x1f, 0x0f, 0x16, 0x87, 0x56, 0x71, + 0x72, 0x30, 0x86, 0x1a, + 0xb4, 0x28, 0x8e, 0xe8, 0x11, 0x62, 0xdf, 0x85, 0xb1, 0xae, 0x87, 0xa0, + 0xac, 0x04, 0xf0, 0xa7, + 0x21, 0x0f, 0xc1, 0xbf, 0x49, 0xc4, 0xe6, 0x9d, 0x8f, 0x8f, 0x0c, 0x1f, + 0xe5, 0x5f, 0x10, 0x9b, + 0xcd, 0x4c, 0xd4, 0xcb, 0x40, 0x99, 0x58, 0x46, 0x38, 0x65, 0x29, 0x2a, + 0x41, 0x76, 0x7e, 0x5c, + 0xa0, 0x00, 0xfe, 0xa4, 0xf1, 0x15, 0xe6, 0xdd, 0x48, 0x10, 0x00, 0x4d, + 0xe3, 0x15, 0xa3, 0x87, + 0x7f, 0xda, 0x38, 0x96, 0x60, 0x9e, 0x1b, 0x94, 0xc9, 0xd5, 0x60, 0x8a, + 0x3c, 0x11, 0x96, 0x4b, + 0x55, 0x60, 0xbc, 0x7c, 0x1e, 0x68, 0x57, 0x64, 0x14, 0x08, 0xee, 0x83, + 0xdf, 0x28, 0x5b, 0xd8, + 0x19, 0xb1, 0x32, 0xe6, 0x68, 0x75, 0x3a, 0x74, 0x0a, 0x65, 0xf0, 0x70, + 0xb5, 0xda, 0x5f, 0xa6, + 0xb8, 0x09, 0xdf, 0x1a, 0x0f, 0x26, 0xcb, 0x87, 0x73, 0x0b, 0xb5, 0x23, + 0xd8, 0x79, 0xca, 0x5c, + 0xff, 0xb1, 0xea, 0x62, 0xf6, 0xe8, 0xd0, 0x61, 0xec, 0xbc, 0xc8, 0x51, + 0xec, 0xfc, 0xd0, 0x12, + 0x14, 0xd6, 0xc2, 0xbc, 0xa2, 0x05, 0x71, 0x40, 0x97, 0x79, 0xa4, 0xf1, + 0xfc, 0x53, 0xe1, 0x8f, + 0xc1, 0xb6, 0xb6, 0x73, 0x3d, 0x25, 0xad, 0xd5, 0xbe, 0x69, 0x7a, 0x35, + 0x28, 0x97, 0x8a, 0xf1, + 0x0c, 0x6d, 0x3e, 0x74, 0xc9, 0x4e, 0x50, 0x1d, 0x98, 0x0c, 0xab, 0x03, + 0x13, 0xc1, 0x34, 0x79, + 0x16, 0x9c, 0xaf, 0xcc, 0x06, 0xd3, 0xe5, 0xb3, 0xc0, 0x55, 0x91, 0x8b, + 0xc0, 0x39, 0xf1, 0xa3, + 0xb8, 0x63, 0x42, 0x27, 0xb2, 0x67, 0xe8, 0x5e, 0x28, 0x19, 0x06, 0x96, + 0x43, 0x3a, 0x0a, 0xe8, + 0x41, 0x14, 0x09, 0xe9, 0x38, 0x66, 0x44, 0xb0, 0xac, 0x6d, 0xc3, 0x8f, + 0x6b, 0x6e, 0x98, 0x47, + 0x18, 0x9b, 0x43, 0x2c, 0xc7, 0x93, 0xb5, 0x19, 0x68, 0x8a, 0x52, 0x02, + 0x66, 0xca, 0x27, 0x00, + 0x43, 0x6f, 0x83, 0xb1, 0xb0, 0xce, 0xb7, 0x6b, 0x6f, 0x83, 0x6f, 0x95, + 0x2e, 0xee, 0xc4, 0x4d, + 0x87, 0x6d, 0x38, 0xb1, 0xf7, 0x84, 0xda, 0x59, 0x46, 0x25, 0x3b, 0x35, + 0x70, 0x04, 0x9c, 0xa2, + 0x4c, 0xe3, 0x66, 0xc8, 0xd3, 0xb8, 0xc3, 0x03, 0xb3, 0xd1, 0x2c, 0xe9, + 0x30, 0x74, 0xb8, 0x78, + 0x14, 0x9a, 0x47, 0x38, 0xdf, 0x4c, 0x7e, 0x06, 0x9a, 0x27, 0xcd, 0x47, + 0x47, 0x04, 0xcf, 0x82, + 0xe7, 0x06, 0x2f, 0x86, 0xcb, 0x94, 0x30, 0x6c, 0x30, 0x44, 0x72, 0x7e, + 0x11, 0x0a, 0xba, 0x0c, + 0x05, 0x63, 0x3d, 0xbc, 0x5d, 0x5b, 0x03, 0x79, 0x1d, 0x42, 0xa8, 0x63, + 0xc8, 0x6b, 0x08, 0x08, + 0x1a, 0x0b, 0x56, 0xea, 0xad, 0x60, 0x27, 0xbe, 0x60, 0x04, 0x2e, 0xd8, + 0x83, 0xe5, 0x3e, 0x62, + 0x63, 0xb2, 0xd9, 0xb8, 0x98, 0xc3, 0x28, 0xf1, 0xf5, 0xd9, 0xb5, 0x88, + 0xe2, 0x47, 0x41, 0xa0, + 0xcf, 0x46, 0xee, 0xc3, 0xc2, 0x69, 0x8d, 0xa5, 0x1b, 0xe8, 0x91, 0xd6, + 0xf8, 0xb4, 0x0d, 0xfa, + 0x4d, 0xe0, 0x98, 0x35, 0x2c, 0xe9, 0xd0, 0xec, 0xb7, 0x38, 0xa4, 0x0e, + 0xfe, 0xf0, 0x7c, 0x13, + 0x82, 0x65, 0x76, 0xb5, 0x80, 0xe2, 0x60, 0x7f, 0xed, 0x67, 0x94, 0xbc, + 0x26, 0x98, 0x76, 0x30, + 0xe1, 0x49, 0x23, 0xf4, 0xb5, 0xa4, 0x3a, 0xf8, 0xc5, 0xa1, 0x72, 0x5f, + 0xa2, 0xce, 0x57, 0xc6, + 0x7e, 0x7c, 0x0f, 0x7b, 0xd3, 0x8e, 0x1c, 0x93, 0xd4, 0xf5, 0x5c, 0xfa, + 0xf6, 0x66, 0xec, 0xab, + 0xbf, 0x96, 0x2e, 0xdf, 0x24, 0xf7, 0x35, 0xa9, 0x07, 0xeb, 0x76, 0x84, + 0x09, 0xfe, 0x3d, 0x17, + 0x8a, 0xa3, 0x9e, 0x68, 0x2f, 0xda, 0x18, 0xee, 0x26, 0x6d, 0x93, 0x40, + 0x8e, 0x62, 0x6f, 0xf4, + 0x19, 0x84, 0x1b, 0x09, 0xff, 0xd2, 0xa7, 0x08, 0x13, 0x84, 0x2a, 0x81, + 0xd8, 0x48, 0x42, 0x05, + 0x76, 0xa3, 0x33, 0xb5, 0xeb, 0xb1, 0x57, 0x59, 0x2d, 0xdc, 0xa9, 0xac, + 0x10, 0xee, 0xd0, 0x6a, + 0x05, 0x56, 0x97, 0x84, 0xa6, 0x60, 0x80, 0xf7, 0x85, 0x3a, 0xf0, 0xd6, + 0x70, 0x37, 0xd0, 0x0d, + 0x0f, 0xbe, 0xd3, 0x58, 0x29, 0x2c, 0x8b, 0x84, 0xe1, 0x7d, 0x91, 0x36, + 0xd0, 0x14, 0x69, 0x84, + 0xed, 0xe1, 0x36, 0xbe, 0x9d, 0xf0, 0x91, 0x86, 0x50, 0x13, 0x86, 0xd1, + 0x35, 0x6c, 0x55, 0xcf, + 0xb4, 0xba, 0x85, 0xad, 0xb3, 0x3c, 0x53, 0x43, 0x13, 0xb9, 0x6a, 0xa9, + 0x14, 0xcd, 0xd2, 0x16, + 0xb3, 0xe7, 0xa9, 0x77, 0x08, 0xcb, 0x82, 0xcb, 0xe1, 0x6d, 0xc1, 0x65, + 0x70, 0x6d, 0xd0, 0x0b, + 0x40, 0x10, 0xc0, 0x5a, 0xdd, 0x8f, 0x1a, 0xd5, 0x6e, 0xa4, 0x69, 0xcb, + 0xd1, 0x5d, 0x7a, 0x03, + 0xea, 0x36, 0xda, 0x70, 0x93, 0xd1, 0x80, 0x1a, 0xb5, 0x06, 0x82, 0x31, + 0x0d, 0x28, 0xae, 0x19, + 0x48, 0x57, 0x55, 0xf4, 0x47, 0x9d, 0x65, 0x6d, 0xf2, 0x1c, 0x7c, 0x64, + 0xe8, 0x58, 0x70, 0x6c, + 0xc3, 0x42, 0x66, 0x76, 0xc8, 0xed, 0x9f, 0xa2, 0x1e, 0x0d, 0x5c, 0x52, + 0x09, 0x34, 0x75, 0x3a, + 0xb1, 0x84, 0x27, 0xf6, 0x38, 0xe1, 0x69, 0x93, 0x61, 0x34, 0xf2, 0x06, + 0xf7, 0xbc, 0xa6, 0xf2, + 0xac, 0x72, 0xb7, 0xf0, 0xa0, 0x3e, 0x13, 0x95, 0x2a, 0x2e, 0x30, 0x41, + 0x99, 0x04, 0xaa, 0x64, + 0xd2, 0x57, 0xc9, 0x05, 0x27, 0xca, 0x17, 0x73, 0x1d, 0xaa, 0x81, 0xe2, + 0xe1, 0x2d, 0xf0, 0x46, + 0x62, 0x83, 0x54, 0x07, 0x67, 0xb3, 0x47, 0x4a, 0x93, 0x61, 0xb9, 0x50, + 0x05, 0x8f, 0xd7, 0xe6, + 0xfb, 0x8f, 0x57, 0x4f, 0x86, 0xa7, 0xa9, 0x67, 0xc2, 0x2b, 0x95, 0x9b, + 0xe1, 0x0a, 0xfd, 0x56, + 0x78, 0x8d, 0x7a, 0x25, 0xdc, 0x20, 0x03, 0xfc, 0x53, 0xe5, 0x04, 0x74, + 0x86, 0x7a, 0x31, 0xf4, + 0x04, 0x37, 0xc1, 0x58, 0xc8, 0x40, 0x41, 0xcd, 0xc0, 0x61, 0x5d, 0x26, + 0xb6, 0xaa, 0x8a, 0x37, + 0xc6, 0x97, 0xf9, 0x4b, 0x5a, 0xcb, 0xbc, 0x33, 0x23, 0x13, 0xd9, 0x0a, + 0xc5, 0x85, 0x9c, 0x4a, + 0x19, 0x9c, 0xad, 0x1e, 0x81, 0x8e, 0x10, 0x8f, 0x03, 0x27, 0x48, 0xc7, + 0x83, 0x53, 0xc4, 0x1f, + 0x82, 0xcb, 0x94, 0x25, 0xf8, 0x5a, 0xf5, 0x0c, 0x7c, 0x8d, 0xda, 0xcb, + 0x3f, 0x26, 0x89, 0xe8, + 0x27, 0xe2, 0xe9, 0x78, 0x91, 0x72, 0x0e, 0x5e, 0xae, 0xf5, 0xa0, 0x66, + 0x23, 0x8a, 0xe2, 0x04, + 0xfb, 0x43, 0x14, 0xf7, 0x83, 0x71, 0x3e, 0xae, 0xc7, 0xb0, 0xae, 0x3e, + 0x80, 0x9f, 0xd0, 0x2a, + 0x01, 0xdd, 0xd1, 0xbd, 0x42, 0x9a, 0x80, 0x26, 0xca, 0xd5, 0xa8, 0x5c, + 0x2a, 0x44, 0x73, 0x03, + 0x8b, 0x89, 0xfd, 0xdb, 0xc2, 0xc5, 0xc9, 0x5a, 0xb3, 0x35, 0xf8, 0x3c, + 0xbb, 0xb4, 0x63, 0x6a, + 0xed, 0x31, 0xbd, 0x8b, 0x6b, 0x8e, 0x6a, 0x9c, 0xc6, 0xb8, 0xa4, 0x02, + 0x74, 0xa2, 0x7c, 0x3e, + 0x98, 0x28, 0x4f, 0x27, 0xf8, 0x37, 0x93, 0x9b, 0xab, 0x1c, 0x83, 0x4e, + 0x53, 0xae, 0x41, 0xcb, + 0x94, 0x1b, 0xe1, 0x15, 0xe2, 0x65, 0xf0, 0x72, 0xfe, 0x42, 0x78, 0x7a, + 0xe0, 0x48, 0x74, 0x44, + 0x60, 0x11, 0x3a, 0x57, 0x46, 0xa8, 0x45, 0xd5, 0x91, 0xac, 0x12, 0xee, + 0xa7, 0xf2, 0x08, 0xa9, + 0x18, 0x61, 0x5d, 0x02, 0xaa, 0x21, 0x00, 0x9f, 0xe1, 0x03, 0x40, 0x47, + 0xa4, 0x31, 0x80, 0xd5, + 0x01, 0xd8, 0xa0, 0x45, 0xe1, 0x0b, 0xe8, 0xa2, 0x91, 0xf1, 0xca, 0xa1, + 0x72, 0x6f, 0xd6, 0x9a, + 0x2e, 0xc4, 0x06, 0x72, 0xe8, 0xc5, 0xcc, 0xc8, 0x1c, 0xcd, 0x4a, 0xff, + 0x82, 0x7b, 0x4f, 0xbf, + 0xf1, 0xca, 0x3d, 0x2b, 0xcf, 0x5a, 0xf9, 0xf6, 0xb2, 0xc5, 0x47, 0x75, + 0x94, 0xdd, 0x55, 0x16, + 0x29, 0xf7, 0x50, 0x0d, 0xb0, 0x3c, 0x92, 0xd0, 0x0b, 0x93, 0x62, 0xf1, + 0x60, 0x72, 0xce, 0x69, + 0x4e, 0xf7, 0x61, 0x8d, 0x14, 0xe6, 0x62, 0x5f, 0x35, 0x54, 0xa0, 0x95, + 0xfa, 0xe9, 0x39, 0x93, + 0xfd, 0x26, 0x65, 0x31, 0xbb, 0x8f, 0xd6, 0x7e, 0xb6, 0x19, 0xc4, 0x1e, + 0x94, 0xf3, 0x07, 0xc7, + 0x49, 0xcc, 0x27, 0xf8, 0x67, 0xf3, 0x0f, 0x6a, 0x9d, 0xc9, 0xf5, 0x5c, + 0x06, 0x63, 0xb4, 0x4d, + 0xfb, 0xb2, 0x29, 0x69, 0x3f, 0x32, 0x29, 0x45, 0x8c, 0x76, 0xce, 0xeb, + 0x74, 0x1f, 0x70, 0x9d, + 0xaf, 0x81, 0x7c, 0x13, 0xd3, 0x47, 0x32, 0xa2, 0x9e, 0xcb, 0xc8, 0x7c, + 0x13, 0x5b, 0x2e, 0xeb, + 0x74, 0x0f, 0xab, 0x5d, 0x43, 0xf1, 0xef, 0xe7, 0xa1, 0x46, 0xb4, 0x39, + 0xba, 0x19, 0xdd, 0x1d, + 0xee, 0x41, 0x1b, 0x23, 0x77, 0xf3, 0x9b, 0xc2, 0x3d, 0xc2, 0x3d, 0xd1, + 0x17, 0xe0, 0xd2, 0x48, + 0x31, 0x3f, 0x55, 0x1c, 0x2f, 0x56, 0x09, 0x2e, 0xa9, 0x5a, 0x70, 0x09, + 0x15, 0xe2, 0xe1, 0xe8, + 0x58, 0x75, 0x03, 0xda, 0x19, 0x7c, 0x4c, 0x78, 0x24, 0xf8, 0xa0, 0xb0, + 0x3d, 0xf4, 0x30, 0x7f, + 0xbf, 0x7e, 0xaf, 0xb8, 0x45, 0xdb, 0x26, 0x6c, 0x37, 0x7a, 0x70, 0x9b, + 0xde, 0x89, 0xef, 0xd6, + 0xef, 0x15, 0xb6, 0x07, 0x1f, 0x12, 0xb7, 0x87, 0x7b, 0x70, 0x53, 0xb8, + 0x15, 0xb6, 0x46, 0x3a, + 0x50, 0x57, 0xa4, 0x07, 0x77, 0x86, 0x5b, 0x41, 0x5b, 0xa8, 0x0b, 0xdf, + 0x15, 0x39, 0x1f, 0xce, + 0xee, 0x38, 0xb2, 0x6e, 0x56, 0x64, 0x92, 0xcf, 0xad, 0xb9, 0x60, 0x95, + 0xec, 0x42, 0x33, 0xf5, + 0xd3, 0x59, 0xa0, 0x3f, 0xc6, 0xdf, 0x1b, 0xbe, 0x17, 0x6d, 0x09, 0x6d, + 0x45, 0x9b, 0xc2, 0x9d, + 0xa8, 0xc3, 0xe8, 0xc2, 0x1b, 0xf5, 0x6e, 0xdc, 0xa2, 0xb7, 0xe2, 0x5e, + 0x6d, 0x0b, 0xbf, 0x45, + 0x6b, 0xc5, 0x71, 0xbd, 0x19, 0xb5, 0x93, 0xd6, 0x48, 0xb0, 0xb0, 0x51, + 0x6f, 0x21, 0x2d, 0x4e, + 0x30, 0x30, 0x06, 0xbf, 0x52, 0x0d, 0xae, 0x3a, 0x7c, 0x32, 0x38, 0x21, + 0x7e, 0x8c, 0x6f, 0x7e, + 0xd3, 0x4c, 0x66, 0x92, 0x56, 0x4a, 0xf8, 0xe4, 0x39, 0xa0, 0x44, 0xb6, + 0x41, 0xa7, 0x54, 0x84, + 0xec, 0x81, 0x12, 0x54, 0x2c, 0x94, 0x62, 0x07, 0x7d, 0x9e, 0xe4, 0x53, + 0xe1, 0x5e, 0xed, 0x5f, + 0xf0, 0x11, 0x75, 0x23, 0xda, 0x1a, 0x9c, 0x04, 0x2b, 0x08, 0xef, 0x9b, + 0x24, 0x57, 0xc2, 0x92, + 0x40, 0x09, 0xc1, 0xbf, 0x0a, 0x38, 0x4d, 0xb9, 0x9c, 0xeb, 0xd5, 0xc2, + 0xa8, 0x39, 0x2a, 0xc3, + 0x19, 0xe1, 0xa9, 0xec, 0x0c, 0x6d, 0x12, 0x37, 0x27, 0x50, 0x0d, 0x2b, + 0xc5, 0x4a, 0x78, 0x2c, + 0xe1, 0x3a, 0x77, 0x87, 0xda, 0xb9, 0xb6, 0x50, 0x2b, 0xd7, 0x1a, 0xea, + 0x20, 0xc7, 0x28, 0xe1, + 0x47, 0x6d, 0xe4, 0x1a, 0xe3, 0x7c, 0xab, 0xd6, 0xc6, 0x37, 0xab, 0x9d, + 0xb8, 0x87, 0x5c, 0x53, + 0xcc, 0x08, 0xa1, 0x08, 0xe1, 0xa7, 0x31, 0xdd, 0x20, 0x78, 0x15, 0x45, + 0xb5, 0xcd, 0xb3, 0x98, + 0xea, 0xf8, 0x54, 0xc6, 0x2d, 0x57, 0x22, 0x77, 0xc0, 0x89, 0x2a, 0xa5, + 0x62, 0x72, 0x3c, 0x83, + 0x5c, 0x7f, 0x07, 0x8a, 0x1b, 0x71, 0xd4, 0x62, 0x34, 0x22, 0x8a, 0x69, + 0x21, 0x3d, 0x84, 0x9b, + 0xf4, 0x46, 0xdc, 0xa2, 0x35, 0xe1, 0xa0, 0x16, 0x44, 0x1a, 0x59, 0x2f, + 0xee, 0x09, 0x36, 0xa1, + 0x06, 0xd2, 0xe7, 0x98, 0x4e, 0xb8, 0x2f, 0xf9, 0xee, 0xc6, 0x60, 0x1c, + 0x37, 0xe8, 0x4d, 0x38, + 0xa4, 0x3d, 0x88, 0x9f, 0xd2, 0x2a, 0xe0, 0x38, 0xbe, 0x0c, 0xbb, 0xc4, + 0xf1, 0xd8, 0x29, 0x95, + 0xe0, 0x12, 0xa1, 0x10, 0xcd, 0x17, 0x4f, 0x87, 0x11, 0xbd, 0x95, 0x8b, + 0x1a, 0x2d, 0xf0, 0x9e, + 0x86, 0xcb, 0x99, 0x49, 0xdd, 0x8b, 0x6b, 0x4e, 0x6c, 0x5d, 0xe0, 0x9d, + 0xa2, 0xbb, 0x09, 0xcf, + 0x74, 0xc0, 0x23, 0xf4, 0x0b, 0xc0, 0xba, 0x20, 0xe2, 0x18, 0xdd, 0xc3, + 0xd5, 0x1b, 0x5e, 0x08, + 0x0d, 0x15, 0x2a, 0x86, 0x07, 0xf8, 0x82, 0x18, 0x40, 0x8d, 0x33, 0x63, + 0x97, 0x6a, 0x55, 0x1f, + 0x6c, 0xd6, 0xc2, 0x30, 0x60, 0xa8, 0x28, 0xa0, 0xc9, 0x50, 0xd2, 0x24, + 0x18, 0xd0, 0x30, 0xc4, + 0x3a, 0x06, 0x80, 0x60, 0x9f, 0xcf, 0x60, 0x80, 0x9f, 0xe0, 0x9e, 0x5f, + 0xf7, 0x13, 0xfc, 0xf3, + 0x82, 0x35, 0x5a, 0x08, 0x3e, 0x8d, 0xce, 0x1b, 0xc1, 0x01, 0x68, 0xed, + 0xc7, 0x6c, 0xf5, 0x55, + 0x88, 0xdd, 0x05, 0xe8, 0x3e, 0x4d, 0xfd, 0x6b, 0xbe, 0x2d, 0x34, 0xb5, + 0x76, 0xd1, 0xa3, 0x17, + 0x5f, 0x7d, 0xcb, 0x5b, 0x2b, 0x4f, 0x59, 0xf9, 0xee, 0xca, 0x93, 0xfb, + 0xdb, 0xb2, 0x87, 0x4a, + 0xae, 0xa5, 0x71, 0x66, 0xf4, 0x3b, 0xcb, 0xa9, 0x0f, 0x39, 0x5e, 0x59, + 0x67, 0xb6, 0x58, 0x9f, + 0x3e, 0x66, 0xe6, 0x9b, 0x14, 0x00, 0x1a, 0x0f, 0x67, 0xcf, 0xa5, 0xae, + 0x97, 0xa3, 0xfd, 0x16, + 0xc7, 0xd1, 0x18, 0x14, 0xd3, 0x56, 0xed, 0xf7, 0x9b, 0x94, 0x32, 0x0e, + 0x82, 0x7d, 0xfd, 0x7b, + 0xbd, 0xd1, 0xe3, 0x20, 0x17, 0x2b, 0x84, 0xf6, 0x50, 0x91, 0x3f, 0xa5, + 0x4d, 0x98, 0x54, 0x07, + 0x7f, 0xf8, 0xde, 0x8c, 0x23, 0xea, 0xb9, 0x98, 0xb1, 0x10, 0x09, 0x2c, + 0xfa, 0x7f, 0x68, 0x6f, + 0xda, 0xa1, 0xb9, 0x6f, 0x74, 0xdf, 0x8f, 0xb4, 0xf5, 0x5c, 0x12, 0xb8, + 0x5e, 0x1c, 0xad, 0xf2, + 0x58, 0xdd, 0xb3, 0xba, 0x68, 0x94, 0x7b, 0x50, 0x06, 0x69, 0xcc, 0x5f, + 0xa8, 0x1d, 0x6d, 0x8d, + 0x6e, 0xc5, 0x5b, 0xc2, 0xf7, 0xa0, 0x6d, 0x11, 0x72, 0x8c, 0x6c, 0xe6, + 0xb7, 0xc6, 0xdf, 0x80, + 0x2b, 0x8d, 0x42, 0x61, 0x02, 0x1e, 0x2f, 0x54, 0x0b, 0x55, 0x92, 0x53, + 0x98, 0xc0, 0xcf, 0x0c, + 0x9d, 0x02, 0x4f, 0x94, 0x6f, 0x80, 0x4f, 0x05, 0x7b, 0x85, 0xce, 0x60, + 0x8f, 0xb0, 0xd1, 0xe8, + 0xe5, 0x37, 0x07, 0x37, 0x8a, 0xdd, 0xa1, 0x1e, 0xa1, 0x37, 0xb2, 0x91, + 0xef, 0x0a, 0x77, 0x09, + 0xdd, 0xe1, 0x76, 0xdc, 0x11, 0xe9, 0x02, 0x5d, 0xd1, 0x76, 0xae, 0x3d, + 0x4a, 0x30, 0x2f, 0xdc, + 0x0d, 0x37, 0x87, 0x3b, 0xe0, 0x3d, 0x91, 0x2d, 0x5c, 0x57, 0xb8, 0x17, + 0xa1, 0xc8, 0x95, 0x78, + 0x7a, 0xe3, 0x74, 0x66, 0xbc, 0x5a, 0xc5, 0xba, 0xb4, 0xf1, 0x60, 0xbc, + 0xe6, 0xc4, 0x93, 0x43, + 0xc7, 0x72, 0x6b, 0x8c, 0xcd, 0x28, 0x16, 0x6e, 0x47, 0x2d, 0xe1, 0x66, + 0x82, 0x9b, 0xcd, 0xa8, + 0x25, 0xd8, 0x82, 0x1b, 0x0c, 0xf2, 0x5d, 0xc1, 0x56, 0xdc, 0xaa, 0x37, + 0xf3, 0x04, 0x07, 0xf9, + 0x56, 0xa3, 0x19, 0xb5, 0xe9, 0xed, 0xb0, 0xc3, 0x68, 0x45, 0xad, 0x06, + 0xf9, 0x6c, 0xb0, 0x0d, + 0x35, 0x18, 0x4d, 0xf0, 0xdf, 0x6a, 0x0f, 0x9c, 0xd9, 0x78, 0x3c, 0x7b, + 0x54, 0xfc, 0x70, 0xcf, + 0xa4, 0xa0, 0x9b, 0x75, 0x05, 0x4a, 0xe1, 0x54, 0xf5, 0x70, 0x70, 0xb1, + 0xfa, 0x43, 0x58, 0x42, + 0xf0, 0xb5, 0x4c, 0xca, 0x47, 0xc5, 0x7c, 0x09, 0xb6, 0x13, 0x2e, 0x38, + 0x49, 0x71, 0x71, 0xc7, + 0xc4, 0x3d, 0xdc, 0xe3, 0xe1, 0x5f, 0xc1, 0xad, 0x11, 0x27, 0x70, 0x4a, + 0x6e, 0x54, 0x41, 0x38, + 0xa8, 0x43, 0x2c, 0x46, 0x0e, 0xf2, 0x77, 0x73, 0xd5, 0x1b, 0xb8, 0x8d, + 0x46, 0x04, 0x75, 0x47, + 0x1f, 0x04, 0x27, 0x04, 0xab, 0xb8, 0xf1, 0xb2, 0x13, 0xce, 0x90, 0xc6, + 0x43, 0x97, 0x58, 0x04, + 0x2f, 0x20, 0xf8, 0xd3, 0x13, 0x69, 0xe6, 0x9a, 0x23, 0x4d, 0x5c, 0x2c, + 0xd2, 0xc0, 0xb5, 0xc4, + 0x5a, 0x40, 0x6b, 0xa4, 0x05, 0xc6, 0xc3, 0x0d, 0xa8, 0x21, 0xd2, 0xc2, + 0xb7, 0x85, 0x9a, 0xf9, + 0x26, 0xa3, 0x8d, 0x5c, 0x5b, 0x0b, 0x6c, 0xd6, 0x09, 0xdf, 0x25, 0x98, + 0x15, 0x0e, 0x6e, 0x83, + 0x9b, 0x1b, 0xe6, 0x33, 0x15, 0xc1, 0xf1, 0x5c, 0x95, 0xe8, 0x26, 0x58, + 0x55, 0x81, 0x4a, 0xf8, + 0x7c, 0x3c, 0x45, 0xba, 0x16, 0xd3, 0x3e, 0xb6, 0x06, 0xbb, 0x70, 0x6f, + 0xb0, 0x1d, 0xb7, 0x19, + 0xcd, 0xa0, 0xd3, 0xe8, 0x84, 0x2d, 0xa4, 0x3f, 0xf1, 0x60, 0x9c, 0xf4, + 0xb1, 0x93, 0xf0, 0xdd, + 0x4e, 0xc2, 0xfd, 0xda, 0x50, 0x7b, 0xb0, 0x15, 0xb6, 0x84, 0x9a, 0x61, + 0x53, 0xb0, 0x99, 0x7c, + 0x77, 0x33, 0x59, 0x67, 0xda, 0x71, 0xc4, 0x78, 0x0c, 0xfd, 0x5c, 0x75, + 0xc2, 0x42, 0xd1, 0xc9, + 0x57, 0x8a, 0x65, 0xd4, 0x47, 0x4e, 0xf0, 0x3d, 0x1f, 0x1d, 0x23, 0x5e, + 0x88, 0x82, 0x46, 0x1b, + 0x17, 0xd1, 0x5a, 0xb9, 0x57, 0x5b, 0x6e, 0x64, 0x66, 0xb6, 0x2d, 0xf4, + 0xcc, 0x08, 0x4f, 0xe0, + 0x5c, 0xa4, 0x9f, 0x55, 0x92, 0x1d, 0x2e, 0x54, 0xce, 0x27, 0xb6, 0x6b, + 0x2f, 0x68, 0x32, 0x62, + 0x20, 0x1e, 0x6a, 0x00, 0x8d, 0xa1, 0x08, 0x88, 0x84, 0xa2, 0x20, 0x1a, + 0x0c, 0x12, 0xdc, 0x24, + 0xf6, 0xae, 0xda, 0x40, 0x30, 0xbd, 0x01, 0xa8, 0xba, 0x0a, 0x02, 0xba, + 0x08, 0x14, 0x43, 0x06, + 0x42, 0x50, 0x04, 0xbc, 0x81, 0x00, 0x36, 0x08, 0xe6, 0x19, 0x0c, 0xc7, + 0x19, 0x7e, 0xce, 0x4f, + 0xb8, 0x1f, 0xa3, 0x13, 0x2c, 0x24, 0xf8, 0x77, 0xa7, 0x66, 0xc0, 0x47, + 0xd0, 0x05, 0x23, 0xec, + 0x11, 0xea, 0xd7, 0xc8, 0x5a, 0xeb, 0x49, 0x2c, 0x02, 0x74, 0x3f, 0x92, + 0xaa, 0xd6, 0x05, 0x77, + 0x9e, 0xf3, 0xf3, 0x9f, 0x5c, 0x9a, 0x8c, 0x79, 0xfd, 0x4d, 0xdc, 0xbb, + 0xf2, 0xcc, 0x95, 0x4f, + 0x4d, 0xbf, 0xd2, 0x8c, 0xf3, 0xa5, 0x7e, 0x93, 0xfe, 0xbc, 0x26, 0x9a, + 0x87, 0xdc, 0xe8, 0x34, + 0xeb, 0x3a, 0x99, 0x71, 0xd6, 0x7d, 0x35, 0xd4, 0x1d, 0x09, 0xbb, 0x12, + 0xa4, 0xcf, 0x37, 0xb1, + 0x50, 0x97, 0xbd, 0x7f, 0x1f, 0xd6, 0xec, 0x31, 0x28, 0x60, 0xec, 0x75, + 0x5a, 0xe8, 0x1e, 0xe7, + 0xc4, 0xde, 0x57, 0x89, 0xbd, 0x1f, 0x4c, 0xc2, 0x3f, 0x99, 0xf0, 0xa3, + 0x60, 0x21, 0x9b, 0x5d, + 0x63, 0x73, 0xd7, 0x3b, 0x23, 0xc5, 0xde, 0xf4, 0xf5, 0x5c, 0x12, 0x7e, + 0x13, 0x5a, 0x73, 0x33, + 0x67, 0x75, 0xbe, 0x62, 0xd6, 0xf6, 0xdf, 0xb3, 0xb4, 0x37, 0x2d, 0x8d, + 0xcb, 0xe9, 0xb7, 0xa5, + 0xd3, 0xe6, 0x9b, 0x10, 0xfb, 0xb8, 0xc9, 0xcc, 0x37, 0xf1, 0x64, 0xcc, + 0x37, 0xb1, 0x58, 0xab, + 0x7e, 0x78, 0x7c, 0x00, 0xd5, 0xff, 0x76, 0x86, 0x36, 0xa1, 0x6d, 0xd1, + 0x6d, 0xe8, 0xbe, 0xf0, + 0x56, 0x78, 0x1f, 0xc1, 0xc1, 0x7b, 0xa2, 0xf7, 0xf2, 0xf7, 0x47, 0x3f, + 0x83, 0x6b, 0x94, 0x71, + 0x68, 0x22, 0xef, 0xc6, 0x95, 0xa2, 0x5b, 0x9c, 0xac, 0xcc, 0xc3, 0xc7, + 0x36, 0x9c, 0x0c, 0x8e, + 0x53, 0x6e, 0x82, 0x8f, 0x06, 0x3b, 0x84, 0x5e, 0x63, 0x23, 0xe1, 0x64, + 0x77, 0xf3, 0xf7, 0xe9, + 0xdb, 0x84, 0xad, 0xc6, 0xdd, 0xfc, 0xd6, 0x50, 0x1b, 0xbe, 0x3b, 0xfc, + 0x33, 0xfc, 0x7a, 0x74, + 0x2f, 0xb7, 0x2f, 0xfe, 0xb6, 0x7f, 0x5f, 0xe3, 0x6b, 0xcc, 0xfe, 0xd8, + 0x87, 0xcc, 0xaf, 0x83, + 0x9f, 0xb0, 0x9f, 0x69, 0xbf, 0xe3, 0x7a, 0xc2, 0x22, 0xd8, 0x16, 0xbe, + 0x07, 0x34, 0x47, 0xaf, + 0xc0, 0xe5, 0xc6, 0x64, 0x6e, 0xbc, 0x52, 0x05, 0xc7, 0x6b, 0x74, 0x5e, + 0xda, 0xf9, 0xc3, 0x55, + 0x3b, 0x77, 0x89, 0xf6, 0x14, 0xec, 0x0d, 0xf6, 0xc0, 0x8d, 0xc6, 0x46, + 0xb8, 0xd9, 0xa0, 0xba, + 0x61, 0x2f, 0xec, 0x25, 0xd8, 0xd9, 0x11, 0xea, 0x80, 0xed, 0x46, 0x37, + 0xea, 0x0c, 0x77, 0xc2, + 0xee, 0x50, 0x2f, 0x78, 0x44, 0x7b, 0x0c, 0xf6, 0x18, 0x1d, 0xa8, 0x87, + 0xbe, 0x47, 0xf0, 0xaf, + 0xd3, 0xe8, 0x02, 0x6f, 0x87, 0x20, 0x9c, 0xd9, 0x70, 0x84, 0xef, 0xb0, + 0xd0, 0x04, 0x9f, 0x8b, + 0xd8, 0xb0, 0x4e, 0xb1, 0x04, 0x4d, 0x57, 0x5d, 0xa0, 0x56, 0x7f, 0x09, + 0xae, 0x50, 0x67, 0x22, + 0xc2, 0x5e, 0x09, 0xb7, 0x2b, 0x86, 0xd5, 0xea, 0x3c, 0x74, 0x4a, 0xf0, + 0x2c, 0x6e, 0x5e, 0x30, + 0x1f, 0x14, 0x87, 0x57, 0xc2, 0x58, 0x64, 0x32, 0xb0, 0x8b, 0x65, 0xa8, + 0x54, 0xa0, 0xbe, 0xd7, + 0x62, 0xc2, 0x13, 0x1d, 0xf0, 0x18, 0x6d, 0x39, 0xb7, 0x39, 0x14, 0x47, + 0x9b, 0x23, 0x3b, 0xc0, + 0xb1, 0x7a, 0x19, 0xe7, 0x0e, 0x54, 0xe3, 0x69, 0x82, 0x13, 0x55, 0x88, + 0xe5, 0xf0, 0xdc, 0x20, + 0xe0, 0x7a, 0x43, 0x31, 0x62, 0xc7, 0x47, 0x51, 0x28, 0x14, 0xc2, 0x91, + 0x48, 0x0c, 0x46, 0x43, + 0x06, 0x0c, 0x87, 0xc2, 0x84, 0xe7, 0x05, 0xc9, 0x7b, 0x51, 0x1c, 0x09, + 0x6b, 0xb0, 0x21, 0xbc, + 0x19, 0x6e, 0xd5, 0x08, 0x3e, 0x53, 0x8e, 0x6a, 0xec, 0x00, 0xdb, 0xc3, + 0x53, 0xfc, 0x0e, 0xc5, + 0x0d, 0xdd, 0x92, 0x93, 0x2f, 0x25, 0x58, 0x55, 0xce, 0x3b, 0xb0, 0x53, + 0xbc, 0x84, 0xe0, 0x18, + 0xe5, 0x7d, 0x84, 0xc3, 0xea, 0xc4, 0xbe, 0x25, 0x36, 0x6e, 0xd0, 0x30, + 0x50, 0x84, 0x70, 0x47, + 0x72, 0xc4, 0x21, 0x23, 0x8e, 0xe3, 0x41, 0xf2, 0x7d, 0xa1, 0x08, 0x8a, + 0x05, 0x09, 0x56, 0x19, + 0x4d, 0xa0, 0x21, 0x18, 0x07, 0x71, 0xad, 0x8b, 0xe0, 0x62, 0x17, 0xf9, + 0xdc, 0xe3, 0xf0, 0x25, + 0xd2, 0x47, 0xbb, 0x58, 0x49, 0xbe, 0xb3, 0x98, 0xe0, 0x5f, 0x31, 0xf9, + 0xd6, 0x71, 0xf8, 0x38, + 0xe9, 0x12, 0x64, 0x04, 0xbb, 0x60, 0x93, 0xd1, 0xc2, 0xbd, 0xd0, 0x74, + 0xad, 0xdf, 0x15, 0x99, + 0xc2, 0x4d, 0x50, 0xaa, 0x71, 0xb5, 0xe4, 0x42, 0xe5, 0x62, 0x01, 0x58, + 0x28, 0x9f, 0x85, 0xd6, + 0x69, 0x51, 0x20, 0x1b, 0x0a, 0x90, 0x83, 0x12, 0x10, 0x83, 0x02, 0xc1, + 0x36, 0x72, 0x34, 0x24, + 0x4e, 0x30, 0x78, 0x4e, 0xd2, 0x34, 0x20, 0xab, 0x3c, 0xf9, 0x3d, 0x40, + 0x70, 0x8f, 0x70, 0xc2, + 0x20, 0x07, 0x90, 0xc1, 0x12, 0xdc, 0x13, 0xc8, 0xd1, 0xcf, 0xb1, 0x06, + 0xc7, 0x31, 0x86, 0x97, + 0xb4, 0x3a, 0xe0, 0xd1, 0xeb, 0x41, 0x8d, 0x5e, 0x0b, 0xee, 0x20, 0x1c, + 0x71, 0x1b, 0xba, 0x70, + 0x04, 0x07, 0xa0, 0xfa, 0x5d, 0xc6, 0xd8, 0x0c, 0xb1, 0x18, 0xcc, 0xbc, + 0x67, 0xf1, 0x2d, 0x57, + 0xbe, 0x4e, 0x6c, 0xdc, 0xe1, 0xb8, 0xf7, 0x06, 0x73, 0x5a, 0xef, 0x03, + 0xcf, 0x5e, 0xfb, 0x81, + 0xfe, 0x9d, 0xe7, 0xde, 0x17, 0x57, 0x5e, 0xb4, 0xf2, 0x85, 0x45, 0x17, + 0x0f, 0xe7, 0x30, 0x66, + 0xbe, 0x49, 0x52, 0x6d, 0xab, 0xfe, 0xbd, 0xe2, 0xcc, 0xfd, 0x83, 0x33, + 0xec, 0x6f, 0x92, 0xeb, + 0x9a, 0x56, 0x39, 0xa9, 0xd3, 0xc2, 0xe7, 0xa1, 0xe4, 0xdc, 0x37, 0xbb, + 0x51, 0xc0, 0x66, 0xaf, + 0x99, 0x3d, 0xa8, 0xeb, 0x99, 0xfa, 0x9a, 0x3a, 0xb2, 0x9e, 0x0b, 0xad, + 0x19, 0x4f, 0xf1, 0xb0, + 0x34, 0x43, 0x3d, 0x97, 0x31, 0xe8, 0x7a, 0x07, 0x75, 0x4c, 0x86, 0xd6, + 0xc1, 0x77, 0xd5, 0x0e, + 0xdf, 0xdf, 0x20, 0x65, 0xbe, 0x49, 0x9f, 0xae, 0x37, 0xda, 0x1c, 0x97, + 0x7e, 0xfc, 0x7b, 0x28, + 0x7a, 0x1f, 0xda, 0x4a, 0xec, 0xcf, 0xed, 0xb1, 0xed, 0x78, 0x7b, 0xec, + 0x3e, 0xfc, 0x60, 0xf4, + 0x53, 0x6e, 0x43, 0x60, 0x1c, 0xac, 0x92, 0xaa, 0x88, 0xdd, 0x34, 0x5b, + 0x38, 0x26, 0x7a, 0x0c, + 0x3e, 0xba, 0x61, 0x21, 0x37, 0x57, 0xbb, 0x05, 0x3c, 0x11, 0xdd, 0x22, + 0x6c, 0x0d, 0x91, 0xa6, + 0xdf, 0x23, 0xdc, 0xab, 0xdf, 0xcf, 0x3f, 0x68, 0x6c, 0xc2, 0xdd, 0xfa, + 0x5b, 0xe8, 0x6b, 0x7d, + 0x07, 0xb8, 0xa1, 0xe1, 0x62, 0xe6, 0xe2, 0xe8, 0x0f, 0xd9, 0x8b, 0xf5, + 0xf3, 0xd1, 0x05, 0xea, + 0x25, 0xf0, 0x32, 0xe5, 0x12, 0x7c, 0xa6, 0x52, 0x83, 0xcf, 0x08, 0x2d, + 0x87, 0x4f, 0x45, 0xb6, + 0xb1, 0xdb, 0xe2, 0xd7, 0x40, 0x9b, 0x5e, 0xcd, 0x56, 0x6b, 0xd5, 0xb8, + 0x4a, 0xae, 0xc4, 0xa5, + 0xb0, 0x80, 0x9f, 0xaa, 0x5f, 0xcd, 0x86, 0xe3, 0x4f, 0x82, 0x17, 0xe2, + 0x7b, 0xb9, 0x37, 0x62, + 0xef, 0x82, 0x0f, 0xe3, 0xef, 0x83, 0x77, 0xe3, 0xef, 0xb1, 0x1f, 0x46, + 0x3f, 0xe3, 0xbe, 0x30, + 0x7e, 0xcb, 0x7d, 0x1e, 0xfe, 0x88, 0xfd, 0x65, 0xc3, 0x5e, 0xf6, 0xfd, + 0xf0, 0x1b, 0x5c, 0xa3, + 0xc2, 0xc3, 0xae, 0xe0, 0x66, 0xd4, 0x1d, 0xec, 0xc5, 0x9b, 0x82, 0x1d, + 0xb8, 0x57, 0xdf, 0x04, + 0x5e, 0x23, 0x58, 0x56, 0x15, 0x99, 0xe5, 0x99, 0x4c, 0x39, 0xa5, 0x4c, + 0xf0, 0x9a, 0xd8, 0xbc, + 0x93, 0xd5, 0xf1, 0x60, 0xb9, 0xf1, 0x08, 0x7c, 0x58, 0x8f, 0xe2, 0xab, + 0xd4, 0xf9, 0xd0, 0xa9, + 0x2d, 0x00, 0xc7, 0x46, 0x4e, 0x03, 0xa7, 0x47, 0x8f, 0x64, 0x27, 0xa9, + 0x13, 0x89, 0xbd, 0x9b, + 0x87, 0xa6, 0x2b, 0x13, 0xa1, 0x43, 0x28, 0x41, 0x0e, 0xa1, 0x18, 0xdb, + 0x79, 0x3b, 0x76, 0x04, + 0x4a, 0xc0, 0x62, 0x6d, 0x35, 0xd8, 0x4a, 0xb8, 0xd6, 0xf6, 0xe0, 0xe3, + 0x60, 0xbe, 0x5e, 0x06, + 0x5c, 0x01, 0x27, 0x9e, 0xc2, 0xbb, 0x61, 0xb1, 0x58, 0x01, 0xae, 0x0c, + 0x75, 0x30, 0xaf, 0xc6, + 0x5f, 0xf0, 0xbf, 0x1c, 0xdb, 0xe3, 0x7f, 0x33, 0xfe, 0x8e, 0xff, 0xcd, + 0x86, 0xd7, 0x99, 0xdd, + 0x91, 0x37, 0x99, 0x77, 0x23, 0xbf, 0x64, 0xdf, 0x8a, 0xee, 0x65, 0xdf, + 0x08, 0xbd, 0x01, 0xf6, + 0x6b, 0x1f, 0xc3, 0xdd, 0x4a, 0x0c, 0xf9, 0xf4, 0x38, 0x6c, 0xd3, 0xa9, + 0x1d, 0xff, 0x14, 0x7c, + 0x3a, 0x38, 0x09, 0x14, 0x8b, 0x95, 0xb8, 0x4c, 0x28, 0xe1, 0xcb, 0xc4, + 0x72, 0x5c, 0x4e, 0xce, + 0xe7, 0x12, 0x6f, 0xc7, 0x2f, 0x1b, 0x4f, 0x83, 0x67, 0x8c, 0xe7, 0xc0, + 0x8b, 0xc1, 0xd7, 0xc0, + 0xab, 0x06, 0xfd, 0xdb, 0x3d, 0x60, 0xb7, 0xf6, 0x2a, 0xd8, 0xa5, 0xef, + 0x01, 0xaf, 0xe9, 0x2f, + 0xc3, 0x9d, 0xda, 0x4e, 0xb8, 0x4b, 0x7b, 0x05, 0xbc, 0xa8, 0xbc, 0x0c, + 0x5e, 0x95, 0x5f, 0x01, + 0xcf, 0xe9, 0xcf, 0x80, 0x67, 0xb5, 0x5e, 0xd4, 0xaa, 0x77, 0xa1, 0x78, + 0xf0, 0x71, 0xb8, 0x4b, + 0x9d, 0x00, 0x0b, 0x08, 0x9e, 0x96, 0x09, 0x0e, 0x72, 0xfd, 0x25, 0xc4, + 0xc2, 0x1f, 0x87, 0x4f, + 0x08, 0x9c, 0x8f, 0x83, 0xa1, 0x1e, 0xbe, 0x25, 0xd4, 0x02, 0x1e, 0x8d, + 0x5d, 0xed, 0xb7, 0x6b, + 0xd5, 0x68, 0x82, 0x5c, 0x8d, 0x5d, 0x52, 0x19, 0x2a, 0x13, 0x0a, 0xd0, + 0x7c, 0xf9, 0x54, 0xe4, + 0xd5, 0xdb, 0x60, 0x8b, 0xde, 0x0d, 0xba, 0xb4, 0x0e, 0xd0, 0xae, 0x12, + 0x3b, 0x5e, 0xed, 0x20, + 0xaf, 0xbb, 0x40, 0x1b, 0xe5, 0x99, 0x7a, 0x0b, 0x68, 0x51, 0x5b, 0x40, + 0x8f, 0xda, 0x05, 0x5a, + 0xd5, 0x26, 0x10, 0x53, 0x09, 0x37, 0x54, 0x82, 0xa0, 0x45, 0x09, 0x00, + 0x0f, 0xe1, 0x7e, 0xac, + 0xe1, 0xe3, 0x6a, 0xf5, 0x7a, 0xae, 0x4e, 0xf7, 0x80, 0x3a, 0x7d, 0x3d, + 0xd8, 0xa0, 0xaf, 0x83, + 0x2b, 0x89, 0x6d, 0xdc, 0x83, 0xce, 0x1e, 0xe1, 0x4f, 0xa4, 0x71, 0x2c, + 0xa9, 0xd6, 0xea, 0x3c, + 0x63, 0x4a, 0xfd, 0xd1, 0x0f, 0x9c, 0xb7, 0xe4, 0xba, 0x37, 0x56, 0x9e, + 0x36, 0x1c, 0xf7, 0xd6, + 0xef, 0x0c, 0x9e, 0xb7, 0x63, 0xd3, 0xfe, 0x5b, 0xbf, 0x12, 0xbe, 0x03, + 0x66, 0xa6, 0xa5, 0xfa, + 0x39, 0x63, 0xfe, 0xdb, 0x53, 0xd3, 0xae, 0xcc, 0x60, 0xdb, 0x24, 0xf6, + 0x23, 0x24, 0x36, 0x65, + 0xc2, 0xcf, 0x9a, 0xaa, 0x9e, 0xcb, 0x60, 0x9d, 0xae, 0x44, 0x5d, 0xf6, + 0x82, 0x31, 0xd5, 0x65, + 0xcf, 0x50, 0xd3, 0xea, 0xc0, 0xeb, 0xb4, 0x0c, 0xd8, 0xa2, 0x36, 0xc2, + 0x6f, 0xf3, 0xb9, 0x31, + 0xea, 0xfd, 0x43, 0xf7, 0x99, 0xec, 0x8f, 0x41, 0xc9, 0x50, 0xcf, 0x65, + 0x00, 0x17, 0x22, 0x85, + 0x87, 0x76, 0x4c, 0x22, 0xd9, 0xc7, 0x24, 0x4f, 0xb2, 0x71, 0xe6, 0xfe, + 0x76, 0xb1, 0xf2, 0xf4, + 0xfb, 0x07, 0x53, 0x5c, 0xd7, 0x2c, 0xe6, 0xfd, 0x44, 0x86, 0xd6, 0xae, + 0xa1, 0xf6, 0xef, 0xae, + 0xd0, 0x46, 0xf4, 0x50, 0xe4, 0x01, 0x74, 0x5f, 0xe4, 0x61, 0xf4, 0x60, + 0x6c, 0x3b, 0x7c, 0x28, + 0xba, 0x1d, 0x3d, 0x14, 0x7f, 0x87, 0x5b, 0x29, 0x8f, 0x83, 0x13, 0x02, + 0x33, 0xf9, 0x23, 0x42, + 0x8b, 0xd0, 0x09, 0x0d, 0x0b, 0xc1, 0x4c, 0x63, 0x12, 0x5c, 0x64, 0xd4, + 0xe3, 0x67, 0xe2, 0xdb, + 0xf9, 0x7b, 0x23, 0xf7, 0xf3, 0xf7, 0x1a, 0x0f, 0xf0, 0x8f, 0x84, 0xef, + 0x15, 0x7a, 0x8c, 0x67, + 0xd1, 0x37, 0xca, 0xaf, 0xa1, 0xa7, 0x75, 0x36, 0x63, 0x8f, 0x14, 0xb0, + 0x79, 0xf2, 0xb0, 0xe7, + 0x34, 0x30, 0x87, 0xfc, 0x6d, 0x1d, 0xfb, 0x5c, 0xf4, 0x7e, 0xee, 0xde, + 0xf8, 0x55, 0x5c, 0xa1, + 0x56, 0x05, 0x5c, 0x4a, 0x25, 0x5f, 0x21, 0x94, 0x09, 0xc5, 0x82, 0x8d, + 0x2f, 0x0b, 0x9c, 0x0f, + 0x2f, 0x0a, 0x9e, 0x8c, 0x7e, 0x10, 0xff, 0x09, 0x77, 0x6d, 0xe3, 0xd5, + 0xdc, 0x0f, 0x63, 0x97, + 0x82, 0x4b, 0x42, 0x17, 0xc3, 0x4b, 0x8d, 0xcb, 0xc1, 0x55, 0xf2, 0xe5, + 0xf0, 0x32, 0xed, 0x02, + 0x70, 0x61, 0xe4, 0x16, 0xee, 0x4a, 0xf5, 0x58, 0x70, 0x89, 0x16, 0x84, + 0xf7, 0x05, 0xef, 0x81, + 0x9b, 0x83, 0x5b, 0x09, 0x4f, 0xdc, 0x44, 0x38, 0x61, 0x27, 0xf8, 0x5b, + 0x10, 0xc0, 0x42, 0x63, + 0x12, 0x3b, 0x49, 0xae, 0x86, 0x2e, 0xa5, 0x02, 0x97, 0x4b, 0xc5, 0x04, + 0xff, 0x26, 0x72, 0x2b, + 0x83, 0x0f, 0x81, 0xa6, 0xd0, 0x3d, 0xe8, 0x61, 0xc3, 0x80, 0x3f, 0x32, + 0xa6, 0xc2, 0x73, 0x43, + 0xa7, 0x83, 0xe9, 0xc6, 0x74, 0x38, 0x49, 0x99, 0x40, 0xf0, 0x80, 0xa0, + 0x05, 0xc1, 0xa1, 0x12, + 0x91, 0xf0, 0x26, 0xbe, 0x18, 0x97, 0xf2, 0x25, 0xc8, 0x46, 0x70, 0xe4, + 0x27, 0x11, 0xc8, 0x6e, + 0x0e, 0xb5, 0xa1, 0x47, 0x42, 0x4f, 0x82, 0x59, 0x5a, 0x19, 0x8d, 0xc3, + 0xe1, 0x0f, 0x13, 0xdc, + 0xc8, 0x81, 0x6d, 0x78, 0x89, 0x2c, 0xb1, 0x5c, 0x54, 0xf3, 0x86, 0x5b, + 0xe2, 0xde, 0x48, 0xa3, + 0xee, 0x95, 0xa2, 0x12, 0x1b, 0x88, 0xc5, 0x7d, 0xf1, 0x78, 0xd4, 0x17, + 0x8d, 0x12, 0x92, 0x64, + 0xd4, 0x82, 0x06, 0x85, 0x83, 0x67, 0x4b, 0xd7, 0x21, 0xcd, 0xd8, 0x44, + 0xb8, 0xe9, 0x46, 0xd4, + 0x15, 0xdc, 0x0e, 0x1f, 0x31, 0xa6, 0xc1, 0x42, 0xaa, 0x3f, 0x0a, 0x76, + 0x5c, 0x2a, 0x97, 0x9b, + 0x38, 0x34, 0x3b, 0x00, 0x71, 0x50, 0x6f, 0x63, 0x7b, 0xe2, 0xdd, 0x5c, + 0x4f, 0x88, 0xf4, 0x43, + 0xdd, 0xc4, 0x3d, 0x14, 0x7e, 0x98, 0x79, 0x3c, 0xfa, 0x38, 0xb3, 0x23, + 0xf2, 0x28, 0xfb, 0x60, + 0x70, 0x3b, 0xd8, 0xa1, 0xed, 0x00, 0x8f, 0x92, 0xb6, 0x43, 0x79, 0x12, + 0x3d, 0x29, 0x3f, 0x82, + 0xb6, 0xa8, 0x0f, 0xa3, 0x5a, 0x75, 0x15, 0x7c, 0x30, 0xb8, 0x11, 0xb5, + 0x05, 0x7f, 0x06, 0x5f, + 0x50, 0xa8, 0xfd, 0x5b, 0x8a, 0x4b, 0xcc, 0xef, 0x76, 0x90, 0x3e, 0x8c, + 0xc3, 0x67, 0xca, 0xd7, + 0xf1, 0x6a, 0xb8, 0x07, 0x35, 0x12, 0xfc, 0x7b, 0x2e, 0x7c, 0x19, 0x28, + 0x94, 0xaa, 0x91, 0x4b, + 0xac, 0x24, 0x1c, 0xb7, 0x14, 0x95, 0x91, 0x7b, 0x31, 0x3b, 0x50, 0x8b, + 0x9a, 0xb5, 0x1d, 0xf0, + 0xf9, 0xc0, 0x4b, 0xf0, 0x05, 0xf9, 0x25, 0x6e, 0xa7, 0xf4, 0x12, 0x78, + 0x56, 0x7d, 0x86, 0x7b, + 0x46, 0x7d, 0x96, 0x7d, 0x3c, 0xf8, 0xa0, 0xff, 0x11, 0xfd, 0x31, 0xee, + 0x19, 0xf9, 0x67, 0xec, + 0xb3, 0xe2, 0x73, 0xec, 0x73, 0xc2, 0xd3, 0xec, 0x63, 0xf2, 0x0e, 0x70, + 0x7f, 0x60, 0x07, 0xf0, + 0x04, 0xae, 0x87, 0x98, 0xd8, 0xba, 0x5e, 0x82, 0x7b, 0xb5, 0xfa, 0x06, + 0x6e, 0xbd, 0xbe, 0x01, + 0xac, 0xd3, 0xd6, 0x82, 0xd5, 0xda, 0x5d, 0xe0, 0x36, 0x95, 0x81, 0xcd, + 0xe8, 0xdc, 0x11, 0x76, + 0xa1, 0x43, 0xb7, 0x8d, 0xb4, 0x93, 0xe2, 0x47, 0xae, 0x4f, 0x69, 0xe3, + 0x3e, 0xd7, 0x7b, 0xe9, + 0x2b, 0xad, 0x9f, 0xdf, 0x35, 0xa2, 0x2e, 0xeb, 0x26, 0x71, 0x19, 0xfd, + 0xf7, 0x73, 0x37, 0x95, + 0x2c, 0xcf, 0x6a, 0x4b, 0x2b, 0xa5, 0x1c, 0xdd, 0x47, 0x36, 0x63, 0x3d, + 0x17, 0x5a, 0x07, 0x9f, + 0xee, 0x71, 0x16, 0x2c, 0xf4, 0x65, 0xac, 0x11, 0x9c, 0xcb, 0xfd, 0x99, + 0xad, 0xd6, 0x69, 0x19, + 0xb0, 0xcf, 0xed, 0x9c, 0x5d, 0xcb, 0xe3, 0xac, 0xe8, 0xfd, 0x99, 0x75, + 0xbd, 0x3c, 0x33, 0xb7, + 0xb0, 0xaa, 0xa9, 0xa2, 0x36, 0xd3, 0xfe, 0xc1, 0xd4, 0x6f, 0x62, 0xea, + 0x7a, 0x59, 0x63, 0x64, + 0x72, 0xbd, 0x37, 0x6d, 0x55, 0x7d, 0xf6, 0xbd, 0xe6, 0x0a, 0xfa, 0x6b, + 0xd5, 0x83, 0xb4, 0xf5, + 0x5c, 0xe8, 0xbe, 0x35, 0xb1, 0x8a, 0x7a, 0x1a, 0x23, 0x98, 0x39, 0xdf, + 0xa4, 0x4f, 0xd3, 0x48, + 0xb2, 0xdf, 0x29, 0xff, 0xdb, 0x43, 0x30, 0x62, 0x47, 0xe4, 0x09, 0xf8, + 0x58, 0xf4, 0x31, 0xf4, + 0x48, 0xec, 0x21, 0xb8, 0x23, 0xb2, 0x03, 0x3d, 0x12, 0x7f, 0x07, 0x2e, + 0x0b, 0x15, 0xc1, 0x23, + 0x8c, 0x13, 0x84, 0x45, 0x0d, 0x47, 0x83, 0xf9, 0xd1, 0x99, 0xdc, 0x54, + 0xb9, 0x0a, 0x9d, 0x68, + 0x20, 0xf1, 0xc5, 0xf0, 0x43, 0xf8, 0xde, 0xd0, 0xfd, 0x78, 0x7b, 0xf0, + 0x21, 0x74, 0x5f, 0xf0, + 0x17, 0xf8, 0x77, 0xf2, 0x9f, 0x40, 0x47, 0xd3, 0x02, 0xa6, 0xb8, 0x6d, + 0xa2, 0x7f, 0x62, 0x80, + 0xe6, 0x6d, 0x10, 0x8e, 0x23, 0x56, 0xa0, 0x4a, 0x89, 0xf0, 0x3b, 0xb9, + 0x12, 0x4d, 0x0a, 0x5d, + 0xc6, 0x2c, 0xd2, 0x3c, 0xcc, 0xf3, 0xb1, 0xfb, 0xc0, 0xc3, 0xb1, 0xab, + 0xd8, 0x42, 0xa5, 0x8a, + 0x77, 0x4a, 0x15, 0x64, 0xbe, 0x96, 0xe1, 0x52, 0xa9, 0x04, 0x3b, 0x4c, + 0xfb, 0xbd, 0x0c, 0x55, + 0x07, 0x5d, 0x5c, 0x69, 0xb0, 0x08, 0xe4, 0x49, 0xe3, 0x60, 0x52, 0x3e, + 0x9b, 0xe9, 0x0f, 0x9b, + 0xaa, 0x1f, 0x81, 0x8e, 0x94, 0x6b, 0xd0, 0x53, 0xc6, 0x13, 0x14, 0xf7, + 0xc0, 0x66, 0x63, 0x0b, + 0xd8, 0x6a, 0x6c, 0x03, 0xbd, 0xe1, 0x36, 0xf0, 0x27, 0xa3, 0x06, 0xe4, + 0x11, 0x2e, 0x57, 0x6d, + 0x6a, 0x7d, 0xa5, 0xe4, 0xfc, 0xc5, 0x68, 0x92, 0x3a, 0x89, 0xbb, 0x23, + 0xb8, 0x83, 0xeb, 0x26, + 0x36, 0x74, 0xa7, 0xf1, 0x30, 0x7a, 0x52, 0xbf, 0x01, 0x9d, 0xa8, 0x5f, + 0x81, 0xe6, 0x12, 0xce, + 0x59, 0x16, 0xa0, 0x91, 0x8c, 0x04, 0x33, 0xa4, 0x62, 0xc2, 0x9a, 0x4a, + 0x88, 0xdd, 0xe8, 0x20, + 0x18, 0x52, 0x8c, 0x1d, 0xa2, 0x13, 0x5f, 0xd7, 0x80, 0xfd, 0xbd, 0xa1, + 0x4e, 0xf4, 0x44, 0xe8, + 0x51, 0x30, 0x43, 0x75, 0x20, 0x07, 0xb1, 0xa5, 0x27, 0x09, 0x25, 0xb8, + 0x94, 0xb0, 0x2c, 0xc2, + 0x1d, 0x50, 0xa5, 0x3e, 0x85, 0x9b, 0x12, 0xae, 0x04, 0xf9, 0x14, 0xe3, + 0xe5, 0x7c, 0x68, 0x8b, + 0xd9, 0xd9, 0x42, 0x3d, 0x2f, 0x91, 0x13, 0x18, 0xc8, 0x47, 0x79, 0x6a, + 0x29, 0x5c, 0x61, 0x3c, + 0x00, 0x1f, 0x09, 0x6e, 0x84, 0xbd, 0x46, 0x2f, 0xda, 0x18, 0x7c, 0x00, + 0x6e, 0x53, 0xc7, 0xc3, + 0x7c, 0xde, 0xce, 0x17, 0xe1, 0xe2, 0x84, 0x4e, 0x07, 0x6d, 0xb8, 0x42, + 0x76, 0xf3, 0x93, 0x42, + 0x73, 0xb8, 0xc3, 0x22, 0x2e, 0x98, 0x27, 0x24, 0xe2, 0x08, 0xed, 0xd1, + 0x2a, 0xb6, 0x3a, 0x56, + 0xc1, 0x94, 0x04, 0x09, 0x4f, 0x09, 0x10, 0x6e, 0x2f, 0x8e, 0x43, 0x79, + 0x34, 0x9f, 0x50, 0x4a, + 0xe4, 0xd6, 0x8d, 0x23, 0xb8, 0x9e, 0xaf, 0x2e, 0x87, 0x8f, 0x13, 0xfc, + 0xeb, 0x08, 0x3e, 0x07, + 0x1f, 0x57, 0x4b, 0x60, 0x81, 0x40, 0x75, 0x3f, 0x7a, 0xfd, 0x25, 0xb8, + 0x84, 0x8c, 0xd7, 0x79, + 0xca, 0x06, 0xac, 0x45, 0x3a, 0x41, 0xa3, 0xd1, 0xcc, 0x3e, 0x13, 0x3a, + 0x17, 0xe5, 0x13, 0xdb, + 0xbd, 0x8c, 0x27, 0xfd, 0x30, 0xf5, 0x4f, 0x3b, 0xae, 0x14, 0x8f, 0xc5, + 0x0b, 0xa5, 0x05, 0xe8, + 0xa8, 0xc0, 0x22, 0x78, 0x66, 0xe8, 0x12, 0x70, 0x71, 0xf8, 0x34, 0xf6, + 0x38, 0x79, 0x3e, 0x9c, + 0xad, 0xcc, 0x41, 0x73, 0xd5, 0xf9, 0xe0, 0x08, 0x69, 0x01, 0x3e, 0x42, + 0x3c, 0x12, 0x2e, 0x90, + 0xe6, 0xc1, 0xf9, 0xe2, 0x42, 0xb8, 0x30, 0xb0, 0x10, 0xce, 0x0c, 0x9c, + 0x0a, 0xc7, 0x4b, 0x17, + 0x60, 0x95, 0xd8, 0xbb, 0x04, 0xfb, 0x08, 0xe7, 0x5b, 0x03, 0xd7, 0x6a, + 0xab, 0xe1, 0x6a, 0x6d, + 0x15, 0x58, 0xa9, 0xdd, 0x01, 0x6f, 0x54, 0x6b, 0x61, 0x08, 0x9d, 0x35, + 0x22, 0x9e, 0xc2, 0xa1, + 0x16, 0xfa, 0xc7, 0x09, 0x36, 0x50, 0xa5, 0x0e, 0xee, 0x25, 0x77, 0x0a, + 0xb5, 0x65, 0xfb, 0x71, + 0xef, 0xad, 0xf5, 0xa7, 0x34, 0x3f, 0xba, 0xe3, 0x1a, 0x6a, 0xe3, 0xa6, + 0xab, 0x4a, 0xfd, 0xec, + 0x73, 0x2b, 0x2f, 0x5d, 0xf9, 0xce, 0xed, 0x27, 0x4f, 0x8c, 0x39, 0xea, + 0xb2, 0xe5, 0x39, 0xd0, + 0xbd, 0x63, 0xe8, 0x1e, 0x3f, 0xd9, 0xea, 0xb9, 0xd0, 0x7a, 0xeb, 0xe6, + 0xfc, 0xcf, 0xb4, 0xbf, + 0x49, 0x9f, 0x86, 0x65, 0xa9, 0x7e, 0x53, 0xae, 0xea, 0xb4, 0x0c, 0xd4, + 0x79, 0xb5, 0xb3, 0x36, + 0x39, 0x8b, 0x3f, 0x45, 0xb4, 0x1a, 0xaf, 0xd7, 0xb7, 0x9f, 0x4e, 0xda, + 0xfd, 0x83, 0xfb, 0xfc, + 0x26, 0x0d, 0x89, 0x7d, 0xe5, 0x33, 0xe6, 0x9b, 0x58, 0xac, 0x55, 0x3f, + 0xda, 0xbd, 0x69, 0x47, + 0x5f, 0xbb, 0x66, 0x68, 0x3d, 0x97, 0x01, 0xbf, 0x49, 0xb6, 0x7c, 0x13, + 0x3c, 0x32, 0xc7, 0xc5, + 0x20, 0xcf, 0xd8, 0xde, 0xf0, 0xfd, 0xe8, 0xe9, 0xe8, 0x33, 0xe0, 0x99, + 0xe8, 0x53, 0xe8, 0xc9, + 0xd8, 0x93, 0xf0, 0x31, 0x82, 0x85, 0xcf, 0x44, 0x3e, 0x87, 0xfe, 0x86, + 0x29, 0xe0, 0x94, 0xa6, + 0x93, 0xc0, 0xc2, 0xd8, 0x0c, 0x34, 0x4d, 0x9b, 0x84, 0xaa, 0x03, 0x13, + 0xf1, 0x82, 0x10, 0xc0, + 0x2f, 0x07, 0x1f, 0x45, 0x8f, 0x87, 0x1f, 0x45, 0x0f, 0x46, 0x9f, 0x44, + 0x9f, 0xea, 0xbf, 0x64, + 0xb5, 0x8e, 0x33, 0x7d, 0x8e, 0xae, 0x32, 0x5f, 0xb5, 0x51, 0x86, 0x4a, + 0x78, 0x1b, 0xe1, 0x74, + 0x65, 0xa8, 0x54, 0x2c, 0x83, 0xa5, 0x92, 0x13, 0x4d, 0xd0, 0xe6, 0x72, + 0x73, 0x63, 0xa7, 0x72, + 0x97, 0x18, 0x22, 0xfb, 0xb3, 0xd8, 0xbd, 0xdc, 0xce, 0xd8, 0x0d, 0x4c, + 0x9e, 0xe8, 0x22, 0x36, + 0x20, 0xc1, 0x21, 0x8a, 0x2a, 0x7c, 0x19, 0x74, 0x69, 0xd3, 0xe1, 0xec, + 0xd0, 0x5c, 0x70, 0x58, + 0x70, 0x12, 0xb1, 0xb7, 0xcb, 0x91, 0x13, 0x11, 0x6c, 0xa4, 0xff, 0x26, + 0x96, 0x60, 0x9b, 0x3a, + 0x05, 0xcf, 0xd4, 0x8f, 0x45, 0x30, 0xd8, 0x8a, 0x9e, 0xd0, 0x9f, 0x47, + 0xdb, 0x09, 0x9f, 0xba, + 0x3f, 0x78, 0x1f, 0xdc, 0x4a, 0x38, 0xe0, 0x36, 0x82, 0x7f, 0x9b, 0x09, + 0x77, 0xda, 0x19, 0xba, + 0x05, 0xe4, 0x2b, 0xe3, 0xa1, 0x9b, 0x70, 0x3a, 0x87, 0xe8, 0x40, 0x25, + 0x82, 0x0d, 0x4f, 0xd4, + 0x4e, 0xe5, 0x58, 0xc2, 0xff, 0x7a, 0x08, 0xb7, 0xdd, 0xa2, 0x6f, 0x84, + 0x5b, 0xf5, 0x27, 0x51, + 0xb3, 0xae, 0xa2, 0xf5, 0xca, 0x99, 0x68, 0x92, 0xe4, 0xc0, 0x94, 0x37, + 0x15, 0x0b, 0x14, 0x17, + 0x1c, 0x26, 0x7e, 0x38, 0x08, 0x56, 0x4f, 0x35, 0x66, 0x82, 0x1f, 0xc4, + 0x18, 0xdf, 0x96, 0x60, + 0x17, 0x7c, 0xda, 0xf8, 0xff, 0xd8, 0xbb, 0xee, 0xf8, 0x28, 0xaa, 0xb5, + 0x9d, 0xde, 0x7b, 0xe8, + 0xbd, 0x49, 0xb5, 0x21, 0x22, 0x08, 0x16, 0x04, 0x45, 0xe5, 0xaa, 0xd8, + 0xaf, 0xf5, 0xb3, 0x8b, + 0x15, 0x90, 0x12, 0xb2, 0x3b, 0x73, 0xca, 0xec, 0xce, 0x4e, 0xd9, 0x96, + 0x46, 0x00, 0x11, 0x15, + 0x0b, 0x0a, 0xa8, 0x28, 0x48, 0x11, 0x08, 0xbd, 0x4b, 0xef, 0x24, 0x24, + 0x01, 0x42, 0x6f, 0xd2, + 0x44, 0xc5, 0x7b, 0x95, 0xef, 0x3d, 0xb3, 0xbb, 0x61, 0x93, 0x6c, 0x99, + 0x85, 0xd5, 0xeb, 0x1f, + 0xfc, 0xce, 0xef, 0xb0, 0x61, 0xb3, 0x75, 0x32, 0xef, 0x33, 0x6f, 0x7b, + 0x9e, 0x77, 0x3a, 0xaa, + 0x6f, 0x89, 0x23, 0xf1, 0xa6, 0x74, 0xd2, 0x04, 0x1e, 0x17, 0x67, 0x4a, + 0x11, 0x1a, 0x4b, 0x1d, + 0xd1, 0x8d, 0x05, 0xd7, 0xe1, 0xe6, 0xe0, 0x77, 0x25, 0xcb, 0x59, 0xa4, + 0x45, 0x7e, 0x3b, 0x63, + 0x73, 0x7b, 0x7d, 0xbe, 0xbe, 0x99, 0x69, 0x40, 0x75, 0xc3, 0x39, 0xf6, + 0xe1, 0x78, 0x28, 0x7c, + 0xbe, 0xa5, 0xf6, 0x29, 0x78, 0x92, 0x6d, 0x32, 0xf9, 0x1c, 0xfc, 0xbf, + 0x89, 0xf6, 0xc5, 0xb8, + 0x44, 0x4d, 0xc2, 0x11, 0x80, 0x7e, 0xf1, 0xe0, 0xa3, 0x25, 0x08, 0xb1, + 0xa6, 0x18, 0x31, 0x9b, + 0x76, 0xc9, 0xeb, 0x81, 0x6f, 0x2c, 0x6c, 0x43, 0x1a, 0x58, 0x12, 0x49, + 0xac, 0x29, 0x03, 0x35, + 0x72, 0xb4, 0xe4, 0x9a, 0xe7, 0xb7, 0xe0, 0x1a, 0xaa, 0x69, 0x7c, 0x82, + 0x39, 0x86, 0x44, 0x9b, + 0x62, 0x68, 0x0c, 0x7c, 0x8f, 0x18, 0x01, 0x6e, 0x49, 0x2c, 0x89, 0x01, + 0xff, 0x33, 0x5e, 0x48, + 0x26, 0x3d, 0x55, 0x91, 0x7c, 0xe3, 0x98, 0x88, 0x3f, 0xb2, 0x7f, 0x0b, + 0xf8, 0x9a, 0x42, 0x22, + 0x01, 0xd3, 0xe2, 0x01, 0x57, 0x21, 0x7a, 0x07, 0x2f, 0x36, 0x9a, 0x3c, + 0x68, 0x35, 0x20, 0x5b, + 0xde, 0x47, 0x68, 0xac, 0x6d, 0x34, 0x3f, 0xc9, 0x71, 0x2b, 0x89, 0x10, + 0x58, 0xed, 0x3b, 0x01, + 0x8e, 0x49, 0x3c, 0x89, 0x37, 0x27, 0x9b, 0xe2, 0x85, 0x08, 0x13, 0xd8, + 0x0e, 0xa9, 0x6f, 0x6f, + 0x81, 0xda, 0x16, 0x34, 0xe1, 0x52, 0xed, 0xb1, 0x3c, 0xe3, 0xbc, 0x45, + 0x9a, 0xa2, 0x68, 0x14, + 0x5c, 0x67, 0x5c, 0x57, 0xc9, 0x1a, 0x99, 0x1b, 0xf8, 0xa9, 0x09, 0x69, + 0x6a, 0xba, 0x97, 0x0a, + 0x0c, 0xfb, 0xc0, 0xe7, 0x1b, 0xac, 0xbe, 0x0b, 0xd8, 0xf7, 0x0e, 0x7e, + 0x5b, 0x79, 0x0d, 0xbf, + 0xaa, 0xbc, 0x82, 0x9f, 0x95, 0x87, 0x62, 0x33, 0xe9, 0x25, 0xd4, 0x38, + 0xbb, 0xed, 0x8d, 0x72, + 0xae, 0x9d, 0x76, 0xd7, 0x53, 0x4f, 0x6c, 0x18, 0x74, 0x1b, 0xeb, 0x5f, + 0x69, 0x97, 0x17, 0x31, + 0x2c, 0x42, 0x6d, 0x38, 0x4a, 0xc3, 0xbd, 0x1f, 0xed, 0x77, 0x4e, 0xf9, + 0x72, 0xc5, 0xf3, 0x27, + 0x2c, 0x17, 0xb9, 0x80, 0x9a, 0xfc, 0x96, 0x13, 0xdc, 0x50, 0x56, 0x07, + 0x9e, 0xdf, 0xfe, 0xc1, + 0x04, 0x6b, 0x82, 0x51, 0x8f, 0x3e, 0x74, 0x96, 0x3f, 0x7d, 0x7c, 0x2f, + 0x1d, 0xfc, 0xda, 0xb3, + 0x90, 0x99, 0xfd, 0x7b, 0xeb, 0xb9, 0x68, 0xdf, 0xd9, 0xa3, 0x69, 0x15, + 0x26, 0xfd, 0x65, 0x66, + 0x77, 0x41, 0x75, 0x5a, 0xdc, 0xc7, 0x3b, 0xc6, 0x1e, 0xcf, 0xc5, 0x5a, + 0x82, 0xf8, 0xba, 0x5a, + 0xbe, 0x3f, 0x2b, 0xe4, 0x7c, 0x7f, 0xdd, 0xfc, 0x5a, 0x2d, 0x6d, 0x2b, + 0x7f, 0xf9, 0x35, 0xef, + 0xbc, 0x5e, 0x18, 0x67, 0xd3, 0x5e, 0xf1, 0x0c, 0x4a, 0x77, 0xdd, 0x84, + 0xcd, 0x95, 0x0f, 0xce, + 0x37, 0x89, 0xaa, 0xe3, 0x33, 0xab, 0x70, 0x9e, 0x6d, 0x75, 0xce, 0xc0, + 0x73, 0xf3, 0xe7, 0xf3, + 0x8b, 0x0b, 0xe6, 0xe3, 0xf9, 0x05, 0x0b, 0xd0, 0xfc, 0xfc, 0x1f, 0xd0, + 0x0f, 0xb6, 0xd3, 0xfc, + 0xc7, 0xc5, 0x37, 0x70, 0x37, 0x17, 0xb7, 0x37, 0xb6, 0xb0, 0x35, 0xa6, + 0x59, 0x62, 0x7d, 0x53, + 0x96, 0x29, 0x96, 0x3e, 0xe2, 0xf8, 0x1a, 0x2f, 0xc8, 0x9b, 0x89, 0x17, + 0xe6, 0xad, 0xc0, 0xab, + 0x9c, 0x5b, 0xc8, 0xb4, 0xa2, 0x07, 0x8d, 0x2d, 0x3e, 0xed, 0x30, 0xea, + 0x86, 0xe2, 0x8e, 0xc6, + 0xb6, 0x96, 0xe6, 0xb4, 0xa9, 0xa5, 0xb9, 0x39, 0xc3, 0x9c, 0x22, 0x24, + 0x01, 0xbe, 0x64, 0xab, + 0x2d, 0x50, 0x67, 0x47, 0x07, 0xae, 0xbe, 0xa3, 0x35, 0x79, 0xc1, 0x39, + 0x1a, 0xcd, 0xc9, 0xff, + 0x86, 0x5f, 0x5f, 0xf0, 0x74, 0x6e, 0x84, 0x90, 0x46, 0x21, 0xf6, 0x05, + 0x9f, 0x05, 0x6e, 0x2d, + 0x4d, 0xf8, 0x36, 0x79, 0xed, 0xb8, 0xe6, 0x8e, 0x86, 0x7c, 0xa6, 0x9a, + 0xcc, 0xf0, 0x93, 0xd9, + 0xb3, 0x90, 0x60, 0x4e, 0xa0, 0x91, 0x96, 0x86, 0xa4, 0x1d, 0x60, 0x5f, + 0x1f, 0x5b, 0x2e, 0x59, + 0x64, 0x5f, 0x0a, 0x3e, 0xd5, 0x57, 0xb0, 0xbf, 0xc5, 0xdf, 0xda, 0xa7, + 0x41, 0x0c, 0xf8, 0x15, + 0xfe, 0xda, 0xf6, 0x15, 0xfe, 0xd2, 0xf1, 0x25, 0x5e, 0x64, 0x7b, 0x1e, + 0x7c, 0xa4, 0x2c, 0x92, + 0xce, 0xf0, 0x8c, 0xf9, 0x71, 0x80, 0x1d, 0x0d, 0xd4, 0xa7, 0xf8, 0x02, + 0xc0, 0xbf, 0xcf, 0xed, + 0x93, 0x09, 0xe0, 0x24, 0xfe, 0xc6, 0xfa, 0x25, 0xf9, 0x1e, 0x30, 0xf0, + 0x6b, 0xd9, 0x41, 0xee, + 0xb2, 0x34, 0x21, 0x0d, 0x44, 0x40, 0x14, 0xc0, 0x69, 0xc6, 0x3b, 0x4b, + 0x30, 0x27, 0xd2, 0xc6, + 0x72, 0x7b, 0xdc, 0x39, 0xbf, 0xad, 0xb1, 0x77, 0xfe, 0xb0, 0xdc, 0x19, + 0xf6, 0x89, 0xf0, 0xfd, + 0xbf, 0x44, 0x59, 0x70, 0x8d, 0x4d, 0x12, 0x32, 0x49, 0x23, 0xc0, 0x9d, + 0xfa, 0x52, 0x5b, 0x7c, + 0xa3, 0xe3, 0x26, 0xd4, 0x21, 0xaf, 0x31, 0x4a, 0x55, 0xe2, 0x51, 0x03, + 0x5b, 0x1b, 0xd4, 0xd6, + 0xd1, 0xd2, 0x98, 0x6d, 0x4a, 0xc4, 0x09, 0x4a, 0x63, 0xf4, 0x54, 0xbe, + 0x91, 0xff, 0xcc, 0x31, + 0x9f, 0x2c, 0x74, 0x4c, 0x23, 0x5f, 0xc1, 0x31, 0x9a, 0x6a, 0x63, 0x9f, + 0xef, 0x0b, 0xf2, 0x99, + 0x7d, 0x05, 0x9e, 0x21, 0xc7, 0xa1, 0x28, 0xca, 0xfc, 0xb4, 0x78, 0x12, + 0x6b, 0x49, 0xa1, 0x6d, + 0xf2, 0x6f, 0x47, 0x7d, 0x0a, 0x6f, 0x34, 0x34, 0xb6, 0x65, 0xa0, 0x14, + 0x4b, 0x1a, 0xdf, 0x50, + 0x6d, 0x65, 0x6c, 0xe3, 0x68, 0x65, 0x6c, 0x60, 0xcb, 0xe2, 0xd3, 0x45, + 0xe6, 0x1d, 0xc6, 0x01, + 0xa2, 0xb9, 0x6a, 0x1a, 0xf1, 0x0c, 0xb7, 0x04, 0x38, 0x22, 0x70, 0x3c, + 0xd3, 0xc5, 0x16, 0x64, + 0x80, 0x55, 0x25, 0x33, 0xe0, 0x3b, 0x7f, 0x64, 0x9f, 0x8c, 0x0b, 0x1c, + 0xc9, 0x24, 0x0a, 0xfc, + 0x3a, 0xf6, 0xe8, 0x78, 0x53, 0x9c, 0xa9, 0x81, 0xd8, 0x08, 0xdf, 0x9f, + 0x6f, 0xe6, 0x0b, 0x1c, + 0x13, 0xd0, 0xfb, 0xb6, 0x02, 0xfe, 0x7d, 0xdb, 0x2d, 0x70, 0xce, 0x24, + 0xb3, 0xda, 0x8e, 0xe6, + 0xfb, 0xb1, 0x08, 0x39, 0x49, 0x48, 0x16, 0x1a, 0xa9, 0x9d, 0x51, 0xd7, + 0xfc, 0xeb, 0xb9, 0x76, + 0x8e, 0x06, 0x7c, 0x9a, 0x98, 0x8a, 0x53, 0xcd, 0x59, 0x34, 0xcb, 0x0c, + 0xbe, 0xba, 0x99, 0xf9, + 0x91, 0x8c, 0x8b, 0x97, 0x41, 0xe1, 0xea, 0x44, 0x92, 0x05, 0x88, 0xd5, + 0x49, 0x9a, 0x39, 0xdd, + 0xd4, 0x9d, 0xb6, 0x36, 0xdd, 0x41, 0x91, 0x3a, 0x14, 0x0d, 0x76, 0xbe, + 0x6d, 0x78, 0x4b, 0x79, + 0x0b, 0x0f, 0x82, 0x38, 0xfc, 0x75, 0xe5, 0x25, 0xfc, 0x82, 0xf2, 0x7f, + 0xf8, 0x29, 0xe9, 0x0d, + 0x6c, 0x24, 0xbd, 0xa9, 0xc6, 0x55, 0x63, 0x78, 0x91, 0xd7, 0x6e, 0xd8, + 0xcb, 0x5b, 0x07, 0xf5, + 0xa8, 0x11, 0xe3, 0xce, 0x6c, 0xf8, 0x68, 0xc4, 0x07, 0x7d, 0xdf, 0x60, + 0x3f, 0x4f, 0x1c, 0x7f, + 0xf1, 0x8d, 0xa0, 0xf3, 0x48, 0x94, 0x2a, 0xc3, 0x8a, 0xef, 0xec, 0x4f, + 0xb2, 0xc7, 0x3f, 0x31, + 0x29, 0xfa, 0x45, 0xc6, 0x0d, 0x8e, 0xd0, 0x33, 0x6b, 0x4e, 0x27, 0xf7, + 0x8d, 0xcd, 0x1c, 0xf4, + 0xa7, 0xe7, 0xa2, 0xd5, 0x4d, 0xd4, 0x24, 0x63, 0xb8, 0x72, 0x58, 0x7a, + 0x75, 0x5a, 0x3c, 0x3e, + 0x4a, 0x9c, 0x23, 0xde, 0x18, 0x2d, 0x06, 0xc1, 0xbf, 0x2b, 0x99, 0x4d, + 0x5b, 0xa3, 0x47, 0x5b, + 0xeb, 0x4b, 0x36, 0xb0, 0xcf, 0x17, 0x94, 0x6f, 0x12, 0x06, 0xad, 0xfa, + 0xbf, 0x4a, 0xbb, 0x46, + 0xcb, 0xeb, 0x39, 0x62, 0x73, 0x03, 0xf3, 0x4d, 0xe2, 0xb5, 0xda, 0x72, + 0xbc, 0x17, 0xdf, 0x84, + 0xc5, 0xbf, 0xa5, 0x79, 0xb3, 0xf0, 0xa2, 0x82, 0xc5, 0xdc, 0xe2, 0x82, + 0x45, 0x68, 0x59, 0xc1, + 0x42, 0xb4, 0x34, 0x7f, 0x19, 0x3f, 0xcf, 0xf6, 0x33, 0x37, 0xa5, 0xb8, + 0x03, 0xd7, 0xd9, 0xde, + 0x8c, 0x6f, 0x22, 0xb1, 0x0e, 0xe8, 0x6c, 0x88, 0x58, 0x23, 0xe8, 0x60, + 0xe7, 0x4a, 0xb2, 0xc8, + 0x31, 0x8f, 0x7c, 0x68, 0x1d, 0x8e, 0x1f, 0x91, 0x3a, 0x91, 0x4c, 0xb9, + 0x3d, 0x7f, 0x8f, 0xfa, + 0x10, 0xd7, 0x5f, 0xea, 0x4d, 0x3a, 0x4a, 0xcd, 0x71, 0x43, 0xe9, 0x66, + 0xda, 0x8a, 0xc6, 0x99, + 0x53, 0xc5, 0x7a, 0x42, 0x07, 0x67, 0x67, 0xbe, 0x9d, 0xa3, 0x09, 0x4a, + 0x94, 0x5b, 0x90, 0x81, + 0x05, 0x4e, 0x7e, 0x61, 0xde, 0xd7, 0xfc, 0x92, 0x82, 0x27, 0x21, 0x16, + 0x02, 0xff, 0x0e, 0x7c, + 0xbb, 0x14, 0xb1, 0x01, 0x6d, 0x6e, 0xbb, 0x86, 0x6b, 0x5f, 0xd0, 0x81, + 0x6b, 0x65, 0x6b, 0xca, + 0x35, 0x95, 0x1b, 0xa1, 0x7a, 0x62, 0x03, 0x92, 0x2d, 0x67, 0xd1, 0xfa, + 0x6a, 0x3d, 0xd2, 0x46, + 0x69, 0x00, 0x31, 0xd9, 0x08, 0x32, 0xd3, 0xba, 0x1c, 0x36, 0xc4, 0xb0, + 0xf6, 0x39, 0x64, 0x96, + 0xed, 0x7b, 0xc0, 0x40, 0x86, 0x7f, 0xb0, 0x6d, 0xd3, 0xd0, 0x34, 0xc7, + 0x54, 0xb2, 0x5a, 0x7d, + 0x09, 0xfc, 0x9c, 0x2c, 0x92, 0x66, 0x62, 0xb9, 0xb0, 0x14, 0xad, 0x97, + 0xa5, 0x8d, 0xed, 0x31, + 0x7e, 0xb4, 0x7d, 0x0e, 0xff, 0x35, 0xf8, 0x61, 0x53, 0xad, 0xd3, 0xc9, + 0x37, 0xd6, 0x6f, 0xc8, + 0x34, 0xeb, 0x57, 0x64, 0xb6, 0xb2, 0x08, 0x17, 0xcb, 0xf7, 0x93, 0xa6, + 0x52, 0x1b, 0x92, 0x6d, + 0x8e, 0x25, 0x29, 0x8c, 0x6f, 0x2b, 0x35, 0x26, 0x1d, 0xed, 0x5d, 0xf8, + 0x0e, 0x05, 0x2d, 0x0d, + 0xdd, 0xf3, 0xde, 0x30, 0xcc, 0xb3, 0x4d, 0x41, 0xb3, 0xed, 0xe3, 0x50, + 0x36, 0xe0, 0x5f, 0xb2, + 0x29, 0x15, 0xfc, 0xbf, 0x26, 0xa4, 0xb3, 0xb5, 0x2b, 0x7f, 0x5d, 0x41, + 0x7b, 0xd4, 0x44, 0xae, + 0x6f, 0x6c, 0x64, 0x6d, 0x63, 0xec, 0xec, 0x68, 0x68, 0x4c, 0x55, 0xea, + 0xf1, 0x59, 0x62, 0x63, + 0xd2, 0x3c, 0xef, 0x79, 0xee, 0xa3, 0xc2, 0x19, 0xdc, 0x34, 0xc7, 0xb7, + 0x64, 0xba, 0xf3, 0x1b, + 0x3c, 0xd5, 0xfe, 0x2d, 0x99, 0x06, 0x31, 0xf0, 0x34, 0xdb, 0x54, 0x32, + 0xd5, 0xbe, 0x0c, 0x7f, + 0x61, 0xcd, 0xe0, 0x13, 0x2c, 0x99, 0x24, 0x43, 0x6a, 0x80, 0xbb, 0xaa, + 0xf7, 0xa2, 0x87, 0x8a, + 0xfb, 0x1a, 0x3b, 0x3b, 0xeb, 0xe7, 0x66, 0x2a, 0x59, 0xc6, 0xc6, 0xd6, + 0x16, 0xc6, 0x46, 0xf6, + 0x4c, 0x43, 0xaa, 0x25, 0x89, 0x4f, 0x10, 0xe3, 0x70, 0xac, 0x09, 0x7c, + 0x4e, 0x0a, 0x91, 0x32, + 0x60, 0x5e, 0x14, 0xbb, 0x16, 0x80, 0x57, 0x17, 0xcb, 0xf2, 0x86, 0xe6, + 0x4c, 0xd2, 0x58, 0x6a, + 0x49, 0x9e, 0x04, 0xdf, 0x74, 0x86, 0x63, 0x12, 0xf9, 0xd8, 0xfe, 0x19, + 0x36, 0x02, 0xfe, 0x45, + 0x0b, 0x2c, 0xf7, 0x17, 0x47, 0x93, 0xe5, 0x66, 0xa4, 0x3d, 0xf8, 0xc0, + 0x5d, 0xf3, 0xdf, 0xe3, + 0xc7, 0xda, 0xdf, 0x07, 0xff, 0xaf, 0x90, 0x2f, 0xb6, 0x76, 0x83, 0xbf, + 0x71, 0x1c, 0x8d, 0x06, + 0x1f, 0x32, 0x1a, 0xae, 0x5d, 0xcc, 0x4f, 0xcc, 0xb2, 0xb4, 0xc5, 0x5d, + 0x6c, 0x9d, 0xb8, 0x66, + 0x6a, 0x7d, 0x63, 0x92, 0x9c, 0x80, 0xe2, 0x01, 0xf3, 0x92, 0xe1, 0x77, + 0x80, 0x5b, 0x34, 0x8a, + 0xc4, 0xc2, 0xbb, 0x46, 0x03, 0x8e, 0x01, 0x16, 0x12, 0xf0, 0xa3, 0x85, + 0x14, 0x92, 0x4e, 0x1b, + 0x0a, 0xcd, 0xe4, 0x5e, 0xe4, 0x46, 0x71, 0x00, 0xcd, 0x99, 0xfe, 0xc6, + 0xbf, 0x35, 0x2c, 0x9b, + 0xfb, 0xfa, 0xc3, 0xaf, 0x3a, 0x5e, 0x36, 0xbc, 0x22, 0xbf, 0x08, 0xbe, + 0xdf, 0xd3, 0xf8, 0x51, + 0xe9, 0x15, 0x3c, 0x94, 0xf6, 0xa4, 0xf1, 0x4a, 0x9c, 0x31, 0x56, 0x8a, + 0xe1, 0xef, 0x59, 0x3d, + 0xa8, 0xaf, 0x77, 0x8c, 0xab, 0xf5, 0xaf, 0xac, 0xe8, 0xdb, 0x2f, 0x69, + 0xda, 0x20, 0xed, 0xf9, + 0x81, 0xfc, 0xbe, 0xf3, 0x8e, 0xd2, 0x11, 0x33, 0x66, 0xd9, 0x1f, 0x1d, + 0xea, 0xd5, 0xff, 0xd7, + 0xc8, 0x11, 0x33, 0x92, 0xc5, 0x33, 0xc1, 0xed, 0x2e, 0x73, 0x54, 0xba, + 0x0e, 0x5d, 0x76, 0x2f, + 0xce, 0xa9, 0xdf, 0xf9, 0xc1, 0xac, 0x56, 0xc0, 0xf0, 0x25, 0xf0, 0x7c, + 0x93, 0xd0, 0x74, 0xd9, + 0x63, 0x74, 0xce, 0x7d, 0x63, 0xdc, 0xb7, 0x28, 0x73, 0x60, 0x5c, 0x0b, + 0x4d, 0xe7, 0x2b, 0x2a, + 0xa8, 0xce, 0x17, 0x3b, 0x26, 0x09, 0xbe, 0xf8, 0x26, 0x5e, 0x75, 0x93, + 0x04, 0x7b, 0x4a, 0xae, + 0x4b, 0xe7, 0x2b, 0x30, 0xdf, 0x24, 0x94, 0xd9, 0xb4, 0x31, 0xba, 0xfa, + 0xf5, 0x12, 0xf4, 0x6a, + 0xd7, 0x04, 0xe5, 0x9b, 0xb0, 0xef, 0xe5, 0xcd, 0x37, 0xb1, 0x0b, 0x80, + 0x7f, 0xf9, 0xf3, 0xd1, + 0xca, 0x82, 0x65, 0xdc, 0x8a, 0xc2, 0x65, 0xe0, 0x03, 0x2e, 0xe3, 0x97, + 0xe7, 0xad, 0xe4, 0x17, + 0x5a, 0xcf, 0x73, 0xce, 0xa2, 0x14, 0xae, 0x85, 0xa5, 0xb1, 0x50, 0x4f, + 0xcc, 0x34, 0xd5, 0x03, + 0xaf, 0x2e, 0x5d, 0x88, 0x14, 0x06, 0x39, 0x97, 0xd1, 0xa5, 0xb6, 0xa5, + 0xf4, 0x13, 0xa6, 0xe3, + 0x2c, 0x8b, 0xb4, 0x40, 0xfd, 0x10, 0x7f, 0xa1, 0x4c, 0xe1, 0x27, 0x38, + 0x8a, 0xc9, 0xe8, 0xbc, + 0x71, 0xc8, 0xaa, 0x74, 0xc3, 0x59, 0xe0, 0x65, 0x34, 0x77, 0x74, 0xc1, + 0x5d, 0xec, 0xad, 0x50, + 0x7d, 0x29, 0x83, 0x26, 0x29, 0xad, 0xd0, 0x13, 0x45, 0x85, 0xc6, 0x65, + 0x79, 0xd3, 0xd0, 0xcc, + 0x82, 0x87, 0xe0, 0x33, 0xa6, 0xd0, 0x54, 0x88, 0x01, 0x5b, 0xc8, 0x1d, + 0x68, 0x27, 0x67, 0x33, + 0xf0, 0xff, 0x06, 0xf0, 0x8d, 0xd5, 0x86, 0x7c, 0x0b, 0xf9, 0x1a, 0xd4, + 0x49, 0x69, 0x83, 0x3b, + 0x82, 0xbd, 0x75, 0x56, 0x52, 0x48, 0x47, 0xeb, 0x13, 0xe4, 0x73, 0x75, + 0x03, 0x99, 0x0f, 0x7e, + 0xdb, 0x0f, 0xca, 0x6c, 0x32, 0xdf, 0x36, 0x8f, 0xcc, 0xb2, 0xce, 0x86, + 0xd8, 0x74, 0x26, 0xfa, + 0x0e, 0x70, 0xf0, 0x3b, 0xdb, 0x74, 0x3c, 0xc3, 0xfe, 0x35, 0xdd, 0xad, + 0xbc, 0x0a, 0xe7, 0x4a, + 0x26, 0xe0, 0x5f, 0x1a, 0x49, 0x12, 0x53, 0x48, 0x86, 0xa5, 0x11, 0xed, + 0x69, 0xbb, 0x16, 0xe2, + 0xdf, 0xa5, 0xe8, 0x1b, 0xeb, 0x54, 0xf0, 0xfd, 0x66, 0x91, 0xe9, 0x56, + 0x88, 0xd9, 0xad, 0x33, + 0xc8, 0x0c, 0xeb, 0xb7, 0x64, 0x89, 0xfa, 0x03, 0xce, 0x51, 0xba, 0xe2, + 0x5b, 0x2c, 0x8d, 0x69, + 0xbc, 0x39, 0x53, 0x68, 0x65, 0xbd, 0x8e, 0xbf, 0xae, 0xf0, 0x1a, 0x43, + 0x0b, 0x67, 0x9a, 0xa1, + 0x5f, 0x9e, 0xc0, 0x7f, 0x6f, 0xfb, 0x0e, 0xcf, 0x76, 0x3a, 0x00, 0xff, + 0xe2, 0x48, 0x82, 0x98, + 0x4d, 0xba, 0xaa, 0x37, 0xd3, 0x6e, 0x79, 0x5d, 0xb8, 0xae, 0x8e, 0x74, + 0x14, 0x2d, 0xa5, 0xf0, + 0x0d, 0x6d, 0x6d, 0xb8, 0x4e, 0x8e, 0xbb, 0xb8, 0xbb, 0xa5, 0x7a, 0x28, + 0x59, 0x69, 0xc8, 0xf5, + 0x71, 0x7c, 0xce, 0x2d, 0x74, 0xce, 0x42, 0xd3, 0xed, 0xdf, 0xe3, 0xd9, + 0x76, 0x78, 0x2f, 0xfb, + 0x74, 0x32, 0x1d, 0x3e, 0xdb, 0x34, 0xdb, 0x77, 0x64, 0x9a, 0x7d, 0x19, + 0x1a, 0x6c, 0x8b, 0xe4, + 0x93, 0xe4, 0x0c, 0x92, 0x69, 0x6d, 0x8d, 0x6e, 0xb6, 0xf6, 0x46, 0x77, + 0xe4, 0x77, 0x43, 0x1d, + 0xf2, 0xdb, 0xf1, 0xd7, 0x38, 0xda, 0xc2, 0x77, 0xbf, 0x09, 0xdd, 0xee, + 0xbc, 0x15, 0xdf, 0x28, + 0x5d, 0x4b, 0xaf, 0xb1, 0x34, 0x05, 0x3f, 0x3b, 0x0d, 0xde, 0x33, 0x1e, + 0x47, 0x4a, 0xf5, 0x70, + 0x17, 0xc6, 0x33, 0xa6, 0x09, 0x24, 0x81, 0xa6, 0x92, 0xfa, 0x96, 0x66, + 0xa4, 0xa9, 0x9a, 0x41, + 0x06, 0x3a, 0xc1, 0x07, 0x76, 0x7c, 0x41, 0x26, 0xd9, 0x26, 0x61, 0x83, + 0x3d, 0x05, 0x47, 0x01, + 0xb6, 0x25, 0x82, 0xef, 0xdb, 0x5c, 0x6d, 0x83, 0x9a, 0x4a, 0xc9, 0xa8, + 0x95, 0xda, 0x17, 0x15, + 0x59, 0x3f, 0xc0, 0xa3, 0x6d, 0x45, 0x3c, 0xa7, 0x36, 0xd7, 0xfc, 0xbf, + 0x34, 0xe6, 0xcb, 0x81, + 0x47, 0x97, 0x69, 0x6e, 0x48, 0x3a, 0xc8, 0x37, 0xe1, 0xeb, 0xad, 0x1d, + 0xf8, 0xf6, 0xd6, 0x96, + 0x7c, 0x13, 0xb1, 0x39, 0x69, 0x65, 0x6a, 0x4e, 0x9b, 0x9b, 0x5b, 0xe3, + 0x66, 0x26, 0xb8, 0xee, + 0x90, 0x4c, 0xf0, 0x51, 0x1b, 0xe0, 0x66, 0x2c, 0x9f, 0x88, 0x13, 0x85, + 0x54, 0x5a, 0x5f, 0x68, + 0x2a, 0xb6, 0x26, 0xcd, 0x95, 0x6b, 0x70, 0x5f, 0xf1, 0x59, 0xfa, 0x26, + 0x8b, 0x65, 0x3d, 0xb8, + 0xb6, 0xf9, 0xb5, 0x5e, 0xaf, 0x4c, 0xfa, 0xbf, 0x97, 0xfe, 0x2d, 0x3d, + 0x89, 0x07, 0x5a, 0x9e, + 0xc3, 0x6f, 0xd0, 0x1e, 0x80, 0x7f, 0xf1, 0xc6, 0xf8, 0xc2, 0x56, 0xef, + 0x69, 0xbf, 0x5f, 0x6f, + 0xbe, 0x7d, 0xe2, 0xd4, 0x15, 0xcf, 0x54, 0x29, 0x17, 0x0d, 0x27, 0xbe, + 0x1d, 0xf4, 0xe4, 0xa0, + 0x4d, 0x4f, 0xf7, 0xea, 0xbe, 0x78, 0xd0, 0x7d, 0x2c, 0xf6, 0xf5, 0x85, + 0x7b, 0x55, 0xe3, 0x4b, + 0xde, 0x98, 0xb8, 0xd8, 0x70, 0x9f, 0xaf, 0xda, 0xc8, 0xa0, 0x92, 0x8e, + 0x0f, 0xc4, 0xcb, 0xc1, + 0xfa, 0x41, 0xc0, 0xee, 0xf2, 0xb3, 0x2e, 0x47, 0xd3, 0xaa, 0xae, 0x9e, + 0x4b, 0x61, 0xc6, 0x25, + 0x6d, 0x3b, 0x7f, 0xf3, 0x83, 0xdd, 0xef, 0x99, 0x12, 0x46, 0xfd, 0x65, + 0x0f, 0x16, 0xb1, 0x5e, + 0xe8, 0x28, 0x53, 0x90, 0x5c, 0x67, 0x08, 0xfd, 0x7a, 0xa1, 0x1f, 0x13, + 0xdf, 0x7a, 0x2e, 0xba, + 0xf8, 0x26, 0x21, 0x6a, 0xd5, 0x07, 0xd7, 0xae, 0xc9, 0xd0, 0xcd, 0x7d, + 0xf3, 0xad, 0x5d, 0x73, + 0x49, 0x07, 0xdf, 0x17, 0xdf, 0xa4, 0xc8, 0x7c, 0x11, 0xef, 0xce, 0x5b, + 0x88, 0x56, 0x15, 0xae, + 0xe6, 0x56, 0x15, 0xae, 0xe2, 0x97, 0x03, 0xfe, 0xfd, 0x98, 0xbf, 0x86, + 0x5f, 0x96, 0x5f, 0xc1, + 0x0d, 0xce, 0x8f, 0x43, 0x8d, 0x4d, 0x0d, 0xcc, 0x8c, 0xfb, 0x96, 0x61, + 0xc9, 0x34, 0x65, 0x98, + 0xa2, 0x4c, 0xaf, 0xe4, 0x2d, 0xa5, 0x4b, 0x9c, 0x0b, 0xe9, 0x9a, 0xbc, + 0xed, 0x74, 0x47, 0xde, + 0x16, 0xba, 0x21, 0x6f, 0x23, 0xd9, 0xec, 0xdc, 0xc8, 0x6f, 0xcc, 0xdf, + 0x84, 0x36, 0x15, 0x96, + 0xf2, 0xab, 0x9d, 0xcf, 0xa0, 0x56, 0xb6, 0x26, 0xe4, 0xc6, 0xa2, 0xce, + 0x80, 0x69, 0xf5, 0x51, + 0xa6, 0x39, 0x4b, 0x48, 0xb3, 0xb5, 0xe2, 0x5f, 0x2d, 0x9a, 0x6c, 0x58, + 0xe5, 0x98, 0x8d, 0x66, + 0x14, 0x0c, 0xe0, 0xc1, 0x57, 0xa3, 0x8d, 0xa4, 0xb6, 0xe4, 0x5a, 0x7b, + 0x47, 0xd2, 0xd2, 0x9a, + 0x81, 0x1a, 0xda, 0x6f, 0x46, 0x6f, 0x3a, 0xec, 0x48, 0x56, 0x6d, 0xdc, + 0x18, 0x9b, 0xca, 0x17, + 0xc8, 0x13, 0xd1, 0x18, 0x19, 0x21, 0x9b, 0xba, 0x05, 0xaf, 0xb5, 0xcd, + 0xc5, 0xf3, 0xac, 0x0b, + 0xf0, 0x42, 0x65, 0x11, 0x59, 0x00, 0xb7, 0x73, 0xd5, 0x79, 0x68, 0xae, + 0x7d, 0x0e, 0x9a, 0xe5, + 0x80, 0x18, 0xdd, 0x3a, 0x0b, 0xfc, 0xb4, 0x6f, 0xc9, 0x21, 0xe9, 0x75, + 0x38, 0x86, 0x4c, 0x47, + 0x25, 0x8d, 0xa6, 0x43, 0xcc, 0xdc, 0x52, 0x6d, 0x8b, 0x7b, 0x38, 0xbb, + 0xa2, 0x1c, 0xc7, 0x8f, + 0x68, 0xba, 0x6d, 0x16, 0x9e, 0x65, 0x9d, 0x83, 0xe7, 0x5a, 0xd9, 0xed, + 0x4c, 0x3c, 0xdb, 0x36, + 0x9d, 0x7c, 0x0f, 0xaf, 0xb9, 0xcd, 0xfa, 0x05, 0x19, 0xa2, 0xb4, 0x17, + 0xea, 0xcb, 0xd7, 0x0a, + 0x37, 0xe7, 0xdd, 0xc0, 0x75, 0x2c, 0x6c, 0x69, 0x68, 0xa4, 0xc6, 0xf2, + 0xf7, 0xe5, 0x7d, 0xc4, + 0xcf, 0x04, 0xbc, 0x9c, 0x95, 0xaf, 0xa2, 0x2c, 0x31, 0x1a, 0x7c, 0xd1, + 0x1b, 0x68, 0xbf, 0xbc, + 0xee, 0xb8, 0xa3, 0xa3, 0x39, 0x77, 0x9d, 0xed, 0x66, 0xee, 0x5e, 0xf9, + 0x4e, 0xbe, 0xaf, 0xf4, + 0x00, 0x1a, 0x20, 0x8d, 0x42, 0xe3, 0xd4, 0xd7, 0xf8, 0x7e, 0xea, 0x3b, + 0xc6, 0x85, 0xb6, 0x95, + 0x68, 0xb6, 0xe3, 0x07, 0xfa, 0x83, 0x6d, 0x0e, 0x99, 0x6d, 0x9b, 0x4f, + 0x7e, 0x00, 0xdc, 0x9b, + 0x0d, 0x3f, 0x7f, 0x6b, 0x9b, 0x45, 0x4a, 0x6c, 0x53, 0xf1, 0x9d, 0x96, + 0x1b, 0x51, 0x4f, 0xf1, + 0x16, 0xdc, 0x43, 0xba, 0x0d, 0xf5, 0x51, 0x06, 0x90, 0x47, 0xa5, 0xa7, + 0xe8, 0x13, 0x8e, 0x47, + 0xe8, 0xfd, 0xd6, 0xfe, 0xe4, 0x09, 0x15, 0x51, 0xd9, 0x96, 0x23, 0x3c, + 0x27, 0x0f, 0x14, 0xee, + 0xb3, 0xdc, 0x41, 0x6f, 0xb5, 0x74, 0xc7, 0x37, 0xc2, 0xe3, 0xbb, 0x48, + 0x5d, 0x48, 0x6f, 0xcd, + 0x17, 0x4c, 0x20, 0x19, 0xe0, 0xdb, 0xb5, 0x92, 0x9b, 0xd2, 0x06, 0x4a, + 0x1a, 0xe9, 0x66, 0xcf, + 0x07, 0x8c, 0x9d, 0x4c, 0x3e, 0x85, 0xef, 0x55, 0x60, 0x8d, 0x26, 0xd1, + 0x34, 0x45, 0x68, 0x28, + 0xb7, 0x26, 0xad, 0x94, 0xfa, 0x28, 0xdd, 0x1c, 0x8d, 0xaf, 0xb5, 0xdc, + 0x4f, 0x14, 0x65, 0x3c, + 0x2a, 0xb4, 0x16, 0xf3, 0x03, 0x94, 0x26, 0xf8, 0x1a, 0x73, 0x07, 0xd2, + 0x45, 0xec, 0x48, 0x3a, + 0x98, 0x3b, 0xe1, 0x0e, 0xe2, 0x75, 0xb8, 0x9b, 0xd8, 0x15, 0xdf, 0xa4, + 0xdc, 0x8b, 0xff, 0x6d, + 0x7b, 0x10, 0xdf, 0x23, 0xdd, 0x86, 0x6f, 0x35, 0xdf, 0x4d, 0x1e, 0x91, + 0x07, 0xa2, 0x7e, 0xe6, + 0x1e, 0xe4, 0x7a, 0x53, 0x47, 0xda, 0xca, 0x7c, 0x3d, 0xed, 0x6a, 0x8e, + 0xa3, 0x69, 0x10, 0x03, + 0x37, 0x86, 0x78, 0xbb, 0x85, 0xa5, 0x29, 0xca, 0xb4, 0x34, 0x40, 0xf7, + 0x48, 0xcf, 0x62, 0xad, + 0x3f, 0x65, 0xd3, 0xd0, 0xde, 0xde, 0xd8, 0xf4, 0xea, 0xac, 0xa7, 0x1f, + 0x7b, 0x50, 0x7c, 0x1c, + 0xbf, 0x40, 0xba, 0x69, 0xdc, 0xff, 0xe8, 0x71, 0xdd, 0xdf, 0x66, 0xf7, + 0xcf, 0x28, 0xbe, 0xf8, + 0x6e, 0x35, 0xba, 0x4d, 0x1e, 0xfa, 0x3c, 0xbb, 0xef, 0x59, 0xd6, 0xef, + 0x32, 0xab, 0xf4, 0x11, + 0xef, 0xfc, 0xde, 0xc6, 0xcf, 0xa7, 0xbc, 0x60, 0xff, 0x71, 0xd0, 0x9d, + 0x3e, 0x71, 0x0f, 0x30, + 0xd4, 0xe3, 0x07, 0x76, 0x2e, 0x8a, 0x1a, 0x12, 0xb4, 0x37, 0x4d, 0xcf, + 0xac, 0x39, 0x3d, 0x5a, + 0xf5, 0xe0, 0xeb, 0xc5, 0x3b, 0x33, 0x73, 0xd8, 0x7c, 0xbb, 0x40, 0x7a, + 0x2e, 0xcc, 0xfe, 0x35, + 0xfd, 0xe5, 0x30, 0xe9, 0x37, 0xb9, 0xf3, 0x94, 0x1a, 0xf7, 0x37, 0x2c, + 0x3a, 0x5f, 0x54, 0xbf, + 0xa6, 0x95, 0xdf, 0x5c, 0xa7, 0x57, 0x5f, 0x72, 0x1a, 0xeb, 0x4b, 0x1e, + 0x1b, 0x20, 0xbf, 0xe6, + 0x9e, 0xbb, 0xa1, 0x5f, 0xd3, 0x4a, 0x4f, 0xfc, 0x9e, 0x15, 0xbc, 0x57, + 0x49, 0xaf, 0x76, 0x0d, + 0xe3, 0xb8, 0xb0, 0xb9, 0x1f, 0x5e, 0x75, 0x93, 0x7c, 0xcb, 0x45, 0xb4, + 0xd7, 0xb9, 0x1c, 0xaf, + 0x1d, 0xbd, 0x81, 0x5b, 0x5f, 0xb0, 0x09, 0x6d, 0x2c, 0x5a, 0x83, 0x7e, + 0x2c, 0x58, 0x87, 0xd6, + 0x8f, 0xfe, 0x96, 0x7f, 0xd0, 0x9e, 0x6c, 0xaa, 0x6f, 0xca, 0xa6, 0x19, + 0xa6, 0x0c, 0x21, 0xcb, + 0x9c, 0x4d, 0xd3, 0x4d, 0x71, 0xe6, 0x01, 0x85, 0x53, 0xc8, 0xc6, 0xbc, + 0x25, 0x64, 0x29, 0xc4, + 0xc1, 0xcb, 0xed, 0xcb, 0xc8, 0x72, 0xdb, 0x72, 0xb2, 0xd4, 0xbe, 0x08, + 0xaf, 0x70, 0xae, 0xc4, + 0x4b, 0xf3, 0x56, 0x01, 0x6e, 0x5a, 0xf9, 0xde, 0xf9, 0xed, 0x50, 0x5b, + 0x6b, 0x63, 0x9c, 0x61, + 0xc9, 0x82, 0x78, 0xb8, 0x01, 0x49, 0x51, 0xdb, 0xa2, 0x7b, 0x8a, 0x3e, + 0x32, 0xec, 0xb2, 0x2d, + 0x46, 0xab, 0x0a, 0x1e, 0xe6, 0x63, 0xa5, 0x6b, 0xc8, 0x75, 0x8e, 0xeb, + 0xb9, 0x76, 0x79, 0x4d, + 0xf8, 0x7a, 0x62, 0x3a, 0x49, 0x56, 0xee, 0xc6, 0xb3, 0x9c, 0x7b, 0xf9, + 0x0d, 0xf6, 0x4d, 0xdc, + 0x16, 0xc7, 0x3a, 0xee, 0x47, 0xe7, 0x1a, 0xb4, 0xd1, 0xbe, 0x93, 0xdb, + 0x64, 0x2f, 0xe1, 0xe6, + 0xda, 0xe7, 0xf3, 0x4b, 0xed, 0x0b, 0xd1, 0x7c, 0xfb, 0x22, 0xb4, 0xc8, + 0x5e, 0x82, 0x4b, 0x6c, + 0x4b, 0x50, 0x89, 0xbd, 0x84, 0x5f, 0x6c, 0x5f, 0x80, 0x16, 0xaa, 0xf3, + 0xf9, 0x79, 0x8e, 0x99, + 0xe8, 0xb0, 0xfc, 0x32, 0xf3, 0xff, 0x68, 0xa6, 0xa9, 0x31, 0x69, 0xa3, + 0xb6, 0x47, 0xd7, 0x38, + 0x5b, 0x1a, 0x9b, 0xe4, 0x8f, 0x40, 0x5f, 0xd8, 0x17, 0x03, 0x2e, 0xcd, + 0x46, 0xf3, 0xac, 0x73, + 0x00, 0x2b, 0xe7, 0xa0, 0xef, 0xd5, 0xd9, 0x70, 0xfb, 0x03, 0x5a, 0x00, + 0xf8, 0x37, 0xd3, 0xba, + 0x92, 0x4c, 0xcc, 0xbb, 0x49, 0xe8, 0x96, 0x7f, 0x2b, 0xea, 0x5a, 0xd8, + 0xc1, 0xd0, 0xdc, 0x56, + 0x1f, 0x67, 0x5a, 0xe2, 0xc8, 0x2d, 0xf9, 0x4e, 0xc3, 0x52, 0xeb, 0x4c, + 0xc0, 0x3f, 0x27, 0xca, + 0xb6, 0x24, 0x93, 0x2e, 0x8e, 0x3b, 0x49, 0x4f, 0x5b, 0x5b, 0xae, 0x81, + 0x5c, 0x9f, 0xef, 0xe6, + 0x98, 0x60, 0xdc, 0x65, 0x5f, 0xce, 0xaf, 0x06, 0xbc, 0x5b, 0x61, 0x5b, + 0xc0, 0x2f, 0x70, 0xae, + 0xc6, 0x6b, 0x1c, 0xdb, 0xc8, 0x0a, 0xfb, 0x4c, 0x32, 0xd7, 0xb6, 0x88, + 0x2c, 0xb2, 0x2d, 0x20, + 0x0b, 0x61, 0x97, 0x00, 0x06, 0x96, 0xd8, 0xe6, 0x02, 0x06, 0xce, 0x26, + 0x25, 0x80, 0xb9, 0x25, + 0xd6, 0x1f, 0xd1, 0x0a, 0xf0, 0x45, 0x17, 0x39, 0x96, 0xa3, 0x65, 0xe0, + 0x0f, 0x2e, 0x54, 0x17, + 0xe0, 0x1f, 0x1c, 0x33, 0xf1, 0x1c, 0xeb, 0x0f, 0x64, 0xa9, 0x75, 0x09, + 0x99, 0x0d, 0x78, 0xfb, + 0xbd, 0xfd, 0x5b, 0x34, 0xc3, 0xe1, 0xc2, 0x75, 0xf0, 0x21, 0xd1, 0x2a, + 0xd5, 0x40, 0x6f, 0x12, + 0x63, 0x85, 0x54, 0x73, 0x03, 0xd2, 0xda, 0xd1, 0x86, 0x34, 0x81, 0xf8, + 0x39, 0x55, 0x4c, 0x26, + 0xb7, 0xaa, 0x0a, 0x99, 0x03, 0x31, 0xfd, 0x47, 0xd6, 0x79, 0xf8, 0x53, + 0x39, 0x9e, 0xa6, 0x98, + 0x9b, 0xd3, 0xd6, 0x6a, 0x53, 0x92, 0x6d, 0x81, 0xb8, 0x1f, 0xce, 0xa5, + 0x3b, 0xa4, 0x62, 0x62, + 0xb3, 0x16, 0xa3, 0x7c, 0xab, 0x03, 0x9b, 0xad, 0x36, 0xa4, 0xaa, 0x56, + 0x6c, 0xb5, 0x4a, 0x98, + 0x5a, 0x39, 0x9e, 0x57, 0x46, 0xa1, 0x51, 0x4a, 0x2e, 0xec, 0x11, 0x6c, + 0x36, 0x0a, 0x1a, 0xa9, + 0x0c, 0x45, 0x43, 0xd4, 0x1c, 0x34, 0x52, 0x1d, 0x8c, 0xde, 0xb6, 0x0e, + 0x36, 0x0e, 0x91, 0x87, + 0xf1, 0x23, 0xa5, 0x81, 0x80, 0x95, 0x89, 0x70, 0xd5, 0x6b, 0x42, 0x9b, + 0xc9, 0x4d, 0x71, 0x3d, + 0x4b, 0x06, 0x4a, 0x12, 0xeb, 0xe3, 0x5e, 0xce, 0x27, 0xb4, 0xda, 0x85, + 0xf9, 0xd3, 0x8b, 0x2f, + 0x6f, 0xfc, 0x72, 0xe2, 0x73, 0x06, 0x4f, 0xef, 0xde, 0xb6, 0xd7, 0x6f, + 0x79, 0xd8, 0xfa, 0xb0, + 0xe1, 0xdf, 0xe4, 0x7a, 0xd7, 0x59, 0x66, 0x6b, 0x9a, 0xc3, 0xee, 0xb7, + 0x4f, 0xbc, 0xf8, 0x6a, + 0x35, 0xce, 0x4d, 0xb4, 0xbf, 0xea, 0xc1, 0x34, 0xc3, 0xa4, 0x8b, 0x2f, + 0xd4, 0xee, 0x6d, 0xa9, + 0xbd, 0x0d, 0xcb, 0xc6, 0xf4, 0x9f, 0x31, 0xb1, 0x54, 0x7b, 0xfe, 0x89, + 0x2f, 0xcd, 0x1a, 0x76, + 0x0e, 0x5a, 0x70, 0xed, 0x80, 0xa0, 0xf9, 0xf4, 0xa2, 0x2c, 0x7d, 0xfa, + 0x4d, 0x3a, 0x66, 0x50, + 0x32, 0xbb, 0xd3, 0x78, 0x5e, 0x7e, 0xe7, 0x07, 0xbb, 0x6a, 0x05, 0xcc, + 0xee, 0x92, 0x94, 0x68, + 0x63, 0x20, 0xbe, 0x89, 0x3b, 0x56, 0xd5, 0x37, 0xf7, 0x4d, 0x8c, 0xf6, + 0xcf, 0x7d, 0xfb, 0x1f, + 0xcf, 0xa0, 0xd4, 0x7a, 0x64, 0xf2, 0x13, 0x73, 0x7c, 0xe5, 0xd7, 0xbc, + 0xeb, 0x26, 0xfa, 0xf8, + 0x76, 0xa9, 0xfa, 0x34, 0xa9, 0xc3, 0xaa, 0x5d, 0xe3, 0xae, 0x85, 0x7b, + 0xe1, 0xba, 0xdd, 0x74, + 0x11, 0x1f, 0x70, 0xae, 0x47, 0x5b, 0x8b, 0x36, 0x73, 0x9b, 0x0a, 0x36, + 0xa0, 0xf5, 0x85, 0x5b, + 0xf1, 0x86, 0xfc, 0x8d, 0x68, 0x43, 0xd1, 0x2c, 0xfe, 0x61, 0x35, 0x06, + 0x3c, 0xb5, 0x6c, 0x9a, + 0x2d, 0x64, 0x0a, 0x99, 0x34, 0x8b, 0x64, 0x00, 0x12, 0xf6, 0x77, 0xbe, + 0x4f, 0x77, 0xd9, 0x57, + 0x93, 0xe5, 0xd6, 0x35, 0x74, 0xad, 0xba, 0x9a, 0xac, 0xb4, 0xad, 0xc6, + 0xab, 0x60, 0xaf, 0xb5, + 0xad, 0x25, 0x3f, 0x3a, 0xd6, 0xa3, 0xd5, 0x05, 0x32, 0x7f, 0x8b, 0xa3, + 0x39, 0x6e, 0x28, 0x66, + 0x92, 0x2c, 0x4b, 0x3d, 0xd2, 0x50, 0xca, 0x22, 0x49, 0x96, 0xd6, 0xf8, + 0xba, 0x82, 0xf1, 0xdc, + 0x1e, 0xfb, 0x32, 0xbe, 0xb4, 0xe8, 0x15, 0x63, 0x13, 0x7b, 0x4f, 0x74, + 0x7d, 0x7e, 0x6b, 0xae, + 0x89, 0x9c, 0x8d, 0x99, 0x8e, 0x5e, 0x86, 0x74, 0x3b, 0x2d, 0x56, 0xd7, + 0x93, 0x05, 0xf6, 0xa5, + 0xc6, 0x25, 0x8e, 0xc5, 0x5c, 0x89, 0xa3, 0x04, 0x30, 0x6e, 0x05, 0xbf, + 0xcc, 0xbe, 0x18, 0xb0, + 0x6f, 0x09, 0x5a, 0x02, 0xd8, 0xb7, 0xc4, 0xbe, 0x04, 0xaf, 0x80, 0xbd, + 0xd8, 0xb1, 0x02, 0x2d, + 0x03, 0x1c, 0x5d, 0xa6, 0x2c, 0x41, 0x4b, 0x6d, 0x8b, 0xf9, 0x45, 0xd6, + 0xb9, 0xe8, 0x90, 0xf5, + 0x25, 0x12, 0x61, 0x06, 0xec, 0x53, 0xae, 0xe3, 0x3a, 0xe5, 0xb7, 0xe3, + 0x9a, 0x5b, 0xb3, 0xf8, + 0x64, 0xbb, 0x09, 0x2d, 0xb2, 0x96, 0xa0, 0xb9, 0x0e, 0xd6, 0x33, 0x3c, + 0x1f, 0x2d, 0x80, 0xcd, + 0x7c, 0x47, 0xf0, 0x25, 0xf9, 0xb9, 0xb6, 0x79, 0x78, 0xbe, 0x75, 0x01, + 0xf9, 0xae, 0xe0, 0x5e, + 0xd2, 0xad, 0xe8, 0x06, 0xe3, 0x35, 0x79, 0x4d, 0x8c, 0xd9, 0x12, 0xe0, + 0xb0, 0x18, 0x49, 0xef, + 0x2d, 0x1a, 0x6f, 0x58, 0xa0, 0x42, 0x8c, 0x9d, 0x3f, 0x9a, 0xeb, 0x60, + 0x6b, 0x87, 0x7a, 0x42, + 0x7c, 0xda, 0x51, 0x6a, 0x88, 0xea, 0x59, 0x5b, 0x1b, 0xff, 0x65, 0x9b, + 0xc0, 0xaf, 0x65, 0x18, + 0x67, 0x5f, 0x40, 0x16, 0x3b, 0x18, 0xce, 0x95, 0x90, 0x85, 0xf0, 0x3a, + 0x0b, 0xd5, 0x25, 0xb0, + 0xe1, 0x3e, 0xdb, 0x72, 0xbc, 0xc2, 0xb6, 0x04, 0x70, 0x70, 0x31, 0xe0, + 0xf4, 0x7c, 0x5c, 0x62, + 0x87, 0x6d, 0x5b, 0x84, 0x97, 0xd8, 0x16, 0xa1, 0x12, 0xc7, 0x02, 0xb4, + 0xc0, 0xb9, 0x10, 0xcd, + 0xb5, 0xcd, 0x47, 0xf3, 0xd8, 0x67, 0xb1, 0xcd, 0x42, 0x0b, 0xe1, 0x73, + 0xfc, 0x60, 0xff, 0x01, + 0x33, 0xec, 0x2c, 0xb1, 0xcf, 0x85, 0xc7, 0x2c, 0x44, 0x0b, 0x1c, 0xf0, + 0x59, 0xe1, 0xb1, 0x8b, + 0x94, 0xaf, 0xe9, 0x5b, 0x96, 0x68, 0xda, 0x5a, 0xee, 0x80, 0x5a, 0xb3, + 0x6b, 0x89, 0x29, 0x05, + 0xb0, 0x2e, 0x91, 0xde, 0xa4, 0xe4, 0xe1, 0xf9, 0xea, 0xd7, 0xf8, 0x33, + 0x88, 0xe1, 0xbf, 0x53, + 0x5b, 0xa1, 0x26, 0xd6, 0xd6, 0xa4, 0xa1, 0x25, 0x1d, 0x33, 0x2d, 0x2b, + 0xd6, 0xff, 0xdc, 0x43, + 0xfe, 0x0a, 0x8e, 0xa5, 0x13, 0xd9, 0x55, 0x2b, 0xf8, 0xcf, 0x4e, 0xe4, + 0x04, 0xfc, 0x53, 0xac, + 0x2a, 0xc2, 0x2a, 0xc7, 0x73, 0x8a, 0x01, 0xe5, 0x2a, 0xb9, 0x10, 0xfb, + 0x8f, 0x64, 0x73, 0xf1, + 0xf0, 0x48, 0x65, 0x38, 0x7a, 0x4f, 0x79, 0x0f, 0x0d, 0x29, 0x78, 0x67, + 0x24, 0x8b, 0x6d, 0xdf, + 0x98, 0x3e, 0xf8, 0xdf, 0xc3, 0xa4, 0x57, 0x48, 0x0f, 0x4b, 0x06, 0x6d, + 0x26, 0x36, 0xa2, 0xf5, + 0xd9, 0xb5, 0xc9, 0xcc, 0xf2, 0xa9, 0x69, 0xa4, 0xaf, 0xf2, 0x2c, 0x19, + 0xc4, 0x6a, 0x1a, 0xdf, + 0x9c, 0x7f, 0xca, 0x53, 0x9f, 0x98, 0xb2, 0xc0, 0xa0, 0xf1, 0xd5, 0x9e, + 0x1e, 0xff, 0xc0, 0x5b, + 0x03, 0x3d, 0xf8, 0x07, 0xd7, 0x7f, 0x0d, 0xaf, 0xa6, 0x5e, 0x7c, 0xb6, + 0x1a, 0xe7, 0x8a, 0x67, + 0xbc, 0xeb, 0xc1, 0xb6, 0x15, 0xf9, 0x17, 0x87, 0x79, 0xee, 0x5f, 0x31, + 0x6f, 0xd0, 0x83, 0xde, + 0xb8, 0x67, 0x9f, 0x33, 0x65, 0xe0, 0xc6, 0xc2, 0x13, 0x43, 0x6a, 0x44, + 0xc6, 0xa6, 0xf3, 0x48, + 0xcb, 0x1f, 0xc2, 0xef, 0x7b, 0x8e, 0x8d, 0x78, 0x3b, 0x60, 0x3f, 0xdc, + 0xe8, 0xac, 0xe1, 0xba, + 0x6c, 0x40, 0xe7, 0xbc, 0xc5, 0xda, 0x39, 0x2c, 0xef, 0xf9, 0xc1, 0xd5, + 0xf1, 0xf1, 0x38, 0x97, + 0xb6, 0x55, 0x20, 0xbe, 0x89, 0x5b, 0x97, 0x3d, 0xd8, 0xdc, 0x37, 0xa2, + 0x69, 0x89, 0x4b, 0x31, + 0xba, 0xb8, 0x6f, 0x61, 0xc7, 0x05, 0xdd, 0xc7, 0xc4, 0xad, 0xf3, 0xe5, + 0x2f, 0xbf, 0x36, 0x3a, + 0x7d, 0x78, 0x66, 0x71, 0x16, 0xe3, 0x9b, 0xe4, 0x06, 0xe2, 0x9b, 0xe8, + 0xd4, 0xaa, 0xaf, 0x93, + 0xd7, 0x0b, 0xb7, 0x76, 0x8d, 0x0c, 0xe7, 0xd8, 0x41, 0xe7, 0x3a, 0x7e, + 0x5b, 0xe1, 0x66, 0x6e, + 0x73, 0xc1, 0x46, 0xb4, 0xb5, 0x60, 0x1b, 0xda, 0x9c, 0xbf, 0x1d, 0x6d, + 0xcc, 0xaf, 0xe4, 0x5f, + 0x93, 0x22, 0x48, 0x7d, 0x92, 0x29, 0xd4, 0x13, 0xb2, 0x4d, 0xd9, 0x66, + 0xc0, 0x40, 0xb1, 0x1d, + 0xed, 0x07, 0x7e, 0xc5, 0x5e, 0xfb, 0x3a, 0xb2, 0xc6, 0xb6, 0x16, 0xf0, + 0xef, 0x47, 0xba, 0xc2, + 0xba, 0x1c, 0xaf, 0xb2, 0xae, 0x84, 0xbd, 0x96, 0xac, 0x72, 0x6e, 0xc5, + 0xab, 0x8b, 0x5e, 0x43, + 0xed, 0x1c, 0xa9, 0xa4, 0xbe, 0x54, 0x9f, 0xd6, 0xb3, 0x64, 0x0b, 0x69, + 0x42, 0x16, 0x89, 0x16, + 0xaf, 0xc1, 0xed, 0xf2, 0x1c, 0xfc, 0x11, 0xfb, 0x4a, 0x7e, 0xe7, 0x18, + 0xab, 0xa1, 0x5b, 0x61, + 0x37, 0xd4, 0xd2, 0xde, 0x00, 0x65, 0x9b, 0xb4, 0x5e, 0x41, 0xa1, 0x89, + 0x94, 0x49, 0xde, 0xb3, + 0x6f, 0x23, 0x73, 0x9d, 0xb3, 0x0d, 0xf3, 0x9d, 0x4b, 0xb9, 0x05, 0x80, + 0x09, 0xf3, 0xac, 0x0b, + 0xf9, 0x12, 0x75, 0x09, 0xbf, 0x48, 0x5d, 0x08, 0x7e, 0x52, 0x09, 0x5e, + 0x6a, 0x5b, 0x82, 0x17, + 0xda, 0x96, 0xe1, 0x25, 0xf6, 0xe5, 0x68, 0xb1, 0x63, 0x11, 0x5a, 0x68, + 0x5d, 0xc6, 0x6f, 0xb6, + 0x6d, 0xe0, 0x19, 0xb6, 0xed, 0x72, 0x3c, 0x87, 0x52, 0x6c, 0x5d, 0x51, + 0xb7, 0xbc, 0x2e, 0xb9, + 0x6d, 0xf2, 0x9a, 0x70, 0xd9, 0x52, 0x2a, 0x4a, 0x54, 0x8d, 0x68, 0xb1, + 0xc2, 0xb0, 0xb3, 0x04, + 0x2d, 0x52, 0x17, 0xc3, 0xe3, 0x17, 0xa2, 0xc5, 0x80, 0x87, 0xf3, 0xe1, + 0x76, 0x81, 0x75, 0x3e, + 0xf8, 0x60, 0xcb, 0xc8, 0xc2, 0xa2, 0xbb, 0x51, 0xe7, 0xa2, 0xf6, 0x86, + 0xa6, 0xd6, 0x06, 0x46, + 0x56, 0x8f, 0x66, 0xfd, 0xc3, 0x8f, 0x8e, 0xfd, 0xde, 0xb0, 0x40, 0x59, + 0x80, 0xe7, 0x15, 0x7e, + 0xc4, 0xdd, 0x91, 0x7f, 0x0b, 0x77, 0x83, 0xa3, 0xb9, 0xb1, 0x95, 0xd2, + 0x98, 0x6f, 0x3f, 0xba, + 0x5b, 0xce, 0x00, 0xc7, 0x38, 0x7e, 0x0b, 0xc4, 0xe1, 0x25, 0xd6, 0x12, + 0x32, 0xcf, 0x3a, 0x17, + 0xe2, 0xf1, 0xc5, 0x64, 0xbe, 0x75, 0x36, 0xf9, 0x41, 0x29, 0xc1, 0xf0, + 0x39, 0xc9, 0x02, 0xc0, + 0xc3, 0x45, 0xb0, 0xe7, 0xc2, 0x9e, 0x63, 0x9f, 0x8b, 0x7f, 0x00, 0x7c, + 0x5b, 0xc6, 0xae, 0x0d, + 0xd6, 0x95, 0x68, 0xb1, 0x7d, 0x3e, 0x5a, 0x02, 0x9f, 0x7b, 0xbe, 0xca, + 0xfc, 0xd6, 0x25, 0x68, + 0xae, 0x95, 0xd5, 0xd8, 0x01, 0xff, 0x34, 0x5f, 0x71, 0x21, 0x5e, 0x00, + 0x78, 0xb9, 0xc0, 0xbe, + 0x10, 0xcf, 0x83, 0xdb, 0x85, 0xb6, 0x25, 0x74, 0x9d, 0x3c, 0x9c, 0xf6, + 0x56, 0xda, 0xe0, 0x2e, + 0xb6, 0x56, 0x7c, 0x43, 0x29, 0x13, 0xa7, 0x10, 0xf8, 0x7c, 0xcc, 0x0f, + 0x97, 0x72, 0xd1, 0x12, + 0xf5, 0x1b, 0xfc, 0x85, 0x32, 0x15, 0xcd, 0xb1, 0xdd, 0x6c, 0x6c, 0x60, + 0x6b, 0x88, 0xd3, 0x19, + 0x87, 0x45, 0x60, 0x3d, 0x8a, 0x11, 0xe4, 0x26, 0x69, 0x2c, 0xc9, 0x57, + 0x1c, 0xc8, 0xaa, 0x58, + 0x90, 0x24, 0x2b, 0x48, 0x96, 0x4d, 0x88, 0x00, 0xfc, 0xe5, 0x82, 0xbf, + 0x37, 0x44, 0x1e, 0x8e, + 0x86, 0xc9, 0x43, 0xf0, 0x50, 0xf9, 0x3d, 0xfc, 0x0e, 0xdc, 0x0e, 0x51, + 0xdf, 0xc6, 0x6f, 0x2b, + 0x6f, 0xa2, 0x37, 0x96, 0xb9, 0x7b, 0xf2, 0x36, 0xbc, 0x71, 0xdb, 0xcb, + 0xf2, 0xdd, 0xb4, 0xa7, + 0x54, 0x1f, 0x37, 0xb4, 0x64, 0xe2, 0x54, 0x78, 0xcd, 0x04, 0x0a, 0x1b, + 0x8e, 0x4d, 0x17, 0xf9, + 0x11, 0xf2, 0xfa, 0x5a, 0x88, 0x53, 0xbd, 0xe3, 0x57, 0x37, 0x37, 0xe3, + 0xc5, 0xcf, 0xef, 0x7e, + 0xe9, 0x3e, 0xd2, 0xb9, 0xfa, 0x9c, 0x7a, 0x8c, 0xe1, 0xd5, 0x8c, 0xaa, + 0xc7, 0xab, 0x1f, 0x67, + 0x2d, 0xcd, 0xf1, 0xd4, 0x42, 0x6a, 0x60, 0xdb, 0xd8, 0x29, 0x6f, 0x7b, + 0x78, 0x6e, 0x2c, 0x4f, + 0xe8, 0xb7, 0x26, 0xf2, 0xa9, 0xdd, 0xe5, 0x27, 0x2e, 0xed, 0xd9, 0x3f, + 0x50, 0x3e, 0x9d, 0xcd, + 0xe6, 0x09, 0x6a, 0x03, 0x21, 0xcc, 0x5b, 0x0c, 0xa0, 0xcb, 0xee, 0xaa, + 0x9b, 0xd8, 0x92, 0x73, + 0x5d, 0x9c, 0x3b, 0xff, 0xf3, 0x83, 0x59, 0xad, 0xc0, 0x95, 0xc3, 0x0a, + 0x3a, 0xf7, 0x4d, 0xcb, + 0xfb, 0xc5, 0x39, 0xe2, 0x38, 0xf0, 0xff, 0xb8, 0x28, 0x4b, 0x14, 0xf6, + 0x9d, 0x5f, 0x0b, 0x45, + 0xab, 0x3e, 0xfc, 0x9a, 0x56, 0x3e, 0xf2, 0x7a, 0x97, 0xc5, 0x37, 0x09, + 0x25, 0xaf, 0x17, 0x2e, + 0x3d, 0x9f, 0x58, 0x1f, 0x7a, 0x3e, 0x56, 0x7a, 0x91, 0x1c, 0x76, 0xac, + 0xe7, 0xb7, 0x16, 0x6c, + 0x37, 0xec, 0xc8, 0xdf, 0xc1, 0xef, 0xce, 0xaf, 0x44, 0xa5, 0x79, 0x3b, + 0xd0, 0x16, 0xfb, 0x09, + 0xf4, 0x2a, 0xe0, 0x5f, 0x43, 0xf0, 0xff, 0xb2, 0x4c, 0xd9, 0x42, 0x96, + 0xa5, 0xa1, 0xd8, 0xd2, + 0x7e, 0x23, 0x7a, 0x3e, 0x6f, 0xb9, 0xf1, 0xa2, 0xe9, 0x67, 0xe1, 0x98, + 0xf5, 0xb8, 0x70, 0x5a, + 0xfc, 0x5d, 0x70, 0x5d, 0xa3, 0x7f, 0x25, 0xc7, 0xec, 0x95, 0xb8, 0xac, + 0xa0, 0x02, 0x95, 0x16, + 0xbd, 0x8f, 0xdb, 0xdb, 0x13, 0x18, 0xe7, 0x0a, 0x50, 0x33, 0x1d, 0x6c, + 0x27, 0x1a, 0x37, 0x70, + 0xb6, 0xe1, 0x5b, 0x3b, 0xa6, 0xf0, 0xc7, 0xec, 0x5b, 0xf8, 0xd5, 0xef, + 0x4b, 0xb9, 0x9d, 0x0b, + 0xda, 0xa2, 0x86, 0xac, 0x5f, 0x45, 0x00, 0x8f, 0x52, 0x48, 0xc0, 0x19, + 0xea, 0xc3, 0xfc, 0xf2, + 0xbc, 0x43, 0xfc, 0x5e, 0xc7, 0x31, 0xee, 0xa4, 0x7a, 0x8a, 0x3f, 0xad, + 0x9c, 0xc2, 0x27, 0x94, + 0xb3, 0xe8, 0x94, 0xf5, 0x38, 0xfa, 0x49, 0x39, 0x43, 0xce, 0x89, 0xbf, + 0xd1, 0x3f, 0xe1, 0x7d, + 0xfe, 0x80, 0x75, 0x56, 0x39, 0x46, 0x0e, 0xe7, 0x95, 0xa3, 0x03, 0x79, + 0xeb, 0x78, 0x87, 0x55, + 0x46, 0xd3, 0xd5, 0xa5, 0x68, 0x69, 0xfe, 0xab, 0x7c, 0x87, 0xfc, 0x5e, + 0xfc, 0xf5, 0x85, 0x2d, + 0x73, 0x1b, 0x49, 0xd9, 0x28, 0x03, 0xe2, 0xd6, 0x64, 0xf5, 0x39, 0x34, + 0x5d, 0x5e, 0x8f, 0x96, + 0xdb, 0x56, 0xa0, 0x95, 0xd6, 0x65, 0x68, 0x39, 0x60, 0xd0, 0x0a, 0xed, + 0x76, 0x39, 0x5a, 0x0e, + 0xf8, 0xb3, 0x5c, 0xde, 0x40, 0xbe, 0x2d, 0xba, 0x85, 0x6f, 0x5b, 0xd0, + 0xc2, 0xd0, 0x58, 0xca, + 0x40, 0x8c, 0x95, 0x9b, 0x62, 0x8a, 0x24, 0xf7, 0x8e, 0x9b, 0x6d, 0x58, + 0xab, 0x2c, 0xc2, 0x8b, + 0x47, 0x4f, 0xe5, 0xfa, 0x17, 0xdc, 0xc8, 0x41, 0x5c, 0x6c, 0xe8, 0x94, + 0x7f, 0x7d, 0x6e, 0xd7, + 0x0f, 0x6e, 0x1c, 0xde, 0x3f, 0xff, 0x03, 0x63, 0x85, 0x63, 0x0b, 0x5f, + 0xe1, 0xa8, 0x84, 0xcf, + 0x5a, 0xc1, 0xef, 0xb5, 0x1f, 0xc3, 0x07, 0x6d, 0x07, 0xc8, 0x41, 0xf5, + 0x24, 0x39, 0xa5, 0x9c, + 0x24, 0x87, 0x94, 0x23, 0x70, 0x7b, 0x8c, 0x1c, 0x55, 0x4e, 0xe0, 0xe3, + 0xea, 0x71, 0xb2, 0xd7, + 0xba, 0x1b, 0x57, 0x58, 0xe7, 0xe2, 0xf7, 0xc1, 0x47, 0xfd, 0xd1, 0xbe, + 0x0a, 0xad, 0x70, 0xae, + 0x80, 0xcf, 0x00, 0x9f, 0xd7, 0x56, 0x82, 0xb6, 0x58, 0x2b, 0xd1, 0x5e, + 0xeb, 0x5e, 0x7c, 0xc0, + 0x7a, 0x00, 0xef, 0x53, 0x0f, 0xe0, 0x2a, 0xb5, 0x82, 0x94, 0xab, 0xe5, + 0x64, 0x8b, 0x75, 0x2b, + 0xd9, 0xac, 0xac, 0x27, 0x47, 0x94, 0xa7, 0x48, 0x3d, 0xdb, 0x4d, 0x7c, + 0x73, 0x7b, 0x43, 0x54, + 0xdf, 0x94, 0x4a, 0x92, 0x59, 0x77, 0x9f, 0xd8, 0x90, 0xa6, 0xc8, 0xaf, + 0xf3, 0xab, 0x95, 0xef, + 0xd0, 0x14, 0x75, 0x0a, 0xff, 0x81, 0xa3, 0x2d, 0x97, 0x2e, 0x65, 0x60, + 0x56, 0xef, 0xd6, 0xfa, + 0x65, 0xe0, 0xef, 0x7f, 0xad, 0x85, 0xa3, 0x36, 0xd9, 0x8a, 0x14, 0x59, + 0xc1, 0x80, 0x7d, 0x98, + 0xca, 0x3c, 0x32, 0xc8, 0x23, 0x01, 0xf7, 0x06, 0xe3, 0x21, 0x16, 0x88, + 0x73, 0x2d, 0xef, 0xa2, + 0xc1, 0x96, 0x21, 0x68, 0x08, 0xec, 0xc1, 0x96, 0x77, 0xf0, 0xe0, 0xf1, + 0x6f, 0xbe, 0xe5, 0xc1, + 0x26, 0x76, 0xfb, 0x46, 0x41, 0xdb, 0x11, 0x6d, 0x2c, 0xf5, 0x70, 0x9a, + 0x98, 0x8c, 0x13, 0x59, + 0xcf, 0x0e, 0x53, 0x48, 0x15, 0xe0, 0x2c, 0x10, 0xbb, 0x93, 0xd7, 0x59, + 0xfd, 0x62, 0xf1, 0x8c, + 0xfb, 0xbc, 0xb1, 0x49, 0x7b, 0xee, 0x57, 0x77, 0x3c, 0x73, 0x17, 0xe9, + 0x58, 0x7d, 0x4e, 0xf5, + 0x59, 0x31, 0xa8, 0xdf, 0xa0, 0x79, 0x2b, 0x1e, 0xf4, 0xf6, 0xe1, 0x3c, + 0x9c, 0xde, 0x6a, 0x5e, + 0x5b, 0x88, 0x6b, 0x22, 0x7b, 0x4d, 0x78, 0x8d, 0x86, 0x6a, 0xc4, 0x28, + 0x7f, 0xf9, 0xf4, 0xcc, + 0xa2, 0xb4, 0x11, 0x61, 0x9d, 0xb7, 0x68, 0xd1, 0x63, 0x77, 0xa9, 0xc1, + 0xf8, 0x26, 0xa3, 0x12, + 0xf2, 0x32, 0x73, 0x32, 0x9d, 0xb1, 0xa3, 0x02, 0xf2, 0x4d, 0x04, 0x57, + 0xdf, 0x4b, 0xb5, 0x1e, + 0x8c, 0x33, 0xde, 0xe8, 0x53, 0xcf, 0x25, 0xc4, 0xbc, 0x5e, 0x76, 0xb8, + 0x67, 0x50, 0x06, 0x3c, + 0x26, 0x8c, 0x6f, 0x92, 0x62, 0xd0, 0x6a, 0x24, 0x01, 0xe6, 0x07, 0x33, + 0x5c, 0x77, 0xe9, 0x74, + 0x07, 0xd3, 0x91, 0x89, 0x0a, 0x41, 0xd3, 0xea, 0xf2, 0xb4, 0x6b, 0x58, + 0xff, 0xcb, 0x21, 0xc7, + 0x66, 0xae, 0xb4, 0xa0, 0xd4, 0x50, 0x99, 0x57, 0xce, 0xef, 0xca, 0xaf, + 0xc0, 0x95, 0x79, 0xa5, + 0x68, 0x7b, 0x7e, 0x05, 0xff, 0xac, 0x14, 0x41, 0x1b, 0x98, 0xea, 0xd1, + 0x2c, 0x31, 0xdb, 0xd4, + 0x58, 0x6e, 0x6f, 0xba, 0xae, 0xa8, 0x23, 0xff, 0x54, 0xc1, 0x48, 0xfe, + 0x25, 0xe5, 0x59, 0xe1, + 0x19, 0xe5, 0x49, 0xe1, 0x19, 0xe9, 0x39, 0xd3, 0x6b, 0xa6, 0x37, 0x4d, + 0x6f, 0xb2, 0xb9, 0x88, + 0x05, 0x23, 0xf8, 0x77, 0x47, 0x3f, 0xc7, 0x3f, 0xea, 0x7c, 0x81, 0xb4, + 0x57, 0x32, 0x48, 0xb6, + 0x25, 0x93, 0x26, 0x9a, 0x63, 0x49, 0x4b, 0x47, 0x6b, 0xfe, 0xde, 0xe2, + 0x77, 0x8d, 0x9f, 0xda, + 0xcb, 0xb8, 0x6d, 0x8e, 0x32, 0x7e, 0xc5, 0xd8, 0xa7, 0x8d, 0xf5, 0xd4, + 0xc6, 0x04, 0x10, 0x55, + 0x48, 0x17, 0xd3, 0x71, 0x96, 0x98, 0x82, 0x93, 0x95, 0x67, 0x91, 0x90, + 0x3f, 0x98, 0x1b, 0xc6, + 0xe6, 0x05, 0xdb, 0x72, 0x78, 0x9c, 0x67, 0x32, 0x5a, 0x9c, 0x16, 0x1e, + 0xd9, 0x72, 0xd0, 0x08, + 0x25, 0x87, 0x70, 0x16, 0x23, 0x19, 0x25, 0x8e, 0xa2, 0x9c, 0xd9, 0x40, + 0x47, 0xc8, 0x2f, 0x92, + 0x57, 0x9d, 0x32, 0xff, 0xb4, 0xb3, 0x07, 0x7a, 0x43, 0xfd, 0x1c, 0x6d, + 0x66, 0xb9, 0xb5, 0xc2, + 0x77, 0xf8, 0xce, 0x85, 0x5d, 0x8c, 0xe0, 0x53, 0x72, 0x99, 0xa6, 0x0c, + 0x16, 0x2b, 0x0a, 0xe9, + 0xb6, 0xfb, 0xd1, 0x24, 0x65, 0x3b, 0x5a, 0x63, 0x5d, 0x83, 0x7e, 0x54, + 0xd7, 0xa2, 0x75, 0xd6, + 0x75, 0xb0, 0xd7, 0xa2, 0xb5, 0xf0, 0x33, 0xdc, 0x87, 0xd7, 0xc9, 0x9b, + 0xc8, 0x94, 0xfc, 0x4e, + 0xa8, 0xa1, 0xb5, 0x21, 0x9f, 0x2d, 0xa4, 0x93, 0x54, 0x21, 0x95, 0xa6, + 0x5a, 0x62, 0xc8, 0xad, + 0x63, 0x26, 0x19, 0xb6, 0xcb, 0xab, 0xc8, 0xa6, 0x82, 0xaf, 0xf8, 0xeb, + 0xf2, 0x9a, 0xf1, 0x0d, + 0x9d, 0xad, 0x73, 0x7b, 0x17, 0x77, 0x1f, 0xd5, 0xa9, 0xa8, 0x49, 0xee, + 0xbf, 0x6c, 0x23, 0xf8, + 0xa1, 0xce, 0x51, 0xbc, 0xc9, 0x69, 0xe1, 0x24, 0x87, 0x8d, 0xcb, 0xb3, + 0x15, 0xe3, 0x31, 0x2a, + 0x6c, 0xf9, 0x7d, 0xf2, 0xbe, 0xe5, 0x63, 0x32, 0xce, 0x32, 0x86, 0x4c, + 0x10, 0x3f, 0x24, 0x1f, + 0x8b, 0x1f, 0x91, 0x8f, 0x2c, 0x85, 0xe4, 0x13, 0xd9, 0x44, 0xee, 0x56, + 0x5e, 0xc4, 0x05, 0xb6, + 0x95, 0x68, 0x8d, 0x63, 0x35, 0x5a, 0xe9, 0x60, 0x7e, 0xe0, 0x32, 0x34, + 0xdf, 0xf9, 0x3e, 0x1a, + 0xef, 0x18, 0x8b, 0x3e, 0x93, 0xbf, 0x24, 0x5f, 0xc8, 0x9f, 0xe2, 0x4f, + 0xa5, 0x8f, 0xf1, 0x44, + 0xe9, 0x23, 0x32, 0x41, 0x1e, 0x4f, 0x8a, 0x2d, 0x05, 0xb4, 0x40, 0xc9, + 0x27, 0xef, 0x3b, 0x30, + 0xdf, 0xdd, 0xd1, 0x94, 0xcf, 0xb6, 0xa4, 0x31, 0xcf, 0x8f, 0x46, 0x4a, + 0x89, 0xa4, 0xbe, 0x18, + 0x89, 0x9b, 0x28, 0x63, 0xd0, 0x52, 0x75, 0x06, 0x9a, 0xac, 0xce, 0xe1, + 0x8b, 0xd4, 0x34, 0x9c, + 0x6c, 0x4e, 0x22, 0x09, 0x4c, 0xbb, 0x86, 0x26, 0xd2, 0x14, 0x21, 0x9a, + 0xb4, 0x11, 0x9f, 0x21, + 0x92, 0x64, 0xc5, 0xa2, 0x24, 0x22, 0x41, 0x46, 0xd8, 0x20, 0x8d, 0x40, + 0x43, 0xe5, 0xc1, 0xfc, + 0x3b, 0xd2, 0x20, 0xfc, 0xaa, 0xf4, 0x6f, 0xf2, 0x88, 0xf4, 0x28, 0x7e, + 0x44, 0x7e, 0x0c, 0x3f, + 0x69, 0x79, 0x98, 0x3c, 0x6c, 0x7e, 0x8c, 0xbe, 0xf4, 0xe3, 0xa0, 0x3e, + 0x5a, 0x4f, 0x1e, 0xf8, + 0x60, 0xec, 0xf6, 0x85, 0x0f, 0x6e, 0x7d, 0xab, 0xa9, 0x39, 0x95, 0x24, + 0xb1, 0x9e, 0x69, 0x78, + 0xcd, 0x18, 0x21, 0x81, 0x64, 0x6a, 0xba, 0xfc, 0xf7, 0x90, 0x17, 0x67, + 0x0f, 0x7a, 0xa4, 0x76, + 0xfd, 0x56, 0xab, 0x5d, 0xcc, 0xee, 0xff, 0x48, 0x2f, 0x72, 0x4d, 0xf5, + 0x39, 0xd5, 0x71, 0xfe, + 0xa0, 0x07, 0x06, 0xad, 0x98, 0xd8, 0xcf, 0xfb, 0x71, 0x9e, 0x18, 0xd6, + 0x3c, 0xe9, 0xfc, 0x0b, + 0x97, 0x83, 0x7f, 0x17, 0xc7, 0x4f, 0xd4, 0x7a, 0x07, 0xfb, 0x7e, 0x10, + 0xf1, 0x86, 0xef, 0x1c, + 0x56, 0x12, 0x97, 0xa9, 0x43, 0x23, 0x3d, 0x5e, 0xcf, 0x0c, 0x4a, 0xbd, + 0xfa, 0x4d, 0xae, 0x1c, + 0xd6, 0xc8, 0x3a, 0xda, 0x54, 0x3e, 0xf8, 0x26, 0x2c, 0x2e, 0x4c, 0x71, + 0x04, 0xe0, 0x9b, 0x30, + 0xfd, 0x03, 0x36, 0x1f, 0xc5, 0x1a, 0xcf, 0xfc, 0x3f, 0x23, 0xeb, 0x81, + 0xf1, 0xa7, 0xe7, 0xc2, + 0x66, 0xeb, 0xe9, 0xca, 0xb1, 0xfd, 0x2f, 0x74, 0xbe, 0xe4, 0x14, 0x97, + 0x56, 0x7d, 0xa0, 0xf9, + 0xc1, 0xac, 0xdf, 0xbc, 0x30, 0x6b, 0x04, 0x9b, 0x0d, 0x13, 0x90, 0x6f, + 0x62, 0xba, 0x3c, 0x4d, + 0xab, 0x80, 0xda, 0x35, 0xb5, 0xf4, 0x7c, 0xf2, 0x01, 0xff, 0xce, 0xdb, + 0x76, 0x1a, 0x77, 0x14, + 0x54, 0x1a, 0xf6, 0xe4, 0xed, 0xe1, 0xf6, 0xe4, 0x95, 0xa1, 0x3d, 0x79, + 0x95, 0xa8, 0x22, 0x7f, + 0x17, 0xff, 0x6f, 0x39, 0x82, 0x64, 0x01, 0xfe, 0x35, 0x90, 0xdb, 0x0a, + 0x5d, 0xf2, 0x6f, 0xe4, + 0xbb, 0x8c, 0x6e, 0xcb, 0x65, 0x29, 0xf1, 0x34, 0xc6, 0x5c, 0x7b, 0xce, + 0x43, 0x03, 0xda, 0xb2, + 0xb8, 0xb1, 0x31, 0xa5, 0x10, 0xfc, 0x7d, 0x39, 0x0a, 0xd7, 0x33, 0x37, + 0xa0, 0xe9, 0x62, 0x3c, + 0x6d, 0x62, 0x6b, 0x89, 0x6e, 0x2a, 0x7a, 0xcf, 0x30, 0x33, 0xef, 0x68, + 0xee, 0x81, 0xbc, 0x8d, + 0x86, 0x4d, 0x8e, 0x6d, 0x68, 0xcd, 0xe8, 0xfe, 0x7c, 0x8c, 0x89, 0x69, + 0xca, 0xa4, 0x9b, 0xd2, + 0xcd, 0x19, 0x38, 0xd9, 0x92, 0x26, 0x34, 0x94, 0xb3, 0x48, 0xbc, 0x1a, + 0x89, 0x35, 0x1e, 0x82, + 0x2d, 0x16, 0x25, 0x16, 0x26, 0x18, 0x62, 0x94, 0x08, 0x14, 0xe1, 0xab, + 0x1e, 0x65, 0x89, 0xc1, + 0xe0, 0x93, 0xf1, 0x9d, 0xa5, 0x89, 0xe0, 0x1f, 0xee, 0x43, 0x9b, 0x6c, + 0x9b, 0xf0, 0xaa, 0xa2, + 0x17, 0xb9, 0xa6, 0xf9, 0x2d, 0x8c, 0x0d, 0xd9, 0xec, 0x23, 0x73, 0x1a, + 0xcd, 0x84, 0x48, 0x31, + 0xd5, 0xf1, 0x30, 0xfa, 0xca, 0x5a, 0x06, 0x98, 0xb7, 0x01, 0x30, 0x6f, + 0x23, 0xda, 0x64, 0xdd, + 0x0c, 0x58, 0xb9, 0x01, 0xad, 0x57, 0xd7, 0xc1, 0xde, 0x80, 0xd7, 0xca, + 0xdb, 0xc8, 0x62, 0x47, + 0x7b, 0x9c, 0x0e, 0xcf, 0x49, 0x27, 0x19, 0x42, 0xb2, 0x98, 0x24, 0x24, + 0x4b, 0x71, 0xa4, 0x53, + 0xd1, 0x68, 0x43, 0xb9, 0xb4, 0x8e, 0x6c, 0xb2, 0x7d, 0x44, 0x9a, 0xd8, + 0xea, 0x73, 0xed, 0x47, + 0x77, 0xcd, 0xed, 0x56, 0xd4, 0xc6, 0xd8, 0x58, 0xae, 0x8f, 0x13, 0x4d, + 0x11, 0xd5, 0x73, 0xed, + 0x18, 0x3f, 0x2d, 0x92, 0xf5, 0xe8, 0x0b, 0x7e, 0xb9, 0x42, 0x04, 0xfe, + 0x7e, 0xe4, 0x75, 0x69, + 0x15, 0xde, 0x6b, 0xdb, 0x8c, 0x36, 0xd8, 0x37, 0xa0, 0xd5, 0xf6, 0x15, + 0x68, 0x8f, 0x73, 0x03, + 0x92, 0xf3, 0x7b, 0xa3, 0x14, 0x36, 0x47, 0xcf, 0xe4, 0x35, 0xb3, 0xce, + 0xab, 0xfe, 0x57, 0xcf, + 0xd6, 0x1a, 0x37, 0x29, 0x6a, 0xc3, 0xb5, 0xb0, 0x66, 0xf0, 0xa9, 0x24, + 0x4d, 0x60, 0xdd, 0x79, + 0xcd, 0xac, 0x9d, 0x51, 0x13, 0xcb, 0x63, 0xfc, 0xb7, 0xea, 0x2a, 0x7e, + 0xa6, 0x75, 0x3a, 0xff, + 0x95, 0x3a, 0x9d, 0x97, 0xe4, 0x04, 0x8d, 0x53, 0xc2, 0x7a, 0xa4, 0x19, + 0x87, 0x25, 0x45, 0x88, + 0x25, 0x2d, 0x4c, 0x77, 0x10, 0x62, 0xb1, 0x62, 0x62, 0x41, 0xd8, 0x68, + 0xc9, 0xc1, 0x23, 0xc1, + 0xdf, 0x7b, 0x5b, 0x7a, 0x03, 0xbd, 0x24, 0xbd, 0x8c, 0x9f, 0x30, 0x5f, + 0x47, 0x52, 0xe0, 0x33, + 0xb1, 0x7e, 0xc2, 0x58, 0x73, 0x0c, 0x8d, 0xf9, 0xfc, 0x31, 0x57, 0x5c, + 0xc9, 0xb0, 0xca, 0x1d, + 0xa3, 0x3e, 0xfc, 0x79, 0xc6, 0x2b, 0x29, 0xa6, 0x24, 0x1a, 0x0f, 0x1e, + 0x65, 0xb4, 0x10, 0x49, + 0x33, 0xc5, 0xc6, 0xb8, 0x81, 0xb9, 0x2d, 0x79, 0x50, 0x78, 0x96, 0x3c, + 0x3e, 0x6d, 0xd0, 0x53, + 0xb5, 0x63, 0xd8, 0x19, 0x9a, 0x4f, 0xf8, 0xe0, 0x7d, 0xdd, 0xd9, 0x24, + 0x4c, 0xf7, 0xca, 0x9e, + 0x31, 0xe8, 0x31, 0x56, 0xbb, 0xf5, 0xe5, 0xbf, 0xb1, 0xe7, 0x07, 0x8a, + 0x75, 0xb5, 0xbe, 0xe7, + 0xa9, 0x13, 0x9f, 0x31, 0x2f, 0xb5, 0xf7, 0xaf, 0xe1, 0x2b, 0x5a, 0x4e, + 0x70, 0xec, 0xf9, 0xcf, + 0x7c, 0x11, 0xf9, 0x7f, 0xee, 0x38, 0x8a, 0xd4, 0xae, 0x31, 0xb0, 0xdc, + 0xfc, 0xdf, 0x3a, 0x6f, + 0x31, 0x80, 0x2e, 0x7b, 0x0d, 0x1d, 0xfc, 0xe2, 0xec, 0x1a, 0x1a, 0x26, + 0x9e, 0xf9, 0xc1, 0x31, + 0x62, 0x24, 0xaa, 0xd6, 0x7e, 0x36, 0xb9, 0xb8, 0x37, 0x6c, 0xee, 0x65, + 0x9c, 0x1c, 0xa9, 0xcd, + 0x80, 0xf3, 0xa9, 0xe7, 0xc2, 0x7a, 0x79, 0xf3, 0x93, 0x47, 0x32, 0xde, + 0x46, 0x82, 0x1c, 0x78, + 0xae, 0x7c, 0x8d, 0x7c, 0x7f, 0x88, 0xb8, 0x70, 0x85, 0x33, 0x28, 0x03, + 0xf0, 0x4d, 0xb2, 0x6b, + 0x60, 0x61, 0x7a, 0x20, 0xbe, 0x49, 0x2d, 0xad, 0xfa, 0xbf, 0x42, 0xa7, + 0x9b, 0x07, 0xfc, 0xbb, + 0x28, 0x5c, 0x20, 0xfb, 0xed, 0x3b, 0x8d, 0x65, 0x85, 0x7b, 0x73, 0xf7, + 0xe5, 0x97, 0x73, 0x55, + 0x8e, 0x4a, 0x54, 0xe6, 0xd8, 0x8b, 0x9e, 0x51, 0x98, 0xfe, 0x41, 0x5b, + 0x73, 0xa7, 0xbc, 0xae, + 0xb8, 0x6b, 0x51, 0x27, 0xbe, 0x99, 0xdc, 0x80, 0xd4, 0x17, 0x1a, 0x8b, + 0xcd, 0xcc, 0xf5, 0x4c, + 0x19, 0x34, 0xcb, 0x9c, 0x42, 0xd3, 0xcc, 0xf5, 0xe5, 0x2e, 0xa4, 0x77, + 0x51, 0x6f, 0xee, 0xfa, + 0x31, 0x6d, 0x0c, 0x8d, 0x20, 0x56, 0x6b, 0x64, 0xae, 0x47, 0x32, 0x4c, + 0x71, 0x34, 0x5b, 0xea, + 0x80, 0x5b, 0xdb, 0x7a, 0x71, 0x79, 0xce, 0xfd, 0xc6, 0x43, 0xce, 0x2d, + 0x86, 0x6d, 0xce, 0x5d, + 0xdc, 0xae, 0xbc, 0x9d, 0xdc, 0xaa, 0xc2, 0xde, 0x5c, 0xa4, 0x90, 0x29, + 0xa4, 0x99, 0xd2, 0x85, + 0x4c, 0xc6, 0x71, 0x93, 0x5b, 0xd0, 0xeb, 0x6c, 0x1d, 0x68, 0x33, 0xb9, + 0xa1, 0xd0, 0xd8, 0xda, + 0x92, 0xef, 0x94, 0xd7, 0x81, 0x6b, 0xee, 0xa8, 0xcf, 0x67, 0x89, 0x9a, + 0x4f, 0x26, 0xa4, 0xd3, + 0x74, 0x9a, 0x46, 0x53, 0x29, 0xa0, 0x25, 0x89, 0x92, 0x53, 0xf0, 0xb5, + 0xd6, 0x01, 0xe8, 0x45, + 0x75, 0x02, 0x3a, 0xa9, 0x1c, 0xc1, 0xeb, 0xad, 0xdb, 0xd0, 0x36, 0x75, + 0x17, 0xbf, 0xb2, 0xf8, + 0x61, 0x63, 0x9a, 0xd2, 0x08, 0xd5, 0x83, 0x57, 0x4c, 0x37, 0xa7, 0xd2, + 0x34, 0x53, 0x92, 0x90, + 0x6a, 0xbb, 0x0b, 0x4f, 0x82, 0xf8, 0x72, 0x93, 0xb2, 0x15, 0x6f, 0x55, + 0xb7, 0xe2, 0xed, 0x6a, + 0x29, 0xde, 0xa9, 0x6c, 0xc3, 0xdb, 0xa4, 0xed, 0xdc, 0x16, 0x79, 0x33, + 0xb7, 0xc1, 0xba, 0x03, + 0xfd, 0xa0, 0x36, 0x05, 0xff, 0x29, 0x4d, 0x48, 0x33, 0xa7, 0x99, 0x52, + 0xc5, 0x54, 0x13, 0xdc, + 0x92, 0xa6, 0x79, 0x94, 0xdb, 0xa7, 0x6e, 0x16, 0xb6, 0xaa, 0x45, 0xa4, + 0x51, 0x5e, 0xdb, 0x51, + 0x3d, 0x8a, 0xaf, 0x31, 0x36, 0xb2, 0x36, 0xc6, 0x99, 0x96, 0x0c, 0xc0, + 0x8e, 0x24, 0x4d, 0x47, + 0x20, 0xd5, 0x9c, 0x4d, 0x1a, 0x5a, 0xe0, 0x58, 0x98, 0x33, 0xe1, 0xbb, + 0xa6, 0x10, 0xc6, 0xf7, + 0x4b, 0x01, 0x7f, 0x89, 0xf1, 0x99, 0x53, 0x01, 0x39, 0xa2, 0x94, 0xe6, + 0xf8, 0x2e, 0x67, 0x4f, + 0xee, 0x79, 0x79, 0x0d, 0x7f, 0x4e, 0xde, 0x89, 0xd7, 0x28, 0x9b, 0xc8, + 0x0e, 0x75, 0x15, 0x5e, + 0x6d, 0x3d, 0x85, 0xe7, 0x14, 0x0d, 0xe4, 0xeb, 0x39, 0x12, 0x50, 0x9a, + 0x94, 0x88, 0x13, 0xcc, + 0x71, 0xac, 0xb7, 0x59, 0x88, 0x37, 0xc7, 0x0a, 0x09, 0x80, 0x63, 0xb1, + 0x42, 0xa2, 0xa9, 0x31, + 0xe0, 0xdc, 0xb5, 0x45, 0xd7, 0x18, 0x9a, 0xdb, 0xeb, 0x71, 0x19, 0xf0, + 0x5d, 0x12, 0x4d, 0x91, + 0x34, 0x43, 0x6a, 0x4f, 0xee, 0xb3, 0x8e, 0x44, 0x1f, 0x2b, 0xbb, 0xf8, + 0xf5, 0xea, 0x1c, 0xee, + 0x7b, 0x65, 0x26, 0x3f, 0x5d, 0x9e, 0x8a, 0x72, 0xe4, 0x68, 0x12, 0x47, + 0x99, 0x32, 0x03, 0xc3, + 0x3e, 0x4d, 0xff, 0x94, 0x36, 0x36, 0x75, 0xa2, 0x39, 0x16, 0x0b, 0x60, + 0xdf, 0x30, 0xfc, 0x1e, + 0xc4, 0xbb, 0xef, 0x5a, 0xde, 0x41, 0x2f, 0xca, 0x2f, 0xa2, 0x97, 0xe4, + 0x3e, 0xb8, 0x1e, 0xe0, + 0x6d, 0x34, 0x8d, 0xa5, 0xd1, 0x34, 0x9a, 0x44, 0xc1, 0x7e, 0x74, 0x9d, + 0xcb, 0x27, 0x2b, 0x29, + 0xbc, 0x38, 0xa4, 0x3a, 0x96, 0xfd, 0x3a, 0xee, 0x99, 0x18, 0xf6, 0x9a, + 0x70, 0x16, 0x26, 0x99, + 0x9b, 0x91, 0x7a, 0xe6, 0xf6, 0xf8, 0x1e, 0xe1, 0x39, 0xf2, 0x94, 0xf0, + 0x30, 0x19, 0xf8, 0xc5, + 0x2b, 0x2f, 0xd4, 0xee, 0x5f, 0xde, 0x38, 0x67, 0xd0, 0xc0, 0x41, 0xab, + 0xff, 0x7d, 0xd7, 0x0d, + 0x5e, 0xf8, 0x17, 0x31, 0xf9, 0xe5, 0xe7, 0xd8, 0xe3, 0xbc, 0xf1, 0x4b, + 0xe3, 0xf1, 0x7a, 0x34, + 0x5e, 0x66, 0x94, 0x3e, 0x5e, 0x27, 0xc7, 0x97, 0xb7, 0xf1, 0xbd, 0xda, + 0x7d, 0xcf, 0xac, 0xd6, + 0x5c, 0x23, 0x57, 0x08, 0xf7, 0xdd, 0xf3, 0x59, 0xe2, 0x2b, 0x4c, 0x2f, + 0x3a, 0x4e, 0xaa, 0xa9, + 0x83, 0xcf, 0x7c, 0x80, 0xcc, 0xbc, 0xb8, 0x51, 0x57, 0x98, 0xd7, 0xf3, + 0xea, 0x4d, 0xd3, 0xab, + 0xdf, 0xa4, 0x2f, 0x87, 0xc5, 0xe6, 0x7e, 0xd4, 0xe4, 0x9b, 0x64, 0x0d, + 0x4b, 0xc9, 0x8f, 0xcf, + 0x8d, 0xb3, 0xc5, 0x72, 0x31, 0x72, 0x34, 0x8a, 0xb2, 0x44, 0x23, 0x3f, + 0xdc, 0x37, 0xe2, 0x73, + 0xce, 0xe4, 0xb8, 0x6c, 0xbf, 0x7a, 0xc9, 0xe1, 0xd2, 0xef, 0xaf, 0x79, + 0x4c, 0x5c, 0xdc, 0x37, + 0x7d, 0x33, 0x28, 0x63, 0x73, 0x02, 0xf2, 0x4d, 0xac, 0x89, 0x46, 0x76, + 0x4d, 0xc8, 0x1c, 0x1b, + 0x98, 0x6f, 0x72, 0xb9, 0x9a, 0x56, 0xa1, 0x68, 0x52, 0x27, 0x50, 0x8e, + 0x1e, 0xa7, 0x17, 0x85, + 0x8b, 0xa6, 0x33, 0x78, 0xaf, 0xa3, 0xd2, 0x50, 0x99, 0xbf, 0xcf, 0xb8, + 0xd7, 0x51, 0xc5, 0xed, + 0xb6, 0x1f, 0x40, 0xcf, 0xd8, 0x22, 0x50, 0x3b, 0x5b, 0x37, 0xd3, 0x8d, + 0x05, 0x1d, 0xf8, 0x16, + 0xb6, 0x7a, 0x44, 0x53, 0x09, 0xc5, 0x71, 0x52, 0x9a, 0x90, 0x2e, 0x24, + 0x0b, 0xf1, 0x42, 0xa2, + 0xd4, 0x5c, 0xe8, 0x59, 0xdc, 0x87, 0xeb, 0x36, 0xa1, 0xa3, 0xa1, 0x65, + 0x41, 0x03, 0x2e, 0xdb, + 0x52, 0x8f, 0xa4, 0x03, 0xf6, 0xa5, 0x5a, 0xba, 0x90, 0x66, 0xd6, 0x46, + 0x78, 0xb8, 0xba, 0x9d, + 0x3b, 0x6b, 0x2b, 0xe3, 0xb6, 0xe4, 0xef, 0x30, 0x6e, 0xcf, 0xdb, 0x6e, + 0x2c, 0x77, 0x96, 0x73, + 0x6b, 0x9d, 0x5d, 0x79, 0xd6, 0xff, 0x9c, 0x62, 0x4a, 0xa1, 0x09, 0x62, + 0x06, 0xed, 0x6c, 0xeb, + 0x86, 0x3a, 0xda, 0x9b, 0xe0, 0x86, 0xb6, 0x96, 0xb8, 0x93, 0xb3, 0x8b, + 0xa6, 0x31, 0x93, 0x65, + 0x49, 0x63, 0xd9, 0x38, 0x9a, 0x24, 0xb0, 0xc7, 0x25, 0xc1, 0xce, 0xa0, + 0xb1, 0x62, 0x2a, 0xe9, + 0xac, 0x74, 0x46, 0x9d, 0xad, 0x79, 0xe8, 0x88, 0xe5, 0x3c, 0xae, 0x04, + 0xdf, 0x6e, 0x97, 0x75, + 0x37, 0xda, 0xad, 0xee, 0xe6, 0xd7, 0x17, 0x0d, 0x30, 0xc6, 0x4b, 0xd9, + 0x28, 0x93, 0xcd, 0xe4, + 0x14, 0x34, 0x7d, 0x3d, 0x52, 0xdf, 0xda, 0x86, 0x14, 0xa9, 0x3f, 0x91, + 0x9d, 0xca, 0x4e, 0x52, + 0xae, 0x56, 0x90, 0xdd, 0xca, 0x5e, 0xb2, 0x4f, 0x2a, 0x27, 0x65, 0x96, + 0x4a, 0xbe, 0x4c, 0xda, + 0xc5, 0x97, 0x59, 0xf7, 0xa2, 0x4f, 0xa5, 0x0c, 0x88, 0xf1, 0x32, 0xa8, + 0x67, 0xf6, 0x59, 0xaa, + 0xb9, 0x1e, 0xce, 0x76, 0xbe, 0xc5, 0x1d, 0x51, 0x76, 0x09, 0x3b, 0x6c, + 0x05, 0xb8, 0xdd, 0x98, + 0x9b, 0x46, 0x75, 0xca, 0x6f, 0x67, 0x7c, 0xc0, 0xd4, 0x82, 0x26, 0x43, + 0x7c, 0x9c, 0x4c, 0x92, + 0x69, 0x92, 0x98, 0x49, 0x1a, 0x58, 0xea, 0x93, 0x2c, 0x29, 0x1d, 0xa7, + 0x9a, 0x52, 0xb0, 0x16, + 0x27, 0x32, 0xbe, 0x33, 0x4d, 0xa2, 0xa9, 0x28, 0x19, 0xce, 0x93, 0x0c, + 0xd2, 0xa5, 0xf0, 0x61, + 0x54, 0x54, 0xf0, 0x3d, 0x77, 0x46, 0xae, 0x42, 0x9b, 0xd5, 0xed, 0xb8, + 0xcc, 0xb6, 0x99, 0x2c, + 0xc8, 0x5b, 0x8a, 0x97, 0x17, 0x71, 0x28, 0xdd, 0x19, 0x85, 0xd2, 0xe4, + 0x0c, 0x78, 0x5e, 0x22, + 0x61, 0x1c, 0x8f, 0x24, 0xad, 0xc6, 0x10, 0xcf, 0xf4, 0xb7, 0x48, 0x23, + 0x7b, 0x27, 0x7c, 0x43, + 0xf1, 0xf5, 0x86, 0xf6, 0x85, 0x4d, 0x0d, 0xf5, 0xb4, 0xc7, 0x44, 0xd1, + 0x74, 0xcb, 0x75, 0xe4, + 0x0e, 0xa5, 0x2f, 0x7e, 0x5f, 0xae, 0x40, 0x65, 0xca, 0x72, 0x56, 0x0f, + 0xe2, 0xe6, 0xc9, 0xb3, + 0xd1, 0xb7, 0xd2, 0x77, 0x10, 0xdb, 0x32, 0x34, 0x4b, 0xa0, 0x89, 0xf0, + 0x9d, 0x5d, 0xdc, 0x97, + 0x18, 0x5a, 0xdf, 0xdc, 0x86, 0x0e, 0x16, 0x39, 0x7e, 0x30, 0xe0, 0xde, + 0x9b, 0x96, 0x37, 0xf1, + 0x2b, 0x96, 0x27, 0xf0, 0x23, 0xca, 0xbd, 0xf8, 0x1a, 0x11, 0xec, 0xb0, + 0xe8, 0x9a, 0x21, 0xed, + 0x0a, 0xd2, 0xde, 0x03, 0xd4, 0x25, 0xb1, 0x05, 0x9d, 0x5d, 0x7d, 0xca, + 0x5e, 0x79, 0x3a, 0x2d, + 0x96, 0x9d, 0xd5, 0xe2, 0x91, 0x58, 0x1a, 0x03, 0xfe, 0x61, 0x43, 0xd2, + 0xd6, 0x74, 0x1d, 0xb9, + 0x49, 0x78, 0x1c, 0xb0, 0x6f, 0x20, 0x79, 0xc0, 0x3c, 0x80, 0xdc, 0x3f, + 0xe1, 0xd9, 0x41, 0xb5, + 0x6b, 0xb8, 0xe7, 0xbf, 0x61, 0x3e, 0xe1, 0x2b, 0x3d, 0x3b, 0xd3, 0xf4, + 0x4b, 0xe7, 0xe8, 0xc4, + 0x07, 0x5f, 0x61, 0x8f, 0xf3, 0xd6, 0x35, 0xa8, 0x9a, 0x31, 0xe8, 0xf1, + 0x41, 0xeb, 0x1f, 0xbb, + 0xfd, 0xb5, 0x6d, 0x35, 0xeb, 0xc0, 0xa5, 0x1f, 0x96, 0xbc, 0xee, 0xaf, + 0xef, 0xd9, 0x9b, 0x27, + 0x77, 0x7e, 0xea, 0xd0, 0x67, 0xd9, 0x7d, 0x2d, 0x8b, 0x93, 0x87, 0x26, + 0x3b, 0x53, 0x46, 0x31, + 0x2d, 0xfc, 0x14, 0x2f, 0x1d, 0xfc, 0x18, 0x7b, 0x7a, 0x2e, 0xe3, 0x3f, + 0x85, 0x25, 0xaf, 0x17, + 0xca, 0xbc, 0x45, 0x47, 0x48, 0xf3, 0x16, 0x6b, 0xcc, 0x0f, 0xd6, 0xf4, + 0xef, 0xdd, 0xda, 0xcf, + 0x4c, 0x07, 0x9f, 0xfd, 0x9e, 0xcd, 0xbd, 0xf4, 0xcf, 0x7d, 0x73, 0xf7, + 0x25, 0x3b, 0x52, 0x47, + 0xb1, 0x9c, 0x5a, 0xa0, 0xfc, 0x1a, 0xcb, 0x35, 0xc6, 0x84, 0xa0, 0xf3, + 0xf5, 0xb7, 0x1e, 0x13, + 0xf8, 0x1e, 0xda, 0x7b, 0x2a, 0x31, 0x46, 0x7f, 0x7a, 0x2e, 0x1a, 0xae, + 0xdb, 0x92, 0x73, 0x59, + 0x8f, 0x4c, 0x10, 0xbe, 0x89, 0x8b, 0xfb, 0x66, 0x8f, 0xba, 0x6c, 0xed, + 0x9a, 0x96, 0xa6, 0xef, + 0x5d, 0x67, 0x99, 0xf9, 0x0c, 0xae, 0xb2, 0x57, 0x1a, 0x2a, 0x1c, 0xfb, + 0xb9, 0x72, 0xc7, 0x21, + 0xee, 0xf5, 0xa2, 0x96, 0x86, 0x3e, 0xa3, 0x7b, 0xf1, 0xd7, 0x17, 0x75, + 0x36, 0xb4, 0x52, 0x5a, + 0xf0, 0x4d, 0xcd, 0x10, 0x0b, 0x89, 0x0d, 0x68, 0x33, 0x73, 0x13, 0xd2, + 0xd4, 0xd2, 0x9e, 0xdc, + 0xee, 0xb8, 0x8f, 0xdc, 0x33, 0xb6, 0x37, 0xd7, 0x61, 0x7c, 0x0b, 0x43, + 0xd3, 0xbc, 0x46, 0xa8, + 0xa1, 0x92, 0x45, 0xd2, 0xd4, 0x46, 0xa4, 0x89, 0x92, 0x4e, 0xee, 0x94, + 0xa6, 0xe1, 0x3f, 0xc5, + 0x93, 0x68, 0x37, 0x60, 0xde, 0xee, 0xfc, 0x32, 0x88, 0xad, 0x77, 0x19, + 0x2a, 0xe1, 0x75, 0xb7, + 0xd9, 0x7a, 0xe0, 0x18, 0x9a, 0x05, 0x18, 0xd2, 0x88, 0x74, 0x51, 0x6f, + 0x27, 0xbd, 0x0b, 0xae, + 0xe3, 0x5b, 0x39, 0xda, 0xf0, 0x9d, 0xf2, 0x6f, 0xe0, 0x3b, 0x17, 0x34, + 0x27, 0x59, 0x32, 0xa0, + 0x91, 0x29, 0x59, 0x88, 0x13, 0xc1, 0xb2, 0x45, 0xa6, 0xa3, 0x90, 0x46, + 0xd2, 0x2d, 0xe9, 0xa4, + 0x99, 0xdc, 0x08, 0x77, 0x90, 0x86, 0xa1, 0x25, 0x96, 0x5f, 0xd0, 0x7e, + 0xc0, 0xbc, 0x3d, 0xea, + 0x3e, 0xb4, 0x4f, 0xad, 0x40, 0xe5, 0xf0, 0xf3, 0xbe, 0x82, 0x47, 0x8c, + 0x71, 0x0a, 0x9b, 0xe1, + 0x91, 0x84, 0xe3, 0xa5, 0x78, 0xd8, 0xb1, 0xb8, 0x99, 0xb5, 0x01, 0x16, + 0xa4, 0x0b, 0xb8, 0x4c, + 0x29, 0xc7, 0x65, 0x52, 0x25, 0xde, 0x2d, 0x95, 0xe1, 0xdd, 0xe2, 0x5e, + 0xbc, 0xd7, 0x52, 0x89, + 0xf7, 0x4a, 0xe5, 0xf0, 0xdc, 0x3d, 0xc4, 0xac, 0x64, 0x92, 0x2c, 0xb1, + 0x3e, 0x49, 0x17, 0x01, + 0xd9, 0xc4, 0x24, 0x78, 0x9f, 0x06, 0x28, 0xdd, 0xfe, 0x0a, 0x77, 0x42, + 0x2e, 0xa3, 0xbb, 0xec, + 0x1f, 0xa1, 0x9e, 0xe3, 0x6e, 0x34, 0x34, 0xb5, 0x36, 0xe3, 0x06, 0x9a, + 0x5a, 0x81, 0xff, 0x99, + 0x4a, 0x33, 0xcc, 0x59, 0x02, 0xd3, 0x12, 0x4d, 0x93, 0xe2, 0x69, 0x8c, + 0xc8, 0xbc, 0xdf, 0x28, + 0xb7, 0x46, 0x59, 0x0a, 0x4d, 0x24, 0x69, 0x34, 0x03, 0x30, 0xba, 0xa9, + 0xed, 0x46, 0xfc, 0xa8, + 0x6d, 0x12, 0x3a, 0x28, 0x1d, 0x45, 0x5b, 0x2d, 0xdb, 0xc9, 0x5e, 0xf5, + 0x08, 0x3d, 0xec, 0x5c, + 0x43, 0xbe, 0x2f, 0x90, 0x51, 0xb7, 0xa2, 0x68, 0x3e, 0x5d, 0x6a, 0x88, + 0x33, 0xcc, 0x29, 0x1a, + 0xf6, 0xc5, 0x09, 0xd1, 0xe0, 0x3b, 0xb2, 0xd8, 0x35, 0x1d, 0x3e, 0x47, + 0x2b, 0x72, 0x5d, 0xf1, + 0xcd, 0xc6, 0xeb, 0xc6, 0x35, 0x33, 0x34, 0xb0, 0x03, 0xb6, 0x5a, 0x92, + 0x49, 0x9a, 0xd8, 0x9c, + 0x34, 0x95, 0x9f, 0xc0, 0xc5, 0xf2, 0x62, 0x5c, 0xa1, 0xac, 0xe3, 0x57, + 0xaa, 0xab, 0xb8, 0x25, + 0xea, 0x22, 0x6e, 0x81, 0x3c, 0x13, 0x4d, 0x97, 0xbe, 0x27, 0x9c, 0x18, + 0x2d, 0xc4, 0x09, 0xc9, + 0xf0, 0x39, 0x92, 0xe1, 0xf5, 0x98, 0x56, 0x02, 0xcb, 0xd7, 0xb6, 0xa4, + 0xaf, 0x88, 0x43, 0xf9, + 0x37, 0xc4, 0x37, 0xd1, 0x1b, 0xe2, 0x6b, 0xe4, 0x71, 0xe5, 0x0e, 0xdc, + 0x63, 0x52, 0xcf, 0x57, + 0xee, 0x5b, 0xf9, 0x62, 0x3f, 0x0f, 0xae, 0xdc, 0x5c, 0x1c, 0xfd, 0x6e, + 0xf4, 0x47, 0xf7, 0xbf, + 0x5e, 0x1b, 0xcb, 0x34, 0x9d, 0xd1, 0x05, 0x37, 0xfc, 0x2b, 0x46, 0x48, + 0x01, 0xbf, 0xaf, 0x33, + 0xb9, 0x45, 0xf8, 0x17, 0x79, 0x82, 0x3e, 0x42, 0xfe, 0x65, 0x02, 0xec, + 0x13, 0xee, 0xc5, 0x77, + 0x17, 0x3d, 0x3a, 0x98, 0x3d, 0x67, 0xca, 0xd8, 0x8b, 0x97, 0x74, 0xaa, + 0x26, 0x19, 0x34, 0x9f, + 0x30, 0xc3, 0xe2, 0xe5, 0x3f, 0x8c, 0xb9, 0xe5, 0x9d, 0x3a, 0x3d, 0xd0, + 0x53, 0x07, 0x69, 0xf8, + 0xd5, 0x68, 0xfa, 0xff, 0x3d, 0xe1, 0x89, 0xb9, 0xfd, 0xf6, 0x3d, 0xbb, + 0xf5, 0xb0, 0xea, 0xf8, + 0x8f, 0x1b, 0x9e, 0xb8, 0x8d, 0xe5, 0xbe, 0x62, 0x15, 0x57, 0x3f, 0x1e, + 0x9b, 0xa3, 0x9e, 0x5e, + 0x98, 0x3e, 0x22, 0xbd, 0x28, 0x7d, 0x04, 0xab, 0x3d, 0x64, 0xe4, 0x25, + 0xe5, 0xf8, 0xcd, 0xaf, + 0x85, 0x9a, 0xd7, 0xd3, 0x33, 0x6f, 0x51, 0x97, 0x7e, 0x93, 0xbf, 0x1c, + 0x56, 0x24, 0x89, 0x32, + 0x47, 0xe1, 0x68, 0x39, 0x06, 0xc5, 0xda, 0xe3, 0x38, 0x56, 0xef, 0xf0, + 0x70, 0xdf, 0xa2, 0xcd, + 0x41, 0x75, 0xbe, 0x34, 0x2c, 0xba, 0xa4, 0x83, 0x5f, 0xb3, 0x47, 0xbb, + 0xba, 0x6e, 0xa2, 0xe1, + 0x42, 0x4c, 0x6e, 0x64, 0x90, 0xb9, 0xf2, 0xba, 0xb5, 0xea, 0x75, 0xcd, + 0xa0, 0xd4, 0xa1, 0x55, + 0x5f, 0xe7, 0x98, 0xf8, 0xd6, 0x73, 0xd1, 0xc7, 0x37, 0xd1, 0xcb, 0x71, + 0x89, 0x45, 0x01, 0xb4, + 0x6b, 0x48, 0x1f, 0xe1, 0x3b, 0xad, 0x96, 0xfb, 0xa7, 0xe9, 0x0c, 0x3a, + 0x60, 0xab, 0xe2, 0x8f, + 0xda, 0xc7, 0xf3, 0xb7, 0x03, 0x3e, 0xdd, 0xee, 0xe8, 0x45, 0x6e, 0x55, + 0x7a, 0xe3, 0x3b, 0xa4, + 0xdb, 0xc9, 0x1d, 0x62, 0x5f, 0x7a, 0xbb, 0x34, 0x40, 0xf8, 0xb7, 0xfc, + 0x30, 0x7a, 0x54, 0x19, + 0x80, 0xee, 0x73, 0xbc, 0x88, 0x5e, 0xb5, 0xdf, 0x8e, 0x1f, 0x28, 0xb8, + 0x8f, 0xbb, 0xa3, 0xf0, + 0x4e, 0xee, 0xb6, 0xbc, 0x1e, 0xb8, 0x8b, 0xb5, 0x2b, 0x7e, 0xca, 0x32, + 0x9a, 0x9c, 0x12, 0x2f, + 0x92, 0xfd, 0x8e, 0x03, 0xdc, 0x7e, 0x47, 0x95, 0xf1, 0x80, 0xe3, 0x80, + 0xe1, 0x80, 0x73, 0x9f, + 0xe1, 0x80, 0x7d, 0x2f, 0x47, 0x94, 0x96, 0xb8, 0xa9, 0xd8, 0x06, 0xb5, + 0x95, 0x3b, 0xe1, 0xee, + 0x6a, 0x77, 0x7c, 0x9d, 0xbd, 0x2b, 0xbe, 0x55, 0xee, 0x81, 0x7b, 0x58, + 0x6f, 0xc5, 0xb7, 0xe6, + 0xdf, 0xcc, 0xdf, 0xa4, 0x5c, 0x8f, 0xda, 0xc8, 0x6d, 0xc9, 0x9d, 0xf6, + 0x87, 0xf1, 0xbd, 0xb6, + 0xde, 0xa8, 0xab, 0xd4, 0x0e, 0x37, 0x92, 0x52, 0xf0, 0x0d, 0xca, 0x50, + 0xf4, 0x95, 0x74, 0x0e, + 0x9d, 0x92, 0x77, 0x70, 0xe5, 0x4a, 0x39, 0x5f, 0xae, 0xec, 0xe1, 0x2b, + 0x95, 0x32, 0x6e, 0x87, + 0x7c, 0x8c, 0x1f, 0x6d, 0x6d, 0x84, 0x18, 0x17, 0xb7, 0x91, 0xb5, 0x09, + 0xdf, 0xd9, 0x7a, 0x3b, + 0xba, 0xd9, 0xd6, 0x91, 0x6f, 0xa6, 0x44, 0x22, 0xc0, 0x3f, 0xb4, 0x4b, + 0xde, 0xc5, 0xef, 0x00, + 0xbc, 0x2b, 0xb7, 0xec, 0x44, 0x3b, 0xcc, 0xa5, 0x7c, 0xa5, 0xa5, 0x02, + 0x55, 0x48, 0xbb, 0xf0, + 0x3e, 0x79, 0x1b, 0xfd, 0x97, 0x1c, 0x45, 0x12, 0xe5, 0x34, 0x94, 0x29, + 0x37, 0xc6, 0xad, 0xe4, + 0x86, 0x28, 0xde, 0x12, 0x05, 0x3e, 0xf7, 0x8b, 0xe8, 0x84, 0x54, 0x85, + 0x37, 0xaa, 0xfd, 0x70, + 0x8c, 0x3d, 0x99, 0x8f, 0x82, 0x6b, 0x71, 0xa2, 0x25, 0x0e, 0x45, 0xca, + 0x91, 0x38, 0xde, 0x9a, + 0x81, 0x32, 0xd5, 0x06, 0xa4, 0x99, 0xd4, 0x81, 0x76, 0x14, 0xd3, 0x00, + 0x9f, 0x3b, 0xd1, 0x01, + 0x96, 0x01, 0xf4, 0x7a, 0x4b, 0x03, 0x9a, 0x62, 0x8e, 0xa1, 0x11, 0x4a, + 0x5b, 0xf2, 0xbc, 0x7d, + 0x1c, 0xda, 0x2c, 0x9e, 0x46, 0xdb, 0xa4, 0x2d, 0x68, 0xbb, 0xb2, 0x8d, + 0x2e, 0xb7, 0x8f, 0x26, + 0x0f, 0xa9, 0x37, 0xe0, 0xf6, 0xf0, 0xfc, 0x08, 0xc0, 0x65, 0xb8, 0x7e, + 0xe3, 0x24, 0xc0, 0xb6, + 0x0c, 0x31, 0x9b, 0x36, 0x92, 0x5a, 0xa2, 0xe6, 0x72, 0x2b, 0xd4, 0x42, + 0x6a, 0x80, 0x9a, 0xa9, + 0xdd, 0x85, 0x07, 0xf2, 0xba, 0xf3, 0x1d, 0x1d, 0x37, 0xa3, 0xeb, 0xa5, + 0x06, 0x42, 0xa2, 0x18, + 0x0b, 0x78, 0xdc, 0x09, 0x19, 0xe5, 0x39, 0x7c, 0x95, 0xb2, 0x13, 0xad, + 0x52, 0x57, 0xf3, 0xcb, + 0xd4, 0xa5, 0xdc, 0x22, 0x65, 0x3e, 0x37, 0x47, 0xfa, 0x0e, 0x4d, 0x13, + 0x27, 0xe1, 0x07, 0x4d, + 0x91, 0x42, 0x2c, 0x8b, 0xbb, 0xc5, 0x14, 0xcc, 0xf4, 0x0d, 0x32, 0xcc, + 0x31, 0x24, 0xdd, 0xdc, + 0x98, 0x3e, 0x6b, 0x7e, 0x07, 0xbf, 0x6c, 0x7b, 0x6a, 0xd4, 0x83, 0x5f, + 0x3f, 0xfc, 0xcc, 0xd3, + 0xee, 0xba, 0x43, 0x8d, 0xbd, 0xea, 0xbe, 0xbe, 0xe9, 0x53, 0x5e, 0x7a, + 0xbe, 0x76, 0x8c, 0xaa, + 0xf5, 0xe3, 0xad, 0xbc, 0xbb, 0x5f, 0x22, 0xc4, 0xf8, 0xd7, 0x0a, 0xfd, + 0xc8, 0x23, 0xf4, 0x41, + 0x72, 0xbf, 0xe9, 0x3e, 0x7c, 0x1f, 0x60, 0xdf, 0x3d, 0x42, 0x5f, 0xdc, + 0x47, 0xbd, 0x77, 0x54, + 0x9d, 0xb8, 0xf4, 0xc3, 0x31, 0x1a, 0x8e, 0xb6, 0x76, 0x44, 0x5c, 0xca, + 0xb3, 0x3b, 0x5b, 0x0f, + 0x67, 0xf7, 0x8d, 0xf9, 0xf0, 0xe2, 0xeb, 0xb5, 0x7b, 0xa0, 0x9b, 0xe6, + 0x25, 0x0d, 0x7b, 0x64, + 0x9d, 0x8f, 0xcf, 0xe4, 0xce, 0x0d, 0xda, 0x67, 0xcd, 0x78, 0xb4, 0xd4, + 0x71, 0x7e, 0x44, 0xed, + 0xf8, 0x58, 0xeb, 0xb7, 0xfe, 0xa1, 0xf5, 0x40, 0x6f, 0x8e, 0x46, 0x75, + 0xdd, 0xb5, 0x80, 0xe9, + 0xe0, 0x67, 0x6a, 0x7d, 0x67, 0xac, 0xe7, 0xc2, 0x93, 0x5f, 0xab, 0x33, + 0x67, 0xf2, 0x0a, 0x72, + 0x58, 0x7e, 0xe6, 0xaa, 0xe9, 0xe0, 0x79, 0xe9, 0xc9, 0x61, 0x01, 0x16, + 0xaa, 0x71, 0xbc, 0x36, + 0xf7, 0xed, 0x32, 0xb8, 0x6f, 0x3e, 0xf5, 0x5c, 0xc0, 0x9f, 0x62, 0xdf, + 0x35, 0xb3, 0x28, 0x75, + 0x84, 0xdf, 0xf9, 0xc1, 0x5e, 0x9a, 0x56, 0x57, 0x92, 0xeb, 0xbc, 0xbc, + 0x63, 0x92, 0xe9, 0x1b, + 0x8b, 0x6a, 0xf3, 0x4d, 0xc6, 0x05, 0xe3, 0x9b, 0x44, 0x84, 0x4d, 0xa7, + 0xfb, 0x49, 0x61, 0xa7, + 0x76, 0xae, 0xfd, 0x69, 0x3e, 0x8d, 0x8f, 0x2a, 0x2b, 0xf0, 0x6a, 0x79, + 0x0b, 0xde, 0x28, 0x6f, + 0x21, 0x9b, 0xa4, 0xad, 0x78, 0x8b, 0xba, 0x89, 0x6c, 0x54, 0x37, 0x93, + 0x2d, 0xd6, 0x5d, 0xa4, + 0x52, 0xd9, 0x8b, 0xf7, 0x48, 0xdb, 0xf1, 0x6a, 0x75, 0x2b, 0xf8, 0x55, + 0x5b, 0xe8, 0x2e, 0xeb, + 0x36, 0x7e, 0x93, 0x63, 0xbd, 0x71, 0xb5, 0x6d, 0x1d, 0x5a, 0xa7, 0xae, + 0x44, 0xa7, 0x01, 0xfb, + 0x8e, 0xdb, 0xf7, 0x03, 0x8e, 0x1e, 0xe6, 0x8e, 0xda, 0x8e, 0x73, 0x87, + 0xad, 0x87, 0x0c, 0xc7, + 0x6c, 0x47, 0x0c, 0x07, 0x01, 0xff, 0x66, 0xab, 0x73, 0xd0, 0x62, 0xb5, + 0x04, 0x2d, 0x84, 0x3d, + 0x47, 0x9d, 0x0d, 0x7b, 0x1e, 0x5e, 0x28, 0x2f, 0x21, 0x4b, 0xd4, 0x05, + 0x64, 0x81, 0x6d, 0xa9, + 0x71, 0xb1, 0xb5, 0xc4, 0xf8, 0x83, 0x75, 0x0e, 0xb7, 0x26, 0x6f, 0x1d, + 0x5a, 0xe9, 0x58, 0xc2, + 0x97, 0x28, 0x73, 0xd1, 0x6c, 0x79, 0x2a, 0xfa, 0x41, 0xfa, 0x0d, 0xff, + 0xc7, 0xb2, 0x87, 0xdf, + 0xa5, 0x94, 0x73, 0x95, 0xf2, 0x1e, 0xd8, 0x95, 0x5c, 0x19, 0xe0, 0xdf, + 0x2e, 0x79, 0x3f, 0x3f, + 0x55, 0x9e, 0x80, 0xbf, 0x96, 0x3f, 0x33, 0x7e, 0x29, 0x7f, 0xcf, 0x95, + 0xc8, 0xcb, 0xb8, 0xc5, + 0xf2, 0x2c, 0x6e, 0xaa, 0x32, 0x89, 0xff, 0x51, 0x39, 0x80, 0xca, 0xa4, + 0x9d, 0x7c, 0xa9, 0xb4, + 0x0b, 0xed, 0x06, 0xdc, 0x2b, 0x17, 0xcb, 0x50, 0xa9, 0xa5, 0x8c, 0xdf, + 0x25, 0xed, 0x40, 0xe5, + 0xd2, 0x36, 0xfc, 0x99, 0xe5, 0x63, 0xfc, 0x89, 0xe5, 0x73, 0xf4, 0x95, + 0xe5, 0x1b, 0x34, 0xcd, + 0xf2, 0x35, 0xfa, 0x44, 0x9a, 0xc0, 0x7f, 0x20, 0xcd, 0xe3, 0x77, 0x4b, + 0x7b, 0xf8, 0x1f, 0x25, + 0x01, 0x99, 0xc5, 0x02, 0x24, 0x58, 0x46, 0x20, 0xbb, 0x68, 0xe2, 0x78, + 0x89, 0xe3, 0x78, 0x85, + 0x70, 0x66, 0xd9, 0x86, 0x8b, 0xe4, 0x2f, 0xf0, 0x38, 0x79, 0x24, 0x1e, + 0x26, 0x7f, 0x82, 0x57, + 0xc9, 0x8b, 0xc9, 0x44, 0xd9, 0x8c, 0x47, 0xc9, 0xef, 0xe1, 0x41, 0x92, + 0x8c, 0x37, 0xcb, 0x67, + 0x50, 0x95, 0x6d, 0x3b, 0xbf, 0x59, 0xdd, 0xc4, 0xef, 0x92, 0xd7, 0xe0, + 0x31, 0xf2, 0x9b, 0xe4, + 0x11, 0x79, 0x00, 0x7a, 0xd2, 0xf2, 0x3a, 0xff, 0xaa, 0xf9, 0x35, 0x7e, + 0x90, 0xf4, 0x1a, 0xff, + 0xba, 0xfc, 0x26, 0x3f, 0x54, 0xe1, 0xb1, 0x6c, 0x95, 0x79, 0x62, 0xe5, + 0xf8, 0x37, 0xac, 0xcf, + 0xf0, 0x2f, 0xa9, 0x26, 0x22, 0xc9, 0x6f, 0xe2, 0x51, 0x16, 0x07, 0x21, + 0x96, 0x17, 0xc9, 0xd3, + 0x96, 0x27, 0xf1, 0x0b, 0xf2, 0xb7, 0xdc, 0x69, 0x4b, 0x39, 0x7c, 0x8f, + 0x35, 0xfc, 0x3a, 0x75, + 0x39, 0xb7, 0x58, 0x59, 0x68, 0x9c, 0x07, 0xdf, 0x6d, 0x06, 0x7c, 0xde, + 0xef, 0xc4, 0x7c, 0x7c, + 0x93, 0xb9, 0x0b, 0xbe, 0x51, 0xbc, 0x11, 0x75, 0x13, 0x7b, 0xe2, 0x1b, + 0x4c, 0xdd, 0x70, 0x1f, + 0x53, 0x57, 0xd2, 0x2a, 0xef, 0xb6, 0x61, 0xaf, 0xce, 0x7e, 0xfd, 0x91, + 0xd7, 0x6a, 0xeb, 0xaf, + 0xb8, 0x79, 0x15, 0x63, 0x56, 0x0f, 0xba, 0x8b, 0xfd, 0xfc, 0xd4, 0xe2, + 0xc7, 0xb5, 0x98, 0x73, + 0xa3, 0xe3, 0x62, 0x35, 0xd6, 0xb8, 0x78, 0xba, 0xcf, 0xf5, 0x6a, 0x2c, + 0xdc, 0x4c, 0x06, 0xd0, + 0x01, 0xa4, 0xbf, 0xa9, 0x3f, 0xee, 0x2f, 0xdc, 0x8d, 0xfb, 0x31, 0xec, + 0xa3, 0x77, 0xe0, 0xdb, + 0x69, 0x6f, 0x5c, 0xa7, 0xb7, 0xb9, 0xb0, 0x64, 0x08, 0xbb, 0xef, 0x56, + 0xaf, 0xde, 0xe4, 0x48, + 0x4b, 0x92, 0x56, 0xab, 0x18, 0x3a, 0xf9, 0xe2, 0xf3, 0xb5, 0x7b, 0xa0, + 0xbb, 0x15, 0x47, 0xbc, + 0x1b, 0x31, 0xb6, 0xe7, 0xdb, 0xb5, 0x79, 0x6e, 0x01, 0xf5, 0xb0, 0xf2, + 0x57, 0x0c, 0xd3, 0xf8, + 0x73, 0x5f, 0x44, 0xbc, 0xe0, 0x3b, 0xa7, 0x14, 0x8d, 0x52, 0x0a, 0x33, + 0x47, 0xb2, 0xb9, 0x70, + 0xcc, 0xfe, 0xb3, 0xc6, 0xfa, 0xd0, 0x73, 0x61, 0x7d, 0xc9, 0x12, 0xe3, + 0x79, 0x65, 0x04, 0xcd, + 0x27, 0x85, 0xa2, 0x69, 0x15, 0xb4, 0x37, 0x4d, 0xd2, 0x97, 0xc3, 0x8a, + 0x54, 0xe2, 0xf9, 0xd0, + 0xb8, 0x6f, 0xbe, 0xf3, 0x7a, 0x97, 0x74, 0xf0, 0xfd, 0xe8, 0x25, 0xd7, + 0xd6, 0xc1, 0xb7, 0xe8, + 0xcc, 0xeb, 0x39, 0x02, 0xe7, 0xf5, 0x42, 0xec, 0xd7, 0xe3, 0xbc, 0x67, + 0x50, 0xfa, 0x8f, 0xa5, + 0xe1, 0x3d, 0x0b, 0x92, 0x46, 0xfa, 0xd5, 0x73, 0x71, 0xd7, 0x4d, 0x74, + 0xe5, 0x34, 0x74, 0x69, + 0x52, 0xb7, 0xa0, 0xf9, 0xc2, 0x39, 0x13, 0x3b, 0xe7, 0x2e, 0x98, 0x7e, + 0xc6, 0x3f, 0x5b, 0xce, + 0x71, 0xbf, 0x9a, 0x7f, 0xe3, 0x7e, 0x16, 0x2f, 0x70, 0xbf, 0x99, 0x7f, + 0x25, 0xbf, 0x9b, 0x7e, + 0xc3, 0x17, 0xc4, 0x73, 0xe8, 0x67, 0xf3, 0x1f, 0xf8, 0x82, 0xf9, 0x02, + 0x81, 0x9f, 0xc9, 0x69, + 0xcb, 0x6f, 0xf8, 0xac, 0x74, 0x8e, 0xff, 0x59, 0x3a, 0x43, 0x4e, 0x49, + 0xe7, 0xe1, 0x31, 0xbf, + 0x93, 0xa3, 0xd6, 0xc3, 0xe8, 0xb8, 0x7a, 0x18, 0x1d, 0xb6, 0x1e, 0xe3, + 0x4f, 0x2a, 0x27, 0x8d, + 0x47, 0x95, 0x23, 0xc6, 0xe3, 0xea, 0x21, 0xee, 0xa0, 0xfd, 0x08, 0x77, + 0xd6, 0xf2, 0x2b, 0x7f, + 0xc1, 0xfc, 0x0b, 0xfa, 0xd9, 0xf2, 0x33, 0x3a, 0x6f, 0x39, 0x87, 0x4e, + 0xcb, 0xda, 0x73, 0xf9, + 0xb3, 0xf2, 0x19, 0xee, 0x94, 0x74, 0xda, 0x70, 0x52, 0x3d, 0xce, 0x9d, + 0x93, 0x4e, 0xa2, 0x83, + 0x72, 0x15, 0x7f, 0x58, 0x39, 0xc9, 0x9f, 0x96, 0x7e, 0xe6, 0xcf, 0x41, + 0xcc, 0x7b, 0x4e, 0xae, + 0x44, 0x65, 0x6a, 0x25, 0xb7, 0x47, 0xa9, 0x34, 0xee, 0x95, 0xf7, 0xc0, + 0xde, 0x6b, 0xdc, 0x03, + 0xb7, 0xe0, 0x03, 0xc2, 0x63, 0xce, 0xe1, 0xb3, 0xca, 0x09, 0xee, 0xa8, + 0x7c, 0xd8, 0x78, 0x18, + 0xde, 0xeb, 0xb0, 0x72, 0xc0, 0x78, 0x48, 0xfe, 0x99, 0x3f, 0xa2, 0xec, + 0xe0, 0x2b, 0x00, 0x33, + 0xcb, 0xc1, 0x07, 0xdc, 0x25, 0xed, 0xe6, 0x77, 0x03, 0xf6, 0x95, 0x4a, + 0xa5, 0x80, 0x99, 0xbb, + 0xb9, 0x52, 0xcb, 0x2e, 0x74, 0x12, 0x3e, 0xc3, 0x19, 0xf9, 0x0c, 0x7f, + 0x52, 0x3e, 0xc1, 0x1f, + 0x93, 0x4f, 0x72, 0x67, 0xa4, 0xb3, 0xdc, 0x2f, 0xe2, 0x61, 0x7e, 0xab, + 0x65, 0x27, 0xb7, 0xd7, + 0x72, 0x96, 0x3f, 0x6f, 0x39, 0x8b, 0xcf, 0x8b, 0xbf, 0xe0, 0x73, 0xe6, + 0xdf, 0xd1, 0x05, 0xf3, + 0xaf, 0xf8, 0x9c, 0x74, 0x0a, 0xfd, 0x24, 0x1d, 0x87, 0xc7, 0x1e, 0x86, + 0xd7, 0x3e, 0xcd, 0x9f, + 0x91, 0x0f, 0xf1, 0xbb, 0xe1, 0xb5, 0xf7, 0xc9, 0x47, 0xf9, 0x9f, 0x94, + 0x93, 0xf0, 0xbb, 0x9f, + 0x20, 0xb6, 0xde, 0x84, 0xb6, 0x5a, 0xb7, 0x73, 0xdb, 0xd5, 0x2d, 0x46, + 0xf0, 0xff, 0x50, 0x99, + 0x7c, 0x0c, 0x9d, 0x81, 0xcf, 0x77, 0xde, 0x72, 0x9e, 0x87, 0xef, 0x6c, + 0x84, 0xef, 0x6a, 0x80, + 0xef, 0x6a, 0x3c, 0xae, 0xb0, 0x3e, 0xc7, 0x63, 0xfc, 0x51, 0xf5, 0x08, + 0x7f, 0x40, 0x3d, 0xc1, + 0x9f, 0x82, 0xcf, 0xbe, 0x57, 0x39, 0x44, 0x8e, 0x5b, 0xf7, 0xe0, 0xfd, + 0xf2, 0x51, 0xee, 0xa8, + 0x72, 0x94, 0x3b, 0xa6, 0xec, 0x37, 0xae, 0x53, 0xd7, 0x03, 0xf6, 0xad, + 0xe3, 0xd7, 0x2a, 0xab, + 0x8c, 0xcb, 0xe4, 0x25, 0xc6, 0xf9, 0xf2, 0x6c, 0x7e, 0xba, 0x65, 0x1a, + 0xfa, 0x52, 0x1c, 0x8f, + 0x3f, 0x10, 0xdf, 0xe7, 0x0a, 0x44, 0x07, 0xaf, 0x98, 0x45, 0x34, 0xea, + 0xc3, 0x21, 0xaf, 0xbf, + 0xbd, 0x64, 0xd0, 0xbd, 0xbe, 0xfc, 0x2a, 0xe6, 0x53, 0x6d, 0xcc, 0x3b, + 0xff, 0x5e, 0x0d, 0x2e, + 0xc6, 0x96, 0x97, 0x6f, 0xf5, 0xc7, 0xd3, 0xed, 0x2b, 0xf6, 0xe3, 0xfb, + 0x08, 0x77, 0x01, 0xee, + 0xf5, 0xc3, 0x7d, 0xe9, 0x5d, 0x80, 0x7d, 0x77, 0xe2, 0xdb, 0x85, 0xde, + 0xf8, 0x56, 0xda, 0x13, + 0x3f, 0xcb, 0xe6, 0x51, 0x7a, 0xf7, 0x40, 0xbb, 0xeb, 0xc6, 0x0f, 0x4d, + 0x8c, 0x78, 0xc5, 0xe3, + 0x03, 0x30, 0xad, 0x94, 0x67, 0x98, 0xbf, 0xf6, 0xed, 0x89, 0x27, 0xab, + 0x1f, 0xe7, 0xd8, 0x38, + 0x82, 0x3d, 0xae, 0xff, 0x87, 0x11, 0xaf, 0x27, 0x7d, 0xf5, 0x7f, 0xcf, + 0x78, 0xf0, 0xb8, 0xe4, + 0xc3, 0xd2, 0xd7, 0x83, 0xf6, 0xbe, 0xb8, 0x79, 0x72, 0x1d, 0xf3, 0x23, + 0xde, 0xf3, 0xcb, 0x73, + 0x85, 0xb8, 0x29, 0x5e, 0x8c, 0xe0, 0xbd, 0xf3, 0x6b, 0xbe, 0xfa, 0x92, + 0x99, 0x0d, 0xc4, 0xfa, + 0xd7, 0x73, 0x09, 0x21, 0xaf, 0x17, 0x8a, 0x7e, 0x53, 0xf0, 0x1e, 0x14, + 0x56, 0xf7, 0x8d, 0x30, + 0x33, 0xee, 0x5b, 0x9c, 0x3e, 0xee, 0x5b, 0x30, 0xad, 0x7a, 0xb7, 0x3e, + 0x34, 0xf3, 0x97, 0xfc, + 0xe9, 0xb9, 0x68, 0x75, 0x13, 0xa5, 0x5a, 0xe7, 0x8b, 0x5e, 0x79, 0xae, + 0x33, 0xfc, 0x9a, 0x56, + 0x99, 0x36, 0x97, 0x76, 0xae, 0x5f, 0xbe, 0x09, 0xf3, 0xf7, 0xe1, 0x3d, + 0x93, 0x6d, 0x71, 0x01, + 0xe7, 0x9b, 0xe8, 0xe5, 0xb8, 0xc4, 0x49, 0x3d, 0x90, 0x2b, 0x12, 0xbe, + 0x48, 0xcf, 0x4b, 0x27, + 0xd0, 0x31, 0x15, 0xec, 0x5d, 0x3d, 0x85, 0xce, 0x4a, 0xa7, 0xe9, 0x59, + 0xe9, 0x0c, 0x05, 0x8c, + 0x22, 0xe7, 0xcc, 0xc7, 0x69, 0x95, 0x58, 0x45, 0x0f, 0x4a, 0x27, 0xe8, + 0x31, 0xf9, 0x38, 0x3e, + 0x21, 0x1f, 0x47, 0x80, 0x1f, 0xe4, 0x84, 0xf5, 0x38, 0xc3, 0x3d, 0xfe, + 0x28, 0xd8, 0xf5, 0x4f, + 0xea, 0x49, 0xfe, 0xa4, 0x7a, 0x92, 0x3b, 0x0e, 0x78, 0x06, 0x36, 0xce, + 0xc1, 0xeb, 0x70, 0x27, + 0xac, 0x87, 0x8c, 0x47, 0xad, 0x47, 0x8c, 0x47, 0xd4, 0x63, 0xdc, 0x21, + 0x2b, 0xe0, 0xa1, 0xf5, + 0x00, 0x77, 0x50, 0x3e, 0x68, 0x3c, 0xac, 0xee, 0xe7, 0x0e, 0x28, 0x87, + 0x8c, 0x07, 0xa5, 0x2a, + 0x6e, 0xaf, 0x02, 0xbe, 0x1d, 0xf8, 0x5f, 0xe0, 0xaf, 0x71, 0x7b, 0xa5, + 0x0a, 0x63, 0x85, 0x5c, + 0x65, 0xac, 0x92, 0xcb, 0xb9, 0x0a, 0xf0, 0xf9, 0xf6, 0x2a, 0x7b, 0xb9, + 0xbd, 0x72, 0x25, 0xfc, + 0x7f, 0x2f, 0xf8, 0x7f, 0x15, 0xc6, 0xfd, 0xf0, 0xf3, 0x6e, 0xc0, 0xb2, + 0x4a, 0x09, 0x7c, 0x3a, + 0xb9, 0x8c, 0x2b, 0x55, 0xb6, 0x72, 0x3b, 0xc1, 0x3f, 0x2c, 0x53, 0xb6, + 0x73, 0x5b, 0xe1, 0xff, + 0x15, 0xf2, 0x2e, 0xae, 0x5c, 0xda, 0xcb, 0x95, 0x49, 0x7b, 0xb8, 0x7d, + 0xb0, 0x2b, 0xe0, 0x35, + 0x2b, 0x2c, 0x80, 0x7d, 0x52, 0x05, 0xb7, 0x1b, 0x9e, 0x53, 0x06, 0xb7, + 0x15, 0xe0, 0x43, 0xee, + 0x84, 0x5d, 0x0a, 0x8f, 0xdd, 0xa1, 0xec, 0x42, 0xa5, 0xf2, 0x6e, 0xb4, + 0x5b, 0x2e, 0x85, 0xdf, + 0x55, 0xf2, 0x65, 0x32, 0xc4, 0xd8, 0xf0, 0xff, 0x32, 0xa9, 0x94, 0x94, + 0x4b, 0xe5, 0x78, 0x97, + 0xbc, 0x9d, 0x94, 0x4a, 0x65, 0x68, 0xa7, 0xb4, 0x83, 0xdf, 0x29, 0x6f, + 0xe7, 0x77, 0x00, 0xbe, + 0x6e, 0x85, 0xbd, 0x5d, 0xd9, 0xca, 0x6f, 0x55, 0xb7, 0xa2, 0xcd, 0xf2, + 0x36, 0x7e, 0x8b, 0xb4, + 0x8d, 0xdf, 0x26, 0x03, 0xfe, 0x59, 0x77, 0xf0, 0xbb, 0x6c, 0xbb, 0x50, + 0x99, 0xad, 0x14, 0xed, + 0x50, 0xcb, 0xb8, 0x72, 0x2b, 0xbc, 0x87, 0x6d, 0x3b, 0xb7, 0x4b, 0xd9, + 0x6d, 0x2c, 0x55, 0x4a, + 0x8d, 0x3b, 0x95, 0x1d, 0xf0, 0x19, 0x2a, 0xb8, 0x5d, 0x12, 0xfb, 0x8c, + 0xbb, 0xb8, 0x0a, 0xa9, + 0xcc, 0xb8, 0x4b, 0xa9, 0xe0, 0xcb, 0xd4, 0x5d, 0xec, 0xbb, 0x18, 0x77, + 0x40, 0x9c, 0xbf, 0x45, + 0xd9, 0xc6, 0x6d, 0x53, 0xd6, 0x71, 0x6b, 0xd4, 0x75, 0xdc, 0x6a, 0x75, + 0x25, 0xb7, 0x54, 0x9e, + 0xcf, 0xcd, 0xb7, 0xcc, 0xe4, 0xbf, 0xb3, 0x4c, 0xe5, 0x3f, 0x13, 0xc7, + 0xa3, 0x31, 0x62, 0x3e, + 0xaf, 0x16, 0x1a, 0x87, 0xbe, 0xb3, 0xd6, 0xc7, 0xfc, 0x20, 0x2f, 0xfd, + 0x95, 0xda, 0x78, 0xe2, + 0xcd, 0x3b, 0xab, 0xc1, 0xd3, 0x75, 0xc7, 0xb2, 0xf7, 0x3b, 0x7a, 0x0d, + 0xbf, 0x1d, 0xfc, 0xbd, + 0x3b, 0x01, 0xf7, 0xee, 0xa4, 0xb7, 0x83, 0xdf, 0x77, 0x1b, 0xee, 0x25, + 0xf4, 0xc4, 0xdd, 0x69, + 0x77, 0xf2, 0xb0, 0x96, 0x23, 0x2c, 0x19, 0x50, 0xb7, 0x07, 0x3a, 0xf2, + 0x99, 0x6a, 0xfc, 0x83, + 0x38, 0xab, 0xef, 0xca, 0x5a, 0x3d, 0xd0, 0xee, 0xfe, 0x95, 0xa7, 0x27, + 0x45, 0xbc, 0xa0, 0xe9, + 0xc0, 0xe8, 0xec, 0x85, 0x66, 0x7a, 0x58, 0x5a, 0x5e, 0x72, 0xeb, 0xcb, + 0x3d, 0x02, 0xd9, 0x1d, + 0xcb, 0x81, 0xd5, 0xcc, 0x6d, 0xd7, 0xd4, 0x73, 0xc9, 0xf6, 0xc6, 0x42, + 0xff, 0x7a, 0x2e, 0xfa, + 0xf3, 0x7a, 0xe6, 0xf0, 0xf6, 0xa6, 0x31, 0xcd, 0xe7, 0x08, 0x8b, 0x3e, + 0xee, 0x5b, 0x28, 0xfd, + 0x7a, 0xae, 0xcf, 0xe7, 0x7b, 0x7e, 0xb0, 0xa7, 0x6e, 0xc2, 0xf0, 0x2f, + 0xde, 0x7f, 0x7e, 0xad, + 0x7a, 0xd6, 0x9c, 0xde, 0x63, 0x12, 0x13, 0xae, 0x7e, 0x3d, 0xdf, 0x1c, + 0x17, 0x52, 0x43, 0x07, + 0xdf, 0x9b, 0x6f, 0xa2, 0xd5, 0x4d, 0x92, 0x7d, 0xd6, 0xc3, 0x75, 0x6b, + 0x52, 0x17, 0x66, 0x8f, + 0x88, 0xb3, 0x3c, 0x83, 0xb6, 0x68, 0x18, 0xf8, 0x07, 0x39, 0x6f, 0x39, + 0x43, 0xce, 0x8b, 0x67, + 0xc9, 0x59, 0xcb, 0x69, 0x72, 0x56, 0xfc, 0x85, 0x82, 0x2f, 0x46, 0x7e, + 0x65, 0x3f, 0x4b, 0xa7, + 0xc8, 0x11, 0xe9, 0x27, 0x72, 0x46, 0xfa, 0x09, 0x9d, 0x90, 0x4f, 0xa2, + 0xe3, 0xd2, 0x71, 0x7c, + 0x9c, 0xf9, 0x51, 0xca, 0x21, 0xf0, 0xdb, 0x4e, 0x68, 0x3e, 0xd5, 0x4f, + 0xd2, 0x49, 0x1e, 0xb0, + 0x91, 0xfd, 0xcc, 0x81, 0x1f, 0x08, 0xfe, 0x19, 0xe0, 0xa1, 0x72, 0x04, + 0xf0, 0xf0, 0x28, 0xc7, + 0xfc, 0xbc, 0x23, 0x2a, 0xe0, 0x1f, 0xf8, 0x85, 0xfb, 0xd5, 0xc3, 0xdc, + 0x01, 0xf8, 0xf9, 0x08, + 0xe0, 0xdb, 0x3e, 0x0d, 0xdb, 0x00, 0xab, 0x18, 0xae, 0xc9, 0x55, 0xf0, + 0x7f, 0x16, 0xeb, 0x56, + 0x70, 0x55, 0xe0, 0x73, 0x1d, 0x90, 0xf7, 0xc1, 0xde, 0xc3, 0xef, 0x91, + 0xf7, 0xc1, 0xef, 0xc1, + 0x17, 0x84, 0xc7, 0x32, 0xac, 0x02, 0x7f, 0x0e, 0xfc, 0x30, 0xd8, 0x10, + 0xeb, 0x96, 0x59, 0x2a, + 0xe0, 0x76, 0x37, 0x8b, 0x79, 0x01, 0xa3, 0xd8, 0x2e, 0xd7, 0xfc, 0xbe, + 0x3d, 0x10, 0x47, 0x96, + 0x8b, 0xe5, 0xe0, 0x0f, 0xc2, 0xe3, 0xa5, 0x4a, 0xb4, 0x5b, 0x2a, 0xe5, + 0x2b, 0xa4, 0x72, 0x88, + 0x8b, 0x77, 0xf3, 0x80, 0x6d, 0x3c, 0xbb, 0xdd, 0x2d, 0xef, 0x40, 0xbb, + 0xe4, 0x72, 0x54, 0x21, + 0x97, 0x82, 0xdf, 0x56, 0x01, 0x58, 0xb8, 0x0b, 0xb0, 0x6e, 0x27, 0xaa, + 0xb4, 0x1c, 0x20, 0x07, + 0xa5, 0xdd, 0x78, 0xb7, 0x5c, 0x4e, 0x76, 0x83, 0x1f, 0x5a, 0x01, 0xf7, + 0x31, 0xff, 0x71, 0xa7, + 0xb2, 0x13, 0xed, 0x54, 0x77, 0xa0, 0x6d, 0xea, 0x16, 0xb4, 0x4d, 0x01, + 0x3c, 0x94, 0x01, 0xf3, + 0xe0, 0x3d, 0x01, 0xdf, 0xf8, 0x52, 0xeb, 0x6e, 0x54, 0x61, 0xad, 0x44, + 0xe5, 0x70, 0xbb, 0xcb, + 0x5a, 0xca, 0xed, 0xb1, 0x56, 0xf1, 0x95, 0xd6, 0x4a, 0xbe, 0x5c, 0x85, + 0xcf, 0xa2, 0xc2, 0xfb, + 0xc1, 0x66, 0x38, 0x5f, 0x09, 0x9f, 0xb5, 0xc2, 0x52, 0xc9, 0x57, 0xc9, + 0x15, 0x7c, 0x85, 0xbc, + 0x17, 0x7c, 0x49, 0x86, 0xb9, 0x65, 0xf0, 0x59, 0x00, 0x37, 0xe5, 0x9d, + 0x80, 0xb1, 0xdb, 0xd1, + 0x56, 0x75, 0x23, 0xf8, 0x80, 0x3f, 0xf2, 0x2b, 0xe4, 0x05, 0x68, 0x8e, + 0x38, 0x13, 0x7d, 0x6b, + 0x99, 0x84, 0x3e, 0x16, 0xdf, 0x47, 0x05, 0xa2, 0x0d, 0x19, 0xe7, 0xd7, + 0xe4, 0xd0, 0x6a, 0xf3, + 0x83, 0x26, 0x96, 0xbe, 0x1a, 0x10, 0x5b, 0xc0, 0x67, 0xab, 0xee, 0x33, + 0xf1, 0xc1, 0xd3, 0x7d, + 0x78, 0x4c, 0x8f, 0x77, 0x7a, 0xd2, 0x5e, 0xb8, 0xb7, 0xb6, 0x7b, 0xe3, + 0x5e, 0xe0, 0xf7, 0xdd, + 0x42, 0x7b, 0xc0, 0xbe, 0x99, 0xf6, 0xfb, 0x81, 0xf5, 0xbb, 0x8c, 0xb9, + 0xab, 0x4e, 0x0f, 0xf4, + 0xac, 0x26, 0x8f, 0x44, 0x58, 0x52, 0xb9, 0xd6, 0x93, 0x7a, 0xbd, 0x30, + 0xd0, 0x83, 0xc7, 0x4b, + 0xa7, 0xf4, 0xf7, 0x7e, 0x9c, 0xf6, 0x9e, 0x33, 0x1b, 0x3d, 0xaa, 0xfd, + 0xce, 0xdb, 0x87, 0xf4, + 0xa5, 0x87, 0x35, 0x6e, 0xc5, 0xdb, 0x13, 0x17, 0x98, 0x2f, 0xcd, 0xc3, + 0x9c, 0xd7, 0xee, 0xc1, + 0x40, 0x76, 0x17, 0x90, 0xfb, 0xe6, 0xd6, 0xc1, 0x4f, 0xca, 0xcf, 0xc8, + 0xc9, 0x1e, 0x9b, 0x39, + 0xcc, 0xaf, 0x9e, 0x8b, 0xd6, 0x4f, 0x73, 0x25, 0xba, 0xec, 0x97, 0xab, + 0xd3, 0xe2, 0xaa, 0xfb, + 0x46, 0x4a, 0x7a, 0xe6, 0xbe, 0xe9, 0xcf, 0xf7, 0x67, 0xfa, 0xca, 0xf7, + 0xd7, 0xd2, 0xc1, 0xcf, + 0x0a, 0x36, 0x3f, 0x38, 0xa4, 0xbc, 0x5e, 0x08, 0x9a, 0x56, 0x61, 0xd1, + 0xae, 0x89, 0xd4, 0xe6, + 0xca, 0x67, 0x8d, 0xc9, 0x18, 0x1e, 0x68, 0x7e, 0x30, 0xc3, 0x75, 0xbd, + 0x73, 0xdb, 0x3d, 0xb1, + 0x74, 0x9a, 0xf0, 0x1e, 0xd9, 0xe7, 0xf6, 0x03, 0xff, 0xa4, 0xbf, 0xd3, + 0xff, 0xd2, 0x3f, 0xe8, + 0xef, 0xc2, 0x9f, 0xee, 0xff, 0xff, 0x81, 0xff, 0xa0, 0xff, 0xc5, 0x10, + 0xeb, 0xe2, 0x3f, 0x84, + 0xdf, 0xf1, 0x6f, 0xe6, 0x0b, 0xf8, 0x82, 0xe9, 0x02, 0xfe, 0x5d, 0xf8, + 0x0f, 0xf9, 0xcd, 0xfc, + 0x1b, 0x81, 0x98, 0x19, 0xff, 0x06, 0x71, 0x30, 0x8b, 0x85, 0x2f, 0x98, + 0x58, 0xdc, 0x7c, 0x81, + 0xdd, 0x8f, 0x7f, 0x11, 0xfe, 0x80, 0xe7, 0x9c, 0xc7, 0x3f, 0x8b, 0xe7, + 0xf9, 0x5f, 0xcd, 0x17, + 0xf8, 0x5f, 0xc4, 0x73, 0xfc, 0x39, 0xf1, 0x0c, 0xff, 0x33, 0xdc, 0x9e, + 0x12, 0x4f, 0xf1, 0x67, + 0xe1, 0xe7, 0xd3, 0xe2, 0x69, 0xf7, 0xcf, 0x27, 0xd1, 0x09, 0xf1, 0x34, + 0x3e, 0x2d, 0x9e, 0xc2, + 0x3f, 0x89, 0x67, 0xf1, 0x59, 0xf1, 0x34, 0x39, 0x05, 0xfb, 0x27, 0xf1, + 0x27, 0xed, 0xbe, 0x13, + 0xe2, 0x49, 0xd8, 0xa7, 0xf0, 0x49, 0xf1, 0x04, 0x61, 0xfb, 0x27, 0xf1, + 0x14, 0x39, 0x6a, 0x3e, + 0x4a, 0x8e, 0xc3, 0x3e, 0x62, 0x3e, 0x46, 0xe0, 0xf7, 0xe4, 0xb8, 0x78, + 0x94, 0x1c, 0xb5, 0xb0, + 0xfb, 0x8e, 0x91, 0xe3, 0xa6, 0xe3, 0xe4, 0xa4, 0x09, 0x1e, 0x6b, 0x3e, + 0x4e, 0x0e, 0xc3, 0x63, + 0x8e, 0x69, 0xfb, 0x04, 0x39, 0x2c, 0x1e, 0x26, 0xc7, 0x44, 0xf6, 0xf3, + 0x31, 0x7c, 0xdc, 0x74, + 0x04, 0x1f, 0x86, 0x5b, 0xf8, 0x1d, 0x3e, 0x2a, 0x1e, 0xa5, 0xc7, 0xc5, + 0xc3, 0x74, 0x8f, 0x58, + 0x4e, 0x0f, 0xc0, 0xeb, 0x1f, 0x03, 0x0c, 0xdc, 0x2f, 0x1d, 0x22, 0xfb, + 0x2d, 0xfb, 0xf0, 0x5e, + 0x4b, 0x05, 0xec, 0xfd, 0xb8, 0x12, 0x7c, 0xc2, 0x3d, 0x72, 0x19, 0x02, + 0xbc, 0xc2, 0xe0, 0x4b, + 0xa2, 0x4a, 0xa9, 0x14, 0xed, 0x03, 0x6c, 0xdd, 0x05, 0xb7, 0x95, 0x52, + 0x25, 0x2e, 0x97, 0x4a, + 0x31, 0xc4, 0xdb, 0xa8, 0x1c, 0x7c, 0xc6, 0x72, 0x69, 0x3f, 0xda, 0x2b, + 0xef, 0x03, 0x6c, 0xad, + 0xe4, 0xc1, 0x6f, 0x45, 0xfb, 0xe4, 0x03, 0x7c, 0x95, 0xa5, 0x02, 0xed, + 0x95, 0xf6, 0x20, 0x78, + 0x2d, 0x78, 0x7c, 0x39, 0x6c, 0xf6, 0xff, 0x4a, 0xb4, 0x07, 0x6e, 0xab, + 0x60, 0xef, 0x96, 0xc0, + 0x1f, 0x95, 0xb6, 0xa3, 0x6d, 0xd2, 0x06, 0xb4, 0x56, 0x5a, 0x83, 0x96, + 0x59, 0x16, 0xa2, 0x1f, + 0xc4, 0x59, 0xe8, 0x2b, 0x11, 0xf0, 0xcf, 0x3c, 0x1a, 0x17, 0x98, 0x6d, + 0xfc, 0x1b, 0xee, 0x3c, + 0x9f, 0x79, 0xde, 0x94, 0x07, 0x57, 0x14, 0x9f, 0x78, 0x57, 0x2f, 0x9f, + 0xa2, 0xea, 0xbb, 0xa1, + 0x9a, 0xb6, 0xb2, 0x2f, 0x9e, 0xee, 0x33, 0x13, 0xbb, 0xbf, 0x02, 0x78, + 0x47, 0x7a, 0x02, 0xee, + 0x01, 0x0e, 0xc2, 0xed, 0x2d, 0xa4, 0x07, 0xbd, 0x85, 0x76, 0x23, 0x37, + 0xd1, 0x1b, 0xb4, 0x1c, + 0xa1, 0xa1, 0x97, 0xf7, 0x6b, 0x69, 0xfe, 0xd9, 0xea, 0x7b, 0xef, 0x7a, + 0xb6, 0xf6, 0x3c, 0x37, + 0x6f, 0xae, 0x88, 0x3b, 0xfe, 0x7d, 0x62, 0xd5, 0x13, 0xfd, 0xea, 0xd4, + 0x46, 0xbc, 0x78, 0x72, + 0x1b, 0x3f, 0x9d, 0xf1, 0x92, 0xaf, 0xba, 0xf0, 0x1d, 0xe3, 0x23, 0xde, + 0x0c, 0x64, 0x77, 0xcc, + 0x76, 0x83, 0xe5, 0xcd, 0xa2, 0xec, 0x99, 0x5a, 0xde, 0xcc, 0xaf, 0x9e, + 0x8b, 0xa6, 0x83, 0x9f, + 0x90, 0xcb, 0xfa, 0xe1, 0x92, 0xa4, 0x48, 0x2e, 0x60, 0x1c, 0x1a, 0x26, + 0xfd, 0x65, 0x6f, 0xcd, + 0xd3, 0x48, 0x05, 0xf0, 0x2f, 0xd8, 0xdc, 0xb7, 0x50, 0xe7, 0x72, 0x06, + 0xf8, 0x7c, 0xac, 0x6e, + 0xc2, 0xb8, 0x79, 0xcc, 0xff, 0x4b, 0xf7, 0x39, 0x3f, 0xd8, 0xdd, 0x97, + 0x6c, 0x8e, 0xc2, 0x9a, + 0x7e, 0xbf, 0xe5, 0x0a, 0xb5, 0xea, 0x6b, 0x68, 0x5a, 0x85, 0x49, 0xbb, + 0x46, 0x4a, 0xe2, 0xb5, + 0xfc, 0x42, 0x50, 0xbe, 0x49, 0xe6, 0xc8, 0x0c, 0x67, 0xdc, 0xa8, 0xa8, + 0x80, 0x7c, 0x93, 0x9a, + 0xb5, 0xf0, 0x86, 0x66, 0x9b, 0x70, 0x92, 0x5c, 0x14, 0xfe, 0xe3, 0x39, + 0x3f, 0xc9, 0x9f, 0xf4, + 0x4f, 0xfc, 0x5f, 0xfa, 0x27, 0x01, 0x0c, 0x64, 0x3f, 0x93, 0x3f, 0xab, + 0xcf, 0x5d, 0xef, 0x9f, + 0x5d, 0x18, 0x19, 0x1a, 0xbf, 0x89, 0xbd, 0xa6, 0xde, 0xfb, 0xb5, 0xf7, + 0xaa, 0xf5, 0x7e, 0x75, + 0xfe, 0xef, 0xe7, 0xb5, 0x3c, 0xcf, 0xfd, 0x2f, 0xfe, 0xb3, 0xc6, 0xff, + 0xff, 0x24, 0x7f, 0xc0, + 0xba, 0x48, 0x2e, 0x8b, 0x9b, 0x55, 0xe3, 0x93, 0x69, 0x1b, 0xbb, 0xaf, + 0x13, 0x9e, 0xff, 0x57, + 0xdf, 0x7f, 0xe9, 0xf7, 0x35, 0xdf, 0xfd, 0xbf, 0xd5, 0xbf, 0xfb, 0x03, + 0x8e, 0xf0, 0x7f, 0xc8, + 0xef, 0xf4, 0x37, 0xfa, 0x0b, 0x3d, 0x4b, 0x4e, 0xd1, 0xe3, 0xe4, 0x08, + 0xdd, 0x4f, 0xf6, 0xd0, + 0xdd, 0x64, 0x1b, 0xdd, 0x48, 0xd6, 0xd0, 0x65, 0x74, 0x3e, 0xfd, 0x9e, + 0x7c, 0x4d, 0x3f, 0x27, + 0x13, 0x14, 0x9b, 0xa1, 0x4e, 0x3d, 0x56, 0xef, 0x82, 0x78, 0x54, 0xe3, + 0xa4, 0x79, 0xc7, 0xb2, + 0x6e, 0x9e, 0xee, 0xab, 0x93, 0x6f, 0x7e, 0xae, 0x3b, 0xe0, 0x5d, 0x0f, + 0xda, 0x53, 0x5b, 0x3d, + 0x60, 0x75, 0x27, 0xdd, 0xe8, 0xb5, 0xa4, 0x3e, 0x8d, 0xfe, 0xe2, 0xd9, + 0xff, 0xab, 0xdd, 0x03, + 0x5d, 0x5b, 0xc7, 0xc5, 0x17, 0x1e, 0x7b, 0xfa, 0xf7, 0xae, 0x67, 0x7d, + 0x2c, 0x5b, 0x86, 0xf6, + 0xac, 0x51, 0xeb, 0x00, 0xdc, 0x2d, 0xf9, 0x6e, 0xcc, 0x93, 0x06, 0x1f, + 0xf3, 0x30, 0x5f, 0xfe, + 0x71, 0x60, 0x9f, 0x1e, 0x1f, 0xd7, 0x7f, 0x35, 0x58, 0x6f, 0x5a, 0x66, + 0x61, 0x4a, 0xd0, 0xde, + 0x0c, 0x97, 0x56, 0x7d, 0xd4, 0xa8, 0x80, 0x7a, 0x2e, 0x1e, 0x8d, 0xe0, + 0x02, 0xff, 0x7a, 0x2e, + 0xa1, 0xe4, 0xb0, 0x12, 0xf2, 0xf4, 0xe8, 0x2f, 0x03, 0xfe, 0xb1, 0xba, + 0xaf, 0x9e, 0xb9, 0x6f, + 0xa1, 0xcf, 0xa0, 0x0c, 0xaa, 0xf3, 0xc5, 0xf2, 0x7a, 0xd5, 0xf9, 0x35, + 0x3f, 0x7c, 0x93, 0x74, + 0xa6, 0x73, 0xc8, 0xf8, 0x26, 0x42, 0x00, 0xbe, 0x89, 0xde, 0x63, 0xa2, + 0x47, 0x93, 0xfa, 0x52, + 0x8f, 0x4c, 0xc8, 0xb3, 0xe6, 0xfc, 0xf1, 0x4d, 0xb2, 0x83, 0xf1, 0x4d, + 0xea, 0xf4, 0x07, 0x44, + 0xd3, 0x7f, 0xf1, 0x3f, 0x9a, 0x8f, 0xa0, 0x7d, 0xe6, 0x03, 0xf8, 0xb0, + 0x00, 0x9e, 0x91, 0x50, + 0x81, 0xb7, 0x0b, 0xfb, 0xd1, 0x7e, 0xd3, 0x3e, 0x7e, 0x9f, 0xb9, 0x02, + 0x55, 0x98, 0xc1, 0x5b, + 0x31, 0x57, 0xe2, 0x4a, 0xf3, 0x3e, 0xbc, 0xc7, 0xbc, 0x07, 0xef, 0x33, + 0xed, 0x23, 0x15, 0xa6, + 0x72, 0x52, 0x09, 0xb7, 0x55, 0xa6, 0x2a, 0xba, 0xd7, 0xb4, 0x8f, 0xee, + 0x15, 0xf6, 0x91, 0x43, + 0xc2, 0x7e, 0x52, 0x25, 0x54, 0x91, 0x43, 0xb4, 0x0a, 0x2c, 0xb9, 0x0a, + 0x1d, 0x30, 0x1f, 0x40, + 0x87, 0x4c, 0x47, 0xd0, 0x21, 0xf3, 0x7e, 0x78, 0xed, 0xbd, 0xf0, 0xff, + 0xfd, 0xe8, 0x80, 0xa9, + 0x0a, 0x5e, 0x63, 0x9f, 0xb6, 0xd9, 0xfb, 0xed, 0x17, 0x2a, 0xf1, 0x7e, + 0xba, 0x1f, 0x1f, 0x10, + 0xf6, 0xb9, 0x6e, 0x29, 0xbb, 0xad, 0xc2, 0x7b, 0xe9, 0x01, 0x7c, 0x50, + 0x38, 0x88, 0x8f, 0xd0, + 0x43, 0x70, 0xdf, 0x01, 0x6d, 0x1f, 0x84, 0xdf, 0xef, 0xa7, 0x87, 0xf1, + 0x21, 0x7a, 0x10, 0x6e, + 0x0f, 0xb8, 0xef, 0xaf, 0x82, 0xff, 0x57, 0xe1, 0x7d, 0xf4, 0x20, 0xda, + 0x4f, 0xe0, 0x33, 0x53, + 0x78, 0x1f, 0x7a, 0x08, 0x1d, 0x64, 0xff, 0xa7, 0xe0, 0x8d, 0x91, 0x83, + 0x08, 0x3e, 0x1d, 0x3a, + 0x08, 0xbf, 0x73, 0xbd, 0xf6, 0x21, 0x7a, 0x80, 0x1c, 0xa0, 0x87, 0xc9, + 0x01, 0x72, 0x98, 0x1c, + 0xd1, 0xbe, 0xef, 0x21, 0xe1, 0x1c, 0xfe, 0x8d, 0x9e, 0x47, 0xff, 0x61, + 0xf8, 0x08, 0xfb, 0x77, + 0x7a, 0x01, 0xff, 0x4a, 0x7e, 0xc1, 0xbf, 0x91, 0x0b, 0xda, 0xfe, 0x9d, + 0xfc, 0x06, 0xeb, 0x02, + 0x5b, 0x70, 0xff, 0xaf, 0xf0, 0xd8, 0xdf, 0xf1, 0x79, 0xf8, 0xfd, 0x05, + 0x02, 0xde, 0x31, 0xdc, + 0xf7, 0x1f, 0xf2, 0x1f, 0xf8, 0xf9, 0x37, 0x76, 0x3f, 0xf9, 0x15, 0x6e, + 0xd9, 0x6b, 0xb0, 0x75, + 0x09, 0x2d, 0x01, 0xed, 0x88, 0x0b, 0x1d, 0x2f, 0xb2, 0x6b, 0x0b, 0xf9, + 0x13, 0xff, 0x01, 0xcf, + 0xbd, 0x40, 0xce, 0xe1, 0xb3, 0xf4, 0x2c, 0x3e, 0x43, 0x7e, 0xc2, 0xe0, + 0xaf, 0xe2, 0x2a, 0x5a, + 0x89, 0x77, 0xd1, 0xad, 0x64, 0x3d, 0x5d, 0x4e, 0x16, 0xd1, 0x79, 0x64, + 0x3a, 0x9d, 0x42, 0x3e, + 0xa1, 0xe3, 0x88, 0x93, 0xd6, 0x89, 0x61, 0x7d, 0xf8, 0x54, 0xa5, 0x13, + 0x67, 0xbc, 0x6a, 0x5f, + 0x3d, 0xb4, 0x6f, 0xed, 0xb9, 0x1b, 0x2e, 0x5d, 0x7a, 0x1f, 0x3c, 0xdd, + 0x19, 0xbd, 0x1f, 0xef, + 0x06, 0xb1, 0x2e, 0xc3, 0x40, 0xcf, 0xea, 0x4a, 0xda, 0x32, 0x2d, 0x0b, + 0x14, 0xf9, 0x51, 0xff, + 0xd7, 0x7c, 0xd6, 0x8d, 0xdd, 0xfa, 0x06, 0x63, 0xbe, 0x2b, 0x79, 0xd2, + 0xd7, 0x3c, 0x37, 0x8d, + 0xff, 0xb6, 0xf1, 0xa9, 0xde, 0xda, 0x3c, 0x24, 0x37, 0xe6, 0x9e, 0x28, + 0x5e, 0xf1, 0xee, 0x94, + 0x39, 0xf6, 0x81, 0xbe, 0x6a, 0x36, 0x8f, 0x2d, 0xe8, 0x33, 0xa0, 0xe3, + 0xfb, 0xf5, 0xde, 0x62, + 0xf9, 0xbb, 0x60, 0xfa, 0x25, 0x1a, 0xf7, 0xad, 0x40, 0x0f, 0xf7, 0x2d, + 0xcb, 0x9f, 0x56, 0xbd, + 0x97, 0x0e, 0x7e, 0x5a, 0x8e, 0x6f, 0x3d, 0x97, 0x9a, 0x3a, 0xf8, 0x91, + 0x5a, 0x8f, 0x4c, 0xa2, + 0x5e, 0xfd, 0x26, 0x63, 0x50, 0xcd, 0x53, 0x86, 0x7f, 0x6e, 0xee, 0x9b, + 0x1e, 0x5c, 0x08, 0xd3, + 0x0c, 0x4a, 0x5f, 0xfa, 0xfd, 0x01, 0xf8, 0x26, 0xe9, 0x01, 0xf9, 0x26, + 0x7a, 0xf3, 0x7a, 0xe1, + 0xd4, 0xae, 0x89, 0x0a, 0xc2, 0x71, 0xf1, 0xf0, 0x4d, 0xd2, 0xfc, 0xf1, + 0x4d, 0xac, 0x5e, 0xf5, + 0x70, 0x31, 0x9e, 0xaf, 0xed, 0x33, 0x47, 0xd2, 0xfa, 0xf4, 0x51, 0x7c, + 0xaf, 0xa9, 0x27, 0xb9, + 0xcd, 0xd4, 0x8b, 0xf6, 0x36, 0xf5, 0x22, 0x3d, 0x4c, 0x7d, 0x68, 0x7f, + 0xd3, 0x5d, 0xb4, 0xa7, + 0xf9, 0x51, 0xda, 0xcf, 0x7c, 0x8b, 0xd0, 0x1b, 0x56, 0x4f, 0x7a, 0xbb, + 0x70, 0x1b, 0xed, 0x45, + 0x6f, 0x13, 0x7a, 0xd1, 0x3b, 0x84, 0x87, 0xd8, 0xe3, 0x84, 0xdb, 0x4d, + 0xb7, 0x9b, 0x6e, 0x33, + 0xdd, 0xc1, 0xb6, 0xd0, 0x17, 0x1e, 0xd1, 0x9f, 0x3e, 0x2e, 0xdc, 0x4e, + 0x6f, 0xa3, 0x6c, 0xdf, + 0x49, 0xfb, 0xd0, 0xbe, 0xb0, 0xfb, 0xd0, 0xde, 0x74, 0x20, 0x7b, 0x3c, + 0xbd, 0x8b, 0xde, 0x25, + 0xdc, 0x25, 0xf4, 0x71, 0x2f, 0xf6, 0xd3, 0xc3, 0xf4, 0x21, 0x78, 0xa7, + 0xbe, 0xda, 0xff, 0xfa, + 0x92, 0x3e, 0x42, 0x5f, 0xdc, 0x57, 0xb8, 0x8b, 0xdc, 0x21, 0x3c, 0x41, + 0x1e, 0x84, 0xd7, 0xbb, + 0x5b, 0xb8, 0x87, 0xf6, 0x31, 0xf5, 0xa5, 0xf7, 0x0a, 0x77, 0xe3, 0x7b, + 0x84, 0xbb, 0xc9, 0xfd, + 0xc2, 0x53, 0xb8, 0x9f, 0xb9, 0x1f, 0xb9, 0xcb, 0x7c, 0x17, 0xe9, 0x6f, + 0xee, 0x4b, 0xee, 0x81, + 0xe7, 0xdc, 0x25, 0xdc, 0x0e, 0x8f, 0x7d, 0x88, 0xdc, 0x29, 0xf4, 0x23, + 0x7d, 0x85, 0x7b, 0xf0, + 0xdd, 0xa6, 0xbb, 0x49, 0x7f, 0xe1, 0x3e, 0xd2, 0x9f, 0xde, 0x8b, 0x9f, + 0xa3, 0x0f, 0xe3, 0xbb, + 0xe9, 0xdd, 0xe4, 0x1e, 0x3a, 0x00, 0x6e, 0x07, 0x90, 0xfb, 0xe9, 0x03, + 0xe4, 0x01, 0xd3, 0x43, + 0xf4, 0x49, 0xd3, 0x00, 0xfa, 0x2f, 0xd3, 0x40, 0xed, 0x53, 0x3d, 0x22, + 0x3c, 0x40, 0x5e, 0x14, + 0x06, 0x53, 0x44, 0x0d, 0x74, 0x38, 0x1d, 0x4a, 0xdf, 0x36, 0xbd, 0x49, + 0xdf, 0xa2, 0xaf, 0xc3, + 0x1e, 0x42, 0xdf, 0x15, 0x86, 0x51, 0x4e, 0x18, 0x42, 0x06, 0x0b, 0x83, + 0xc9, 0x50, 0x3a, 0x94, + 0x0c, 0x21, 0x43, 0xe0, 0xdf, 0xa1, 0xf0, 0xbf, 0x91, 0x82, 0x91, 0x0e, + 0xa6, 0x43, 0x4d, 0x70, + 0x3f, 0x3c, 0x66, 0x98, 0x6b, 0xc3, 0xa2, 0x54, 0x10, 0x72, 0x05, 0x03, + 0x35, 0x0a, 0x08, 0x5e, + 0x31, 0x97, 0xf2, 0x14, 0xc3, 0xcf, 0x58, 0x10, 0xe1, 0xff, 0x58, 0x30, + 0x11, 0x42, 0x11, 0x21, + 0x02, 0x85, 0x4d, 0x08, 0x2f, 0x60, 0xa2, 0x50, 0x0c, 0xf7, 0x99, 0x29, + 0x12, 0x90, 0x80, 0x69, + 0xae, 0x30, 0x42, 0x18, 0x2e, 0x0c, 0xa1, 0x6c, 0x0d, 0xa2, 0xaf, 0xd0, + 0x17, 0xe9, 0xd3, 0xf4, + 0x71, 0x3a, 0x90, 0xbe, 0x5c, 0x5b, 0x6b, 0xca, 0x8b, 0x47, 0x5b, 0xf2, + 0xcd, 0xc4, 0xa7, 0xcc, + 0xde, 0xfd, 0x7f, 0x10, 0x8f, 0x56, 0xe7, 0x05, 0x3d, 0x9a, 0x54, 0xbe, + 0x78, 0xba, 0xf3, 0x7b, + 0x3d, 0xd0, 0x8a, 0xb4, 0xa2, 0xda, 0xd6, 0x56, 0x5b, 0x9a, 0x65, 0x6f, + 0x36, 0xb2, 0xfb, 0xcc, + 0xfb, 0x1e, 0xf5, 0xc4, 0xb8, 0x35, 0xea, 0xc6, 0x13, 0xed, 0xaf, 0xb2, + 0x99, 0xe5, 0x7e, 0xfb, + 0x57, 0x3c, 0xef, 0x35, 0xa7, 0xc5, 0xc3, 0x5a, 0x8e, 0x72, 0xc1, 0x8c, + 0x7f, 0x8d, 0x59, 0x31, + 0xf4, 0xee, 0xba, 0xfd, 0x7f, 0x2f, 0xf6, 0xbc, 0xef, 0xfb, 0x6e, 0x8f, + 0x35, 0xb5, 0x45, 0xba, + 0x35, 0x2a, 0xa3, 0x71, 0xa2, 0x2d, 0x29, 0x37, 0x68, 0x5c, 0x0b, 0x76, + 0xe7, 0x77, 0xee, 0x5b, + 0xc8, 0xba, 0xec, 0x09, 0x5a, 0x0e, 0x2b, 0xd1, 0x9e, 0x94, 0xeb, 0x77, + 0x7e, 0x30, 0xab, 0x9b, + 0xd8, 0xaf, 0x54, 0x97, 0xdd, 0xdb, 0xd6, 0x5d, 0x75, 0x5f, 0x37, 0xf7, + 0x0d, 0x85, 0x05, 0x17, + 0xc2, 0x32, 0x83, 0xd2, 0xa3, 0x83, 0x9f, 0x92, 0xeb, 0x3d, 0x5b, 0xcd, + 0x1f, 0xdf, 0x44, 0xcb, + 0x75, 0xea, 0xec, 0x1b, 0x4a, 0xd6, 0xa1, 0x69, 0x95, 0x15, 0x2e, 0xed, + 0x1a, 0x78, 0x0d, 0x86, + 0x7f, 0x49, 0x6a, 0x6c, 0x00, 0xbe, 0x49, 0x72, 0x4e, 0xa2, 0x2d, 0xd1, + 0xc0, 0x34, 0xbf, 0xa3, + 0x82, 0xf0, 0x4d, 0x34, 0xed, 0x1a, 0xbd, 0x9a, 0xd4, 0xe1, 0xd4, 0xa8, + 0xb0, 0x55, 0xd7, 0xbc, + 0x48, 0x94, 0xce, 0xf9, 0x26, 0x51, 0x3e, 0xfa, 0x1c, 0x74, 0xf7, 0xf7, + 0xb3, 0x39, 0xd9, 0xd6, + 0xf0, 0x68, 0x4c, 0x6a, 0xd7, 0xc6, 0x42, 0xdf, 0xd7, 0x46, 0xf0, 0xd7, + 0xab, 0xe3, 0x30, 0x6d, + 0x36, 0xe3, 0xd8, 0x1a, 0x3c, 0x20, 0xed, 0xbb, 0x78, 0xf9, 0x1e, 0x84, + 0xe5, 0x29, 0x92, 0x9d, + 0xc9, 0xa3, 0x58, 0x9e, 0xb9, 0x8e, 0xd6, 0x14, 0xd3, 0x24, 0x98, 0x65, + 0x7f, 0xd4, 0x5f, 0x7f, + 0x71, 0x35, 0xfe, 0xb9, 0x6b, 0xbd, 0x3e, 0x7b, 0xa0, 0x57, 0xf4, 0xe9, + 0x57, 0xad, 0x65, 0x30, + 0xae, 0xfd, 0xdb, 0xbd, 0xe7, 0x3f, 0xf6, 0x40, 0x9d, 0x9e, 0x1a, 0xef, + 0xba, 0x71, 0xb0, 0x1a, + 0xee, 0x64, 0x83, 0xd6, 0x57, 0xd3, 0xeb, 0x83, 0x98, 0x37, 0x9f, 0xf0, + 0x9e, 0x21, 0xe2, 0xd9, + 0x6b, 0x1f, 0xba, 0xe3, 0xd6, 0x49, 0xad, 0x5f, 0x48, 0xb5, 0xd4, 0xb2, + 0x43, 0x38, 0xb6, 0x49, + 0xb6, 0xc4, 0xdc, 0xa0, 0xfd, 0x7a, 0x60, 0x77, 0x59, 0xce, 0xb0, 0x69, + 0x5a, 0x79, 0x72, 0x58, + 0x01, 0xe6, 0x07, 0x67, 0x0d, 0xd3, 0x6a, 0x07, 0x70, 0x0e, 0x05, 0xe4, + 0x9b, 0xe8, 0xcd, 0x61, + 0xb1, 0xba, 0xaf, 0x23, 0x86, 0x0b, 0xcc, 0x7d, 0xbb, 0x94, 0xd7, 0xcb, + 0x0e, 0xe3, 0x5c, 0x4e, + 0xfd, 0x3a, 0x5f, 0x69, 0xc3, 0x63, 0x64, 0x5f, 0xf3, 0x83, 0x2f, 0xf5, + 0x25, 0xb3, 0x7e, 0x3d, + 0xb7, 0xce, 0x17, 0xb9, 0xd2, 0xbc, 0x5e, 0x48, 0xb3, 0xe6, 0x42, 0xd5, + 0xae, 0x11, 0xfc, 0xf1, + 0x4d, 0x32, 0xc1, 0xee, 0x32, 0x82, 0xf1, 0x4d, 0xc2, 0x8a, 0x0b, 0x91, + 0xaa, 0x7f, 0x5c, 0xd0, + 0xa7, 0x51, 0x11, 0x78, 0xbe, 0x49, 0x5a, 0x5e, 0x75, 0x3d, 0xdc, 0x8b, + 0x2b, 0xaf, 0xa7, 0x97, + 0xdd, 0x75, 0x6d, 0xd4, 0xa7, 0x3d, 0x9b, 0x19, 0x1e, 0x8d, 0x0a, 0xf7, + 0xb5, 0x31, 0x15, 0xce, + 0x25, 0x86, 0xeb, 0x19, 0xc5, 0x59, 0xda, 0xdf, 0x84, 0x7d, 0x8f, 0xf4, + 0x42, 0x4f, 0x6d, 0x0e, + 0xfe, 0x2e, 0x96, 0x18, 0x1e, 0xce, 0x37, 0x8d, 0xd7, 0x14, 0x48, 0x6b, + 0xaa, 0xce, 0xf6, 0xaa, + 0xc7, 0x56, 0xc7, 0xac, 0x7e, 0x78, 0xba, 0x4d, 0x27, 0x76, 0x7f, 0xe5, + 0x81, 0xd5, 0x2f, 0xdf, + 0x55, 0xe7, 0x35, 0x58, 0x8c, 0xbb, 0xcc, 0xd0, 0xbf, 0x36, 0xe6, 0xfa, + 0x5b, 0x27, 0x0a, 0x37, + 0x0e, 0xd1, 0x7a, 0xae, 0xb7, 0xbc, 0xd0, 0x33, 0xc3, 0x16, 0x37, 0xaa, + 0xf9, 0xf4, 0x27, 0xab, + 0xdf, 0xf7, 0x99, 0x25, 0xfd, 0xee, 0xbd, 0xfe, 0xe3, 0xa6, 0xaf, 0x45, + 0xf9, 0xd0, 0x73, 0xf1, + 0x1c, 0x5b, 0x96, 0xab, 0x09, 0x9a, 0xc3, 0x02, 0x5b, 0xd7, 0x6b, 0x03, + 0x97, 0xdb, 0x9b, 0x16, + 0x59, 0x4b, 0x07, 0x3f, 0xcb, 0x87, 0x9e, 0x4b, 0x1d, 0xbe, 0x89, 0xde, + 0x1c, 0x96, 0x04, 0xf1, + 0xa6, 0x3d, 0x9a, 0xe1, 0x5f, 0xf0, 0xb9, 0x97, 0x3a, 0xf3, 0x7a, 0xe1, + 0x9c, 0xcb, 0x59, 0x5b, + 0xab, 0xde, 0x67, 0x7e, 0x4d, 0xe3, 0x9b, 0x64, 0xb9, 0xf9, 0x26, 0x09, + 0xfe, 0xf9, 0x26, 0x7a, + 0xfd, 0x85, 0xcb, 0xd0, 0xa4, 0xbe, 0x2c, 0xed, 0x9a, 0x10, 0xf8, 0x26, + 0x9e, 0xef, 0x12, 0x0a, + 0xef, 0x27, 0x5c, 0xda, 0xb3, 0xee, 0x9a, 0x17, 0x17, 0xdc, 0x67, 0xce, + 0x18, 0xce, 0xae, 0xd7, + 0xb5, 0x79, 0x84, 0x9a, 0xbf, 0xee, 0x4c, 0xd2, 0x70, 0x3d, 0x26, 0xec, + 0xda, 0xb3, 0xc1, 0x7b, + 0xd9, 0xf5, 0x6a, 0x54, 0xa4, 0x55, 0x5f, 0x1b, 0xdd, 0xb8, 0xae, 0x26, + 0x1a, 0x58, 0x4e, 0x3a, + 0x7d, 0x74, 0xc6, 0x08, 0xc6, 0x75, 0x4d, 0x2b, 0x48, 0x1d, 0xc9, 0x70, + 0x90, 0xe1, 0x1f, 0xf3, + 0x6f, 0xeb, 0x7d, 0x1f, 0x40, 0x6b, 0xaa, 0x56, 0x2d, 0x76, 0xca, 0x84, + 0x13, 0xaf, 0xd7, 0xa8, + 0xd9, 0xae, 0xe8, 0xdb, 0xcf, 0x1f, 0x4f, 0xd7, 0xd7, 0xf3, 0x3d, 0x31, + 0xae, 0x86, 0x91, 0xcc, + 0x07, 0x9c, 0x74, 0xc2, 0xaf, 0x96, 0x1f, 0xd3, 0x35, 0xd0, 0x70, 0xd2, + 0xf3, 0xfc, 0x1f, 0x5a, + 0x0d, 0x64, 0xdc, 0xdd, 0x18, 0x29, 0x96, 0x6f, 0x35, 0xa9, 0xc7, 0x8b, + 0xd7, 0x8c, 0x4b, 0x7b, + 0x37, 0x41, 0x8d, 0x37, 0xc6, 0xc3, 0x8e, 0x63, 0xfa, 0x05, 0xa2, 0xab, + 0xce, 0x50, 0x23, 0xf7, + 0x62, 0x49, 0xe0, 0x53, 0x6c, 0x71, 0x86, 0x60, 0x36, 0xc0, 0x6a, 0x0c, + 0xa9, 0x7a, 0xe6, 0x2d, + 0x8e, 0xd5, 0xd3, 0x9b, 0x16, 0x3c, 0xaf, 0xc7, 0x72, 0x4a, 0x2c, 0x96, + 0x66, 0xb9, 0x74, 0xbf, + 0xf3, 0x83, 0x59, 0xdd, 0x04, 0x62, 0x47, 0x8d, 0xfb, 0x16, 0xc4, 0x57, + 0x8b, 0x94, 0x5d, 0x75, + 0x5f, 0x4d, 0xff, 0xd9, 0x0a, 0xb6, 0xc6, 0x74, 0xf0, 0xcd, 0x70, 0x2c, + 0x7c, 0xc4, 0x61, 0xa1, + 0xe5, 0xf5, 0x22, 0xc2, 0x32, 0x97, 0x33, 0xd0, 0x31, 0xf1, 0xae, 0x9b, + 0x5c, 0x9a, 0x2b, 0x1f, + 0x80, 0x6f, 0xf2, 0x17, 0x68, 0x52, 0xeb, 0xd2, 0xae, 0x19, 0x13, 0x9c, + 0xe3, 0xa2, 0xe9, 0x43, + 0x83, 0x4f, 0x1f, 0x80, 0x6f, 0x62, 0x88, 0xb3, 0xc4, 0x70, 0xe1, 0xd4, + 0xa4, 0x8e, 0xb9, 0x02, + 0xed, 0x9a, 0x00, 0x1a, 0x15, 0x2e, 0x5c, 0x97, 0x35, 0x5c, 0x1f, 0x55, + 0xbb, 0x1e, 0xce, 0xfc, + 0xf7, 0xcc, 0x82, 0xa4, 0x91, 0x75, 0xae, 0xd7, 0x3e, 0xfa, 0xe7, 0xe3, + 0x75, 0x69, 0xcf, 0xea, + 0x9c, 0xc3, 0x7a, 0xb9, 0x1a, 0x15, 0x82, 0xab, 0x97, 0x57, 0xc3, 0x42, + 0x4d, 0xfb, 0x24, 0x25, + 0x27, 0x05, 0x7c, 0xf4, 0x24, 0xf0, 0x39, 0x12, 0xa6, 0xbd, 0xfc, 0x74, + 0x20, 0xad, 0x29, 0x9f, + 0x1c, 0x0b, 0xd3, 0x79, 0xa4, 0xf5, 0xe2, 0xcd, 0x6a, 0xfa, 0x48, 0xa0, + 0x59, 0x45, 0x1e, 0x1d, + 0x82, 0x92, 0xf1, 0x55, 0x6f, 0xf8, 0xf4, 0x2f, 0x21, 0x9e, 0xae, 0x81, + 0x9d, 0x96, 0x13, 0xdc, + 0x8a, 0x2f, 0xa7, 0x3c, 0xef, 0xab, 0x7f, 0xa5, 0xeb, 0xe8, 0x88, 0xc1, + 0xd5, 0xfd, 0xd1, 0x80, + 0x83, 0x09, 0x6a, 0x82, 0x31, 0x4e, 0x89, 0x37, 0x26, 0x5a, 0x13, 0x0d, + 0x2c, 0xef, 0x02, 0x3b, + 0x97, 0xfd, 0xcc, 0x66, 0x08, 0xb3, 0x58, 0x9f, 0x61, 0x61, 0x94, 0x9c, + 0xc4, 0xa5, 0x58, 0x63, + 0x0c, 0xc1, 0x7b, 0x56, 0xb3, 0x46, 0x06, 0xed, 0x07, 0x61, 0xbd, 0x69, + 0x63, 0xc2, 0x34, 0x6f, + 0xd1, 0xcd, 0x39, 0x05, 0x1b, 0xe0, 0x02, 0xf3, 0x4d, 0x92, 0x73, 0xb2, + 0xe0, 0xda, 0x18, 0xeb, + 0xd6, 0xc1, 0xf7, 0x8b, 0x2f, 0x0a, 0xab, 0xfb, 0xba, 0xf0, 0xcf, 0x5b, + 0x0f, 0xa6, 0x76, 0x7e, + 0xcd, 0x95, 0xd7, 0xcb, 0x30, 0x5c, 0x81, 0x56, 0xbd, 0x4f, 0x9d, 0xaf, + 0xf0, 0xcc, 0xa0, 0x8c, + 0x72, 0xc5, 0x2e, 0xe0, 0x63, 0x04, 0xe4, 0x9b, 0xc8, 0x09, 0x9c, 0x2e, + 0x5c, 0x08, 0xa7, 0x4e, + 0xb7, 0x4e, 0xed, 0x1a, 0x57, 0x2d, 0x5c, 0x8b, 0x23, 0x48, 0x30, 0xbe, + 0x49, 0x4a, 0x4d, 0xbe, + 0x49, 0x58, 0x35, 0xa9, 0xaf, 0x4c, 0xa3, 0xa2, 0xee, 0xb5, 0x91, 0xe5, + 0xd7, 0x62, 0xab, 0xf3, + 0x6b, 0x59, 0x35, 0xb4, 0x28, 0x3d, 0xb8, 0x5e, 0xa7, 0xcf, 0x21, 0xcc, + 0xfd, 0xfd, 0x49, 0xe1, + 0xaa, 0x79, 0xb1, 0x9c, 0x94, 0x9a, 0x64, 0x64, 0x7a, 0x72, 0x09, 0x0c, + 0x3b, 0xbe, 0x18, 0xf8, + 0xa2, 0xaf, 0x18, 0xb6, 0x06, 0xe7, 0xad, 0xf6, 0x72, 0x73, 0x76, 0x9f, + 0xf8, 0x22, 0xee, 0x05, + 0x9f, 0x3c, 0xdd, 0x00, 0x3a, 0x04, 0x9e, 0xe7, 0x7a, 0x74, 0xac, 0x98, + 0xef, 0x59, 0x5a, 0x5c, + 0xfa, 0xee, 0x8c, 0xef, 0xc7, 0x3c, 0xee, 0xad, 0xdd, 0xe7, 0xd9, 0xcf, + 0x2e, 0xeb, 0x7f, 0xcf, + 0xf5, 0x63, 0x12, 0xde, 0xa9, 0xfd, 0xf7, 0x4c, 0xb4, 0xc6, 0x1b, 0x18, + 0xae, 0xbb, 0x7c, 0xc2, + 0x38, 0x8e, 0x7d, 0x97, 0x64, 0x47, 0x72, 0x2e, 0xcb, 0x6b, 0xc2, 0xce, + 0x4d, 0xb6, 0x27, 0xe5, + 0x32, 0xbe, 0x42, 0x8a, 0x2d, 0x36, 0x37, 0x90, 0xc6, 0xa7, 0x66, 0x77, + 0x45, 0x59, 0x23, 0xc2, + 0x68, 0x03, 0x39, 0x7a, 0x35, 0xa3, 0x6a, 0xe6, 0xb6, 0x83, 0xf2, 0x4d, + 0x46, 0xf9, 0xe3, 0x9b, + 0xb0, 0xba, 0x6f, 0xbc, 0x12, 0xc9, 0xc7, 0x3b, 0xe3, 0x8c, 0xd1, 0x6a, + 0x0c, 0xaf, 0xe9, 0xe0, + 0xe7, 0xbb, 0xf4, 0x9f, 0x6b, 0xf7, 0x25, 0xbb, 0xfa, 0x78, 0xff, 0x76, + 0x5c, 0x80, 0x58, 0x5a, + 0x9f, 0x8f, 0xe2, 0xf2, 0x17, 0x7c, 0xcf, 0x0f, 0xd6, 0xb0, 0x10, 0xbe, + 0x0b, 0x8b, 0x97, 0x12, + 0x82, 0xf0, 0x4d, 0xc2, 0xaa, 0xd3, 0xad, 0x5e, 0x49, 0xbe, 0xbf, 0x66, + 0x7e, 0x4d, 0x2f, 0xdf, + 0x24, 0x32, 0xac, 0xf3, 0x99, 0x63, 0x35, 0x5c, 0x88, 0xd1, 0x53, 0xf3, + 0x0a, 0x9c, 0xd7, 0xd3, + 0x6a, 0xfb, 0xec, 0x3a, 0xc5, 0xf2, 0x69, 0xb5, 0x71, 0xdd, 0xbb, 0x1e, + 0x1e, 0x69, 0x89, 0xe7, + 0x99, 0xbf, 0x10, 0xec, 0x3a, 0x15, 0xd2, 0x1c, 0xd6, 0x30, 0xf4, 0xac, + 0xba, 0xfc, 0x85, 0x64, + 0x63, 0x8a, 0x1a, 0xcd, 0xf4, 0x92, 0x70, 0xd4, 0xb8, 0x5b, 0xea, 0xce, + 0xdb, 0x0d, 0xb6, 0xdc, + 0x9a, 0x55, 0x4c, 0xb3, 0xe5, 0xe9, 0xda, 0x3c, 0x5d, 0xf0, 0xe1, 0xfc, + 0xd6, 0x71, 0x59, 0x3e, + 0xef, 0x9b, 0xa1, 0x9a, 0x4e, 0x7e, 0xbb, 0xf7, 0x1b, 0xf9, 0xae, 0x65, + 0xb8, 0xf7, 0x43, 0x3f, + 0xdc, 0xfa, 0x50, 0xeb, 0xc2, 0xd4, 0x21, 0xfe, 0x70, 0x3e, 0xc9, 0x5a, + 0x2b, 0xae, 0x65, 0x7a, + 0x2e, 0x22, 0xd8, 0x3e, 0x5c, 0xa7, 0x58, 0x8e, 0x2d, 0x35, 0x3f, 0x35, + 0xc7, 0xb5, 0x5d, 0xbe, + 0x6e, 0xa2, 0xa7, 0x9e, 0x55, 0x1b, 0x0b, 0xdd, 0x73, 0xdf, 0x42, 0xd6, + 0xaa, 0x0f, 0xd8, 0x9b, + 0x76, 0x85, 0xb9, 0x6d, 0x0f, 0xc7, 0x22, 0x2f, 0x3d, 0x20, 0xdf, 0xc4, + 0xf3, 0x5d, 0x18, 0xf7, + 0x8d, 0xd5, 0x7d, 0x59, 0x0d, 0xc4, 0xe3, 0xef, 0x33, 0x3d, 0xd4, 0xda, + 0x7a, 0x2e, 0xec, 0x7a, + 0xcd, 0x72, 0x54, 0x99, 0xf9, 0xee, 0xd8, 0xc5, 0xdf, 0x75, 0x21, 0xdc, + 0x3a, 0x5f, 0x57, 0x72, + 0x4c, 0x6a, 0xf5, 0x25, 0x67, 0x05, 0x9d, 0x1f, 0xec, 0x5a, 0x49, 0x7f, + 0x93, 0x4e, 0x77, 0xad, + 0x7c, 0x7f, 0xe0, 0x59, 0x73, 0x2c, 0x0e, 0x93, 0x13, 0x8d, 0xda, 0xdf, + 0xc1, 0x67, 0x7e, 0xcd, + 0xed, 0xaf, 0xc3, 0x35, 0x2e, 0x5a, 0x4f, 0x7f, 0x40, 0xa8, 0xb8, 0x20, + 0x84, 0xa7, 0x16, 0xae, + 0xf5, 0xb2, 0x4b, 0x91, 0x7c, 0x0d, 0x5c, 0xf7, 0x51, 0x37, 0x61, 0xd7, + 0xa9, 0x58, 0xaf, 0xba, + 0xc9, 0x95, 0x6a, 0xcf, 0x86, 0x6b, 0x36, 0x2d, 0x9b, 0x31, 0x93, 0xac, + 0x44, 0xba, 0xfe, 0x4e, + 0x8e, 0x56, 0x23, 0xfc, 0xf2, 0x29, 0xfc, 0xf4, 0x3d, 0x6b, 0xf1, 0xf1, + 0xa6, 0x67, 0x7b, 0xb1, + 0xe7, 0xf7, 0xf5, 0x51, 0x3f, 0x0e, 0xb4, 0xb4, 0x5a, 0xc6, 0x86, 0x27, + 0x6e, 0xd3, 0xde, 0x3b, + 0xaf, 0xdd, 0xb0, 0x97, 0xbd, 0x75, 0x66, 0x36, 0x3d, 0xd3, 0xeb, 0xee, + 0x19, 0x5d, 0x9f, 0x68, + 0x6a, 0x8f, 0x0c, 0x9c, 0x3f, 0x83, 0x6b, 0x4b, 0xb2, 0x35, 0xd6, 0x18, + 0xa8, 0x77, 0x20, 0x46, + 0x8a, 0xe5, 0x12, 0xc1, 0xfe, 0x53, 0xf3, 0xd3, 0x46, 0xa6, 0x15, 0xba, + 0x74, 0xfe, 0x98, 0xde, + 0x1f, 0xeb, 0x3f, 0x49, 0x74, 0xd7, 0xc3, 0xb5, 0xd8, 0xc3, 0x14, 0x8b, + 0x18, 0x46, 0x44, 0x87, + 0x4f, 0xbf, 0x29, 0x6c, 0xbd, 0x69, 0x91, 0x2c, 0x56, 0x05, 0x1f, 0xa0, + 0x5a, 0x07, 0xbf, 0x16, + 0xdf, 0x24, 0xd9, 0x19, 0x67, 0x88, 0x51, 0xa2, 0x79, 0xd6, 0xf7, 0x12, + 0xc3, 0xf0, 0xcf, 0x5e, + 0x97, 0xfb, 0x76, 0x49, 0xcf, 0xc5, 0x1d, 0x87, 0x8d, 0xf5, 0x93, 0x5f, + 0xab, 0x11, 0xbb, 0x84, + 0x5f, 0xe7, 0x2b, 0xe8, 0x31, 0xd1, 0x91, 0xef, 0x67, 0x75, 0x93, 0x78, + 0x67, 0xc6, 0xa8, 0xec, + 0xe2, 0xb4, 0xe1, 0x81, 0xf4, 0x5c, 0x18, 0xdf, 0xc4, 0x9d, 0xd7, 0xe3, + 0xf5, 0x68, 0x52, 0x87, + 0x53, 0xa7, 0x3b, 0x78, 0x5e, 0x2f, 0x01, 0x69, 0xf9, 0x7e, 0x53, 0x75, + 0x7e, 0xcd, 0x37, 0xdf, + 0xa4, 0x20, 0x23, 0x27, 0x33, 0x2f, 0x3e, 0x27, 0xd0, 0x5c, 0xe8, 0x90, + 0xe6, 0x33, 0xeb, 0xd1, + 0x9e, 0xbd, 0xdc, 0x9a, 0x97, 0xbb, 0x1e, 0x5e, 0xbb, 0xcf, 0xa1, 0x3a, + 0x76, 0x71, 0xd7, 0x4d, + 0x7c, 0xf5, 0x39, 0x68, 0x1a, 0x93, 0x3a, 0xaf, 0x8d, 0xe1, 0xea, 0x59, + 0x8d, 0xb3, 0xa5, 0xe4, + 0x56, 0xc7, 0x36, 0xe6, 0x04, 0x54, 0x27, 0x86, 0xf5, 0xd3, 0x83, 0xc7, + 0x62, 0xd4, 0x6a, 0x8e, + 0xc5, 0x5c, 0x8d, 0x4f, 0x4b, 0xae, 0x63, 0x58, 0x58, 0x8b, 0xa7, 0xeb, + 0x4f, 0x87, 0xa0, 0xba, + 0xaf, 0x66, 0x66, 0xa3, 0x47, 0xab, 0xaf, 0xd3, 0xef, 0x77, 0x7f, 0xf3, + 0x81, 0xc5, 0x0f, 0xdc, + 0xdf, 0xfd, 0xd3, 0x56, 0x2f, 0x25, 0x40, 0x0c, 0xc0, 0xf2, 0x7a, 0xc1, + 0xfc, 0xd7, 0x48, 0x29, + 0x91, 0x4b, 0x56, 0x83, 0xe5, 0xf5, 0x22, 0x68, 0xa2, 0x33, 0x6d, 0x54, + 0xa2, 0x1c, 0x6d, 0xf4, + 0xe8, 0x9d, 0xa6, 0x17, 0x65, 0x8c, 0xc8, 0x28, 0xce, 0x18, 0xc1, 0xf2, + 0x49, 0x9a, 0xe6, 0xa9, + 0x86, 0x85, 0x09, 0x86, 0xcc, 0xd1, 0x69, 0x23, 0xc0, 0x7f, 0x08, 0x9c, + 0x4f, 0x77, 0x64, 0xfe, + 0xfd, 0x35, 0xaf, 0x5a, 0x9c, 0x53, 0x8d, 0x6f, 0xa2, 0x5e, 0xe2, 0x9b, + 0xa4, 0x14, 0xc6, 0xe7, + 0x6a, 0xb9, 0x3e, 0x56, 0xf7, 0xb0, 0xc5, 0x72, 0x41, 0xb8, 0x6f, 0x5a, + 0x1c, 0xa6, 0xc5, 0x2e, + 0xf0, 0xdd, 0x7d, 0xf4, 0x68, 0x5f, 0x8a, 0xc3, 0x2c, 0xf1, 0xba, 0x74, + 0xbe, 0xc2, 0x7f, 0x4c, + 0x82, 0xe7, 0xf5, 0xa2, 0x19, 0x07, 0x31, 0x2f, 0x66, 0x94, 0xff, 0xfc, + 0x5a, 0xa6, 0xd6, 0xbf, + 0xa6, 0xbd, 0xa7, 0x12, 0x65, 0x0c, 0xc4, 0x37, 0x89, 0x90, 0x92, 0xc3, + 0xa8, 0xd3, 0xad, 0x3b, + 0xdf, 0x5f, 0xa7, 0x3f, 0xc0, 0x9d, 0x5f, 0xe3, 0x92, 0xfd, 0xf3, 0x4d, + 0xb4, 0xba, 0x89, 0xaf, + 0xd8, 0x25, 0x8c, 0xb8, 0x40, 0x7d, 0xf4, 0xb2, 0x87, 0xae, 0x51, 0xe1, + 0xae, 0x9b, 0xb8, 0xb8, + 0xf2, 0x59, 0xc3, 0x7c, 0xd4, 0xc3, 0x6b, 0xf4, 0x39, 0x24, 0xe9, 0x99, + 0xcf, 0xac, 0xb7, 0xe6, + 0xa5, 0x6b, 0x36, 0x6d, 0x04, 0x49, 0x70, 0xa4, 0xe6, 0x7a, 0xff, 0x9d, + 0xea, 0xc4, 0xb0, 0xb5, + 0x74, 0x04, 0xa6, 0xcc, 0x33, 0xd7, 0xe1, 0xa7, 0x3d, 0xf0, 0x69, 0xf4, + 0x2b, 0x0c, 0xcf, 0x1b, + 0xcc, 0xac, 0x5b, 0x3f, 0x0e, 0xa8, 0x43, 0x50, 0xb3, 0x96, 0x51, 0x07, + 0xe7, 0x13, 0x58, 0x5e, + 0x2f, 0x78, 0xfc, 0xce, 0xa5, 0xa8, 0x51, 0xc6, 0x60, 0x76, 0x97, 0x9c, + 0x9f, 0x3e, 0xd2, 0xeb, + 0x7b, 0x7a, 0x69, 0xc7, 0xa7, 0x8d, 0xcc, 0xd4, 0x7a, 0x83, 0xb4, 0xbc, + 0x85, 0x96, 0xbb, 0xd0, + 0xfa, 0x92, 0x3d, 0x7d, 0x4e, 0x3e, 0x72, 0x4a, 0xa1, 0xd8, 0x40, 0x42, + 0xb8, 0x6a, 0x5e, 0xfe, + 0x73, 0xdb, 0xda, 0x77, 0x89, 0x91, 0xc1, 0xf7, 0xb3, 0xc6, 0x71, 0xd5, + 0x75, 0x0f, 0x35, 0x18, + 0xf7, 0x37, 0x82, 0xa4, 0x31, 0x1e, 0x9a, 0x14, 0xc9, 0x05, 0xd2, 0x73, + 0x49, 0xd5, 0x62, 0x97, + 0xd4, 0x11, 0x31, 0x01, 0xf2, 0x6b, 0x97, 0xf2, 0x7a, 0x61, 0xea, 0xe3, + 0xbd, 0xfc, 0x7c, 0xff, + 0x65, 0xf3, 0x4d, 0x42, 0xc2, 0x85, 0xbf, 0x47, 0xcf, 0xa7, 0xba, 0x2f, + 0x99, 0xe1, 0x77, 0x56, + 0x30, 0xbe, 0x89, 0xa6, 0x3d, 0x1b, 0x7c, 0xbe, 0x93, 0xde, 0x5e, 0xf6, + 0x94, 0x30, 0x6a, 0x54, + 0x44, 0xd9, 0x33, 0xb4, 0xd8, 0x40, 0xc3, 0x75, 0x4f, 0x5f, 0x72, 0x9d, + 0x3e, 0x87, 0x78, 0x43, + 0xb2, 0xe6, 0xa7, 0x07, 0xe3, 0xca, 0xbb, 0xe7, 0xb0, 0x86, 0x25, 0x7e, + 0x8f, 0x24, 0x2c, 0x96, + 0xf2, 0xee, 0x29, 0xf3, 0x15, 0xc3, 0x7a, 0x38, 0x6f, 0x75, 0xfb, 0xf7, + 0x9e, 0xeb, 0xd5, 0xef, + 0xeb, 0x76, 0xcf, 0xc4, 0x4a, 0xb1, 0x7c, 0xac, 0x0c, 0xfb, 0x9b, 0x41, + 0x5a, 0xfd, 0x58, 0xaf, + 0x0e, 0xc1, 0xa0, 0x92, 0x2e, 0xff, 0x0a, 0x14, 0x03, 0xd5, 0xc9, 0xeb, + 0xf9, 0x8f, 0xdf, 0x83, + 0x71, 0xc2, 0x70, 0x6a, 0x61, 0xfa, 0x48, 0x9f, 0xe7, 0x23, 0x60, 0x63, + 0x8c, 0x25, 0x8e, 0x4b, + 0x60, 0x7d, 0x4e, 0x85, 0x19, 0x23, 0x2f, 0xf5, 0xe2, 0xf9, 0xd0, 0x73, + 0x71, 0xff, 0x5d, 0xfe, + 0x17, 0x9a, 0x56, 0x5a, 0x0e, 0x4b, 0x0f, 0xf7, 0x8d, 0x69, 0xde, 0x2b, + 0x80, 0xed, 0x4a, 0x10, + 0xee, 0xaf, 0xaf, 0xbc, 0x9e, 0x97, 0x9e, 0x8b, 0xb7, 0x0e, 0x3e, 0xb3, + 0xb9, 0x00, 0x7a, 0x2e, + 0x7f, 0x4d, 0x7f, 0xff, 0x15, 0xe7, 0xfb, 0xab, 0xeb, 0x26, 0x2e, 0xbe, + 0x49, 0x90, 0xf9, 0x26, + 0x5a, 0x4e, 0x43, 0x47, 0x2d, 0x5c, 0xb7, 0x76, 0xcd, 0x98, 0xb0, 0xe9, + 0xf9, 0x50, 0x2d, 0xaf, + 0x67, 0x8d, 0x35, 0x04, 0xca, 0xaf, 0xb1, 0xd8, 0x85, 0xcd, 0x45, 0x0d, + 0xe6, 0x17, 0xe9, 0xae, + 0x85, 0x6b, 0xd7, 0xc6, 0x70, 0xd6, 0xc2, 0xab, 0xaf, 0x8d, 0x35, 0xf9, + 0x26, 0xde, 0xb1, 0x47, + 0x2d, 0xbe, 0x89, 0x2f, 0x5d, 0xcd, 0x50, 0x38, 0x2e, 0xde, 0xfc, 0x7c, + 0x7f, 0xdf, 0x93, 0x69, + 0xfb, 0x7a, 0xe7, 0x76, 0x7c, 0xc5, 0xb0, 0x75, 0xb4, 0x04, 0xd6, 0x3e, + 0x74, 0x07, 0x8b, 0x51, + 0x5d, 0x1c, 0x8b, 0x48, 0xc2, 0xf2, 0x17, 0xac, 0xde, 0x10, 0xfb, 0xf9, + 0xc3, 0x2f, 0x55, 0xd7, + 0x8f, 0x83, 0xe8, 0x10, 0xdc, 0xf2, 0x49, 0xd3, 0x97, 0x03, 0xea, 0x89, + 0x00, 0xce, 0x27, 0x05, + 0xca, 0xeb, 0xb9, 0x8f, 0x65, 0xbc, 0x2d, 0x35, 0x97, 0xf5, 0x8e, 0x04, + 0xb3, 0xbb, 0xb4, 0xc2, + 0x8c, 0x11, 0xba, 0x7c, 0xe6, 0xc2, 0xe4, 0x11, 0x89, 0x7e, 0xf4, 0x5c, + 0x3c, 0xfe, 0x3a, 0xf3, + 0xd3, 0xc3, 0xa3, 0x55, 0x1f, 0x72, 0xcd, 0x8b, 0x0b, 0xca, 0x7d, 0x73, + 0xba, 0x34, 0x4f, 0xe3, + 0x82, 0x72, 0xdf, 0x02, 0x6b, 0xd5, 0x7b, 0xfa, 0x92, 0x93, 0xbd, 0x63, + 0x17, 0x5f, 0xf3, 0x83, + 0xdd, 0x71, 0x98, 0xee, 0x3e, 0xde, 0xe2, 0x4c, 0x9d, 0xfd, 0x7a, 0x61, + 0xca, 0xf7, 0xbb, 0xfb, + 0x72, 0xe2, 0xaa, 0xf9, 0x26, 0x59, 0x7e, 0xf8, 0x26, 0x19, 0xa3, 0xb2, + 0x5c, 0xf1, 0x3b, 0x09, + 0xc8, 0x71, 0x01, 0x5c, 0xd0, 0xab, 0x49, 0x1d, 0x11, 0xc6, 0x59, 0x73, + 0xd5, 0x79, 0xbd, 0x4b, + 0x7c, 0x93, 0xdc, 0x3a, 0x7c, 0x93, 0xe2, 0x8c, 0x1a, 0x75, 0x13, 0x9f, + 0xb1, 0x8b, 0x56, 0x0b, + 0x8f, 0x0e, 0x67, 0x7f, 0xff, 0x15, 0xd4, 0xbc, 0x74, 0xf0, 0x4d, 0x94, + 0x9a, 0x7c, 0x13, 0x17, + 0xc7, 0x25, 0x4c, 0xbd, 0xec, 0xf0, 0x3d, 0xd9, 0xec, 0x33, 0xef, 0xeb, + 0x54, 0x93, 0x59, 0x75, + 0xe7, 0x92, 0x7b, 0x74, 0xee, 0x9f, 0x58, 0xd8, 0x67, 0xc0, 0x75, 0x1f, + 0xd4, 0x1f, 0xe4, 0xef, + 0x3d, 0x63, 0xc6, 0xf7, 0x7c, 0x53, 0xeb, 0xf3, 0x5b, 0x6a, 0xef, 0xef, + 0xab, 0x8e, 0xfb, 0xf8, + 0xc2, 0xbb, 0x06, 0x74, 0x1a, 0x5f, 0xff, 0x4d, 0xd6, 0xab, 0x1c, 0x9e, + 0xbc, 0x5e, 0x24, 0x61, + 0x75, 0x8d, 0xa0, 0x39, 0x5f, 0xb0, 0x01, 0x56, 0xa3, 0xd7, 0x35, 0x6f, + 0xd1, 0x7d, 0x3e, 0xfa, + 0xd6, 0x73, 0x71, 0xfb, 0xeb, 0x70, 0x3e, 0xa6, 0xda, 0xe3, 0x73, 0xfd, + 0xe9, 0xb9, 0xfc, 0x55, + 0x36, 0x10, 0x9c, 0x5b, 0x16, 0x83, 0xe3, 0x1d, 0xb1, 0x1a, 0x06, 0xc5, + 0x04, 0xe3, 0x7e, 0xe8, + 0xcc, 0xf7, 0x6b, 0x39, 0x36, 0x88, 0x5d, 0xfc, 0xce, 0x0f, 0x76, 0xc7, + 0x61, 0xa1, 0xe8, 0x7c, + 0x85, 0x9a, 0xeb, 0x0c, 0x53, 0xbe, 0x3f, 0x28, 0xdf, 0x24, 0x2b, 0x28, + 0xdf, 0x24, 0xcc, 0x9a, + 0xd4, 0x21, 0x68, 0xd7, 0xf8, 0xcc, 0xeb, 0x79, 0xf5, 0x25, 0xa7, 0xd5, + 0xc2, 0xc2, 0x6a, 0x5c, + 0x97, 0x6a, 0xf2, 0x4d, 0x5c, 0xb8, 0x10, 0xa9, 0xaf, 0x16, 0xae, 0xab, + 0xbf, 0x3f, 0x21, 0xb8, + 0x46, 0x85, 0x9e, 0x3a, 0xa0, 0xe6, 0x33, 0x67, 0x0d, 0x4b, 0x72, 0xd4, + 0xe5, 0x87, 0xd6, 0xe0, + 0x9b, 0xd8, 0xd3, 0xc3, 0xd7, 0xcb, 0x0e, 0xdf, 0x93, 0xe5, 0x77, 0x6a, + 0xf0, 0x24, 0xbe, 0x1a, + 0xf4, 0x4c, 0xed, 0x18, 0x56, 0xab, 0xf1, 0x2e, 0xeb, 0x75, 0x4f, 0xb0, + 0xef, 0x19, 0x6b, 0xcb, + 0x1c, 0xf5, 0x72, 0xed, 0x59, 0x21, 0x5b, 0x5e, 0xea, 0x39, 0x60, 0x4e, + 0x8f, 0x47, 0x5a, 0x8f, + 0x4e, 0x1c, 0x9a, 0x60, 0x4d, 0x30, 0xb2, 0xbc, 0x1a, 0xcb, 0xeb, 0xb1, + 0x1c, 0x4c, 0xa0, 0x7c, + 0x74, 0xb4, 0xd6, 0x97, 0xa3, 0x27, 0xaf, 0x97, 0x96, 0x13, 0xac, 0x37, + 0x83, 0xe5, 0xd3, 0x33, + 0x5c, 0x9a, 0x56, 0x97, 0x93, 0xdb, 0xf6, 0xd2, 0x73, 0xf1, 0xea, 0xd9, + 0x0a, 0xa0, 0xe7, 0x72, + 0xc9, 0x06, 0xf4, 0xf9, 0xe9, 0xc1, 0x6d, 0xc0, 0x9d, 0xdb, 0x16, 0xf5, + 0x70, 0xdf, 0x5c, 0x7d, + 0x2f, 0x41, 0xe7, 0xbe, 0x49, 0x21, 0xd4, 0x01, 0xed, 0x5e, 0x5c, 0x79, + 0x5f, 0xf9, 0xb5, 0x31, + 0xae, 0xd8, 0xc5, 0x5f, 0xff, 0x5a, 0xc8, 0xb8, 0x50, 0x93, 0x9f, 0x1f, + 0xf8, 0x98, 0x5c, 0x41, + 0xbe, 0xdf, 0xbb, 0x6e, 0xe2, 0x93, 0x6f, 0x62, 0xad, 0xcd, 0x37, 0xf9, + 0x87, 0xf6, 0xf1, 0x6a, + 0xd7, 0xee, 0x74, 0x6d, 0xbe, 0x67, 0x40, 0xbe, 0x09, 0x5c, 0xaf, 0x19, + 0x16, 0x85, 0x55, 0x7b, + 0x36, 0x8c, 0xb5, 0x70, 0xa6, 0x51, 0x11, 0x94, 0x6f, 0x52, 0x94, 0x39, + 0x3c, 0xab, 0x20, 0x39, + 0x30, 0xdf, 0x44, 0x6f, 0xcf, 0xaa, 0x18, 0xcf, 0xa7, 0x3a, 0x13, 0x47, + 0xd5, 0x78, 0x8d, 0x89, + 0x0f, 0xd5, 0x99, 0xb7, 0x5b, 0xca, 0x7c, 0xc2, 0xb5, 0x03, 0xef, 0x08, + 0x86, 0xb9, 0xac, 0x1e, + 0xd9, 0x7e, 0xee, 0xcb, 0x0f, 0xd5, 0xd2, 0x21, 0x30, 0x6a, 0xf5, 0x7d, + 0x8d, 0x73, 0x92, 0x60, + 0x64, 0xdc, 0x8c, 0x24, 0x7b, 0x52, 0x6e, 0x92, 0xc6, 0xd1, 0x48, 0x30, + 0xc4, 0x2b, 0xb1, 0x46, + 0xc6, 0x57, 0x8b, 0xac, 0x85, 0x85, 0xba, 0xf3, 0x7a, 0x05, 0x7e, 0xf2, + 0x7a, 0xb5, 0xec, 0x8e, + 0xf5, 0xb9, 0xe9, 0xea, 0x59, 0x0d, 0x58, 0xf3, 0x62, 0x3d, 0x5b, 0x09, + 0x1c, 0xf3, 0x15, 0x58, + 0x3c, 0xed, 0x53, 0xcf, 0x45, 0x75, 0xf5, 0x25, 0x47, 0xd9, 0xd2, 0x74, + 0x5d, 0x1b, 0x43, 0xe9, + 0x59, 0x0d, 0xda, 0x23, 0x23, 0x5f, 0xd2, 0x7c, 0x0e, 0x36, 0xf7, 0x4d, + 0x7f, 0xbe, 0xdf, 0x9f, + 0x56, 0xbd, 0x97, 0x0e, 0x7e, 0x61, 0xfa, 0xc8, 0x60, 0xf9, 0xb5, 0x90, + 0xfa, 0x78, 0x0b, 0xc3, + 0x77, 0x4c, 0x74, 0xf4, 0xf1, 0x6a, 0x36, 0xca, 0xfc, 0x05, 0x9f, 0x7c, + 0x13, 0xef, 0xbe, 0x64, + 0x29, 0x8e, 0x0b, 0x9f, 0x4e, 0xb7, 0xfe, 0x5a, 0xb8, 0x6e, 0xed, 0x1a, + 0x97, 0xcf, 0xec, 0x5f, + 0xcf, 0x85, 0xf5, 0x3a, 0x14, 0x6b, 0x7c, 0x93, 0xdc, 0x40, 0x7c, 0x93, + 0x50, 0xf2, 0x7a, 0xd9, + 0x7a, 0xb5, 0x6b, 0x2e, 0x53, 0xa3, 0xa2, 0x26, 0xdf, 0x24, 0x5b, 0x1f, + 0xdf, 0x44, 0x6f, 0xcf, + 0x2a, 0x7c, 0xcf, 0x34, 0x47, 0x42, 0xcd, 0xcf, 0x3f, 0xf6, 0x56, 0xad, + 0x07, 0xba, 0xa4, 0xf0, + 0xe2, 0x90, 0xda, 0x3c, 0xde, 0xc8, 0x20, 0xb9, 0x11, 0xc6, 0xbb, 0x60, + 0xe7, 0x46, 0x76, 0x61, + 0x93, 0x21, 0xbe, 0x1f, 0x1b, 0x89, 0x19, 0x7e, 0x24, 0xd9, 0x12, 0x0c, + 0x09, 0xb6, 0xa4, 0x5c, + 0x8d, 0x9b, 0xc1, 0x38, 0x1a, 0xe0, 0xf3, 0x32, 0x3c, 0x8c, 0x57, 0x3c, + 0xbe, 0x43, 0x24, 0x8e, + 0xb7, 0xa7, 0xe6, 0x06, 0xcd, 0xbf, 0x6a, 0x79, 0xbd, 0xf4, 0xa0, 0x79, + 0x3d, 0x76, 0x3d, 0xce, + 0xd4, 0xa1, 0x69, 0xc5, 0xe6, 0x35, 0xa4, 0xe8, 0xf0, 0x99, 0x35, 0x1b, + 0x80, 0x6b, 0x8f, 0x3f, + 0x3d, 0x17, 0x56, 0x37, 0x61, 0xf5, 0x66, 0x66, 0xeb, 0x7e, 0xf5, 0x5c, + 0xbc, 0x73, 0x58, 0x7a, + 0xfa, 0xc4, 0x74, 0xd4, 0xbc, 0x22, 0x99, 0xe6, 0xa9, 0xbb, 0xef, 0x25, + 0xa8, 0xce, 0x97, 0xfe, + 0x3e, 0xde, 0xe0, 0xc7, 0xc4, 0xc2, 0x66, 0xe1, 0x65, 0xb2, 0xd8, 0x65, + 0x54, 0x4d, 0x3d, 0x97, + 0x5a, 0x7c, 0x93, 0x50, 0x74, 0xbe, 0xe4, 0xf0, 0x1c, 0x93, 0x50, 0xe6, + 0xef, 0xb9, 0xfc, 0x05, + 0xdf, 0x7a, 0x2e, 0x97, 0xf8, 0x26, 0xe9, 0x41, 0xf9, 0x26, 0x61, 0xef, + 0xe3, 0xbd, 0x6c, 0xed, + 0x9a, 0x20, 0x7c, 0x13, 0x1f, 0x7a, 0x2e, 0xa1, 0xf6, 0xf7, 0x87, 0xad, + 0xe6, 0xa5, 0x06, 0xbd, + 0x36, 0x6a, 0x71, 0x18, 0xb3, 0x51, 0x76, 0x4e, 0xd5, 0xd4, 0x5f, 0x04, + 0x5c, 0xf7, 0xae, 0x9b, + 0x88, 0x7e, 0xe6, 0x35, 0xd4, 0xf1, 0x8b, 0x92, 0x8d, 0x69, 0xf6, 0xb8, + 0x9a, 0xc7, 0xcc, 0xd1, + 0x7a, 0x84, 0xbf, 0x79, 0xbb, 0x4d, 0xac, 0x11, 0x39, 0x81, 0xe2, 0x11, + 0xc6, 0xbd, 0xd5, 0x91, + 0xd7, 0xe3, 0x93, 0xdd, 0x7c, 0x93, 0x9a, 0x3c, 0xe4, 0xd4, 0x9c, 0x54, + 0x17, 0x17, 0x39, 0x87, + 0xe5, 0xd6, 0xb5, 0xbc, 0x9e, 0x1c, 0xc5, 0x45, 0x06, 0xea, 0xd9, 0x12, + 0xe3, 0x10, 0xbb, 0x06, + 0x44, 0x86, 0x45, 0xd3, 0x2a, 0xb4, 0x79, 0x8b, 0x35, 0x7b, 0xaf, 0x6a, + 0xea, 0xb9, 0xd4, 0xec, + 0xd9, 0xf2, 0xa3, 0xe7, 0xf2, 0x17, 0xf4, 0xac, 0x7a, 0xb8, 0x6f, 0xda, + 0x71, 0x0e, 0xd3, 0x5c, + 0x4e, 0x9d, 0xf9, 0x7e, 0xcf, 0x5c, 0x4e, 0xbf, 0xf3, 0x83, 0x3d, 0x3c, + 0x87, 0xac, 0x82, 0xa4, + 0x91, 0xb1, 0x52, 0x8c, 0xff, 0xbc, 0x69, 0x28, 0xc7, 0x44, 0x2f, 0x2e, + 0x5c, 0x6e, 0xbe, 0xbf, + 0xb6, 0x0e, 0xbe, 0x4e, 0xbe, 0x49, 0x58, 0x78, 0x3f, 0xd5, 0xd7, 0xb4, + 0x30, 0xe5, 0xfb, 0x5d, + 0x7c, 0x13, 0x57, 0xec, 0x12, 0x8c, 0x6f, 0xa2, 0xab, 0x47, 0xc6, 0x95, + 0xd7, 0xbb, 0xa2, 0xf9, + 0xcc, 0x75, 0x7c, 0xe6, 0xa0, 0xfd, 0x7a, 0x34, 0xc5, 0xdd, 0x23, 0x53, + 0x8d, 0xeb, 0x9e, 0x9e, + 0x8d, 0x5a, 0xb8, 0xce, 0x6a, 0xe1, 0xb1, 0x96, 0xc0, 0x7c, 0x93, 0x68, + 0x6b, 0xaa, 0x21, 0xcd, + 0x16, 0x5d, 0xf3, 0xef, 0x64, 0x49, 0xd5, 0x66, 0xab, 0x19, 0x26, 0x5d, + 0xbc, 0xa4, 0xc7, 0x32, + 0x7e, 0xe2, 0x1b, 0xec, 0xbe, 0xf6, 0xf9, 0x11, 0xc3, 0x02, 0xf4, 0x7b, + 0x20, 0xe6, 0xd7, 0x05, + 0xed, 0x93, 0x05, 0xcc, 0x4d, 0x56, 0x6a, 0xe4, 0xf5, 0x58, 0xfd, 0xd8, + 0xc5, 0xdb, 0x05, 0x5f, + 0x2a, 0x25, 0x3f, 0x35, 0x87, 0x71, 0x33, 0x5c, 0xfc, 0x8c, 0x94, 0x9c, + 0x64, 0x47, 0xd2, 0xa5, + 0x38, 0xaa, 0xf6, 0x77, 0x01, 0x2c, 0xcd, 0x28, 0x48, 0xce, 0x09, 0x9a, + 0xc3, 0xd2, 0x34, 0xad, + 0xa2, 0xff, 0x52, 0x4d, 0xab, 0x1a, 0x7d, 0xc9, 0xe0, 0xaf, 0xb3, 0xbf, + 0xd3, 0xa5, 0x9e, 0x2d, + 0x1f, 0x7a, 0x2e, 0xcc, 0xfe, 0xdd, 0x39, 0xac, 0xe0, 0x36, 0xa0, 0x2f, + 0x56, 0x65, 0xdc, 0xb7, + 0x38, 0x29, 0x08, 0x6e, 0x84, 0xd8, 0xc3, 0x78, 0x45, 0x3a, 0x5f, 0xb5, + 0x75, 0xf0, 0xc7, 0x06, + 0xd1, 0x73, 0xf9, 0x0b, 0xfa, 0xfb, 0x43, 0xca, 0xf7, 0x07, 0xe3, 0x9b, + 0x38, 0xd2, 0x83, 0xf3, + 0x4d, 0xe0, 0xef, 0x9a, 0x1c, 0xce, 0x3e, 0xde, 0x70, 0x6a, 0xd7, 0x68, + 0xef, 0x99, 0x31, 0x9c, + 0x71, 0x62, 0xfc, 0xe5, 0xd7, 0x34, 0xbe, 0x49, 0x7e, 0x7a, 0x4e, 0x16, + 0xe0, 0x5f, 0x60, 0xae, + 0x7c, 0x78, 0x7b, 0xd9, 0x43, 0xac, 0x79, 0xf1, 0x7a, 0xf8, 0x26, 0x19, + 0x8c, 0xd7, 0xc0, 0xfa, + 0xd7, 0xfc, 0xf0, 0x4d, 0x62, 0x6d, 0x69, 0xb9, 0x69, 0xd6, 0xba, 0xb9, + 0xf7, 0x67, 0x6b, 0xf5, + 0x40, 0x7b, 0x66, 0x72, 0xa4, 0x49, 0x01, 0xae, 0x2f, 0x62, 0x3c, 0xcf, + 0x7a, 0x18, 0x83, 0xf6, + 0xeb, 0xa9, 0xc9, 0x06, 0x77, 0x8f, 0xa3, 0x5f, 0x1f, 0x97, 0xe1, 0x47, + 0x2a, 0xc3, 0x40, 0x88, + 0x6d, 0x19, 0x3f, 0x81, 0xf9, 0x50, 0x69, 0xf9, 0x5a, 0xcf, 0x85, 0x77, + 0x2f, 0x1e, 0xd6, 0xf2, + 0x7a, 0x79, 0xc1, 0xb5, 0xea, 0xe1, 0x7a, 0xcc, 0x6c, 0x40, 0x9f, 0x7e, + 0x53, 0x78, 0x72, 0xdb, + 0x54, 0xcb, 0x61, 0xd9, 0x62, 0x0c, 0xd5, 0x75, 0x13, 0x3f, 0x3a, 0xf8, + 0x99, 0xc5, 0x99, 0xc3, + 0x63, 0xcd, 0x81, 0x75, 0xea, 0xa3, 0xf4, 0x5d, 0x1b, 0x49, 0x8c, 0x43, + 0xe3, 0xbe, 0x61, 0x1d, + 0xf8, 0x47, 0xf4, 0xf5, 0xf7, 0xc7, 0x86, 0x2b, 0xdf, 0xcf, 0xe2, 0x30, + 0x4d, 0xe7, 0x2b, 0xc3, + 0x9b, 0x6f, 0x32, 0xc6, 0x07, 0xdf, 0x44, 0xd4, 0xa7, 0xf3, 0x15, 0x65, + 0xd3, 0x5f, 0x07, 0x0c, + 0x5b, 0x1f, 0xaf, 0xa6, 0x97, 0x13, 0x97, 0x13, 0x8c, 0x6f, 0xa2, 0x61, + 0x91, 0x1a, 0x84, 0x6f, + 0xc2, 0xfa, 0x78, 0xff, 0x01, 0xda, 0x35, 0x3e, 0xf9, 0x26, 0x63, 0x6b, + 0xf1, 0x4d, 0x7c, 0xf5, + 0x39, 0xb8, 0xf3, 0x7a, 0xf1, 0x7f, 0x5d, 0x2f, 0xbb, 0xff, 0x9e, 0x55, + 0x7f, 0xd7, 0x46, 0x0f, + 0xdf, 0x44, 0xe3, 0xca, 0x7b, 0xf1, 0x4d, 0x6a, 0xeb, 0x6a, 0xba, 0xbf, + 0x0b, 0xbb, 0x9e, 0xf9, + 0x3a, 0x37, 0xfa, 0xb3, 0x7e, 0x97, 0x39, 0x1b, 0x07, 0x6a, 0xe8, 0x97, + 0xbf, 0x62, 0x98, 0x4b, + 0xef, 0xb4, 0x67, 0xff, 0xa0, 0xfd, 0x2a, 0xd6, 0xd8, 0xa0, 0xfa, 0x7a, + 0x71, 0x2c, 0xaf, 0x17, + 0xec, 0xef, 0xc4, 0x66, 0xf0, 0x16, 0xa6, 0x8d, 0x8c, 0x93, 0x18, 0x8f, + 0xcb, 0x35, 0x47, 0x23, + 0x63, 0x74, 0xc6, 0x08, 0xb6, 0x35, 0x3c, 0x2c, 0x70, 0xf5, 0x9f, 0xc5, + 0xc2, 0x6b, 0xb1, 0xbc, + 0x5e, 0xe0, 0x73, 0x48, 0xd3, 0xb4, 0xfa, 0x7b, 0x67, 0x50, 0xd6, 0xd1, + 0x65, 0xf7, 0xa3, 0xe7, + 0xa2, 0x69, 0x04, 0x67, 0x0e, 0x0b, 0xa4, 0xe7, 0x12, 0x4a, 0xac, 0x1a, + 0xa7, 0x47, 0xf3, 0x34, + 0xd4, 0x3e, 0xde, 0xf0, 0xcd, 0xe5, 0xd4, 0x62, 0x97, 0x24, 0xd9, 0x9b, + 0x6f, 0x92, 0xe9, 0xab, + 0x86, 0x34, 0x2a, 0xcb, 0xc3, 0x95, 0x0f, 0xc0, 0x37, 0xf9, 0x9f, 0x69, + 0x5a, 0xd5, 0xcc, 0xf7, + 0xd7, 0x9c, 0x1f, 0xec, 0xe5, 0xef, 0xbb, 0xf8, 0x26, 0xfe, 0xeb, 0xe1, + 0x21, 0x69, 0xd5, 0x87, + 0x4b, 0xd3, 0x2a, 0xb0, 0x46, 0xc5, 0x25, 0xbe, 0x49, 0x51, 0x6d, 0xbe, + 0x49, 0x4d, 0x3d, 0x17, + 0x17, 0x57, 0x3e, 0x46, 0x27, 0x2f, 0x3c, 0x04, 0x4d, 0xea, 0xe0, 0x35, + 0x2f, 0xad, 0x67, 0x35, + 0x68, 0x5e, 0x8f, 0xf5, 0xe5, 0x40, 0x6c, 0x50, 0x83, 0x6f, 0x32, 0xd6, + 0x13, 0xeb, 0x7b, 0xae, + 0xb7, 0xf1, 0x86, 0x04, 0xc0, 0x49, 0x77, 0x8d, 0xa1, 0xc6, 0xdf, 0xbd, + 0xdb, 0xa2, 0x41, 0xf7, + 0x0d, 0x5a, 0x3c, 0xe3, 0x3e, 0x6f, 0xfd, 0xd3, 0x47, 0x3f, 0x8d, 0x78, + 0x39, 0x28, 0x0f, 0xcd, + 0xaa, 0xb3, 0x5f, 0x2f, 0x58, 0xbf, 0x0a, 0xcb, 0xeb, 0xc1, 0xf1, 0xbe, + 0x14, 0x13, 0x45, 0x55, + 0x6b, 0xc7, 0x33, 0xfc, 0x60, 0x3e, 0x13, 0xdb, 0x0c, 0x0f, 0x99, 0x46, + 0x70, 0x52, 0xa0, 0x9e, + 0x2d, 0xad, 0x97, 0x3d, 0x4b, 0xa7, 0x0d, 0xe8, 0x9c, 0xb7, 0xe8, 0xb8, + 0x82, 0xdc, 0x76, 0x0d, + 0x1d, 0xfc, 0x8c, 0x11, 0x01, 0xe7, 0x07, 0xbb, 0x3f, 0x8b, 0x2e, 0x5d, + 0x76, 0xf7, 0xdc, 0x4b, + 0x4f, 0xdd, 0xd7, 0x5d, 0x17, 0x20, 0x81, 0xf2, 0x7a, 0xe1, 0x3b, 0x26, + 0x99, 0xfe, 0x8f, 0x89, + 0x30, 0x9d, 0x7c, 0x22, 0x4e, 0x21, 0x53, 0xc4, 0xc9, 0x64, 0x8a, 0xc4, + 0x6e, 0x6b, 0x6d, 0x8b, + 0x6b, 0x4f, 0x95, 0xa6, 0x62, 0xb6, 0x3f, 0x93, 0xbe, 0xc7, 0x97, 0xf8, + 0x26, 0x89, 0x7e, 0xf9, + 0x26, 0x71, 0xe1, 0xc6, 0x85, 0x2b, 0xd5, 0xf3, 0xf1, 0xea, 0x4b, 0xae, + 0x8e, 0xf5, 0x03, 0xd4, + 0xc3, 0x23, 0xd5, 0x10, 0x78, 0x3f, 0x7f, 0xab, 0x76, 0x8d, 0xa6, 0x49, + 0x3d, 0x32, 0xd5, 0x1e, + 0x84, 0x6f, 0x02, 0xf8, 0xc1, 0x70, 0x11, 0xde, 0x13, 0x85, 0x31, 0x7e, + 0xff, 0x2b, 0xb4, 0x6b, + 0x5c, 0x31, 0xa5, 0xa7, 0xcf, 0xa9, 0x38, 0x4b, 0xc3, 0x0e, 0xed, 0xfa, + 0x04, 0xbe, 0x94, 0xeb, + 0x1c, 0xf3, 0xcc, 0xeb, 0x76, 0xbd, 0x6e, 0x53, 0x4f, 0x0f, 0xb4, 0x3b, + 0xef, 0xc7, 0x34, 0xec, + 0x83, 0xe6, 0xf5, 0xd4, 0x14, 0x63, 0xaa, 0x35, 0xf8, 0x6c, 0x46, 0x96, + 0x0b, 0x0a, 0x96, 0xdb, + 0x09, 0x94, 0xd7, 0x73, 0xf9, 0xeb, 0x2e, 0x0d, 0x14, 0x86, 0x6b, 0x2e, + 0xde, 0xae, 0xfb, 0xef, + 0xa2, 0x5d, 0xa3, 0x12, 0x6a, 0x6a, 0x98, 0x00, 0x76, 0x66, 0x14, 0x5f, + 0x59, 0x5e, 0x6f, 0xba, + 0xf8, 0x89, 0x66, 0xab, 0x93, 0xc5, 0xc9, 0x74, 0x0a, 0xb3, 0x53, 0xcb, + 0x14, 0x5c, 0xc7, 0x8e, + 0xab, 0xf7, 0xa7, 0x64, 0x3a, 0x1c, 0x6f, 0x3d, 0x5a, 0xf5, 0xda, 0xb5, + 0x11, 0x7c, 0x00, 0x9f, + 0xf3, 0x83, 0xbd, 0xfc, 0xf5, 0x04, 0x5d, 0xbd, 0xec, 0x2e, 0xee, 0x5b, + 0xa4, 0x1b, 0xff, 0x98, + 0x06, 0x42, 0x8c, 0x1c, 0x85, 0xa2, 0x5c, 0xda, 0xcf, 0x35, 0xb1, 0x30, + 0x34, 0x5c, 0xd0, 0x39, + 0x97, 0xd3, 0x0f, 0x2e, 0x88, 0x0a, 0xbd, 0xdb, 0xfe, 0x3c, 0x7d, 0xde, + 0xe6, 0xda, 0xcf, 0xd9, + 0x9e, 0x0b, 0xb8, 0xfb, 0x5a, 0x25, 0xea, 0x9b, 0x6f, 0x52, 0xf3, 0x1a, + 0x97, 0xa8, 0xd3, 0x5f, + 0x08, 0xb3, 0x76, 0x8d, 0x8e, 0xbc, 0x9e, 0xab, 0x2f, 0x27, 0x9e, 0xe9, + 0xf1, 0x06, 0xe2, 0x9b, + 0xd8, 0xd3, 0x47, 0xb9, 0x6b, 0x0c, 0xe4, 0x8a, 0x79, 0x3f, 0x7a, 0xb5, + 0x6b, 0xec, 0x1a, 0x2e, + 0x84, 0xd6, 0xaf, 0xe7, 0x95, 0x5f, 0xab, 0x3b, 0xdf, 0x04, 0x62, 0x97, + 0x00, 0x7a, 0x2e, 0x97, + 0x51, 0x0b, 0xe7, 0x75, 0xf6, 0xac, 0x06, 0xad, 0x79, 0xf9, 0xce, 0x6d, + 0x7b, 0xeb, 0xe0, 0xa7, + 0xe6, 0x30, 0x0d, 0x14, 0x16, 0x4f, 0x6a, 0x3a, 0xf8, 0xce, 0xe4, 0x1c, + 0x0d, 0x3b, 0x20, 0xd6, + 0x8f, 0xf9, 0xda, 0xc5, 0xe3, 0xf5, 0x70, 0x76, 0x6f, 0xff, 0x28, 0x6e, + 0x50, 0xb0, 0xf7, 0x8c, + 0xb5, 0xa5, 0x1a, 0x52, 0x74, 0xf5, 0xeb, 0xa5, 0x8d, 0x8c, 0xd1, 0x31, + 0x83, 0x32, 0x23, 0x5f, + 0xc7, 0x0c, 0x4a, 0x96, 0xd7, 0x73, 0xba, 0xe7, 0x9b, 0x30, 0x1c, 0x1c, + 0xeb, 0x9a, 0x71, 0x92, + 0x31, 0xda, 0xab, 0x2f, 0x59, 0x8a, 0xe5, 0x33, 0x8b, 0xaf, 0x2c, 0xaf, + 0xa7, 0x58, 0xef, 0xae, + 0xb6, 0xdf, 0xe7, 0x83, 0xd8, 0xef, 0x73, 0xf6, 0xbe, 0x54, 0x52, 0x42, + 0x99, 0xab, 0xe6, 0x8a, + 0x1b, 0x83, 0xf2, 0x4d, 0x1c, 0x41, 0xf8, 0x26, 0x66, 0x86, 0x7f, 0x71, + 0x46, 0x8f, 0x0d, 0x78, + 0x6b, 0x3f, 0x33, 0x1d, 0xfc, 0x1a, 0x71, 0x18, 0xeb, 0xe3, 0x1d, 0x1b, + 0x3c, 0x8e, 0x88, 0x0a, + 0xc7, 0x5c, 0x4e, 0x73, 0x31, 0x7d, 0xdd, 0x6a, 0xa4, 0x46, 0x95, 0x6d, + 0x03, 0x31, 0xa8, 0x06, + 0xea, 0xda, 0xb9, 0x24, 0x57, 0xcd, 0xa5, 0xae, 0x3d, 0x8a, 0x8e, 0x72, + 0xef, 0x97, 0x94, 0x22, + 0xc2, 0xde, 0xd3, 0x6f, 0x7e, 0xcd, 0x1d, 0x87, 0xb1, 0xf7, 0x0c, 0xca, + 0x95, 0xd7, 0xa9, 0x55, + 0x1f, 0x4a, 0x5f, 0x8e, 0xde, 0x7c, 0xbf, 0x1e, 0xbe, 0x09, 0xb3, 0x65, + 0x56, 0x0f, 0xf3, 0xa9, + 0xe7, 0x12, 0x0a, 0xef, 0x47, 0x0e, 0xaf, 0x76, 0x8d, 0xdf, 0x9a, 0x97, + 0x77, 0x5f, 0x72, 0x91, + 0xcf, 0xb9, 0x55, 0x75, 0xfa, 0x1c, 0xf4, 0x69, 0xd5, 0xc7, 0x04, 0xce, + 0xeb, 0x85, 0x5c, 0xf3, + 0xca, 0xd2, 0x95, 0xdb, 0x66, 0xf8, 0xc7, 0x7a, 0x56, 0x18, 0x16, 0x32, + 0x0c, 0x64, 0x1a, 0xa1, + 0x4c, 0x1f, 0x34, 0x79, 0x42, 0xd7, 0xb7, 0xaa, 0xf9, 0x1b, 0xcb, 0x6f, + 0xbb, 0x27, 0x59, 0x07, + 0x0f, 0x37, 0xc1, 0x91, 0x36, 0x2a, 0x38, 0x0f, 0x37, 0x16, 0xb3, 0xba, + 0x6e, 0x50, 0x4e, 0x2c, + 0xeb, 0xd7, 0x73, 0xea, 0xe9, 0xd7, 0xd3, 0xb4, 0xea, 0xb9, 0xea, 0xfc, + 0x9a, 0xbb, 0x1e, 0x9e, + 0xed, 0x89, 0x3f, 0xdc, 0x3d, 0x5b, 0xda, 0x1c, 0x17, 0x35, 0xce, 0x10, + 0x48, 0xc3, 0x44, 0xeb, + 0x65, 0xf7, 0x93, 0xc3, 0x2a, 0x56, 0x5e, 0x77, 0xdb, 0xaf, 0xd1, 0xcb, + 0x7e, 0x0d, 0x5e, 0xf6, + 0x9b, 0x5b, 0x6d, 0xbf, 0xa3, 0xd4, 0x97, 0x68, 0xa1, 0x12, 0xca, 0xbc, + 0xc5, 0x18, 0xdf, 0x7c, + 0x13, 0x35, 0x10, 0xdf, 0x24, 0xce, 0xcd, 0x37, 0xf1, 0xfa, 0x2e, 0xa2, + 0xc6, 0x7d, 0x33, 0x7a, + 0xce, 0xbb, 0x68, 0x35, 0x96, 0x67, 0xf1, 0xb0, 0x86, 0x83, 0x4c, 0xff, + 0xd9, 0x3b, 0x0e, 0x53, + 0xe3, 0x8d, 0xec, 0x98, 0x04, 0xad, 0x3d, 0x32, 0x4d, 0xab, 0xfc, 0x2b, + 0xc4, 0x05, 0xd3, 0x38, + 0xfa, 0x96, 0x8a, 0x29, 0x52, 0x11, 0xdb, 0x04, 0x29, 0x88, 0xf2, 0x2a, + 0xcf, 0x36, 0x61, 0xb7, + 0x9c, 0xca, 0xb1, 0x4d, 0xdc, 0xc7, 0x97, 0xbe, 0xa6, 0x8c, 0x21, 0x5e, + 0xfe, 0x82, 0x7f, 0xbe, + 0xc9, 0x98, 0x6c, 0x6d, 0x96, 0x7a, 0x20, 0xbe, 0x89, 0xde, 0xbc, 0x5e, + 0x5c, 0x08, 0xda, 0x35, + 0x57, 0x90, 0xef, 0x27, 0x21, 0xf2, 0x4d, 0xf4, 0xf3, 0x7e, 0x74, 0xf6, + 0x07, 0x24, 0x84, 0xa0, + 0x69, 0x15, 0xac, 0xe6, 0x15, 0x6d, 0x73, 0xc7, 0x2e, 0xfe, 0xf4, 0x5c, + 0xec, 0xae, 0x38, 0x2c, + 0xb1, 0x40, 0xbf, 0xcf, 0xac, 0xcf, 0x5f, 0x08, 0x57, 0xcd, 0x2b, 0x16, + 0x31, 0xcc, 0xd6, 0xce, + 0x0d, 0x96, 0x93, 0xaa, 0x35, 0x13, 0xe4, 0xa6, 0xc5, 0x83, 0xee, 0x63, + 0xf8, 0x77, 0xe3, 0x07, + 0x49, 0x6f, 0x25, 0xdb, 0xe2, 0x73, 0x5d, 0xf1, 0xb1, 0xbf, 0x7a, 0x56, + 0x24, 0x49, 0x82, 0xb8, + 0x36, 0x38, 0x0f, 0xd7, 0x95, 0xd7, 0x0b, 0xde, 0xaf, 0x97, 0x9e, 0x9b, + 0xa9, 0x47, 0x97, 0xdd, + 0x57, 0x5e, 0x8f, 0xe9, 0xb9, 0x78, 0xf7, 0x25, 0x8f, 0x0d, 0x9e, 0x5f, + 0x73, 0xe7, 0xf5, 0xfc, + 0xea, 0xb2, 0x8f, 0x93, 0xdf, 0xa2, 0x58, 0x71, 0xdb, 0xaf, 0x66, 0xc3, + 0xbc, 0x97, 0x0d, 0x73, + 0x6e, 0x1b, 0x36, 0xba, 0x6d, 0xf8, 0x35, 0x5a, 0x6c, 0x0d, 0x57, 0x6e, + 0x9b, 0xc5, 0x1e, 0xf1, + 0x1c, 0x3b, 0xbf, 0xb4, 0x5c, 0xa1, 0xcf, 0x9c, 0x92, 0xbb, 0x6e, 0xe2, + 0xc5, 0x7d, 0xf3, 0x3e, + 0x16, 0x4c, 0xfb, 0x99, 0xe9, 0x62, 0x55, 0xfb, 0x51, 0x5a, 0x3d, 0x2c, + 0x63, 0x38, 0xe3, 0xca, + 0x07, 0xd2, 0x73, 0xa9, 0x3e, 0x26, 0xc1, 0x62, 0x97, 0x60, 0xfd, 0xfd, + 0xa6, 0x0f, 0xe8, 0x10, + 0xd5, 0x44, 0x4d, 0x8a, 0x6b, 0x0b, 0x8a, 0xc0, 0x36, 0x71, 0x6d, 0x4a, + 0xa8, 0x42, 0x28, 0x51, + 0x61, 0xc3, 0x2d, 0x06, 0x9c, 0x7c, 0x4b, 0x79, 0x9f, 0xf8, 0x3e, 0x26, + 0x5e, 0x3a, 0xf8, 0x7a, + 0xf9, 0x26, 0xea, 0xff, 0x68, 0x36, 0x6d, 0x50, 0x9f, 0x59, 0xeb, 0xb5, + 0x1f, 0x99, 0x9e, 0x97, + 0x94, 0x93, 0x1a, 0x90, 0x6f, 0x02, 0xb1, 0x4b, 0xb8, 0x38, 0x2e, 0xba, + 0x35, 0x2a, 0xe2, 0xf5, + 0xcf, 0xa0, 0x74, 0xc5, 0xd2, 0x01, 0xf9, 0x26, 0x69, 0x1a, 0x57, 0xde, + 0xc5, 0x37, 0x89, 0xf4, + 0xc7, 0x37, 0x09, 0xa7, 0x26, 0xb5, 0xfe, 0xd9, 0xb4, 0x7c, 0x66, 0x41, + 0x4a, 0x9d, 0x6b, 0x63, + 0x35, 0x57, 0x0d, 0xae, 0xb9, 0x6d, 0xc6, 0xa6, 0x0d, 0x4e, 0x71, 0xb2, + 0x9e, 0xe4, 0x94, 0x9c, + 0x64, 0xf7, 0x8c, 0x24, 0xc6, 0x57, 0x73, 0xf5, 0xe2, 0x79, 0x61, 0x21, + 0xe3, 0x0f, 0xc1, 0xdf, + 0x31, 0x28, 0x0f, 0x57, 0x4a, 0xe4, 0x32, 0xf2, 0x93, 0x82, 0xe6, 0x5f, + 0xd9, 0xec, 0xd7, 0x0c, + 0x9b, 0x8e, 0x7e, 0xbd, 0xe2, 0x20, 0x39, 0x2c, 0xf8, 0x2e, 0xac, 0xde, + 0xcc, 0x78, 0x02, 0x35, + 0xf2, 0x6b, 0x3e, 0xfc, 0x75, 0x2d, 0xb7, 0x6d, 0xf5, 0x3d, 0xe3, 0xec, + 0x03, 0x79, 0x48, 0xb5, + 0xfd, 0x9a, 0x5c, 0xf6, 0x5b, 0x6d, 0xc3, 0x54, 0xa1, 0x2e, 0xfb, 0xd5, + 0x6c, 0x18, 0x83, 0x0d, + 0xbf, 0x45, 0xc7, 0xd9, 0xd3, 0x8c, 0xe1, 0xd4, 0xa8, 0x70, 0xf5, 0xe5, + 0x04, 0xe6, 0x9b, 0x24, + 0xd8, 0xe2, 0x8c, 0x4c, 0xf3, 0x19, 0xfe, 0x2e, 0x3e, 0xeb, 0x1e, 0x2e, + 0xbd, 0xd4, 0xda, 0xbd, + 0x38, 0xde, 0xd7, 0xeb, 0xc4, 0x3a, 0x35, 0xa4, 0xb0, 0xf4, 0xf1, 0x9a, + 0x3e, 0x26, 0x39, 0x8a, + 0x42, 0x65, 0x45, 0xd6, 0xb6, 0xa4, 0x48, 0xee, 0x6d, 0xa1, 0x16, 0xd7, + 0x26, 0xa2, 0x22, 0x52, + 0xd7, 0x36, 0xd3, 0xa1, 0xca, 0x87, 0x24, 0xe8, 0x31, 0x11, 0xe3, 0x35, + 0x5c, 0x60, 0xd7, 0xea, + 0xf4, 0x40, 0x73, 0x26, 0x5d, 0x1c, 0xc4, 0x7f, 0xde, 0x6c, 0x5a, 0x4f, + 0xbe, 0x9f, 0xf9, 0xcc, + 0x7e, 0xf5, 0x5c, 0x5c, 0xf3, 0x3f, 0xb5, 0xd8, 0xc5, 0x63, 0x73, 0x7e, + 0x62, 0x17, 0x37, 0x2e, + 0xe8, 0xf2, 0xd3, 0xc3, 0x5a, 0xf3, 0xaa, 0x73, 0x6d, 0xac, 0xc5, 0x37, + 0xd1, 0xa1, 0xe7, 0x12, + 0x52, 0xfc, 0x1e, 0xce, 0x39, 0xac, 0x72, 0x72, 0x30, 0x4e, 0xac, 0xd6, + 0x97, 0x1c, 0x6f, 0x4f, + 0xc9, 0x65, 0x3d, 0xc8, 0x1a, 0x3f, 0x83, 0xcd, 0xd0, 0x28, 0x70, 0xf1, + 0x34, 0xe0, 0xbe, 0xdc, + 0xea, 0xeb, 0x2d, 0xd8, 0x96, 0x1e, 0x1e, 0x9a, 0x96, 0xd7, 0xcb, 0xd3, + 0x97, 0xd7, 0x4b, 0x0d, + 0x43, 0xcf, 0xaa, 0xbb, 0x7f, 0xde, 0xc8, 0x6c, 0xc0, 0x7b, 0x2e, 0xbc, + 0xcf, 0x39, 0x93, 0xcc, + 0x06, 0xac, 0xd1, 0x06, 0x5f, 0x79, 0x98, 0x8f, 0xe5, 0x1c, 0xa2, 0xc8, + 0xb2, 0xdb, 0x86, 0xa5, + 0x6a, 0x1b, 0xf6, 0xd8, 0xaf, 0xa5, 0xda, 0x7e, 0x45, 0x6a, 0x56, 0x87, + 0xd2, 0x09, 0xf6, 0x0c, + 0x63, 0x58, 0xe7, 0x2d, 0xd6, 0xba, 0x36, 0x56, 0xcf, 0x0f, 0xf6, 0xd2, + 0xc1, 0xf7, 0xe8, 0x3f, + 0xc7, 0xd9, 0xe3, 0x38, 0xa6, 0x83, 0x1f, 0xcc, 0xbf, 0x66, 0xe7, 0xb8, + 0x96, 0x2b, 0x18, 0x57, + 0xb3, 0x2f, 0xd1, 0xbb, 0x2f, 0x59, 0x97, 0x1e, 0x6f, 0x30, 0xad, 0x7a, + 0xd3, 0x67, 0x14, 0xc9, + 0x4e, 0xea, 0x94, 0x1d, 0xd4, 0x21, 0x3b, 0x88, 0x5d, 0xb6, 0x53, 0xbb, + 0x6c, 0xd3, 0xb6, 0x4d, + 0xb1, 0x52, 0xab, 0x0c, 0x5b, 0x51, 0xa9, 0x2a, 0xc3, 0x06, 0x9c, 0xcc, + 0x51, 0x26, 0x92, 0x64, + 0x9d, 0xb3, 0xe6, 0x5c, 0xe7, 0xa8, 0xef, 0xfc, 0x9a, 0x8b, 0x6f, 0x92, + 0x31, 0x82, 0xcd, 0x95, + 0x0f, 0xcc, 0x37, 0xf9, 0xdf, 0xcc, 0xa6, 0xf5, 0x99, 0xef, 0x17, 0x02, + 0xeb, 0xe0, 0xfb, 0x9a, + 0x1f, 0x1c, 0x76, 0x5c, 0x08, 0x41, 0xa3, 0x22, 0xe0, 0xb5, 0x51, 0xf0, + 0x70, 0xe5, 0xb3, 0x87, + 0xd5, 0xcc, 0x15, 0xd6, 0xd5, 0xc1, 0x8f, 0xb2, 0x82, 0x9f, 0xae, 0x23, + 0xcf, 0xac, 0xbb, 0x97, + 0x5d, 0xd7, 0x6c, 0xda, 0x54, 0x63, 0x70, 0x4e, 0x2c, 0x7c, 0x4f, 0x17, + 0x0f, 0x97, 0x8b, 0x12, + 0x01, 0x3f, 0x64, 0xad, 0xa6, 0x35, 0x8a, 0xf5, 0xe6, 0x69, 0xbd, 0xc9, + 0xd5, 0x7d, 0xc9, 0x09, + 0xb9, 0xec, 0x3e, 0x8d, 0x6f, 0x42, 0x03, 0xf1, 0x4d, 0x58, 0x5e, 0x2f, + 0x6e, 0x54, 0xf0, 0xd8, + 0x20, 0x6b, 0x44, 0x72, 0xd8, 0x34, 0x2a, 0xea, 0xe8, 0xb2, 0xd7, 0xd4, + 0x73, 0x19, 0x5b, 0x33, + 0x2e, 0xf4, 0xa5, 0xe7, 0xf2, 0x99, 0x84, 0xc0, 0x7e, 0x9d, 0xcc, 0x7e, + 0x61, 0xdb, 0x89, 0x5d, + 0xb1, 0x53, 0x1b, 0xd8, 0xb1, 0x4d, 0xb1, 0xb9, 0xec, 0x17, 0xb6, 0x66, + 0xbf, 0xb0, 0x15, 0x25, + 0x87, 0x7e, 0xec, 0xcc, 0x34, 0xf8, 0xc8, 0xeb, 0x5d, 0x66, 0x6f, 0x5a, + 0xe0, 0x6b, 0xa3, 0xa7, + 0x6e, 0x92, 0xe0, 0x70, 0xd7, 0x3b, 0xdc, 0x75, 0x8f, 0xa0, 0x3e, 0x8a, + 0x66, 0xa3, 0xae, 0x98, + 0x52, 0xf3, 0x29, 0x47, 0xd7, 0x9d, 0xd5, 0x90, 0xe6, 0xe6, 0xca, 0xfb, + 0xcd, 0xaf, 0xe9, 0xe9, + 0xef, 0x37, 0x4d, 0xa6, 0xa2, 0x3c, 0x9a, 0x8e, 0x96, 0x8b, 0x68, 0x51, + 0xf5, 0x2e, 0xa0, 0x05, + 0xd5, 0x3b, 0x9f, 0xe6, 0xcb, 0x79, 0x34, 0xcf, 0xbd, 0x91, 0xfc, 0x39, + 0xb9, 0xdc, 0x7e, 0xbd, + 0x3a, 0x7d, 0xc9, 0x63, 0x3d, 0xb8, 0x9e, 0x39, 0xdc, 0x3f, 0xdf, 0x24, + 0xcc, 0xb3, 0x69, 0xc3, + 0xd1, 0xc7, 0xeb, 0xee, 0x73, 0x88, 0x73, 0xa4, 0x69, 0xb1, 0x4b, 0xa0, + 0xf9, 0xc1, 0x0c, 0xd7, + 0x5d, 0xf9, 0xfe, 0x60, 0xb5, 0xf0, 0x98, 0x10, 0x34, 0xad, 0xc2, 0xa4, + 0x51, 0x01, 0xb1, 0x81, + 0x36, 0x6b, 0x0e, 0x7c, 0xa4, 0xc0, 0x7c, 0x93, 0xb4, 0x1c, 0xf6, 0x9e, + 0x01, 0xf9, 0x26, 0xba, + 0xfd, 0x05, 0x9d, 0xb8, 0x60, 0xd3, 0x91, 0x63, 0x73, 0xe7, 0xf5, 0xe2, + 0x6b, 0xcf, 0x66, 0x14, + 0xdd, 0xb9, 0x42, 0xaf, 0xbe, 0x64, 0xb6, 0xd3, 0x5c, 0x7d, 0xc9, 0x6e, + 0xcd, 0xb1, 0xba, 0xf5, + 0x70, 0x2d, 0xaf, 0xa7, 0xa3, 0x77, 0x4e, 0x7f, 0xbf, 0x9e, 0xce, 0x79, + 0x8b, 0x7e, 0x35, 0x2a, + 0x3c, 0x7d, 0xc9, 0xc9, 0x06, 0x76, 0x3e, 0x66, 0xf9, 0xd1, 0x73, 0x99, + 0x2c, 0x89, 0x60, 0xbf, + 0xa3, 0xbd, 0xec, 0xb7, 0xc8, 0xcb, 0x7e, 0x0b, 0xc0, 0x7e, 0xf3, 0xab, + 0xed, 0x37, 0x4f, 0x46, + 0xf4, 0x33, 0x67, 0x56, 0xee, 0x5f, 0x3d, 0x87, 0xb5, 0x6e, 0xfd, 0x3d, + 0x9e, 0x8b, 0x53, 0xa2, + 0xf8, 0x28, 0x29, 0x1a, 0xc5, 0xd8, 0xe2, 0xb8, 0xa0, 0xc7, 0xa4, 0xb6, + 0xbf, 0xc0, 0xf2, 0xa6, + 0x1e, 0x9f, 0xb2, 0xd6, 0xdc, 0x09, 0x7f, 0xf9, 0x35, 0x5d, 0xfd, 0xfd, + 0xa6, 0xaf, 0xe1, 0x5a, + 0xf1, 0x01, 0x19, 0x2f, 0x8d, 0xa7, 0xe3, 0xa5, 0xf7, 0xe9, 0xfb, 0x6c, + 0xcb, 0xe3, 0xc8, 0x38, + 0x69, 0x1c, 0x1d, 0x27, 0x8f, 0xa5, 0x63, 0x25, 0xd8, 0xf2, 0x18, 0x3a, + 0x46, 0xdb, 0xc5, 0x80, + 0x95, 0x93, 0x49, 0x18, 0x8e, 0x89, 0x56, 0x37, 0x61, 0x5c, 0x79, 0xf6, + 0xd9, 0xeb, 0xe6, 0xd7, + 0xbc, 0xf9, 0x26, 0x31, 0xba, 0xb8, 0xf2, 0x51, 0x61, 0xd7, 0xae, 0xd1, + 0xd9, 0xc7, 0x9b, 0x9f, + 0x10, 0x94, 0x6f, 0xa2, 0xe5, 0xf5, 0x54, 0x88, 0x5d, 0x84, 0x00, 0x73, + 0x6b, 0x42, 0xd1, 0xb4, + 0x0a, 0xb9, 0xbf, 0xdf, 0x6f, 0xbf, 0x9e, 0x4b, 0xab, 0xbe, 0x2e, 0xdf, + 0xc4, 0x58, 0x5b, 0x07, + 0x5f, 0xe3, 0x9b, 0x14, 0xf8, 0xd1, 0x73, 0xf9, 0x2b, 0x7a, 0xd9, 0xe1, + 0x7b, 0x06, 0xe5, 0xc4, + 0xc2, 0x7b, 0x32, 0xee, 0x85, 0xdf, 0xeb, 0x94, 0xa7, 0x2f, 0xd9, 0x01, + 0x31, 0x25, 0x9c, 0x57, + 0x97, 0xfa, 0x92, 0x5d, 0x3d, 0x35, 0x2e, 0xae, 0xeb, 0xa5, 0x9c, 0x52, + 0xac, 0x96, 0xd7, 0xd3, + 0x31, 0xb7, 0xbd, 0x38, 0xbc, 0xf3, 0x16, 0x83, 0xe7, 0xb6, 0x5d, 0x39, + 0x36, 0x56, 0x4b, 0xf0, + 0x95, 0x5f, 0xfb, 0x46, 0xb2, 0x91, 0x0f, 0xa4, 0xf1, 0x9a, 0x0d, 0xbf, + 0xef, 0xb2, 0x61, 0x97, + 0xfd, 0xc2, 0x1e, 0xeb, 0xb6, 0xe1, 0x31, 0x6e, 0x1b, 0x2e, 0x96, 0x45, + 0x3a, 0xd9, 0x99, 0x9d, + 0x1b, 0xb6, 0xde, 0x34, 0x9d, 0x3a, 0x2d, 0x09, 0xce, 0x78, 0x63, 0xec, + 0x25, 0xee, 0x1b, 0xb9, + 0xa2, 0x63, 0xc2, 0xe2, 0x6b, 0x6b, 0x92, 0x91, 0xe1, 0x46, 0x66, 0x0d, + 0xff, 0x38, 0xb3, 0x8e, + 0x0e, 0x7e, 0x50, 0x5c, 0x30, 0x4d, 0x27, 0xa3, 0xa5, 0x4f, 0xc9, 0xa7, + 0xd2, 0x27, 0xe4, 0x13, + 0xd8, 0x13, 0xa5, 0x89, 0x14, 0x36, 0xf9, 0x58, 0xfa, 0x98, 0x7e, 0x24, + 0x7d, 0xa4, 0xed, 0x0f, + 0xa5, 0x0f, 0xb5, 0x3d, 0x41, 0x9a, 0x40, 0xed, 0xd2, 0x37, 0x24, 0x26, + 0x3c, 0xf9, 0x7e, 0xca, + 0x6a, 0x0c, 0xac, 0x27, 0xab, 0xc6, 0xfc, 0xe0, 0x71, 0xb5, 0xae, 0x71, + 0x10, 0x87, 0xb1, 0xb8, + 0x1f, 0x62, 0x17, 0x3e, 0x60, 0xec, 0xf2, 0x3f, 0x98, 0x4d, 0x5b, 0x37, + 0xdf, 0xef, 0x27, 0xbf, + 0xe6, 0xe1, 0x9b, 0xe4, 0x05, 0xd0, 0x5f, 0x0c, 0x49, 0xd3, 0x2a, 0x8c, + 0xda, 0xb3, 0xfe, 0xaf, + 0x8d, 0xd5, 0x75, 0x93, 0x94, 0xa2, 0xac, 0x80, 0x7c, 0x13, 0x2d, 0x0e, + 0xd3, 0xe1, 0x33, 0x87, + 0xd4, 0xcb, 0x9e, 0x97, 0x99, 0x13, 0xb4, 0x16, 0x0e, 0xef, 0xc9, 0x8e, + 0x73, 0xb0, 0xf3, 0x31, + 0x02, 0xde, 0x93, 0xe5, 0x12, 0x2f, 0x69, 0xa0, 0x00, 0x0e, 0x7a, 0xfa, + 0x92, 0x8b, 0x5c, 0x31, + 0x25, 0xfb, 0x2e, 0xac, 0x4f, 0x36, 0xd5, 0xa5, 0x69, 0x4a, 0x02, 0xe2, + 0x42, 0x71, 0x78, 0x7b, + 0x56, 0x75, 0x6b, 0xd5, 0x0b, 0x97, 0xf8, 0x26, 0xde, 0x7a, 0x2e, 0x33, + 0xa4, 0xd1, 0x60, 0xbf, + 0x9f, 0x32, 0xfb, 0xa5, 0x9f, 0x80, 0xed, 0xba, 0x6c, 0xf8, 0x63, 0xb0, + 0xe1, 0x8f, 0xdc, 0x36, + 0xfc, 0xa1, 0xdb, 0x86, 0x27, 0xd0, 0x09, 0x10, 0x17, 0x7f, 0x03, 0xf8, + 0x97, 0x1c, 0x5c, 0x33, + 0x2a, 0x8c, 0x35, 0xaf, 0x48, 0x92, 0x98, 0x17, 0x6f, 0x08, 0x81, 0xfb, + 0x16, 0xfc, 0x98, 0x98, + 0x59, 0xec, 0x92, 0x39, 0x8c, 0xe5, 0x01, 0x02, 0xd5, 0x4d, 0x34, 0xae, + 0x65, 0x41, 0x82, 0xff, + 0xd8, 0xc5, 0x34, 0x9b, 0x4e, 0xb0, 0x4c, 0xa1, 0x93, 0xa5, 0x29, 0x64, + 0xb2, 0x65, 0x32, 0xdc, + 0x4e, 0x26, 0x5f, 0x48, 0x5f, 0xd0, 0x2f, 0xa5, 0x2f, 0xc8, 0x17, 0x96, + 0x49, 0x64, 0x92, 0xf4, + 0x39, 0x9d, 0x24, 0x4d, 0x22, 0x9f, 0x4b, 0x9f, 0x93, 0xcf, 0xa4, 0xcf, + 0xe8, 0x68, 0x69, 0x06, + 0x09, 0xd7, 0x31, 0xa9, 0xa3, 0x5d, 0x53, 0x5b, 0xcf, 0x65, 0xdc, 0xa5, + 0x18, 0x39, 0x18, 0xdf, + 0x24, 0x9c, 0x7d, 0xbc, 0x7a, 0x67, 0xd3, 0x06, 0xd4, 0xae, 0xf1, 0xc3, + 0x37, 0xf1, 0xa5, 0xe7, + 0xa2, 0xe1, 0x3a, 0xcb, 0xeb, 0xe9, 0x9e, 0xcf, 0x1c, 0x15, 0x26, 0xed, + 0x9a, 0x10, 0x66, 0x4a, + 0xd9, 0x63, 0x73, 0x83, 0xd5, 0x4d, 0xd8, 0x9c, 0xb2, 0xe0, 0x9c, 0x82, + 0x74, 0x9d, 0xba, 0x9b, + 0x59, 0x23, 0xf5, 0x68, 0xdd, 0xb1, 0xbc, 0x5e, 0x50, 0x9f, 0xd9, 0xca, + 0x62, 0xe9, 0xb8, 0x5a, + 0x7c, 0x13, 0xcd, 0xc7, 0xd5, 0xf8, 0x26, 0x1a, 0x47, 0x83, 0xc5, 0xfa, + 0xf0, 0xb3, 0xab, 0xb6, + 0xcf, 0xf4, 0x9f, 0xfd, 0xd4, 0xc3, 0xdd, 0xf9, 0xfe, 0xa8, 0xbf, 0x73, + 0x0e, 0xab, 0xe4, 0x3f, + 0x87, 0xc5, 0xf2, 0x6b, 0x73, 0x2c, 0x13, 0xc8, 0x14, 0x0b, 0xe3, 0x7e, + 0x4c, 0x66, 0x36, 0x4c, + 0x26, 0x33, 0xdb, 0x95, 0xbe, 0x04, 0xfb, 0xfd, 0xc2, 0x6d, 0xbb, 0x9a, + 0x1d, 0xc3, 0xed, 0x67, + 0x60, 0xc3, 0xa3, 0xe9, 0x0c, 0xc0, 0xbf, 0x84, 0xbf, 0xb9, 0x67, 0x35, + 0x29, 0x3f, 0xde, 0x10, + 0x65, 0x0e, 0xfc, 0x5a, 0x97, 0x93, 0xef, 0xf7, 0xfe, 0x7c, 0x2c, 0xa6, + 0x74, 0xe9, 0x9d, 0x7a, + 0xd7, 0x4d, 0xd8, 0x79, 0xea, 0xe1, 0xde, 0xf8, 0x98, 0x1f, 0x6c, 0x9a, + 0x4f, 0x27, 0x59, 0xbe, + 0x23, 0xdf, 0x59, 0xbe, 0xa5, 0xdf, 0x6a, 0x7b, 0x1a, 0x9d, 0x66, 0x99, + 0x46, 0xbe, 0xb1, 0x7c, + 0x43, 0x61, 0x93, 0xaf, 0x2d, 0x5f, 0xc3, 0xfe, 0x8a, 0x4e, 0xb5, 0x7c, + 0x45, 0xa6, 0x5a, 0xa6, + 0xd2, 0x0f, 0xc5, 0x65, 0xe4, 0x3c, 0x0d, 0xba, 0x88, 0x7b, 0x5f, 0xe9, + 0xe3, 0x88, 0x8e, 0x1d, + 0xca, 0x7b, 0x92, 0x10, 0x1f, 0x17, 0x8e, 0xef, 0x49, 0x42, 0xdc, 0xe1, + 0x7c, 0xcf, 0xbf, 0xea, + 0xef, 0x74, 0x25, 0xdf, 0xc3, 0xc7, 0xef, 0x7f, 0x86, 0x75, 0x0e, 0xd6, + 0x59, 0x7a, 0x86, 0x9e, + 0xa6, 0x3f, 0xd1, 0x93, 0xf4, 0x38, 0x3d, 0x4a, 0x8e, 0xd2, 0xc3, 0xf4, + 0x20, 0xad, 0xa2, 0x7b, + 0x69, 0x25, 0x2d, 0xa7, 0x65, 0x74, 0x17, 0xdd, 0x4e, 0xb7, 0xd2, 0xcd, + 0x74, 0x13, 0xdd, 0x48, + 0x37, 0xd0, 0xf5, 0x9e, 0x45, 0x36, 0xc0, 0xff, 0x36, 0xc1, 0xda, 0x0c, + 0xbf, 0xdd, 0x46, 0x77, + 0xc0, 0xe3, 0xca, 0xe8, 0x6e, 0x5a, 0x41, 0xf7, 0xc0, 0x33, 0xab, 0xe8, + 0x7e, 0x78, 0x8d, 0x43, + 0xe4, 0x30, 0x3d, 0x42, 0x8e, 0xd0, 0xa3, 0xd5, 0xeb, 0xd8, 0xa5, 0x45, + 0x8e, 0xd3, 0xe3, 0xb0, + 0x4f, 0x90, 0x13, 0xb0, 0x4f, 0xd2, 0x93, 0xb0, 0x7f, 0x22, 0x3f, 0xd1, + 0x53, 0xe4, 0x14, 0x3d, + 0x4d, 0x4e, 0xd3, 0x33, 0xe4, 0x0c, 0x3d, 0x4b, 0xce, 0xc2, 0x67, 0x3b, + 0xe7, 0x5a, 0x04, 0x3e, + 0x2d, 0xdb, 0xee, 0xf5, 0xb7, 0x9e, 0x43, 0x3e, 0xd7, 0x2a, 0xf0, 0x53, + 0xbe, 0xb3, 0x7c, 0xe7, + 0xb6, 0xdf, 0x6f, 0x99, 0xfd, 0xc2, 0xfe, 0xc6, 0x6d, 0xc3, 0x5f, 0x6b, + 0x36, 0xfc, 0x15, 0xd8, + 0x2e, 0x6c, 0xb0, 0xe1, 0x0f, 0xc9, 0x1c, 0xc0, 0xbf, 0x70, 0xea, 0x37, + 0xe9, 0xe9, 0x65, 0x4f, + 0x2e, 0x88, 0xcf, 0x0d, 0xa6, 0xf9, 0x1c, 0x62, 0xbe, 0x3f, 0x40, 0x1d, + 0xf0, 0x52, 0xdd, 0xa4, + 0x46, 0xae, 0x70, 0xac, 0x8f, 0xfc, 0x9a, 0x69, 0x09, 0x1c, 0xa7, 0x39, + 0x74, 0x8e, 0x38, 0x87, + 0xce, 0xb6, 0xcc, 0xa6, 0xb3, 0xc5, 0x59, 0x74, 0x96, 0x05, 0xb6, 0x38, + 0x93, 0xce, 0x84, 0xfd, + 0xbd, 0xe5, 0x7b, 0xd8, 0x33, 0xe8, 0x0c, 0xd8, 0xd3, 0x2d, 0xd3, 0xe9, + 0x24, 0x71, 0x35, 0xbd, + 0x78, 0x75, 0x5d, 0x5d, 0x61, 0x5e, 0x7f, 0xc2, 0xfa, 0x83, 0xfe, 0x97, + 0xfe, 0x87, 0xfe, 0x4e, + 0x2f, 0xd0, 0xdf, 0xe8, 0x2f, 0x60, 0xd7, 0xe7, 0xdc, 0x68, 0x78, 0x02, + 0x50, 0xea, 0x08, 0x3d, + 0x44, 0x0f, 0x68, 0x58, 0xb8, 0x07, 0x90, 0xad, 0x1c, 0xf0, 0xad, 0xac, + 0x7a, 0xed, 0x86, 0xff, + 0x57, 0x00, 0x46, 0xee, 0xa1, 0xfb, 0xe0, 0x11, 0x07, 0x00, 0xef, 0x00, + 0xed, 0xe0, 0x39, 0x27, + 0x00, 0x47, 0x01, 0xc3, 0xe0, 0x55, 0x18, 0x76, 0xb9, 0x90, 0xea, 0x17, + 0xf7, 0xfa, 0xb5, 0xc6, + 0xfa, 0xcd, 0xbd, 0x2e, 0x68, 0xeb, 0x77, 0x6d, 0xfd, 0x07, 0xd6, 0x7f, + 0xb5, 0xf5, 0x87, 0x7b, + 0xfd, 0x59, 0x63, 0xfd, 0x73, 0x8e, 0xdd, 0x06, 0xf1, 0x1b, 0x3a, 0x47, + 0xb3, 0x61, 0x66, 0xbf, + 0xb3, 0xdd, 0xf6, 0x3b, 0x8b, 0xce, 0xb4, 0x30, 0x1b, 0xfe, 0x5e, 0xb3, + 0xe1, 0x19, 0x9a, 0x0d, + 0x4f, 0x07, 0x1b, 0x9e, 0x44, 0x4b, 0x1c, 0x99, 0x86, 0x24, 0x35, 0xd6, + 0xaf, 0x9e, 0xcb, 0xa5, + 0x5e, 0xf6, 0x84, 0xb0, 0xcd, 0x5b, 0x4c, 0xc9, 0x8f, 0xcf, 0x0d, 0x16, + 0x37, 0x86, 0xd2, 0xdf, + 0x1f, 0x8a, 0xce, 0x57, 0x9a, 0x23, 0x7e, 0x54, 0x52, 0x9d, 0x79, 0xdd, + 0xee, 0x38, 0xcc, 0xba, + 0xd2, 0x38, 0x4b, 0x5c, 0x44, 0x16, 0x89, 0x0b, 0xc9, 0x42, 0x71, 0x21, + 0x5d, 0x20, 0x96, 0x68, + 0xbb, 0x44, 0xdb, 0xf3, 0xe9, 0x7c, 0x71, 0x3e, 0x99, 0x27, 0xce, 0x83, + 0x3d, 0x97, 0xce, 0x15, + 0xe7, 0x92, 0x6f, 0xc4, 0x35, 0xe4, 0x13, 0x7a, 0x75, 0x5d, 0x5d, 0xe1, + 0x5d, 0x13, 0xdd, 0xeb, + 0x63, 0xfa, 0x11, 0xac, 0x0f, 0xe9, 0x04, 0xfa, 0x01, 0xac, 0xf7, 0x61, + 0x8d, 0xa3, 0x63, 0x60, + 0x8d, 0xa6, 0x45, 0xb4, 0x90, 0x16, 0xd0, 0x7c, 0x9a, 0x07, 0xcb, 0x49, + 0x1d, 0x35, 0x96, 0x13, + 0x56, 0x1e, 0xfc, 0xae, 0x00, 0x56, 0x21, 0x3c, 0x72, 0x34, 0x2d, 0x86, + 0xe7, 0x8c, 0x85, 0xe7, + 0xb2, 0x57, 0x18, 0xaf, 0xbd, 0xd6, 0x04, 0x58, 0x1f, 0xd6, 0x59, 0x1f, + 0xf9, 0x5c, 0x1f, 0x6b, + 0x6b, 0xa2, 0xcf, 0xf5, 0xcf, 0x3b, 0x76, 0x1b, 0xcc, 0xb3, 0xe8, 0x22, + 0xb0, 0x61, 0x66, 0xbf, + 0x0b, 0xc5, 0x05, 0x60, 0xb7, 0x0b, 0xdc, 0xf6, 0x5b, 0xc2, 0xec, 0x17, + 0xf6, 0x3c, 0xcd, 0x86, + 0x99, 0xfd, 0xce, 0x05, 0xac, 0x5c, 0x0a, 0xfe, 0x1f, 0x8b, 0xf7, 0x03, + 0xf1, 0x4d, 0x42, 0xc9, + 0x61, 0xe9, 0x99, 0xc3, 0x9a, 0x92, 0x17, 0x17, 0x54, 0x7b, 0xb6, 0x46, + 0x1f, 0x6f, 0x18, 0x67, + 0x58, 0x54, 0xd7, 0x01, 0x59, 0xde, 0x54, 0xd3, 0x1c, 0xf2, 0xaa, 0x53, + 0x3a, 0xd7, 0xe6, 0x2e, + 0x14, 0x57, 0xd2, 0x95, 0xe6, 0x95, 0x64, 0x85, 0xb8, 0x82, 0xae, 0x30, + 0x2f, 0x27, 0xcb, 0xc5, + 0xe5, 0x64, 0x99, 0xb8, 0x8c, 0x2e, 0x13, 0x97, 0x92, 0xa5, 0xb0, 0x97, + 0x88, 0x4b, 0x28, 0x6c, + 0xb2, 0x58, 0x5c, 0x0c, 0xd7, 0x97, 0x15, 0xc1, 0xbf, 0xc3, 0xd5, 0x75, + 0x75, 0x5d, 0x5d, 0x7f, + 0xdb, 0xfa, 0xd1, 0xbc, 0x90, 0xae, 0x14, 0x57, 0x92, 0x95, 0xe6, 0x15, + 0x64, 0x05, 0x6c, 0xb0, + 0x5f, 0xba, 0x5c, 0x5c, 0xc6, 0x6c, 0x98, 0xd9, 0x2f, 0x5d, 0x0a, 0xb6, + 0xeb, 0xb2, 0xe1, 0xc5, + 0x60, 0xc3, 0xb3, 0xc9, 0x2a, 0x7b, 0x86, 0xc1, 0xd7, 0xfc, 0x60, 0x6f, + 0x1d, 0x7c, 0xd7, 0x5c, + 0xb5, 0xc8, 0x30, 0x69, 0x52, 0xa7, 0x1a, 0x53, 0x9c, 0x31, 0x06, 0x5d, + 0xdf, 0x46, 0xaa, 0x9b, + 0xd7, 0x0b, 0x7b, 0x1f, 0xaf, 0x37, 0xdf, 0x44, 0xdd, 0x6c, 0x5c, 0x65, + 0xde, 0x40, 0xd6, 0x9b, + 0xd7, 0xd3, 0xf5, 0xe6, 0x75, 0x64, 0x9d, 0xb6, 0xd7, 0x92, 0xb5, 0xb0, + 0x7f, 0x34, 0xff, 0x08, + 0xc7, 0x76, 0x0d, 0x59, 0x03, 0x7b, 0x35, 0xc4, 0xbd, 0xab, 0xcd, 0xab, + 0xc9, 0x22, 0xb8, 0xef, + 0xea, 0x19, 0x77, 0x75, 0x5d, 0x5d, 0xff, 0x9c, 0xb5, 0xc9, 0xb4, 0x8a, + 0x6c, 0x30, 0xaf, 0x67, + 0x36, 0xcc, 0xec, 0x97, 0x32, 0x1b, 0x06, 0xfb, 0xa5, 0x6b, 0xcd, 0x3f, + 0x32, 0x1b, 0x66, 0xf6, + 0x4b, 0xd7, 0x80, 0xed, 0x82, 0xfd, 0x82, 0x0d, 0x2f, 0x22, 0x6b, 0x95, + 0x24, 0x2e, 0xa0, 0x9e, + 0x0b, 0xeb, 0x5f, 0x2d, 0xcc, 0x1a, 0x99, 0x66, 0x8f, 0xc9, 0x0d, 0xd8, + 0xf3, 0x69, 0x8e, 0xd1, + 0xad, 0xdf, 0x94, 0xe2, 0x88, 0xd6, 0x85, 0x7f, 0x7f, 0xdb, 0x6c, 0xda, + 0xea, 0xb5, 0x9d, 0x6e, + 0x34, 0x6d, 0x23, 0xdb, 0x4c, 0xdb, 0xe8, 0x36, 0xf3, 0x36, 0xb2, 0xd5, + 0xbc, 0x55, 0xdb, 0x5b, + 0xcc, 0x5b, 0xc8, 0x16, 0xd3, 0x66, 0xb2, 0xd9, 0xcc, 0xf6, 0x26, 0xb2, + 0x49, 0xdb, 0x1b, 0xc9, + 0x2a, 0xd3, 0xa6, 0xab, 0xfe, 0xdf, 0xd5, 0x75, 0x75, 0xfd, 0x83, 0xd6, + 0x76, 0xd3, 0x46, 0x97, + 0xfd, 0x6a, 0x36, 0xbc, 0xd5, 0x6d, 0xc3, 0x5b, 0x34, 0x1b, 0xde, 0x6c, + 0xda, 0x4c, 0x99, 0x0d, + 0x6f, 0x72, 0xdb, 0xf0, 0x46, 0xf3, 0x2a, 0xb2, 0x59, 0x8a, 0xe7, 0x83, + 0xf2, 0x4d, 0xc6, 0xfa, + 0xe7, 0x9b, 0x5c, 0x4e, 0xcf, 0x6a, 0x8a, 0x3d, 0xca, 0xa8, 0xe7, 0xbb, + 0xfc, 0xfd, 0xb3, 0x69, + 0x4b, 0xe9, 0x0e, 0xd3, 0x6e, 0xb2, 0xdb, 0xb4, 0x9b, 0x96, 0x99, 0xca, + 0x60, 0x97, 0xd2, 0x52, + 0xd8, 0xbb, 0x4c, 0xbb, 0x60, 0xef, 0xa4, 0x3b, 0x5d, 0x9b, 0xec, 0x30, + 0xed, 0x80, 0xc7, 0xed, + 0x20, 0x1b, 0x4d, 0xdb, 0xaf, 0xe2, 0xdf, 0xd5, 0x75, 0x75, 0xfd, 0x83, + 0x56, 0xa9, 0xb0, 0x83, + 0xee, 0xd6, 0x6c, 0xb8, 0x4c, 0xb3, 0xe1, 0x52, 0xcd, 0x86, 0x77, 0x69, + 0x36, 0xbc, 0xb3, 0xda, + 0x86, 0x77, 0xb8, 0x6c, 0x18, 0x7c, 0x98, 0x1d, 0x62, 0x2c, 0xba, 0x6c, + 0xbe, 0x89, 0xb7, 0x0e, + 0xbe, 0x94, 0xc4, 0xeb, 0xe5, 0xb8, 0xa4, 0xd8, 0xea, 0xf0, 0x22, 0x49, + 0xd8, 0xf2, 0x7a, 0x01, + 0x7a, 0x64, 0x82, 0xeb, 0x7c, 0x55, 0xd0, 0x4a, 0xa1, 0x8a, 0xec, 0x13, + 0xf6, 0x51, 0xd7, 0xde, + 0x4b, 0xf6, 0x9a, 0xf6, 0x90, 0x3d, 0xc2, 0x1e, 0xba, 0x07, 0x6e, 0x2b, + 0x85, 0x4a, 0x5a, 0x61, + 0xaa, 0x70, 0xef, 0x72, 0xb2, 0x43, 0x28, 0xbd, 0x7a, 0xc6, 0x5d, 0x5d, + 0x57, 0xd7, 0x3f, 0x68, + 0x55, 0x08, 0x95, 0xa4, 0xaa, 0xda, 0x7e, 0xf7, 0x91, 0xbd, 0x60, 0xc3, + 0x9a, 0xfd, 0x0a, 0xcc, + 0x8e, 0x2b, 0xc1, 0x86, 0x3d, 0xf6, 0x5b, 0x41, 0xca, 0x01, 0x03, 0xcb, + 0xcc, 0x51, 0x38, 0x58, + 0xde, 0x8c, 0xe1, 0x1f, 0xeb, 0x11, 0xf1, 0xa7, 0xe7, 0xa2, 0xd5, 0x4d, + 0x6c, 0xc9, 0xb9, 0xee, + 0x5e, 0xf6, 0xa0, 0x7c, 0x8e, 0x24, 0xb5, 0xe6, 0x4c, 0x29, 0xa6, 0x81, + 0x10, 0x25, 0xd6, 0xd5, + 0x7e, 0x0e, 0xfb, 0x6c, 0xda, 0xa0, 0x7d, 0xbc, 0xfb, 0xc9, 0x41, 0xe1, + 0x08, 0x39, 0x22, 0x1c, + 0x26, 0x87, 0x85, 0xc3, 0xf4, 0x10, 0xdc, 0x1e, 0x32, 0x1d, 0x82, 0xfb, + 0x0e, 0xd2, 0x83, 0xa6, + 0x83, 0x70, 0x7b, 0x80, 0x1c, 0x10, 0x0e, 0x50, 0xd8, 0xa4, 0xca, 0xb4, + 0x5f, 0xc3, 0xc3, 0xab, + 0x67, 0xdc, 0xd5, 0x75, 0x75, 0xfd, 0x73, 0xd6, 0x7e, 0xe1, 0x20, 0xd8, + 0xef, 0x11, 0xcd, 0x7e, + 0x0f, 0x0b, 0x87, 0xd8, 0x26, 0x87, 0x04, 0x66, 0xbb, 0xae, 0xed, 0xb1, + 0xdf, 0x03, 0xa6, 0x2a, + 0xb2, 0xdf, 0x54, 0x09, 0x98, 0x18, 0x49, 0x82, 0xf5, 0xeb, 0x79, 0x73, + 0x4e, 0x23, 0x7d, 0xcd, + 0x0f, 0x76, 0xe7, 0x0a, 0xd9, 0xbc, 0x45, 0xbf, 0xf3, 0x83, 0xbd, 0x38, + 0x2e, 0x09, 0xb5, 0x7c, + 0x35, 0x4d, 0x0b, 0xc1, 0x19, 0x67, 0xf4, 0xe8, 0xe0, 0x7b, 0xfa, 0x92, + 0x03, 0xe9, 0x7c, 0x85, + 0xde, 0xdf, 0xaf, 0x67, 0x36, 0xed, 0x61, 0x72, 0x5c, 0x38, 0x49, 0x7f, + 0x12, 0x7e, 0x22, 0x27, + 0xe1, 0xf6, 0x84, 0x70, 0x92, 0x9c, 0x10, 0x4e, 0xc0, 0x7d, 0xc7, 0xe1, + 0xe7, 0xe3, 0x70, 0x7b, + 0x8c, 0x1c, 0x83, 0x7d, 0x54, 0x38, 0x4a, 0x61, 0xc3, 0xf1, 0xac, 0xba, + 0x7a, 0xc6, 0x5d, 0x5d, + 0x57, 0xd7, 0x3f, 0x68, 0x1d, 0xa6, 0xc7, 0xc1, 0x76, 0x7f, 0x22, 0x3f, + 0x81, 0xed, 0x9e, 0x14, + 0x4e, 0x50, 0xd8, 0xc4, 0x65, 0xbb, 0x9a, 0x1d, 0x33, 0xfb, 0xa5, 0xc7, + 0xc0, 0x76, 0x5d, 0x36, + 0x7c, 0x90, 0xec, 0x0f, 0xd6, 0x87, 0x17, 0x20, 0xaf, 0xe7, 0x5d, 0x37, + 0x49, 0xf7, 0xa5, 0xfb, + 0x61, 0xab, 0xcd, 0x0f, 0x77, 0xc5, 0xaa, 0xf1, 0xb5, 0x7c, 0x35, 0xa6, + 0x81, 0xe0, 0xad, 0x07, + 0xe3, 0x99, 0x33, 0xa9, 0x69, 0xd5, 0x5b, 0xa3, 0x0d, 0x81, 0xe6, 0x42, + 0x87, 0x77, 0x36, 0xed, + 0x31, 0x72, 0x96, 0x9e, 0x23, 0xe7, 0x84, 0x73, 0x5a, 0x8f, 0xfb, 0x59, + 0xe1, 0x2c, 0x39, 0x2b, + 0x9c, 0x21, 0x67, 0xdc, 0xfb, 0x34, 0xeb, 0x81, 0x17, 0x4e, 0x93, 0x53, + 0xc2, 0x29, 0xd8, 0x3f, + 0xc1, 0x71, 0x3d, 0x7c, 0x35, 0xff, 0x77, 0x75, 0x5d, 0x5d, 0xff, 0xa0, + 0x75, 0x94, 0xf5, 0x77, + 0x83, 0xfd, 0x9e, 0x73, 0xf1, 0x54, 0x08, 0xb3, 0x61, 0x8f, 0xfd, 0x9e, + 0x71, 0xdb, 0xef, 0x69, + 0xcd, 0x7e, 0x4f, 0x01, 0x46, 0x9e, 0x00, 0xbc, 0x0c, 0x82, 0x7f, 0xfa, + 0xb8, 0xe8, 0x24, 0x3e, + 0x2f, 0x33, 0x27, 0xab, 0x20, 0x79, 0x64, 0xa0, 0xf9, 0xc1, 0xac, 0x6e, + 0xc2, 0x70, 0x32, 0xb6, + 0x2e, 0xf7, 0x97, 0x44, 0x42, 0x1c, 0x1e, 0x2d, 0xc7, 0xf0, 0xb1, 0xf6, + 0x38, 0x2e, 0xbb, 0x16, + 0x57, 0xde, 0x9f, 0x9e, 0x8b, 0x2b, 0xaf, 0x57, 0x57, 0xb7, 0xc3, 0xd7, + 0xd2, 0xd5, 0xc3, 0x48, + 0x4f, 0x92, 0x5f, 0xe9, 0x6f, 0xe4, 0x37, 0xfa, 0x2b, 0xdc, 0x7a, 0xf6, + 0x2f, 0xe4, 0x97, 0xea, + 0xed, 0xe2, 0xde, 0x68, 0x5c, 0x1f, 0xe1, 0x67, 0x38, 0xbe, 0x47, 0xaf, + 0xe2, 0xdf, 0xd5, 0x75, + 0x75, 0xfd, 0x83, 0xd6, 0x49, 0xb0, 0xd9, 0xdf, 0xc0, 0x86, 0x7f, 0xf5, + 0xb2, 0xe1, 0x5f, 0xbc, + 0x6c, 0xd8, 0xc5, 0x9d, 0xfb, 0xd9, 0xc5, 0xdb, 0x03, 0x6c, 0x3c, 0x16, + 0x04, 0x37, 0xf4, 0x6a, + 0x54, 0xc4, 0x57, 0xc7, 0xaa, 0xfe, 0xe6, 0x07, 0xbb, 0xe6, 0x9b, 0x64, + 0x8c, 0xc9, 0x1a, 0x1e, + 0x2f, 0x33, 0xae, 0x99, 0xff, 0xf9, 0x04, 0x2e, 0x9d, 0x9e, 0x94, 0xdc, + 0x1a, 0x3a, 0xf8, 0x63, + 0xb2, 0xea, 0xe8, 0xb9, 0x68, 0x98, 0x17, 0xce, 0xd9, 0xb4, 0x70, 0x7d, + 0xf8, 0x2f, 0xfd, 0xaf, + 0x67, 0x33, 0xd6, 0x0f, 0x71, 0x6f, 0xc6, 0x02, 0x22, 0x6c, 0xbb, 0x58, + 0x41, 0x17, 0xd8, 0x2d, + 0x1c, 0xdb, 0x93, 0x57, 0xf1, 0xef, 0xea, 0xba, 0xba, 0xfe, 0x41, 0xeb, + 0xb4, 0x97, 0xfd, 0xfe, + 0xf7, 0x92, 0xfd, 0xc2, 0x76, 0xd9, 0xef, 0xef, 0x6e, 0x5e, 0x9f, 0xcb, + 0x86, 0x7f, 0x25, 0x27, + 0x83, 0xe0, 0x9f, 0xce, 0x39, 0xac, 0xbe, 0xe7, 0x2d, 0xd6, 0x98, 0x1f, + 0x7c, 0x69, 0xbe, 0x09, + 0xe3, 0xbf, 0xc5, 0x39, 0xe2, 0xb8, 0x58, 0x15, 0x62, 0x63, 0x8b, 0x9f, + 0xfa, 0x8b, 0x5b, 0xe7, + 0x2b, 0xd1, 0x1a, 0x6f, 0x70, 0xf1, 0xd5, 0x6a, 0xcf, 0xdc, 0x74, 0xcf, + 0x95, 0xb7, 0xa5, 0xe6, + 0xba, 0xf3, 0x7a, 0x01, 0xfd, 0x53, 0x5d, 0xb3, 0x69, 0xfd, 0xf3, 0x31, + 0x89, 0x7b, 0x33, 0x66, + 0x26, 0xf9, 0xc3, 0x6b, 0x5f, 0x3d, 0xe3, 0xfe, 0xbf, 0xbd, 0x37, 0x0d, + 0x92, 0x25, 0xab, 0xee, + 0x3c, 0xd3, 0x63, 0xf1, 0x88, 0xc8, 0x88, 0xcc, 0x8c, 0x88, 0xec, 0xe9, + 0x2f, 0x33, 0xa3, 0x29, + 0x61, 0x6d, 0xdd, 0x3d, 0xd6, 0x36, 0xa3, 0xb2, 0xe9, 0xe9, 0xb1, 0x51, + 0xcf, 0x34, 0x54, 0xb1, + 0x49, 0x08, 0xaa, 0x0c, 0x1b, 0x9b, 0x2f, 0x63, 0x26, 0xcc, 0xc0, 0xc6, + 0xba, 0xdb, 0x4c, 0x23, + 0xb3, 0xc6, 0xc8, 0xcc, 0xc8, 0xd8, 0xdd, 0x23, 0x63, 0xdf, 0x72, 0x7d, + 0x4b, 0x49, 0x42, 0x2a, + 0x16, 0x51, 0x80, 0x04, 0x2a, 0x10, 0x8b, 0x4c, 0x02, 0xa9, 0x80, 0x92, + 0x10, 0x5a, 0x0b, 0xb4, + 0x20, 0xa1, 0x05, 0xd0, 0x8a, 0x40, 0x42, 0x8f, 0x96, 0xd4, 0x5a, 0xba, + 0xa5, 0xce, 0xb9, 0xe7, + 0x5e, 0x77, 0x0f, 0x77, 0x0f, 0xbf, 0x7e, 0x8f, 0x67, 0xfa, 0x7b, 0xf5, + 0xd2, 0xed, 0xd8, 0x31, + 0xe7, 0x3d, 0x5e, 0x65, 0x66, 0x84, 0xdf, 0x8c, 0xfb, 0xf7, 0x7b, 0xb6, + 0xdf, 0x21, 0x23, 0x7b, + 0x78, 0x4c, 0xb2, 0x83, 0x5d, 0xfb, 0x17, 0x7a, 0xab, 0x9d, 0xfd, 0xcb, + 0xec, 0xc1, 0xb0, 0x6b, + 0x78, 0xde, 0x64, 0x56, 0x6c, 0x00, 0x7f, 0x05, 0xf8, 0x2f, 0xce, 0xcc, + 0xcb, 0x63, 0x09, 0xff, + 0xd9, 0xc7, 0xf9, 0xe2, 0x5c, 0xcd, 0x49, 0xa1, 0xe9, 0xe9, 0x57, 0xb3, + 0x78, 0xc9, 0xe0, 0x9f, + 0x07, 0xf2, 0x5c, 0x5c, 0x67, 0x4a, 0x14, 0x8f, 0xb7, 0xf7, 0x1e, 0xe3, + 0xc3, 0xa3, 0x0f, 0xb7, + 0x9e, 0x35, 0x9f, 0x35, 0xd8, 0x65, 0x19, 0xac, 0xdf, 0xb3, 0x12, 0x7b, + 0x86, 0x3e, 0x71, 0x64, + 0x64, 0x0f, 0x91, 0x3d, 0x13, 0xb8, 0x4f, 0x03, 0xf6, 0xf0, 0xd1, 0x8f, + 0x76, 0x3f, 0x32, 0xfc, + 0x50, 0x4b, 0xb5, 0x83, 0xe3, 0x9c, 0xb7, 0x28, 0x7c, 0xd5, 0xe2, 0x3e, + 0xf3, 0x7d, 0xad, 0x59, + 0x6f, 0xd9, 0x96, 0x2e, 0xe3, 0xdf, 0xcb, 0xeb, 0xf5, 0x3c, 0x73, 0x26, + 0x1d, 0x2e, 0xef, 0x1d, + 0x27, 0xd6, 0xb8, 0xce, 0xd5, 0x64, 0xfa, 0x8c, 0x9b, 0x4d, 0x1b, 0x14, + 0xeb, 0x84, 0xb5, 0xa3, + 0xcf, 0x15, 0x19, 0xd9, 0xcd, 0x3e, 0x15, 0x06, 0xc4, 0xf5, 0x30, 0xbc, + 0xc7, 0xd3, 0xea, 0xc1, + 0x7d, 0x9c, 0xb7, 0x08, 0x73, 0xab, 0xba, 0xc1, 0x71, 0xc7, 0x12, 0x22, + 0xae, 0xa7, 0xf1, 0xf9, + 0x53, 0x95, 0xb3, 0xe2, 0xc1, 0xd6, 0x45, 0x39, 0x64, 0xce, 0x64, 0xa6, + 0x8d, 0x9f, 0x59, 0xed, + 0x8f, 0x75, 0x92, 0xfe, 0x91, 0x91, 0x25, 0x40, 0xff, 0x8c, 0x2b, 0xc6, + 0xf5, 0xf0, 0xf3, 0x16, + 0x63, 0xe1, 0xb4, 0x48, 0xb5, 0x32, 0x58, 0x9f, 0xed, 0x99, 0xd5, 0x3d, + 0x7b, 0xbe, 0x41, 0xc9, + 0x33, 0x1f, 0x49, 0xe4, 0x4d, 0xb6, 0x0e, 0xc0, 0x4f, 0x2e, 0x4c, 0x32, + 0x4d, 0xd9, 0xfc, 0x60, + 0xf1, 0x9a, 0x41, 0x6b, 0x42, 0xfa, 0x47, 0x46, 0x76, 0xe3, 0xf5, 0x8f, + 0xf9, 0x93, 0xee, 0xba, + 0x64, 0x31, 0x6b, 0xee, 0x0a, 0x5c, 0x76, 0x89, 0xaf, 0x1a, 0x1b, 0xa7, + 0xc5, 0xa3, 0x95, 0xe8, + 0xb9, 0x9c, 0x6d, 0x6f, 0xac, 0xd1, 0x3d, 0x67, 0xd2, 0x35, 0xc3, 0xcb, + 0x95, 0x37, 0xf1, 0xcf, + 0x0f, 0x96, 0xd7, 0xc8, 0x90, 0xfe, 0x91, 0x91, 0xdd, 0x78, 0xfd, 0x9b, + 0xef, 0x36, 0xdc, 0x75, + 0xc9, 0xfa, 0x49, 0xe5, 0xd0, 0x9a, 0x6f, 0x27, 0xd7, 0xac, 0xb8, 0xe7, + 0xb0, 0x62, 0x38, 0x2d, + 0xb6, 0x56, 0x2e, 0xe3, 0xe9, 0x7d, 0xe3, 0x79, 0x13, 0x98, 0x2b, 0x7f, + 0xa7, 0xbc, 0xb7, 0x36, + 0x8f, 0xcc, 0x3d, 0x67, 0x92, 0x69, 0x21, 0x8f, 0x75, 0xae, 0xd5, 0xc8, + 0x90, 0xfe, 0x91, 0x91, + 0xdd, 0x78, 0xfd, 0x9b, 0xee, 0x34, 0x3d, 0x75, 0xc9, 0x4c, 0x0b, 0x2a, + 0xe7, 0xa5, 0x7d, 0x29, + 0xcf, 0x05, 0x2c, 0x5e, 0xfe, 0x32, 0x8e, 0xd3, 0x62, 0x6b, 0x65, 0x4c, + 0xb3, 0x69, 0xb9, 0x4d, + 0xb6, 0x5a, 0x10, 0xd7, 0x73, 0xe7, 0x4d, 0x02, 0x6a, 0xb4, 0x6b, 0x30, + 0x9b, 0x76, 0x7b, 0x9e, + 0xa9, 0x7b, 0xfb, 0x4d, 0x48, 0xff, 0xc8, 0xc8, 0x6e, 0x7e, 0xfc, 0xcf, + 0x5b, 0x97, 0x5c, 0x91, + 0xcc, 0x0f, 0xce, 0xb8, 0x7b, 0x2c, 0xec, 0xde, 0x37, 0x54, 0x6f, 0x59, + 0x4c, 0x9c, 0x96, 0x28, + 0x5a, 0xd9, 0xcf, 0x76, 0x31, 0xb3, 0x69, 0xd7, 0xf9, 0xfd, 0x62, 0x26, + 0x08, 0x9f, 0x8f, 0xe4, + 0xca, 0x9b, 0x54, 0x03, 0xfb, 0x4d, 0x2e, 0x0d, 0xd2, 0x3f, 0x32, 0xb2, + 0x04, 0xe5, 0x7f, 0xd9, + 0xb9, 0x09, 0xe6, 0x33, 0x83, 0xe6, 0x49, 0x79, 0x2e, 0xc0, 0xc1, 0x1f, + 0x17, 0x5a, 0x56, 0x5c, + 0xcf, 0xbc, 0x76, 0x5c, 0x0f, 0x3b, 0x87, 0xd5, 0xad, 0x95, 0xf7, 0x6d, + 0x36, 0xad, 0xe7, 0x7d, + 0x39, 0x79, 0x13, 0x5e, 0x4b, 0x73, 0xd7, 0xd7, 0x6f, 0x32, 0xbe, 0x6c, + 0x91, 0xfe, 0x91, 0x91, + 0x25, 0x48, 0xff, 0x2c, 0x2d, 0xe2, 0x7e, 0x63, 0x08, 0xcf, 0xa5, 0x7c, + 0xbe, 0xbd, 0x0f, 0xf5, + 0x70, 0x21, 0x3c, 0x17, 0x6e, 0x30, 0x2b, 0xb9, 0x3c, 0x8f, 0xa7, 0x46, + 0xc6, 0xa7, 0x95, 0xd8, + 0xb9, 0x9c, 0xa1, 0x16, 0x3a, 0x9b, 0xd6, 0xf5, 0x9a, 0xa0, 0x7f, 0x9b, + 0xfe, 0x7e, 0x93, 0xc5, + 0x65, 0x83, 0xf4, 0x8f, 0x8c, 0x2c, 0x41, 0xfa, 0x27, 0x61, 0xd5, 0x2b, + 0x39, 0xf8, 0x6b, 0x3c, + 0x97, 0x28, 0xbe, 0x2a, 0x8e, 0xd3, 0xe2, 0xd6, 0xca, 0x38, 0xe7, 0x72, + 0x6e, 0x4f, 0x35, 0xa5, + 0x2f, 0xed, 0xe1, 0x7c, 0x41, 0xde, 0x64, 0x5a, 0x68, 0x16, 0xe9, 0xfc, + 0x47, 0x46, 0x96, 0x2c, + 0xfd, 0x53, 0xb3, 0xea, 0x39, 0x07, 0x3f, 0x7f, 0x5a, 0xa9, 0x01, 0x5b, + 0xa5, 0x12, 0xc2, 0x73, + 0x81, 0xfa, 0x65, 0xdc, 0x8c, 0x72, 0x1c, 0xa7, 0x25, 0x8a, 0x56, 0x8a, + 0xb8, 0x1e, 0xae, 0x46, + 0x06, 0x33, 0x97, 0x33, 0x78, 0x4d, 0x28, 0xff, 0x41, 0x46, 0x96, 0x28, + 0xfd, 0xc3, 0x31, 0xad, + 0x78, 0xdc, 0xac, 0x7a, 0x9c, 0x3d, 0x94, 0xf2, 0x5c, 0x6e, 0x89, 0x58, + 0x21, 0x9f, 0x7b, 0x39, + 0x4e, 0xb5, 0x64, 0xf3, 0x83, 0x1d, 0x5f, 0x55, 0xd2, 0xcf, 0x91, 0x1a, + 0xa4, 0xba, 0x9a, 0xe0, + 0xb0, 0x1a, 0xb6, 0x56, 0x56, 0xe3, 0x62, 0x5a, 0x31, 0xbf, 0x76, 0x1b, + 0xd3, 0xfb, 0xc6, 0xd7, + 0x24, 0xa8, 0x86, 0x91, 0xf4, 0x8f, 0x8c, 0x2c, 0x49, 0xfa, 0x67, 0xd5, + 0xeb, 0x29, 0x7b, 0x2b, + 0x38, 0x7f, 0xd9, 0x1d, 0xd7, 0xeb, 0x59, 0x6c, 0x2a, 0x1f, 0x07, 0x1f, + 0x34, 0x11, 0x72, 0x05, + 0xb2, 0xf9, 0xc1, 0x8e, 0xaf, 0x2a, 0xa9, 0x91, 0x01, 0x06, 0x82, 0xbe, + 0xd0, 0x5b, 0x36, 0x07, + 0x3f, 0x35, 0x29, 0x36, 0x31, 0x4c, 0x2b, 0x3e, 0x97, 0x73, 0x99, 0x3a, + 0xc4, 0xd4, 0xc8, 0x60, + 0xe6, 0x72, 0x06, 0xd7, 0x30, 0x92, 0xfe, 0x91, 0x91, 0x25, 0x49, 0xff, + 0xac, 0x3e, 0x2f, 0x65, + 0xdc, 0x2c, 0x90, 0x69, 0x65, 0xeb, 0x85, 0x9d, 0x37, 0x39, 0xde, 0x3a, + 0xac, 0x32, 0xbf, 0x38, + 0x6c, 0x7e, 0x30, 0xf7, 0xa7, 0xe7, 0xe5, 0x86, 0xac, 0x46, 0xc6, 0xcd, + 0x7e, 0x06, 0x0e, 0xfe, + 0xf6, 0xd9, 0xf6, 0x01, 0xe8, 0x5f, 0x46, 0xca, 0x73, 0x71, 0xc7, 0xf5, + 0x36, 0x50, 0x71, 0x3d, + 0xcc, 0x5c, 0xce, 0x60, 0x7d, 0x26, 0xfd, 0x23, 0x23, 0x4b, 0x92, 0xfe, + 0xc1, 0x0c, 0xca, 0x38, + 0x98, 0x56, 0xc2, 0x57, 0x15, 0x9c, 0x16, 0x7d, 0xaa, 0xc8, 0x9b, 0x1c, + 0x0b, 0x5f, 0x3a, 0x48, + 0xcb, 0x80, 0xfd, 0x9c, 0x1a, 0xa7, 0x3b, 0x36, 0x07, 0xdf, 0x89, 0x35, + 0xde, 0x92, 0xf0, 0x5c, + 0x5c, 0x71, 0xbd, 0x22, 0x26, 0xae, 0x77, 0xa7, 0xbc, 0xa7, 0xea, 0x4d, + 0xce, 0x2c, 0x64, 0x6b, + 0x42, 0xfa, 0x47, 0x46, 0x96, 0x24, 0xfd, 0x83, 0x19, 0x94, 0xd5, 0x63, + 0x1c, 0xd3, 0x2a, 0xaf, + 0xee, 0x7d, 0x73, 0xc7, 0xf5, 0x24, 0xf3, 0x83, 0x21, 0x6f, 0x52, 0x75, + 0xfa, 0x4d, 0xd2, 0x7d, + 0x67, 0xd6, 0xdb, 0xda, 0x99, 0x0e, 0xb4, 0x70, 0xf3, 0xb4, 0x72, 0x00, + 0x3c, 0x05, 0x39, 0xcf, + 0x85, 0xf9, 0xd7, 0xec, 0xfd, 0x6d, 0x63, 0xea, 0x09, 0x91, 0xb1, 0x4e, + 0x5d, 0xba, 0x26, 0xa4, + 0x7f, 0x64, 0x64, 0x49, 0xd2, 0x3f, 0x88, 0xeb, 0xdd, 0x47, 0xa6, 0x95, + 0x73, 0x3e, 0xf3, 0xf4, + 0x9b, 0xdc, 0x59, 0x69, 0x59, 0xf1, 0x44, 0x6f, 0x64, 0x67, 0x99, 0x56, + 0x7a, 0x08, 0x3a, 0xb6, + 0xde, 0x77, 0xc7, 0xf4, 0x99, 0xf7, 0x26, 0xcb, 0x79, 0x2e, 0x3b, 0xfb, + 0xa5, 0x65, 0x9e, 0xd7, + 0x2b, 0xe6, 0x47, 0x5a, 0x3b, 0x2c, 0x4f, 0x22, 0x38, 0x5f, 0x88, 0x58, + 0xe7, 0x59, 0xf5, 0x20, + 0xb8, 0x86, 0x91, 0xf4, 0x8f, 0x8c, 0x2c, 0x39, 0xfa, 0xa7, 0x85, 0xc6, + 0xf5, 0x56, 0x7e, 0xa3, + 0x60, 0x5a, 0xc5, 0x32, 0x57, 0xed, 0x28, 0xcd, 0x6b, 0x64, 0xec, 0x7e, + 0x93, 0xd2, 0x79, 0xae, + 0xce, 0xe3, 0x7d, 0x90, 0xf7, 0x58, 0xea, 0x6b, 0xef, 0xc3, 0xcf, 0xaa, + 0xe7, 0xb1, 0x46, 0x3f, + 0xcf, 0xe5, 0xae, 0xe8, 0x57, 0xdb, 0x09, 0xe1, 0xb9, 0x58, 0x35, 0x32, + 0x51, 0x38, 0x5f, 0x4d, + 0xd2, 0x3f, 0x32, 0xb2, 0x04, 0xeb, 0x5f, 0x84, 0xb8, 0x1e, 0xd4, 0x83, + 0xa8, 0x6a, 0x50, 0x70, + 0x9c, 0x16, 0xcd, 0xb0, 0x7d, 0x55, 0xd0, 0x32, 0x38, 0xf7, 0xa5, 0xa7, + 0xd9, 0xb6, 0x7e, 0x2c, + 0xf2, 0x1e, 0x7e, 0x2d, 0x0a, 0x8b, 0xeb, 0xb9, 0x39, 0xf8, 0xbb, 0x77, + 0xc3, 0x79, 0x2e, 0x1b, + 0x11, 0x38, 0x5f, 0xf2, 0x35, 0x21, 0xfd, 0x23, 0x23, 0x4b, 0x8c, 0xfe, + 0x21, 0x59, 0xf5, 0x22, + 0xae, 0x57, 0x8c, 0x67, 0xae, 0x9a, 0x8c, 0xd3, 0x62, 0x71, 0xf0, 0x83, + 0xb4, 0x52, 0x5d, 0xaf, + 0x57, 0x6c, 0xc3, 0xbc, 0xf5, 0x50, 0x9e, 0xcb, 0x54, 0x6f, 0xea, 0xc7, + 0x0e, 0xe7, 0x2b, 0xf4, + 0xfd, 0xc9, 0x63, 0x9d, 0xa4, 0x7f, 0x64, 0x64, 0xc9, 0xd1, 0xbf, 0x98, + 0x99, 0x56, 0xe0, 0xab, + 0xc6, 0xc4, 0x69, 0xb1, 0xf5, 0x8f, 0x6b, 0xe5, 0x20, 0x4a, 0xef, 0x5b, + 0x30, 0xcf, 0x05, 0x62, + 0x8d, 0xe0, 0x2f, 0x97, 0xcf, 0x8a, 0x07, 0xd2, 0xf9, 0xc1, 0xfc, 0xfd, + 0x85, 0xad, 0x09, 0xe9, + 0x1f, 0x19, 0xd9, 0x8d, 0xd7, 0x3f, 0xa6, 0x41, 0xbc, 0x2e, 0xd9, 0x8a, + 0xeb, 0x69, 0xb1, 0xb0, + 0xea, 0x23, 0x72, 0x5a, 0x7a, 0x88, 0xde, 0xb7, 0xa3, 0x94, 0x51, 0xc5, + 0xd4, 0xeb, 0x41, 0xef, + 0x5b, 0x50, 0x5c, 0xcf, 0xcd, 0xc1, 0xbf, 0xa8, 0xec, 0x57, 0xef, 0x2a, + 0xe6, 0x07, 0x3b, 0x35, + 0x32, 0xb2, 0x58, 0x27, 0xe9, 0x1f, 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0x59, + 0xa5, 0x61, 0xef, 0x7f, + 0xa8, 0x07, 0x49, 0x87, 0xf0, 0x5c, 0x44, 0x0e, 0x36, 0x12, 0xd3, 0x2a, + 0x16, 0x4e, 0x8b, 0x38, + 0x8b, 0xa5, 0xbb, 0xa0, 0x95, 0xca, 0x7a, 0x3d, 0xd1, 0xfb, 0x16, 0xaa, + 0xcf, 0x10, 0x2b, 0xe4, + 0x9c, 0xaf, 0xd3, 0xad, 0x9a, 0x6c, 0x7e, 0x30, 0xcf, 0x9b, 0x84, 0x72, + 0xbe, 0x48, 0xff, 0xc8, + 0xc8, 0x6e, 0xbc, 0xfe, 0x2d, 0x76, 0x1b, 0x76, 0x7c, 0x6c, 0xf7, 0x4e, + 0x28, 0xcf, 0xc5, 0x89, + 0xeb, 0x29, 0x59, 0xf5, 0xf1, 0x72, 0x5a, 0xac, 0xbc, 0x73, 0xa6, 0x83, + 0xae, 0xd7, 0x53, 0xcd, + 0xe5, 0xb4, 0x39, 0x5f, 0xcc, 0x97, 0x96, 0xcd, 0x0f, 0xb6, 0xf3, 0x26, + 0xf2, 0x7e, 0x13, 0xd2, + 0x3f, 0x32, 0xb2, 0x1b, 0xaf, 0x7f, 0x4c, 0xab, 0x72, 0xd3, 0x42, 0xa3, + 0x74, 0x5e, 0x39, 0x58, + 0xf5, 0xed, 0x06, 0xf0, 0x5c, 0x2c, 0x0e, 0x7e, 0x9c, 0x4c, 0x2b, 0x1c, + 0xa7, 0xc5, 0xce, 0x6b, + 0x64, 0x3b, 0xa8, 0xb9, 0x9c, 0x67, 0xf8, 0xb9, 0x9c, 0x19, 0x6f, 0x5c, + 0xcf, 0x90, 0x72, 0xf0, + 0x03, 0xfb, 0x4d, 0x48, 0xff, 0xc8, 0xc8, 0x92, 0x92, 0xff, 0xe0, 0x71, + 0x3d, 0xa6, 0x2f, 0x39, + 0x19, 0xcf, 0x85, 0x73, 0xf0, 0xb3, 0x4d, 0xa8, 0x87, 0x2b, 0x8e, 0x14, + 0x35, 0x82, 0xc8, 0xb8, + 0x1e, 0x8a, 0xd3, 0x62, 0x9f, 0x15, 0xc7, 0x7a, 0x47, 0x5d, 0xaf, 0xc7, + 0x6b, 0x18, 0x11, 0x4c, + 0x2b, 0x5d, 0xc1, 0xf9, 0x12, 0x79, 0x93, 0x02, 0x70, 0xbe, 0x64, 0xfd, + 0x26, 0xc3, 0xcb, 0x0e, + 0xe9, 0x1f, 0x19, 0x59, 0x32, 0xf4, 0x8f, 0xc7, 0xf5, 0x6c, 0xbf, 0x51, + 0xc2, 0x73, 0x81, 0x5c, + 0x00, 0x9c, 0x9b, 0xb6, 0x8e, 0x0b, 0x52, 0x9e, 0x8b, 0x2f, 0xae, 0x17, + 0xee, 0xab, 0x62, 0x38, + 0x2d, 0x4e, 0xdd, 0x4d, 0xae, 0x8d, 0x62, 0x5a, 0xe1, 0xe6, 0x72, 0xb6, + 0x30, 0x73, 0x39, 0x45, + 0x8d, 0xa0, 0x5e, 0xb3, 0xf3, 0x26, 0x3b, 0xb7, 0x2a, 0xab, 0x99, 0x99, + 0x73, 0xe2, 0x3f, 0x93, + 0x91, 0x25, 0x45, 0xff, 0xf2, 0xb2, 0xb8, 0x9e, 0x87, 0x83, 0x5f, 0xd9, + 0x53, 0xf1, 0x5c, 0x22, + 0xc4, 0xf5, 0x70, 0x9c, 0x16, 0xa7, 0xee, 0x26, 0xd7, 0x56, 0xc6, 0xf5, + 0x62, 0x9e, 0xcb, 0xe9, + 0xe7, 0x7c, 0x79, 0xe6, 0x07, 0xcf, 0x2e, 0x9b, 0xa4, 0x7f, 0x64, 0x64, + 0x89, 0xd0, 0x3f, 0xa3, + 0x88, 0x88, 0xeb, 0x69, 0xc0, 0x1f, 0x65, 0x3e, 0x60, 0xe9, 0x74, 0xab, + 0x16, 0xc6, 0xc1, 0x4f, + 0x47, 0xe0, 0x2f, 0x2b, 0x39, 0x2d, 0xf6, 0x59, 0x6c, 0x9e, 0x6b, 0xed, + 0x4c, 0x15, 0x71, 0x3d, + 0x9b, 0x69, 0x15, 0x53, 0x0d, 0x63, 0xd8, 0x9a, 0x68, 0x3d, 0x9a, 0xff, + 0x46, 0x46, 0x96, 0x08, + 0xfd, 0xeb, 0x21, 0x67, 0x50, 0x0e, 0x20, 0xae, 0xb7, 0xb3, 0xb7, 0x11, + 0xca, 0x73, 0x29, 0xef, + 0x41, 0xfc, 0xb0, 0x7a, 0x5a, 0x38, 0xc8, 0x0c, 0x24, 0xf3, 0x83, 0x6d, + 0x5f, 0x55, 0xd1, 0xcf, + 0xa1, 0xad, 0x72, 0xae, 0x46, 0x66, 0x99, 0x6b, 0x15, 0xaf, 0xcc, 0xaa, + 0xf7, 0xfb, 0xb5, 0x78, + 0xce, 0x97, 0x7c, 0x4d, 0x28, 0xff, 0x41, 0x46, 0x96, 0x08, 0xfd, 0xb3, + 0x99, 0x56, 0x0a, 0x66, + 0x94, 0x16, 0xc8, 0xaa, 0xf7, 0xf2, 0x5c, 0x76, 0x3d, 0x79, 0x53, 0x2b, + 0x6f, 0x32, 0xf1, 0xcd, + 0x0f, 0x76, 0xf9, 0xaa, 0x61, 0xfd, 0x1c, 0xc0, 0x7e, 0xce, 0x4e, 0x81, + 0xfd, 0xcc, 0x7c, 0x70, + 0xa6, 0x7f, 0x57, 0x67, 0xd5, 0x7b, 0x4d, 0xd4, 0x30, 0xa6, 0xaf, 0x39, + 0x97, 0x93, 0xf4, 0x8f, + 0x8c, 0x2c, 0x19, 0xfa, 0xe7, 0xf4, 0x79, 0xa9, 0xeb, 0xf5, 0xc2, 0xfc, + 0x46, 0x2b, 0x6f, 0x02, + 0x7e, 0x6d, 0xe5, 0xb6, 0x2b, 0x57, 0xe0, 0x9f, 0x1f, 0x0c, 0x79, 0x93, + 0x7e, 0xb6, 0x53, 0x51, + 0xf4, 0xbe, 0xb9, 0xd9, 0xcf, 0xc0, 0x44, 0xd8, 0x5a, 0xe6, 0xa5, 0x3c, + 0x17, 0x11, 0xd7, 0xdb, + 0xba, 0x52, 0x5c, 0x2f, 0xac, 0x46, 0x46, 0xde, 0x0f, 0x48, 0xfa, 0x47, + 0x46, 0x96, 0x08, 0xfd, + 0x1b, 0xe0, 0xea, 0xf5, 0x50, 0x4c, 0x2b, 0x66, 0xbc, 0x06, 0x65, 0x9a, + 0x6a, 0x4a, 0xe7, 0x07, + 0x5b, 0x79, 0x93, 0x2a, 0x3b, 0x1f, 0x66, 0x42, 0xfa, 0x4d, 0x52, 0xa3, + 0x74, 0x27, 0x33, 0xd3, + 0x5b, 0x39, 0x8b, 0x07, 0xe3, 0xe5, 0xb9, 0xe4, 0x3d, 0x3c, 0x17, 0x11, + 0xd7, 0xdb, 0xb9, 0x76, + 0x5c, 0x6f, 0x15, 0x4b, 0x54, 0xad, 0x09, 0xe9, 0x1f, 0x19, 0x59, 0x22, + 0xf4, 0xcf, 0x62, 0xd5, + 0xe3, 0xe6, 0xaa, 0x65, 0x22, 0xcf, 0x55, 0x0b, 0x9e, 0x1f, 0xbc, 0xde, + 0x6f, 0x62, 0x71, 0xec, + 0xfd, 0xef, 0xc1, 0xd0, 0x86, 0xe9, 0x2e, 0x68, 0xe0, 0x56, 0x08, 0xcf, + 0x05, 0xea, 0x92, 0x33, + 0x3c, 0xae, 0x77, 0x1d, 0xa6, 0x95, 0xa7, 0x46, 0xa6, 0xbd, 0x7b, 0x2b, + 0x6c, 0x4d, 0x48, 0xff, + 0xc8, 0xc8, 0x92, 0xa0, 0x7f, 0x3e, 0x56, 0xbd, 0xd4, 0x22, 0x31, 0xad, + 0x82, 0xe3, 0x7a, 0xab, + 0xbc, 0xc9, 0x99, 0x2f, 0x56, 0xc8, 0xb4, 0x6c, 0x73, 0x91, 0x69, 0xa6, + 0x47, 0xa9, 0x0e, 0x9c, + 0xe9, 0x3c, 0xb5, 0xd3, 0x7d, 0xa6, 0x7f, 0xcb, 0x6c, 0x8b, 0xbd, 0xd3, + 0xae, 0x88, 0x35, 0xae, + 0xf3, 0x5c, 0x20, 0xd6, 0x08, 0x3d, 0x2c, 0x95, 0x93, 0x7c, 0xcd, 0xaa, + 0x4b, 0x0c, 0x3e, 0xb7, + 0x61, 0xf9, 0xfd, 0x21, 0x73, 0x39, 0x49, 0xff, 0xc8, 0xc8, 0x92, 0xa3, + 0x7f, 0xbc, 0x1e, 0x04, + 0x5b, 0xaf, 0x87, 0x64, 0x5a, 0x21, 0x38, 0x2d, 0x0d, 0xe0, 0xcf, 0xbb, + 0xf3, 0x26, 0x9c, 0xff, + 0x0c, 0xf1, 0xbe, 0xa5, 0xde, 0x04, 0x0e, 0xfe, 0xea, 0x2c, 0x96, 0xed, + 0xe4, 0x16, 0x99, 0x96, + 0xef, 0x9c, 0xd9, 0x0d, 0xe2, 0xe0, 0xc3, 0x99, 0x52, 0x70, 0xf0, 0x03, + 0x78, 0x2e, 0xa8, 0xb8, + 0x1e, 0xb6, 0x46, 0x86, 0xf4, 0x8f, 0x8c, 0x2c, 0x09, 0xfa, 0x87, 0x8b, + 0xeb, 0x21, 0xeb, 0xf5, + 0xac, 0xde, 0xb7, 0x54, 0x94, 0xde, 0xb7, 0x9e, 0xc6, 0xb5, 0x4c, 0x9f, + 0x66, 0x5a, 0xfa, 0xc2, + 0x9a, 0x79, 0xe9, 0xe2, 0x3f, 0x43, 0xef, 0x5b, 0x6e, 0x9e, 0x6e, 0xc9, + 0xeb, 0x64, 0x04, 0x07, + 0x1f, 0xfc, 0xda, 0xca, 0x1d, 0xdf, 0xcc, 0x4d, 0x3f, 0x07, 0xdf, 0x8a, + 0x75, 0xa6, 0x50, 0x9c, + 0xaf, 0xb0, 0x35, 0x21, 0xfd, 0x23, 0x23, 0x4b, 0x82, 0xfe, 0xf1, 0x7a, + 0x90, 0x2b, 0xc4, 0xf5, + 0x82, 0x6b, 0x50, 0x8a, 0xad, 0x6b, 0x71, 0x5a, 0x7a, 0xc0, 0x7e, 0x4e, + 0x75, 0x81, 0x83, 0xbf, + 0xca, 0xeb, 0xea, 0xed, 0xdc, 0x2c, 0xd5, 0x56, 0xdd, 0x0d, 0xaf, 0xd7, + 0x9b, 0xa6, 0x9b, 0x61, + 0x3c, 0x97, 0x4d, 0x9e, 0x77, 0xd9, 0xde, 0x4b, 0xcb, 0xe7, 0x07, 0xaf, + 0x6a, 0x64, 0x42, 0xd7, + 0x84, 0xf4, 0x8f, 0x8c, 0x2c, 0x09, 0xfa, 0x77, 0x2d, 0x56, 0x7d, 0x50, + 0x8d, 0x0c, 0x86, 0xd3, + 0x72, 0x8a, 0xe0, 0xb4, 0xd8, 0xbe, 0xe8, 0x34, 0xd7, 0xce, 0x4d, 0xb5, + 0x70, 0xfd, 0x5b, 0xe7, + 0xf7, 0x07, 0xf3, 0x5c, 0xee, 0x88, 0xbc, 0x8b, 0x7c, 0x7e, 0x30, 0x36, + 0xd6, 0x49, 0xfa, 0x47, + 0x46, 0x76, 0xe3, 0xf5, 0x8f, 0x9d, 0xeb, 0xb0, 0x71, 0xbd, 0x0a, 0x82, + 0x55, 0x8f, 0x9b, 0xab, + 0x86, 0xe4, 0xb4, 0xd8, 0xbe, 0xe8, 0x3c, 0xd7, 0xd2, 0x47, 0x8a, 0x79, + 0xbe, 0xa1, 0x71, 0x3d, + 0x37, 0x07, 0xdf, 0x1d, 0x2b, 0x0c, 0x98, 0x1f, 0x6c, 0xe5, 0x4d, 0x80, + 0xdf, 0x1f, 0x5e, 0x23, + 0x43, 0xfa, 0x47, 0x46, 0x76, 0xe3, 0xf5, 0x6f, 0xba, 0xdd, 0x04, 0xbf, + 0xb1, 0x34, 0xcb, 0x34, + 0xa4, 0x3c, 0x17, 0x57, 0x5c, 0x2f, 0x16, 0xa6, 0x15, 0xd3, 0x5c, 0x54, + 0x0d, 0x8a, 0x75, 0x8e, + 0xcb, 0x2c, 0x72, 0xad, 0xcc, 0x50, 0x31, 0x23, 0x24, 0xca, 0x5c, 0x4e, + 0x76, 0x3e, 0x0d, 0x9e, + 0x1f, 0x6c, 0x71, 0xf0, 0x47, 0x99, 0x56, 0xf1, 0x42, 0xc5, 0xef, 0x27, + 0xfd, 0x23, 0x23, 0xbb, + 0xf1, 0xfa, 0x67, 0xf1, 0x9f, 0x45, 0xae, 0x00, 0xf6, 0xff, 0x3a, 0xcf, + 0x85, 0xdb, 0xf8, 0x9a, + 0x71, 0xbd, 0x00, 0x5f, 0x5a, 0xc5, 0x69, 0xb1, 0xcf, 0x6e, 0xd9, 0x65, + 0xae, 0x99, 0x1e, 0x28, + 0xf4, 0xcf, 0x62, 0x5a, 0xa1, 0xe6, 0x72, 0x5a, 0xef, 0xcf, 0xc3, 0x73, + 0xf1, 0x73, 0xf0, 0xd9, + 0xfb, 0x0b, 0xef, 0x37, 0x21, 0xfd, 0x23, 0x23, 0xbb, 0xf1, 0xfa, 0xc7, + 0x74, 0xcd, 0x89, 0x8d, + 0x39, 0xfb, 0xbf, 0xbc, 0x07, 0xb9, 0x02, 0x37, 0x07, 0x5f, 0xd9, 0xfb, + 0xe6, 0xaa, 0x91, 0x89, + 0x8b, 0xd3, 0x62, 0xe7, 0x43, 0xa0, 0xf7, 0x2d, 0xd5, 0x0f, 0xd7, 0x35, + 0x2c, 0xd3, 0x4a, 0x16, + 0xd7, 0xf3, 0x70, 0xf0, 0x6f, 0x57, 0x95, 0xf3, 0x83, 0x49, 0xff, 0xc8, + 0xc8, 0x12, 0xa0, 0x7f, + 0x47, 0x99, 0x2e, 0xf8, 0x7e, 0xfa, 0x38, 0xdb, 0xca, 0xfb, 0x78, 0xa7, + 0x2e, 0xf6, 0xfb, 0x41, + 0xfe, 0x78, 0xfb, 0x70, 0xf7, 0x2c, 0x7f, 0x20, 0xe5, 0xb9, 0xb8, 0x6a, + 0x64, 0x4a, 0x31, 0x71, + 0x5a, 0x6c, 0x5f, 0x19, 0x6a, 0x02, 0x55, 0x5f, 0x8b, 0x9e, 0xcb, 0xa9, + 0xee, 0x7d, 0x33, 0x52, + 0xa3, 0x7c, 0x1b, 0xea, 0x68, 0x42, 0xfb, 0x4d, 0x8e, 0x2e, 0xbb, 0xa4, + 0x7f, 0x64, 0x64, 0x37, + 0x5c, 0xff, 0x86, 0x82, 0x69, 0xb5, 0xf2, 0x1b, 0x81, 0x61, 0x90, 0x83, + 0xba, 0xe2, 0xc3, 0x1d, + 0xdb, 0x27, 0xb4, 0xf3, 0xa6, 0xb7, 0x6d, 0x0e, 0x7e, 0x00, 0xcf, 0xc5, + 0x3a, 0xab, 0xe1, 0x6a, + 0x64, 0x70, 0x9c, 0x16, 0x2b, 0xaf, 0x6b, 0x40, 0xef, 0x5b, 0xac, 0x73, + 0x39, 0x95, 0x9c, 0xaf, + 0x9c, 0x58, 0x93, 0x1e, 0xf4, 0x9b, 0x04, 0xcf, 0x0f, 0xae, 0xcc, 0x88, + 0xff, 0x4c, 0x46, 0x96, + 0x00, 0xff, 0xb7, 0x2d, 0x8d, 0xeb, 0xf5, 0x44, 0x5d, 0x31, 0xf4, 0xed, + 0x42, 0x3c, 0xcc, 0xcd, + 0xc1, 0x87, 0x5c, 0x81, 0x87, 0xe7, 0x02, 0xdf, 0x7f, 0x94, 0xea, 0xa2, + 0x66, 0x94, 0x23, 0x39, + 0x2d, 0x42, 0x8b, 0xa0, 0xf7, 0x4d, 0x6f, 0x6e, 0x28, 0x99, 0x56, 0xd5, + 0x28, 0x73, 0x39, 0xc3, + 0xe3, 0x8e, 0x41, 0x73, 0x39, 0x5d, 0xfd, 0x26, 0x9c, 0x83, 0xbd, 0x20, + 0xfd, 0x23, 0x23, 0xbb, + 0xf1, 0xfa, 0x37, 0xd9, 0x6a, 0x61, 0xea, 0xf5, 0xa0, 0x1e, 0xa4, 0x7c, + 0x5a, 0xa8, 0x95, 0x4e, + 0xb7, 0x6b, 0xee, 0x78, 0xa1, 0x9d, 0x37, 0xe1, 0x3d, 0x16, 0x4c, 0x0b, + 0x21, 0x76, 0xa6, 0xee, + 0x2d, 0xc3, 0x71, 0x5a, 0x44, 0x5e, 0x23, 0xb3, 0xde, 0xfb, 0x16, 0x60, + 0x82, 0x69, 0xf5, 0x60, + 0xe6, 0x72, 0xf2, 0xbc, 0x49, 0x9f, 0xfc, 0x5f, 0x32, 0xb2, 0x1b, 0xaf, + 0x7f, 0xb3, 0x72, 0x73, + 0xf7, 0x14, 0x57, 0xaf, 0x67, 0xf7, 0xbe, 0x41, 0xae, 0xc0, 0x99, 0x13, + 0xe7, 0xce, 0x9b, 0xdc, + 0xda, 0xd9, 0x03, 0x3d, 0x2c, 0xce, 0xf3, 0x75, 0xd9, 0xfc, 0x60, 0xee, + 0xab, 0x2e, 0x31, 0xbe, + 0xea, 0x86, 0x01, 0x3e, 0xaf, 0xaa, 0xf7, 0xcd, 0xfe, 0xda, 0xe2, 0x03, + 0x9f, 0xcb, 0x49, 0xf9, + 0x0f, 0x32, 0xb2, 0x9b, 0xaf, 0x7f, 0x95, 0x06, 0x6a, 0xae, 0x5a, 0x70, + 0x5c, 0x4f, 0xb0, 0x9f, + 0x43, 0xf2, 0x26, 0xfe, 0xf9, 0xc1, 0x96, 0xaf, 0x5a, 0xab, 0x2a, 0x7d, + 0x55, 0xcd, 0xc8, 0xce, + 0x32, 0xed, 0xd4, 0xd4, 0xe9, 0x7d, 0x33, 0xae, 0x1d, 0xd7, 0x83, 0xf9, + 0x25, 0x68, 0xce, 0x97, + 0x6a, 0x2e, 0x27, 0xe9, 0x1f, 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0x79, 0xb5, + 0x51, 0x59, 0xa4, 0xaf, + 0xc3, 0xb4, 0x72, 0x34, 0x28, 0xbb, 0xd8, 0xae, 0xef, 0xde, 0x29, 0xef, + 0x39, 0xbc, 0x53, 0xff, + 0xfc, 0x60, 0x8b, 0x83, 0xcf, 0x7d, 0xd5, 0xd9, 0x46, 0x43, 0xa5, 0x7f, + 0x0e, 0xff, 0x79, 0xc9, + 0xbe, 0x6f, 0x9a, 0x6e, 0x07, 0xf2, 0x5c, 0x22, 0xc4, 0xf5, 0xd4, 0x4c, + 0x2b, 0x61, 0x3a, 0xa6, + 0x1f, 0x90, 0xf4, 0x8f, 0x8c, 0x2c, 0x01, 0xfa, 0xb7, 0xdb, 0xd8, 0x9e, + 0x6a, 0xa8, 0xde, 0x37, + 0x15, 0xd3, 0x4a, 0x9b, 0x6e, 0x37, 0xb8, 0xdf, 0xa8, 0xc8, 0x9b, 0x40, + 0x8d, 0xcc, 0xd6, 0x3c, + 0x1b, 0xde, 0x6f, 0x72, 0x94, 0x32, 0x80, 0x81, 0x00, 0xb5, 0x7f, 0x5c, + 0x03, 0xd9, 0xe5, 0x89, + 0x35, 0xba, 0xeb, 0x92, 0x99, 0x3e, 0x63, 0x98, 0x56, 0xf1, 0xce, 0xe5, + 0x24, 0xfd, 0x23, 0x23, + 0xbb, 0xf1, 0xfa, 0xb7, 0xd8, 0x6d, 0xc4, 0x37, 0x57, 0xad, 0xb2, 0x36, + 0x57, 0x0d, 0x72, 0x05, + 0xfa, 0xb4, 0xd0, 0x0c, 0xca, 0x9b, 0xec, 0x9c, 0x07, 0xcf, 0x0f, 0x16, + 0x9a, 0x9b, 0xe6, 0xda, + 0x06, 0xbd, 0x6f, 0x3a, 0x3b, 0xfb, 0x01, 0x07, 0x3f, 0x90, 0xe7, 0x02, + 0x35, 0xda, 0x63, 0xbd, + 0x05, 0xff, 0x3f, 0x1e, 0x7e, 0x3f, 0x76, 0x2e, 0x27, 0xe9, 0x1f, 0x19, + 0x59, 0x12, 0xf4, 0x0f, + 0x57, 0xaf, 0xa7, 0xee, 0x7d, 0xcb, 0x2a, 0x7a, 0xdf, 0x52, 0x3c, 0x6f, + 0x52, 0xac, 0x3b, 0x3a, + 0x66, 0xe5, 0x4d, 0x2a, 0x56, 0xbf, 0x49, 0x6e, 0x92, 0x06, 0x1d, 0x14, + 0xec, 0xe7, 0x61, 0x86, + 0xeb, 0x21, 0xcc, 0x7d, 0xb3, 0x7a, 0xdf, 0x2c, 0x9e, 0x4b, 0xc1, 0xcb, + 0x73, 0xb1, 0xe6, 0xcc, + 0x41, 0x5c, 0x6f, 0x73, 0xa6, 0x37, 0x64, 0x3c, 0x17, 0xfe, 0xfe, 0x90, + 0xbd, 0xc9, 0xa8, 0x1a, + 0x46, 0x93, 0xe6, 0xff, 0x92, 0x91, 0x25, 0x41, 0xff, 0x94, 0xf5, 0x7a, + 0xdc, 0x6f, 0x2c, 0x2a, + 0x6b, 0x64, 0x20, 0xae, 0xa7, 0x64, 0x5a, 0x31, 0x7d, 0x01, 0xfd, 0xcb, + 0x4d, 0xb2, 0xad, 0x82, + 0x2f, 0x6f, 0x52, 0x3a, 0xcb, 0xd5, 0x21, 0xd6, 0xa7, 0xcf, 0x32, 0xad, + 0xf4, 0x24, 0xdb, 0xb6, + 0x7b, 0xdf, 0xd2, 0x6b, 0x7e, 0xad, 0x3d, 0x73, 0x53, 0xd4, 0x25, 0x57, + 0xef, 0xa8, 0x79, 0x2e, + 0x60, 0x31, 0xf0, 0xfb, 0x57, 0xef, 0x80, 0xf4, 0x8f, 0x8c, 0x2c, 0x11, + 0xf1, 0xbf, 0x4c, 0x2c, + 0x4c, 0xab, 0x0d, 0xa8, 0x91, 0x39, 0x50, 0xf7, 0xbe, 0x09, 0x4e, 0xcb, + 0xca, 0x97, 0x16, 0xfd, + 0x26, 0x30, 0x27, 0x6e, 0xf3, 0x24, 0xd7, 0xb0, 0xd9, 0xcf, 0x10, 0xef, + 0xe3, 0x39, 0x10, 0xe8, + 0x7d, 0x3b, 0x0a, 0x39, 0x77, 0xf6, 0x52, 0x5d, 0x1d, 0xf2, 0x2e, 0xb7, + 0xb7, 0xf7, 0xd6, 0x79, + 0x2e, 0x5e, 0x0e, 0x7e, 0x14, 0xce, 0x97, 0x72, 0x4d, 0x7a, 0xa4, 0x7f, + 0x64, 0x64, 0x37, 0xbf, + 0xfe, 0xa5, 0xdc, 0xc4, 0x31, 0xad, 0x14, 0xf5, 0x7a, 0xd8, 0xb9, 0x6a, + 0x23, 0x98, 0xab, 0x26, + 0xe1, 0xb4, 0x70, 0xf6, 0x73, 0xba, 0x93, 0xb1, 0xf2, 0x1e, 0xbc, 0xf7, + 0xed, 0x44, 0xdd, 0xfb, + 0xa6, 0x41, 0x3d, 0xf5, 0xa9, 0x5e, 0xb3, 0x39, 0xf8, 0x81, 0x3c, 0x97, + 0xf3, 0xad, 0x03, 0xde, + 0x9b, 0x3c, 0x4d, 0x37, 0x53, 0x61, 0xec, 0x67, 0x1e, 0xeb, 0x44, 0x70, + 0xbe, 0xa8, 0xff, 0x97, + 0x8c, 0xec, 0xe6, 0xeb, 0xdf, 0x64, 0xab, 0xb5, 0x11, 0x0b, 0xd3, 0x6a, + 0x8d, 0xbf, 0x1c, 0xac, + 0x55, 0x9c, 0xd3, 0xa2, 0xae, 0x41, 0x49, 0xcf, 0x72, 0x2d, 0x31, 0xf7, + 0x4d, 0xdd, 0xfb, 0xc6, + 0xf5, 0xd9, 0x57, 0x4f, 0xe8, 0xe1, 0xb9, 0xdc, 0x71, 0xe7, 0x5d, 0x44, + 0xac, 0x31, 0x68, 0x7e, + 0x30, 0xb7, 0x31, 0x2e, 0xd6, 0xa9, 0xf7, 0x2f, 0x3b, 0xa4, 0x7f, 0x64, + 0x64, 0x37, 0x5c, 0xff, + 0x46, 0x45, 0x25, 0x83, 0xb4, 0x70, 0x86, 0x60, 0xd5, 0xc7, 0x36, 0x57, + 0x4d, 0xf8, 0xd2, 0xc0, + 0x7c, 0xe6, 0xbd, 0x6f, 0x4b, 0x75, 0xef, 0x9b, 0x22, 0xae, 0x27, 0xf2, + 0x26, 0xf3, 0xcd, 0x06, + 0xbc, 0xbf, 0xb0, 0xf9, 0xc1, 0x90, 0x37, 0x41, 0xf3, 0xfb, 0x87, 0x97, + 0x6d, 0xd2, 0x3f, 0x32, + 0xb2, 0x9b, 0x7f, 0xfe, 0xb3, 0xeb, 0x92, 0x83, 0x67, 0xe6, 0x22, 0x59, + 0xf5, 0x10, 0xd7, 0xc3, + 0xd4, 0xc8, 0x2c, 0x70, 0xbd, 0x6f, 0x90, 0xf7, 0xd5, 0x46, 0x7a, 0x27, + 0xb7, 0x50, 0xf7, 0xbe, + 0xa9, 0x59, 0xf5, 0x42, 0x9f, 0x1d, 0xce, 0x97, 0x64, 0x7e, 0x30, 0xe4, + 0x4d, 0x72, 0x8b, 0xad, + 0x3a, 0xe7, 0x7c, 0x29, 0xfa, 0x4d, 0x8a, 0xe3, 0xcb, 0x16, 0xe9, 0x1f, + 0x19, 0xd9, 0xcd, 0xcf, + 0xff, 0x82, 0x2e, 0x54, 0x2e, 0xd8, 0xfe, 0xf7, 0xf3, 0x5c, 0xac, 0x98, + 0xdc, 0xf6, 0xad, 0xdd, + 0x3d, 0x65, 0x5c, 0xcf, 0xe2, 0x2f, 0x6f, 0xc4, 0xc2, 0x69, 0x11, 0x79, + 0x5f, 0x6d, 0xc2, 0xf4, + 0x4f, 0x39, 0xf7, 0xcd, 0xea, 0x7d, 0x1b, 0x2b, 0x7b, 0xdf, 0x44, 0x5c, + 0xcf, 0xb9, 0xaf, 0xe0, + 0xf9, 0xc1, 0x55, 0x8b, 0xf3, 0x25, 0x9d, 0x1f, 0x6c, 0xaf, 0xc9, 0xe4, + 0xb2, 0x49, 0xfa, 0x47, + 0x46, 0x76, 0xf3, 0xcf, 0x7f, 0x4e, 0xbf, 0x9a, 0x9d, 0x2b, 0xb8, 0x70, + 0x71, 0xf0, 0x07, 0xe9, + 0x0e, 0x8e, 0x69, 0x85, 0xe3, 0x2f, 0xa3, 0x38, 0x2d, 0xa0, 0x7f, 0x90, + 0xf7, 0xc5, 0xcc, 0x7d, + 0x8b, 0xce, 0xb4, 0x5a, 0xd3, 0x67, 0x37, 0x07, 0x1f, 0x7e, 0x16, 0x3f, + 0x17, 0xca, 0xe6, 0x07, + 0xc3, 0xf7, 0xb3, 0xd7, 0x2c, 0xcf, 0x48, 0xff, 0xc8, 0xc8, 0x6e, 0xbc, + 0xfe, 0xb1, 0xf3, 0x13, + 0xdb, 0xff, 0x1d, 0x7d, 0x92, 0x6f, 0x42, 0xbf, 0xda, 0xaa, 0xc7, 0xc2, + 0xea, 0xd1, 0x38, 0x2b, + 0x1d, 0x40, 0x2e, 0x35, 0x3f, 0x4e, 0xb7, 0xc2, 0xf2, 0xa6, 0x31, 0xf2, + 0x97, 0x1d, 0xe6, 0x69, + 0x6a, 0xc6, 0xf4, 0x6f, 0xa2, 0x9a, 0x7b, 0x99, 0x8e, 0x85, 0x69, 0x65, + 0xbf, 0x3f, 0x1e, 0xeb, + 0x3c, 0x29, 0xd4, 0xa4, 0xf3, 0x83, 0x81, 0x83, 0x3f, 0xca, 0xb6, 0x89, + 0x7f, 0x4a, 0x46, 0x96, + 0x04, 0xfd, 0xf3, 0xe7, 0x0a, 0x32, 0x9d, 0xdc, 0xb4, 0xd0, 0x28, 0x9d, + 0xba, 0x7a, 0x2c, 0x9e, + 0xda, 0xb5, 0x73, 0x05, 0x81, 0x3c, 0x17, 0x7c, 0x5c, 0x0f, 0xc9, 0x69, + 0x81, 0xbc, 0xef, 0xb1, + 0xde, 0x84, 0x1c, 0x48, 0x56, 0x75, 0xae, 0xeb, 0x67, 0xbb, 0x55, 0xdc, + 0x5c, 0xce, 0x7a, 0xc4, + 0xb9, 0x9c, 0xc1, 0xf3, 0x83, 0xed, 0x7e, 0x93, 0x39, 0xe9, 0x1f, 0x19, + 0x59, 0xc2, 0xf4, 0xcf, + 0xa3, 0x05, 0xbc, 0xc7, 0x62, 0xb9, 0x55, 0x87, 0x79, 0xe1, 0xd5, 0xbb, + 0x01, 0x3c, 0x17, 0x17, + 0x07, 0x3f, 0x7b, 0xbc, 0x9a, 0xab, 0x76, 0x6d, 0x5f, 0x95, 0xe7, 0x7d, + 0xb3, 0x2d, 0xc8, 0x81, + 0x64, 0x94, 0x73, 0xdf, 0xfc, 0xfc, 0xfe, 0x90, 0x1a, 0x19, 0x4c, 0xef, + 0xdb, 0xad, 0xa0, 0xde, + 0x37, 0xf7, 0xfc, 0xe0, 0xb2, 0xd0, 0x42, 0xe2, 0x3f, 0x93, 0x91, 0x25, + 0x58, 0xff, 0xec, 0xb8, + 0x59, 0x89, 0x33, 0xa3, 0x78, 0xae, 0xc0, 0xd7, 0xaf, 0xe6, 0xce, 0x9b, + 0xf0, 0xde, 0xb7, 0x45, + 0xba, 0x1e, 0xaa, 0x43, 0xab, 0x1a, 0x99, 0x70, 0x5f, 0x75, 0x94, 0xe5, + 0x79, 0xdf, 0xe0, 0xde, + 0xb7, 0x80, 0xb8, 0x1e, 0x96, 0x69, 0xb5, 0xc4, 0x71, 0xbe, 0x42, 0x6b, + 0x18, 0x81, 0x6d, 0xb3, + 0xd8, 0x6a, 0x90, 0xfe, 0x91, 0x91, 0x25, 0x5f, 0xff, 0xd6, 0x58, 0xf5, + 0xd0, 0x63, 0x31, 0x16, + 0xfd, 0x6a, 0x9e, 0xbc, 0x09, 0xd3, 0xb5, 0xca, 0x45, 0x08, 0xcf, 0x85, + 0xfb, 0xaa, 0x38, 0xfe, + 0xb2, 0x60, 0x3e, 0xa7, 0xda, 0xba, 0xaa, 0xf7, 0xcd, 0x8c, 0xc6, 0xb4, + 0x42, 0xcf, 0xe5, 0x54, + 0x73, 0xbe, 0x9a, 0xa4, 0x7f, 0x64, 0x64, 0xc9, 0xd7, 0x3f, 0xce, 0xb4, + 0x92, 0xc4, 0xf5, 0xb4, + 0x7e, 0x48, 0xde, 0xe4, 0xdc, 0x3b, 0x3f, 0x98, 0x6b, 0xe1, 0x10, 0x7a, + 0xdf, 0xd4, 0xbe, 0x2a, + 0xcf, 0xfb, 0xce, 0x52, 0x6d, 0x88, 0x01, 0x3a, 0x3c, 0x98, 0xb0, 0xb8, + 0x1e, 0x92, 0x69, 0x55, + 0x8a, 0x93, 0xf3, 0x45, 0xfa, 0x47, 0x46, 0x96, 0x78, 0xfd, 0x43, 0xb1, + 0xea, 0x99, 0xdf, 0x08, + 0x71, 0x3d, 0x38, 0xfb, 0x79, 0xf2, 0x26, 0xab, 0x1e, 0x0b, 0x91, 0x37, + 0x99, 0x6e, 0xa2, 0x7a, + 0xdf, 0xec, 0xbc, 0xaf, 0xcd, 0x7e, 0x06, 0x0e, 0x7e, 0x7a, 0x98, 0xea, + 0xa4, 0x03, 0x6a, 0xb4, + 0x33, 0x71, 0x32, 0xad, 0xf0, 0x9c, 0xaf, 0x43, 0xca, 0x7f, 0x90, 0x91, + 0x25, 0x5f, 0xff, 0x44, + 0xbd, 0x1e, 0xae, 0xf7, 0x4d, 0xf8, 0x8d, 0x36, 0x9b, 0xca, 0x9a, 0x8f, + 0xe4, 0xcb, 0x9b, 0x80, + 0xbe, 0x84, 0xf7, 0x9b, 0xb0, 0xf3, 0xd5, 0x3c, 0xd7, 0xd2, 0x47, 0x1b, + 0x1d, 0xae, 0x7f, 0x36, + 0x0f, 0xe6, 0x38, 0xd7, 0x5c, 0xf1, 0x5c, 0xb2, 0x4e, 0x5d, 0xb2, 0x1e, + 0x81, 0x69, 0x95, 0xc3, + 0xcd, 0xe5, 0x44, 0x71, 0xbe, 0xa8, 0xfe, 0x8f, 0x8c, 0x2c, 0xf1, 0xfa, + 0xc7, 0x99, 0x56, 0xca, + 0x7a, 0xbd, 0x81, 0x24, 0xae, 0xd7, 0x03, 0xb6, 0xd5, 0x2a, 0x6f, 0x62, + 0x9f, 0x0b, 0x43, 0xfb, + 0x4d, 0xac, 0xde, 0x37, 0xc8, 0xfb, 0xc2, 0xdc, 0xcb, 0xd4, 0x30, 0xd5, + 0xb5, 0x39, 0xf8, 0x5e, + 0x9e, 0x8b, 0x88, 0x35, 0xe6, 0x81, 0x69, 0x35, 0xe3, 0xf5, 0xd4, 0xc6, + 0x75, 0xe3, 0x7a, 0x22, + 0xd6, 0x99, 0x57, 0xc6, 0x12, 0xc5, 0xac, 0x39, 0xea, 0x7f, 0x23, 0x23, + 0x4b, 0xb4, 0xfe, 0x61, + 0x99, 0x56, 0x98, 0xb8, 0xde, 0x51, 0xaa, 0x9b, 0x3f, 0xa9, 0xd4, 0xaa, + 0xec, 0xfc, 0x17, 0xd4, + 0x6f, 0x02, 0x5a, 0x96, 0x19, 0xb0, 0x33, 0xdd, 0xd1, 0x8a, 0x79, 0x0a, + 0x39, 0x10, 0xe7, 0x6c, + 0x76, 0xa4, 0x75, 0xd7, 0x78, 0x2e, 0xe0, 0x5f, 0xb3, 0xbf, 0x43, 0x8f, + 0x86, 0x94, 0xe7, 0x62, + 0xc7, 0xf5, 0xee, 0x94, 0xf7, 0x54, 0x71, 0xbd, 0x0c, 0xd4, 0x30, 0xa2, + 0x39, 0x5f, 0xc4, 0x3f, + 0x20, 0x23, 0x4b, 0xb4, 0xfe, 0x59, 0x4c, 0xab, 0xfc, 0x20, 0xa6, 0xb9, + 0x6a, 0xc7, 0xc2, 0x57, + 0x95, 0xe5, 0x4d, 0x4a, 0xa7, 0xb9, 0xba, 0x3e, 0xcf, 0xb4, 0xf4, 0x25, + 0xd3, 0xbf, 0xa1, 0xd6, + 0x95, 0xf4, 0xfe, 0x8a, 0x1a, 0x6d, 0xe0, 0xe0, 0x9f, 0x6e, 0x1f, 0xa8, + 0x78, 0x2e, 0x22, 0xae, + 0x57, 0x6c, 0xa3, 0x98, 0x56, 0x3c, 0xd6, 0x89, 0xe5, 0x7c, 0x11, 0xff, + 0x8a, 0x8c, 0x2c, 0xd9, + 0xfa, 0x87, 0x64, 0x5a, 0x4d, 0x91, 0xbd, 0x6f, 0xeb, 0x9c, 0x16, 0x97, + 0x96, 0xed, 0x1c, 0x70, + 0xfe, 0xbd, 0x1d, 0xef, 0x5b, 0xea, 0x4d, 0x65, 0xef, 0x5b, 0x3f, 0xc3, + 0xe3, 0x7a, 0xc5, 0xe5, + 0x66, 0x5d, 0xc6, 0x73, 0xe1, 0x1c, 0xfc, 0x59, 0xa9, 0x81, 0x8a, 0xeb, + 0x9d, 0x55, 0x0f, 0xca, + 0x68, 0xce, 0x17, 0xf1, 0x4f, 0xc9, 0xc8, 0x12, 0xad, 0x7f, 0x16, 0xab, + 0x3e, 0xae, 0xb9, 0x6a, + 0xe1, 0x9c, 0x16, 0xcd, 0x48, 0xf5, 0x53, 0xdd, 0xf4, 0x24, 0xd3, 0xce, + 0x59, 0x33, 0x2f, 0x21, + 0x07, 0x12, 0xae, 0x7f, 0x22, 0xae, 0x97, 0x82, 0xf7, 0x17, 0xc2, 0x73, + 0x81, 0xbc, 0x09, 0x9c, + 0x4f, 0x75, 0x19, 0xcf, 0xc5, 0x7a, 0x7d, 0xe8, 0x7d, 0x63, 0xfa, 0x8c, + 0xe3, 0xf7, 0x13, 0xff, + 0x99, 0x8c, 0x2c, 0xd9, 0xfa, 0x37, 0x0c, 0x61, 0xd5, 0xbb, 0xeb, 0x41, + 0x02, 0xf8, 0xcb, 0x41, + 0x35, 0x28, 0x56, 0xef, 0x5b, 0xf8, 0x99, 0x6e, 0x90, 0xe9, 0x42, 0xef, + 0x9b, 0x36, 0x60, 0x7a, + 0xa6, 0xea, 0x7d, 0x93, 0xb0, 0xea, 0xfd, 0x1c, 0xfc, 0xaa, 0x8a, 0xe7, + 0x12, 0x39, 0xd6, 0x09, + 0x6b, 0x42, 0xf3, 0x3f, 0xc8, 0xc8, 0x92, 0xac, 0x7f, 0xda, 0xa4, 0x84, + 0x8a, 0xeb, 0x45, 0x9a, + 0xab, 0x86, 0xea, 0x7d, 0x13, 0xcc, 0x67, 0x75, 0xef, 0x9b, 0xba, 0x5e, + 0x0f, 0x62, 0x8d, 0x85, + 0xd3, 0xea, 0x41, 0x95, 0x69, 0x96, 0x74, 0x7e, 0x30, 0xe4, 0x4d, 0xd8, + 0xd7, 0x81, 0x3e, 0x23, + 0x38, 0x5f, 0x2d, 0xc1, 0xf9, 0xa2, 0xf9, 0xbf, 0x64, 0x64, 0x37, 0x5e, + 0xff, 0xd8, 0x19, 0x2a, + 0x88, 0xe7, 0x22, 0xea, 0x41, 0xf0, 0x71, 0x3d, 0xcc, 0x5c, 0x35, 0x0c, + 0xa7, 0x45, 0xf4, 0xbe, + 0x09, 0xe6, 0x33, 0xae, 0xf7, 0x4d, 0x1d, 0xd7, 0xcb, 0x41, 0x6f, 0xf2, + 0x3c, 0xd5, 0x90, 0xf2, + 0x5c, 0x20, 0x6f, 0x72, 0x52, 0xac, 0x71, 0xce, 0xd7, 0x48, 0x3e, 0x3f, + 0xd8, 0xbb, 0x26, 0xa4, + 0x7f, 0x64, 0x64, 0x37, 0x5e, 0xff, 0xe6, 0xd5, 0x46, 0xe5, 0x56, 0x79, + 0x8d, 0xe7, 0xb2, 0x8a, + 0xeb, 0xe9, 0xd7, 0x8c, 0xeb, 0xd9, 0x7e, 0xa3, 0xc5, 0x69, 0x51, 0xcd, + 0x72, 0xb3, 0x7a, 0xdf, + 0xf8, 0xdf, 0x15, 0x5f, 0x1b, 0x61, 0x2e, 0xa7, 0xaf, 0xf7, 0xcd, 0x3b, + 0x3f, 0x78, 0xd7, 0xcd, + 0xf9, 0x0a, 0x99, 0x1f, 0xec, 0x5d, 0x13, 0xd2, 0x3f, 0x32, 0xb2, 0x1b, + 0xaf, 0x7f, 0xb3, 0x4a, + 0x23, 0x88, 0xe7, 0x02, 0x75, 0xc9, 0x10, 0xd7, 0xab, 0xc6, 0x15, 0xd7, + 0x5b, 0xf1, 0x97, 0x43, + 0xcd, 0xcd, 0x3c, 0x8d, 0x87, 0x69, 0xa5, 0xe0, 0xf7, 0xdb, 0x79, 0x93, + 0xe3, 0xad, 0x43, 0xc8, + 0x1b, 0x7b, 0xf3, 0x26, 0xdb, 0xfb, 0x7e, 0x0e, 0xfe, 0x8a, 0xf3, 0x45, + 0xfa, 0x47, 0x46, 0x76, + 0xe3, 0xf5, 0x8f, 0xe9, 0x57, 0x30, 0xcf, 0xa5, 0xf2, 0x96, 0x6d, 0xf6, + 0xff, 0xcb, 0xa7, 0x9b, + 0x35, 0x29, 0xcf, 0xc5, 0x55, 0x0f, 0x12, 0x13, 0x7f, 0xd9, 0xe9, 0x7d, + 0xc3, 0xbc, 0x7b, 0xdc, + 0x5c, 0x4e, 0x5c, 0xef, 0x9b, 0xcd, 0xf9, 0x0a, 0x9b, 0x1f, 0x0c, 0x79, + 0x13, 0x88, 0x75, 0xee, + 0xcc, 0x81, 0xa3, 0x45, 0xf9, 0x0f, 0x32, 0xb2, 0x24, 0xe5, 0x3f, 0xbc, + 0x1c, 0xfc, 0xea, 0x5b, + 0xc4, 0x1c, 0x8c, 0xaa, 0x9c, 0xe7, 0xc2, 0xe3, 0x7a, 0x38, 0xa6, 0x15, + 0x8e, 0xd3, 0xb2, 0x61, + 0x64, 0xa0, 0xf7, 0x6d, 0xa8, 0xc8, 0x7b, 0x58, 0x16, 0x65, 0x2e, 0x67, + 0x26, 0xe2, 0x5c, 0xce, + 0xc0, 0xf9, 0xc1, 0xee, 0x7e, 0x13, 0xea, 0xff, 0x20, 0x23, 0x4b, 0x6a, + 0xfe, 0xd7, 0x48, 0x0d, + 0xb3, 0x6d, 0x88, 0xeb, 0x6d, 0x9f, 0x6f, 0xcb, 0x79, 0x2e, 0x90, 0x37, + 0x19, 0xe5, 0xdb, 0x10, + 0xd7, 0xdb, 0x88, 0xc3, 0x57, 0x35, 0x35, 0x83, 0xf7, 0x7e, 0x0c, 0x30, + 0xfa, 0x87, 0x9d, 0xcb, + 0x99, 0xbb, 0xee, 0x5c, 0xce, 0x15, 0x07, 0xff, 0x74, 0xe7, 0xc0, 0xd1, + 0x42, 0xe2, 0x5f, 0x91, + 0x91, 0x25, 0xb8, 0xfe, 0x45, 0xb3, 0xe2, 0x7a, 0x5a, 0x3b, 0x8c, 0xe7, + 0xb2, 0x75, 0x5a, 0xaa, + 0x41, 0x5c, 0x2f, 0xd3, 0x97, 0xf3, 0x5c, 0xb8, 0xaf, 0x7a, 0x02, 0xbe, + 0x6a, 0x0a, 0x35, 0xf7, + 0x52, 0x95, 0xf7, 0xb5, 0xe3, 0x8e, 0xf1, 0xce, 0xe5, 0x44, 0xd4, 0x30, + 0xb2, 0xb3, 0x24, 0xac, + 0x49, 0xe9, 0xb8, 0x78, 0x48, 0xfc, 0x03, 0x32, 0xb2, 0x04, 0xeb, 0x5f, + 0x10, 0xab, 0xde, 0xc7, + 0x73, 0xb1, 0x73, 0x05, 0x70, 0x2e, 0x84, 0x1e, 0x0b, 0x09, 0xcf, 0x85, + 0x9f, 0xa1, 0x80, 0xbf, + 0xbc, 0x3d, 0xd5, 0x70, 0x73, 0xdf, 0x7a, 0x08, 0xfd, 0x43, 0x33, 0xad, + 0x62, 0x9c, 0xcb, 0x69, + 0xbd, 0xa6, 0xf0, 0xa5, 0x29, 0xfe, 0x47, 0x46, 0x96, 0x58, 0xfd, 0x53, + 0xc5, 0xf5, 0x6c, 0x0e, + 0xfe, 0x59, 0xb9, 0x06, 0xfa, 0x27, 0x9d, 0x1f, 0x0c, 0x79, 0x93, 0x9e, + 0xe0, 0x2f, 0x17, 0x55, + 0xbe, 0x6a, 0x1f, 0xf4, 0x4f, 0x6f, 0xda, 0x75, 0x2f, 0xa1, 0xec, 0x67, + 0x9b, 0x69, 0xd5, 0xc7, + 0x30, 0xad, 0x0a, 0x48, 0xa6, 0x95, 0xaa, 0x86, 0xd1, 0xbd, 0x26, 0x94, + 0xff, 0x25, 0x23, 0x4b, + 0xac, 0xfe, 0x0d, 0xf3, 0xed, 0x5d, 0xc4, 0x5c, 0xb5, 0xf4, 0xa2, 0xc2, + 0xf3, 0x1a, 0xd9, 0x30, + 0x0e, 0xfe, 0x2c, 0xd7, 0x80, 0x58, 0x62, 0x61, 0xa4, 0xb5, 0x42, 0xfd, + 0x50, 0xab, 0xf7, 0xcd, + 0xfe, 0x1a, 0x60, 0x20, 0x00, 0x0f, 0x26, 0x3d, 0x4a, 0x75, 0x20, 0xe7, + 0xe2, 0xa9, 0x4b, 0x46, + 0xb3, 0xea, 0xf1, 0x4c, 0x2b, 0xe5, 0x5c, 0x4e, 0xcf, 0x9a, 0x90, 0xfe, + 0x91, 0x91, 0x25, 0x55, + 0xff, 0xb0, 0x4c, 0x2b, 0xde, 0xfb, 0x36, 0x77, 0x7a, 0xdf, 0x3c, 0x3c, + 0x17, 0x77, 0xde, 0x04, + 0xfe, 0xbe, 0x73, 0x5a, 0x94, 0xce, 0x0f, 0xe6, 0xaf, 0xe9, 0xea, 0x7d, + 0x13, 0x3f, 0xdb, 0x62, + 0xc1, 0x58, 0x1c, 0x7c, 0xab, 0x2e, 0xb9, 0xc9, 0xeb, 0x92, 0x57, 0xac, + 0x7a, 0x33, 0x3c, 0xae, + 0x57, 0x3d, 0xdc, 0x45, 0x32, 0xad, 0x54, 0x73, 0x39, 0xbd, 0x6b, 0x42, + 0xfa, 0x47, 0x46, 0x96, + 0x58, 0xfd, 0x83, 0x7a, 0x3d, 0x6c, 0xef, 0xdb, 0x34, 0xc8, 0x6f, 0x74, + 0x71, 0xf0, 0xcf, 0x76, + 0x82, 0xd8, 0x54, 0x35, 0x3f, 0x07, 0xdf, 0xdd, 0xfb, 0xc6, 0xff, 0xff, + 0x40, 0xf0, 0x60, 0x20, + 0x27, 0x0c, 0x3a, 0xe8, 0xe6, 0xb9, 0x94, 0x4e, 0x4a, 0x35, 0x88, 0xeb, + 0xf1, 0x73, 0x61, 0xc8, + 0x99, 0x32, 0x0a, 0xbf, 0x5f, 0xc5, 0xf9, 0xf2, 0xae, 0x09, 0xe9, 0x1f, + 0x19, 0x59, 0x52, 0xf5, + 0x0f, 0xcb, 0xb4, 0x42, 0xc5, 0xf5, 0x86, 0x50, 0x23, 0x53, 0xde, 0x2b, + 0x2c, 0x8a, 0x87, 0xb2, + 0xf9, 0xc1, 0x3c, 0x6f, 0x32, 0xd1, 0xdb, 0x81, 0xcc, 0x53, 0xe6, 0x9f, + 0x02, 0x07, 0xdf, 0x5f, + 0x97, 0x0c, 0x73, 0xd9, 0x77, 0xce, 0x5d, 0x33, 0x37, 0xd7, 0xd9, 0xcf, + 0x76, 0x5c, 0x0f, 0xc1, + 0xb4, 0xaa, 0x46, 0xe4, 0x7c, 0x91, 0xfe, 0x91, 0x91, 0x25, 0x55, 0xff, + 0x44, 0xbd, 0x5e, 0x26, + 0xee, 0xb9, 0x6a, 0xf2, 0xf9, 0xc1, 0xb7, 0x2b, 0x6f, 0xd9, 0x3c, 0xce, + 0x35, 0x72, 0x73, 0x9e, + 0x33, 0x91, 0xe6, 0x3d, 0x04, 0x3b, 0xba, 0xd0, 0x2c, 0x9e, 0x55, 0x56, + 0x67, 0xca, 0x20, 0x9e, + 0x0b, 0xd7, 0x42, 0xad, 0x1b, 0x1b, 0xbf, 0x7f, 0x6d, 0x4d, 0x48, 0xff, + 0xc8, 0xc8, 0x92, 0xaa, + 0x7f, 0x91, 0x98, 0x56, 0x03, 0x4c, 0xef, 0xdb, 0x3a, 0xa7, 0xc5, 0xcf, + 0xc1, 0x2f, 0x9d, 0xe7, + 0xea, 0x3c, 0xd6, 0x77, 0x9c, 0x6b, 0xea, 0xf3, 0x6c, 0x4b, 0x15, 0xd7, + 0xab, 0x9e, 0xe4, 0x6a, + 0xb9, 0x69, 0x21, 0x98, 0xe7, 0x62, 0x71, 0xf0, 0xa1, 0x46, 0x50, 0xd5, + 0x9b, 0x7c, 0x35, 0xce, + 0x17, 0xe9, 0x1f, 0x19, 0x59, 0x42, 0xf5, 0x2f, 0x24, 0xae, 0xe7, 0xad, + 0x41, 0xa9, 0xe2, 0xe7, + 0xaa, 0x85, 0xf9, 0xd2, 0xd0, 0x6f, 0xd2, 0xc9, 0xb3, 0xf3, 0x9f, 0xbe, + 0xd0, 0x5b, 0x76, 0xde, + 0x23, 0xec, 0x67, 0x8a, 0x19, 0x94, 0x1b, 0x0d, 0x6f, 0xac, 0xd1, 0xc7, + 0x73, 0x61, 0xfe, 0x31, + 0xe8, 0xea, 0xd6, 0xc9, 0xa6, 0x94, 0xe7, 0x22, 0xde, 0xdf, 0x55, 0x38, + 0x5f, 0xa4, 0x7f, 0x64, + 0x64, 0xc9, 0xd4, 0x3f, 0x27, 0xae, 0x87, 0x60, 0x5a, 0x21, 0xe6, 0xaa, + 0xa1, 0x7a, 0xdf, 0x36, + 0x8c, 0xc2, 0x49, 0xae, 0x01, 0xbd, 0x6f, 0x1a, 0x70, 0xf0, 0xc7, 0x99, + 0xb0, 0x33, 0xa5, 0xcd, + 0xaa, 0x6f, 0x06, 0xf8, 0xe4, 0xdd, 0x55, 0x8d, 0x76, 0x79, 0x8d, 0x83, + 0xef, 0xe7, 0xb9, 0x5c, + 0x3d, 0xd6, 0x49, 0xfa, 0x47, 0x46, 0x96, 0x48, 0xfd, 0x8b, 0xce, 0xb4, + 0x52, 0xcf, 0x55, 0x43, + 0x70, 0x5a, 0x36, 0x4f, 0x73, 0x8d, 0x54, 0x1f, 0xd3, 0xfb, 0x86, 0x63, + 0xd5, 0xf3, 0x1a, 0x99, + 0xdb, 0x3b, 0x7b, 0xc1, 0x3c, 0x97, 0x55, 0xde, 0x24, 0x0a, 0xbf, 0x7f, + 0x15, 0xeb, 0x24, 0xfd, + 0x23, 0x23, 0xbb, 0xf1, 0xfa, 0xc7, 0x74, 0x67, 0x2d, 0x6f, 0x8a, 0x65, + 0xd5, 0x23, 0x99, 0x56, + 0xc0, 0x9f, 0xc7, 0x70, 0x5a, 0x8a, 0x67, 0xb9, 0x3a, 0xaa, 0xf7, 0x97, + 0xbd, 0x3f, 0x31, 0x83, + 0x52, 0xc5, 0xb4, 0x2a, 0xb6, 0xec, 0xde, 0x37, 0x19, 0xcf, 0x05, 0xb4, + 0x70, 0xeb, 0xa2, 0xba, + 0x5f, 0x3e, 0x29, 0xd4, 0xa4, 0xf3, 0x83, 0x03, 0xd7, 0x84, 0xf4, 0x8f, + 0x8c, 0xec, 0xc6, 0xeb, + 0xdf, 0xac, 0xdc, 0xf4, 0xf0, 0x5c, 0xa0, 0x2e, 0x19, 0xc9, 0xaa, 0xe7, + 0x4c, 0x2b, 0x25, 0x7f, + 0x19, 0xcb, 0x69, 0xd1, 0x3b, 0x30, 0xff, 0x57, 0xc3, 0xf4, 0xfe, 0xf6, + 0x91, 0x73, 0x39, 0x83, + 0xe3, 0x7a, 0xab, 0x1a, 0x6d, 0x7f, 0xde, 0xe4, 0x96, 0x64, 0x7e, 0xb0, + 0x88, 0x75, 0x76, 0x2a, + 0x9e, 0x58, 0x27, 0xe9, 0x1f, 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0xc5, 0x6e, + 0x63, 0x55, 0x97, 0x6c, + 0x71, 0xf0, 0x67, 0xf9, 0x46, 0xf5, 0xd6, 0xce, 0x9e, 0x4a, 0xff, 0x70, + 0xfc, 0xe5, 0x14, 0x76, + 0xae, 0x5a, 0xab, 0x74, 0xa2, 0x37, 0x54, 0xbe, 0xb4, 0xd0, 0xca, 0x9c, + 0x35, 0x83, 0x12, 0x53, + 0xaf, 0x17, 0xd6, 0xfb, 0xa6, 0x19, 0xe9, 0x91, 0xde, 0x86, 0x1c, 0xf1, + 0x0e, 0xc4, 0x0a, 0x65, + 0xf3, 0x83, 0x21, 0x6f, 0x62, 0xd5, 0x30, 0xae, 0xde, 0x1f, 0xe9, 0x1f, + 0x19, 0xd9, 0x8d, 0xd7, + 0x3f, 0x76, 0xee, 0xf2, 0xf3, 0x5c, 0x40, 0x5b, 0x76, 0xd9, 0x5e, 0x0f, + 0xe1, 0xb9, 0x88, 0xb8, + 0xde, 0x49, 0x7c, 0xfc, 0x65, 0xe0, 0xb4, 0x94, 0x8e, 0x33, 0x0d, 0xd4, + 0xfb, 0x8e, 0x93, 0x69, + 0xc5, 0x7e, 0x06, 0xd4, 0x30, 0xe6, 0x47, 0xa9, 0x96, 0x93, 0x37, 0x59, + 0x9b, 0x1f, 0xbc, 0xbd, + 0x0f, 0xcc, 0x2b, 0x88, 0x75, 0xae, 0xf2, 0x26, 0xa4, 0x7f, 0x64, 0x64, + 0x89, 0xc9, 0x7f, 0x78, + 0xea, 0x92, 0x2b, 0x7b, 0xa1, 0x3c, 0x17, 0x4b, 0x77, 0x80, 0x69, 0xb5, + 0x33, 0x55, 0xc4, 0xf5, + 0xd0, 0x9c, 0x96, 0xed, 0x46, 0x69, 0x99, 0x46, 0xe9, 0x9f, 0x60, 0x5a, + 0xe1, 0xea, 0xf5, 0x30, + 0x4c, 0x2b, 0x3f, 0xbf, 0x5f, 0x63, 0xff, 0x16, 0xc4, 0xc1, 0x17, 0xfd, + 0x26, 0xd6, 0xfc, 0xe0, + 0xfe, 0x65, 0x87, 0xf4, 0x8f, 0x8c, 0x2c, 0x79, 0xf9, 0xdf, 0xcc, 0x62, + 0xa7, 0x0e, 0x79, 0x03, + 0x29, 0xcf, 0xc5, 0xe2, 0xe0, 0x17, 0x2f, 0x76, 0x0f, 0x62, 0xe3, 0x2f, + 0x2f, 0xcb, 0xf5, 0xd2, + 0x22, 0xd5, 0xc4, 0xbc, 0x6b, 0x74, 0xbd, 0x1e, 0x8a, 0x69, 0x95, 0x0d, + 0xed, 0x7d, 0x73, 0xf2, + 0x26, 0xfe, 0x7e, 0x93, 0x39, 0xf1, 0x9f, 0xc9, 0xc8, 0x92, 0xa9, 0x7f, + 0x8e, 0xdf, 0x28, 0x72, + 0x05, 0xd3, 0x75, 0x9e, 0x0b, 0xf4, 0x58, 0x70, 0x16, 0xf2, 0x5c, 0xaf, + 0xcb, 0x78, 0x2e, 0xdc, + 0x78, 0xef, 0x1b, 0xc6, 0x57, 0xad, 0x1e, 0x96, 0xe6, 0x1a, 0x4a, 0xff, + 0x38, 0xd3, 0x0a, 0x3b, + 0x97, 0x53, 0xcd, 0xb4, 0xea, 0xec, 0x22, 0xe6, 0x72, 0xa6, 0x97, 0x15, + 0x9e, 0xeb, 0x71, 0xe6, + 0x07, 0x93, 0xfe, 0x91, 0x91, 0x25, 0x52, 0xff, 0x82, 0x59, 0xf5, 0x2e, + 0x9e, 0x4b, 0x10, 0x07, + 0x3f, 0x60, 0x7e, 0xf0, 0xca, 0x57, 0xc5, 0xf1, 0x97, 0x37, 0xa7, 0x5a, + 0x0b, 0xf3, 0xae, 0x51, + 0x71, 0xbd, 0x55, 0x0d, 0x23, 0xa2, 0x46, 0x46, 0xed, 0x4b, 0xf3, 0x35, + 0x71, 0x7a, 0xdf, 0xd8, + 0x5a, 0x1c, 0x5d, 0x76, 0x49, 0xff, 0xc8, 0xc8, 0x12, 0xa7, 0x7f, 0x16, + 0xab, 0x3e, 0xc4, 0x6f, + 0x04, 0x0e, 0x3e, 0xf3, 0x09, 0x2b, 0xb7, 0xab, 0x6f, 0xd9, 0xb9, 0xb0, + 0x62, 0x85, 0x41, 0x3c, + 0x97, 0x7e, 0xaa, 0x93, 0x9a, 0x6f, 0xe3, 0x66, 0x94, 0x33, 0x5f, 0xb5, + 0xe0, 0xeb, 0x37, 0xb1, + 0xce, 0x64, 0x46, 0x90, 0x56, 0xaa, 0xe3, 0x7a, 0x01, 0xfc, 0xfe, 0xa0, + 0x53, 0x22, 0xae, 0x86, + 0x31, 0x60, 0x4d, 0x28, 0xff, 0x41, 0x46, 0x96, 0x3c, 0xfd, 0xc3, 0xb2, + 0xea, 0x75, 0xde, 0xfb, + 0x06, 0x1a, 0x27, 0xe3, 0xb9, 0x40, 0xde, 0x64, 0xf3, 0x74, 0xa7, 0x56, + 0x3d, 0xcd, 0xd7, 0xa4, + 0x75, 0xc5, 0x96, 0x9e, 0x82, 0xaf, 0x9a, 0xf3, 0x9d, 0xd5, 0x80, 0x81, + 0x90, 0x19, 0xa7, 0x3b, + 0x2e, 0x1e, 0x0c, 0xff, 0xfe, 0xe8, 0xac, 0xfa, 0x90, 0x58, 0x62, 0x84, + 0xde, 0x37, 0x6f, 0xac, + 0x93, 0xf4, 0x8f, 0x8c, 0x2c, 0x71, 0xfa, 0x17, 0x9d, 0x69, 0x65, 0xac, + 0x72, 0x05, 0x5e, 0x9e, + 0x8b, 0x27, 0x6f, 0x7a, 0x26, 0x99, 0x1f, 0xec, 0xf2, 0x55, 0xb3, 0xbe, + 0xb9, 0x97, 0x6e, 0xf6, + 0x33, 0x70, 0xf0, 0x45, 0x5d, 0x72, 0xba, 0x8d, 0xab, 0x27, 0x14, 0x73, + 0x39, 0xb5, 0x38, 0xe6, + 0x72, 0x06, 0xae, 0x09, 0xe9, 0x1f, 0x19, 0x59, 0xe2, 0xf4, 0x0f, 0xcb, + 0xb4, 0x9a, 0x6c, 0x41, + 0x5c, 0x4f, 0xe6, 0x37, 0x3a, 0x79, 0x93, 0x2d, 0x76, 0x6e, 0x0a, 0x9d, + 0x1f, 0x0c, 0x79, 0x13, + 0xcb, 0x57, 0xf5, 0x9f, 0xd5, 0x80, 0x81, 0x90, 0x75, 0xf1, 0x60, 0x76, + 0x2d, 0xff, 0x1a, 0xb4, + 0xb2, 0x38, 0xcb, 0x36, 0x64, 0x3c, 0x17, 0xfe, 0xfe, 0x22, 0xc4, 0xf5, + 0xae, 0xc6, 0xf9, 0x22, + 0xfd, 0x23, 0x23, 0x4b, 0x9c, 0xfe, 0xd9, 0xf5, 0x7a, 0xea, 0xde, 0x37, + 0x4c, 0x5c, 0xcf, 0x84, + 0x1a, 0x99, 0xad, 0x45, 0xb6, 0xa1, 0xca, 0x9b, 0x80, 0xbf, 0x1c, 0xec, + 0xab, 0x6a, 0x86, 0xcd, + 0xc1, 0xf7, 0xd6, 0x25, 0x57, 0x5c, 0x3c, 0x97, 0xac, 0x87, 0xe7, 0x12, + 0x3d, 0xae, 0xa7, 0x29, + 0x39, 0x5f, 0xeb, 0x6b, 0x42, 0xfa, 0x47, 0x46, 0x96, 0x38, 0xfd, 0x43, + 0xd7, 0xeb, 0x55, 0xd0, + 0x73, 0xd5, 0x1c, 0x5f, 0x55, 0x32, 0x3f, 0x98, 0xf7, 0x9b, 0xb0, 0x2b, + 0x3f, 0x4b, 0xb7, 0x80, + 0x73, 0xaf, 0x1d, 0x69, 0x81, 0x79, 0x0f, 0x0d, 0x6a, 0xb4, 0xa7, 0x9b, + 0x4d, 0xde, 0x93, 0x11, + 0xc2, 0x73, 0x01, 0xff, 0x5a, 0xdd, 0xfb, 0x16, 0x21, 0xd6, 0x39, 0xc8, + 0x8b, 0x7e, 0x3b, 0xcf, + 0x9a, 0x90, 0xfe, 0x91, 0x91, 0x25, 0x4e, 0xff, 0x02, 0xe2, 0x7a, 0x81, + 0x7e, 0x23, 0x92, 0x69, + 0xc5, 0x6b, 0x50, 0x82, 0x7c, 0xe9, 0x80, 0x7e, 0x93, 0xd2, 0x59, 0xae, + 0xce, 0xd9, 0xcf, 0xcc, + 0xe7, 0xcd, 0x4c, 0xd2, 0x6d, 0x99, 0x16, 0x01, 0xab, 0x3e, 0x35, 0x48, + 0x4b, 0x79, 0x2e, 0x10, + 0x6b, 0x2c, 0x9c, 0x94, 0x6b, 0x95, 0x93, 0x5c, 0x2d, 0xd5, 0x0b, 0xcb, + 0xbb, 0x60, 0x63, 0x9d, + 0x41, 0x9c, 0x2f, 0xd2, 0x3f, 0x32, 0xb2, 0xa4, 0xe9, 0x9f, 0x8c, 0x55, + 0xbf, 0x5e, 0x83, 0xb2, + 0x5b, 0x53, 0x32, 0xad, 0x90, 0x9c, 0x96, 0x34, 0xd4, 0xc8, 0x5c, 0x94, + 0xf6, 0x73, 0xf3, 0x6c, + 0x53, 0x77, 0xcd, 0xbc, 0x0c, 0x8e, 0x3b, 0xae, 0xb1, 0xea, 0x25, 0x3c, + 0x97, 0x5d, 0xde, 0xc3, + 0x2c, 0xe5, 0xb9, 0x44, 0x89, 0x75, 0x06, 0xae, 0x09, 0xe9, 0x1f, 0x19, + 0x59, 0xd2, 0xf4, 0x0f, + 0xc7, 0xb4, 0xda, 0x40, 0x32, 0xad, 0x04, 0xa7, 0x05, 0x55, 0x83, 0x72, + 0x92, 0x85, 0xd7, 0x34, + 0xc0, 0xc7, 0x4d, 0x8d, 0xd2, 0x9d, 0xcc, 0x5c, 0x0f, 0xfc, 0xd9, 0x5a, + 0x68, 0xef, 0xdb, 0x8a, + 0x83, 0x0f, 0xe7, 0xba, 0x6a, 0x18, 0xcf, 0x05, 0xf2, 0x26, 0x78, 0xce, + 0x57, 0x40, 0xac, 0x93, + 0xf4, 0x8f, 0x8c, 0x2c, 0x69, 0xfa, 0x67, 0xd5, 0x83, 0x44, 0x8b, 0xeb, + 0x49, 0x6b, 0x50, 0xae, + 0xc5, 0x69, 0x09, 0xfc, 0x1e, 0x1c, 0xab, 0x7e, 0x43, 0xd4, 0xeb, 0xcd, + 0xf5, 0x7a, 0x30, 0xcf, + 0xc5, 0xca, 0x9b, 0x4c, 0x72, 0x4d, 0xe0, 0x7c, 0xa5, 0x50, 0x9c, 0x2f, + 0x9d, 0xf4, 0x8f, 0x8c, + 0x2c, 0x69, 0xfa, 0xd7, 0xf3, 0xe6, 0x1a, 0x70, 0x71, 0xbd, 0x14, 0x9a, + 0x69, 0x85, 0x9e, 0xab, + 0x36, 0x57, 0xd4, 0xa0, 0xd8, 0x5a, 0x19, 0x61, 0x2e, 0xa7, 0xcd, 0xef, + 0xe7, 0x79, 0x93, 0x00, + 0x9e, 0x0b, 0xd4, 0x6f, 0x83, 0x8f, 0x1c, 0x32, 0x3f, 0x38, 0x64, 0x4d, + 0x48, 0xff, 0xc8, 0xc8, + 0x6e, 0xbc, 0xfe, 0x4d, 0xb6, 0x5a, 0xee, 0xba, 0x64, 0xce, 0xaa, 0x57, + 0xcd, 0x7d, 0x3b, 0xba, + 0x16, 0x7f, 0x79, 0xed, 0xac, 0x86, 0xe2, 0xb4, 0xb8, 0xb5, 0xf2, 0x1a, + 0x73, 0x39, 0xdd, 0x1c, + 0xfc, 0x95, 0x16, 0xca, 0xe6, 0x07, 0xbb, 0x38, 0x5f, 0x6b, 0xb1, 0x4e, + 0xd2, 0x3f, 0x32, 0xb2, + 0x1b, 0xaf, 0x7f, 0xc0, 0x7f, 0x76, 0xd5, 0x25, 0xf3, 0xb8, 0xde, 0x34, + 0xd5, 0x90, 0xf2, 0x5c, + 0x78, 0x5c, 0x4f, 0xc7, 0xd5, 0xc8, 0x2c, 0x62, 0xe4, 0xb4, 0xd8, 0x5a, + 0x79, 0x86, 0x63, 0x5a, + 0x21, 0x6a, 0x18, 0x8d, 0x2c, 0xe7, 0x7c, 0x95, 0xf6, 0xc3, 0xe6, 0x07, + 0x43, 0xde, 0x24, 0x98, + 0xf3, 0x45, 0xfa, 0x47, 0x46, 0x76, 0xe3, 0xf5, 0x6f, 0xb4, 0xd9, 0xf6, + 0xd4, 0x25, 0xb3, 0x3f, + 0xc3, 0x78, 0x2e, 0x31, 0xc4, 0xf5, 0xd6, 0x7c, 0x55, 0x14, 0xa7, 0xc5, + 0xad, 0x95, 0xc8, 0xb9, + 0x9c, 0x4a, 0xa6, 0xd5, 0xa2, 0x52, 0x17, 0xef, 0x4f, 0x36, 0x3f, 0x58, + 0xf4, 0x9b, 0x80, 0x2f, + 0x5d, 0x5a, 0xeb, 0x37, 0x21, 0xfd, 0x23, 0x23, 0x4b, 0x44, 0xfe, 0xc3, + 0x55, 0x97, 0xcc, 0x6b, + 0xe9, 0xee, 0xca, 0x79, 0x2e, 0xbc, 0xc7, 0x42, 0x30, 0xad, 0x10, 0x35, + 0x32, 0xf1, 0x71, 0x5a, + 0x22, 0x69, 0xe5, 0x75, 0xe6, 0x72, 0xba, 0xe7, 0x07, 0xaf, 0xf5, 0x9b, + 0x6c, 0xaf, 0xe6, 0x07, + 0x13, 0xff, 0x8a, 0x8c, 0x2c, 0x59, 0xf9, 0x5f, 0x4b, 0x8b, 0xf2, 0xd3, + 0x5c, 0x53, 0xc6, 0x73, + 0xe1, 0x1c, 0xfc, 0xc5, 0x56, 0xdd, 0x8a, 0xeb, 0x19, 0xa1, 0x35, 0x32, + 0x31, 0x72, 0x5a, 0xec, + 0xb8, 0x9e, 0x9f, 0x55, 0x1f, 0x78, 0x4a, 0x44, 0xcf, 0xe5, 0x0c, 0xe7, + 0xf7, 0x73, 0x0e, 0xfe, + 0xb4, 0xd0, 0xac, 0x04, 0xf5, 0x9b, 0xcc, 0x2e, 0x9b, 0xa4, 0x7f, 0x64, + 0x64, 0x09, 0xd2, 0x3f, + 0xab, 0xf7, 0xcd, 0xf6, 0x1b, 0xd9, 0xfe, 0x0f, 0xe4, 0xb9, 0x54, 0x6e, + 0x57, 0xf6, 0xe0, 0x7c, + 0xb5, 0x29, 0xe3, 0xb9, 0xb8, 0x6a, 0x64, 0x30, 0xfc, 0x65, 0x0c, 0xa7, + 0xc5, 0x8e, 0xeb, 0xa1, + 0x98, 0x56, 0x50, 0xc3, 0x78, 0x1a, 0xd3, 0x5c, 0x4e, 0x78, 0x4d, 0xb6, + 0x26, 0xc0, 0x6a, 0xf0, + 0xf4, 0x9b, 0x2c, 0x88, 0xff, 0x4c, 0x46, 0x96, 0x28, 0xfd, 0x93, 0xb3, + 0xea, 0x3d, 0x1c, 0x7c, + 0xc8, 0xad, 0x86, 0xf2, 0x5c, 0x22, 0xf8, 0xaa, 0x58, 0x4e, 0x8b, 0x47, + 0x2b, 0x7b, 0x31, 0x31, + 0xad, 0x6e, 0x61, 0x39, 0x5f, 0x9e, 0x35, 0x61, 0x6b, 0x91, 0xed, 0xe4, + 0x06, 0x34, 0xff, 0x88, + 0x8c, 0x2c, 0x49, 0xfa, 0x67, 0x31, 0xad, 0xf6, 0x55, 0xe7, 0x26, 0xa8, + 0x91, 0x29, 0x9f, 0x15, + 0x6b, 0xa1, 0x1c, 0xfc, 0x61, 0xa6, 0x8d, 0xa9, 0x91, 0x51, 0xf8, 0xaa, + 0xc6, 0x5a, 0x5c, 0x0f, + 0xcb, 0xaa, 0x8f, 0x6d, 0x2e, 0xa7, 0x6c, 0x4d, 0x28, 0xff, 0x41, 0x46, + 0x96, 0x24, 0xfd, 0x4b, + 0xcd, 0x76, 0x70, 0xf5, 0x7a, 0xa2, 0x06, 0xa5, 0x25, 0xe7, 0xb9, 0x40, + 0xde, 0x64, 0x6b, 0x1f, + 0xfc, 0xe4, 0xc2, 0x24, 0xd3, 0x94, 0xcd, 0x0f, 0x5e, 0xd5, 0xc8, 0x04, + 0xf7, 0x73, 0x00, 0x03, + 0x21, 0x35, 0x58, 0xb1, 0x9f, 0xb9, 0x56, 0x22, 0xde, 0x5f, 0xa4, 0xb9, + 0x9c, 0x2a, 0x5f, 0x5a, + 0xba, 0x26, 0xa4, 0x7f, 0x64, 0x64, 0x49, 0xd2, 0xbf, 0x0c, 0xa6, 0x5e, + 0x4f, 0xd6, 0xfb, 0xe6, + 0xe1, 0xb9, 0x54, 0x57, 0x33, 0x41, 0x42, 0xe6, 0x07, 0xab, 0x7c, 0x55, + 0xce, 0x3d, 0x3d, 0x06, + 0xf6, 0xb3, 0xe0, 0xe0, 0x67, 0x17, 0xdb, 0x76, 0x5c, 0xcf, 0x08, 0x3b, + 0x9f, 0x96, 0xb0, 0xbd, + 0xc9, 0xd7, 0xe2, 0x7c, 0x91, 0xfe, 0x91, 0x91, 0x25, 0x49, 0xff, 0x44, + 0x3d, 0x48, 0x46, 0xd9, + 0xfb, 0x26, 0x65, 0x5a, 0xd9, 0x0a, 0x04, 0x1c, 0x7c, 0xc8, 0x11, 0xdf, + 0x29, 0xef, 0xad, 0x62, + 0x85, 0xeb, 0xf3, 0x83, 0x21, 0x6f, 0x22, 0x7a, 0xdf, 0xb4, 0xc0, 0x7e, + 0x0e, 0x60, 0x20, 0xe4, + 0x5c, 0x3c, 0x18, 0x9e, 0x77, 0x61, 0xe7, 0x4a, 0x29, 0xcf, 0xc5, 0x8e, + 0xeb, 0x5d, 0x91, 0xdf, + 0x1f, 0x64, 0x30, 0x97, 0xb3, 0x7a, 0x1c, 0xe4, 0x4b, 0x93, 0xfe, 0x91, + 0x91, 0x25, 0x49, 0xff, + 0x44, 0xbd, 0x9e, 0x86, 0xad, 0xd7, 0x0b, 0xaf, 0x57, 0x99, 0x88, 0xb8, + 0x9e, 0xc3, 0xa6, 0x3a, + 0x0d, 0xec, 0xb1, 0x38, 0xe0, 0xbd, 0x6f, 0xf3, 0xb4, 0xac, 0xdf, 0xc4, + 0xd0, 0xfa, 0xa9, 0xae, + 0xcd, 0xc1, 0x77, 0x72, 0xd0, 0x5e, 0x9e, 0x4b, 0xd3, 0x53, 0x97, 0x1c, + 0x2d, 0xae, 0x77, 0x0d, + 0xce, 0x17, 0xe9, 0x1f, 0x19, 0x59, 0x82, 0xf4, 0xcf, 0xe0, 0xac, 0x7a, + 0x55, 0xbd, 0xde, 0x00, + 0x57, 0xaf, 0xb7, 0x1e, 0xd7, 0x93, 0xcc, 0x0f, 0x76, 0xf5, 0x9b, 0x64, + 0x47, 0x4c, 0xc7, 0x64, + 0x73, 0xe2, 0x98, 0xdf, 0x0d, 0xf5, 0x84, 0x3b, 0x67, 0xa5, 0x03, 0x29, + 0xcf, 0x05, 0x6a, 0xb4, + 0xd9, 0x6b, 0x54, 0x30, 0x4c, 0xab, 0xd9, 0x4e, 0x03, 0xc9, 0xf9, 0x12, + 0xb1, 0x4e, 0xd2, 0x3f, + 0x32, 0xb2, 0xe4, 0xea, 0x1f, 0x9e, 0x69, 0xd5, 0x06, 0xfe, 0x32, 0x6e, + 0xae, 0x9a, 0xc4, 0x97, + 0x76, 0xe5, 0x4d, 0xb8, 0x7f, 0x6c, 0x69, 0x61, 0xe9, 0x34, 0x57, 0xd7, + 0x97, 0x7a, 0x2b, 0x3b, + 0x65, 0xbe, 0xf1, 0x30, 0xd5, 0x0d, 0xd0, 0x22, 0xce, 0xaa, 0xd7, 0xec, + 0x58, 0xe3, 0xf1, 0xd6, + 0xe1, 0xce, 0x1a, 0x07, 0x7f, 0xeb, 0x00, 0x7a, 0xdf, 0xa0, 0x47, 0x23, + 0x6c, 0xe6, 0x26, 0x8f, + 0x75, 0x9e, 0xe8, 0xd7, 0xe0, 0x7c, 0x91, 0xfe, 0x91, 0x91, 0x25, 0x46, + 0xff, 0x10, 0x71, 0x3d, + 0x7e, 0x8a, 0x43, 0xd6, 0xa0, 0x44, 0xe1, 0xb4, 0x40, 0xed, 0x20, 0xe4, + 0x4d, 0x36, 0x4f, 0x72, + 0x0d, 0x67, 0xe6, 0xe5, 0xb1, 0x8f, 0xff, 0xcc, 0xb4, 0x28, 0x28, 0xae, + 0x27, 0x66, 0x6e, 0xfa, + 0x39, 0xf8, 0xbb, 0xa1, 0x3c, 0x17, 0x27, 0xd6, 0x79, 0x9c, 0x46, 0xc5, + 0x3a, 0x83, 0x7d, 0x69, + 0xd2, 0x3f, 0x32, 0xb2, 0xe4, 0xe8, 0x1f, 0x92, 0x69, 0x35, 0xdd, 0x8e, + 0x52, 0x23, 0x83, 0xe2, + 0xb4, 0xd8, 0xbe, 0x2a, 0xcc, 0x3d, 0x4a, 0x0d, 0xd3, 0x9d, 0xcc, 0x2c, + 0xdb, 0xd2, 0x4f, 0xd6, + 0xf5, 0x4f, 0xc1, 0xaa, 0xe7, 0x35, 0xda, 0xf9, 0xe3, 0xed, 0x43, 0xc8, + 0xbb, 0x84, 0xf1, 0x5c, + 0x20, 0x6f, 0x02, 0xb1, 0xce, 0x9d, 0xe9, 0xc6, 0x35, 0x62, 0x9d, 0xa4, + 0x7f, 0x64, 0x64, 0x89, + 0xd1, 0x3f, 0x1e, 0xd7, 0xab, 0x20, 0xe3, 0x7a, 0x48, 0xa6, 0xd5, 0xd5, + 0x39, 0x2d, 0x9c, 0x83, + 0xef, 0x3b, 0x8b, 0x19, 0x98, 0x7a, 0x3d, 0x6d, 0x2a, 0xea, 0xf5, 0xa4, + 0x3c, 0x17, 0x2b, 0x6f, + 0x02, 0xb1, 0xc4, 0xd2, 0x34, 0xd5, 0x94, 0xcd, 0x0f, 0x76, 0xd6, 0x04, + 0x6a, 0x64, 0x8e, 0x48, + 0xff, 0xc8, 0xc8, 0x12, 0xaa, 0x7f, 0xc6, 0x2a, 0xae, 0xb7, 0xad, 0x8c, + 0xeb, 0xc5, 0xca, 0xb4, + 0x42, 0x72, 0x5a, 0xc4, 0x59, 0x31, 0xdd, 0xc5, 0x30, 0xad, 0xd6, 0xea, + 0x09, 0x65, 0x3c, 0x17, + 0xc8, 0xbb, 0x38, 0x3c, 0x97, 0xf5, 0xf9, 0xc1, 0xea, 0x35, 0x21, 0xfd, + 0x23, 0x23, 0xbb, 0xf1, + 0xfa, 0xc7, 0xf6, 0x38, 0xd4, 0x25, 0xa7, 0xa7, 0xc5, 0x66, 0x9c, 0x71, + 0xbd, 0x38, 0x39, 0x2d, + 0xe2, 0x2c, 0x96, 0xe9, 0x5e, 0x77, 0x2e, 0xa7, 0x9b, 0x83, 0xef, 0x8f, + 0x15, 0xfa, 0xe7, 0x07, + 0xf3, 0xd7, 0x19, 0x97, 0x42, 0xfa, 0x01, 0x49, 0xff, 0xc8, 0xc8, 0x6e, + 0xbc, 0xfe, 0xcd, 0x77, + 0x1b, 0xa2, 0x2e, 0x79, 0x7b, 0x1f, 0xf6, 0x7a, 0x50, 0xae, 0xc0, 0x13, + 0xd7, 0x43, 0x31, 0xad, + 0x60, 0xae, 0x1a, 0x92, 0xd3, 0xa2, 0xae, 0x41, 0x11, 0x36, 0xca, 0x76, + 0xd0, 0x4c, 0x2b, 0xe4, + 0x5c, 0xce, 0xc2, 0x2c, 0xdf, 0x90, 0xcd, 0x0f, 0xe6, 0x79, 0x93, 0xf9, + 0x56, 0x43, 0xce, 0xf9, + 0x22, 0xfd, 0x23, 0x23, 0xbb, 0xf1, 0xfa, 0x37, 0xdd, 0x69, 0x06, 0xd5, + 0x25, 0xaf, 0xf1, 0x5c, + 0x22, 0xc7, 0xf5, 0x62, 0xe2, 0xb4, 0x38, 0x79, 0x67, 0xbd, 0xa3, 0x66, + 0x5a, 0x45, 0x9b, 0xcb, + 0x69, 0xf7, 0x15, 0x07, 0xcf, 0x0f, 0xae, 0x3a, 0x9c, 0xaf, 0xe0, 0x7e, + 0x13, 0xd2, 0x3f, 0x32, + 0xb2, 0x9b, 0x1f, 0xff, 0x13, 0x75, 0xc9, 0x9b, 0x67, 0x15, 0x5e, 0x37, + 0xe7, 0x9d, 0x99, 0x5b, + 0xf6, 0x72, 0xf0, 0x8f, 0x52, 0x1d, 0x79, 0x3d, 0x88, 0x2f, 0xae, 0x17, + 0x17, 0xa7, 0xc5, 0xd6, + 0xbf, 0x49, 0xae, 0xad, 0x66, 0x5a, 0x69, 0x38, 0xa6, 0x95, 0x94, 0xdf, + 0xef, 0xe5, 0xe0, 0x4b, + 0xfa, 0x4d, 0xac, 0xf9, 0xc1, 0x97, 0x06, 0xe9, 0x1f, 0x19, 0x59, 0x32, + 0xf2, 0xbf, 0xa0, 0x45, + 0xe5, 0x45, 0xa6, 0x2e, 0xe7, 0xb9, 0xb0, 0xfd, 0xbf, 0x2c, 0x70, 0xb6, + 0x41, 0x6e, 0xa8, 0xb5, + 0xc3, 0xf2, 0x24, 0xc8, 0xb8, 0x1e, 0x8e, 0xd3, 0x62, 0xfb, 0xca, 0xb3, + 0x5c, 0x3b, 0x3e, 0xa6, + 0x55, 0x49, 0xcd, 0xf9, 0xea, 0xa5, 0xf8, 0x2c, 0xbc, 0xca, 0x79, 0x69, + 0x7f, 0xbd, 0xdf, 0x64, + 0x9b, 0x9d, 0x31, 0x2f, 0x5b, 0xa4, 0x7f, 0x64, 0x64, 0x89, 0xd0, 0x3f, + 0x9b, 0x55, 0xdf, 0x72, + 0xd5, 0x9b, 0xac, 0xf3, 0x5c, 0xee, 0x8a, 0x0b, 0x7a, 0x2c, 0x64, 0x3c, + 0x17, 0x27, 0xae, 0xa7, + 0x9c, 0x51, 0x8e, 0xe4, 0xb4, 0xd8, 0x75, 0x37, 0xf3, 0x5c, 0x4b, 0xcd, + 0xb4, 0x12, 0x71, 0xbd, + 0x4c, 0x3c, 0x73, 0x39, 0xf9, 0xdc, 0x4b, 0x58, 0x13, 0xce, 0xc1, 0xf7, + 0xcf, 0x0f, 0x26, 0xfe, + 0x33, 0x19, 0x59, 0x42, 0xf4, 0x2f, 0x9c, 0x55, 0xbf, 0xe2, 0xe0, 0x6f, + 0xd7, 0x20, 0x2e, 0x16, + 0xc6, 0x73, 0x01, 0x2d, 0xcc, 0x44, 0x98, 0x51, 0xae, 0xf4, 0x55, 0x2d, + 0x7d, 0xce, 0x2c, 0x72, + 0xad, 0xd8, 0x98, 0x56, 0x11, 0x6a, 0x18, 0xfd, 0xbd, 0x6f, 0xce, 0xfc, + 0x60, 0x3a, 0xff, 0x91, + 0x91, 0x25, 0x43, 0xff, 0x22, 0xd6, 0xeb, 0xd9, 0x1c, 0x7c, 0x59, 0xde, + 0x04, 0x7c, 0xe9, 0xca, + 0x32, 0x8d, 0xea, 0x7d, 0x53, 0xc6, 0x12, 0x2d, 0x2d, 0xd2, 0x97, 0xb9, + 0x66, 0x61, 0x14, 0x17, + 0xd3, 0x2a, 0x8e, 0x1a, 0x46, 0xca, 0x7f, 0x90, 0x91, 0x25, 0x42, 0xff, + 0x90, 0x33, 0x28, 0xbd, + 0x71, 0x3d, 0x09, 0xcf, 0x85, 0xcf, 0x4a, 0xdb, 0xdd, 0x2b, 0x9f, 0x15, + 0x0f, 0xf2, 0x13, 0xc9, + 0xfc, 0x60, 0xab, 0x46, 0x46, 0xd5, 0xcf, 0x01, 0x0c, 0x04, 0xe8, 0x89, + 0xdb, 0x60, 0x97, 0x7e, + 0x9c, 0x6b, 0x2a, 0xeb, 0x09, 0xd1, 0x4c, 0xab, 0x38, 0x38, 0x5f, 0xa4, + 0x7f, 0x64, 0x64, 0x89, + 0xd0, 0x3f, 0xe4, 0x0c, 0xca, 0xb4, 0x2c, 0xae, 0xe7, 0xe1, 0xe0, 0x97, + 0xf7, 0xab, 0xaa, 0xf9, + 0xc1, 0xdc, 0x57, 0xcd, 0x2b, 0x7d, 0x55, 0x60, 0x20, 0xe8, 0x0b, 0x1d, + 0xd8, 0xcf, 0x6d, 0x38, + 0xff, 0xe9, 0x03, 0xad, 0x1d, 0x76, 0xb6, 0xb3, 0x98, 0x56, 0xca, 0xbc, + 0x4b, 0x3c, 0x73, 0x39, + 0x49, 0xff, 0xc8, 0xc8, 0x12, 0xa1, 0x7f, 0x91, 0x98, 0x56, 0x8a, 0x1a, + 0x94, 0x7e, 0xa6, 0x03, + 0x71, 0xbd, 0xad, 0x93, 0x52, 0x4d, 0x3a, 0x3f, 0x18, 0xf2, 0x26, 0x63, + 0xc7, 0x57, 0x95, 0x9a, + 0x9b, 0xfd, 0x0c, 0x57, 0x18, 0xcf, 0x85, 0xeb, 0xf3, 0x12, 0xcf, 0xb4, + 0x2a, 0x5e, 0x9b, 0xf3, + 0x45, 0xfa, 0x47, 0x46, 0x96, 0x04, 0xfd, 0x8b, 0xc4, 0xb4, 0x5a, 0x2a, + 0x7a, 0xdf, 0x7a, 0x29, + 0xce, 0x69, 0x01, 0x5f, 0x5a, 0xb0, 0xa9, 0xd6, 0xe7, 0x07, 0xdb, 0x79, + 0x13, 0x78, 0xcd, 0xb0, + 0x7e, 0x13, 0xe8, 0x57, 0x4b, 0x8d, 0xd2, 0x1d, 0x9b, 0x83, 0x1f, 0xc6, + 0x73, 0x11, 0x71, 0x3d, + 0x19, 0xab, 0xde, 0xed, 0xd7, 0x5a, 0x9c, 0xaf, 0x6b, 0xcf, 0xe5, 0x24, + 0xfd, 0x23, 0x23, 0x4b, + 0x84, 0xfe, 0x45, 0x60, 0x5a, 0x6d, 0x4f, 0xd5, 0xbd, 0x6f, 0x01, 0x71, + 0x3d, 0x43, 0xc5, 0xc1, + 0x87, 0xbc, 0x49, 0xba, 0xef, 0xcc, 0x7a, 0xf3, 0xe5, 0x35, 0xb2, 0x9d, + 0xdc, 0x32, 0xdb, 0x0a, + 0xe3, 0xb9, 0x00, 0x07, 0x3f, 0x07, 0x4c, 0xab, 0x79, 0x2a, 0x16, 0x7e, + 0xbf, 0x7a, 0x4d, 0x48, + 0xff, 0xc8, 0xc8, 0x92, 0xa0, 0x7f, 0x61, 0x33, 0x28, 0xdd, 0x39, 0xd8, + 0x92, 0xc5, 0x5f, 0x56, + 0xd7, 0xa0, 0x84, 0x71, 0x5a, 0x44, 0xde, 0xa4, 0x70, 0x5a, 0xa9, 0x79, + 0x38, 0x7d, 0x4c, 0xcb, + 0x8a, 0x27, 0x7a, 0x23, 0x3b, 0xcb, 0xb4, 0xd2, 0x43, 0x87, 0x83, 0x6f, + 0x9d, 0xc5, 0xf4, 0x4e, + 0x6e, 0x9e, 0x6e, 0x59, 0xe7, 0xcb, 0x60, 0x9e, 0x0b, 0xfb, 0x7e, 0x38, + 0xd7, 0xed, 0x9c, 0x6c, + 0xd6, 0xa4, 0x3c, 0x17, 0xfe, 0xfe, 0xae, 0xca, 0xef, 0x27, 0xfd, 0x23, + 0x23, 0x4b, 0xa2, 0xfe, + 0xf1, 0xb8, 0xde, 0x71, 0x4c, 0xf5, 0x7a, 0xc8, 0x1a, 0x94, 0xcc, 0x12, + 0x7c, 0xd5, 0xec, 0x61, + 0x7a, 0xa4, 0xb7, 0xed, 0x7e, 0x93, 0xd2, 0x79, 0xae, 0xce, 0xe3, 0x7d, + 0x90, 0xf7, 0x58, 0xea, + 0xad, 0x55, 0x5e, 0x57, 0x6f, 0xe7, 0x66, 0xa9, 0x76, 0x90, 0x7f, 0xec, + 0x70, 0xf0, 0x6f, 0x55, + 0xf6, 0xec, 0xfa, 0x6c, 0x29, 0xcf, 0x25, 0x42, 0xac, 0x33, 0xab, 0x5c, + 0x13, 0xd2, 0x3f, 0x32, + 0xb2, 0x24, 0xe8, 0x5f, 0x14, 0x56, 0xbd, 0x3e, 0x88, 0x87, 0x69, 0xb5, + 0xc6, 0x69, 0x61, 0x5a, + 0x06, 0xe7, 0xbe, 0xf4, 0x34, 0xdb, 0x86, 0x5a, 0x17, 0xd0, 0x41, 0x27, + 0xaf, 0x3b, 0xcd, 0xb5, + 0x73, 0x53, 0x2d, 0x54, 0x77, 0xb5, 0x81, 0xde, 0x86, 0xf3, 0xdf, 0xd6, + 0xd9, 0x96, 0x9c, 0xe7, + 0x02, 0xb1, 0xc6, 0x49, 0x5c, 0x9c, 0x2f, 0xd2, 0x3f, 0x32, 0xb2, 0x04, + 0xe8, 0x5f, 0x04, 0x56, + 0x7d, 0x55, 0xc9, 0x5f, 0x4e, 0xcd, 0x77, 0x1a, 0xd7, 0xe6, 0xb4, 0x58, + 0x1c, 0xfc, 0x55, 0xdd, + 0x4d, 0xae, 0xa5, 0x8f, 0x15, 0x75, 0xd2, 0x16, 0x73, 0x90, 0xbd, 0xbf, + 0x8e, 0x9c, 0xe7, 0x52, + 0xe6, 0xfa, 0x08, 0x35, 0x82, 0x9c, 0x61, 0xd0, 0x93, 0xde, 0x8b, 0x88, + 0x75, 0x86, 0xae, 0x09, + 0xe9, 0x1f, 0x19, 0x59, 0x12, 0xf4, 0x0f, 0x57, 0x0f, 0x92, 0xef, 0x5c, + 0x89, 0xbf, 0x2c, 0xa9, + 0x41, 0x01, 0x4e, 0x8b, 0x72, 0xd6, 0x9c, 0xa5, 0x45, 0xd0, 0xfb, 0x96, + 0x1d, 0x2a, 0xe6, 0x0d, + 0x5b, 0xfc, 0x7e, 0x2f, 0xab, 0xde, 0xcb, 0x73, 0xd9, 0x75, 0x6b, 0xa1, + 0x6c, 0x7e, 0xb0, 0x37, + 0xd6, 0xd9, 0x26, 0xfd, 0x23, 0x23, 0x4b, 0xb0, 0xfe, 0xf5, 0x33, 0x5d, + 0xd0, 0x3f, 0x65, 0x5c, + 0x0f, 0xc9, 0xaa, 0x0f, 0xe3, 0x2f, 0xfb, 0x7d, 0x69, 0x6c, 0xef, 0x5b, + 0x76, 0x99, 0x63, 0x1a, + 0xa5, 0xd0, 0x3f, 0x15, 0xbf, 0xdf, 0xca, 0x9b, 0x70, 0xce, 0x17, 0xd3, + 0x49, 0xe9, 0xfc, 0x60, + 0xc8, 0x9b, 0xa0, 0x66, 0xe1, 0x91, 0xfe, 0x91, 0x91, 0xdd, 0x78, 0xfd, + 0x9b, 0x55, 0x1a, 0xe0, + 0x37, 0x6e, 0x2d, 0xf3, 0x87, 0x32, 0x9e, 0x4b, 0xe4, 0xb8, 0x1e, 0x92, + 0xd3, 0xa2, 0xaa, 0x41, + 0xb1, 0xcf, 0x8a, 0x10, 0x0f, 0x4c, 0xf5, 0xc3, 0x75, 0x57, 0x9b, 0x94, + 0x5a, 0x4a, 0xa6, 0x95, + 0x29, 0x38, 0x5f, 0x95, 0x65, 0xf6, 0xd0, 0xce, 0x9b, 0x94, 0xd7, 0xe6, + 0x07, 0x6f, 0xef, 0x17, + 0xe7, 0xb9, 0xba, 0xcd, 0xf9, 0xda, 0xa0, 0xfa, 0x67, 0x32, 0xb2, 0x44, + 0xeb, 0x9f, 0x27, 0x57, + 0x10, 0xc0, 0x73, 0x71, 0xe2, 0x7a, 0x4a, 0x56, 0xbd, 0x86, 0xe7, 0x2f, + 0x23, 0x38, 0x2d, 0x76, + 0xde, 0x19, 0x6a, 0x9f, 0x99, 0x5f, 0x1b, 0xfa, 0xb5, 0x48, 0xa6, 0x95, + 0xcd, 0xef, 0x5f, 0xe5, + 0x96, 0x03, 0xe7, 0x07, 0x57, 0xf9, 0x7c, 0xa4, 0x9d, 0xd3, 0x52, 0x48, + 0xbf, 0x09, 0xe9, 0x1f, + 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0xd1, 0x66, 0x1b, 0xe2, 0x7a, 0xa5, 0xd3, + 0xed, 0x83, 0x30, 0x0e, + 0x3e, 0x9a, 0x69, 0x75, 0x0b, 0x5b, 0x23, 0x13, 0xc4, 0x5f, 0x0e, 0xf2, + 0x95, 0x99, 0xfe, 0xb1, + 0xf3, 0x9f, 0x16, 0x23, 0xd3, 0x4a, 0x12, 0xd7, 0xf3, 0xd4, 0x68, 0xef, + 0x2a, 0xe6, 0x07, 0x93, + 0xfe, 0x91, 0x91, 0x25, 0x43, 0xff, 0x44, 0x3d, 0x88, 0x9c, 0xe7, 0x02, + 0x1c, 0xfc, 0xd2, 0x79, + 0x65, 0xbf, 0x7c, 0x92, 0x3f, 0x4c, 0xcb, 0x78, 0x2e, 0x11, 0xe2, 0x7a, + 0x16, 0xa7, 0x65, 0x1f, + 0xf5, 0x1e, 0x07, 0xe9, 0x6e, 0x6e, 0xa9, 0x37, 0x37, 0x5e, 0x84, 0xb9, + 0x9c, 0xa1, 0xfd, 0x26, + 0xc3, 0xcb, 0x0e, 0xe9, 0x1f, 0x19, 0xd9, 0x0d, 0xd7, 0xbf, 0xc9, 0x56, + 0x6b, 0x2d, 0xae, 0xe7, + 0xe1, 0xb9, 0xac, 0x7a, 0x2c, 0x76, 0xad, 0x5c, 0x41, 0x20, 0xcf, 0x45, + 0xd4, 0xc8, 0x74, 0x31, + 0x33, 0xca, 0x05, 0xa7, 0x45, 0xed, 0xab, 0x8a, 0xbc, 0x06, 0x3b, 0x93, + 0x2d, 0x33, 0x4a, 0x46, + 0x34, 0xd4, 0xeb, 0x61, 0x99, 0x56, 0x91, 0xe6, 0x72, 0xca, 0xfa, 0x4d, + 0xe6, 0xc4, 0x7f, 0x26, + 0x23, 0xbb, 0xf1, 0xfa, 0x37, 0xdd, 0x69, 0x86, 0xf6, 0x79, 0x59, 0x33, + 0x73, 0xc1, 0x6f, 0xac, + 0xdc, 0x76, 0xb1, 0x9f, 0xef, 0xf8, 0x78, 0x2e, 0x90, 0x37, 0x19, 0xe4, + 0xda, 0x10, 0xd7, 0x53, + 0xf5, 0x56, 0x70, 0x4e, 0x8b, 0xd2, 0x57, 0x15, 0x3f, 0xc3, 0xd3, 0xfb, + 0x16, 0x16, 0xd7, 0x3b, + 0x8b, 0x83, 0x69, 0x65, 0xe9, 0xb3, 0x84, 0xf3, 0xe5, 0xe1, 0xe0, 0xcf, + 0x2e, 0x9b, 0xa4, 0x7f, + 0x64, 0x64, 0x09, 0xc8, 0x7f, 0xa8, 0x67, 0x50, 0x8a, 0x7a, 0xbd, 0x49, + 0xba, 0x19, 0xc6, 0x73, + 0x81, 0x7e, 0x33, 0xf0, 0x1b, 0x53, 0x47, 0xc1, 0x39, 0xe4, 0x95, 0xaf, + 0x5a, 0x3d, 0xac, 0x2e, + 0x33, 0xca, 0x1a, 0x41, 0xe1, 0x2b, 0x33, 0xfd, 0x0b, 0xe8, 0x7d, 0x0b, + 0x8c, 0xeb, 0xa9, 0x6b, + 0x18, 0xdb, 0xbb, 0x31, 0xcd, 0xe5, 0xd4, 0x7a, 0x34, 0xff, 0x8d, 0x8c, + 0xec, 0xc6, 0xeb, 0xdf, + 0xbc, 0xda, 0x50, 0x32, 0xad, 0xd6, 0xe3, 0x7a, 0x22, 0x57, 0x10, 0xc0, + 0xc1, 0xdf, 0x65, 0xe7, + 0x42, 0xf9, 0xfc, 0x60, 0x61, 0x28, 0xfe, 0x32, 0xd3, 0x3f, 0x60, 0x20, + 0xf0, 0xde, 0xb7, 0x49, + 0x78, 0xef, 0x5b, 0xa4, 0xb8, 0x1e, 0x7a, 0x2e, 0x67, 0xea, 0x50, 0xb9, + 0x76, 0xf4, 0x09, 0x22, + 0x23, 0xbb, 0xe1, 0xfa, 0xb7, 0xdb, 0xd8, 0x9e, 0x6a, 0x57, 0x61, 0x5a, + 0x39, 0x67, 0xaf, 0x55, + 0xde, 0xc4, 0x1b, 0x2b, 0xb4, 0x72, 0x05, 0xab, 0xf9, 0xc1, 0x56, 0xde, + 0xa4, 0x78, 0xb1, 0x7b, + 0xa0, 0xac, 0x91, 0x39, 0x4a, 0x19, 0x9c, 0xfd, 0xbc, 0xc8, 0xb5, 0xf4, + 0x09, 0xe4, 0x5c, 0x99, + 0x1e, 0xca, 0xce, 0x94, 0x51, 0x98, 0x56, 0xc8, 0xb9, 0x9c, 0x4a, 0xce, + 0x17, 0xe9, 0x1f, 0x19, + 0xd9, 0xcd, 0xd7, 0xbf, 0xc5, 0x6e, 0x03, 0xcb, 0xb4, 0x4a, 0x29, 0xfd, + 0xc6, 0x72, 0x1d, 0xf4, + 0x25, 0x2f, 0x9b, 0x1f, 0xcc, 0xf3, 0x26, 0x99, 0x16, 0xf4, 0x96, 0x29, + 0x7b, 0xdf, 0xfa, 0xe9, + 0x2e, 0x67, 0xc1, 0xd8, 0x3c, 0x18, 0xa6, 0x85, 0x81, 0x3c, 0x97, 0x08, + 0x71, 0xbd, 0x28, 0x9c, + 0x2f, 0xf5, 0x5c, 0x4e, 0xd2, 0x3f, 0x32, 0xb2, 0x24, 0xe8, 0x5f, 0x5c, + 0x4c, 0x2b, 0xfd, 0xb8, + 0x72, 0x58, 0xb5, 0x7d, 0x69, 0xc9, 0xfc, 0x60, 0xde, 0x63, 0xc1, 0x7c, + 0xe9, 0xad, 0x65, 0xbe, + 0x1e, 0xd6, 0x6f, 0x02, 0x79, 0x5f, 0x60, 0x3f, 0x73, 0x16, 0x8c, 0xc5, + 0x83, 0x09, 0xe4, 0xb9, + 0x80, 0x16, 0x42, 0x5c, 0x8f, 0x9d, 0x35, 0x37, 0xe2, 0xe0, 0xf7, 0xa3, + 0xe7, 0x72, 0x52, 0xfc, + 0x8f, 0x8c, 0x2c, 0x09, 0xfa, 0xa7, 0x0f, 0x62, 0x9c, 0xab, 0x36, 0x5b, + 0x8f, 0xeb, 0x79, 0x38, + 0xf8, 0xb7, 0x2b, 0x7b, 0xb2, 0x7e, 0x13, 0x8b, 0xc7, 0x22, 0xf2, 0x1e, + 0x23, 0x9d, 0xeb, 0x22, + 0xe8, 0x1f, 0x70, 0xb1, 0x40, 0x0b, 0x83, 0x78, 0x2e, 0xbc, 0x2e, 0x79, + 0xb1, 0x59, 0x87, 0xb8, + 0x5e, 0x08, 0xcf, 0xc5, 0xa9, 0x91, 0x89, 0x8d, 0xf3, 0x45, 0xfa, 0x47, + 0x46, 0x96, 0x88, 0xf8, + 0x1f, 0x8a, 0x69, 0x85, 0xeb, 0x7d, 0xf3, 0xf4, 0x96, 0x05, 0xc5, 0xd6, + 0x52, 0xa3, 0x42, 0x0b, + 0x74, 0x2f, 0x88, 0x83, 0xbf, 0xb9, 0xc8, 0x34, 0xd3, 0x23, 0xa6, 0x75, + 0xec, 0x4c, 0x07, 0x79, + 0x5f, 0xc8, 0x81, 0x78, 0x7b, 0xdf, 0x82, 0x79, 0x2e, 0xe0, 0xfb, 0x02, + 0x4b, 0x5a, 0xce, 0x73, + 0x89, 0x10, 0xd7, 0xc3, 0xd6, 0x30, 0x52, 0xfe, 0x97, 0x8c, 0x2c, 0x01, + 0xf5, 0x2f, 0x65, 0x65, + 0x6f, 0x59, 0x66, 0x01, 0x7e, 0x23, 0x6e, 0xae, 0xda, 0x26, 0x82, 0xa3, + 0x25, 0x7a, 0xdf, 0xd6, + 0xfb, 0x4d, 0x38, 0xff, 0x19, 0x66, 0xbd, 0x2d, 0xf5, 0x66, 0x66, 0xa1, + 0xb7, 0x78, 0xef, 0xdb, + 0x89, 0xa4, 0xf7, 0xcd, 0x5d, 0x97, 0x7c, 0x61, 0xf9, 0xd7, 0x32, 0x9e, + 0x8b, 0x38, 0x53, 0x22, + 0xf9, 0xfd, 0x79, 0x54, 0xac, 0x33, 0x7d, 0x74, 0xd9, 0x25, 0xfd, 0x23, + 0x23, 0xbb, 0xe1, 0xfa, + 0x37, 0xd9, 0x6a, 0x6d, 0xc4, 0xc4, 0xb4, 0x82, 0x1a, 0x14, 0x75, 0xef, + 0x5b, 0x00, 0xa7, 0xc5, + 0xea, 0x37, 0xd1, 0xa7, 0x99, 0x96, 0xbe, 0xb0, 0x72, 0x1e, 0xc0, 0x7f, + 0xee, 0x47, 0xe8, 0x7d, + 0x3b, 0xdb, 0x3c, 0xe0, 0x1c, 0xfc, 0x20, 0x9e, 0x8b, 0x95, 0x37, 0x89, + 0x95, 0xf3, 0xd5, 0xa7, + 0xfe, 0x37, 0x32, 0xb2, 0x1b, 0xaf, 0x7f, 0xa3, 0xa2, 0x92, 0x41, 0x9a, + 0x3f, 0xf3, 0xb1, 0xea, + 0x03, 0xfd, 0x46, 0x5c, 0x0d, 0x8a, 0x92, 0xd3, 0xd2, 0x13, 0xec, 0xe7, + 0xec, 0x32, 0xd7, 0xc2, + 0xf6, 0xbe, 0x71, 0xa6, 0x95, 0x55, 0x4f, 0x28, 0xe5, 0xb9, 0xb0, 0x33, + 0x1d, 0xc4, 0xf5, 0x4a, + 0xf3, 0x5c, 0x3d, 0x74, 0xe6, 0x26, 0xef, 0x7d, 0x43, 0xc4, 0x3a, 0xa9, + 0xff, 0x97, 0x8c, 0xec, + 0xe6, 0xeb, 0xdf, 0x20, 0xa7, 0x62, 0x90, 0xe2, 0x99, 0x56, 0x6b, 0xfc, + 0x65, 0x59, 0x0d, 0x8a, + 0xb2, 0xf7, 0xcd, 0x04, 0xfd, 0x83, 0x1c, 0x48, 0x6e, 0x81, 0xeb, 0x7d, + 0x0b, 0x60, 0xd5, 0x1b, + 0x1e, 0x0e, 0xfe, 0x9d, 0xea, 0x5b, 0x54, 0xf3, 0x83, 0xf1, 0xb1, 0x4e, + 0xb6, 0x26, 0xe3, 0xcb, + 0x16, 0xe9, 0x1f, 0x19, 0xd9, 0xcd, 0xd7, 0x3f, 0x29, 0xcf, 0xc5, 0x3a, + 0x8f, 0xa1, 0x58, 0xf5, + 0xc3, 0x02, 0x8a, 0x69, 0x85, 0xe3, 0xb4, 0x08, 0xe6, 0x29, 0xb6, 0xf7, + 0x4d, 0x1d, 0xd7, 0xd3, + 0x8c, 0xf4, 0x64, 0xb3, 0x59, 0x85, 0x1c, 0xc9, 0xb9, 0x7c, 0x7e, 0x30, + 0xe4, 0x4d, 0x70, 0x9c, + 0x2f, 0xcd, 0xd8, 0x9a, 0x90, 0xfe, 0x91, 0x91, 0xdd, 0x78, 0xfd, 0x9b, + 0xee, 0x34, 0x4b, 0x32, + 0x9e, 0x8b, 0xab, 0x1e, 0x04, 0x11, 0xd7, 0x43, 0xcf, 0x55, 0x2b, 0xab, + 0x66, 0x94, 0x83, 0xfe, + 0x41, 0xde, 0x97, 0xcf, 0x7d, 0x4b, 0x29, 0x7b, 0xdf, 0x90, 0x73, 0x39, + 0xdb, 0xbb, 0x17, 0x5b, + 0xfb, 0x61, 0xf3, 0x83, 0x21, 0x6f, 0x52, 0x3c, 0xab, 0x1c, 0x54, 0x8e, + 0x73, 0x35, 0xe9, 0xfc, + 0x60, 0x7b, 0x4d, 0x88, 0x7f, 0x40, 0x46, 0x76, 0xf3, 0xf5, 0x6f, 0xb1, + 0xdb, 0x90, 0xf2, 0x5c, + 0x60, 0xff, 0x5b, 0xbd, 0x65, 0x99, 0xeb, 0xc6, 0xf5, 0x5c, 0xbe, 0xaa, + 0x92, 0xd3, 0x62, 0xe5, + 0x7d, 0x53, 0xb3, 0x5c, 0x5b, 0x9f, 0x68, 0xca, 0xb9, 0x6f, 0xbc, 0x5e, + 0xaf, 0x1f, 0x7d, 0x2e, + 0x27, 0x9f, 0x1f, 0x3c, 0xf1, 0x71, 0xf0, 0xf9, 0xb9, 0x10, 0xea, 0x12, + 0x25, 0xf3, 0x83, 0xf9, + 0x6b, 0xb2, 0x35, 0x99, 0x11, 0xff, 0x8a, 0x8c, 0xec, 0xc6, 0xeb, 0xdf, + 0x30, 0xdf, 0x81, 0xba, + 0x64, 0xd0, 0x90, 0x35, 0x9e, 0x0b, 0xd4, 0x25, 0x8f, 0x75, 0x5e, 0xaf, + 0x97, 0x8e, 0x25, 0xae, + 0x87, 0xe4, 0xb4, 0x40, 0xde, 0xf7, 0x58, 0x6f, 0xc2, 0xdc, 0xcb, 0xac, + 0x8a, 0x69, 0xd0, 0xcf, + 0x76, 0xaa, 0x4c, 0x9f, 0xd3, 0xd7, 0x9c, 0xcb, 0xc9, 0xf3, 0x26, 0xd3, + 0x42, 0x13, 0xce, 0x92, + 0xa1, 0xf3, 0x83, 0x41, 0x0b, 0x81, 0xf3, 0x45, 0xfc, 0x3f, 0x32, 0xb2, + 0x9b, 0xaf, 0x7f, 0xee, + 0x5c, 0x81, 0xc5, 0x73, 0xa9, 0xb8, 0xea, 0x92, 0xab, 0xb7, 0x76, 0xf6, + 0x80, 0x19, 0xb5, 0x39, + 0x93, 0xf3, 0x5c, 0xf0, 0x71, 0x3d, 0x24, 0xa7, 0x85, 0xe7, 0x7d, 0xb3, + 0x2d, 0xc8, 0x81, 0x64, + 0x94, 0x73, 0xdf, 0x62, 0x9c, 0xcb, 0x69, 0xcf, 0x02, 0x9d, 0x66, 0x9a, + 0xb2, 0xf9, 0xc1, 0x3c, + 0x6f, 0x32, 0x2f, 0x34, 0x76, 0x49, 0xff, 0xc8, 0xc8, 0x92, 0xa2, 0x7f, + 0xde, 0x5c, 0x81, 0xab, + 0x2e, 0xb9, 0x7a, 0xc7, 0xcb, 0xc1, 0x0f, 0xe2, 0xb9, 0xf0, 0x7a, 0x90, + 0x53, 0x44, 0x5c, 0x0f, + 0xcb, 0x69, 0x19, 0x65, 0x79, 0xde, 0x97, 0xf7, 0xbe, 0xa9, 0x66, 0xc4, + 0x61, 0xeb, 0xf5, 0x4e, + 0xae, 0x32, 0x97, 0x53, 0x32, 0x3f, 0x18, 0xe6, 0x67, 0x2e, 0x48, 0xff, + 0xc8, 0xc8, 0x92, 0xa7, + 0x7f, 0xde, 0x3c, 0x44, 0x76, 0xb1, 0x73, 0x08, 0xfa, 0x22, 0xe7, 0xb9, + 0x88, 0xbc, 0x89, 0x7f, + 0xae, 0x5a, 0xb0, 0xaf, 0x8a, 0xe3, 0xb4, 0x08, 0xe6, 0x73, 0xaa, 0xad, + 0x23, 0xe6, 0xbe, 0x21, + 0xe7, 0x72, 0x5a, 0xbd, 0x6f, 0x48, 0xce, 0x57, 0x90, 0xe6, 0x7a, 0xfa, + 0x4d, 0xd8, 0x5a, 0x90, + 0xfe, 0x91, 0x91, 0x25, 0x5b, 0xff, 0x78, 0xdc, 0xac, 0x0c, 0x7c, 0xe8, + 0x9a, 0x94, 0xe7, 0x02, + 0x79, 0x93, 0xf3, 0xad, 0x03, 0xe1, 0x37, 0xa6, 0x9b, 0x52, 0x9e, 0x8b, + 0xe5, 0xab, 0x72, 0xfe, + 0xb2, 0xe2, 0xac, 0x96, 0x9a, 0xe4, 0xda, 0x50, 0xf7, 0x22, 0xed, 0x7d, + 0xf3, 0xc6, 0xf5, 0xea, + 0x61, 0x71, 0x3d, 0xfb, 0x1c, 0x17, 0xe7, 0x5c, 0xce, 0x0c, 0xc4, 0x3a, + 0x49, 0xff, 0xc8, 0xc8, + 0x12, 0xaf, 0x7f, 0xc0, 0xaa, 0xdf, 0xf5, 0xb1, 0xea, 0xb5, 0x23, 0x17, + 0xcf, 0xc5, 0xf6, 0x8f, + 0x9f, 0xda, 0x0d, 0x9d, 0x1f, 0x2c, 0xce, 0x75, 0x38, 0xfe, 0x32, 0xe4, + 0x7d, 0x81, 0xf9, 0x8c, + 0xe9, 0x7d, 0xc3, 0x31, 0xad, 0x34, 0x6c, 0x8d, 0x0c, 0xbe, 0x86, 0x91, + 0xe2, 0x7f, 0x64, 0x64, + 0x89, 0xd7, 0x3f, 0x05, 0xab, 0xde, 0xea, 0xb1, 0xd8, 0x6c, 0x80, 0x0e, + 0x86, 0xcd, 0x0f, 0x86, + 0xbc, 0x09, 0xf7, 0x55, 0x11, 0x35, 0x32, 0x90, 0xf7, 0xd5, 0x47, 0x1b, + 0x1d, 0xd0, 0x3f, 0x60, + 0x5f, 0x69, 0x92, 0x5e, 0xb5, 0xa8, 0x71, 0x3d, 0x3d, 0xa6, 0xb9, 0x9c, + 0x82, 0xf3, 0x45, 0xf5, + 0x7f, 0x64, 0x64, 0x09, 0xd7, 0x3f, 0xa3, 0x78, 0x8e, 0x99, 0xab, 0x96, + 0xed, 0x42, 0x5c, 0x4f, + 0x1f, 0x65, 0x5b, 0xc1, 0xf3, 0x83, 0x05, 0x07, 0x3f, 0xb7, 0xdc, 0x3e, + 0x04, 0x5f, 0x35, 0xb4, + 0xdf, 0x84, 0xbd, 0x66, 0xc6, 0xca, 0xfb, 0xba, 0xd9, 0xcf, 0xd9, 0x69, + 0xba, 0xed, 0xe3, 0xb9, + 0x70, 0x8b, 0x95, 0x69, 0x85, 0x9c, 0xcb, 0x29, 0xd6, 0x84, 0xfa, 0x3f, + 0xc8, 0xc8, 0x92, 0x9e, + 0xff, 0xc0, 0x31, 0xad, 0x0a, 0xed, 0xea, 0x6d, 0x17, 0x7f, 0x59, 0x32, + 0x3f, 0x98, 0xf7, 0xe0, + 0xb2, 0xaf, 0x0b, 0xed, 0x37, 0xb1, 0x7a, 0xdf, 0x20, 0xef, 0x0b, 0x35, + 0x80, 0x9c, 0x87, 0x05, + 0x3a, 0xc8, 0xfe, 0x74, 0xcf, 0x99, 0x13, 0x35, 0xda, 0xa9, 0x2e, 0x8e, + 0x69, 0x85, 0x8b, 0xeb, + 0xa5, 0x97, 0x95, 0x3a, 0x9e, 0xf3, 0x75, 0xd9, 0x26, 0xfd, 0x23, 0x23, + 0x4b, 0xb0, 0xfe, 0x1d, + 0xa5, 0x38, 0xd3, 0x2a, 0x8f, 0x62, 0x5a, 0x49, 0xe2, 0x7a, 0xee, 0xbc, + 0x09, 0xfb, 0x59, 0xfc, + 0x5c, 0x68, 0xb3, 0xa9, 0x82, 0xfa, 0x4d, 0x2c, 0xfd, 0x83, 0xbc, 0x2f, + 0xe4, 0x40, 0xa0, 0x47, + 0x23, 0x35, 0xce, 0x74, 0xb2, 0xec, 0x0c, 0xe8, 0xf4, 0x67, 0x58, 0xfe, + 0xf5, 0x0e, 0xf3, 0xaf, + 0xb9, 0x16, 0x4d, 0xd2, 0xcd, 0x54, 0x88, 0x8f, 0x8c, 0xe7, 0xf7, 0x83, + 0x2f, 0xad, 0xa8, 0x61, + 0x74, 0xd6, 0x84, 0xf8, 0x2f, 0x64, 0x64, 0xc9, 0xd6, 0xbf, 0x98, 0x98, + 0x56, 0x96, 0xdf, 0x08, + 0xbd, 0x6f, 0x3b, 0xc7, 0xf9, 0x9a, 0x6c, 0x7e, 0x70, 0x6e, 0x92, 0x6e, + 0xa5, 0x06, 0xa9, 0x2e, + 0xf8, 0xbc, 0x1a, 0xe8, 0x9f, 0x77, 0xee, 0xa5, 0x91, 0x1e, 0xea, 0x6d, + 0x7f, 0xdf, 0x2e, 0x5c, + 0xe0, 0x5f, 0xcb, 0x78, 0x2e, 0x4e, 0x5c, 0xef, 0x1c, 0xc7, 0xef, 0x57, + 0x72, 0xbe, 0x9c, 0x35, + 0x21, 0xfe, 0x29, 0x19, 0x59, 0xa2, 0xf5, 0xcf, 0xaa, 0xd7, 0x4b, 0xc5, + 0x38, 0x57, 0x8d, 0xf9, + 0xaa, 0xed, 0x0d, 0xc9, 0xfc, 0xe0, 0xd2, 0x59, 0xae, 0x0e, 0x39, 0x0f, + 0xf0, 0x7b, 0x33, 0xe3, + 0x54, 0x07, 0x72, 0x20, 0x32, 0x1f, 0x34, 0x33, 0x12, 0x7d, 0xbb, 0x4e, + 0xce, 0x45, 0xc2, 0x73, + 0x81, 0x58, 0xa3, 0xe8, 0x7d, 0xcb, 0xa9, 0x99, 0x56, 0x17, 0x88, 0x58, + 0xe7, 0xc0, 0xae, 0x61, + 0x24, 0xfd, 0x23, 0x23, 0x4b, 0xb4, 0xfe, 0x0d, 0x0b, 0x7c, 0xae, 0x9a, + 0x86, 0xa9, 0x07, 0x39, + 0xc9, 0x5c, 0x71, 0xae, 0xda, 0xaa, 0xdf, 0xa4, 0xb0, 0xf4, 0xc6, 0xfb, + 0x32, 0xaa, 0xde, 0x37, + 0xd0, 0x22, 0x76, 0x76, 0xcc, 0x4d, 0x83, 0x6b, 0x71, 0x84, 0x7f, 0xbd, + 0x79, 0xa8, 0x2f, 0x77, + 0x0e, 0xab, 0x27, 0xb9, 0x5a, 0xe8, 0x7d, 0x44, 0x88, 0x75, 0x8a, 0x35, + 0xa1, 0xf9, 0x1f, 0x64, + 0x64, 0x49, 0xd6, 0xbf, 0xd0, 0xb8, 0x9e, 0xcb, 0x22, 0xcd, 0x55, 0x0b, + 0xe5, 0xb4, 0x68, 0x46, + 0x6a, 0x9c, 0x6d, 0xc3, 0xf9, 0x0f, 0x38, 0xf8, 0xca, 0xde, 0xb7, 0x91, + 0xd3, 0xfb, 0x26, 0xbe, + 0x1b, 0x18, 0x06, 0xb3, 0x42, 0xd3, 0x3b, 0x5b, 0x89, 0xf9, 0xc7, 0xec, + 0xbc, 0x56, 0xbd, 0xd8, + 0x92, 0xf3, 0x5c, 0xac, 0xb8, 0x1e, 0xbc, 0x3f, 0x7c, 0xac, 0x93, 0xe6, + 0xff, 0x92, 0x91, 0x25, + 0x59, 0xff, 0x62, 0x65, 0x5a, 0xf1, 0x1a, 0x19, 0x35, 0xa7, 0x65, 0x63, + 0x24, 0x7a, 0xdf, 0x38, + 0x07, 0x1f, 0xd5, 0xfb, 0x16, 0x1c, 0xd7, 0xe3, 0xfe, 0xb5, 0xdd, 0xc3, + 0xec, 0xab, 0x4b, 0x5c, + 0xe3, 0xb9, 0xb8, 0x38, 0x5f, 0xa8, 0x58, 0xe7, 0x39, 0xac, 0x09, 0xe9, + 0x1f, 0x19, 0xd9, 0xcd, + 0xd7, 0x3f, 0xcd, 0x08, 0x8f, 0xeb, 0x21, 0x99, 0x56, 0x63, 0xf5, 0xdc, + 0x37, 0x0c, 0xa7, 0x45, + 0xb3, 0x7a, 0xdf, 0xf8, 0xdf, 0xd5, 0xbd, 0x6f, 0x6a, 0x56, 0x7d, 0x4f, + 0xc4, 0x1d, 0x77, 0x4e, + 0x8b, 0x07, 0x9e, 0xbc, 0xc9, 0x5d, 0xc1, 0x73, 0x70, 0xf2, 0x26, 0x23, + 0xc1, 0xf9, 0xc2, 0xc7, + 0x3a, 0x49, 0xff, 0xc8, 0xc8, 0x6e, 0xbc, 0xfe, 0x8d, 0x8b, 0xad, 0x20, + 0x9e, 0x8b, 0x13, 0xd7, + 0xc3, 0x33, 0xad, 0x62, 0x99, 0xab, 0x66, 0xf7, 0xbe, 0x71, 0xfd, 0x43, + 0xf5, 0xbe, 0xe1, 0xea, + 0xf5, 0x78, 0xdc, 0xd1, 0x95, 0x37, 0xe1, 0xb5, 0x38, 0xee, 0xbc, 0xc9, + 0xc5, 0xf6, 0x3e, 0xd4, + 0x26, 0x16, 0xe4, 0xf3, 0x83, 0x7d, 0x6b, 0x42, 0xfa, 0x47, 0x46, 0x76, + 0xe3, 0xf5, 0x6f, 0xb1, + 0xdb, 0x08, 0xe2, 0xb9, 0x80, 0xf6, 0x08, 0x56, 0xbd, 0xaa, 0x1e, 0x24, + 0xcd, 0xfd, 0xc6, 0xab, + 0xf0, 0x97, 0x03, 0xcf, 0x57, 0x56, 0xef, 0x1b, 0xe6, 0xdd, 0x63, 0x7b, + 0xdf, 0x02, 0xe7, 0x72, + 0xf6, 0x80, 0xfd, 0x9c, 0x6f, 0x85, 0xe5, 0x4d, 0x82, 0xfa, 0x4d, 0xf2, + 0x4e, 0xac, 0x93, 0xf4, + 0x8f, 0x8c, 0xec, 0xe6, 0x9f, 0xff, 0x4a, 0xad, 0x35, 0x9e, 0x8b, 0x55, + 0x97, 0x0c, 0xbd, 0x65, + 0x5b, 0xd3, 0x54, 0x38, 0x83, 0x80, 0xf3, 0x97, 0xab, 0x18, 0xfe, 0x32, + 0x82, 0xd3, 0xb2, 0x61, + 0x64, 0x16, 0xb9, 0x56, 0x66, 0xa8, 0x88, 0x11, 0x5a, 0x5f, 0x5b, 0x38, + 0xab, 0xa2, 0xe7, 0x72, + 0x86, 0xf1, 0xfb, 0x21, 0x6f, 0x92, 0x3f, 0x29, 0x1f, 0x02, 0xd7, 0xcf, + 0x9d, 0x37, 0x59, 0xeb, + 0x37, 0x39, 0xd2, 0xba, 0x2b, 0xce, 0x17, 0xe9, 0x1f, 0x19, 0x59, 0x12, + 0xf2, 0x1f, 0x6e, 0x9e, + 0xcb, 0x8a, 0x83, 0xcf, 0xce, 0x84, 0x4c, 0x03, 0xca, 0x21, 0x3c, 0x17, + 0x3b, 0xae, 0xc7, 0x99, + 0x56, 0xb1, 0xf0, 0x97, 0x35, 0x43, 0x5f, 0xe6, 0x98, 0xff, 0x89, 0xd1, + 0x3f, 0x11, 0xd7, 0x8b, + 0x8b, 0x69, 0xa5, 0x01, 0xe7, 0xeb, 0x54, 0xaf, 0x41, 0xde, 0xc4, 0xe9, + 0x61, 0x0e, 0xe8, 0x37, + 0xe1, 0x35, 0x8c, 0xec, 0x99, 0x90, 0xea, 0x51, 0xfd, 0x0b, 0x19, 0x59, + 0xc2, 0xf2, 0xbf, 0xbc, + 0x2e, 0x19, 0xe6, 0x60, 0x94, 0x4e, 0xb7, 0x6b, 0x2a, 0x9e, 0x8b, 0x13, + 0xd7, 0x43, 0xd4, 0xc8, + 0xa0, 0x7c, 0x55, 0x57, 0xef, 0x9b, 0xf2, 0xbd, 0x5b, 0x4c, 0xab, 0xf8, + 0xe6, 0x72, 0x56, 0xfd, + 0xb1, 0xce, 0xf0, 0x7e, 0x93, 0x09, 0xf1, 0x5f, 0xc8, 0xc8, 0x12, 0x5b, + 0xff, 0x62, 0x31, 0x53, + 0x8a, 0x8b, 0xcd, 0xfa, 0x3a, 0xcf, 0xc5, 0xc5, 0xc1, 0x9f, 0x6d, 0x35, + 0xb0, 0xfc, 0xe5, 0x9d, + 0xa9, 0x2a, 0x96, 0x98, 0x32, 0xec, 0xde, 0x37, 0xe5, 0x7b, 0x8f, 0x34, + 0x97, 0x53, 0xcd, 0xb4, + 0xca, 0x85, 0xf1, 0xfb, 0x83, 0xfa, 0x4d, 0x88, 0x7f, 0x4a, 0x46, 0x96, + 0x64, 0xfd, 0x13, 0xbd, + 0x6f, 0x3d, 0xc1, 0x24, 0x90, 0xf1, 0x5c, 0xca, 0xb7, 0xca, 0xfb, 0x70, + 0xfe, 0x93, 0xf2, 0x5c, + 0xa2, 0xf8, 0xaa, 0x5c, 0xff, 0x74, 0x25, 0xf3, 0xd9, 0xad, 0xcf, 0x71, + 0xf5, 0x26, 0x47, 0xe1, + 0x7c, 0xe5, 0x67, 0xf9, 0x66, 0x71, 0x4c, 0xfc, 0x17, 0x32, 0xb2, 0xc4, + 0xea, 0xdf, 0x30, 0xcf, + 0x99, 0x56, 0x5a, 0x40, 0x9f, 0x84, 0x9b, 0x83, 0x5f, 0xbd, 0xbb, 0x9e, + 0x37, 0xf1, 0xf0, 0x5c, + 0xac, 0x1a, 0x19, 0x14, 0x7f, 0x79, 0x90, 0xee, 0xc2, 0xdc, 0x37, 0x97, + 0xaf, 0x6a, 0x5c, 0x37, + 0xae, 0x97, 0x5e, 0x22, 0x6a, 0x18, 0xaf, 0xc4, 0xf9, 0xa2, 0xfc, 0x07, + 0x19, 0x59, 0x52, 0xf5, + 0x0f, 0xc3, 0xaa, 0x87, 0xbc, 0x49, 0xe1, 0xb4, 0x7a, 0x00, 0xb5, 0x73, + 0xd2, 0xf9, 0xc1, 0x90, + 0x37, 0x19, 0xa4, 0x3b, 0xa8, 0x19, 0xe5, 0x43, 0x98, 0xfb, 0x96, 0x71, + 0xce, 0x88, 0xe9, 0x51, + 0xaa, 0x03, 0x39, 0x97, 0xc0, 0xf3, 0x60, 0x14, 0x56, 0xfd, 0x32, 0x9e, + 0xb9, 0x9c, 0xde, 0x35, + 0x21, 0xfd, 0x23, 0x23, 0x4b, 0xac, 0xfe, 0x21, 0xeb, 0xf5, 0xf2, 0xa7, + 0xbb, 0xb5, 0xed, 0xa9, + 0xd6, 0x08, 0xe2, 0xb9, 0x38, 0x79, 0x93, 0x93, 0x62, 0xad, 0x72, 0xbb, + 0xb2, 0x97, 0x1b, 0xa5, + 0x5a, 0xb2, 0xf9, 0xc1, 0x42, 0x5f, 0xf4, 0x76, 0x6e, 0x9e, 0x76, 0xf4, + 0x8f, 0xb3, 0x10, 0x96, + 0x7a, 0x33, 0x3b, 0xcb, 0xb4, 0x81, 0x83, 0xef, 0xa9, 0x4b, 0x16, 0xac, + 0x7a, 0x14, 0xd3, 0x4a, + 0x5d, 0xc3, 0x88, 0x9c, 0xcb, 0x39, 0xdd, 0x76, 0xc5, 0x3a, 0x49, 0xff, + 0xc8, 0xc8, 0x92, 0xaa, + 0x7f, 0x11, 0x99, 0x56, 0x2d, 0xf7, 0xbf, 0xb9, 0xe7, 0x07, 0xef, 0xba, + 0x39, 0x04, 0x16, 0x07, + 0x5f, 0xd6, 0x6f, 0x92, 0x9a, 0xea, 0x4e, 0xef, 0x1b, 0xcf, 0x19, 0x2f, + 0x2d, 0x16, 0x8c, 0xc5, + 0xc1, 0x2f, 0x5f, 0xec, 0xec, 0x3b, 0x35, 0xda, 0xf3, 0x38, 0xe3, 0x7a, + 0xb8, 0xb9, 0x9c, 0xde, + 0x35, 0x21, 0xfd, 0x23, 0x23, 0x4b, 0xaa, 0xfe, 0x89, 0x7a, 0xbd, 0xab, + 0x32, 0xad, 0xdc, 0x79, + 0x53, 0xbd, 0x55, 0x38, 0xde, 0x3a, 0x84, 0xb3, 0x60, 0xd8, 0xfc, 0x60, + 0x88, 0x33, 0x66, 0x66, + 0xb9, 0x96, 0x87, 0x79, 0x0a, 0x0c, 0x84, 0x61, 0xaa, 0x9b, 0x9e, 0x66, + 0xdb, 0x50, 0x17, 0xe3, + 0xf1, 0xaf, 0x2f, 0xca, 0xfb, 0xc0, 0x3e, 0xc8, 0xca, 0x78, 0x2e, 0x11, + 0xe3, 0x7a, 0x18, 0xce, + 0x97, 0xb7, 0x86, 0x91, 0xf4, 0x8f, 0x8c, 0x2c, 0xa9, 0xfa, 0x17, 0x89, + 0x69, 0xa5, 0xa8, 0x41, + 0x61, 0xbe, 0x6a, 0x0b, 0x6a, 0x50, 0x02, 0xe7, 0x07, 0xbb, 0x38, 0xf8, + 0x59, 0xe8, 0x7d, 0x1b, + 0x4b, 0xe6, 0x07, 0x33, 0x8d, 0xd3, 0x27, 0x85, 0x66, 0xf1, 0x64, 0xbb, + 0xc6, 0xfb, 0xd5, 0xee, + 0x0a, 0xff, 0x9a, 0x6b, 0x61, 0x10, 0xcf, 0xc5, 0xca, 0xd5, 0x44, 0x8f, + 0xeb, 0x85, 0xd4, 0xc8, + 0x78, 0xd6, 0x84, 0xf4, 0x8f, 0x8c, 0x2c, 0xa1, 0xfa, 0xc7, 0x99, 0x56, + 0xb1, 0xcd, 0x55, 0xf3, + 0x71, 0x5a, 0x02, 0xe7, 0x07, 0x33, 0x2d, 0x2b, 0x9e, 0xe6, 0xea, 0xfa, + 0x22, 0xdb, 0xca, 0x8c, + 0x99, 0x8e, 0xf5, 0xa5, 0x71, 0x42, 0x5e, 0xa3, 0x5d, 0x3c, 0xaf, 0x1e, + 0x80, 0x3f, 0x1d, 0x50, + 0xa3, 0x5d, 0x2b, 0xcc, 0x2c, 0x0e, 0x7e, 0x3f, 0xd3, 0xc1, 0xbc, 0x3f, + 0x11, 0xd7, 0xc3, 0x71, + 0xbe, 0x56, 0x6b, 0x42, 0xfa, 0x47, 0x46, 0x96, 0x4c, 0xfd, 0x0b, 0x8a, + 0xeb, 0x05, 0xd5, 0xa0, + 0xe0, 0x98, 0x56, 0x21, 0x9c, 0x16, 0x17, 0x07, 0x7f, 0xbb, 0x56, 0x04, + 0xfe, 0xbd, 0xc5, 0x7e, + 0xb6, 0x66, 0x9f, 0x4b, 0x4d, 0xf4, 0xe1, 0x6a, 0x4d, 0x11, 0x6b, 0x2c, + 0x36, 0xb6, 0x2e, 0x02, + 0x66, 0x6e, 0x32, 0xff, 0x1a, 0x34, 0x51, 0x1f, 0x32, 0x2d, 0x0c, 0x99, + 0xb9, 0x89, 0x8d, 0x75, + 0x5a, 0x9c, 0xaf, 0x16, 0xe9, 0x1f, 0x19, 0x59, 0x82, 0xf5, 0x0f, 0x5b, + 0xaf, 0x37, 0x2a, 0x46, + 0x98, 0xab, 0xa6, 0xe2, 0xb4, 0x64, 0xba, 0x9b, 0xa7, 0xb9, 0x46, 0x66, + 0x92, 0x6e, 0xc3, 0xac, + 0x37, 0xd0, 0x40, 0x79, 0xdc, 0x31, 0x20, 0xae, 0xd7, 0x4b, 0x75, 0x9d, + 0x1a, 0x6d, 0x1f, 0xe7, + 0x0f, 0xfc, 0xeb, 0x55, 0xac, 0x51, 0x5b, 0xab, 0xd1, 0xe6, 0xfa, 0x8c, + 0xe4, 0x7c, 0xad, 0xd6, + 0x84, 0xf4, 0x8f, 0x8c, 0x2c, 0x91, 0xfa, 0x87, 0x8c, 0xeb, 0x21, 0x6b, + 0x64, 0x70, 0x9c, 0x16, + 0xa6, 0x7f, 0x70, 0xfe, 0x13, 0x67, 0x49, 0xcd, 0xd0, 0x06, 0x29, 0xb9, + 0xcf, 0x6a, 0xc5, 0xf5, + 0x64, 0xbd, 0x6f, 0x9a, 0x5d, 0xa3, 0x7d, 0xb2, 0x53, 0x73, 0xf2, 0x2e, + 0x76, 0xac, 0xf1, 0x7c, + 0x7b, 0x8d, 0x83, 0xcf, 0xe3, 0x7a, 0x73, 0x2d, 0x62, 0xac, 0x93, 0xf4, + 0x8f, 0x8c, 0x2c, 0x91, + 0xfa, 0x67, 0xf5, 0xbe, 0xa1, 0xe2, 0x7a, 0x4a, 0xa6, 0x95, 0x06, 0x73, + 0xd5, 0x50, 0x9c, 0x96, + 0xd2, 0xa9, 0xad, 0x7f, 0x0a, 0x43, 0xd6, 0xeb, 0x6d, 0x4c, 0xb7, 0x39, + 0x1f, 0xdf, 0x93, 0x37, + 0x79, 0xca, 0x9f, 0x37, 0xc9, 0x35, 0x04, 0xe7, 0x4b, 0x53, 0x71, 0xbe, + 0xba, 0xde, 0x35, 0x21, + 0xfd, 0x23, 0x23, 0xbb, 0xf1, 0xfa, 0xc7, 0x74, 0xc7, 0xc3, 0x73, 0xe1, + 0xf5, 0x20, 0x51, 0xe2, + 0x7a, 0x59, 0x25, 0xd3, 0x65, 0xfb, 0x16, 0x8e, 0xd3, 0x52, 0x3a, 0xd1, + 0x1b, 0x2a, 0x5f, 0x5a, + 0x68, 0x25, 0xd4, 0xeb, 0x61, 0x59, 0xf5, 0x4e, 0xdc, 0x51, 0xc4, 0x1a, + 0x67, 0x85, 0x46, 0xe9, + 0xcc, 0x57, 0xa3, 0xcd, 0x74, 0x71, 0xe7, 0x0c, 0xd8, 0x36, 0xc1, 0xf3, + 0x83, 0x83, 0xd7, 0x84, + 0xf4, 0x8f, 0x8c, 0xec, 0xc6, 0xeb, 0xdf, 0xbc, 0xda, 0xf0, 0xf0, 0x5c, + 0xa0, 0x2e, 0x79, 0xec, + 0x9d, 0xab, 0x76, 0xbd, 0xb8, 0x1e, 0x9e, 0xd3, 0x52, 0x3a, 0xce, 0x34, + 0x50, 0xef, 0x9b, 0xd7, + 0xeb, 0x6d, 0xab, 0xe7, 0x72, 0x4a, 0xe3, 0x7a, 0x76, 0x8d, 0x76, 0xb1, + 0xb1, 0x75, 0xee, 0xd2, + 0x42, 0xc9, 0xfc, 0x60, 0xfe, 0x3d, 0xe3, 0x62, 0xdb, 0x1b, 0xeb, 0x24, + 0xfd, 0x23, 0x23, 0xbb, + 0xf1, 0xfa, 0x37, 0xab, 0x34, 0xfc, 0x75, 0xc9, 0xa5, 0x93, 0xad, 0x1a, + 0xf4, 0x96, 0xa5, 0xa4, + 0x3c, 0x17, 0x3b, 0xae, 0x87, 0x60, 0x5a, 0x45, 0xe0, 0xb4, 0x94, 0x96, + 0x69, 0x94, 0xfe, 0xa1, + 0x99, 0x56, 0x98, 0x1a, 0x46, 0xe6, 0xeb, 0x83, 0x3e, 0x17, 0x8f, 0x8b, + 0x87, 0xee, 0xbc, 0x09, + 0x67, 0xdb, 0xb8, 0xfb, 0x4d, 0xd6, 0x38, 0x5f, 0xa4, 0x7f, 0x64, 0x64, + 0x37, 0x5e, 0xff, 0x7a, + 0x29, 0x23, 0xa8, 0x2e, 0x79, 0x37, 0x8c, 0xe7, 0x12, 0x31, 0xae, 0x87, + 0xe2, 0xb4, 0x30, 0x5f, + 0xb5, 0xb4, 0x48, 0x35, 0x31, 0xef, 0x1a, 0x3d, 0x97, 0x13, 0xc9, 0xb4, + 0x02, 0x7d, 0x86, 0xf7, + 0xc7, 0xf3, 0x26, 0x13, 0x7b, 0x3e, 0x52, 0xd5, 0xc7, 0x73, 0xd8, 0xd9, + 0xe7, 0x35, 0xdc, 0xa3, + 0x8c, 0x55, 0x63, 0x4d, 0xfc, 0x67, 0x32, 0xb2, 0x24, 0xe5, 0x3f, 0x9c, + 0xba, 0xe4, 0xf3, 0x8a, + 0xa7, 0x6f, 0x77, 0x8d, 0xe7, 0x02, 0xfb, 0xbf, 0xa7, 0x75, 0x71, 0x35, + 0x32, 0x78, 0x4e, 0x4b, + 0x69, 0xae, 0xa1, 0xf4, 0x2f, 0xfe, 0xb9, 0x9c, 0xeb, 0xbd, 0x6f, 0x7c, + 0x96, 0x7a, 0x40, 0xbf, + 0x09, 0x70, 0x1c, 0x78, 0xde, 0x64, 0x44, 0xfc, 0x3f, 0x32, 0xb2, 0x24, + 0xe6, 0x7f, 0x21, 0xae, + 0x57, 0x39, 0xd1, 0x0f, 0x05, 0x07, 0x7f, 0xe7, 0xa0, 0x12, 0xc8, 0xc1, + 0xd7, 0x1b, 0x3b, 0xb7, + 0xd4, 0x73, 0x2f, 0x35, 0xc1, 0x69, 0x51, 0xfa, 0xaa, 0xc0, 0x69, 0x29, + 0x4e, 0xb5, 0x16, 0xe6, + 0x5d, 0x47, 0x9c, 0xcb, 0x19, 0xde, 0x9b, 0xa7, 0x8e, 0x75, 0xf2, 0xbc, + 0xc9, 0xe6, 0x99, 0xaf, + 0xdf, 0x84, 0xf8, 0xcf, 0x64, 0x64, 0x49, 0xd4, 0x3f, 0x2b, 0xae, 0x67, + 0xfb, 0x8d, 0x12, 0x9e, + 0xcb, 0x9d, 0xea, 0x5b, 0xaa, 0xec, 0x5c, 0xb4, 0x1d, 0xc2, 0x73, 0x11, + 0xbe, 0xea, 0x0e, 0x9a, + 0xd3, 0x52, 0x50, 0x9d, 0xd5, 0xec, 0xb8, 0x5e, 0x18, 0xab, 0xde, 0x57, + 0x23, 0x13, 0xd7, 0x5c, + 0x4e, 0xce, 0xf9, 0x9a, 0xa5, 0x1a, 0x4e, 0xde, 0x64, 0x72, 0xd9, 0x22, + 0xfd, 0x23, 0x23, 0x4b, + 0x9a, 0xfe, 0x85, 0xb0, 0xea, 0x3d, 0x1c, 0xfc, 0xf2, 0xbe, 0x8a, 0xe7, + 0x22, 0x7c, 0xd5, 0x0a, + 0x9a, 0xbf, 0x9c, 0x1b, 0xa2, 0xe6, 0xfe, 0x22, 0xe3, 0x7a, 0x7a, 0x84, + 0xb9, 0x9c, 0x38, 0xce, + 0x97, 0x77, 0x4d, 0x28, 0xfe, 0x47, 0x46, 0x96, 0x38, 0xfd, 0xb3, 0x7b, + 0xdf, 0x14, 0xf5, 0x7a, + 0xa2, 0x46, 0x66, 0x67, 0x6f, 0x8d, 0xe7, 0xe2, 0xcb, 0x9b, 0x80, 0xaf, + 0xaa, 0xae, 0x91, 0x11, + 0xfd, 0x1c, 0x59, 0xdf, 0xdc, 0x4b, 0x60, 0x20, 0x58, 0xf5, 0x76, 0x86, + 0x3f, 0xae, 0xa7, 0xae, + 0x27, 0xb4, 0xf8, 0xfd, 0xb1, 0xd4, 0x30, 0x06, 0xf5, 0x03, 0x52, 0xfe, + 0x97, 0x8c, 0x2c, 0x71, + 0xfa, 0x17, 0x65, 0xae, 0xda, 0xb9, 0xe0, 0x2f, 0x07, 0xf3, 0x5c, 0x44, + 0xde, 0x64, 0xfb, 0xa2, + 0xba, 0x57, 0x3e, 0x29, 0xd4, 0xa4, 0xf3, 0x83, 0x5d, 0xbe, 0xaa, 0xff, + 0xac, 0x06, 0x0c, 0x04, + 0x7d, 0x9e, 0x69, 0xb9, 0x38, 0xf8, 0x5d, 0x3b, 0xae, 0xa7, 0x7a, 0x7f, + 0x1b, 0xd8, 0x1a, 0x46, + 0xa8, 0x91, 0x59, 0x5e, 0x85, 0xf3, 0x45, 0xfa, 0x47, 0x46, 0x96, 0x38, + 0xfd, 0xc3, 0x32, 0xad, + 0x66, 0x5e, 0xa6, 0x95, 0x3b, 0x57, 0x20, 0xe5, 0xe0, 0x07, 0xcd, 0x0f, + 0xe6, 0x35, 0x32, 0xfa, + 0x6a, 0xd6, 0x9c, 0x5b, 0xff, 0x4e, 0x2c, 0xf6, 0xb3, 0xc5, 0x83, 0xb1, + 0xea, 0x92, 0x5b, 0xe5, + 0xdb, 0x55, 0x44, 0x6f, 0xf2, 0x36, 0x7a, 0x2e, 0xe7, 0xd5, 0x38, 0x5f, + 0xa4, 0x7f, 0x64, 0x64, + 0x89, 0xd3, 0x3f, 0xce, 0xb4, 0x52, 0xd7, 0xeb, 0x65, 0xa0, 0x06, 0xe5, + 0x24, 0x2c, 0xae, 0xa7, + 0x19, 0xe9, 0x91, 0xde, 0x06, 0xbf, 0x91, 0xd7, 0xce, 0xc9, 0xe6, 0x07, + 0x43, 0xde, 0x64, 0x54, + 0xe0, 0xbe, 0xf4, 0xda, 0x4f, 0x18, 0xa4, 0xba, 0xe9, 0x49, 0xa6, 0x6d, + 0x73, 0xf0, 0x45, 0xac, + 0xb1, 0xc2, 0xe3, 0x8d, 0x5b, 0xcb, 0x82, 0x94, 0xe7, 0xb2, 0xaa, 0x91, + 0xb9, 0x0a, 0xbf, 0x3f, + 0xc0, 0x78, 0x0d, 0x63, 0x79, 0xcf, 0xbb, 0x26, 0xa4, 0x7f, 0x64, 0x64, + 0x89, 0xd3, 0x3f, 0x5e, + 0xaf, 0x17, 0x13, 0xd3, 0x8a, 0xe9, 0x8b, 0xa8, 0x41, 0xd1, 0xda, 0xb2, + 0xf9, 0xc1, 0x3c, 0x6f, + 0x72, 0x52, 0xaa, 0x01, 0x7f, 0x39, 0x8c, 0x63, 0x0f, 0x1c, 0x7c, 0x5e, + 0x97, 0x7c, 0xab, 0xb2, + 0xa7, 0xe2, 0xb9, 0x5c, 0x2f, 0xae, 0x17, 0x60, 0x81, 0x6b, 0x42, 0xfa, + 0x47, 0x46, 0x96, 0x34, + 0xfd, 0xe3, 0xf5, 0x7a, 0xe7, 0xb8, 0xb9, 0x6a, 0x18, 0xa6, 0xd5, 0x5a, + 0xef, 0x9b, 0x6f, 0x7e, + 0xb0, 0xd3, 0x6f, 0x72, 0xb7, 0xf2, 0x96, 0xcd, 0x63, 0x9d, 0xf3, 0xff, + 0x52, 0x03, 0xc9, 0xcc, + 0x4b, 0xf0, 0xbb, 0xa7, 0xa5, 0xe6, 0xee, 0xed, 0xed, 0x3d, 0x39, 0xcf, + 0x45, 0x70, 0xf0, 0x79, + 0x5c, 0x6f, 0x1e, 0x0f, 0xbf, 0x3f, 0x78, 0x4d, 0x48, 0xff, 0xc8, 0xc8, + 0x92, 0xa6, 0x7f, 0x7e, + 0x56, 0xbd, 0xec, 0x5c, 0x57, 0xbc, 0xe0, 0x35, 0x28, 0x0a, 0xbf, 0x51, + 0x70, 0x5a, 0x64, 0x35, + 0x28, 0x4e, 0xde, 0xe4, 0x4c, 0xf4, 0x9b, 0x94, 0xce, 0x73, 0x75, 0x1e, + 0xeb, 0x3b, 0xce, 0x35, + 0xf5, 0x79, 0xb6, 0x15, 0x1c, 0xd7, 0x63, 0x5a, 0x24, 0xea, 0x09, 0x43, + 0x63, 0x8d, 0x90, 0x23, + 0xde, 0x5e, 0xe6, 0x0e, 0xa5, 0x3c, 0x97, 0x28, 0xb1, 0xce, 0xc0, 0x35, + 0x21, 0xfd, 0x23, 0x23, + 0x4b, 0x9a, 0xfe, 0x85, 0xb0, 0xea, 0x3d, 0xfe, 0x28, 0x7e, 0xae, 0xda, + 0x36, 0x6e, 0xae, 0xda, + 0x69, 0xbe, 0x06, 0x73, 0x3f, 0x32, 0x73, 0xc1, 0x7e, 0x86, 0x78, 0x5f, + 0xd0, 0xd7, 0x06, 0xc7, + 0xf5, 0x5c, 0x3c, 0x97, 0x20, 0x0e, 0x7e, 0x10, 0xcf, 0xc5, 0x89, 0x75, + 0x22, 0x38, 0x5f, 0x0b, + 0xee, 0x4b, 0x93, 0xfe, 0x91, 0x91, 0x25, 0x5c, 0xff, 0xb0, 0x4c, 0x2b, + 0x4c, 0x0d, 0x8a, 0x36, + 0x29, 0xb5, 0xd0, 0x9c, 0x96, 0x15, 0x7f, 0xd9, 0xd0, 0xfa, 0xa9, 0x6e, + 0x7a, 0x9c, 0xe9, 0x48, + 0xb5, 0x32, 0xac, 0xf7, 0x0d, 0x38, 0xf8, 0xe3, 0x7c, 0x0b, 0xde, 0x9f, + 0x13, 0x2b, 0x0c, 0xe2, + 0xb9, 0x40, 0xde, 0x64, 0xbc, 0x79, 0x0d, 0xce, 0x17, 0xe9, 0x1f, 0x19, + 0x59, 0xd2, 0xf4, 0xaf, + 0x70, 0x8a, 0x60, 0xd5, 0xf7, 0x33, 0x68, 0xa6, 0x55, 0x6c, 0x9c, 0x16, + 0xb7, 0x56, 0xaa, 0x98, + 0x56, 0xec, 0x7c, 0xca, 0x6b, 0x18, 0x47, 0xa9, 0x16, 0x8f, 0x35, 0x06, + 0xf0, 0x5c, 0x78, 0xde, + 0xe4, 0xb8, 0x74, 0xc8, 0x39, 0x5f, 0xb2, 0xbc, 0x8b, 0x1d, 0xeb, 0x84, + 0x7e, 0xc0, 0xb5, 0x35, + 0x21, 0xfd, 0x23, 0x23, 0xbb, 0xf1, 0xfa, 0xc7, 0xce, 0x72, 0xae, 0xfd, + 0x8f, 0x67, 0x5a, 0x45, + 0xe7, 0x2f, 0x4b, 0x63, 0x89, 0x28, 0x4e, 0x8b, 0xad, 0x95, 0x67, 0x38, + 0xa6, 0x95, 0x9f, 0xdf, + 0xbf, 0xc6, 0x73, 0x71, 0x71, 0xbe, 0xa4, 0xf3, 0x83, 0xad, 0xd7, 0x0c, + 0x5e, 0x13, 0xd2, 0x3f, + 0x32, 0xb2, 0x1b, 0xaf, 0x7f, 0xb3, 0x72, 0x13, 0xea, 0x92, 0x37, 0x67, + 0xa2, 0x2e, 0x19, 0x19, + 0xd7, 0x43, 0x33, 0xad, 0x22, 0x70, 0x5a, 0x10, 0xfa, 0xe7, 0xd4, 0xeb, + 0x21, 0x98, 0x56, 0xd2, + 0xb8, 0xde, 0x8a, 0x83, 0x7f, 0x5e, 0x5d, 0xd5, 0x25, 0xba, 0xe7, 0x07, + 0x7b, 0x38, 0xf8, 0x82, + 0xdf, 0xbf, 0x5e, 0x23, 0x43, 0xfa, 0x47, 0x46, 0x76, 0xe3, 0xf5, 0x6f, + 0xb1, 0xdb, 0x70, 0x72, + 0x05, 0x17, 0x3b, 0x7b, 0xa0, 0x45, 0xc5, 0x59, 0x56, 0xca, 0x73, 0xb1, + 0xe2, 0x7a, 0x68, 0xfe, + 0x72, 0x5c, 0x9c, 0x16, 0x9f, 0x56, 0x86, 0x7f, 0xed, 0x28, 0x02, 0xbf, + 0xff, 0x24, 0x5f, 0x53, + 0xe4, 0x4d, 0x5a, 0x9c, 0xf3, 0x35, 0x20, 0xfd, 0x23, 0x23, 0x4b, 0x9c, + 0xfe, 0x0d, 0xf4, 0x8e, + 0x53, 0x97, 0x7c, 0xd7, 0xce, 0x15, 0x54, 0xa4, 0x3c, 0x97, 0xd8, 0xe3, + 0x7a, 0x48, 0x4e, 0x8b, + 0x9d, 0x77, 0xe1, 0xf5, 0x7a, 0x31, 0x31, 0xad, 0xf8, 0x5c, 0x4e, 0xbb, + 0xf7, 0x4d, 0x32, 0x3f, + 0x98, 0xaf, 0x05, 0xd3, 0xe7, 0xad, 0x63, 0x7f, 0xbf, 0x09, 0xe9, 0x1f, + 0x19, 0x59, 0x62, 0xf2, + 0x1f, 0x47, 0x6c, 0xff, 0x4f, 0x37, 0x9b, 0xbc, 0x8e, 0x38, 0x84, 0xe7, + 0x02, 0x1c, 0x7c, 0x1e, + 0xd7, 0x53, 0xf5, 0x56, 0xd8, 0x71, 0xbd, 0x98, 0x38, 0x2d, 0x56, 0x5c, + 0x2f, 0x02, 0xd3, 0xea, + 0xea, 0x73, 0x39, 0x9d, 0xf9, 0xc1, 0x61, 0xfd, 0x26, 0xfd, 0xcb, 0x0e, + 0xe9, 0x1f, 0x19, 0x59, + 0x82, 0xf2, 0xbf, 0x56, 0xbd, 0x5e, 0xaa, 0xbf, 0xe2, 0xb9, 0xc0, 0x79, + 0xcb, 0xcf, 0xc1, 0x2f, + 0x9c, 0x56, 0x0e, 0x2a, 0xc7, 0xfa, 0x61, 0x68, 0xde, 0x34, 0x3a, 0x7f, + 0x59, 0xad, 0x7f, 0x76, + 0x5c, 0xcf, 0x8c, 0x89, 0x69, 0x85, 0x98, 0xcb, 0x99, 0x82, 0xf7, 0xc7, + 0xf4, 0x79, 0xad, 0xdf, + 0x64, 0x4e, 0xfc, 0x67, 0x32, 0xb2, 0x24, 0xe9, 0x5f, 0x40, 0x5c, 0x8f, + 0xe7, 0x0a, 0xd6, 0x39, + 0xf8, 0xec, 0x0a, 0xe3, 0xb9, 0xb8, 0xe2, 0x7a, 0xaa, 0x1a, 0x19, 0x24, + 0xa7, 0xc5, 0xaf, 0x95, + 0xe1, 0x71, 0x3d, 0xce, 0xb4, 0x4a, 0xa3, 0x7a, 0xdf, 0x94, 0x1c, 0x2d, + 0x51, 0xc3, 0x78, 0xb0, + 0xe1, 0x9f, 0x1f, 0x4c, 0xfa, 0x47, 0x46, 0x96, 0x28, 0xfd, 0x0b, 0x67, + 0xd5, 0xaf, 0x7a, 0x2c, + 0x80, 0x19, 0x50, 0x0d, 0xe3, 0xb9, 0x40, 0xde, 0xc4, 0x8a, 0xeb, 0xe1, + 0x6a, 0x64, 0x54, 0x9c, + 0x96, 0x48, 0x71, 0x3d, 0x8b, 0x69, 0xa5, 0xe1, 0x98, 0x56, 0xa8, 0x1a, + 0xc6, 0xfc, 0xc1, 0xda, + 0x5a, 0x1c, 0x5d, 0x76, 0x49, 0xff, 0xc8, 0xc8, 0x92, 0xa3, 0x7f, 0xe9, + 0xa5, 0x8a, 0x69, 0x25, + 0xf4, 0x05, 0xe2, 0x7a, 0xa5, 0xb9, 0xde, 0x90, 0xf2, 0x5c, 0x20, 0x6f, + 0x32, 0xcd, 0x37, 0xab, + 0xe0, 0x4b, 0xf7, 0xc2, 0xf5, 0x25, 0xcc, 0x57, 0xf5, 0xb3, 0x9f, 0xa3, + 0xb0, 0xea, 0x8b, 0x71, + 0xcd, 0xe5, 0x94, 0xae, 0x09, 0xe5, 0x3f, 0xc8, 0xc8, 0x92, 0xa4, 0x7f, + 0xd9, 0xe3, 0xaa, 0xba, + 0x5e, 0xcf, 0x62, 0xd5, 0xe7, 0x6d, 0xbf, 0x51, 0xc2, 0x73, 0x01, 0x6d, + 0x81, 0xb8, 0x99, 0x7c, + 0x7e, 0xf0, 0xaa, 0x46, 0x46, 0xd6, 0xcf, 0x01, 0x0c, 0x84, 0xcc, 0x38, + 0xdd, 0xb1, 0x39, 0xf8, + 0xca, 0xde, 0x37, 0x3b, 0xae, 0x17, 0xeb, 0x5c, 0x4e, 0x58, 0x93, 0xa0, + 0x7e, 0x40, 0xd2, 0x3f, + 0x32, 0xb2, 0x24, 0xe9, 0x5f, 0x44, 0xa6, 0x55, 0x67, 0x3d, 0x6f, 0xea, + 0xca, 0x9b, 0xac, 0xcd, + 0x0f, 0xf7, 0xcd, 0x0f, 0xb6, 0x74, 0x67, 0x33, 0x84, 0xbf, 0xec, 0x66, + 0x3f, 0x03, 0x07, 0xbf, + 0x70, 0x5a, 0xa9, 0x95, 0x97, 0xd9, 0xba, 0x16, 0x76, 0xa6, 0x8c, 0xc2, + 0xb4, 0xba, 0xc0, 0x71, + 0xbe, 0xca, 0x81, 0x6b, 0x42, 0xfa, 0x47, 0x46, 0x96, 0x20, 0xfd, 0x8b, + 0xc0, 0xb4, 0x52, 0xd6, + 0xa0, 0x18, 0x59, 0xf0, 0x1b, 0x2f, 0x4a, 0xfb, 0x45, 0x05, 0x07, 0xbf, + 0x18, 0xe2, 0xab, 0x02, + 0x03, 0x21, 0xbb, 0x58, 0xf1, 0x60, 0xe0, 0xe7, 0x54, 0xc3, 0x78, 0x2e, + 0xee, 0xb8, 0x1e, 0x8e, + 0xdf, 0x8f, 0x9a, 0xcb, 0x19, 0xbc, 0x26, 0xa4, 0x7f, 0x64, 0x64, 0x89, + 0xd1, 0xbf, 0x28, 0x4c, + 0x2b, 0xa8, 0xd7, 0xc3, 0xd4, 0xa0, 0x70, 0xbf, 0x51, 0x3e, 0x3f, 0x18, + 0x7a, 0x2c, 0xac, 0x7e, + 0x93, 0x86, 0x95, 0x37, 0x31, 0x82, 0xe2, 0x79, 0x36, 0x07, 0x1f, 0xbe, + 0x76, 0x55, 0xa3, 0x1d, + 0xc0, 0x73, 0x81, 0xef, 0xe7, 0xbd, 0xc9, 0x58, 0xa6, 0xd5, 0x75, 0x38, + 0x5f, 0xa4, 0x7f, 0x64, + 0x64, 0x89, 0xd1, 0x3f, 0x2b, 0xae, 0x87, 0x63, 0x5a, 0x95, 0x70, 0x4c, + 0x2b, 0x7f, 0x5c, 0xcf, + 0x33, 0x3f, 0xd8, 0xd7, 0x63, 0x71, 0xb1, 0xb3, 0x97, 0x67, 0x3e, 0x2e, + 0x70, 0xee, 0xb5, 0x23, + 0xcd, 0x08, 0x88, 0xcb, 0xf1, 0xb8, 0x5e, 0x71, 0x9e, 0xab, 0x4b, 0x79, + 0x2e, 0x50, 0x97, 0x3c, + 0x2d, 0x34, 0xa1, 0x46, 0x46, 0x8b, 0x83, 0xdf, 0x1f, 0xba, 0x26, 0xa4, + 0x7f, 0x64, 0x64, 0xc9, + 0xd1, 0xbf, 0x98, 0x99, 0x56, 0x10, 0xd7, 0x0b, 0xeb, 0x7d, 0x83, 0xbc, + 0xc9, 0xa4, 0xd0, 0xe4, + 0xe7, 0x38, 0x4b, 0xcb, 0x4a, 0x67, 0xb9, 0x3a, 0x67, 0x3f, 0x33, 0x9f, + 0x17, 0x38, 0xf8, 0x7e, + 0xed, 0x74, 0xf7, 0xbe, 0x71, 0x9e, 0xcb, 0x34, 0xdf, 0x5c, 0xe7, 0xe0, + 0x97, 0xf7, 0x80, 0x8f, + 0xbf, 0x39, 0x93, 0xf2, 0x5c, 0x44, 0x5c, 0xef, 0xac, 0x7a, 0x50, 0x9e, + 0x5f, 0x81, 0xdf, 0x4f, + 0xfa, 0x47, 0x46, 0x96, 0x3c, 0xfd, 0xb3, 0x58, 0xf5, 0xf1, 0xd4, 0xeb, + 0x21, 0x39, 0x2d, 0xf0, + 0x9a, 0x4c, 0xaf, 0xd2, 0x03, 0x91, 0x37, 0xc9, 0xcd, 0xb3, 0x2d, 0xdd, + 0x35, 0xf3, 0xd2, 0xa7, + 0x97, 0x86, 0x24, 0xae, 0xe7, 0xe1, 0xe0, 0xbb, 0xb5, 0xd0, 0xe1, 0xb9, + 0xcc, 0xdc, 0x3c, 0x17, + 0x27, 0xd6, 0xb9, 0xaf, 0xec, 0x4d, 0x1e, 0x84, 0xd5, 0x30, 0x92, 0xfe, + 0x91, 0x91, 0x25, 0x46, + 0xff, 0x90, 0xac, 0x7a, 0x2c, 0xd3, 0x6a, 0x1b, 0xc3, 0xb4, 0x5a, 0xe7, + 0xb4, 0x18, 0xd0, 0x7b, + 0x9b, 0x1a, 0xa5, 0x3b, 0xc0, 0xc1, 0xf7, 0xe6, 0x35, 0xd2, 0x5d, 0x35, + 0xab, 0x5e, 0x33, 0x74, + 0x78, 0x7f, 0xcc, 0x3f, 0x0f, 0x8a, 0x35, 0xae, 0xf2, 0x26, 0xe9, 0x4e, + 0x14, 0x7e, 0x7f, 0x70, + 0x8d, 0x0c, 0xe9, 0x1f, 0x19, 0x59, 0x52, 0xf4, 0x2f, 0x12, 0xab, 0x7e, + 0x81, 0x9c, 0xab, 0x76, + 0x3d, 0x4e, 0x8b, 0x57, 0x73, 0x06, 0x99, 0x2e, 0xa6, 0x4f, 0x18, 0xea, + 0xf5, 0xaa, 0xf0, 0xfe, + 0xa4, 0x3c, 0x17, 0xc8, 0x9b, 0x6c, 0x1d, 0x40, 0x5c, 0x6f, 0x73, 0x9a, + 0x69, 0xca, 0xe6, 0x07, + 0xab, 0xd7, 0x84, 0xf4, 0x8f, 0x8c, 0xec, 0xc6, 0xeb, 0x5f, 0x4f, 0xe4, + 0x1a, 0xb4, 0x58, 0x99, + 0x56, 0xc0, 0x5f, 0xde, 0xc5, 0x70, 0x5a, 0x10, 0xb3, 0xe6, 0xec, 0xb3, + 0x62, 0xb6, 0x83, 0x9b, + 0xcb, 0xb9, 0xbb, 0x56, 0xc3, 0xe8, 0xe1, 0xb9, 0xd8, 0x79, 0x93, 0xa7, + 0xc2, 0xe7, 0x07, 0xab, + 0x63, 0x9d, 0xa4, 0x7f, 0x64, 0x64, 0x37, 0x5e, 0xff, 0x26, 0x5b, 0x2d, + 0x5e, 0x97, 0xbc, 0x74, + 0x7a, 0xcb, 0x42, 0xfd, 0x4b, 0x14, 0xab, 0x3e, 0x4e, 0x4e, 0x8b, 0xfd, + 0xca, 0x63, 0xbd, 0x83, + 0xd0, 0x4a, 0x25, 0xbf, 0x9f, 0xe7, 0x4d, 0x66, 0xc5, 0x06, 0xef, 0xd5, + 0x0b, 0x99, 0x1f, 0x0c, + 0x5a, 0x68, 0x71, 0xbe, 0x6a, 0xa4, 0x7f, 0x64, 0x64, 0x09, 0xd5, 0x3f, + 0xe0, 0x3f, 0xdf, 0x85, + 0x1c, 0x6c, 0x65, 0xaf, 0x7a, 0xb1, 0xb5, 0x2f, 0xe5, 0xb9, 0x58, 0x71, + 0x3d, 0x14, 0xab, 0x3e, + 0x4e, 0x4e, 0x8b, 0xe3, 0x8b, 0xea, 0xed, 0xf8, 0xe6, 0x72, 0xe6, 0x79, + 0x5c, 0x2f, 0x3d, 0xcc, + 0xb4, 0x1d, 0x9e, 0x4b, 0x00, 0x07, 0x3f, 0x7f, 0x52, 0x3e, 0x04, 0xce, + 0x57, 0x70, 0xbf, 0x09, + 0xe9, 0x1f, 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0x71, 0xa9, 0xe5, 0xf4, 0xed, + 0x7a, 0x73, 0x05, 0xb5, + 0xc2, 0x44, 0xf7, 0x72, 0xf0, 0x8f, 0xd2, 0x28, 0x56, 0x7d, 0xac, 0x9c, + 0x16, 0xc7, 0x17, 0xcd, + 0xb5, 0x31, 0x73, 0x39, 0x31, 0x4c, 0xab, 0x75, 0xce, 0x57, 0xf0, 0xfc, + 0x60, 0xde, 0x6f, 0x72, + 0x5b, 0xd6, 0x6f, 0x42, 0xfa, 0x47, 0x46, 0x96, 0x88, 0xfc, 0xc7, 0x51, + 0xaa, 0x0b, 0xf5, 0x2a, + 0xe5, 0xf3, 0xad, 0x03, 0x87, 0x77, 0xfa, 0x94, 0xcd, 0x7e, 0x76, 0xf5, + 0x58, 0x30, 0x8d, 0xc0, + 0xf3, 0x97, 0x71, 0x35, 0x32, 0xca, 0x59, 0x73, 0x76, 0xdd, 0xcd, 0x3c, + 0xd7, 0xc2, 0xce, 0xe5, + 0xcc, 0x5c, 0xa7, 0x86, 0xd1, 0xce, 0x9b, 0x2c, 0x4b, 0xf5, 0xd0, 0x7e, + 0x13, 0xe2, 0x5f, 0x91, + 0x91, 0x25, 0x24, 0xff, 0x2b, 0xb4, 0x08, 0xfc, 0x46, 0x8d, 0x9d, 0xa1, + 0xa0, 0x87, 0xa2, 0x78, + 0xba, 0x5d, 0x73, 0x78, 0xa7, 0x4e, 0xae, 0x60, 0xeb, 0x00, 0xfa, 0x6f, + 0x73, 0x63, 0x39, 0xcf, + 0x05, 0x1d, 0xd7, 0xc3, 0x72, 0x5a, 0xac, 0xb3, 0x62, 0x66, 0x99, 0x6b, + 0x95, 0xe2, 0x62, 0x5a, + 0x45, 0x98, 0xcb, 0x59, 0x5a, 0x48, 0xfa, 0x4d, 0x66, 0x97, 0x4d, 0xd2, + 0x3f, 0x32, 0xb2, 0x04, + 0xe8, 0x9f, 0x84, 0x55, 0xaf, 0xf5, 0x81, 0x77, 0xec, 0xeb, 0xdb, 0x65, + 0x7f, 0x42, 0x7c, 0x0c, + 0x72, 0x05, 0x41, 0x3c, 0x17, 0x3b, 0xae, 0x57, 0x5d, 0xa6, 0x50, 0xbe, + 0xaa, 0x8a, 0xd3, 0x62, + 0x6b, 0x91, 0xbe, 0xcc, 0x35, 0x95, 0x71, 0xbd, 0x48, 0x4c, 0x2b, 0xe4, + 0x5c, 0xce, 0x81, 0xab, + 0xdf, 0xc4, 0x3d, 0x3f, 0x78, 0x41, 0xfc, 0x67, 0x32, 0xb2, 0x64, 0xf8, + 0xbf, 0xca, 0xde, 0x37, + 0x23, 0xc5, 0x7c, 0xdf, 0xc2, 0x49, 0xb9, 0x06, 0xf9, 0x01, 0x27, 0x56, + 0x78, 0x57, 0xb0, 0x9f, + 0xfd, 0x1c, 0xfc, 0x42, 0x08, 0xd3, 0xca, 0x5d, 0x23, 0x83, 0xe1, 0xb4, + 0xd8, 0x79, 0x0d, 0xfd, + 0x38, 0xd7, 0x8c, 0x1e, 0xd7, 0x93, 0xd5, 0xc8, 0xe0, 0xe7, 0x72, 0x06, + 0x70, 0xbe, 0x44, 0xbf, + 0xc9, 0x80, 0xe6, 0x1f, 0x91, 0x91, 0x25, 0x42, 0xff, 0x90, 0x33, 0x28, + 0x35, 0xc1, 0x8c, 0xaa, + 0xa5, 0x47, 0x7a, 0xbb, 0xe0, 0xe6, 0x9d, 0xfa, 0x7a, 0x2c, 0x78, 0x0d, + 0xca, 0x24, 0xd5, 0x94, + 0xcd, 0x0f, 0x5e, 0xf9, 0xaa, 0xe5, 0x3d, 0x85, 0xaf, 0x2a, 0xfe, 0xdb, + 0x51, 0xca, 0x80, 0x7e, + 0xb8, 0x4c, 0x4c, 0xbd, 0xc9, 0xc5, 0x58, 0xe6, 0x72, 0x52, 0xfe, 0x83, + 0x8c, 0x2c, 0x11, 0xfa, + 0x67, 0xcf, 0xa0, 0x8c, 0x5a, 0xaf, 0xc7, 0x7c, 0xc4, 0xec, 0x38, 0xdf, + 0xf2, 0xcc, 0x89, 0xb3, + 0xf2, 0xa6, 0x30, 0x33, 0x53, 0x36, 0x3f, 0x78, 0xe5, 0xab, 0x86, 0xf7, + 0x73, 0x00, 0x03, 0x21, + 0x35, 0xd0, 0xba, 0x5a, 0x3f, 0xd5, 0x05, 0x2e, 0x82, 0xea, 0xfd, 0x71, + 0x56, 0xfd, 0x29, 0xae, + 0x46, 0xa6, 0x88, 0xe8, 0x7d, 0x0b, 0x5f, 0x13, 0xd2, 0x3f, 0x32, 0xb2, + 0x24, 0xe8, 0x9f, 0x06, + 0xf5, 0x7a, 0x57, 0x65, 0x5a, 0xd9, 0x67, 0x43, 0x2b, 0x6f, 0x52, 0x72, + 0xf3, 0x4e, 0x5d, 0x3d, + 0x16, 0x6b, 0x1c, 0xfc, 0x89, 0xba, 0x46, 0x86, 0x73, 0x4f, 0x81, 0x07, + 0x33, 0xcf, 0xb6, 0x38, + 0x03, 0x3a, 0x84, 0xe7, 0x22, 0xe2, 0x7a, 0x15, 0x09, 0xab, 0x3e, 0x20, + 0xae, 0xa7, 0x98, 0xcb, + 0xa9, 0x5e, 0x13, 0xd2, 0x3f, 0x32, 0xb2, 0x44, 0xe8, 0x1f, 0xd4, 0xeb, + 0x21, 0xfc, 0xc6, 0x28, + 0x71, 0xbd, 0xcd, 0xc5, 0x66, 0xdd, 0x9f, 0x37, 0xb1, 0x7b, 0x2c, 0x78, + 0xde, 0x64, 0xbe, 0x5d, + 0xb7, 0x5e, 0x53, 0x7e, 0xfe, 0x9b, 0xaf, 0xd8, 0xcf, 0xf0, 0xa7, 0xc3, + 0x8e, 0xe6, 0x3c, 0x97, + 0x74, 0xdb, 0x5f, 0x97, 0x2c, 0xe2, 0x7a, 0xd7, 0x61, 0x5a, 0xb9, 0x7c, + 0x69, 0xe5, 0x5c, 0x4e, + 0xd2, 0x3f, 0x32, 0xb2, 0x24, 0xe8, 0x5f, 0x44, 0xa6, 0x95, 0xa2, 0x06, + 0x25, 0xcf, 0x6b, 0x50, + 0x2c, 0x5d, 0xe3, 0x79, 0x93, 0xbc, 0x8f, 0x77, 0x2a, 0x7a, 0x2c, 0x2a, + 0x7b, 0xbb, 0xaa, 0x7e, + 0x13, 0xe8, 0x4b, 0x66, 0xbe, 0x6f, 0x7a, 0xa6, 0xb7, 0x73, 0x27, 0x7a, + 0xb3, 0x2a, 0xe5, 0xb9, + 0x30, 0xff, 0x9a, 0x7d, 0x3f, 0xc4, 0xf5, 0x94, 0x35, 0x32, 0xc8, 0x58, + 0xa7, 0x7a, 0x4d, 0x48, + 0xff, 0xc8, 0xc8, 0x92, 0xa0, 0x7f, 0x22, 0xae, 0x87, 0xab, 0x07, 0x29, + 0xe0, 0x99, 0x56, 0x86, + 0x5f, 0x3f, 0xad, 0xba, 0x62, 0x0f, 0x83, 0xc0, 0xdd, 0x6f, 0xa2, 0x8f, + 0x52, 0x6d, 0x2d, 0xc0, + 0xbf, 0x85, 0xde, 0xdf, 0xdc, 0x3c, 0xd5, 0x0e, 0x66, 0x47, 0x5b, 0x75, + 0xc9, 0xcb, 0xc2, 0x21, + 0xaf, 0x61, 0x1c, 0x6b, 0xad, 0xd0, 0x38, 0x21, 0x67, 0x5a, 0xa9, 0x63, + 0x9d, 0x59, 0xe5, 0x9a, + 0x90, 0xfe, 0x91, 0x91, 0x25, 0x41, 0xff, 0x22, 0x31, 0xad, 0x06, 0x98, + 0xde, 0x37, 0x05, 0xa7, + 0xa5, 0x97, 0xe2, 0x67, 0xb5, 0x0a, 0x3b, 0xff, 0xb9, 0xf3, 0x26, 0xa5, + 0xd3, 0x5c, 0x1d, 0xd8, + 0xcf, 0xd9, 0x69, 0xba, 0x0d, 0x1c, 0xfc, 0x95, 0x2f, 0x9a, 0x6b, 0xe7, + 0xa6, 0x5a, 0x7b, 0x15, + 0x6b, 0x0c, 0xe0, 0xb9, 0xdc, 0xb5, 0xf2, 0x2e, 0x30, 0x67, 0x4e, 0xc2, + 0x73, 0xc1, 0xc5, 0xf5, + 0xd4, 0xb1, 0x4e, 0xd2, 0x3f, 0x32, 0xb2, 0xc4, 0xe8, 0x1f, 0x3a, 0xae, + 0x57, 0xc5, 0xcc, 0x55, + 0xc3, 0x31, 0xad, 0x38, 0x47, 0x0b, 0x7c, 0xd5, 0x55, 0xde, 0x64, 0xbb, + 0xc6, 0xf9, 0xf7, 0xa7, + 0x56, 0xbc, 0xef, 0x78, 0xc5, 0x7f, 0x86, 0xde, 0x37, 0x7d, 0xac, 0x05, + 0xea, 0xee, 0x8a, 0x83, + 0xbf, 0x75, 0x58, 0x55, 0xf0, 0x5c, 0xb8, 0x3f, 0x3d, 0x8d, 0xc0, 0xef, + 0x0f, 0x5d, 0x13, 0xd2, + 0x3f, 0x32, 0xb2, 0x9b, 0xaf, 0x7f, 0x51, 0xe2, 0x7a, 0x88, 0xb9, 0x6a, + 0xcb, 0xab, 0xcf, 0x55, + 0xd3, 0xfa, 0x5a, 0x37, 0x35, 0x4e, 0x8b, 0x99, 0x97, 0xa7, 0x8e, 0xfe, + 0x19, 0x99, 0x45, 0xae, + 0x95, 0x1d, 0x2a, 0xea, 0xa4, 0xf9, 0xdc, 0xb7, 0xca, 0x5b, 0x0a, 0xb3, + 0x42, 0xbd, 0x14, 0x3c, + 0x73, 0x53, 0x70, 0xf0, 0x17, 0xb8, 0xde, 0x64, 0x8b, 0xf3, 0xd5, 0x22, + 0xfd, 0x23, 0x23, 0x4b, + 0xb0, 0xfe, 0x61, 0xfb, 0x70, 0xa5, 0x71, 0x3d, 0xaf, 0x89, 0xde, 0xb7, + 0x6b, 0x73, 0x5a, 0x78, + 0xde, 0xc3, 0xd6, 0xa2, 0xec, 0x32, 0xd7, 0x4c, 0x0f, 0x14, 0xfa, 0x67, + 0xc5, 0xf5, 0xec, 0xef, + 0x09, 0xe2, 0xb9, 0x40, 0xac, 0xb1, 0x7c, 0x0b, 0x38, 0x5f, 0xa5, 0x7d, + 0xe9, 0xfc, 0x60, 0x74, + 0xac, 0x93, 0xf4, 0x8f, 0x8c, 0xec, 0xc6, 0xeb, 0x9f, 0xa5, 0x45, 0xaa, + 0x7a, 0x10, 0x3c, 0xd3, + 0xaa, 0x7a, 0xa0, 0xe4, 0xb4, 0x1c, 0xe1, 0x38, 0x2d, 0xf6, 0x59, 0x11, + 0x7a, 0xdf, 0xd2, 0xaa, + 0xf7, 0x27, 0x9b, 0xcb, 0xe9, 0xe6, 0xe0, 0x5f, 0x54, 0xf6, 0xab, 0xaa, + 0xf9, 0xc1, 0xe8, 0x58, + 0x27, 0xe9, 0x1f, 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0x61, 0xbe, 0x03, 0xb5, + 0x28, 0xfa, 0x80, 0xe7, + 0x17, 0x8c, 0xd0, 0xb8, 0xde, 0x69, 0x5e, 0xe9, 0x37, 0x16, 0x31, 0x4c, + 0x2b, 0x3e, 0xf7, 0x4d, + 0xcd, 0x69, 0x11, 0x5a, 0xa4, 0xf1, 0xde, 0xb7, 0xd4, 0x51, 0xf8, 0xd7, + 0x62, 0x7a, 0xdf, 0x20, + 0xd6, 0x58, 0x3c, 0xdf, 0xdd, 0x87, 0xb8, 0xa0, 0x74, 0x7e, 0x30, 0xe4, + 0x4d, 0x86, 0xd9, 0x90, + 0xb9, 0x6f, 0xa4, 0x7f, 0x64, 0x64, 0x89, 0xd1, 0xbf, 0x79, 0xb5, 0x01, + 0x7e, 0xe1, 0xce, 0xb9, + 0x9c, 0xe7, 0xb2, 0x8a, 0xeb, 0x21, 0x98, 0x56, 0xb7, 0x76, 0xf7, 0x10, + 0x73, 0xd5, 0x50, 0x9c, + 0x16, 0xa1, 0x7f, 0x29, 0x83, 0xf7, 0xbe, 0xc5, 0xc2, 0xb4, 0xda, 0x10, + 0xb1, 0x4e, 0xe0, 0x7c, + 0xf9, 0x79, 0x2e, 0x9e, 0xbc, 0x49, 0x89, 0x73, 0xbe, 0xf4, 0x51, 0x58, + 0xbf, 0x09, 0xe9, 0x1f, + 0x19, 0xd9, 0x8d, 0xd7, 0xbf, 0xe9, 0x4e, 0x73, 0xf7, 0xae, 0x77, 0x7e, + 0x38, 0xf4, 0x58, 0x6c, + 0xce, 0xbc, 0x75, 0xc9, 0xfa, 0x71, 0x2c, 0x71, 0x3d, 0xdb, 0x57, 0x45, + 0x71, 0x5a, 0xc4, 0x59, + 0x31, 0xdd, 0x85, 0xde, 0xb7, 0x0d, 0x4c, 0xbd, 0x1e, 0x96, 0x69, 0xe5, + 0xed, 0x7d, 0x13, 0x3c, + 0x97, 0x35, 0x0e, 0xfe, 0xee, 0x2a, 0x6f, 0x32, 0x5d, 0x9b, 0x1f, 0x4c, + 0xfa, 0x47, 0x46, 0x96, + 0x04, 0xfd, 0x9b, 0x6c, 0xf1, 0xb8, 0x59, 0x6e, 0x2e, 0x38, 0x7f, 0xde, + 0x1e, 0x8b, 0xb2, 0xc3, + 0xc1, 0x87, 0xb9, 0x6a, 0xdb, 0x4a, 0xfe, 0x72, 0x16, 0xd7, 0x5b, 0x86, + 0xe4, 0xb4, 0x88, 0xb3, + 0x22, 0xd3, 0xa6, 0x45, 0x46, 0xc9, 0x88, 0xc6, 0xd6, 0x30, 0x86, 0xf3, + 0xfb, 0x45, 0xde, 0xa4, + 0x70, 0xbc, 0x53, 0xdb, 0xbd, 0x53, 0x79, 0x4b, 0x68, 0xbf, 0x89, 0x79, + 0x69, 0x90, 0xfe, 0x91, + 0x91, 0x25, 0xe0, 0xfc, 0x67, 0xd7, 0x83, 0xf4, 0xac, 0x1e, 0x8d, 0xa0, + 0x1e, 0x0b, 0x76, 0xae, + 0xdb, 0x39, 0xd9, 0xac, 0x49, 0x79, 0x2e, 0x76, 0x0d, 0x0a, 0x86, 0xbf, + 0xbc, 0xc4, 0xf9, 0xaa, + 0x5c, 0x91, 0x78, 0xef, 0x47, 0x5a, 0xa5, 0x7f, 0xd8, 0xb9, 0x9c, 0x11, + 0x38, 0x5f, 0x85, 0x03, + 0xf9, 0xfc, 0xe0, 0x9d, 0xfd, 0xad, 0xc9, 0x65, 0x8b, 0xf4, 0x8f, 0x8c, + 0xec, 0x86, 0xeb, 0xdf, + 0xac, 0xd2, 0x08, 0x8c, 0xeb, 0xd9, 0x3d, 0x16, 0x9c, 0xf3, 0x57, 0x11, + 0x73, 0x30, 0xee, 0xda, + 0x33, 0x41, 0x02, 0x78, 0x2e, 0xbc, 0x46, 0x66, 0xb3, 0x8d, 0xe3, 0x2f, + 0x33, 0x5f, 0x75, 0xa9, + 0xf2, 0x55, 0x35, 0xa1, 0x7f, 0x13, 0xa6, 0x7f, 0xb3, 0x54, 0x5b, 0xf5, + 0xb5, 0xf8, 0xb9, 0x9c, + 0xd1, 0x39, 0x5f, 0x81, 0xfd, 0x26, 0xc4, 0x7f, 0x26, 0x23, 0x4b, 0x44, + 0xfe, 0x43, 0x15, 0xd7, + 0xd3, 0x06, 0x7a, 0x1b, 0xce, 0x7f, 0x5b, 0xa7, 0x5b, 0x35, 0xa7, 0x5f, + 0xcd, 0xe6, 0xb9, 0xb8, + 0xf3, 0x26, 0xd3, 0x52, 0x63, 0xf7, 0x02, 0x33, 0xa3, 0x1c, 0xc1, 0x69, + 0xb1, 0xf4, 0xcf, 0xdf, + 0xfb, 0x16, 0x21, 0xae, 0xb7, 0x6e, 0xc8, 0xde, 0xb7, 0xb0, 0xb9, 0x9c, + 0x4e, 0xde, 0x64, 0x7c, + 0xd9, 0x26, 0xfd, 0x23, 0x23, 0xbb, 0xe9, 0xfa, 0xb7, 0xdb, 0xd8, 0x99, + 0x6e, 0xa0, 0xea, 0xf5, + 0xc0, 0x6f, 0x84, 0x5c, 0x81, 0xcd, 0xf9, 0xab, 0xf8, 0x7b, 0x2c, 0xce, + 0xb6, 0x0f, 0xa0, 0xf7, + 0x57, 0xb0, 0xa9, 0x34, 0x29, 0x4b, 0x1f, 0xc5, 0x5f, 0x3e, 0x4a, 0x71, + 0xfd, 0x4b, 0xcf, 0xe4, + 0xbd, 0x6f, 0xfe, 0xf7, 0xf7, 0x60, 0xe7, 0x72, 0x52, 0xfe, 0x83, 0x8c, + 0xec, 0xc6, 0xeb, 0xdf, + 0x62, 0xb7, 0x71, 0xb5, 0xb9, 0x6a, 0x76, 0x8f, 0x85, 0x7f, 0x3e, 0x92, + 0x37, 0x6f, 0x92, 0xf1, + 0xf7, 0x58, 0x60, 0x67, 0x94, 0xf7, 0xd3, 0x4c, 0x6b, 0x53, 0xdd, 0xb4, + 0xe8, 0x7d, 0x0b, 0xd7, + 0x3f, 0x24, 0xd3, 0x2a, 0xde, 0xb9, 0x9c, 0xa4, 0x7f, 0x64, 0x64, 0x49, + 0xd0, 0xbf, 0x02, 0x6a, + 0xae, 0x5a, 0x48, 0xef, 0x9b, 0x95, 0x37, 0xd9, 0x3c, 0xab, 0x1e, 0x80, + 0x4e, 0xba, 0x73, 0x05, + 0x95, 0x8b, 0x9d, 0x3d, 0x0f, 0x07, 0xff, 0x28, 0xd5, 0x05, 0x5f, 0x55, + 0x55, 0x23, 0xc3, 0xf3, + 0xbe, 0xc0, 0x7e, 0x66, 0x17, 0xe7, 0xc1, 0x0c, 0xb4, 0xae, 0xb4, 0x16, + 0x4f, 0xc9, 0xaa, 0x0f, + 0x8e, 0xeb, 0xc9, 0x7c, 0x69, 0xdc, 0x5c, 0x4e, 0xca, 0xff, 0x92, 0x91, + 0x25, 0x41, 0xff, 0xd4, + 0xf5, 0x7a, 0x08, 0xa6, 0x95, 0x55, 0x83, 0x52, 0x5e, 0x64, 0xea, 0x19, + 0x27, 0x6f, 0xe2, 0xea, + 0xb1, 0xb0, 0xf3, 0x26, 0x8b, 0x7c, 0xbd, 0x7c, 0xbb, 0xca, 0xf4, 0x2f, + 0xbc, 0xdf, 0x44, 0x1b, + 0xe9, 0x5c, 0xff, 0x6c, 0xf6, 0x33, 0xfc, 0x3d, 0x88, 0xe7, 0x12, 0x39, + 0xae, 0x17, 0x17, 0xe7, + 0x8b, 0xf4, 0x8f, 0x8c, 0x2c, 0x11, 0xf1, 0x3f, 0x25, 0xd3, 0x6a, 0x86, + 0x63, 0x5a, 0x15, 0x2f, + 0x78, 0x5c, 0xaf, 0xb5, 0xca, 0x9b, 0x42, 0xae, 0x40, 0xb0, 0xa9, 0x56, + 0x79, 0x93, 0x2a, 0xaf, + 0xab, 0x0b, 0x9b, 0x1f, 0x6c, 0xd7, 0xbd, 0x68, 0xcc, 0xff, 0xe5, 0xe7, + 0x3f, 0x8b, 0x83, 0xef, + 0xe3, 0xb9, 0x38, 0x1c, 0xfc, 0xd4, 0x2c, 0x7e, 0x7e, 0xbf, 0x72, 0x4d, + 0x7a, 0xa4, 0x7f, 0x64, + 0x64, 0x49, 0xa8, 0x7f, 0x51, 0xd7, 0xeb, 0x55, 0xea, 0x57, 0x65, 0x5a, + 0xd9, 0xda, 0xc3, 0x7b, + 0x2c, 0xa6, 0x85, 0x06, 0xe4, 0x4d, 0x76, 0xd7, 0xd9, 0x54, 0x7c, 0x7e, + 0x70, 0xba, 0xaf, 0x75, + 0xed, 0x3e, 0xb7, 0xd4, 0x24, 0xd7, 0x76, 0xf7, 0xbe, 0x01, 0x0f, 0x86, + 0xf3, 0x5c, 0xce, 0xbd, + 0x3c, 0x17, 0xa8, 0x4b, 0xe6, 0x3f, 0x93, 0xe9, 0x9f, 0x55, 0x97, 0xd8, + 0x0d, 0x8b, 0xeb, 0x15, + 0x31, 0xb1, 0xce, 0x3b, 0xca, 0xb9, 0x9c, 0x66, 0xe6, 0xe8, 0xb2, 0x4b, + 0xfa, 0x47, 0x46, 0x76, + 0xc3, 0xf5, 0x6f, 0xb2, 0xd5, 0xda, 0x50, 0x31, 0xad, 0x50, 0xbd, 0x6f, + 0x29, 0xee, 0x37, 0xe6, + 0x55, 0x71, 0xbd, 0x71, 0xa9, 0x09, 0xb1, 0xc4, 0xb5, 0xbc, 0x09, 0xd3, + 0xb2, 0xe2, 0x89, 0xde, + 0xc8, 0xce, 0x32, 0xad, 0xf4, 0x30, 0xd5, 0x49, 0xcd, 0x98, 0xfe, 0xf5, + 0x03, 0x7a, 0xdf, 0x7c, + 0x3c, 0x97, 0xd5, 0x4c, 0x91, 0x8a, 0x9c, 0xe7, 0x12, 0x25, 0xae, 0x87, + 0x98, 0xcb, 0xc9, 0xd7, + 0xa4, 0x4f, 0xf3, 0xcf, 0xc9, 0xc8, 0x6e, 0xbc, 0xfe, 0x8d, 0x8a, 0x6d, + 0xd5, 0x57, 0x41, 0xbd, + 0x1e, 0x96, 0x69, 0x85, 0x9a, 0xab, 0x66, 0xfb, 0xaa, 0xbe, 0x7e, 0x93, + 0xd2, 0xb9, 0xc5, 0x7f, + 0x3e, 0x11, 0x79, 0x0f, 0x9e, 0x03, 0x59, 0xca, 0x7b, 0xdf, 0xec, 0xba, + 0xe4, 0xe2, 0x79, 0x75, + 0x1f, 0x72, 0x2d, 0x52, 0x9e, 0x0b, 0xf8, 0xd7, 0x58, 0xce, 0x17, 0x32, + 0xd6, 0x99, 0x1f, 0x92, + 0xfe, 0x91, 0x91, 0xdd, 0x78, 0xfd, 0x1b, 0xe6, 0x3b, 0x98, 0xb8, 0x1e, + 0x8a, 0x69, 0x75, 0xa7, + 0x72, 0xf5, 0xb9, 0x6a, 0x4c, 0xcb, 0xe0, 0xdc, 0x97, 0x9e, 0x66, 0xdb, + 0xfa, 0x52, 0x68, 0x20, + 0xcf, 0x81, 0x2c, 0x94, 0xbd, 0x6f, 0x26, 0x8f, 0xeb, 0xcd, 0x33, 0x75, + 0xc1, 0xc1, 0x0f, 0xe2, + 0xb9, 0x6c, 0x71, 0x9e, 0x03, 0x70, 0xbe, 0xb2, 0x03, 0x57, 0xbf, 0x4a, + 0x70, 0x8d, 0x0c, 0x22, + 0xd6, 0xa9, 0x19, 0xc5, 0x31, 0xf5, 0xbf, 0x91, 0x91, 0xdd, 0x78, 0xfd, + 0xeb, 0xeb, 0x9d, 0x6b, + 0xc4, 0xf5, 0x3c, 0x35, 0x28, 0xd0, 0xfb, 0xa6, 0xc5, 0xc1, 0x69, 0x39, + 0x12, 0x79, 0x0f, 0xde, + 0xfb, 0xab, 0xea, 0x7d, 0x5b, 0x67, 0xd5, 0x7b, 0x62, 0x8d, 0x6e, 0x0e, + 0x3e, 0xf8, 0xd8, 0x0e, + 0x07, 0x3f, 0x60, 0x7e, 0xf0, 0xaa, 0x46, 0x06, 0x11, 0xeb, 0xa4, 0xfe, + 0x5f, 0x32, 0xb2, 0x9b, + 0xaf, 0x7f, 0xbd, 0x94, 0xa1, 0xd2, 0x22, 0x4c, 0xbd, 0x1e, 0x96, 0x69, + 0x85, 0xe2, 0xb4, 0x58, + 0xcc, 0x67, 0xc8, 0x81, 0x60, 0x7b, 0xdf, 0x82, 0xe3, 0x7a, 0x2e, 0x0e, + 0x3e, 0xc4, 0x1a, 0x9f, + 0x0a, 0xe3, 0xb9, 0x6c, 0x44, 0xe2, 0x7c, 0xed, 0x4c, 0x2f, 0x9b, 0xa4, + 0x7f, 0x64, 0x64, 0x37, + 0x5c, 0xff, 0x98, 0xdf, 0x2a, 0xe5, 0xb9, 0x44, 0x89, 0xeb, 0x21, 0x99, + 0x56, 0x9b, 0xc8, 0xde, + 0x37, 0xc8, 0xfb, 0x42, 0x0e, 0x44, 0x9f, 0xa8, 0x7a, 0xdf, 0x22, 0xcc, + 0xe5, 0xbc, 0x28, 0xed, + 0x4b, 0x79, 0x2e, 0x3c, 0x6f, 0x92, 0x69, 0x01, 0xe7, 0x6b, 0x67, 0xaa, + 0xe2, 0x7c, 0xb1, 0x35, + 0x99, 0x11, 0xff, 0x80, 0x8c, 0x2c, 0x09, 0xf5, 0x2f, 0x52, 0x9e, 0x8b, + 0x2b, 0xae, 0x97, 0x8a, + 0x85, 0xbf, 0x8c, 0xe4, 0xb4, 0x40, 0xde, 0xf7, 0x58, 0x6f, 0xc2, 0xdc, + 0x4b, 0x75, 0xef, 0x9b, + 0x60, 0x5a, 0xa1, 0x6a, 0x18, 0xad, 0xb8, 0xa3, 0x87, 0xe7, 0x72, 0xcb, + 0xcb, 0xc1, 0x87, 0xb3, + 0xe4, 0xf6, 0x71, 0xe1, 0x50, 0x36, 0x3f, 0xd8, 0xa9, 0x91, 0x99, 0x93, + 0xfe, 0x91, 0x91, 0xdd, + 0x78, 0xfd, 0x03, 0xfe, 0xbd, 0x8c, 0xe7, 0x02, 0xfb, 0x7f, 0xe4, 0xb0, + 0xea, 0x43, 0x8d, 0x33, + 0xad, 0xae, 0xc6, 0x5f, 0x0e, 0x88, 0x25, 0x42, 0xde, 0x37, 0xdb, 0xca, + 0x2e, 0x73, 0xad, 0x8c, + 0x72, 0xee, 0x5b, 0x94, 0xb9, 0x9c, 0xeb, 0xbd, 0x6f, 0x1e, 0x0e, 0xfe, + 0xed, 0xaa, 0x72, 0x7e, + 0xb0, 0x55, 0x23, 0xd3, 0xde, 0x25, 0xfd, 0x23, 0x23, 0xbb, 0xf9, 0xfa, + 0xc7, 0xfc, 0xdb, 0x20, + 0x9e, 0x8b, 0xcd, 0xc1, 0x07, 0x7f, 0x11, 0xe2, 0x7a, 0x21, 0x3c, 0x17, + 0x11, 0xd7, 0xe3, 0x4c, + 0xab, 0x14, 0xaa, 0x46, 0x46, 0xc9, 0x69, 0x19, 0x65, 0x79, 0xde, 0x17, + 0x33, 0xf7, 0x8d, 0xf7, + 0xbe, 0xc5, 0x33, 0x97, 0xd3, 0x48, 0x0d, 0x2d, 0xce, 0xd7, 0x59, 0xc8, + 0xfc, 0xe0, 0x41, 0x0a, + 0x38, 0x5f, 0x4d, 0xe2, 0xff, 0x91, 0x91, 0x25, 0x40, 0xff, 0xd6, 0x72, + 0x05, 0xeb, 0x1c, 0xfc, + 0xdd, 0x3b, 0x21, 0x3c, 0x97, 0x28, 0x71, 0x3d, 0x24, 0xa7, 0x45, 0x30, + 0x9f, 0x53, 0x6d, 0x1d, + 0x31, 0xf7, 0x0d, 0xc9, 0xb4, 0xe2, 0x35, 0x32, 0xca, 0xb8, 0x9e, 0xc5, + 0xc7, 0xcf, 0xf4, 0xb5, + 0x8e, 0x6c, 0x7e, 0x30, 0xcf, 0x9b, 0x9c, 0x6e, 0xd5, 0x48, 0xff, 0xc8, + 0xc8, 0x92, 0xa4, 0x7f, + 0xde, 0xfc, 0xab, 0x5d, 0x97, 0xbc, 0x75, 0x51, 0xdd, 0xdf, 0x75, 0xcd, + 0xcc, 0xe5, 0xfb, 0x1f, + 0x72, 0x05, 0x13, 0x37, 0x07, 0x1f, 0x5b, 0x23, 0x93, 0x47, 0x71, 0x5a, + 0x34, 0x60, 0x9e, 0xce, + 0x52, 0x6d, 0x5e, 0x03, 0xa8, 0xf0, 0x6b, 0x05, 0xd3, 0x2a, 0x1f, 0x0f, + 0xd3, 0x2a, 0x88, 0xf3, + 0xe5, 0xee, 0x37, 0x71, 0xe5, 0x4d, 0x48, 0xff, 0xc8, 0xc8, 0x12, 0xaa, + 0x7f, 0x6e, 0xbf, 0xf1, + 0xb8, 0x72, 0x58, 0x3d, 0x2b, 0x1c, 0x14, 0x64, 0x3c, 0x17, 0x2b, 0x6f, + 0x02, 0x73, 0x2f, 0x55, + 0x71, 0x3d, 0x6d, 0xe5, 0xab, 0x9a, 0xe1, 0xb9, 0x0a, 0xa6, 0x7f, 0x13, + 0xad, 0x0d, 0x39, 0x90, + 0x8d, 0xb8, 0x98, 0x56, 0xec, 0xfd, 0x5d, 0x97, 0xf3, 0xe5, 0xe9, 0x37, + 0xa1, 0xf8, 0x1f, 0x19, + 0x59, 0xe2, 0xf5, 0x2f, 0x0f, 0x4c, 0xab, 0x99, 0xe0, 0x43, 0x07, 0xf3, + 0x5c, 0x76, 0x79, 0xac, + 0x10, 0xfc, 0xc6, 0xd2, 0x22, 0x57, 0xcf, 0x86, 0xcc, 0xcc, 0xc5, 0xf2, + 0x97, 0x21, 0xef, 0xab, + 0x8f, 0x36, 0x42, 0x7b, 0xdf, 0xdc, 0x71, 0x3d, 0x19, 0xab, 0xde, 0x5f, + 0x23, 0x83, 0xac, 0x61, + 0xc4, 0x71, 0xbe, 0x66, 0x54, 0xff, 0x47, 0x46, 0x96, 0x70, 0xfd, 0x93, + 0xb1, 0xea, 0x0d, 0x0f, + 0x07, 0xff, 0x4e, 0x75, 0x8d, 0xe7, 0xe2, 0x9f, 0x1f, 0xbc, 0xaa, 0x91, + 0xc9, 0x29, 0x39, 0x5a, + 0x19, 0x2b, 0xef, 0x6b, 0xf5, 0xbe, 0x85, 0x9d, 0xff, 0x70, 0xac, 0x7a, + 0x9b, 0x69, 0xd5, 0x47, + 0x71, 0xbe, 0xd6, 0xf4, 0xef, 0x83, 0x83, 0xb7, 0x1b, 0xef, 0x1d, 0xbc, + 0xd7, 0x78, 0xcf, 0xe0, + 0x3d, 0xe6, 0x7b, 0xd8, 0x9f, 0xef, 0x1d, 0xfe, 0x90, 0xf1, 0x43, 0xc3, + 0x8f, 0x1b, 0x1f, 0x87, + 0xbf, 0xaf, 0x5d, 0xef, 0x30, 0x3e, 0xd8, 0x43, 0xcc, 0x75, 0x27, 0x23, + 0x23, 0x7b, 0x30, 0xd6, + 0xfb, 0xa0, 0xf1, 0x76, 0xbe, 0x37, 0xdf, 0xc3, 0xf7, 0xf0, 0x6a, 0xaf, + 0x06, 0xef, 0xe1, 0x77, + 0x0c, 0x3e, 0x68, 0xd8, 0x71, 0x40, 0x75, 0x5c, 0x4f, 0x33, 0xd2, 0x93, + 0x62, 0x73, 0x97, 0xe9, + 0xde, 0x3a, 0x9b, 0xca, 0x9b, 0x37, 0xc9, 0xa0, 0x66, 0x94, 0x8b, 0xde, + 0x0f, 0xc8, 0xfb, 0x82, + 0xff, 0x9b, 0x01, 0xf6, 0xf3, 0x30, 0xd5, 0xd5, 0x8e, 0x34, 0x63, 0x3d, + 0x6e, 0x78, 0x8d, 0xb8, + 0x5e, 0x80, 0xf1, 0xb9, 0x9c, 0x01, 0xbd, 0x6f, 0x93, 0xd9, 0x2b, 0xcd, + 0x37, 0xcc, 0xdf, 0x60, + 0x5d, 0xdf, 0x69, 0x7e, 0x67, 0xd8, 0xb5, 0x78, 0xb9, 0x39, 0x1a, 0xd0, + 0x67, 0x8e, 0x8c, 0xec, + 0xa1, 0xb1, 0xc1, 0xc4, 0x7c, 0xe5, 0xe2, 0x0d, 0xce, 0x1e, 0xfe, 0x4e, + 0xc5, 0x1e, 0x7e, 0xf9, + 0x6c, 0x64, 0xf9, 0x8d, 0xa2, 0xf7, 0x4d, 0x59, 0xaf, 0x37, 0x2a, 0xb6, + 0x39, 0x7f, 0x39, 0x64, + 0x7e, 0x30, 0x70, 0xf0, 0x21, 0x6e, 0x56, 0x3e, 0xce, 0x1d, 0x86, 0xf6, + 0x9b, 0xd8, 0xbd, 0x6f, + 0x47, 0x1b, 0x06, 0xe7, 0x3e, 0x5b, 0xec, 0x67, 0x7d, 0xa1, 0xb7, 0x3c, + 0x3c, 0x17, 0xf8, 0x7e, + 0xf6, 0xb5, 0x71, 0x32, 0xad, 0xb2, 0xc7, 0x55, 0xa6, 0xcf, 0xeb, 0x35, + 0x32, 0xb7, 0x27, 0xff, + 0xce, 0x6c, 0x4e, 0x9b, 0x70, 0x19, 0x8d, 0x69, 0xc3, 0xb4, 0x2e, 0xa3, + 0x3e, 0xad, 0x9b, 0xf6, + 0x75, 0x38, 0x3d, 0xb4, 0xae, 0x37, 0x99, 0xe7, 0x7d, 0xfa, 0xcc, 0x91, + 0x91, 0x3d, 0x34, 0xd6, + 0xbf, 0x6d, 0xfe, 0xbb, 0x59, 0xd3, 0xda, 0xc3, 0x0d, 0xd7, 0x1e, 0xae, + 0xbb, 0xf6, 0xf0, 0xa1, + 0xb3, 0x87, 0xdf, 0x34, 0x39, 0xb7, 0xf4, 0x0f, 0xd7, 0xfb, 0xa6, 0x4d, + 0x03, 0x7a, 0xdf, 0x3c, + 0xf3, 0x83, 0xad, 0xbc, 0x09, 0x3f, 0x17, 0x86, 0xcc, 0x0f, 0x16, 0xdf, + 0xe7, 0x30, 0x4f, 0x61, + 0xee, 0x79, 0x66, 0x9a, 0xe5, 0xec, 0x67, 0xe0, 0x62, 0xad, 0xd5, 0x25, + 0x8f, 0x32, 0x6d, 0x5c, + 0x6f, 0xf2, 0x56, 0x13, 0x3b, 0x97, 0x33, 0x88, 0xf3, 0xf5, 0xd4, 0xf8, + 0xbb, 0xcc, 0xee, 0xa4, + 0x63, 0x76, 0xa6, 0x1d, 0x83, 0x5f, 0x93, 0xb6, 0xd9, 0x9e, 0xf2, 0xcb, + 0x68, 0x4f, 0x5b, 0x66, + 0x8b, 0x5f, 0x4d, 0x43, 0xac, 0xef, 0xbf, 0x35, 0x6f, 0xf7, 0xc9, 0xff, + 0x25, 0x23, 0x7b, 0x68, + 0xec, 0xe8, 0x29, 0xf3, 0xbb, 0xa6, 0x5d, 0xd8, 0xbf, 0x62, 0x0f, 0xb3, + 0xbd, 0xbc, 0xda, 0xbf, + 0x6d, 0x6b, 0xff, 0xb6, 0xac, 0xfd, 0xdb, 0x34, 0xff, 0xed, 0xe4, 0xb6, + 0xd8, 0xbf, 0x03, 0x5c, + 0xbd, 0x9e, 0x2a, 0xae, 0xc7, 0xf3, 0x26, 0xd3, 0x42, 0x13, 0xce, 0x6a, + 0x2b, 0x36, 0xd5, 0x7a, + 0xbf, 0x09, 0xe7, 0xb1, 0x58, 0xbd, 0x6f, 0xa0, 0x89, 0x90, 0x03, 0x81, + 0x3f, 0x21, 0xef, 0x9a, + 0x1a, 0xa5, 0x3b, 0x7e, 0x9e, 0x0b, 0xd4, 0xe2, 0x40, 0xcf, 0x46, 0x71, + 0xa6, 0x37, 0x64, 0x3c, + 0x97, 0xb0, 0xb8, 0xde, 0x5a, 0xac, 0xd3, 0xc7, 0xef, 0xb7, 0xed, 0xfb, + 0xc6, 0xff, 0xc1, 0x3c, + 0x9a, 0x1c, 0x59, 0x57, 0xcf, 0xec, 0x89, 0xcb, 0x80, 0xcb, 0x9c, 0x98, + 0xa6, 0x31, 0x35, 0xc4, + 0x35, 0xe9, 0x9a, 0xdd, 0xe9, 0x77, 0x99, 0x4f, 0x1d, 0xd1, 0x67, 0x8e, + 0x8c, 0xec, 0xe1, 0xd1, + 0xbf, 0xef, 0x33, 0xff, 0xc3, 0xf4, 0xc8, 0xd9, 0xc3, 0xee, 0xfd, 0xdb, + 0x9b, 0x98, 0x6c, 0x0f, + 0xdb, 0xfb, 0xd7, 0x60, 0xfb, 0xb7, 0x6b, 0x7e, 0xd7, 0xf8, 0x29, 0xf1, + 0x7d, 0x9c, 0x69, 0x85, + 0x98, 0xab, 0x86, 0xe9, 0x7d, 0x63, 0x3f, 0x03, 0xf4, 0x6f, 0x73, 0x92, + 0x69, 0x06, 0xb1, 0xa9, + 0x20, 0x6f, 0xb2, 0xb9, 0xc8, 0x36, 0xd3, 0x93, 0x34, 0xef, 0x7d, 0x83, + 0xf3, 0x5f, 0x66, 0xad, + 0xf7, 0xcd, 0xc7, 0x73, 0xb9, 0x5b, 0x0d, 0xe0, 0xb9, 0xe8, 0x1e, 0x9e, + 0x0b, 0x7f, 0x7f, 0x0b, + 0x24, 0xd3, 0x4a, 0x12, 0xeb, 0x7c, 0x7a, 0x5c, 0x33, 0x26, 0xe3, 0xb1, + 0x39, 0x9e, 0xc0, 0x35, + 0x32, 0x47, 0xd6, 0x35, 0x9c, 0x0c, 0xe1, 0x32, 0x86, 0x93, 0x81, 0x39, + 0xb0, 0xae, 0xfe, 0xf4, + 0xcd, 0xe6, 0x5b, 0x49, 0xff, 0xc8, 0xc8, 0x1e, 0x22, 0xfd, 0x7b, 0xda, + 0xa8, 0x4d, 0x26, 0xd6, + 0xfe, 0x1d, 0x3b, 0xfb, 0x77, 0x24, 0xf6, 0x2f, 0xdf, 0xc3, 0x03, 0x67, + 0x0f, 0xf7, 0xcd, 0x37, + 0x8f, 0xdf, 0x6a, 0xd7, 0x83, 0xa0, 0xe6, 0xaa, 0xe5, 0xa2, 0xcc, 0x55, + 0x73, 0x7a, 0xdf, 0xd6, + 0xe7, 0x07, 0x73, 0xfe, 0x33, 0xcc, 0x7c, 0x63, 0xe7, 0xbf, 0xec, 0x2c, + 0xd3, 0x0e, 0xed, 0x7d, + 0x83, 0xba, 0xe4, 0x59, 0xa9, 0xb1, 0x7b, 0x7b, 0x67, 0xcf, 0x1f, 0x6b, + 0xf4, 0x73, 0xf0, 0x05, + 0xd3, 0x4a, 0xf5, 0xfe, 0xe4, 0x9c, 0xaf, 0x77, 0x8e, 0x3a, 0xe6, 0xf1, + 0xf8, 0xd8, 0x5c, 0x8e, + 0x97, 0xec, 0x5a, 0x18, 0x8b, 0xc9, 0xc2, 0x9c, 0x8f, 0xd9, 0x35, 0x99, + 0x9b, 0xb3, 0xf1, 0x8c, + 0x5f, 0xd3, 0xf1, 0x94, 0x5f, 0x93, 0x49, 0xcd, 0x7c, 0x9a, 0xfc, 0x5f, + 0x32, 0xb2, 0x87, 0x48, + 0xff, 0xde, 0x69, 0x76, 0xd8, 0xfe, 0x3d, 0xe6, 0xfb, 0x77, 0x69, 0x2c, + 0xd8, 0xde, 0x5d, 0x8c, + 0xe7, 0xfc, 0x9a, 0x4f, 0xc4, 0xfe, 0x9d, 0x4d, 0xc4, 0xfe, 0x9d, 0x32, + 0x9d, 0xac, 0x8d, 0x9f, + 0x16, 0x33, 0x88, 0xb0, 0x4c, 0xab, 0x33, 0x4c, 0xef, 0x1b, 0xd4, 0xa0, + 0x48, 0x38, 0x2d, 0x56, + 0xde, 0x44, 0x9f, 0x66, 0x5a, 0xd9, 0x85, 0x35, 0xf3, 0xf2, 0x54, 0xdd, + 0xfb, 0xc6, 0x67, 0x89, + 0x9c, 0x17, 0x0f, 0xc2, 0x78, 0x2e, 0x9c, 0x83, 0x7f, 0x5e, 0x3d, 0xd8, + 0x59, 0x64, 0xeb, 0x52, + 0x9e, 0x8b, 0x22, 0xd6, 0xf9, 0x9e, 0xd1, 0xc0, 0xbc, 0x35, 0xbe, 0x65, + 0x5e, 0x8c, 0x2f, 0x9c, + 0xeb, 0x6c, 0x7c, 0xe6, 0x5c, 0xa7, 0xe3, 0x53, 0xf3, 0x64, 0x7c, 0x62, + 0x5d, 0x1d, 0xf3, 0x9d, + 0xa4, 0x7f, 0x64, 0x64, 0x0f, 0x91, 0xfe, 0xbd, 0xc7, 0x1c, 0xb0, 0xfd, + 0x7b, 0xcb, 0xb5, 0x7f, + 0x2f, 0x5c, 0xfb, 0xf7, 0x8c, 0xed, 0xdf, 0x53, 0x67, 0xff, 0x9e, 0x30, + 0xad, 0x7c, 0xa7, 0x81, + 0x89, 0xeb, 0xb9, 0x6b, 0x50, 0x94, 0x4c, 0x2b, 0x24, 0xa7, 0x25, 0x35, + 0xd5, 0xdb, 0x50, 0xf7, + 0x07, 0x1c, 0x7c, 0x44, 0xef, 0xdb, 0x1a, 0xab, 0x9e, 0xf3, 0x5c, 0xfc, + 0x1c, 0xfc, 0xa7, 0x76, + 0xc3, 0x79, 0x2e, 0xae, 0x58, 0x67, 0x2a, 0x40, 0x9f, 0xdf, 0x37, 0x9a, + 0x9b, 0xdf, 0x37, 0xfa, + 0x5e, 0xe3, 0x7b, 0x47, 0xdf, 0x6b, 0x7e, 0xcf, 0xe8, 0x7b, 0xe0, 0x32, + 0x9e, 0x1a, 0x3d, 0x65, + 0xc2, 0x75, 0x77, 0x7c, 0xd7, 0xbc, 0x3b, 0xba, 0x6b, 0xde, 0x19, 0xdf, + 0xe1, 0xd7, 0xed, 0xf1, + 0xc0, 0x7c, 0x37, 0xf9, 0xbf, 0x64, 0x64, 0x0f, 0x91, 0xfe, 0xbd, 0x8f, + 0xf9, 0x6b, 0xdf, 0xc7, + 0xf7, 0xef, 0xf7, 0x8a, 0xfd, 0x6b, 0x7e, 0xcf, 0xf8, 0x29, 0xb1, 0x87, + 0xad, 0xfd, 0x7b, 0xd7, + 0xda, 0xbf, 0x77, 0xc6, 0xb7, 0xcd, 0xc1, 0xe8, 0xdd, 0xa2, 0x1e, 0x64, + 0x19, 0x23, 0xd3, 0x0a, + 0xc9, 0x69, 0xb1, 0x7b, 0xdf, 0xb8, 0x96, 0xa9, 0xe2, 0x8e, 0x3c, 0xae, + 0x97, 0x95, 0xe9, 0xb3, + 0xe0, 0xe0, 0xcf, 0x36, 0x1b, 0xf0, 0xfe, 0xaa, 0x41, 0x33, 0x37, 0xdd, + 0x1c, 0x7c, 0x8b, 0xdf, + 0x1f, 0xf4, 0xfe, 0x3e, 0x38, 0xbc, 0x65, 0xbc, 0x63, 0xf4, 0x0e, 0xe3, + 0xed, 0xa3, 0xb7, 0x9b, + 0x6f, 0x1f, 0xbd, 0xcd, 0x78, 0xdb, 0xe8, 0x6d, 0xe6, 0xdb, 0x46, 0x4f, + 0x1b, 0x4f, 0x8f, 0x7e, + 0xc0, 0xfc, 0x01, 0x7e, 0x7d, 0xbf, 0xf9, 0xfd, 0xfc, 0x7a, 0xab, 0xf9, + 0x56, 0x76, 0xb6, 0x7e, + 0x1f, 0xe9, 0x1f, 0x19, 0xd9, 0x43, 0xa4, 0x7f, 0x1f, 0x34, 0x6e, 0xb1, + 0xfd, 0xfb, 0x8e, 0xd1, + 0xdb, 0x61, 0x0f, 0x5b, 0xfb, 0xf7, 0x6d, 0x6c, 0xff, 0x3e, 0x6d, 0xed, + 0xdf, 0x1f, 0xb0, 0xf6, + 0xef, 0xf7, 0x9b, 0x6f, 0x65, 0x7b, 0x78, 0x31, 0x7a, 0x5f, 0xa4, 0xb8, + 0x1e, 0x8a, 0x69, 0x85, + 0xe4, 0xb4, 0xd8, 0xbd, 0x6f, 0xb6, 0x86, 0x85, 0x7d, 0x2d, 0x8a, 0x55, + 0xcf, 0x7c, 0x6b, 0xce, + 0xc7, 0x9f, 0x66, 0x9b, 0x52, 0x9e, 0x0b, 0xe4, 0x4d, 0xd8, 0x7f, 0xe3, + 0x9c, 0xaf, 0x80, 0xd7, + 0xfc, 0xe8, 0xf0, 0xad, 0xe6, 0x7b, 0x87, 0xef, 0x31, 0xdf, 0x3b, 0x7a, + 0x8f, 0xf1, 0x9e, 0x21, + 0xbb, 0x46, 0xcf, 0x18, 0xcf, 0x8c, 0xde, 0x6d, 0x3c, 0x33, 0x7c, 0xc6, + 0x7c, 0xd7, 0xe8, 0x5d, + 0xc6, 0x0f, 0xb2, 0xeb, 0x5d, 0xa3, 0x1f, 0x64, 0x7f, 0xbe, 0xd3, 0x78, + 0xe7, 0xe8, 0x96, 0xf9, + 0xc1, 0x23, 0xf2, 0x7f, 0xc9, 0xc8, 0x1e, 0x1e, 0xfd, 0xfb, 0xa8, 0xf9, + 0xd6, 0xe1, 0x7b, 0xcd, + 0xf7, 0x8c, 0xde, 0x0b, 0xfb, 0x97, 0xfd, 0xf9, 0x1e, 0xb6, 0x7f, 0x9f, + 0x31, 0xdf, 0x0d, 0xfb, + 0x78, 0xc8, 0xf7, 0xae, 0xb5, 0x8f, 0x7f, 0x90, 0xed, 0xdf, 0x77, 0x9a, + 0xb7, 0x86, 0xa2, 0xff, + 0x03, 0xc7, 0xb4, 0xca, 0x76, 0xab, 0x4c, 0xff, 0x54, 0x35, 0x32, 0x38, + 0x4e, 0xcb, 0x86, 0x91, + 0x59, 0xe4, 0x5a, 0x99, 0xa1, 0x82, 0xf9, 0x67, 0x59, 0x1e, 0x98, 0x56, + 0x33, 0x04, 0xab, 0x1e, + 0x7a, 0xdf, 0xec, 0xf7, 0x27, 0xe1, 0xb9, 0x00, 0xcf, 0x01, 0x72, 0x29, + 0xa5, 0xe5, 0xfa, 0xfc, + 0xe0, 0x8f, 0xb1, 0x35, 0xfa, 0xc0, 0xf0, 0x03, 0xe6, 0xb3, 0xc3, 0x67, + 0xf9, 0xf5, 0x23, 0xc3, + 0x1f, 0x61, 0xd7, 0xfb, 0x8d, 0xf7, 0x0f, 0xdf, 0x6f, 0xbe, 0x7f, 0xf8, + 0x3e, 0xe3, 0x7d, 0xec, + 0xfa, 0xe1, 0xe1, 0x0f, 0x99, 0x3f, 0xcc, 0xfb, 0xe2, 0xbe, 0xdf, 0xf8, + 0x28, 0xe9, 0x1f, 0x19, + 0xd9, 0x43, 0xa4, 0x7f, 0x1f, 0x33, 0xdf, 0x35, 0xfc, 0x00, 0xdb, 0xc3, + 0xcf, 0x5a, 0x7b, 0x18, + 0xf6, 0xef, 0x8f, 0x58, 0xfb, 0xf7, 0xfd, 0x7c, 0xff, 0xbe, 0x6f, 0xf8, + 0xc3, 0xe6, 0x0f, 0x0d, + 0x7f, 0x98, 0xed, 0xdf, 0x1f, 0x32, 0xbf, 0x7f, 0xf8, 0x63, 0x46, 0xaa, + 0x9f, 0xea, 0xf0, 0xb8, + 0xde, 0x08, 0x13, 0xd7, 0x43, 0xd4, 0xc8, 0x60, 0x38, 0x2d, 0xa6, 0x66, + 0xc0, 0xec, 0xcb, 0xf4, + 0x00, 0xa5, 0x7f, 0x50, 0xaf, 0x87, 0xeb, 0x7d, 0x03, 0x7e, 0x7f, 0x80, + 0x3e, 0x2b, 0xf3, 0x26, + 0x56, 0xbf, 0xc9, 0x27, 0x07, 0xef, 0x37, 0x7f, 0x6c, 0xf8, 0x63, 0xe6, + 0x8f, 0x0d, 0x3e, 0x6a, + 0x7e, 0x94, 0x5d, 0x1f, 0x19, 0x7e, 0xc4, 0xfc, 0xc8, 0xe0, 0x23, 0xe6, + 0x87, 0x87, 0x1f, 0x36, + 0x3f, 0x3c, 0xf8, 0x90, 0xf9, 0xa1, 0xe1, 0x87, 0xcc, 0x1f, 0x1d, 0xfe, + 0x28, 0xbb, 0x3e, 0xc8, + 0x7c, 0xe5, 0x77, 0x99, 0x1f, 0x23, 0xff, 0x97, 0x8c, 0xec, 0xe1, 0xb1, + 0xde, 0x27, 0x99, 0xce, + 0xc1, 0xfe, 0xfd, 0x31, 0xe6, 0xcb, 0xc1, 0x1e, 0xfe, 0x88, 0xb5, 0x87, + 0x61, 0xff, 0x7e, 0x98, + 0xef, 0xdf, 0x0f, 0xf1, 0xfd, 0xfb, 0xa3, 0x6c, 0xff, 0x7e, 0xd0, 0x7c, + 0xd7, 0xe0, 0xe3, 0xc6, + 0xce, 0x59, 0xe9, 0x00, 0x98, 0x51, 0x9b, 0x93, 0x74, 0x33, 0x34, 0x6f, + 0x8a, 0x64, 0x5a, 0xa1, + 0x38, 0x2d, 0xae, 0xde, 0x37, 0xf5, 0x3d, 0xa1, 0xe7, 0x72, 0xb6, 0x64, + 0x71, 0x3d, 0xaf, 0x2f, + 0xcd, 0xf4, 0x99, 0xf9, 0xe7, 0x41, 0xf3, 0x83, 0x7f, 0x76, 0xf0, 0x11, + 0xe3, 0xb9, 0xc1, 0x73, + 0xc6, 0x4f, 0x0d, 0x7e, 0xca, 0xfc, 0xa9, 0xc1, 0x4f, 0x9a, 0x1f, 0xe7, + 0xd7, 0xc7, 0xf9, 0xf5, + 0xb1, 0xc1, 0xc7, 0xd8, 0xf5, 0x13, 0xc6, 0x4f, 0xb0, 0xeb, 0xc7, 0x07, + 0x3f, 0xce, 0xae, 0xf7, + 0x9b, 0x3f, 0xd7, 0x7b, 0xbb, 0xf1, 0x76, 0x93, 0x8c, 0x8c, 0xec, 0xa1, + 0xb0, 0xde, 0x2f, 0x33, + 0xad, 0x7b, 0x8e, 0xed, 0xe1, 0x9f, 0xe2, 0x7b, 0xf8, 0x27, 0xd9, 0xbe, + 0xfd, 0x49, 0x6b, 0xff, + 0x7e, 0x9c, 0xef, 0xdf, 0x8f, 0xf1, 0xfd, 0xfb, 0x13, 0x83, 0x1f, 0x37, + 0x61, 0x0f, 0xbf, 0x7f, + 0xf0, 0x29, 0xc3, 0xf6, 0x0b, 0xc3, 0x78, 0x2e, 0x11, 0xe2, 0x7a, 0x38, + 0x4e, 0x0b, 0xf4, 0xbe, + 0x01, 0xf3, 0x19, 0xc3, 0x4f, 0x89, 0xc6, 0xb4, 0x42, 0xd5, 0x30, 0x96, + 0xe7, 0x9c, 0xf3, 0xb5, + 0x9a, 0x1f, 0x6c, 0x71, 0xf0, 0x7f, 0x81, 0xad, 0xdb, 0xa7, 0x07, 0x9f, + 0x36, 0x3e, 0xdd, 0xff, + 0x19, 0xe3, 0x67, 0xd8, 0xf5, 0xd3, 0x83, 0x9f, 0x36, 0x7f, 0x7a, 0xf0, + 0xbc, 0xf1, 0x3c, 0xbb, + 0x3e, 0x35, 0xf8, 0x94, 0xf9, 0xa9, 0xc1, 0x27, 0x8d, 0x4f, 0x0e, 0x3e, + 0x69, 0x7e, 0x72, 0xf0, + 0x09, 0xe3, 0x13, 0x83, 0x8f, 0x1a, 0xbf, 0xd2, 0xbb, 0x34, 0xc9, 0xc8, + 0xc8, 0x1e, 0x12, 0xeb, + 0xfd, 0x06, 0x3b, 0xb7, 0x7c, 0xda, 0xfc, 0x74, 0xff, 0xd3, 0xc6, 0xcf, + 0x0c, 0x7e, 0xc6, 0xfc, + 0x99, 0xfe, 0x4f, 0xc3, 0x1e, 0x86, 0xfd, 0x6b, 0x3e, 0xcf, 0xb4, 0x8e, + 0xed, 0x61, 0x6b, 0xff, + 0x7e, 0x92, 0xed, 0xdf, 0x4f, 0xb0, 0xf3, 0xe1, 0xa7, 0x8d, 0xfc, 0xbc, + 0x58, 0x87, 0x7a, 0x90, + 0x6a, 0x08, 0xcf, 0x05, 0x7a, 0x2c, 0x78, 0x0d, 0x0a, 0x62, 0xee, 0x1b, + 0x8a, 0xd3, 0xd2, 0x5f, + 0xf5, 0xfe, 0x2a, 0xf5, 0xcf, 0x8e, 0xeb, 0xdd, 0xd7, 0xb9, 0x9c, 0xa2, + 0x46, 0xfb, 0xb3, 0xfd, + 0x9f, 0x35, 0x7e, 0xb9, 0xff, 0x4b, 0xc6, 0x2f, 0xb1, 0xeb, 0x17, 0xfb, + 0xbf, 0x68, 0xb2, 0xcb, + 0xf8, 0x85, 0xfe, 0x2f, 0x98, 0xbf, 0xd0, 0xff, 0x79, 0xe3, 0xe7, 0xd9, + 0xf5, 0x73, 0xfd, 0x9f, + 0x33, 0x7f, 0xae, 0xff, 0x19, 0xe3, 0x33, 0xfd, 0xcf, 0x98, 0x9f, 0xe9, + 0x3f, 0x67, 0xfc, 0x46, + 0xef, 0x3f, 0x19, 0xff, 0xc9, 0xe4, 0x97, 0xca, 0x30, 0x5f, 0x77, 0x3f, + 0x7e, 0x16, 0xf6, 0x32, + 0x5f, 0x84, 0xf7, 0x66, 0x3e, 0xc0, 0x7b, 0xb8, 0x5f, 0x6b, 0x7b, 0x95, + 0x9f, 0x75, 0x95, 0x7b, + 0x79, 0x58, 0xef, 0x33, 0xca, 0xbd, 0xdc, 0xff, 0xf7, 0xdf, 0xfb, 0x1d, + 0xf3, 0x67, 0xfb, 0xbf, + 0x0c, 0xfb, 0xd7, 0xfc, 0x25, 0xb6, 0x77, 0x7f, 0x91, 0x5f, 0xbf, 0x00, + 0x7b, 0x18, 0xf6, 0xaf, + 0xf9, 0xf3, 0xfd, 0x9f, 0x83, 0x3d, 0x6c, 0x7c, 0x66, 0x00, 0xfb, 0xf7, + 0x33, 0xc6, 0x73, 0xec, + 0xdf, 0x36, 0x06, 0x22, 0xae, 0x97, 0x95, 0xf1, 0x5c, 0x6c, 0x0e, 0xfe, + 0x71, 0xf9, 0xb0, 0x7a, + 0xa2, 0xd7, 0x42, 0xe3, 0x7f, 0xc0, 0x5f, 0xc6, 0x70, 0x5a, 0x06, 0xe9, + 0x6e, 0x6e, 0xa9, 0x66, + 0x3e, 0x3b, 0x71, 0x3d, 0x2c, 0xd3, 0xea, 0x14, 0xd7, 0xfb, 0x26, 0x8b, + 0x75, 0xfe, 0xfa, 0xd1, + 0x0b, 0xc6, 0xaf, 0x1d, 0xfd, 0x9a, 0xc9, 0xaf, 0xfe, 0xaf, 0x1a, 0xbf, + 0xca, 0xaf, 0x5f, 0x31, + 0x7e, 0x85, 0x5d, 0x9f, 0x3b, 0xfa, 0x9c, 0xf9, 0xb9, 0xfe, 0xe7, 0x8c, + 0xcf, 0xf6, 0x3f, 0xcb, + 0xaf, 0x17, 0x98, 0x56, 0x7e, 0x76, 0x5e, 0x69, 0x60, 0xea, 0x86, 0xe2, + 0x65, 0xd7, 0x54, 0x02, + 0xd9, 0x35, 0x7e, 0x3d, 0x17, 0xb5, 0x4a, 0x5a, 0x3b, 0x3d, 0xd4, 0xe5, + 0xf3, 0x4d, 0x4e, 0x4a, + 0x35, 0xe8, 0xfb, 0xb1, 0x38, 0x3d, 0xdd, 0xd0, 0x98, 0x06, 0xb6, 0xef, + 0x07, 0xc3, 0xa8, 0x38, + 0xbf, 0x12, 0xa3, 0xc2, 0x48, 0xb1, 0x67, 0x14, 0xd4, 0x39, 0x95, 0xdc, + 0x73, 0xab, 0xc0, 0x77, + 0x61, 0xf7, 0xc2, 0xe7, 0x56, 0x4d, 0xc5, 0xdc, 0x2a, 0x7f, 0x7f, 0x78, + 0x6a, 0x8a, 0xaf, 0xef, + 0xdf, 0x9e, 0x6e, 0xe0, 0x18, 0x93, 0xea, 0x3c, 0xe0, 0x5a, 0xcd, 0xaa, + 0xe7, 0x5e, 0xfa, 0x99, + 0x8e, 0x3e, 0x13, 0xbd, 0xf2, 0xd5, 0xbb, 0xbb, 0xeb, 0xf3, 0x08, 0x99, + 0x1f, 0xc6, 0xeb, 0x57, + 0xc1, 0x0f, 0x83, 0x9a, 0x55, 0xf6, 0xef, 0xda, 0x83, 0x9c, 0x4d, 0x6b, + 0xc7, 0xfb, 0x95, 0xaf, + 0x59, 0xe1, 0xf9, 0xce, 0xec, 0x24, 0xdf, 0x5a, 0xe7, 0x25, 0xdb, 0x7d, + 0xff, 0xb9, 0x06, 0x9c, + 0x8b, 0x36, 0x47, 0x5a, 0x38, 0xe7, 0x93, 0xef, 0x01, 0x75, 0x0c, 0x4b, + 0x3e, 0x83, 0xf2, 0xd7, + 0xcd, 0x17, 0x8e, 0x7e, 0x4d, 0xec, 0xe1, 0xfe, 0xaf, 0x59, 0xfb, 0xf7, + 0x57, 0xf9, 0xfe, 0xfd, + 0x95, 0xa3, 0xcf, 0x19, 0xb0, 0x7f, 0x3f, 0x67, 0xed, 0xdf, 0xcf, 0xf6, + 0x5f, 0x30, 0x7e, 0xf6, + 0xe8, 0xb3, 0xc6, 0x1a, 0xab, 0x3e, 0x88, 0xe7, 0x72, 0x57, 0x68, 0x61, + 0x95, 0xbd, 0x37, 0x87, + 0x4d, 0xe5, 0xe7, 0xb9, 0x44, 0xd9, 0x03, 0x43, 0x98, 0xfb, 0xa6, 0x66, + 0x3e, 0x47, 0xd3, 0x85, + 0xea, 0xb5, 0x6b, 0x18, 0xbf, 0xd0, 0xfb, 0xbc, 0xf9, 0xdb, 0x47, 0xbf, + 0x6d, 0xfc, 0xf6, 0xd1, + 0x6f, 0x99, 0xbf, 0xc5, 0xae, 0x2f, 0x1c, 0x7d, 0x81, 0x5d, 0xbf, 0x69, + 0xfe, 0x26, 0xbb, 0x7e, + 0xe3, 0xe8, 0x37, 0xac, 0xeb, 0xf3, 0xc6, 0xe7, 0x8f, 0x3e, 0x6f, 0x7e, + 0x9e, 0xad, 0xdf, 0xaf, + 0x2f, 0x2a, 0x8d, 0xf2, 0x52, 0x3f, 0x0c, 0xef, 0x37, 0x89, 0xa0, 0x0b, + 0x48, 0x76, 0x4d, 0x59, + 0x95, 0x0b, 0x0f, 0xea, 0x71, 0xb1, 0xf3, 0xe1, 0xcb, 0x92, 0x77, 0xbe, + 0xc9, 0xdd, 0xaa, 0xc5, + 0xe9, 0x11, 0x73, 0xe1, 0xdd, 0xf9, 0x70, 0x6f, 0x4c, 0x23, 0x26, 0x5d, + 0x98, 0x85, 0xea, 0x82, + 0x3b, 0xe7, 0x75, 0x20, 0xf7, 0x23, 0xd8, 0x79, 0x7d, 0xc4, 0x74, 0x7d, + 0x51, 0xe2, 0xbe, 0xcb, + 0x8a, 0x39, 0xe4, 0xee, 0x0f, 0xcf, 0xb6, 0xec, 0xfe, 0x70, 0xae, 0x0b, + 0x27, 0x68, 0x5d, 0x68, + 0xc5, 0x51, 0xdf, 0x8f, 0xcb, 0x03, 0x6e, 0x88, 0xd7, 0x9c, 0x66, 0x9b, + 0xa0, 0xeb, 0x9e, 0x79, + 0x84, 0x96, 0x1f, 0xb6, 0x0d, 0x7e, 0xd8, 0xac, 0xd0, 0x80, 0x3d, 0x90, + 0xea, 0x85, 0xaf, 0x6d, + 0xac, 0xb3, 0x69, 0x23, 0xc4, 0xfb, 0xab, 0xab, 0x67, 0xa3, 0xd0, 0xf5, + 0x69, 0xa1, 0x59, 0x3c, + 0xdd, 0xae, 0x79, 0xe6, 0x4c, 0xb2, 0xbf, 0xef, 0x58, 0xf1, 0xb5, 0x6c, + 0x40, 0x7c, 0x2d, 0x4a, + 0x0c, 0x8b, 0xef, 0x81, 0x79, 0xd0, 0x1e, 0xf8, 0x82, 0xf9, 0x79, 0xbe, + 0x7f, 0x7f, 0x9b, 0xef, + 0xdf, 0xdf, 0xe2, 0xfb, 0xf7, 0x0b, 0x7c, 0xff, 0xfe, 0xa6, 0xb3, 0x7f, + 0x7f, 0x43, 0xec, 0x5f, + 0xb6, 0x8f, 0x5f, 0x38, 0xfa, 0x75, 0x23, 0x2c, 0xae, 0xb7, 0xc6, 0xc1, + 0xbf, 0x1b, 0x32, 0x3f, + 0x18, 0xf6, 0x0c, 0x72, 0x0f, 0x68, 0x63, 0xbd, 0x0d, 0xcc, 0x2b, 0xe7, + 0xff, 0x87, 0x7c, 0x96, + 0xb0, 0xac, 0xfa, 0x7c, 0x84, 0xb9, 0x9c, 0x32, 0xce, 0xd7, 0xef, 0xf6, + 0xbe, 0x68, 0xfc, 0x7e, + 0xef, 0xf7, 0xcc, 0xdf, 0x13, 0x97, 0xf1, 0xe5, 0xde, 0x97, 0x8d, 0x2f, + 0xf5, 0xbe, 0x64, 0xb2, + 0x8b, 0xfd, 0xf9, 0x45, 0xe3, 0x8b, 0xbd, 0xdf, 0x35, 0x7f, 0xf7, 0x88, + 0x5f, 0xc6, 0xef, 0xb0, + 0x35, 0xfc, 0xad, 0xe5, 0x6e, 0x1d, 0x72, 0xce, 0xa1, 0xfd, 0x26, 0xd1, + 0x74, 0x41, 0xcd, 0xae, + 0x39, 0x0f, 0x66, 0xd7, 0x78, 0xb5, 0x28, 0x9c, 0xe7, 0xc3, 0x7e, 0xaf, + 0x5d, 0xfe, 0xbc, 0x3e, + 0xab, 0xac, 0xd8, 0x12, 0x4e, 0x3e, 0x9c, 0xfd, 0x5e, 0x3d, 0xfc, 0x45, + 0xab, 0xef, 0x47, 0x95, + 0x7f, 0x1a, 0x08, 0x5d, 0x48, 0xa1, 0x74, 0xe1, 0xea, 0x8c, 0x0a, 0x5f, + 0xce, 0x8b, 0x73, 0x3b, + 0xe0, 0x79, 0x0d, 0xba, 0xee, 0xe6, 0xaf, 0xb9, 0xe6, 0xd6, 0x1c, 0x42, + 0xce, 0xab, 0x72, 0xcc, + 0xb5, 0xc8, 0x50, 0xe9, 0x82, 0xf2, 0x9c, 0x8e, 0x9d, 0xc3, 0x8a, 0xa9, + 0x59, 0xf5, 0xc7, 0xb6, + 0x7b, 0xb6, 0xae, 0xc3, 0x3c, 0x32, 0x5f, 0xcd, 0x16, 0xcc, 0x66, 0x64, + 0x7e, 0x58, 0x7e, 0x35, + 0x8f, 0xac, 0x7b, 0x9d, 0x3d, 0x10, 0x53, 0x1d, 0xaf, 0x21, 0x9f, 0xb7, + 0xa8, 0x39, 0xe7, 0x75, + 0xd0, 0xf5, 0xdd, 0x20, 0x5d, 0xb7, 0xe3, 0x6b, 0x96, 0xae, 0x6b, 0x7c, + 0x0f, 0x14, 0xb0, 0x7b, + 0x20, 0xe0, 0x79, 0xfc, 0xbb, 0xe6, 0x17, 0x7b, 0xbf, 0x6f, 0xfc, 0x9e, + 0xb3, 0x87, 0xbf, 0x6c, + 0x7c, 0xf9, 0xe8, 0x4b, 0x62, 0x0f, 0xb3, 0x3f, 0xbf, 0xd8, 0xfb, 0xa2, + 0xbd, 0x7f, 0xd9, 0xf5, + 0x3b, 0xc6, 0xe7, 0x7b, 0x5f, 0xc0, 0xf5, 0xbe, 0xf5, 0xc4, 0x1e, 0xd8, + 0x3a, 0x2e, 0x1c, 0xca, + 0xe6, 0x07, 0xf3, 0xbc, 0x09, 0xfb, 0x1c, 0x62, 0xf6, 0x40, 0x7a, 0xa2, + 0xf3, 0xb9, 0x6f, 0xce, + 0x73, 0x0b, 0x18, 0x08, 0x43, 0xb6, 0x0e, 0x01, 0xe7, 0x28, 0x6c, 0x5c, + 0xaf, 0x18, 0xc3, 0x5c, + 0xce, 0x3f, 0xe8, 0xfd, 0x91, 0xf1, 0x27, 0xbd, 0x3f, 0x31, 0xbe, 0xd2, + 0xfb, 0x8a, 0xf9, 0x95, + 0xde, 0x1f, 0xc3, 0x65, 0xfc, 0x31, 0xfb, 0xb7, 0x3f, 0xb2, 0xae, 0x3f, + 0xec, 0xfd, 0xa1, 0xc9, + 0x2e, 0xe3, 0x0f, 0x8f, 0x7e, 0xdf, 0xf8, 0x83, 0xa3, 0x2f, 0x1a, 0x5f, + 0x02, 0xfd, 0x0b, 0x99, + 0x1f, 0xcc, 0x7f, 0xaf, 0xdc, 0x7f, 0x57, 0x9f, 0x17, 0xd2, 0xcb, 0x4a, + 0x3d, 0x6e, 0x5d, 0x50, + 0xd5, 0x2a, 0xf1, 0xd7, 0x64, 0xbf, 0x7b, 0x67, 0x2e, 0xfc, 0x9d, 0x20, + 0x3f, 0x4c, 0x6f, 0xc0, + 0x6b, 0x16, 0x46, 0xbc, 0x57, 0x27, 0xc4, 0x77, 0x89, 0x53, 0x17, 0x52, + 0x11, 0x72, 0x5e, 0x2b, + 0x6e, 0x87, 0xad, 0xeb, 0x50, 0xe7, 0x54, 0xbe, 0xbd, 0xf2, 0xc3, 0xa0, + 0x1f, 0xbd, 0x7a, 0xb1, + 0xb5, 0x5f, 0x5c, 0xe4, 0xeb, 0xfa, 0xd0, 0xc5, 0xd5, 0xbd, 0x8f, 0xf5, + 0xfd, 0x85, 0x53, 0xc4, + 0x1c, 0x56, 0xeb, 0xd9, 0x18, 0xf8, 0x3c, 0x86, 0xf3, 0xba, 0xd0, 0xf5, + 0xc3, 0x6d, 0x99, 0xae, + 0x8f, 0xc4, 0x79, 0xdd, 0xbe, 0x97, 0x62, 0x8c, 0xb3, 0x69, 0x45, 0x1d, + 0x6f, 0x2e, 0x9e, 0x78, + 0x3f, 0x3f, 0x33, 0x57, 0xde, 0x12, 0x16, 0x5f, 0x03, 0x5d, 0xcf, 0x60, + 0xce, 0xe9, 0xa1, 0x31, + 0xac, 0x3f, 0x60, 0xfb, 0xf4, 0x4f, 0xd8, 0x1e, 0xfe, 0x0a, 0xdf, 0xc3, + 0x7f, 0xcc, 0xfe, 0xfc, + 0xe3, 0xa3, 0x3f, 0x86, 0xbd, 0x6b, 0xfe, 0xd1, 0x11, 0xec, 0xe1, 0x3f, + 0x74, 0xf6, 0xf0, 0xef, + 0x1f, 0xfd, 0x01, 0xd7, 0xc3, 0x48, 0x73, 0xd5, 0xf8, 0xb3, 0x51, 0x3e, + 0x3f, 0xb8, 0xc2, 0x7e, + 0x2f, 0xb0, 0xef, 0xac, 0x38, 0x8c, 0x34, 0xa6, 0x94, 0x99, 0xe5, 0x5a, + 0xb9, 0xa9, 0xe6, 0xbc, + 0x7f, 0xce, 0x41, 0xb0, 0xd8, 0xcf, 0xd9, 0x69, 0xba, 0x2d, 0xea, 0x92, + 0x05, 0x3b, 0x5a, 0xf8, + 0x2e, 0xd9, 0xc3, 0xab, 0xaf, 0x89, 0x57, 0x17, 0xc2, 0x6a, 0x18, 0xbf, + 0x62, 0xfe, 0xa9, 0xf1, + 0xf5, 0xde, 0x9f, 0x1b, 0x7f, 0xde, 0xfb, 0x3a, 0xfb, 0xf3, 0xcf, 0x4c, + 0x76, 0x19, 0x7f, 0xd6, + 0xfb, 0x53, 0xe3, 0x4f, 0xd9, 0x9f, 0x7f, 0xca, 0xfe, 0xfc, 0x5a, 0xef, + 0x6b, 0xe6, 0xd7, 0x7a, + 0x5f, 0x35, 0xbe, 0xda, 0xfb, 0xaa, 0xf9, 0x55, 0xa6, 0x87, 0x7f, 0xc0, + 0xf4, 0xaf, 0x38, 0x53, + 0xf4, 0x9b, 0x80, 0xef, 0xc2, 0xf6, 0x9e, 0xa6, 0xf0, 0x5d, 0xb0, 0xe7, + 0x05, 0xee, 0xbb, 0xa8, + 0x75, 0x01, 0xcf, 0xf3, 0x99, 0x6b, 0x2b, 0xdf, 0x65, 0x90, 0xed, 0xac, + 0xc5, 0xd7, 0xe0, 0x5e, + 0xd8, 0xdf, 0xb7, 0x4f, 0x8b, 0xd2, 0xf8, 0xda, 0x4a, 0x17, 0x8a, 0x08, + 0x5d, 0xa8, 0xaa, 0x6b, + 0xd9, 0x91, 0x3c, 0xde, 0xb0, 0x67, 0xa3, 0xe6, 0xf2, 0xc3, 0x56, 0x31, + 0x29, 0x49, 0x7c, 0x4d, + 0xf8, 0x2e, 0x11, 0x74, 0x41, 0x3d, 0x87, 0xb5, 0x18, 0xe3, 0xbc, 0x86, + 0x0c, 0xc4, 0xb6, 0x99, + 0x0f, 0xb4, 0x79, 0xe2, 0xd5, 0x75, 0xc7, 0x0f, 0x5b, 0xe4, 0x1b, 0x3a, + 0xf3, 0xc3, 0x90, 0x75, + 0xbc, 0xed, 0xd8, 0xea, 0x78, 0xed, 0xd8, 0x36, 0xbe, 0x36, 0xcd, 0xa3, + 0xeb, 0xfe, 0xf3, 0xfa, + 0xce, 0x45, 0x65, 0xaf, 0x7a, 0x56, 0x3c, 0x90, 0xc6, 0xd7, 0xac, 0x67, + 0xa3, 0xdc, 0x7f, 0xff, + 0x0a, 0xdb, 0xa7, 0x5f, 0x37, 0xff, 0x9c, 0xed, 0xe1, 0xaf, 0xb3, 0x3f, + 0xff, 0x8c, 0xed, 0xe3, + 0x3f, 0x13, 0x7b, 0xd7, 0x14, 0xfb, 0xf8, 0x6b, 0xb0, 0x87, 0xad, 0xfd, + 0xfb, 0x55, 0xa6, 0x87, + 0xbf, 0x1f, 0x8d, 0x69, 0xe5, 0xdf, 0x77, 0x3e, 0x0e, 0x7e, 0xf5, 0xae, + 0x97, 0x83, 0xbf, 0x62, + 0x53, 0x79, 0x39, 0xf8, 0xfa, 0x82, 0x69, 0xdd, 0x78, 0xf5, 0xb3, 0x80, + 0x81, 0x00, 0xf5, 0x80, + 0x5c, 0x07, 0x4f, 0x72, 0x4d, 0x4f, 0x5d, 0x32, 0xc6, 0x77, 0x41, 0xf2, + 0xfb, 0x79, 0xac, 0x33, + 0x44, 0x17, 0xbe, 0x6a, 0xfe, 0x85, 0xf9, 0x97, 0xbd, 0xbf, 0x34, 0xfe, + 0xd2, 0xfc, 0x0b, 0xe3, + 0x2f, 0xe0, 0xea, 0xfd, 0x85, 0xf1, 0x1f, 0x7b, 0xff, 0x51, 0x5c, 0xe6, + 0x37, 0x8c, 0x6f, 0xf4, + 0xe0, 0xba, 0x67, 0xdc, 0x63, 0xd7, 0x9f, 0x33, 0x7d, 0xfc, 0x93, 0xc5, + 0x6e, 0xdd, 0x59, 0x93, + 0x2b, 0xf4, 0x9b, 0x78, 0x7d, 0x97, 0xdd, 0x5a, 0x5c, 0xba, 0xa0, 0x45, + 0xe0, 0xf9, 0x6c, 0x07, + 0x9e, 0x17, 0xe0, 0x19, 0x67, 0xe5, 0x4d, 0xce, 0x77, 0x82, 0x75, 0xdd, + 0x15, 0x5f, 0x43, 0xc4, + 0xfb, 0x23, 0xea, 0x82, 0x88, 0xf7, 0xa7, 0xae, 0xc9, 0xe3, 0xb5, 0xf7, + 0x28, 0x3c, 0x1b, 0xe1, + 0xb3, 0x58, 0x0a, 0x8a, 0xaf, 0xd9, 0x79, 0x13, 0xee, 0xbb, 0xc4, 0xa5, + 0x0b, 0x5a, 0x84, 0x39, + 0xac, 0xc8, 0x78, 0xff, 0x32, 0x75, 0xb8, 0x16, 0x5f, 0xbb, 0xe3, 0xf5, + 0xc3, 0x60, 0x0f, 0x94, + 0xe6, 0x7a, 0xdd, 0xa5, 0xeb, 0xc1, 0x7b, 0x00, 0x5d, 0xc7, 0x9b, 0xba, + 0xaf, 0xf3, 0x16, 0x21, + 0xbe, 0x96, 0x0d, 0x8b, 0xaf, 0x2d, 0x7c, 0xf1, 0x35, 0xe5, 0x1e, 0xe0, + 0x3b, 0xd8, 0x80, 0x3d, + 0xcc, 0xf6, 0xaf, 0x09, 0xfb, 0xf7, 0x2f, 0xec, 0xfd, 0xcb, 0xae, 0x6f, + 0x58, 0x7b, 0xf8, 0x1e, + 0xdf, 0xc3, 0x7f, 0xce, 0xb4, 0xf1, 0x2b, 0xf1, 0xe5, 0xbc, 0x98, 0x06, + 0xe9, 0xcb, 0x9d, 0xc3, + 0xdd, 0xdb, 0xdb, 0x7b, 0x61, 0xf3, 0x83, 0xa1, 0xdf, 0x04, 0xce, 0x7a, + 0x59, 0x7f, 0xef, 0xdb, + 0x91, 0x66, 0x00, 0xfb, 0x39, 0x33, 0xcb, 0xb6, 0xdc, 0xbf, 0xd7, 0x0a, + 0xd7, 0xd2, 0xad, 0x7d, + 0x69, 0x7c, 0x2d, 0xca, 0x79, 0x41, 0xe1, 0xbb, 0x7c, 0xdd, 0xfc, 0x1b, + 0xe3, 0x6f, 0xcd, 0xbf, + 0x35, 0xfe, 0x86, 0xfd, 0x69, 0x5f, 0x7f, 0x6d, 0xfe, 0xb5, 0x73, 0x89, + 0x9c, 0xfb, 0x5f, 0x19, + 0x7f, 0x05, 0x17, 0x5b, 0xdb, 0xaf, 0x31, 0xfd, 0xcb, 0xc8, 0xfa, 0x4d, + 0x26, 0xea, 0x7e, 0x13, + 0xf7, 0xbd, 0x58, 0xba, 0xd0, 0x54, 0xea, 0x82, 0x84, 0x5d, 0x73, 0x8d, + 0x3c, 0x60, 0x4b, 0x7d, + 0x66, 0x2e, 0xef, 0x6d, 0x2e, 0x8b, 0xec, 0x5e, 0x2a, 0x7b, 0x5e, 0xfe, + 0xa2, 0xf0, 0xc3, 0x20, + 0x6f, 0xc2, 0xcf, 0x28, 0xc8, 0x73, 0x3a, 0xce, 0x7f, 0xdf, 0x56, 0x6a, + 0x11, 0x36, 0xde, 0xbf, + 0xed, 0x9c, 0x99, 0x9d, 0xf8, 0x5a, 0xc3, 0x1d, 0x5f, 0x5b, 0xf9, 0x2e, + 0xdb, 0x7b, 0x7e, 0x5d, + 0x0f, 0x8c, 0xf7, 0x47, 0x8d, 0xeb, 0x85, 0xe7, 0xbc, 0xd4, 0xf1, 0xfe, + 0x93, 0xa0, 0x78, 0xbf, + 0x37, 0xbe, 0xe6, 0xe4, 0x81, 0xdc, 0xf1, 0xb5, 0xa9, 0x37, 0xbe, 0x16, + 0x7b, 0x1d, 0x6f, 0x7c, + 0xb1, 0x6d, 0xee, 0x7b, 0xc0, 0xf9, 0x75, 0x87, 0xed, 0x0f, 0x7f, 0x7c, + 0xcd, 0x93, 0x37, 0x61, + 0xcf, 0x65, 0xb8, 0xd7, 0xe0, 0x78, 0xd2, 0xd7, 0xd9, 0x9e, 0xfd, 0x5b, + 0xb6, 0x87, 0xff, 0xc6, + 0xb5, 0x87, 0xff, 0xda, 0xb5, 0x87, 0x45, 0xdd, 0x0c, 0xdb, 0xbf, 0xe6, + 0x5f, 0xf5, 0xfe, 0x8a, + 0x69, 0xe3, 0xd7, 0x6c, 0xa6, 0x55, 0x0b, 0x13, 0xdb, 0x56, 0x72, 0xaa, + 0x16, 0xe5, 0x06, 0xec, + 0x01, 0xf9, 0xfc, 0x60, 0xe1, 0x7b, 0x14, 0x4e, 0xa0, 0xc6, 0x5a, 0xeb, + 0x58, 0x3f, 0xcf, 0x58, + 0x5f, 0x0b, 0xab, 0x2e, 0x99, 0xcf, 0xdc, 0x54, 0xf0, 0x5c, 0x1c, 0x5d, + 0xa8, 0x5c, 0x9b, 0xdf, + 0xff, 0x0d, 0xf3, 0xef, 0x8d, 0xbf, 0x17, 0x17, 0xb3, 0xff, 0x62, 0xfc, + 0x17, 0xe7, 0xfa, 0xcf, + 0xc6, 0x7f, 0xe6, 0xd7, 0xdf, 0xd9, 0x66, 0xfc, 0x1d, 0x5b, 0xdb, 0xaf, + 0xcf, 0xcb, 0x0d, 0x95, + 0xef, 0xc2, 0xf7, 0x28, 0x7b, 0xf6, 0x49, 0xe3, 0x6b, 0x56, 0x0e, 0x29, + 0x4a, 0x5c, 0x6f, 0x23, + 0x26, 0x5d, 0xd8, 0x89, 0x56, 0x97, 0xe3, 0x8b, 0xaf, 0x79, 0x75, 0x1d, + 0xce, 0xbc, 0x95, 0xd3, + 0xcd, 0x83, 0xec, 0x48, 0x12, 0x5f, 0xbb, 0x0f, 0xb5, 0xec, 0x79, 0x94, + 0xef, 0x92, 0xf1, 0xf1, + 0x78, 0xdd, 0xf9, 0x70, 0x57, 0xde, 0xe4, 0xee, 0x7a, 0x7c, 0x2d, 0x28, + 0x1f, 0x2e, 0x8f, 0xf7, + 0x87, 0xf4, 0xa2, 0x87, 0xea, 0xc2, 0x55, 0x6b, 0x56, 0xbd, 0xcf, 0x95, + 0xf4, 0xa4, 0xd0, 0x02, + 0x5d, 0x08, 0x8b, 0xaf, 0x81, 0x1f, 0x96, 0xe6, 0xfe, 0xbb, 0x8e, 0x65, + 0xdd, 0x21, 0x7a, 0x4e, + 0x11, 0x39, 0x2f, 0x54, 0xfe, 0x7d, 0xc3, 0x7a, 0x36, 0x6a, 0x2d, 0x47, + 0xd7, 0xfd, 0xf1, 0x35, + 0x51, 0x97, 0x7c, 0x08, 0x75, 0x28, 0xd9, 0xc0, 0x67, 0xd4, 0x37, 0xcc, + 0xbf, 0x77, 0xed, 0xe1, + 0xd5, 0xfe, 0x65, 0x3b, 0xd8, 0xda, 0xc3, 0xab, 0xfd, 0xfb, 0x77, 0x4c, + 0x1b, 0xbf, 0x8e, 0xcc, + 0x79, 0x6d, 0x5e, 0x35, 0xb6, 0xed, 0xd1, 0x32, 0xfb, 0x5e, 0x38, 0xff, + 0x79, 0xa9, 0x37, 0xf5, + 0x39, 0xfb, 0x9d, 0x8c, 0x52, 0x9d, 0xb0, 0xe7, 0xa8, 0xed, 0xbb, 0xac, + 0xcf, 0xdc, 0x74, 0x71, + 0xf0, 0xc7, 0xf9, 0x16, 0x4a, 0x17, 0xb8, 0xef, 0x22, 0xd7, 0x85, 0xe0, + 0xaa, 0xf2, 0xff, 0x6a, + 0xfc, 0x57, 0x71, 0x71, 0xfb, 0x07, 0xf3, 0x1f, 0x0c, 0xeb, 0x32, 0xff, + 0x81, 0x3d, 0xbf, 0x31, + 0x75, 0x39, 0x16, 0x93, 0xda, 0xe2, 0x74, 0x15, 0xbc, 0xf1, 0x35, 0x6b, + 0xbe, 0x09, 0xfc, 0x1e, + 0xc4, 0x7c, 0x93, 0x94, 0x74, 0xbe, 0x89, 0x3f, 0xde, 0x1f, 0xda, 0xe3, + 0xb2, 0x50, 0xe5, 0x01, + 0xaf, 0x17, 0xef, 0xd7, 0xfc, 0x7e, 0xd8, 0x5d, 0xbf, 0xae, 0xfb, 0xe2, + 0x6b, 0xaa, 0x78, 0x7f, + 0x6c, 0xb5, 0xec, 0xd1, 0xe3, 0xfd, 0xa0, 0xeb, 0x50, 0xdf, 0x0a, 0xbe, + 0x8b, 0x24, 0xbe, 0x66, + 0xe5, 0x4d, 0x52, 0xdd, 0x22, 0x56, 0x17, 0x62, 0xae, 0x59, 0x55, 0x3e, + 0x1b, 0xd9, 0x6b, 0xf2, + 0x9c, 0xd7, 0x91, 0x3c, 0xbe, 0x06, 0xba, 0x5e, 0x3c, 0x2d, 0xd7, 0xaa, + 0x27, 0xf9, 0x5a, 0x68, + 0xcd, 0x56, 0xcc, 0x35, 0xab, 0x5c, 0x17, 0x8e, 0xd5, 0x39, 0xaf, 0xb5, + 0xd8, 0x36, 0xc4, 0xd7, + 0x86, 0xeb, 0x75, 0xc9, 0xf6, 0x9e, 0xf1, 0xe5, 0xc3, 0x0d, 0xe9, 0x0e, + 0xf6, 0xec, 0x61, 0x67, + 0xff, 0xf2, 0x0b, 0x55, 0x9b, 0x86, 0x8c, 0x6d, 0x87, 0x73, 0x5a, 0x56, + 0x33, 0x3d, 0x8a, 0xa7, + 0x4c, 0xff, 0x4e, 0x56, 0xf1, 0x3e, 0xd5, 0x19, 0x85, 0x9f, 0x17, 0xdc, + 0xf1, 0xb5, 0x35, 0x0e, + 0x3e, 0xf8, 0x2e, 0x5b, 0xfb, 0x61, 0xf1, 0x35, 0x27, 0xde, 0x1f, 0x72, + 0x5e, 0x78, 0xc6, 0x7c, + 0x96, 0xd9, 0x07, 0x8c, 0x0f, 0x8f, 0x3e, 0xd2, 0xfa, 0x40, 0xef, 0x59, + 0xe3, 0x59, 0x33, 0xc4, + 0x8e, 0x3e, 0xd4, 0x79, 0xdf, 0xac, 0xd8, 0xb8, 0x42, 0x1d, 0xaf, 0x67, + 0x2d, 0xa4, 0x79, 0x93, + 0x49, 0x76, 0x6d, 0xbe, 0x49, 0xcc, 0x9c, 0x6e, 0xae, 0x0b, 0x99, 0xeb, + 0xc7, 0xfb, 0xb9, 0x1f, + 0x06, 0x7b, 0x74, 0xe7, 0x62, 0x67, 0xdf, 0xf3, 0xbc, 0xbe, 0x5d, 0xf6, + 0xd6, 0x25, 0x0f, 0x73, + 0x6d, 0x5e, 0xc7, 0x6b, 0xc6, 0x50, 0xc7, 0x8b, 0xce, 0x79, 0xe1, 0xb8, + 0x1d, 0x29, 0xa8, 0xe3, + 0x05, 0xdf, 0x45, 0x1a, 0x5f, 0xab, 0xf0, 0xfa, 0x35, 0xae, 0x45, 0x93, + 0x54, 0xd3, 0xa3, 0xeb, + 0x57, 0xaf, 0x59, 0x65, 0xba, 0x90, 0xc1, 0xe9, 0xc2, 0x15, 0x62, 0xdb, + 0x56, 0x7c, 0x4d, 0xd4, + 0x25, 0xdb, 0xba, 0x6e, 0xcd, 0x66, 0x94, 0xc6, 0xd7, 0x1e, 0xa6, 0x9a, + 0x55, 0xdf, 0x3a, 0x80, + 0xae, 0x6f, 0x9e, 0xec, 0xd4, 0x9c, 0x9a, 0xad, 0xa7, 0x7c, 0xf1, 0xb5, + 0xc1, 0xbb, 0xdb, 0x6c, + 0x67, 0xc2, 0xbe, 0x35, 0x3e, 0x38, 0xfc, 0x48, 0xfb, 0x43, 0x47, 0xcf, + 0x76, 0x43, 0xf7, 0x70, + 0xef, 0xdd, 0x46, 0x15, 0x57, 0xcb, 0x5e, 0x47, 0xd6, 0xac, 0x22, 0x7a, + 0xdf, 0xf4, 0x4e, 0x89, + 0xe9, 0x1f, 0xcc, 0x3a, 0x4f, 0x4f, 0x32, 0x6d, 0xc8, 0x85, 0x44, 0x5d, + 0x93, 0x35, 0x9e, 0xcb, + 0x5d, 0x75, 0x7c, 0x0d, 0x0c, 0x1b, 0xeb, 0xac, 0x5e, 0xbf, 0xbe, 0x1f, + 0x1f, 0xef, 0x07, 0x5d, + 0x9f, 0x6c, 0x36, 0x79, 0xfe, 0x2b, 0x30, 0xbe, 0xb6, 0xaa, 0x4b, 0x8e, + 0x54, 0xc7, 0x1b, 0xa8, + 0x0b, 0x65, 0xf3, 0x51, 0x54, 0x1d, 0xef, 0x63, 0x57, 0xaa, 0xe3, 0x2d, + 0x30, 0xdf, 0x65, 0xd5, + 0x6f, 0xc2, 0x9e, 0x51, 0x01, 0xba, 0x0e, 0xba, 0x10, 0x56, 0x1b, 0x10, + 0x6f, 0x1d, 0x2f, 0xbb, + 0x5f, 0x45, 0xce, 0x0b, 0xbe, 0xc6, 0x60, 0xab, 0xf2, 0x7f, 0x2f, 0xab, + 0x87, 0xde, 0x67, 0xa3, + 0xa6, 0xe8, 0x37, 0xb1, 0xe2, 0x6b, 0xfd, 0xc7, 0x3b, 0xfe, 0xf3, 0xba, + 0x5c, 0x17, 0x5c, 0xeb, + 0x1f, 0x5a, 0xc7, 0x1b, 0xb4, 0x07, 0xca, 0xdd, 0x47, 0x43, 0xf5, 0xef, + 0x3b, 0x5a, 0xb2, 0x67, + 0xe3, 0x1b, 0xcd, 0xe7, 0x98, 0x7d, 0xc2, 0x80, 0x7e, 0x13, 0xf8, 0x3d, + 0x55, 0xfd, 0xf1, 0x35, + 0x57, 0x3e, 0x9c, 0xd7, 0x25, 0x5b, 0xe7, 0xf4, 0x74, 0x7c, 0x7b, 0x40, + 0x5d, 0xb3, 0x8a, 0x8c, + 0x61, 0x69, 0xf3, 0x32, 0x3f, 0x03, 0x84, 0xf7, 0x9b, 0xe4, 0x1b, 0xf0, + 0x9a, 0xc5, 0xb1, 0xa2, + 0xdf, 0x64, 0x18, 0xa5, 0x66, 0x35, 0x1b, 0x57, 0x6d, 0x5a, 0xab, 0x74, + 0xaa, 0x37, 0xdc, 0xdf, + 0x77, 0x9d, 0x78, 0x3f, 0x70, 0xf0, 0xf3, 0xdc, 0x77, 0xd9, 0xd9, 0x0b, + 0xac, 0x73, 0x70, 0xf2, + 0x26, 0xa9, 0x6e, 0x94, 0x3a, 0x5e, 0xed, 0x81, 0xae, 0x49, 0xbe, 0x03, + 0xb1, 0xf7, 0xca, 0xd1, + 0xcb, 0xbb, 0xaf, 0x18, 0xbd, 0xaa, 0xfd, 0x6d, 0xb3, 0xd7, 0x34, 0x5e, + 0x77, 0xf6, 0x2d, 0xec, + 0x5c, 0xf8, 0x92, 0xb7, 0x3c, 0x79, 0xf6, 0xe4, 0xc1, 0x13, 0xa7, 0x4f, + 0xd4, 0x5e, 0x77, 0xfc, + 0x7f, 0x1c, 0x6e, 0x9e, 0x56, 0x0e, 0x1e, 0x59, 0xbe, 0xaa, 0xfe, 0x78, + 0xef, 0xf1, 0xee, 0x63, + 0xe6, 0x63, 0x06, 0xbb, 0xd8, 0x8e, 0x82, 0xff, 0x5d, 0xed, 0x8c, 0xc7, + 0x7a, 0x8f, 0x1b, 0xff, + 0xe7, 0xf9, 0x4b, 0xf6, 0x5f, 0xdd, 0x7f, 0xac, 0xf3, 0x98, 0x69, 0x5b, + 0x99, 0xff, 0xb7, 0xd7, + 0x9b, 0x5f, 0x62, 0x7b, 0x1d, 0xfe, 0xf6, 0xa8, 0xf9, 0xd8, 0xf0, 0x35, + 0xed, 0x27, 0x8f, 0x5f, + 0x73, 0x08, 0x3f, 0x67, 0xc3, 0x7c, 0xc4, 0xf5, 0x33, 0xca, 0xec, 0xc9, + 0x78, 0x69, 0x8a, 0x7f, + 0x7b, 0xcc, 0x7c, 0xe5, 0xfc, 0x89, 0xc6, 0x13, 0xd3, 0x97, 0x37, 0xe1, + 0xef, 0x8f, 0x04, 0xbc, + 0xf7, 0x47, 0xe1, 0xa7, 0x07, 0xc4, 0xf5, 0x1e, 0x65, 0xef, 0xf1, 0x15, + 0xc3, 0x57, 0xb5, 0x5f, + 0x3d, 0x7d, 0x4d, 0xf3, 0xb5, 0xa7, 0xec, 0x5e, 0xb8, 0x0e, 0x3e, 0xba, + 0xf7, 0xe4, 0xe9, 0x13, + 0x07, 0xaf, 0x3b, 0x7e, 0xed, 0xe1, 0x6b, 0xe6, 0xff, 0xbc, 0x21, 0x74, + 0xbd, 0xd2, 0xb1, 0xef, + 0xc5, 0x7e, 0x0f, 0xa0, 0x0b, 0xaf, 0x9b, 0x3c, 0xde, 0x5a, 0xbd, 0xff, + 0x80, 0x57, 0x3e, 0xfa, + 0x47, 0xdd, 0xd7, 0x9d, 0x3e, 0x79, 0xf0, 0xca, 0xa3, 0xc7, 0xba, 0xf6, + 0x57, 0x3d, 0xca, 0x95, + 0xdb, 0xbe, 0x5b, 0xb8, 0xdf, 0x7b, 0xa6, 0xc9, 0x7c, 0x97, 0x27, 0x97, + 0xdf, 0x76, 0xb8, 0xfa, + 0x59, 0xab, 0xff, 0x2e, 0xcc, 0x10, 0x5e, 0xd2, 0x7c, 0xb7, 0xb1, 0x3d, + 0x7d, 0xb4, 0xe9, 0xfe, + 0x3a, 0x7b, 0x0d, 0x1e, 0x33, 0x1f, 0x37, 0x5e, 0x3e, 0x78, 0x25, 0xbb, + 0x97, 0x6f, 0x6d, 0x54, + 0x2f, 0x9e, 0xd8, 0x7f, 0xf2, 0x96, 0xf5, 0x39, 0xbb, 0xf5, 0xd2, 0xbd, + 0x2f, 0xf7, 0x3f, 0xd5, + 0xd9, 0x5a, 0x7e, 0xeb, 0xe1, 0xab, 0x47, 0xaf, 0x68, 0xbf, 0xfc, 0xe8, + 0xf1, 0xee, 0xe3, 0xec, + 0x5e, 0x1e, 0x9f, 0xfc, 0x4f, 0xcd, 0x97, 0x1c, 0xbf, 0xba, 0xe6, 0xfe, + 0x59, 0x8f, 0xf9, 0xd7, + 0x9f, 0x7d, 0xdd, 0xb7, 0x2f, 0x9f, 0x3c, 0x7c, 0xcd, 0xe8, 0xb1, 0xb6, + 0xff, 0xfe, 0x1e, 0x71, + 0x7f, 0x5f, 0xff, 0x95, 0x5d, 0xd8, 0x03, 0xff, 0x57, 0xef, 0x4b, 0x86, + 0xb1, 0xb6, 0xf2, 0x8f, + 0x38, 0x7f, 0x7f, 0xee, 0xe8, 0xf9, 0x0e, 0xc4, 0xb6, 0x3d, 0xdf, 0x6b, + 0xad, 0xc9, 0x1b, 0xd9, + 0x3a, 0xbc, 0xc0, 0x2e, 0xf8, 0x4a, 0x5e, 0xaf, 0x37, 0xcb, 0x36, 0x72, + 0xb3, 0xff, 0xb1, 0xf1, + 0x9a, 0xe5, 0x6b, 0xeb, 0x4f, 0xb0, 0xcf, 0x17, 0x7c, 0xc6, 0x9e, 0xbc, + 0xa8, 0xee, 0x55, 0x2e, + 0xfe, 0xe7, 0xfd, 0xef, 0x98, 0xbf, 0xa6, 0xfe, 0xea, 0xf1, 0xab, 0x5a, + 0x4f, 0x9c, 0xbc, 0xb6, + 0xf6, 0x72, 0x47, 0xd7, 0x1f, 0x0d, 0x5c, 0x3d, 0xd8, 0x03, 0x2f, 0x5b, + 0xbc, 0xb2, 0xfe, 0x88, + 0xb5, 0xee, 0xfe, 0x35, 0xe6, 0x9f, 0x4d, 0xf6, 0x79, 0xfc, 0x8e, 0x93, + 0x27, 0x6b, 0xdf, 0x36, + 0x78, 0xa4, 0xf3, 0xc8, 0xda, 0x57, 0x3d, 0x12, 0x3d, 0xe7, 0xe5, 0x65, + 0xd5, 0x4b, 0xfb, 0x4d, + 0x40, 0xbf, 0x77, 0x42, 0x78, 0x2e, 0x91, 0x6a, 0x56, 0x63, 0xcd, 0x79, + 0x95, 0x9a, 0xa5, 0x93, + 0x8c, 0xd2, 0x6f, 0x74, 0xaf, 0xc9, 0x86, 0x89, 0xe8, 0x41, 0x3c, 0xce, + 0x1e, 0x06, 0xc5, 0x1a, + 0x57, 0x79, 0x93, 0x62, 0x8d, 0x6b, 0xd1, 0x38, 0xd5, 0x0a, 0xad, 0xc5, + 0x7b, 0x91, 0xd6, 0x64, + 0xf7, 0xe2, 0xbf, 0x3d, 0x78, 0xc1, 0x15, 0xb3, 0x78, 0xe1, 0x68, 0xb7, + 0xfb, 0x8f, 0x07, 0x9f, + 0x6d, 0xbb, 0xe3, 0x18, 0xdf, 0xcd, 0x3e, 0xbb, 0x4f, 0x4e, 0x2e, 0x9b, + 0xee, 0x7f, 0x7b, 0xb6, + 0x77, 0x62, 0xc0, 0x9f, 0xaf, 0xe7, 0x3f, 0xe9, 0x69, 0xf6, 0xb7, 0x7b, + 0xc6, 0xbf, 0x61, 0x9f, + 0x67, 0x6f, 0x04, 0xe4, 0x59, 0xfe, 0x5f, 0x9f, 0x63, 0x7f, 0x33, 0xf8, + 0x7e, 0x70, 0xff, 0xb7, + 0x37, 0x5a, 0x1a, 0xf0, 0x9c, 0x73, 0xf6, 0xbb, 0xe4, 0xfa, 0x57, 0x36, + 0x5f, 0xf0, 0x7c, 0xdd, + 0x0b, 0x3e, 0xdd, 0x10, 0x9f, 0x6f, 0xf8, 0xb7, 0x47, 0x8f, 0xfe, 0xd7, + 0xb5, 0x78, 0xff, 0xa3, + 0x6c, 0xbf, 0xad, 0xbe, 0xf7, 0x9e, 0xf1, 0x4f, 0xc6, 0xf9, 0xd6, 0xb7, + 0x0e, 0xef, 0xb9, 0xee, + 0xe7, 0x1b, 0xc6, 0x4b, 0xd9, 0x19, 0xf1, 0x7f, 0x98, 0x7d, 0xae, 0xe1, + 0x7b, 0x37, 0x46, 0x71, + 0xd9, 0xaa, 0x87, 0xbf, 0xb2, 0xf0, 0x23, 0x9e, 0x19, 0x5c, 0x76, 0x5c, + 0xaf, 0xc1, 0xf7, 0x3a, + 0xfc, 0xcd, 0x3e, 0xbd, 0xc2, 0xfd, 0x9a, 0xb3, 0x9d, 0x86, 0x77, 0x2d, + 0x9e, 0x5e, 0x3b, 0xeb, + 0x1a, 0xa6, 0x61, 0x0c, 0x4f, 0x76, 0x6b, 0xff, 0xde, 0xf3, 0xf3, 0xde, + 0xb8, 0xd2, 0x46, 0xfb, + 0x15, 0xfa, 0xff, 0xaa, 0x5b, 0x9d, 0x5f, 0x36, 0x2e, 0x7b, 0x6f, 0x37, + 0x78, 0xde, 0xe4, 0x78, + 0x52, 0xbb, 0xec, 0x3f, 0xdf, 0xdd, 0x3d, 0x79, 0xfe, 0xd0, 0xfd, 0x75, + 0x9f, 0x9d, 0x7e, 0x53, + 0xf3, 0xc3, 0x7d, 0xf7, 0xcf, 0x12, 0x3f, 0xcd, 0x5e, 0xff, 0x47, 0x7d, + 0xf1, 0xa9, 0x17, 0x82, + 0x15, 0xd9, 0xb1, 0x26, 0xf3, 0xf9, 0xd8, 0xf7, 0xfa, 0xf4, 0xcf, 0xfe, + 0x69, 0xd6, 0x77, 0x1c, + 0xb1, 0xf7, 0x71, 0xfc, 0x8f, 0x0e, 0xbf, 0xe4, 0x7d, 0xc7, 0x7c, 0x4d, + 0xca, 0xec, 0xd3, 0xf1, + 0x28, 0xfc, 0xcd, 0x13, 0xd7, 0xf3, 0xbd, 0xca, 0xb0, 0xd1, 0xde, 0x3d, + 0x9b, 0x78, 0x3f, 0x37, + 0xfd, 0x5a, 0x07, 0xe2, 0x6b, 0x6f, 0xea, 0x5d, 0x1a, 0x41, 0xef, 0x16, + 0xe2, 0x7a, 0xcf, 0x1f, + 0x5d, 0x76, 0x8d, 0xb5, 0xd8, 0xf9, 0xd3, 0x6b, 0x9f, 0x9f, 0xcf, 0x9a, + 0x65, 0x23, 0xec, 0x13, + 0x25, 0x6a, 0x56, 0x8b, 0xd7, 0x98, 0x41, 0x29, 0x62, 0x4a, 0xb2, 0x3e, + 0x42, 0x3f, 0xcf, 0x25, + 0x52, 0x2d, 0xfb, 0x19, 0xbe, 0x66, 0x15, 0xc3, 0x69, 0x29, 0x2d, 0xd3, + 0x28, 0xfd, 0xbb, 0xfa, + 0x5c, 0x4e, 0xff, 0xfc, 0xe0, 0xd5, 0x2c, 0xf6, 0xb0, 0xf9, 0xc1, 0x91, + 0xfb, 0x7e, 0xb0, 0x4c, + 0x6a, 0x4c, 0xbc, 0x7f, 0xf9, 0xc1, 0x3a, 0x7c, 0x6e, 0xdc, 0xcf, 0xcf, + 0x67, 0xf9, 0x27, 0x89, + 0x9d, 0x27, 0xfa, 0xaf, 0xe8, 0xbc, 0xaa, 0x7f, 0xd9, 0xbd, 0x9c, 0xbe, + 0xac, 0xf9, 0xc4, 0xe4, + 0xb2, 0x75, 0x39, 0x79, 0xb2, 0xf9, 0xe4, 0xd9, 0x13, 0x07, 0xdf, 0x39, + 0xb9, 0xd7, 0xba, 0x1c, + 0xfc, 0xfb, 0xce, 0x3b, 0xd8, 0x67, 0xf0, 0x5e, 0xef, 0x7f, 0xe9, 0x32, + 0xf5, 0x33, 0xee, 0x31, + 0x2d, 0x82, 0x33, 0x8a, 0xd0, 0x01, 0xb0, 0xd7, 0x73, 0x25, 0x5a, 0xed, + 0x3f, 0xb1, 0xfb, 0x1e, + 0x9f, 0xbc, 0xae, 0xf9, 0xe4, 0xe2, 0xd5, 0xf5, 0x47, 0x9d, 0x1d, 0xe7, + 0xd7, 0x3f, 0xae, 0x6f, + 0xc6, 0x6b, 0x86, 0x97, 0x4c, 0xb3, 0xde, 0xbc, 0x76, 0x6a, 0x12, 0x5f, + 0xf9, 0x28, 0x68, 0x87, + 0x69, 0xf4, 0xff, 0x69, 0x07, 0xb4, 0xcc, 0xeb, 0x47, 0xac, 0x9e, 0xf6, + 0x4f, 0xf3, 0xcf, 0xfa, + 0x06, 0xbc, 0x0f, 0xa3, 0x35, 0x7b, 0x75, 0xe3, 0x95, 0xa3, 0x57, 0xb7, + 0x6a, 0x4c, 0x6b, 0xbe, + 0xb1, 0xd8, 0xad, 0x7f, 0x84, 0xe9, 0xc4, 0x33, 0x8b, 0x27, 0xea, 0x4f, + 0x9c, 0xbc, 0xae, 0xf6, + 0xda, 0x31, 0xbb, 0x37, 0xa6, 0x31, 0xff, 0x7a, 0x74, 0xd9, 0xbe, 0x67, + 0xbe, 0xde, 0x58, 0x9d, + 0x71, 0x25, 0xcf, 0xc6, 0xf3, 0xd7, 0xee, 0x3f, 0x6e, 0xbe, 0x60, 0x88, + 0x75, 0x7b, 0xc4, 0xc9, + 0x61, 0xb9, 0xf5, 0xaf, 0xc7, 0x9e, 0x8d, 0xf0, 0x6f, 0x6f, 0x76, 0x9d, + 0xc3, 0x02, 0xe3, 0xfd, + 0xe7, 0x2f, 0x73, 0xad, 0x99, 0x7d, 0x12, 0x35, 0xf8, 0x3b, 0x77, 0x4e, + 0x2b, 0x10, 0xd7, 0x03, + 0xfd, 0xe3, 0xab, 0x55, 0x36, 0xb5, 0x9e, 0xd9, 0xbd, 0xec, 0x7d, 0xc2, + 0x28, 0x4e, 0x3e, 0xd5, + 0xbc, 0x1c, 0x3c, 0xd3, 0x79, 0xd2, 0x3a, 0x4b, 0x3d, 0x72, 0xda, 0xac, + 0x5d, 0xf6, 0x3e, 0x67, + 0x7c, 0xfb, 0xe4, 0xd5, 0xcd, 0x57, 0x0e, 0x5e, 0xd1, 0x7e, 0xbc, 0xf7, + 0xcd, 0x3c, 0x0e, 0x23, + 0xd6, 0xbf, 0x6c, 0x82, 0x46, 0xbd, 0x99, 0x9d, 0x8b, 0x5e, 0xcb, 0xce, + 0x45, 0x70, 0x4e, 0xf7, + 0xbf, 0x1f, 0xf7, 0xab, 0xbe, 0x99, 0xad, 0xd9, 0x37, 0x46, 0xff, 0xba, + 0xe5, 0x56, 0x3b, 0x99, + 0xfe, 0x55, 0xe6, 0xcf, 0x36, 0xdc, 0x9f, 0xa1, 0xb5, 0x95, 0xf3, 0xc4, + 0xf5, 0x7c, 0xaf, 0xc2, + 0x9e, 0x51, 0xff, 0x72, 0x70, 0xd4, 0x81, 0xf7, 0xfd, 0xda, 0x93, 0x27, + 0x0e, 0x9f, 0x3c, 0x69, + 0xd5, 0xf8, 0x33, 0xea, 0xfc, 0xa5, 0x5c, 0x13, 0x5f, 0x33, 0x63, 0xf7, + 0x32, 0x7c, 0x45, 0xfb, + 0x6d, 0xec, 0xfd, 0x3c, 0x6b, 0x9d, 0x0d, 0xa0, 0xc7, 0xe5, 0x53, 0x2e, + 0xfd, 0xf3, 0xae, 0xb1, + 0xf5, 0xe9, 0x3d, 0x7a, 0x45, 0xf7, 0x09, 0x76, 0x4e, 0xff, 0x6f, 0xf8, + 0x1e, 0x10, 0xde, 0x8a, + 0xfd, 0xb5, 0xe5, 0xfb, 0x95, 0xf3, 0x62, 0x7e, 0x23, 0xd4, 0xcd, 0x6d, + 0x2e, 0x43, 0x78, 0x2e, + 0x90, 0x37, 0x79, 0x11, 0x6a, 0xd9, 0x21, 0xe7, 0x55, 0x5a, 0xa4, 0x9a, + 0x18, 0xfd, 0x8b, 0x25, + 0xde, 0xbf, 0xea, 0xfb, 0x3f, 0x74, 0xf7, 0xca, 0x07, 0xcd, 0x0f, 0x86, + 0xb3, 0xb7, 0xe0, 0x7c, + 0xc5, 0xd4, 0xf7, 0x83, 0x5d, 0x13, 0x88, 0xeb, 0x2d, 0x3e, 0x51, 0x0f, + 0xfb, 0x84, 0xf3, 0x4f, + 0x18, 0xd3, 0x3d, 0xae, 0x47, 0xa3, 0x62, 0x9b, 0xe7, 0x4d, 0x4e, 0x9e, + 0xa9, 0x5d, 0x8e, 0xbf, + 0xbb, 0xc5, 0xff, 0xb4, 0xce, 0x59, 0xff, 0xdb, 0x34, 0xdf, 0xac, 0x32, + 0x5d, 0xb0, 0x35, 0xcc, + 0x3e, 0x15, 0xae, 0xf4, 0x4f, 0x7c, 0xfe, 0x32, 0x93, 0x46, 0x73, 0x32, + 0xee, 0xb5, 0x0c, 0xfe, + 0x0a, 0xb0, 0x17, 0xbe, 0x24, 0xb4, 0x8c, 0x7f, 0xf5, 0xe5, 0x4a, 0x17, + 0xa6, 0x70, 0xde, 0x7c, + 0x2c, 0xd0, 0xf3, 0x7d, 0x84, 0x29, 0x1a, 0xd7, 0x0a, 0xa6, 0x0b, 0x6f, + 0x38, 0xdd, 0xaa, 0x79, + 0xcf, 0xcc, 0xaf, 0xb7, 0x7e, 0x9e, 0xc1, 0x9f, 0xfa, 0xcf, 0x5a, 0x7b, + 0xe4, 0x89, 0x99, 0x78, + 0xf6, 0xf1, 0x77, 0xd1, 0xcf, 0x76, 0x3f, 0xc1, 0xce, 0x16, 0xc3, 0xe5, + 0xce, 0x21, 0x7f, 0x5e, + 0x2f, 0x98, 0xb6, 0x4c, 0x9e, 0x68, 0x4d, 0xd8, 0x3d, 0x7e, 0x79, 0x30, + 0x6c, 0xf7, 0x07, 0x47, + 0xed, 0xde, 0x91, 0xd9, 0xfd, 0xe6, 0xa0, 0x7e, 0x13, 0x27, 0xae, 0xb7, + 0xb6, 0x4a, 0xec, 0x0e, + 0xc4, 0xeb, 0x82, 0xce, 0x1c, 0x2d, 0xab, 0x87, 0xee, 0x7f, 0x33, 0x82, + 0xd4, 0x14, 0x74, 0xe1, + 0xfc, 0x49, 0x6b, 0xcd, 0xde, 0xec, 0x7c, 0xa5, 0x77, 0x5d, 0x0c, 0xf3, + 0xf5, 0x10, 0xd7, 0x5b, + 0x5c, 0x36, 0xec, 0xd3, 0xcb, 0x23, 0xce, 0x73, 0x03, 0xde, 0xc3, 0x27, + 0x8c, 0xa3, 0x41, 0xbf, + 0x3d, 0x9c, 0x8c, 0x9a, 0xff, 0xe6, 0xf4, 0x0d, 0x5c, 0x3b, 0x26, 0xf3, + 0x49, 0x7d, 0x32, 0x9b, + 0x34, 0xc6, 0xb3, 0xff, 0xa7, 0x01, 0x7e, 0xd8, 0x27, 0x98, 0x76, 0x98, + 0xcc, 0x0f, 0xe3, 0xeb, + 0xd1, 0xeb, 0x19, 0xec, 0xbf, 0xd5, 0xd9, 0x1f, 0x46, 0x39, 0x40, 0xff, + 0xec, 0xa7, 0x51, 0xea, + 0xe8, 0xcb, 0xdd, 0x6f, 0x0c, 0xff, 0xf7, 0xb6, 0x42, 0xff, 0x0c, 0xd0, + 0xbf, 0xad, 0xc9, 0x49, + 0x13, 0xde, 0x97, 0xe1, 0xd8, 0xa3, 0x21, 0xf5, 0x7a, 0xee, 0x57, 0xd9, + 0x60, 0x77, 0x79, 0x8f, + 0x3f, 0xcd, 0xe0, 0xdf, 0x32, 0xa0, 0x0b, 0x6c, 0x6d, 0xbf, 0xdc, 0xbb, + 0xd7, 0xb5, 0x7d, 0x09, + 0x3b, 0xbe, 0x36, 0x1e, 0x5e, 0x76, 0x3e, 0x39, 0xca, 0xb7, 0x21, 0x6f, + 0x02, 0xfd, 0x76, 0x9f, + 0xea, 0xad, 0xf4, 0xcf, 0xbb, 0xc6, 0xd6, 0xfb, 0x0b, 0xe0, 0xb2, 0xbb, + 0x9f, 0x51, 0xf7, 0x85, + 0x5d, 0x63, 0xc5, 0xb0, 0xf8, 0xe7, 0x31, 0x88, 0xe7, 0xe2, 0xee, 0x37, + 0x39, 0x57, 0xf4, 0x9b, + 0x58, 0xbd, 0x6f, 0x71, 0xf1, 0x97, 0x21, 0xb6, 0x5d, 0x9a, 0x6b, 0x28, + 0xfd, 0x8b, 0xb4, 0x26, + 0x23, 0xdc, 0x5c, 0x4e, 0x7d, 0x92, 0x6b, 0x86, 0xd6, 0x25, 0x2f, 0xcb, + 0x87, 0xd5, 0x63, 0xbd, + 0xb6, 0x11, 0x07, 0xe7, 0x0b, 0xbd, 0x26, 0xd5, 0x43, 0xac, 0xfe, 0xbd, + 0xda, 0xe7, 0x57, 0xbd, + 0x63, 0x5a, 0x6a, 0x42, 0xed, 0x1d, 0xf7, 0x05, 0x99, 0x16, 0xf2, 0x7e, + 0x93, 0x8b, 0xd7, 0xed, + 0x7b, 0xfd, 0x91, 0xe7, 0x5c, 0x3f, 0x4f, 0xe8, 0x9f, 0xbe, 0x7c, 0x69, + 0xfd, 0x1b, 0xa6, 0xf0, + 0x6b, 0xd6, 0x3d, 0xae, 0xcb, 0x95, 0x2e, 0xcc, 0x64, 0xfa, 0xf7, 0x18, + 0x7f, 0x4f, 0x76, 0xbc, + 0xff, 0x49, 0xe6, 0x5f, 0x78, 0xd5, 0xd1, 0xfd, 0xd3, 0xbe, 0xc4, 0x77, + 0x04, 0xfc, 0xed, 0x75, + 0x13, 0xf1, 0xbb, 0xb7, 0x4f, 0x99, 0xe2, 0x3d, 0x59, 0x75, 0xc9, 0x43, + 0xb8, 0x87, 0xd7, 0x72, + 0xfd, 0x73, 0x7f, 0xf7, 0xa7, 0x26, 0xc5, 0xa6, 0xbf, 0x2e, 0x59, 0x73, + 0x98, 0x56, 0xeb, 0xfa, + 0xe7, 0xb6, 0xc1, 0xf1, 0xae, 0xc7, 0x37, 0x7d, 0xb3, 0xac, 0x8e, 0xf7, + 0xc2, 0xd6, 0xbf, 0x95, + 0xe7, 0xee, 0x5d, 0x97, 0x2f, 0x99, 0x55, 0xa8, 0xd7, 0xe3, 0xfa, 0xf7, + 0x7a, 0xae, 0xe9, 0xf7, + 0xf8, 0x19, 0xc7, 0xd6, 0x3f, 0x27, 0xd6, 0xc0, 0xcf, 0x0b, 0xb7, 0x07, + 0xde, 0xdf, 0xd3, 0xcb, + 0xd8, 0xe7, 0x0d, 0x7c, 0xc5, 0xd1, 0xbc, 0x58, 0xff, 0xe7, 0x83, 0x7b, + 0xed, 0xf5, 0xe8, 0x84, + 0xdc, 0xff, 0xfd, 0xee, 0x79, 0xae, 0xae, 0xd4, 0x3f, 0xe6, 0x87, 0x83, + 0x2e, 0xbc, 0x10, 0xb0, + 0xee, 0xc1, 0xf1, 0x7e, 0xff, 0xab, 0xbc, 0x31, 0xe0, 0x95, 0x0d, 0x23, + 0xc5, 0x7c, 0x0f, 0xf8, + 0x9b, 0x1d, 0x5f, 0x83, 0xdf, 0xcd, 0xf3, 0x50, 0xd3, 0x65, 0xf5, 0x9b, + 0xc0, 0xf9, 0xaf, 0xd7, + 0x4f, 0x77, 0xd6, 0xd7, 0xd8, 0x7a, 0x7f, 0x01, 0x7b, 0x20, 0x48, 0xff, + 0x22, 0xe6, 0xbc, 0xb0, + 0x8c, 0x8a, 0xeb, 0xf1, 0x5c, 0xee, 0x47, 0xcd, 0xea, 0x69, 0xb5, 0x56, + 0x9c, 0x6a, 0x28, 0xf6, + 0xd5, 0xfd, 0xe4, 0xf9, 0xf0, 0xf9, 0xc1, 0x01, 0x7d, 0xff, 0x95, 0xdb, + 0xa2, 0x57, 0x7e, 0x73, + 0x16, 0xd6, 0x6f, 0x12, 0xff, 0x9a, 0x94, 0x67, 0xcf, 0x35, 0x30, 0xfa, + 0xf7, 0x4a, 0xf6, 0x79, + 0xbb, 0x74, 0x3d, 0xe1, 0xcb, 0x56, 0xfd, 0xda, 0x2b, 0xe0, 0xdf, 0x27, + 0x5b, 0x2d, 0xae, 0xeb, + 0xb7, 0x9e, 0xdc, 0x83, 0xcf, 0x18, 0x3f, 0x7b, 0x4c, 0x47, 0xcd, 0xcf, + 0xb2, 0x33, 0xd6, 0xff, + 0x3b, 0xc8, 0xb4, 0x45, 0x0c, 0xe9, 0x31, 0xae, 0x79, 0xa2, 0xbe, 0xff, + 0xb1, 0xe6, 0x6a, 0x9f, + 0xaf, 0xfb, 0xbf, 0x5c, 0x17, 0xb8, 0xbf, 0x17, 0xa4, 0x7f, 0x8f, 0x30, + 0xa5, 0x10, 0x67, 0x0d, + 0x73, 0xfa, 0x4d, 0x8d, 0x37, 0x2c, 0xf3, 0x9e, 0x98, 0xcc, 0x0b, 0xeb, + 0x9f, 0x71, 0xfe, 0xba, + 0xdf, 0x31, 0x12, 0x67, 0x66, 0xaf, 0xfe, 0xb9, 0xee, 0xb1, 0xff, 0xaa, + 0x0e, 0xec, 0xb1, 0x4f, + 0x32, 0x5d, 0x87, 0x7b, 0x79, 0xc9, 0xfc, 0x1b, 0x75, 0x5b, 0xd7, 0x3d, + 0x75, 0xc9, 0x0b, 0xbb, + 0x3f, 0x7f, 0x5d, 0xff, 0xdc, 0xfe, 0x2f, 0xc4, 0xf5, 0x82, 0xf6, 0xdb, + 0xda, 0x39, 0xdd, 0x7a, + 0x66, 0x78, 0xd7, 0xc0, 0x7b, 0x46, 0xe2, 0x39, 0xaf, 0x85, 0x58, 0x0f, + 0x91, 0x25, 0xba, 0x74, + 0xe9, 0x9f, 0xe1, 0x79, 0x1e, 0xf3, 0x67, 0xa3, 0xc5, 0x73, 0x39, 0x67, + 0xbf, 0x9b, 0x2f, 0xcf, + 0x2b, 0xf5, 0xe7, 0xfb, 0x97, 0xdd, 0x09, 0x5b, 0x77, 0xbb, 0xdf, 0x04, + 0xea, 0x72, 0xfe, 0x19, + 0xd7, 0xc2, 0x37, 0x19, 0xee, 0x38, 0x8c, 0xfb, 0xd4, 0xd9, 0x1b, 0x37, + 0x5a, 0xb0, 0x07, 0xc2, + 0xf5, 0xcf, 0xe4, 0xfa, 0xe7, 0xd7, 0x85, 0x17, 0xfc, 0xd1, 0x4e, 0x0f, + 0xbb, 0xc6, 0x7b, 0xb6, + 0x7d, 0xb3, 0xeb, 0x95, 0x8f, 0xc6, 0x93, 0xd6, 0x64, 0x64, 0xb6, 0xee, + 0xf1, 0x33, 0xa1, 0xbd, + 0x16, 0x22, 0x1f, 0x7e, 0xc4, 0xee, 0xe5, 0x53, 0xec, 0x7c, 0x68, 0xc7, + 0xd7, 0x40, 0xd3, 0x27, + 0x27, 0x65, 0xbe, 0xc6, 0xaf, 0x1e, 0xeb, 0xad, 0x55, 0xbf, 0x89, 0xf5, + 0x64, 0x0b, 0xd8, 0x03, + 0x41, 0xbf, 0x8f, 0xdc, 0x83, 0x65, 0xd7, 0xf0, 0x5a, 0x5c, 0x76, 0x7e, + 0xdd, 0x07, 0x1f, 0x50, + 0xca, 0x73, 0x81, 0xbc, 0xc9, 0x20, 0xdb, 0x41, 0xe5, 0xc2, 0x23, 0x70, + 0x5a, 0x0a, 0xaa, 0xf3, + 0xab, 0xa7, 0x3f, 0x5f, 0x5d, 0xdf, 0x7f, 0xcd, 0x35, 0x51, 0xf5, 0x9b, + 0x78, 0x79, 0x2e, 0x76, + 0x5c, 0xef, 0x6e, 0x7c, 0x4c, 0x6a, 0xc1, 0xed, 0x38, 0x69, 0xc1, 0x5e, + 0x72, 0x2b, 0xdb, 0x89, + 0xe9, 0xfe, 0x17, 0xe6, 0x51, 0xcd, 0xbe, 0xa5, 0xf1, 0x72, 0x1e, 0x8b, + 0x0e, 0x3a, 0x8d, 0x89, + 0x4f, 0x69, 0x06, 0x74, 0xe1, 0xec, 0x35, 0xdc, 0x67, 0xb1, 0xef, 0x85, + 0x3f, 0xb3, 0xd9, 0xde, + 0x85, 0x67, 0xf5, 0x60, 0xfc, 0x4f, 0x5b, 0x10, 0x87, 0x1b, 0x4e, 0x27, + 0x8d, 0x61, 0xff, 0xe9, + 0x8e, 0x88, 0xcc, 0x49, 0xf4, 0x0f, 0x74, 0x41, 0xaa, 0x7f, 0x1b, 0x4e, + 0xf6, 0xf9, 0x5f, 0xce, + 0xbf, 0xa5, 0xfe, 0xe8, 0xb1, 0x7e, 0xe8, 0xff, 0x8c, 0x3f, 0xed, 0xde, + 0x5d, 0x4c, 0x0b, 0x3e, + 0xc7, 0xde, 0xfb, 0x3b, 0x8f, 0x8c, 0xae, 0xed, 0x65, 0xc3, 0x2b, 0xfb, + 0xef, 0xf1, 0xde, 0xe0, + 0x9f, 0x75, 0x5e, 0x32, 0xbf, 0xc7, 0x5e, 0xf3, 0xc4, 0x34, 0x7a, 0x66, + 0xf7, 0x8c, 0x7d, 0xcf, + 0xbd, 0xf1, 0xbf, 0x68, 0xdd, 0x19, 0x3d, 0xdf, 0xf2, 0xf4, 0x9b, 0x40, + 0xbf, 0xf9, 0xd9, 0xe6, + 0x41, 0x76, 0xf0, 0x89, 0x0e, 0x9c, 0x53, 0xec, 0x67, 0x94, 0x5f, 0xff, + 0x46, 0xa7, 0x42, 0xff, + 0x9e, 0xf6, 0xed, 0xf4, 0xb5, 0x7a, 0xbd, 0xf3, 0x7f, 0xb1, 0x7f, 0xcf, + 0xbc, 0x74, 0xc5, 0x00, + 0x5e, 0x58, 0xf3, 0x7f, 0x8f, 0x66, 0x2f, 0x6d, 0xb8, 0xd7, 0xe3, 0x69, + 0x8f, 0xfe, 0xd9, 0x77, + 0x61, 0x1a, 0xe3, 0xd3, 0x97, 0xd4, 0xfe, 0x55, 0xdf, 0xe8, 0xb8, 0xfd, + 0x7f, 0xa3, 0x97, 0xea, + 0x82, 0xff, 0x3b, 0x98, 0x95, 0x1a, 0x3b, 0x27, 0xcd, 0x1a, 0xf7, 0x8d, + 0xd9, 0x75, 0x97, 0x9d, + 0x79, 0xef, 0x4d, 0xff, 0xfb, 0x26, 0xe7, 0xb9, 0x58, 0x75, 0x4e, 0xec, + 0x55, 0x8d, 0xe7, 0x7c, + 0xb1, 0xed, 0xe7, 0xcc, 0xb0, 0x4f, 0xc7, 0x73, 0xc6, 0xe5, 0xf0, 0x6e, + 0x07, 0xf6, 0xc0, 0xeb, + 0x5d, 0x5f, 0x73, 0xcf, 0xa7, 0x33, 0xde, 0x3d, 0xe0, 0xd5, 0x76, 0xf7, + 0xbf, 0x71, 0x76, 0xcd, + 0x4c, 0x6b, 0x08, 0x05, 0x7b, 0xc4, 0x5c, 0xad, 0x8b, 0xc1, 0xef, 0xf4, + 0xa4, 0x57, 0x31, 0xcc, + 0x7e, 0xbf, 0x03, 0xcf, 0xd7, 0x2f, 0xb3, 0xdf, 0xcf, 0x1b, 0x98, 0xde, + 0xc3, 0x4a, 0x3c, 0xc3, + 0x3e, 0x53, 0x93, 0xe9, 0xb8, 0x31, 0x1a, 0xd7, 0x9a, 0xf9, 0xd1, 0x19, + 0xd3, 0xf5, 0xe7, 0x0c, + 0x73, 0x38, 0x6a, 0x4f, 0x26, 0xfd, 0xa6, 0x3b, 0xee, 0x10, 0xa0, 0x7f, + 0xb1, 0xd5, 0xb2, 0xe3, + 0xd9, 0x35, 0xbc, 0xe7, 0xf4, 0xa0, 0x34, 0x81, 0x9a, 0x2d, 0x09, 0xcf, + 0x85, 0xe7, 0x4d, 0x36, + 0xf9, 0x59, 0x57, 0x1f, 0xb2, 0xfd, 0x1f, 0x52, 0xb3, 0xc5, 0x6b, 0xd9, + 0x91, 0xec, 0x9a, 0x9c, + 0xea, 0xac, 0x16, 0x69, 0x4d, 0x70, 0xdc, 0x0e, 0x54, 0xac, 0x93, 0x9d, + 0x25, 0x39, 0xe7, 0xeb, + 0xa4, 0x78, 0x18, 0x5a, 0x97, 0xcc, 0x9e, 0xe9, 0xf7, 0xa3, 0xbe, 0xff, + 0x69, 0x9f, 0x37, 0x62, + 0xef, 0x30, 0x3b, 0xb6, 0xf7, 0x52, 0xf6, 0xac, 0x7a, 0xdc, 0x54, 0xe8, + 0x1f, 0xaf, 0x0f, 0x78, + 0x39, 0xf7, 0xf9, 0x6c, 0x9e, 0xcb, 0x90, 0xf9, 0xcc, 0xcf, 0x33, 0x3f, + 0x90, 0x9f, 0x3f, 0x4e, + 0xab, 0x07, 0x2f, 0x9d, 0xde, 0x6b, 0xae, 0xf2, 0xcc, 0xd5, 0xae, 0xd6, + 0x33, 0xba, 0x81, 0xfa, + 0x07, 0xba, 0xb0, 0x90, 0xeb, 0x9f, 0x5d, 0xf5, 0xf0, 0x8a, 0xc5, 0xb7, + 0xd4, 0xfd, 0xf5, 0xfd, + 0x7e, 0x3f, 0xf4, 0xe9, 0xa3, 0x54, 0xf7, 0x9b, 0xe6, 0xbf, 0xd2, 0x58, + 0xcf, 0xfe, 0x3d, 0xed, + 0xcd, 0x57, 0xc2, 0x19, 0xc5, 0xd2, 0x6f, 0xdb, 0x5e, 0x2f, 0x74, 0xd2, + 0x08, 0xea, 0x37, 0xa9, + 0x2c, 0x9f, 0x3f, 0xbc, 0x1c, 0x0c, 0x3b, 0x76, 0xfd, 0x9a, 0xb5, 0xb7, + 0x0c, 0x5b, 0xff, 0xc6, + 0x67, 0xbb, 0xb5, 0xf5, 0x8c, 0x68, 0x40, 0x1d, 0x2f, 0xd3, 0x05, 0x77, + 0xce, 0x5a, 0xbc, 0x3b, + 0xaf, 0x3f, 0xf8, 0x8e, 0x65, 0xf5, 0x70, 0xc7, 0x13, 0x0f, 0x7d, 0x63, + 0x80, 0xff, 0x7b, 0x69, + 0xfe, 0x7f, 0xa7, 0x2f, 0xab, 0xdd, 0x33, 0xbd, 0x39, 0x53, 0xf7, 0x89, + 0xed, 0x69, 0xcf, 0x7f, + 0xbb, 0x34, 0x41, 0x3f, 0xdc, 0x7e, 0xd8, 0x80, 0xfd, 0x9e, 0x3e, 0x71, + 0x94, 0xe9, 0x80, 0xef, + 0x61, 0xc5, 0xb6, 0x5b, 0xcf, 0xad, 0xf9, 0xaa, 0xde, 0x95, 0x7b, 0x86, + 0x9d, 0x73, 0xd3, 0x47, + 0x6f, 0xec, 0x7a, 0x57, 0xfd, 0x24, 0xa4, 0x8e, 0x57, 0xaa, 0x7f, 0x4e, + 0xbc, 0x7f, 0x95, 0xaf, + 0xbe, 0xb7, 0x96, 0x3f, 0x77, 0x6a, 0x08, 0x7a, 0x6f, 0x32, 0xa0, 0x2e, + 0xd9, 0xfd, 0xaa, 0xdf, + 0x98, 0xbd, 0xac, 0x01, 0xe7, 0xf5, 0x77, 0xb9, 0x62, 0x35, 0x6f, 0x72, + 0xf9, 0x51, 0xeb, 0xfa, + 0x87, 0x8e, 0x61, 0xc5, 0xcf, 0xae, 0x71, 0x9f, 0x99, 0x7d, 0x3c, 0x17, + 0x2f, 0x23, 0xd8, 0xca, + 0x15, 0x4c, 0xd6, 0x79, 0x2e, 0x4e, 0x0c, 0x4b, 0xd5, 0xe3, 0x62, 0xf9, + 0xaa, 0x59, 0xcc, 0xdc, + 0xcb, 0x08, 0xf5, 0xfd, 0xbb, 0x31, 0x72, 0x3b, 0x56, 0xbe, 0x8b, 0x8c, + 0xe7, 0x02, 0x6b, 0xb1, + 0x75, 0x00, 0x31, 0x0d, 0x55, 0xbf, 0x89, 0xe0, 0x76, 0xc4, 0xe3, 0xbf, + 0xaf, 0xe2, 0xfd, 0x6f, + 0xb4, 0x2a, 0xb9, 0xd6, 0xab, 0x78, 0xef, 0x99, 0x32, 0x56, 0xfd, 0x9b, + 0x8d, 0x0f, 0x0c, 0xf4, + 0x8e, 0xa2, 0xdf, 0x64, 0xad, 0xef, 0x9f, 0xeb, 0xc2, 0xd9, 0xb7, 0xd7, + 0x5e, 0x08, 0xf7, 0x1e, + 0x63, 0x65, 0xd7, 0x70, 0x56, 0xfd, 0xf9, 0xfa, 0x99, 0xf9, 0x51, 0x6b, + 0xcf, 0xdb, 0xfd, 0x26, + 0xf0, 0x9c, 0x82, 0xcf, 0x64, 0xf5, 0xf8, 0xf9, 0xc3, 0xc9, 0xe9, 0x4b, + 0x0e, 0xd6, 0x78, 0x2e, + 0x70, 0x5e, 0xb7, 0x7c, 0x97, 0x54, 0x2c, 0x75, 0xbc, 0xa2, 0xbe, 0x1f, + 0x57, 0xc7, 0x5b, 0x55, + 0x3e, 0x1b, 0x79, 0x1d, 0x2f, 0x3b, 0xa3, 0x04, 0xf5, 0x9b, 0x4c, 0xa6, + 0x1f, 0x6e, 0x7c, 0xcb, + 0xad, 0x0a, 0xef, 0xfb, 0xe7, 0x35, 0xab, 0xab, 0x7e, 0x93, 0xd0, 0xd8, + 0x76, 0x34, 0x26, 0xb5, + 0xc1, 0x3c, 0xf8, 0x47, 0xd6, 0xf4, 0xef, 0xd9, 0xde, 0x37, 0xaf, 0xf6, + 0x40, 0x44, 0x76, 0xcd, + 0x1a, 0xcf, 0xc5, 0x3a, 0xaf, 0xfb, 0xfb, 0x4d, 0xee, 0x99, 0x6f, 0xf4, + 0xf6, 0xfd, 0xdf, 0x0f, + 0x26, 0xb5, 0xe0, 0xe5, 0x5c, 0xbd, 0x36, 0xcd, 0xce, 0x9b, 0xb8, 0xfb, + 0x4d, 0x02, 0x79, 0x2e, + 0x22, 0x6f, 0x12, 0xa5, 0xc7, 0x25, 0xc0, 0x6f, 0x34, 0xae, 0x15, 0xd7, + 0x43, 0xd4, 0xc8, 0xa0, + 0xe6, 0x72, 0x4a, 0xfa, 0x7e, 0x3c, 0xfd, 0x26, 0xb7, 0x71, 0x3c, 0x97, + 0xe8, 0xf5, 0xfd, 0x18, + 0x5d, 0x10, 0xbe, 0x4b, 0x59, 0xda, 0xc9, 0x20, 0x67, 0xd5, 0x97, 0x3d, + 0xfd, 0x26, 0x85, 0x26, + 0xd4, 0x07, 0xa8, 0xfa, 0x4d, 0x56, 0x7e, 0x44, 0x59, 0xa5, 0x0b, 0x07, + 0x28, 0xa6, 0x55, 0x0c, + 0x8c, 0x0a, 0xdb, 0x44, 0x7f, 0x3e, 0xf3, 0x5d, 0x46, 0xff, 0x38, 0x98, + 0xe7, 0x62, 0xd5, 0x39, + 0x54, 0x81, 0x0f, 0xad, 0xe8, 0x37, 0x89, 0xc2, 0xb4, 0xc2, 0xb2, 0x6b, + 0xa2, 0x33, 0x2a, 0x56, + 0xfd, 0x26, 0xff, 0x9d, 0xa7, 0x3f, 0xdc, 0xea, 0x37, 0x39, 0x09, 0xe1, + 0x2f, 0x46, 0xd2, 0x05, + 0xfb, 0x8c, 0x52, 0x0e, 0xfe, 0x04, 0xc5, 0x13, 0xdb, 0x76, 0xea, 0x92, + 0xb7, 0x2e, 0xd6, 0xfb, + 0x4d, 0xbe, 0xe9, 0xd4, 0xd7, 0x6f, 0x62, 0xf5, 0xa2, 0x2b, 0xb9, 0x6e, + 0x91, 0xd8, 0x35, 0xf1, + 0xcc, 0x6b, 0xd0, 0xa6, 0x3b, 0x7c, 0xdf, 0xa9, 0xfa, 0x4d, 0xc0, 0x57, + 0x2d, 0x89, 0xdc, 0x9e, + 0x11, 0xf5, 0xd9, 0x08, 0x0c, 0x04, 0xd0, 0x0e, 0xcf, 0xf3, 0x6b, 0xa5, + 0x0b, 0x9d, 0xf8, 0xd6, + 0xe4, 0xfa, 0x3c, 0x1f, 0xc8, 0x9b, 0xe4, 0x8e, 0x77, 0x78, 0xbf, 0x89, + 0x94, 0xe7, 0x62, 0xe5, + 0x4d, 0xe2, 0x60, 0xd5, 0x47, 0xd3, 0x05, 0x2c, 0xb7, 0x43, 0xe7, 0xe7, + 0x85, 0xf4, 0x40, 0xf4, + 0x87, 0x06, 0xf1, 0x5c, 0x80, 0x83, 0x0f, 0xcf, 0xbe, 0xea, 0xa9, 0xaa, + 0x57, 0x1e, 0xd9, 0xe3, + 0x32, 0xba, 0x52, 0x7d, 0x3f, 0x3e, 0x0f, 0xe8, 0xe7, 0xb9, 0xac, 0xcd, + 0x37, 0x29, 0xc8, 0xe6, + 0x9b, 0x5c, 0x8d, 0x55, 0x7f, 0xcd, 0x9c, 0x17, 0x8f, 0xf7, 0xcb, 0x18, + 0x15, 0x2e, 0x0e, 0xbe, + 0xe3, 0xeb, 0x4b, 0x78, 0x2e, 0xa0, 0xeb, 0x7c, 0x0f, 0x20, 0xe2, 0xcc, + 0x38, 0x76, 0x4d, 0x16, + 0x59, 0xb3, 0x8a, 0x62, 0xd7, 0x98, 0x3c, 0x86, 0xb5, 0x80, 0x7e, 0x93, + 0x90, 0xf9, 0x26, 0x4c, + 0xd7, 0x2b, 0xb7, 0x2b, 0x7b, 0x19, 0xc5, 0x5e, 0x8f, 0x77, 0x0f, 0xe4, + 0x50, 0xbd, 0x6f, 0x22, + 0xae, 0xe7, 0xf4, 0x79, 0xf1, 0x5c, 0x01, 0xe8, 0xba, 0x9f, 0x83, 0xcf, + 0xfb, 0x4d, 0xce, 0x14, + 0xfd, 0x26, 0x12, 0x2e, 0x3b, 0x67, 0x21, 0x2c, 0xf5, 0xa6, 0xcd, 0xc1, + 0xe7, 0x7e, 0xd8, 0x40, + 0x70, 0xbe, 0x52, 0x6a, 0xe6, 0x56, 0xfd, 0x41, 0xd7, 0xeb, 0xa5, 0xb8, + 0xef, 0xa2, 0xd7, 0xfc, + 0xf3, 0x83, 0xfd, 0xfd, 0x26, 0x96, 0xef, 0x12, 0xde, 0x6f, 0x82, 0x64, + 0xd5, 0x5f, 0x39, 0xa6, + 0xa1, 0x60, 0x5a, 0xad, 0xf1, 0x5c, 0x3c, 0xf9, 0xf0, 0x5d, 0x3e, 0x77, + 0x62, 0x5b, 0xc6, 0x73, + 0x71, 0xf5, 0xe7, 0xe7, 0xe2, 0x64, 0x52, 0x63, 0x79, 0xbc, 0x92, 0xfd, + 0xe2, 0xcc, 0x37, 0x39, + 0xf5, 0xf9, 0x2e, 0x6e, 0x9e, 0x8b, 0xeb, 0xbc, 0x0e, 0xf1, 0x7e, 0xf5, + 0x79, 0x21, 0xf3, 0x22, + 0xb0, 0x6b, 0xb2, 0xbc, 0xf7, 0x2d, 0x37, 0xc9, 0x35, 0x65, 0x3c, 0x17, + 0x9e, 0x37, 0x59, 0x6c, + 0xdb, 0xb1, 0x6d, 0xe3, 0x81, 0xd5, 0xac, 0x2e, 0xaf, 0xc0, 0xaa, 0xb7, + 0x74, 0x7d, 0x9d, 0x61, + 0x52, 0xe1, 0x3e, 0xf2, 0x3a, 0xcf, 0xe5, 0x81, 0xec, 0x01, 0x04, 0xd3, + 0x2a, 0xe8, 0x79, 0xec, + 0xe2, 0xe0, 0x23, 0xfb, 0x4d, 0x36, 0xc6, 0xc1, 0x7b, 0x00, 0x18, 0x08, + 0x9c, 0x05, 0x63, 0x71, + 0xf0, 0xed, 0x58, 0x23, 0x70, 0xbe, 0x32, 0x92, 0xb5, 0xf0, 0xae, 0xc9, + 0x83, 0x9e, 0x41, 0xe9, + 0xe7, 0xf9, 0x48, 0x78, 0x2e, 0xe0, 0xbb, 0x5c, 0xc8, 0x79, 0x2e, 0x32, + 0x6e, 0xc7, 0xb5, 0x75, + 0xe1, 0x7a, 0x33, 0x28, 0x1d, 0x0e, 0xbe, 0xa7, 0x57, 0x3e, 0x88, 0xe7, + 0x02, 0xba, 0x7e, 0x84, + 0x65, 0xdd, 0x05, 0xc7, 0xf5, 0xae, 0xa3, 0x0b, 0xca, 0x5e, 0xf9, 0x99, + 0xf0, 0x5d, 0xa4, 0x3c, + 0x17, 0xab, 0xef, 0xdf, 0xf2, 0x5d, 0xc2, 0x7b, 0xe5, 0x6d, 0x5d, 0x88, + 0x93, 0x3d, 0x8b, 0x8c, + 0xf7, 0xdb, 0xef, 0x2b, 0x90, 0xe7, 0x62, 0xcd, 0x37, 0x81, 0xcf, 0x2d, + 0xf8, 0x61, 0xfa, 0x48, + 0x52, 0xb3, 0x85, 0x65, 0xd5, 0xa3, 0x99, 0xd4, 0x88, 0x78, 0x7f, 0x18, + 0xbb, 0xc6, 0xcd, 0xc1, + 0xbf, 0xa8, 0xec, 0x05, 0xf2, 0x5c, 0x7c, 0x75, 0xc9, 0xb9, 0x17, 0x69, + 0x0e, 0xab, 0x32, 0x86, + 0xd5, 0x17, 0x71, 0xe6, 0xe2, 0x71, 0x40, 0xbf, 0x89, 0x9b, 0x83, 0x3f, + 0xdb, 0x0a, 0x7e, 0x36, + 0xf6, 0x20, 0xf6, 0x91, 0xea, 0xda, 0x1c, 0x7c, 0xe7, 0xec, 0x01, 0xbe, + 0x4b, 0x48, 0x7c, 0x6d, + 0xc3, 0x7c, 0xb1, 0x66, 0xd3, 0x86, 0xc4, 0xfb, 0x5d, 0x73, 0x26, 0xab, + 0x77, 0x76, 0xd7, 0xfa, + 0x4d, 0xfc, 0x1c, 0x7c, 0x6d, 0x7a, 0x5d, 0x56, 0x7d, 0xf4, 0x98, 0x06, + 0x32, 0xde, 0xcf, 0x99, + 0xd4, 0x5b, 0x0b, 0xbd, 0x1e, 0x9a, 0x37, 0x61, 0x5a, 0x08, 0x7e, 0x04, + 0x7b, 0xcd, 0x58, 0x7c, + 0x97, 0x38, 0x67, 0xd3, 0x7a, 0xcf, 0x0b, 0x12, 0x9e, 0xcb, 0x1d, 0xbb, + 0x57, 0xbe, 0x78, 0x10, + 0x36, 0xdf, 0xe4, 0xfa, 0xb3, 0x69, 0xaf, 0x98, 0xf3, 0x0a, 0x7e, 0x1e, + 0x7b, 0xfa, 0xfe, 0xbd, + 0xdc, 0x0f, 0x2f, 0xcf, 0xc5, 0xc9, 0x9b, 0x44, 0x63, 0x52, 0xc7, 0xa3, + 0x0b, 0xc8, 0x18, 0x56, + 0x7a, 0xbe, 0xcd, 0xe7, 0x7b, 0x6e, 0xca, 0xe2, 0x6b, 0x56, 0xde, 0xe4, + 0x45, 0x9a, 0xc3, 0xba, + 0x8f, 0xad, 0xcb, 0xe1, 0x9f, 0x47, 0xe9, 0xfc, 0x60, 0xe8, 0x37, 0x29, + 0xef, 0x43, 0x6c, 0x44, + 0xb0, 0x9f, 0x35, 0x23, 0xf0, 0xb3, 0x74, 0xa4, 0x19, 0xfa, 0x34, 0xdf, + 0x2c, 0x9e, 0xb9, 0xcf, + 0x51, 0xc1, 0xf1, 0x35, 0x3b, 0xa6, 0xb1, 0x35, 0x79, 0xf0, 0x6b, 0x82, + 0xe1, 0x7c, 0xc1, 0x3d, + 0xe7, 0xa6, 0xa2, 0xdf, 0xa4, 0x2c, 0xc9, 0x9b, 0x64, 0x9d, 0x3a, 0xde, + 0x70, 0xdf, 0x05, 0xc5, + 0xaa, 0xbf, 0x9f, 0xec, 0x1a, 0x97, 0xae, 0x7b, 0xf3, 0x26, 0x62, 0x36, + 0x63, 0x58, 0x7c, 0xed, + 0x7e, 0xd7, 0xb2, 0x47, 0x67, 0x54, 0xb8, 0x38, 0xf8, 0xc8, 0xf9, 0x26, + 0x1b, 0xd7, 0x62, 0xd5, + 0x5f, 0x2d, 0xe7, 0x85, 0x8b, 0x6d, 0x6b, 0xfc, 0xd9, 0xb8, 0x73, 0xba, + 0x59, 0x0b, 0x8b, 0xaf, + 0x65, 0x98, 0xf6, 0x3f, 0xf0, 0x39, 0xac, 0x03, 0x74, 0xbd, 0x5e, 0xc3, + 0x3a, 0x33, 0xcb, 0xe7, + 0x07, 0x83, 0xef, 0xc1, 0x3e, 0x1b, 0xf0, 0x3c, 0x96, 0xcd, 0x0f, 0x5e, + 0xed, 0x01, 0x8c, 0xff, + 0x5e, 0xa9, 0xc7, 0xc8, 0xb4, 0x0a, 0xe4, 0xb2, 0xcb, 0xfa, 0x4d, 0x80, + 0xff, 0x07, 0xec, 0xe7, + 0xcc, 0x98, 0xe9, 0x58, 0x3f, 0xf8, 0x3e, 0x78, 0x8c, 0x4d, 0xf8, 0x2e, + 0x12, 0x9e, 0x4b, 0x09, + 0x9e, 0xd7, 0x0d, 0xf8, 0x3d, 0xa0, 0x74, 0xe1, 0xce, 0x03, 0xe7, 0x7c, + 0xd9, 0x6b, 0xa2, 0xec, + 0x37, 0xe1, 0xcf, 0xbe, 0xb0, 0x7e, 0x93, 0x87, 0x61, 0x36, 0x6d, 0x40, + 0x7c, 0x4d, 0xf4, 0x11, + 0x56, 0xf6, 0xc2, 0xe7, 0x07, 0x8b, 0xf7, 0x92, 0x3f, 0xc5, 0x30, 0xa9, + 0x33, 0xa1, 0x71, 0xbd, + 0x2b, 0x31, 0x2a, 0x54, 0xf1, 0x7e, 0xde, 0x2b, 0xcf, 0x7d, 0x17, 0x69, + 0x7c, 0x8d, 0xeb, 0xfa, + 0xfc, 0xc1, 0x32, 0xa9, 0x57, 0x35, 0xab, 0x39, 0x54, 0x7f, 0x3e, 0xdf, + 0x03, 0xd2, 0xf9, 0xc1, + 0x62, 0x86, 0x0e, 0x68, 0x48, 0x01, 0xe2, 0x30, 0x7d, 0x79, 0x3e, 0x3c, + 0x4a, 0x5c, 0x0f, 0xb5, + 0x07, 0xd0, 0xb5, 0x69, 0xfe, 0x67, 0xa3, 0x6b, 0xbe, 0x49, 0x40, 0x5d, + 0xf2, 0x76, 0x50, 0x7c, + 0x2d, 0x72, 0x5c, 0xef, 0x81, 0xcd, 0x5b, 0xe4, 0x79, 0x93, 0xcd, 0xb3, + 0xea, 0x01, 0xf8, 0xc3, + 0xa5, 0xb3, 0x5c, 0xdd, 0x66, 0x3f, 0x43, 0xde, 0x43, 0x9d, 0x07, 0x94, + 0xf0, 0x5c, 0x2c, 0xdf, + 0x05, 0xd6, 0x42, 0xc6, 0x73, 0x11, 0x6b, 0x12, 0xef, 0x6c, 0xda, 0x6b, + 0xc6, 0xfb, 0x3d, 0x1c, + 0x7c, 0xb7, 0xef, 0x12, 0x18, 0x5f, 0xb3, 0x7e, 0x0f, 0xbc, 0xc7, 0x65, + 0x10, 0x93, 0x2e, 0x5c, + 0x77, 0x36, 0xad, 0xfb, 0xb3, 0x3b, 0xdf, 0xe6, 0xbd, 0xf2, 0xd2, 0xf8, + 0x9a, 0x95, 0x37, 0xb1, + 0xeb, 0x78, 0x1f, 0x5c, 0x7d, 0x3f, 0x36, 0xde, 0x2f, 0x66, 0xcd, 0xf1, + 0x58, 0x84, 0x64, 0x7e, + 0xb0, 0xe8, 0x37, 0x61, 0xbe, 0xcb, 0x79, 0xf1, 0x20, 0x3b, 0xcc, 0xb4, + 0xa5, 0xf9, 0x70, 0x7c, + 0xcd, 0x6a, 0x7b, 0xf7, 0xf6, 0x7d, 0xce, 0x79, 0xf5, 0xc2, 0x39, 0xf8, + 0x41, 0xf3, 0x83, 0x83, + 0x63, 0xdb, 0x21, 0xe7, 0xf4, 0x07, 0x95, 0xf3, 0x82, 0xba, 0xe4, 0x71, + 0xbe, 0x05, 0x7b, 0xc5, + 0x1b, 0x2b, 0x5c, 0xcf, 0x87, 0xa7, 0x90, 0x4c, 0xab, 0x58, 0x6b, 0x56, + 0x71, 0x39, 0x2f, 0xde, + 0x73, 0xba, 0x35, 0xd5, 0x9a, 0xa9, 0x7e, 0xaa, 0x9b, 0x1e, 0x67, 0x3a, + 0xd9, 0x85, 0xde, 0x92, + 0xf1, 0xef, 0xa5, 0x6b, 0xe2, 0xe1, 0xe0, 0x97, 0xf7, 0xdd, 0xb5, 0x01, + 0x41, 0x3c, 0x97, 0x95, + 0x2e, 0x60, 0xf8, 0xfd, 0x0f, 0x66, 0x36, 0xad, 0xfb, 0xf7, 0x0a, 0xe7, + 0xd7, 0x1d, 0xa6, 0xdf, + 0xe1, 0xfd, 0x26, 0xe0, 0xbb, 0x3c, 0x9c, 0xb3, 0x69, 0x53, 0xab, 0xf9, + 0xcc, 0xf2, 0xf9, 0xc1, + 0xb6, 0xef, 0x32, 0xd7, 0xeb, 0x61, 0xf3, 0x4d, 0xb0, 0xac, 0xfa, 0x07, + 0x90, 0x07, 0x34, 0x64, + 0xf3, 0x4d, 0xa0, 0x4e, 0x23, 0x70, 0x7e, 0xf0, 0x7d, 0xa8, 0x59, 0x8d, + 0x2b, 0xde, 0xcf, 0xfd, + 0x30, 0xc8, 0x11, 0x03, 0x23, 0xf8, 0xb6, 0x3c, 0xbe, 0x06, 0xba, 0x2e, + 0xea, 0x78, 0x37, 0x1e, + 0xa4, 0x2e, 0xe0, 0x62, 0xdb, 0x76, 0x9e, 0x8d, 0x9d, 0x71, 0x42, 0xe7, + 0x9b, 0x30, 0xff, 0x0a, + 0xf2, 0x6c, 0xa1, 0x35, 0x5b, 0xd8, 0x18, 0x96, 0xb5, 0x07, 0xd2, 0xf1, + 0xce, 0x5b, 0x6c, 0xbb, + 0xff, 0x4d, 0x1b, 0xa4, 0xba, 0xd2, 0x35, 0x51, 0xc4, 0x3a, 0xb5, 0x41, + 0x8e, 0xeb, 0x42, 0xf1, + 0xb8, 0x54, 0x0b, 0x9b, 0x33, 0x99, 0x46, 0xf1, 0xfb, 0x5f, 0x84, 0xd9, + 0xb4, 0x76, 0xad, 0xd2, + 0x48, 0xdd, 0x6f, 0x02, 0x75, 0xbc, 0xf9, 0x49, 0x26, 0xb4, 0xdf, 0x24, + 0xd2, 0x6c, 0xda, 0x61, + 0x8c, 0xb3, 0x69, 0x8f, 0xd7, 0x7d, 0x17, 0x15, 0x07, 0x3f, 0x70, 0xce, + 0xe4, 0x43, 0x34, 0x9b, + 0xd6, 0xef, 0x87, 0x15, 0xcf, 0x99, 0xef, 0xc2, 0xfc, 0xae, 0xf5, 0xf9, + 0xc1, 0xae, 0xba, 0x64, + 0xa6, 0x99, 0xb8, 0x9a, 0x5a, 0x5c, 0xbd, 0xde, 0x66, 0xac, 0x75, 0xbc, + 0xdb, 0x4d, 0x88, 0xeb, + 0x85, 0xce, 0x0f, 0x3e, 0x2d, 0x1d, 0x70, 0x56, 0xfd, 0x2c, 0xdd, 0xd0, + 0xc2, 0xfa, 0x4d, 0x62, + 0xad, 0x65, 0x47, 0xd6, 0xeb, 0x05, 0xf4, 0xb8, 0x84, 0xf6, 0x9b, 0x9c, + 0x49, 0x78, 0x2e, 0xd1, + 0xfc, 0xf7, 0x56, 0x9c, 0x73, 0x58, 0x51, 0xcf, 0xc6, 0x48, 0xf1, 0xfe, + 0x9c, 0xc3, 0xf9, 0xe2, + 0xf1, 0x35, 0xc8, 0x9b, 0x04, 0xcc, 0x99, 0xdc, 0x3e, 0x2f, 0x8b, 0x5e, + 0x79, 0x59, 0x7c, 0xed, + 0x21, 0x5b, 0x13, 0xe1, 0x87, 0xe5, 0xa4, 0x75, 0xc9, 0xb2, 0x7c, 0x78, + 0xfc, 0x4c, 0x6a, 0x1c, + 0x8f, 0x37, 0x34, 0xde, 0xcf, 0xfb, 0x4d, 0xf2, 0x4d, 0x9e, 0x63, 0x0d, + 0x99, 0x1f, 0xcc, 0xfb, + 0x4d, 0x66, 0x70, 0x4e, 0x2f, 0xc4, 0x5b, 0xcb, 0xde, 0x8f, 0x25, 0xde, + 0x2f, 0xea, 0x78, 0xd9, + 0x6b, 0x4a, 0xe7, 0x07, 0x83, 0xae, 0xb3, 0x7b, 0xa9, 0x60, 0x7a, 0xe5, + 0xef, 0x43, 0x1d, 0xaf, + 0x32, 0xe7, 0xb5, 0x80, 0x67, 0xa3, 0xfb, 0x8c, 0xe2, 0x9b, 0x1f, 0x2c, + 0xef, 0x37, 0x59, 0x9b, + 0x6f, 0x12, 0x69, 0x3e, 0x33, 0xb2, 0x36, 0x4d, 0xc9, 0xb4, 0x0a, 0x8f, + 0x61, 0x39, 0x79, 0x93, + 0xd2, 0x45, 0x75, 0xad, 0xdf, 0x64, 0xdb, 0xcf, 0xc1, 0x67, 0xaf, 0x89, + 0xab, 0x07, 0xc1, 0xef, + 0x01, 0x35, 0xa7, 0x05, 0x37, 0x6f, 0x31, 0x86, 0x78, 0xbf, 0x21, 0xe5, + 0xe0, 0xdf, 0x92, 0xcc, + 0x0f, 0xbe, 0x0f, 0xba, 0x80, 0x9d, 0x4d, 0xab, 0x5a, 0x13, 0xde, 0x6f, + 0xb2, 0xdc, 0x0e, 0xe9, + 0x37, 0xc9, 0x39, 0x79, 0x13, 0x11, 0xef, 0x47, 0xd4, 0xf1, 0xde, 0x8d, + 0xad, 0xbe, 0x1f, 0x17, + 0xef, 0x67, 0xf7, 0xc9, 0x67, 0xcd, 0xb1, 0x35, 0x0f, 0xef, 0x37, 0x61, + 0xbe, 0xcb, 0x99, 0xca, + 0x77, 0x89, 0xa2, 0x0b, 0xf1, 0xd6, 0xf1, 0x7a, 0x9e, 0x8d, 0x41, 0xfd, + 0x26, 0x77, 0xbd, 0xfd, + 0x26, 0xba, 0x24, 0x1f, 0xfe, 0x62, 0xd4, 0xac, 0x86, 0xc6, 0xb6, 0x23, + 0xf6, 0x9b, 0x88, 0x3a, + 0xde, 0xe2, 0x03, 0xa9, 0x65, 0x8f, 0x18, 0xdb, 0x16, 0xf3, 0x16, 0x97, + 0xfa, 0x61, 0xc8, 0xfc, + 0x60, 0x9e, 0x37, 0x81, 0xcf, 0x9f, 0xea, 0x35, 0x63, 0xae, 0x65, 0x47, + 0xc5, 0xb6, 0xe3, 0x5d, + 0x13, 0x91, 0x37, 0x01, 0xce, 0x17, 0xdc, 0xbb, 0x74, 0x7e, 0x30, 0x3c, + 0xe3, 0x2c, 0xdf, 0x25, + 0x2e, 0xce, 0x57, 0x9c, 0x6b, 0xa2, 0x59, 0x75, 0x39, 0x22, 0x6f, 0xb2, + 0x29, 0xed, 0x37, 0xe1, + 0xfe, 0xfb, 0x34, 0xd5, 0x0c, 0xed, 0x37, 0x79, 0x31, 0x66, 0xd3, 0x06, + 0xe4, 0x01, 0x83, 0xe7, + 0x4c, 0x22, 0xfa, 0x4d, 0xee, 0x7b, 0x2d, 0x7b, 0x48, 0x1d, 0xef, 0x40, + 0xd1, 0x6f, 0x72, 0x12, + 0xd2, 0x6f, 0x32, 0x5c, 0x9d, 0xd7, 0xc5, 0x79, 0x41, 0x7b, 0x78, 0x6a, + 0x56, 0x7d, 0x67, 0x94, + 0xfc, 0x54, 0xd1, 0x6f, 0x32, 0xdf, 0xaa, 0x5b, 0x7b, 0xc0, 0x50, 0xf9, + 0xef, 0xd8, 0xda, 0xb4, + 0xf4, 0xfd, 0x98, 0xb7, 0x28, 0x99, 0x1f, 0x0c, 0xf7, 0x02, 0xfb, 0x2e, + 0x8c, 0xe7, 0x72, 0x1f, + 0x6a, 0xd9, 0x51, 0x35, 0xab, 0x6e, 0x5d, 0x40, 0xd5, 0xf1, 0x9e, 0x22, + 0xea, 0x78, 0x79, 0x7d, + 0x7f, 0xaa, 0x29, 0x8f, 0xaf, 0xed, 0xec, 0x83, 0xef, 0x02, 0x67, 0xe5, + 0xec, 0x40, 0x0b, 0xed, + 0x37, 0x89, 0x95, 0xd3, 0x7d, 0xe5, 0x78, 0xbf, 0x3b, 0xbe, 0x26, 0x9b, + 0x6f, 0x12, 0x10, 0x5f, + 0x8b, 0xac, 0x0b, 0xf7, 0x6f, 0x36, 0x6d, 0x60, 0xbf, 0xc9, 0x05, 0xa6, + 0xdf, 0x04, 0xf9, 0x6c, + 0x7c, 0x90, 0xb3, 0x69, 0xdd, 0x31, 0x36, 0xf6, 0x9a, 0xaa, 0x7e, 0x13, + 0x3b, 0x0f, 0x18, 0xfa, + 0x3b, 0x78, 0x31, 0x6a, 0x56, 0x7d, 0xfd, 0xf9, 0xb2, 0xf8, 0x1a, 0xdc, + 0x0b, 0xf8, 0xbf, 0x9b, + 0xb2, 0xf8, 0x5a, 0x94, 0x18, 0xd6, 0x95, 0xd8, 0x35, 0x21, 0x67, 0x66, + 0x19, 0xa3, 0xc2, 0x53, + 0x97, 0x8c, 0xeb, 0x37, 0x89, 0xbd, 0x66, 0x15, 0x91, 0xf3, 0x8a, 0x7f, + 0x4d, 0xd6, 0xe3, 0xfd, + 0x6b, 0xf3, 0x83, 0x9d, 0xb3, 0x47, 0x35, 0x34, 0xbe, 0x76, 0x5f, 0xea, + 0xfb, 0xb1, 0xec, 0x9a, + 0x85, 0x84, 0x5d, 0xe3, 0xaa, 0x4b, 0xae, 0xac, 0xf5, 0x9b, 0x78, 0x79, + 0x2e, 0x5c, 0x67, 0xe3, + 0xec, 0xfb, 0xc1, 0xeb, 0x02, 0xba, 0x3e, 0x60, 0x67, 0xa1, 0x1f, 0x3a, + 0xf1, 0x35, 0xc9, 0x79, + 0x1d, 0x6a, 0x26, 0x55, 0x3d, 0x05, 0x2f, 0xc6, 0x6c, 0x5a, 0xef, 0xb3, + 0xf1, 0x9a, 0xfd, 0x26, + 0x2f, 0xd2, 0x6c, 0x5a, 0x49, 0xce, 0x0b, 0xdd, 0x6f, 0xe2, 0xe4, 0x4d, + 0xa2, 0xb3, 0xea, 0xef, + 0x6b, 0xcd, 0xaa, 0xe7, 0xb3, 0x01, 0x7e, 0x23, 0xf4, 0x0b, 0x86, 0xf0, + 0x5c, 0x40, 0xd7, 0x73, + 0x31, 0xf6, 0xb8, 0x60, 0xfd, 0xf7, 0x48, 0x6b, 0x12, 0x43, 0xbc, 0xdf, + 0xa9, 0x4b, 0x3e, 0x85, + 0x3e, 0x80, 0xaa, 0xb2, 0xdf, 0x24, 0x8a, 0x2e, 0xe8, 0x0f, 0x92, 0x5d, + 0x63, 0xbd, 0x66, 0x5e, + 0xda, 0x6f, 0x22, 0x74, 0x3d, 0xbb, 0x70, 0x7a, 0x10, 0x0d, 0x44, 0x7d, + 0x7f, 0x3c, 0x75, 0xbc, + 0x57, 0x89, 0xf7, 0x4b, 0x78, 0x2e, 0xc2, 0x77, 0x81, 0x5e, 0xf9, 0xf0, + 0x7e, 0x93, 0xf5, 0x78, + 0xff, 0x75, 0x6b, 0xd9, 0x91, 0xec, 0x9a, 0xa0, 0xb8, 0x5e, 0xcf, 0xdd, + 0x6f, 0xe2, 0x8f, 0x49, + 0x41, 0x7c, 0xad, 0xe8, 0x8d, 0xaf, 0x89, 0x3d, 0xd0, 0x8e, 0xb3, 0x66, + 0x15, 0x1f, 0xdb, 0x56, + 0x3d, 0x8f, 0x35, 0xa3, 0x70, 0x5a, 0x3d, 0xa8, 0x9c, 0x15, 0x0f, 0xa4, + 0xfd, 0x26, 0x50, 0x97, + 0x3c, 0xcc, 0xb4, 0xe3, 0xae, 0x65, 0xdf, 0x8e, 0x89, 0x5d, 0xa3, 0xf1, + 0x18, 0x96, 0xe0, 0x45, + 0xc8, 0x78, 0x2e, 0xa0, 0xeb, 0xf0, 0xd9, 0xd8, 0x5e, 0xe6, 0x0e, 0x33, + 0x61, 0xfd, 0x26, 0xd8, + 0x9a, 0x55, 0x24, 0xd7, 0x2d, 0xf6, 0xfa, 0x7e, 0xe4, 0x0c, 0x4a, 0x7e, + 0x46, 0x61, 0xe7, 0x22, + 0x39, 0xcf, 0x45, 0x70, 0xf0, 0x45, 0xbf, 0x9d, 0xf6, 0x40, 0xeb, 0xfb, + 0xa3, 0xc4, 0xfb, 0x9d, + 0x9a, 0x47, 0x78, 0x5e, 0x07, 0xf6, 0x9b, 0xb0, 0xb3, 0x3f, 0xdb, 0x57, + 0x85, 0x99, 0x24, 0xbe, + 0x76, 0xdf, 0xea, 0xfb, 0xaf, 0x5e, 0xaf, 0xa7, 0xee, 0x37, 0xc9, 0xaf, + 0x9d, 0xd7, 0x1f, 0x50, + 0x2d, 0x7b, 0xf4, 0x78, 0x7f, 0x3f, 0xdb, 0x01, 0x5d, 0x28, 0x9d, 0x84, + 0xc4, 0xd7, 0x40, 0xd7, + 0xa1, 0x57, 0x1e, 0x33, 0x9b, 0xf6, 0x34, 0xde, 0xd9, 0xb4, 0x58, 0x8e, + 0x16, 0x3f, 0x33, 0x4b, + 0x79, 0x2e, 0xa2, 0xdf, 0x04, 0x3e, 0x6b, 0xae, 0x7e, 0x13, 0x43, 0xbe, + 0x07, 0xf2, 0x0f, 0x76, + 0xde, 0x62, 0x60, 0xce, 0xcb, 0xc5, 0x73, 0x09, 0xc9, 0x9b, 0xac, 0xf5, + 0x9b, 0xb0, 0x3d, 0x10, + 0x5b, 0xcd, 0xea, 0x8b, 0x58, 0xc7, 0x9b, 0x5e, 0xb8, 0x39, 0x5f, 0x12, + 0x9e, 0x0b, 0xf8, 0x94, + 0xec, 0xb3, 0x2b, 0xfa, 0x4d, 0xb2, 0xf2, 0x7e, 0x93, 0x38, 0xd7, 0x24, + 0x52, 0xbc, 0x5f, 0xe2, + 0xbb, 0xb8, 0xea, 0x92, 0x9d, 0xf3, 0xfe, 0x9d, 0x90, 0x7e, 0x93, 0x98, + 0xfd, 0xf7, 0x38, 0xb9, + 0x1d, 0x5c, 0x17, 0xc0, 0x77, 0x09, 0x89, 0xaf, 0x81, 0xae, 0xf3, 0x3c, + 0xe0, 0xc3, 0x58, 0xc7, + 0x6b, 0x9d, 0x51, 0xa0, 0x7e, 0xd4, 0xc9, 0x9b, 0x04, 0xf4, 0x9b, 0xec, + 0x9c, 0xef, 0xf0, 0x5e, + 0xf9, 0xd0, 0x7e, 0x93, 0xfb, 0xb1, 0x07, 0xae, 0x1a, 0xef, 0x97, 0xf5, + 0x9b, 0xdc, 0x96, 0xc7, + 0xd7, 0x1e, 0xe0, 0x1e, 0xf0, 0xc7, 0xb6, 0xc3, 0xd9, 0x35, 0x9c, 0x83, + 0x9f, 0x6b, 0xc1, 0x1e, + 0xf0, 0xd7, 0x6c, 0x79, 0xe6, 0x07, 0x83, 0xae, 0x4f, 0x8a, 0x4d, 0x7c, + 0x0c, 0x4b, 0xb1, 0x07, + 0x9c, 0x67, 0x42, 0xb1, 0x59, 0x5a, 0x28, 0x66, 0xa4, 0xb3, 0xf7, 0x58, + 0x38, 0x2b, 0x1d, 0xea, + 0xaa, 0xb8, 0xe3, 0x30, 0xd7, 0x2e, 0x9d, 0x15, 0xea, 0xaa, 0x35, 0xc9, + 0x2c, 0xf8, 0x6b, 0x36, + 0x03, 0x7d, 0x17, 0xf6, 0x19, 0xd4, 0xe7, 0xf9, 0x66, 0xe1, 0xb4, 0x58, + 0x2f, 0xdd, 0x2a, 0xd5, + 0xf8, 0x75, 0x51, 0x3a, 0x2c, 0x9e, 0x6e, 0x1e, 0xe6, 0xe7, 0x7a, 0x73, + 0x2d, 0x06, 0x3c, 0xca, + 0xb7, 0x4b, 0xa7, 0x79, 0xe5, 0xbd, 0x66, 0x96, 0xa5, 0x46, 0x71, 0xa6, + 0x38, 0x4b, 0xb2, 0xdf, + 0x7d, 0xf1, 0xbc, 0x54, 0x53, 0x9e, 0x5f, 0xc7, 0xf0, 0x9a, 0xb9, 0xba, + 0xea, 0xb3, 0xab, 0x1f, + 0xb3, 0xd7, 0x3c, 0xce, 0xd5, 0x0b, 0x27, 0xbe, 0x7b, 0x39, 0xdb, 0x3c, + 0x2c, 0x2c, 0x98, 0x76, + 0x8c, 0xd9, 0x7e, 0x1b, 0xa4, 0x3b, 0x45, 0xf6, 0x6f, 0xca, 0xbc, 0xf4, + 0xa4, 0xd0, 0x2e, 0x9d, + 0xe8, 0xaa, 0xfb, 0x34, 0xf4, 0x93, 0x52, 0x43, 0x39, 0xf3, 0x8a, 0x69, + 0x01, 0xee, 0x35, 0x37, + 0x5b, 0xa5, 0x65, 0xb6, 0x21, 0x74, 0x1d, 0xe2, 0xf3, 0x7a, 0x2b, 0x7f, + 0xbc, 0x59, 0x67, 0xf7, + 0xe0, 0xba, 0x97, 0xe2, 0x21, 0x7c, 0x36, 0x0a, 0xb3, 0x8c, 0xf8, 0x8c, + 0xca, 0xf6, 0x3d, 0xf3, + 0x0d, 0xe0, 0xeb, 0x95, 0x3d, 0x2e, 0x33, 0xf6, 0xd9, 0x58, 0x66, 0x1a, + 0xaa, 0xb5, 0xcd, 0x9f, + 0x96, 0x0e, 0x73, 0x23, 0xc5, 0xe7, 0x71, 0x90, 0xed, 0x96, 0xce, 0x37, + 0x0f, 0x7d, 0xef, 0x09, + 0xea, 0x57, 0xbb, 0x19, 0xb8, 0x97, 0x65, 0xa1, 0x51, 0x5c, 0xdd, 0x4b, + 0x0d, 0xee, 0x65, 0xf3, + 0x38, 0x5f, 0xcf, 0xd9, 0xf9, 0xac, 0x9e, 0xb7, 0x8e, 0x17, 0xb7, 0x07, + 0xf4, 0x0e, 0x66, 0x0f, + 0x58, 0xfb, 0xae, 0xa9, 0xda, 0x77, 0x9b, 0xe7, 0xa5, 0xc3, 0xb0, 0x19, + 0x16, 0x10, 0x5f, 0xcf, + 0x4c, 0xf3, 0x2d, 0xb8, 0x4f, 0xf6, 0xd9, 0x3d, 0x74, 0x3e, 0x67, 0xe7, + 0xec, 0x5e, 0x4e, 0x0a, + 0xf5, 0xdc, 0x2c, 0xdb, 0xca, 0x0c, 0xe1, 0x5e, 0xb4, 0x2e, 0xec, 0x81, + 0xd2, 0x4c, 0x31, 0x0f, + 0x32, 0xd6, 0x3d, 0x00, 0x71, 0x0a, 0xb6, 0x07, 0x54, 0x33, 0x28, 0x79, + 0x6f, 0x16, 0x7b, 0xcd, + 0x81, 0xd6, 0x81, 0xfe, 0x2b, 0xd8, 0xff, 0x9b, 0x67, 0xde, 0x7b, 0x29, + 0x9e, 0xb2, 0x7b, 0x59, + 0xe4, 0x1b, 0xa5, 0x93, 0x5c, 0x5d, 0x53, 0xf4, 0x9b, 0x84, 0xed, 0x01, + 0x60, 0x20, 0x58, 0xbf, + 0x57, 0x63, 0xa5, 0x0b, 0x29, 0xa5, 0x2e, 0xc0, 0xef, 0xe1, 0x81, 0xae, + 0x09, 0xdb, 0x2f, 0xb0, + 0x26, 0xf9, 0x05, 0xf0, 0xae, 0x7d, 0xbf, 0x57, 0xb6, 0x16, 0x79, 0xa8, + 0x2b, 0x1c, 0xa6, 0x3b, + 0xa9, 0x49, 0xa1, 0x85, 0xd6, 0x85, 0x49, 0x4c, 0xba, 0x30, 0x65, 0xba, + 0x70, 0x9c, 0x6d, 0xa8, + 0x5e, 0x33, 0x77, 0x52, 0xaa, 0xe7, 0x79, 0xbf, 0x89, 0xd6, 0xb5, 0x75, + 0x7d, 0xf3, 0xb4, 0x78, + 0xe8, 0xd1, 0x42, 0xf6, 0x19, 0x85, 0x7d, 0xa7, 0x8f, 0x43, 0xea, 0xc5, + 0xb9, 0x2e, 0x80, 0x16, + 0xc5, 0xa9, 0x0b, 0xc5, 0x43, 0x55, 0xce, 0x2b, 0x1d, 0xa8, 0x45, 0x90, + 0x6b, 0xc8, 0x74, 0xb2, + 0x33, 0x76, 0xfe, 0x38, 0x95, 0xe8, 0xfa, 0x88, 0xb3, 0x36, 0xbc, 0x7e, + 0x18, 0xd7, 0x85, 0xcd, + 0xc3, 0x38, 0x75, 0x41, 0x75, 0x7e, 0xe5, 0xcf, 0xe3, 0xd3, 0x7c, 0xd8, + 0x79, 0x87, 0xeb, 0x7a, + 0xee, 0xb8, 0x54, 0x07, 0xfd, 0xf0, 0xea, 0x3a, 0xbb, 0x97, 0x65, 0xbe, + 0xc1, 0xfc, 0xe3, 0x36, + 0xd7, 0x75, 0xa6, 0x33, 0x98, 0x3d, 0xb0, 0x11, 0x6d, 0x0f, 0x34, 0x95, + 0x9f, 0x47, 0x84, 0x16, + 0x6d, 0x8c, 0xe1, 0xd9, 0xc8, 0x74, 0xc1, 0xd1, 0xf5, 0x4d, 0x8f, 0xae, + 0xf3, 0x3d, 0x03, 0xba, + 0xce, 0xee, 0xb3, 0x30, 0x4d, 0xb7, 0x42, 0x7f, 0xef, 0x91, 0xf6, 0x80, + 0x7a, 0xdf, 0xc1, 0x1e, + 0x50, 0x3e, 0x8f, 0x03, 0x9e, 0x8d, 0x5c, 0xd7, 0xc7, 0xd9, 0x76, 0x6e, + 0xc1, 0x9e, 0x51, 0xee, + 0xfd, 0x7f, 0x51, 0xac, 0x71, 0x5d, 0x9f, 0xae, 0x74, 0xdd, 0x5f, 0x93, + 0xcc, 0xf6, 0x40, 0x5d, + 0xb6, 0x07, 0x80, 0x81, 0xa0, 0xcf, 0xd9, 0xb3, 0xda, 0xe2, 0xe0, 0xc3, + 0x19, 0x65, 0x13, 0x77, + 0x5e, 0xa8, 0x3d, 0xd0, 0x35, 0x61, 0xaf, 0x09, 0x6b, 0x02, 0xbf, 0x2b, + 0xad, 0x0f, 0x6b, 0xa1, + 0xb7, 0x73, 0xbe, 0xe7, 0x35, 0xfc, 0x5e, 0x0b, 0x27, 0xec, 0x3c, 0xc2, + 0x7e, 0xf7, 0xe9, 0x55, + 0xed, 0xbc, 0x21, 0xd1, 0x05, 0xd0, 0xa2, 0xfb, 0xa8, 0x0b, 0xc1, 0x67, + 0xe6, 0xb5, 0xf9, 0x7b, + 0xec, 0xf7, 0x0a, 0xcf, 0xb8, 0x9c, 0x44, 0xd7, 0x73, 0x96, 0xae, 0xfb, + 0x7f, 0xaf, 0xd8, 0x73, + 0x3a, 0x5a, 0x17, 0xce, 0x0a, 0x87, 0xea, 0x73, 0x7a, 0xa9, 0x59, 0x9a, + 0x87, 0x3c, 0x1b, 0x41, + 0xd7, 0x47, 0x50, 0xf3, 0x59, 0xaa, 0x6d, 0x9e, 0x15, 0x7d, 0xcf, 0x6b, + 0x71, 0x5e, 0xcf, 0x58, + 0xe7, 0x75, 0xed, 0x45, 0xd0, 0x05, 0x71, 0x66, 0x46, 0xbc, 0x26, 0xec, + 0x81, 0x89, 0xd6, 0x02, + 0x5d, 0xd7, 0x67, 0xb9, 0x66, 0xb0, 0xae, 0xeb, 0x4d, 0x78, 0x4e, 0x65, + 0x14, 0x35, 0x5b, 0xfc, + 0xcc, 0x7c, 0x1f, 0x75, 0x41, 0xfa, 0x6c, 0xf4, 0x3e, 0x8f, 0xc5, 0x79, + 0x7d, 0x9a, 0x6b, 0xe5, + 0x4f, 0x5c, 0xe7, 0xf5, 0x5b, 0x70, 0xc6, 0x75, 0xeb, 0xba, 0xb6, 0x7e, + 0x5e, 0xef, 0xe3, 0xf6, + 0x40, 0xea, 0x3a, 0x7b, 0x20, 0x20, 0xe7, 0xcf, 0xcf, 0xe9, 0x92, 0x7e, + 0x13, 0xc8, 0x9b, 0x72, + 0x5d, 0x67, 0x6b, 0xe6, 0xfa, 0xbd, 0xd8, 0xba, 0xde, 0xd0, 0xa1, 0x57, + 0xd5, 0x3e, 0xaf, 0xc3, + 0x1e, 0x38, 0x93, 0x9f, 0x99, 0x39, 0x07, 0xc6, 0xc5, 0x83, 0xe1, 0xbe, + 0x0b, 0x7b, 0x26, 0xa4, + 0x82, 0xd6, 0xe2, 0x21, 0x58, 0x93, 0x8d, 0xb5, 0x5e, 0x79, 0x6b, 0x2d, + 0x8e, 0x37, 0x1b, 0x25, + 0x9f, 0xef, 0xc2, 0x7f, 0xaf, 0xee, 0xb5, 0xf0, 0xfb, 0x2e, 0x2a, 0x5d, + 0x18, 0x61, 0xfd, 0x77, + 0x85, 0x2e, 0xb8, 0xce, 0xcc, 0x61, 0xf1, 0x2e, 0xfe, 0xbc, 0x9e, 0x15, + 0x9a, 0x6c, 0x6d, 0x6b, + 0x81, 0xcf, 0xeb, 0xe9, 0xca, 0x0f, 0x13, 0xba, 0xa0, 0x88, 0x3d, 0x31, + 0x6d, 0x8d, 0x53, 0x17, + 0xf8, 0xb3, 0x51, 0x55, 0xaf, 0x02, 0xfe, 0xd2, 0x05, 0xf8, 0x2e, 0xa9, + 0x8e, 0xd0, 0x75, 0xdf, + 0xf3, 0xda, 0xd6, 0x75, 0xf6, 0xef, 0x70, 0x4e, 0xd7, 0x7a, 0xe1, 0xbe, + 0x4b, 0x24, 0x5d, 0x50, + 0xe5, 0x01, 0x91, 0xe7, 0xf4, 0xb5, 0x67, 0x23, 0xd7, 0xf5, 0xcc, 0xba, + 0x1f, 0x76, 0xab, 0xc4, + 0xfd, 0x30, 0xb7, 0xae, 0xfb, 0xef, 0x25, 0xde, 0x3d, 0xc0, 0xf6, 0xdd, + 0x99, 0x54, 0x17, 0x70, + 0x31, 0xac, 0x9e, 0x38, 0xaf, 0x83, 0xae, 0xc3, 0x67, 0xc3, 0x1f, 0x53, + 0x72, 0xce, 0xeb, 0xf6, + 0xbd, 0x0c, 0x73, 0x1d, 0xfc, 0x1e, 0x48, 0xe3, 0xf6, 0x80, 0x6a, 0x06, + 0x65, 0x94, 0x18, 0xd6, + 0x22, 0xd3, 0x10, 0xba, 0x5e, 0xac, 0xaf, 0x9f, 0xd7, 0x73, 0x5c, 0xd7, + 0xe1, 0x77, 0x96, 0x91, + 0xd5, 0xa0, 0x0c, 0xd8, 0xf9, 0x63, 0xc2, 0x7e, 0xb7, 0x16, 0x07, 0xdf, + 0x3a, 0x53, 0x5a, 0xcf, + 0xeb, 0x5c, 0x70, 0x8d, 0x65, 0x5c, 0xe7, 0x85, 0x58, 0xd7, 0x44, 0x13, + 0xbe, 0x0b, 0xdb, 0x2f, + 0xc5, 0x33, 0x9f, 0x4f, 0x69, 0xad, 0x05, 0x8f, 0xaf, 0x81, 0xae, 0x5b, + 0xba, 0xa0, 0x3c, 0xbf, + 0x8e, 0x23, 0xe8, 0x82, 0xca, 0x7f, 0x47, 0x9e, 0x99, 0x85, 0xef, 0xa2, + 0x83, 0xef, 0x62, 0xc7, + 0xd7, 0x1a, 0x6b, 0xf1, 0x35, 0xa6, 0xeb, 0x5c, 0x17, 0xc4, 0x7c, 0x13, + 0x43, 0x75, 0x66, 0x8e, + 0x4b, 0x17, 0x72, 0x98, 0x33, 0x33, 0x68, 0x91, 0xef, 0xd9, 0x18, 0x18, + 0x5f, 0x13, 0x5a, 0x58, + 0x2b, 0xb0, 0xe7, 0xb5, 0x2f, 0xbe, 0x66, 0xac, 0xf9, 0xef, 0xc3, 0x2b, + 0xc5, 0xf5, 0x82, 0x75, + 0x61, 0x79, 0xbd, 0xd8, 0xb6, 0xe3, 0x87, 0xb1, 0x7b, 0x29, 0x79, 0xef, + 0x65, 0x2d, 0xbe, 0x06, + 0xf7, 0x92, 0x46, 0xed, 0x01, 0x0d, 0xb9, 0x07, 0x72, 0x11, 0x62, 0xdb, + 0xea, 0xd7, 0x84, 0x3d, + 0x00, 0xe7, 0x03, 0x59, 0x7c, 0x8d, 0xeb, 0x3a, 0xd3, 0x16, 0x6b, 0x0f, + 0x18, 0xaa, 0x73, 0x7a, + 0x5c, 0x7b, 0xe0, 0x4a, 0xb1, 0x6d, 0x91, 0x2b, 0x58, 0x3f, 0xaf, 0xb3, + 0x7b, 0x81, 0x3d, 0x00, + 0xe7, 0x75, 0x79, 0xbd, 0xb8, 0xfd, 0x5c, 0x48, 0x77, 0x80, 0x81, 0x0f, + 0x97, 0x73, 0x26, 0x84, + 0xff, 0xbf, 0xd0, 0x5b, 0x99, 0x09, 0xfb, 0xde, 0x81, 0x88, 0x15, 0x6a, + 0xc3, 0x6c, 0x27, 0xb7, + 0xc8, 0xb4, 0x94, 0xb9, 0x94, 0x59, 0xae, 0xa5, 0x8f, 0x15, 0x9f, 0xdd, + 0x23, 0xcd, 0x80, 0xd7, + 0x61, 0x7b, 0x34, 0x7c, 0x66, 0xeb, 0x48, 0x67, 0xaf, 0x99, 0x56, 0xbf, + 0xe6, 0x9c, 0xbd, 0xe6, + 0x88, 0x69, 0x9c, 0xad, 0xeb, 0x4b, 0xef, 0x7c, 0x13, 0xb8, 0x97, 0x2c, + 0xbb, 0x17, 0xb8, 0x47, + 0x8b, 0xff, 0x2a, 0xf7, 0x5d, 0xc6, 0xec, 0x35, 0xe7, 0xca, 0xd7, 0x34, + 0x32, 0x8b, 0x5c, 0x2b, + 0x3b, 0x54, 0x7c, 0x76, 0x8f, 0x52, 0x06, 0xbc, 0xbe, 0x6a, 0x8f, 0x6a, + 0x13, 0xf6, 0x9a, 0xb3, + 0x54, 0xdb, 0x7b, 0xc6, 0xe5, 0xcc, 0xb2, 0xb6, 0xcd, 0x2c, 0x73, 0x9f, + 0xd7, 0xb3, 0x53, 0x31, + 0xb7, 0x4a, 0x3b, 0x0a, 0x60, 0x7a, 0x33, 0xdd, 0xc9, 0x1d, 0xeb, 0x4d, + 0xd5, 0x79, 0x41, 0x9b, + 0xe4, 0xda, 0xbe, 0xd7, 0x0c, 0x7c, 0xbe, 0x64, 0xd9, 0x5a, 0xa6, 0x55, + 0x7b, 0x74, 0xc0, 0x5e, + 0x53, 0x70, 0x25, 0x25, 0xbe, 0x4b, 0xaa, 0x9b, 0x1a, 0x33, 0x6d, 0x67, + 0x6b, 0xe6, 0xbf, 0x17, + 0x7d, 0x26, 0xe2, 0x30, 0x3c, 0x9e, 0xcd, 0xd7, 0x09, 0x72, 0x46, 0xec, + 0x35, 0x55, 0xf1, 0x2e, + 0xf6, 0xb9, 0xcf, 0x2d, 0xb3, 0xca, 0xcf, 0x46, 0x6a, 0xc6, 0xee, 0x73, + 0xa2, 0xb5, 0x55, 0xba, + 0xc0, 0x3f, 0x1b, 0x8a, 0xcf, 0xe3, 0xc6, 0x30, 0xdb, 0x85, 0xd7, 0x4c, + 0x8d, 0x98, 0xff, 0x31, + 0x5b, 0xff, 0xbd, 0x00, 0x63, 0x38, 0x3d, 0x4e, 0x75, 0xe0, 0x35, 0xf5, + 0xb1, 0xd6, 0x51, 0xbd, + 0x26, 0x6e, 0x0f, 0x64, 0x31, 0x7b, 0xc0, 0x10, 0x7b, 0x40, 0xb5, 0xef, + 0x7c, 0x9f, 0xc7, 0x23, + 0xb1, 0xff, 0x33, 0x33, 0x31, 0x07, 0xc3, 0xbd, 0xff, 0xe1, 0x7e, 0x32, + 0xec, 0x77, 0xe6, 0xcf, + 0x15, 0x5c, 0x69, 0x0f, 0x9c, 0x5c, 0x69, 0x0f, 0x04, 0xde, 0x27, 0xfb, + 0x3c, 0xb6, 0x32, 0x41, + 0x9f, 0x47, 0xf7, 0x4c, 0x8f, 0x25, 0xfb, 0xdd, 0x48, 0xb5, 0x4c, 0x5b, + 0xab, 0x3d, 0xcb, 0x59, + 0xba, 0x20, 0x7e, 0xaf, 0x59, 0xef, 0xef, 0x15, 0xbe, 0x1f, 0x7e, 0xaf, + 0x53, 0xf0, 0x6b, 0x9c, + 0xb8, 0xa9, 0xf1, 0x40, 0x74, 0x61, 0x7c, 0xc5, 0x35, 0xf1, 0xcd, 0x37, + 0x71, 0xee, 0xe5, 0x04, + 0xd6, 0x22, 0xeb, 0xd1, 0x75, 0xff, 0xbd, 0x60, 0x75, 0x41, 0xbf, 0xbe, + 0x2e, 0xb8, 0xce, 0x62, + 0xec, 0x35, 0xa7, 0x92, 0xd7, 0xec, 0x09, 0x66, 0x59, 0x9a, 0x69, 0x9e, + 0x7e, 0x12, 0xa0, 0xeb, + 0x53, 0xb8, 0x97, 0x54, 0xd7, 0x99, 0x6f, 0x30, 0xc8, 0x74, 0x5f, 0x04, + 0x5d, 0xc0, 0x3f, 0x1b, + 0xd9, 0x7d, 0xc2, 0x33, 0x8a, 0xeb, 0xfa, 0xa9, 0x4f, 0xd7, 0xad, 0x79, + 0x84, 0xd6, 0x6b, 0x76, + 0x63, 0xd0, 0x05, 0x33, 0x8a, 0x2e, 0xa4, 0x30, 0x9f, 0xc7, 0xd5, 0xb3, + 0x71, 0xa5, 0xeb, 0x73, + 0xaf, 0x16, 0xf2, 0xf3, 0xc4, 0xdc, 0xa5, 0xeb, 0x81, 0x73, 0x27, 0x90, + 0xba, 0xc0, 0x5f, 0x53, + 0xbd, 0x07, 0x32, 0x32, 0x5d, 0x08, 0x7a, 0x36, 0xae, 0xbf, 0xa6, 0x01, + 0xef, 0xd3, 0xd6, 0x75, + 0xcf, 0x9e, 0xb1, 0x75, 0x1d, 0x72, 0x05, 0x7d, 0xcf, 0xcc, 0x5c, 0xdc, + 0xb3, 0xb1, 0x8f, 0xdc, + 0x03, 0x93, 0x90, 0x3d, 0xe0, 0xfb, 0x3c, 0xaa, 0x9e, 0x8d, 0x1a, 0x7f, + 0x36, 0xc2, 0x39, 0x76, + 0x5d, 0xd7, 0xe1, 0x5e, 0x14, 0xe7, 0x05, 0x03, 0xce, 0xfb, 0x7c, 0x2d, + 0x7c, 0xbf, 0x57, 0xf8, + 0x3a, 0xfb, 0x79, 0xbd, 0x36, 0x3f, 0x78, 0x75, 0x5e, 0x68, 0xc5, 0xb6, + 0x26, 0xa0, 0x0b, 0x33, + 0xed, 0x5a, 0x6b, 0xe2, 0xfe, 0xbd, 0xae, 0xdd, 0x8b, 0x98, 0x09, 0xe0, + 0xf9, 0xbd, 0xf2, 0xd7, + 0xc4, 0xea, 0x42, 0x5f, 0xa5, 0x0b, 0x19, 0x94, 0x2e, 0x60, 0xcf, 0x0b, + 0xa0, 0x7f, 0x70, 0xbe, + 0x08, 0x7a, 0x5e, 0x3b, 0xba, 0x3e, 0x76, 0x5e, 0xd3, 0xb8, 0xb6, 0x2e, + 0xf4, 0xc4, 0x1e, 0x8d, + 0xa8, 0x0b, 0xb8, 0x33, 0x33, 0x3c, 0xa3, 0x6c, 0x5d, 0xf7, 0x9c, 0xd7, + 0x75, 0x7e, 0x4f, 0xd9, + 0x89, 0x4f, 0xd7, 0xef, 0xab, 0x2e, 0x80, 0xfe, 0xe9, 0x98, 0x33, 0x8a, + 0xec, 0xd9, 0x68, 0xd8, + 0xbe, 0x47, 0xe0, 0x79, 0x7d, 0x16, 0x70, 0x5e, 0x7f, 0x11, 0x74, 0xc1, + 0x7a, 0x36, 0xaa, 0x5e, + 0xd3, 0xe0, 0xcf, 0x46, 0xf6, 0x19, 0xf2, 0xeb, 0xba, 0xe7, 0xbc, 0xde, + 0x87, 0xbc, 0x29, 0x72, + 0x0f, 0x2c, 0x91, 0x7b, 0x60, 0x82, 0xd8, 0x03, 0xe8, 0xe7, 0x31, 0xff, + 0x3c, 0x1a, 0x9a, 0x7d, + 0xae, 0x73, 0xdd, 0x4b, 0xc0, 0x9a, 0xb4, 0xc2, 0x7c, 0x17, 0xce, 0x8e, + 0x5e, 0xe6, 0xc2, 0x7e, + 0xaf, 0xe2, 0x19, 0x17, 0x45, 0x17, 0x90, 0x6b, 0x12, 0xdb, 0x19, 0x05, + 0xce, 0x0b, 0xec, 0x35, + 0x03, 0x75, 0xdd, 0xf5, 0x7b, 0x15, 0xfe, 0xbb, 0x86, 0xd3, 0x85, 0xa3, + 0x58, 0x75, 0x21, 0x92, + 0xef, 0x12, 0xa6, 0xeb, 0xf0, 0x19, 0xe7, 0x7e, 0x58, 0x3f, 0xe8, 0x19, + 0xe5, 0xd2, 0x85, 0xfb, + 0xe7, 0xbf, 0x47, 0xf3, 0x5d, 0xdc, 0x7e, 0xd8, 0x52, 0xa2, 0xeb, 0x3e, + 0x3f, 0x2c, 0x85, 0x39, + 0xa7, 0xf7, 0xac, 0x73, 0x7a, 0x1f, 0x73, 0x4e, 0xcf, 0xb6, 0x70, 0xe7, + 0x74, 0xc5, 0xe7, 0x91, + 0x9d, 0x1d, 0xe0, 0xf3, 0x98, 0x99, 0x05, 0xc7, 0x61, 0x32, 0xf6, 0x79, + 0xfd, 0xc5, 0xda, 0x03, + 0xd8, 0xe7, 0x31, 0x7f, 0x36, 0x6a, 0x86, 0x3f, 0x57, 0xe0, 0x9c, 0x71, + 0xd9, 0xef, 0x85, 0x6b, + 0xae, 0x2c, 0x0e, 0x13, 0x2d, 0x86, 0xc5, 0xfd, 0xf7, 0xa8, 0x7b, 0x20, + 0xe2, 0xbe, 0x73, 0xb4, + 0xec, 0x2a, 0x6b, 0xc2, 0xcf, 0x0b, 0x96, 0xef, 0xe2, 0x9f, 0x1f, 0xec, + 0xf8, 0x61, 0x43, 0xf1, + 0xbb, 0x8f, 0x29, 0xae, 0x77, 0x1f, 0xd6, 0xc4, 0xd9, 0x2f, 0x2b, 0x5d, + 0x5f, 0x04, 0xf8, 0x2e, + 0xa0, 0x85, 0x43, 0x85, 0xef, 0xf2, 0x20, 0x74, 0x21, 0xe0, 0x9c, 0x1e, + 0x14, 0x87, 0x71, 0xfb, + 0x61, 0x6b, 0xbe, 0x8b, 0xeb, 0x79, 0xbd, 0x7a, 0xbf, 0xd6, 0x79, 0x21, + 0x56, 0xff, 0x5d, 0x8b, + 0xc7, 0x77, 0x19, 0x31, 0x5d, 0x60, 0xf7, 0x29, 0x3b, 0xaf, 0xdb, 0xba, + 0xce, 0x75, 0x61, 0xfc, + 0x60, 0x75, 0x81, 0xef, 0x01, 0x55, 0x6c, 0xdb, 0x3a, 0xa7, 0x8b, 0xd9, + 0x8c, 0xf2, 0xf8, 0x1a, + 0xec, 0x19, 0xfe, 0x3c, 0x96, 0xc7, 0xd7, 0x56, 0x71, 0xbd, 0xfb, 0xab, + 0x0b, 0xb8, 0x18, 0x96, + 0xf4, 0xbc, 0xee, 0xd6, 0x75, 0x6d, 0xed, 0xbc, 0x7e, 0x3f, 0xf6, 0x40, + 0x3c, 0xb1, 0xed, 0x6b, + 0xfa, 0x2e, 0x41, 0xf1, 0x35, 0x38, 0x7b, 0xc0, 0xb3, 0x2f, 0x24, 0xbe, + 0xf6, 0xf0, 0xad, 0x89, + 0xeb, 0x19, 0xb7, 0x74, 0xed, 0x39, 0x59, 0x7c, 0xed, 0x45, 0xd2, 0x05, + 0x64, 0xbc, 0xdf, 0x80, + 0xf3, 0x6b, 0x6e, 0xce, 0x7c, 0x97, 0xb0, 0xbc, 0x89, 0xed, 0xbb, 0xc4, + 0x19, 0xd7, 0x43, 0xfa, + 0xef, 0x38, 0x2d, 0xb2, 0x7d, 0x97, 0xe0, 0xf8, 0x1a, 0xbf, 0x17, 0xf6, + 0xd9, 0xd0, 0x27, 0xa9, + 0xf6, 0x2a, 0x6f, 0xf2, 0x22, 0xe9, 0x02, 0x2e, 0xae, 0x67, 0x48, 0xcf, + 0xeb, 0x4b, 0xaf, 0xae, + 0xfb, 0xbf, 0x2f, 0x13, 0xeb, 0x1e, 0xd0, 0xe3, 0xc9, 0x79, 0x81, 0xae, + 0x8f, 0xc5, 0x73, 0x2a, + 0x30, 0x0e, 0x33, 0x5e, 0x9d, 0xd7, 0x5f, 0x84, 0x3d, 0x80, 0x3b, 0x33, + 0xc7, 0x95, 0x07, 0x84, + 0xb5, 0x08, 0x8a, 0x9b, 0x5a, 0xb1, 0xc6, 0xa0, 0x1c, 0x52, 0x68, 0xbc, + 0xff, 0x7e, 0xae, 0x09, + 0xd2, 0x77, 0xc9, 0x86, 0xc5, 0xd7, 0x40, 0xd7, 0x47, 0x99, 0x58, 0x75, + 0x21, 0xc6, 0x3c, 0xe0, + 0x2a, 0xae, 0xe7, 0xce, 0x9b, 0xac, 0x3d, 0xaf, 0x6d, 0xdf, 0x25, 0x64, + 0x2e, 0xf4, 0x83, 0xd1, + 0x05, 0x6c, 0xbc, 0x5f, 0x9c, 0xd7, 0x15, 0x79, 0x93, 0x35, 0x3f, 0xcc, + 0x8e, 0xeb, 0xc5, 0xa7, + 0x0b, 0x38, 0x2d, 0x0a, 0x7f, 0x36, 0x8a, 0x7b, 0x61, 0xbf, 0x27, 0x3b, + 0xd6, 0x29, 0xcf, 0x87, + 0x47, 0x8a, 0xeb, 0xa9, 0xfd, 0xf7, 0x19, 0x5e, 0x8b, 0x94, 0x31, 0x2c, + 0xfe, 0x9a, 0x99, 0x96, + 0x52, 0xd7, 0xe7, 0xd6, 0x73, 0x2a, 0xec, 0xf7, 0x8e, 0x7c, 0x36, 0x6a, + 0x51, 0xce, 0xe9, 0x23, + 0xcc, 0xdc, 0x8f, 0x58, 0xd7, 0xc4, 0xd0, 0xc6, 0x59, 0x91, 0x77, 0x09, + 0x8a, 0xaf, 0xb9, 0xfa, + 0x4d, 0x44, 0xbc, 0x7f, 0x23, 0x96, 0x58, 0x67, 0xac, 0x79, 0x40, 0x4b, + 0x8b, 0x78, 0xbd, 0x4f, + 0x58, 0xde, 0x04, 0xf6, 0xe0, 0xc2, 0xe3, 0xbb, 0x5c, 0x2f, 0xae, 0x77, + 0xbf, 0xf3, 0x80, 0xbd, + 0x00, 0x3f, 0xec, 0x34, 0x3c, 0xbe, 0x86, 0xd7, 0x85, 0x8d, 0xb8, 0x74, + 0x01, 0x17, 0xef, 0xef, + 0x89, 0x9a, 0x4f, 0x1e, 0xa7, 0x08, 0x8b, 0xaf, 0x81, 0xae, 0x0f, 0x91, + 0xb9, 0xf0, 0xd8, 0xcf, + 0x28, 0x19, 0xd4, 0x6b, 0xea, 0xec, 0x8c, 0x22, 0x8d, 0xaf, 0x2d, 0x85, + 0xef, 0x21, 0xe2, 0x97, + 0xe1, 0x35, 0x5b, 0x1b, 0x71, 0xea, 0xc2, 0xd5, 0x63, 0xdb, 0xae, 0x3a, + 0xa7, 0xf5, 0x3d, 0x93, + 0x9d, 0x85, 0xe4, 0xc3, 0x23, 0xed, 0x01, 0xdc, 0xf3, 0x38, 0x2c, 0xb6, + 0xfd, 0xff, 0x03, 0x75, + 0x97, 0x23, 0xba +}; diff --git a/source/ngc/gui/iso9660.c b/source/ngc/gui/iso9660.c index 2a8bb9a..9cc8128 100644 --- a/source/ngc/gui/iso9660.c +++ b/source/ngc/gui/iso9660.c @@ -1,239 +1,221 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * DVD ISO9660/Joliet Parsing - * - * This is not intended as a complete guide to ISO9660. - * Here I use the bare minimum! - ***************************************************************************/ -#include "shared.h" -#include "dvd.h" -#include "iso9660.h" - -/** Minimal ISO Directory Definition **/ -#define RECLEN 0 /* Record length */ -#define EXTENT 6 /* Extent */ -#define FILE_LENGTH 14 /* File length (BIG ENDIAN) */ -#define FILE_FLAGS 25 /* File flags */ -#define FILENAME_LENGTH 32 /* Filename length */ -#define FILENAME 33 /* ASCIIZ filename */ - -/** Minimal Primary Volume Descriptor **/ -#define PVDROOT 0x9c - -static int IsJoliet = 0; -u64 rootdir = 0; -u64 basedir = 0; -int rootdirlength = 0; - -/** Global file entry table **/ -FILEENTRIES filelist[MAXFILES]; -static char dvdbuffer[2048]; - -/**************************************************************************** - * Primary Volume Descriptor - * - * The PVD should reside between sector 16 and 31. - * This is for single session DVD only. - ****************************************************************************/ -int getpvd () -{ - int sector = 16; - u32 rootdir32; - - basedir = rootdirlength = 0; - IsJoliet = -1; - - /** Look for Joliet PVD first **/ - while (sector < 32) - { - if (dvd_read (&dvdbuffer, 2048, (u64)(sector << 11))) - { - if (memcmp (&dvdbuffer, "\2CD001\1", 8) == 0) - { - memcpy(&rootdir32, &dvdbuffer[PVDROOT + EXTENT], 4); - basedir = (u64)rootdir32; - memcpy (&rootdirlength, &dvdbuffer[PVDROOT + FILE_LENGTH], 4); - basedir <<= 11; - IsJoliet = 1; - break; - } - } - else return 0; /*** Can't read sector! ***/ - sector++; - } - - if (IsJoliet > 0) return 1; /*** Joliet PVD Found ? ***/ - - /*** Look for standard ISO9660 PVD ***/ - sector = 16; - while (sector < 32) - { - if (dvd_read (&dvdbuffer, 2048, (u64)(sector << 11))) - { - if (memcmp (&dvdbuffer, "\1CD001\1", 8) == 0) - { - memcpy (&rootdir32, &dvdbuffer[PVDROOT + EXTENT], 4); - basedir = (u64)rootdir32; - memcpy (&rootdirlength, &dvdbuffer[PVDROOT + FILE_LENGTH], 4); - IsJoliet = 0; - basedir <<= 11; - break; - } - } - else return 0; /*** Can't read sector! ***/ - sector++; - } - - return (IsJoliet == 0); -} - -/**************************************************************************** - * getentry - * - * Support function to return the next file entry, if any - * Declared static to avoid accidental external entry. - ****************************************************************************/ -static int diroffset = 0; -static int getentry (int entrycount) -{ - char fname[512]; /* Huge, but experience has determined this */ - char *ptr; - char *filename; - char *filenamelength; - char *rr; - int j; - u32 offset32; - - /* Basic checks */ - if (entrycount >= MAXFILES) return 0; - if (diroffset >= 2048) return 0; - - /** Decode this entry **/ - if (dvdbuffer[diroffset]) /* Record length available */ - { - /* Update offsets into sector buffer */ - ptr = (char *) &dvdbuffer[0]; - ptr += diroffset; - filename = ptr + FILENAME; - filenamelength = ptr + FILENAME_LENGTH; - - /* Check for wrap round - illegal in ISO spec, - * but certain crap writers do it! */ - if ((diroffset + dvdbuffer[diroffset]) > 2048) return 0; - - if (*filenamelength) - { - memset (&fname, 0, 512); - - /*** Do ISO 9660 first ***/ - if (!IsJoliet) strcpy (fname, filename); - else - { - /*** The more tortuous unicode joliet entries ***/ - for (j = 0; j < (*filenamelength >> 1); j++) - { - fname[j] = filename[j * 2 + 1]; - } - - fname[j] = 0; - - if (strlen (fname) >= MAXJOLIET) fname[MAXJOLIET - 1] = 0; - if (strlen (fname) == 0) fname[0] = filename[0]; - } - - if (strlen (fname) == 0) strcpy (fname, "."); - else - { - if (fname[0] == 1) strcpy (fname, ".."); - else - { - /* - * Move *filenamelength to t, - * Only to stop gcc warning for noobs :) - */ - int t = *filenamelength; - fname[t] = 0; - } - } - - /** Rockridge Check **/ - rr = strstr (fname, ";"); - if (rr != NULL) *rr = 0; - - strcpy (filelist[entrycount].filename, fname); - memcpy (&offset32, &dvdbuffer[diroffset + EXTENT], 4); - filelist[entrycount].offset = (u64)offset32; - memcpy (&filelist[entrycount].length, &dvdbuffer[diroffset + FILE_LENGTH], 4); - memcpy (&filelist[entrycount].flags, &dvdbuffer[diroffset + FILE_FLAGS], 1); - - filelist[entrycount].offset <<= 11; - filelist[entrycount].flags = filelist[entrycount].flags & 2; - filelist[entrycount].filename_offset = 0; - - /*** Prepare for next entry ***/ - diroffset += dvdbuffer[diroffset]; - - return 1; - } - } - return 0; -} - -/**************************************************************************** - * parsedirectory - * - * This function will parse the directory tree. - * It relies on rootdir and rootdirlength being pre-populated by a call to - * getpvd, a previous parse or a menu selection. - * - * The return value is number of files collected, or 0 on failure. - ****************************************************************************/ -int parsedirectory () -{ - int pdlength; - u64 pdoffset; - u64 rdoffset; - int len = 0; - int filecount = 0; - - pdoffset = rdoffset = rootdir; - pdlength = rootdirlength; - filecount = 0; - - /** Clear any existing values ***/ - memset (&filelist, 0, sizeof (FILEENTRIES) * MAXFILES); - - /*** Get as many files as possible ***/ - while (len < pdlength) - { - if (dvd_read (&dvdbuffer, 2048, pdoffset) == 0) return 0; - - diroffset = 0; - - while (getentry (filecount)) - { - if (filecount < MAXFILES) filecount++; - } - - len += 2048; - pdoffset = rdoffset + len; - } - return filecount; -} +/**************************************************************************** + * DVD ISO9660/Joliet Parsing + * + * This is not intended as a complete guide to ISO9660. + * Here I use the bare minimum! + ***************************************************************************/ +#include "shared.h" +#include "dvd.h" +#include "iso9660.h" + +/** Minimal ISO Directory Definition **/ +#define RECLEN 0 /* Record length */ +#define EXTENT 6 /* Extent */ +#define FILE_LENGTH 14 /* File length (BIG ENDIAN) */ +#define FILE_FLAGS 25 /* File flags */ +#define FILENAME_LENGTH 32 /* Filename length */ +#define FILENAME 33 /* ASCIIZ filename */ + +/** Minimal Primary Volume Descriptor **/ +#define PVDROOT 0x9c + +static int IsJoliet = 0; +u64 rootdir = 0; +u64 basedir = 0; +int rootdirlength = 0; + +/** Global file entry table **/ +FILEENTRIES filelist[MAXFILES]; +static char dvdbuffer[2048]; + +/**************************************************************************** + * Primary Volume Descriptor + * + * The PVD should reside between sector 16 and 31. + * This is for single session DVD only. + ****************************************************************************/ +int getpvd () +{ + int sector = 16; + u32 rootdir32; + + basedir = rootdirlength = 0; + IsJoliet = -1; + + /** Look for Joliet PVD first **/ + while (sector < 32) + { + if (dvd_read (&dvdbuffer, 2048, (u64)(sector << 11))) + { + if (memcmp (&dvdbuffer, "\2CD001\1", 8) == 0) + { + memcpy(&rootdir32, &dvdbuffer[PVDROOT + EXTENT], 4); + basedir = (u64)rootdir32; + memcpy (&rootdirlength, &dvdbuffer[PVDROOT + FILE_LENGTH], 4); + basedir <<= 11; + IsJoliet = 1; + break; + } + } + else return 0; /*** Can't read sector! ***/ + sector++; + } + + if (IsJoliet > 0) return 1; /*** Joliet PVD Found ? ***/ + + /*** Look for standard ISO9660 PVD ***/ + sector = 16; + while (sector < 32) + { + if (dvd_read (&dvdbuffer, 2048, (u64)(sector << 11))) + { + if (memcmp (&dvdbuffer, "\1CD001\1", 8) == 0) + { + memcpy (&rootdir32, &dvdbuffer[PVDROOT + EXTENT], 4); + basedir = (u64)rootdir32; + memcpy (&rootdirlength, &dvdbuffer[PVDROOT + FILE_LENGTH], 4); + IsJoliet = 0; + basedir <<= 11; + break; + } + } + else return 0; /*** Can't read sector! ***/ + sector++; + } + + return (IsJoliet == 0); +} + +/**************************************************************************** + * getentry + * + * Support function to return the next file entry, if any + * Declared static to avoid accidental external entry. + ****************************************************************************/ +static int diroffset = 0; +static int getentry (int entrycount) +{ + char fname[512]; /* Huge, but experience has determined this */ + char *ptr; + char *filename; + char *filenamelength; + char *rr; + int j; + u32 offset32; + + /* Basic checks */ + if (entrycount >= MAXFILES) return 0; + if (diroffset >= 2048) return 0; + + /** Decode this entry **/ + if (dvdbuffer[diroffset]) /* Record length available */ + { + /* Update offsets into sector buffer */ + ptr = (char *) &dvdbuffer[0]; + ptr += diroffset; + filename = ptr + FILENAME; + filenamelength = ptr + FILENAME_LENGTH; + + /* Check for wrap round - illegal in ISO spec, + * but certain crap writers do it! */ + if ((diroffset + dvdbuffer[diroffset]) > 2048) return 0; + + if (*filenamelength) + { + memset (&fname, 0, 512); + + /*** Do ISO 9660 first ***/ + if (!IsJoliet) strcpy (fname, filename); + else + { + /*** The more tortuous unicode joliet entries ***/ + for (j = 0; j < (*filenamelength >> 1); j++) + { + fname[j] = filename[j * 2 + 1]; + } + + fname[j] = 0; + + if (strlen (fname) >= MAXJOLIET) fname[MAXJOLIET - 1] = 0; + if (strlen (fname) == 0) fname[0] = filename[0]; + } + + if (strlen (fname) == 0) strcpy (fname, "."); + else + { + if (fname[0] == 1) strcpy (fname, ".."); + else + { + /* + * Move *filenamelength to t, + * Only to stop gcc warning for noobs :) + */ + int t = *filenamelength; + fname[t] = 0; + } + } + + /** Rockridge Check **/ + rr = strstr (fname, ";"); + if (rr != NULL) *rr = 0; + + strcpy (filelist[entrycount].filename, fname); + memcpy (&offset32, &dvdbuffer[diroffset + EXTENT], 4); + filelist[entrycount].offset = (u64)offset32; + memcpy (&filelist[entrycount].length, &dvdbuffer[diroffset + FILE_LENGTH], 4); + memcpy (&filelist[entrycount].flags, &dvdbuffer[diroffset + FILE_FLAGS], 1); + + filelist[entrycount].offset <<= 11; + filelist[entrycount].flags = filelist[entrycount].flags & 2; + filelist[entrycount].filename_offset = 0; + + /*** Prepare for next entry ***/ + diroffset += dvdbuffer[diroffset]; + + return 1; + } + } + return 0; +} + +/**************************************************************************** + * parseDVDdirectory + * + * This function will parse the directory tree. + * It relies on rootdir and rootdirlength being pre-populated by a call to + * getpvd, a previous parse or a menu selection. + * + * The return value is number of files collected, or 0 on failure. + ****************************************************************************/ +int parseDVDdirectory () +{ + int pdlength; + u64 pdoffset; + u64 rdoffset; + int len = 0; + int filecount = 0; + + pdoffset = rdoffset = rootdir; + pdlength = rootdirlength; + filecount = 0; + + /** Clear any existing values ***/ + memset (&filelist, 0, sizeof (FILEENTRIES) * MAXFILES); + + /*** Get as many files as possible ***/ + while (len < pdlength) + { + if (dvd_read (&dvdbuffer, 2048, pdoffset) == 0) return 0; + + diroffset = 0; + + while (getentry (filecount)) + { + if (filecount < MAXFILES) filecount++; + } + + len += 2048; + pdoffset = rdoffset + len; + } + return filecount; +} diff --git a/source/ngc/gui/iso9660.h b/source/ngc/gui/iso9660.h index ae132d6..6cf153c 100644 --- a/source/ngc/gui/iso9660.h +++ b/source/ngc/gui/iso9660.h @@ -1,44 +1,31 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * DVD ISO9660/Joliet Parsing - * - * This is not intended as a complete guide to ISO9660. - * Here I use the bare minimum! - ***************************************************************************/ - -#define MAXJOLIET 256 -#define MAXFILES 1000 /** Restrict to 1000 files per dir **/ - -typedef struct -{ - u64 offset; - unsigned int length; - char flags; - char filename[MAXJOLIET]; - u16 filename_offset; -} FILEENTRIES; - -extern u64 basedir; -extern u64 rootdir; -extern int rootdirlength; - -extern int getpvd (); -extern int parsedirectory (); -extern FILEENTRIES filelist[MAXFILES]; +/**************************************************************************** + * + * DVD ISO9660/Joliet Parsing + * + * This is not intended as a complete guide to ISO9660. + * Here I use the bare minimum! + ***************************************************************************/ + #ifndef _ISO9660_H + #define _ISO9660_H + +#define MAXJOLIET 256 +#define MAXFILES 1000 /** Restrict to 1000 files per dir **/ + +typedef struct +{ + u64 offset; + unsigned int length; + char flags; + char filename[MAXJOLIET]; + u16 filename_offset; +} FILEENTRIES; + +extern u64 basedir; +extern u64 rootdir; +extern int rootdirlength; + +extern int getpvd (); +extern int parseDVDdirectory (); +extern FILEENTRIES filelist[MAXFILES]; + +#endif diff --git a/source/ngc/gui/iso9660.h.new b/source/ngc/gui/iso9660.h.new deleted file mode 100644 index 026adda..0000000 --- a/source/ngc/gui/iso9660.h.new +++ /dev/null @@ -1,45 +0,0 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * DVD ISO9660/Joliet Parsing - * - * This is not intended as a complete guide to ISO9660. - * Here I use the bare minimum! - ***************************************************************************/ -#include "vfat.h" -#define MAXFILES 1000 /** Restrict to 1000 files per dir **/ -#define MAXJOLIET 256 - -typedef struct -{ - u64 offset; - unsigned int length; - char flags; - char filename[13]; - char displayname[MAX_LONG_NAME]; - u16 filename_offset; -} FILEENTRIES; - -extern u64 basedir; -extern u64 rootdir; -extern int rootdirlength; - -extern int getpvd (); -extern int parsedirectory (); -extern FILEENTRIES filelist[MAXFILES]; diff --git a/source/ngc/gui/iso9660.h.old b/source/ngc/gui/iso9660.h.old deleted file mode 100644 index ae132d6..0000000 --- a/source/ngc/gui/iso9660.h.old +++ /dev/null @@ -1,44 +0,0 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * DVD ISO9660/Joliet Parsing - * - * This is not intended as a complete guide to ISO9660. - * Here I use the bare minimum! - ***************************************************************************/ - -#define MAXJOLIET 256 -#define MAXFILES 1000 /** Restrict to 1000 files per dir **/ - -typedef struct -{ - u64 offset; - unsigned int length; - char flags; - char filename[MAXJOLIET]; - u16 filename_offset; -} FILEENTRIES; - -extern u64 basedir; -extern u64 rootdir; -extern int rootdirlength; - -extern int getpvd (); -extern int parsedirectory (); -extern FILEENTRIES filelist[MAXFILES]; diff --git a/source/ngc/gui/legal.c b/source/ngc/gui/legal.c index e5fde47..fcbc8d7 100644 --- a/source/ngc/gui/legal.c +++ b/source/ngc/gui/legal.c @@ -1,100 +1,100 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - ***************************************************************************/ - -#include "shared.h" -#include "font.h" -#include "dkpro.h" - -extern u32 *xfb[2]; -extern int whichfb; - -/* - * Unpack the devkit pro logo - */ -u32 *dkproraw; - -int dkunpack () -{ - unsigned long res, inbytes, outbytes; - - inbytes = dkpro_COMPRESSED; - outbytes = dkpro_RAW; - dkproraw = malloc (dkpro_RAW + 16); - res = uncompress ((char *) dkproraw, &outbytes, (char *) &dkpro[0], inbytes); - if (res == Z_OK) return 1; - free (dkproraw); - return 0; -} - -/* - * This is the legal stuff - which must be shown at program startup - * Any derivative work MUST include the same textual output. - * - * In other words, play nice and give credit where it's due. - */ -void legal () -{ - int ypos = 64; - - whichfb ^= 1; - VIDEO_ClearFrameBuffer(&TVNtsc480IntDf, xfb[whichfb], COLOR_BLACK); - back_framewidth = 640; - - WriteCentre (ypos, "Genesis Plus Sega Mega Drive Emulator (v1.2a)"); - ypos += fheight; - WriteCentre (ypos, "(C) 1999 - 2003 Charles MacDonald"); - ypos += fheight; - WriteCentre (ypos, "This is free software, and you are welcome to"); - ypos += fheight; - WriteCentre (ypos, "redistribute it under the conditions of the"); - ypos += fheight; - WriteCentre (ypos, "GNU GENERAL PUBLIC LICENSE Version 2"); - ypos += fheight; - WriteCentre (ypos, "Additionally, the developers of this port"); - ypos += fheight; - WriteCentre (ypos, "disclaims all copyright interests in the "); - ypos += fheight; - WriteCentre (ypos, "Nintendo Gamecube Porting code."); - ypos += fheight; - WriteCentre (ypos, "You are free to use it as you wish."); - ypos += 6 * fheight; - - if (dkunpack ()) - { - int w, h, p, dispoffset; - p = 0; - dispoffset = (316 * 320) + ((640 - dkpro_WIDTH) >> 2); - - for (h = 0; h < dkpro_HEIGHT; h++) - { - for (w = 0; w < dkpro_WIDTH >> 1; w++) - xfb[whichfb][dispoffset + w] = dkproraw[p++]; - - dispoffset += 320; - } - - free (dkproraw); - } - else WriteCentre (ypos, "Developed with DevkitPPC and libOGC"); - - WriteCentre (ypos, "Press A to continue"); - SetScreen (); - WaitButtonA (); -} +/**************************************************************************** + * Genesis Plus 1.2a + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ***************************************************************************/ + +#include "shared.h" +#include "font.h" +#include "dkpro.h" + +/* + * Unpack the devkit pro logo + */ +u32 *dkproraw; + +int dkunpack () +{ + unsigned long res, inbytes, outbytes; + + inbytes = dkpro_COMPRESSED; + outbytes = dkpro_RAW; + dkproraw = malloc (dkpro_RAW + 16); + res = uncompress ((Bytef *) dkproraw, &outbytes, (Bytef *) &dkpro[0], inbytes); + if (res == Z_OK) return 1; + free (dkproraw); + return 0; +} + +/* + * This is the legal stuff - which must be shown at program startup + * Any derivative work MUST include the same textual output. + * + * In other words, play nice and give credit where it's due. + */ +void legal () +{ + int ypos = 64; + + whichfb ^= 1; + VIDEO_ClearFrameBuffer(&TVNtsc480IntDf, xfb[whichfb], COLOR_BLACK); + back_framewidth = 640; + + WriteCentre (ypos, "Genesis Plus Sega Mega Drive Emulator (v1.2a)"); + ypos += fheight; + WriteCentre (ypos, "(C) 1999 - 2003 Charles MacDonald"); + ypos += fheight; + WriteCentre (ypos, "This is free software, and you are welcome to"); + ypos += fheight; + WriteCentre (ypos, "redistribute it under the conditions of the"); + ypos += fheight; + WriteCentre (ypos, "GNU GENERAL PUBLIC LICENSE Version 2"); + ypos += fheight; + WriteCentre (ypos, "Additionally, the developers of this port"); + ypos += fheight; + WriteCentre (ypos, "disclaims all copyright interests in the "); + ypos += fheight; + WriteCentre (ypos, "Nintendo Gamecube Porting code."); + ypos += fheight; + WriteCentre (ypos, "You are free to use it as you wish."); + ypos += 6 * fheight; + + if (dkunpack ()) + { + int w, h, p, dispoffset; + p = 0; + dispoffset = (316 * 320) + ((640 - dkpro_WIDTH) >> 2); + + for (h = 0; h < dkpro_HEIGHT; h++) + { + for (w = 0; w < dkpro_WIDTH >> 1; w++) + xfb[whichfb][dispoffset + w] = dkproraw[p++]; + + dispoffset += 320; + } + + free (dkproraw); + } + else WriteCentre (ypos, "Developed with DevkitPPC and libOGC"); +#ifdef HW_RVL + SetScreen (); + sleep(1); +#endif + WriteCentre (ypos, "Press A to continue"); + SetScreen (); + WaitButtonA (); +} diff --git a/source/ngc/gui/mcard.c b/source/ngc/gui/memfile.c similarity index 65% rename from source/ngc/gui/mcard.c rename to source/ngc/gui/memfile.c index 0119f3e..cb7ba34 100644 --- a/source/ngc/gui/mcard.c +++ b/source/ngc/gui/memfile.c @@ -1,588 +1,587 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - ***************************************************************************/ -#include "shared.h" -#include "dvd.h" -#include "font.h" -#include "rominfo.h" -#include "saveicon.h" /*** Nice little icon - thanks brakken! ***/ - -/* Support for MemCards */ -/** - * libOGC System Work Area - */ -static u8 SysArea[CARD_WORKAREA] ATTRIBUTE_ALIGN (32); - -/** - * DMA Transfer Area. - * Must be 32-byte aligned. - * 64k SRAM + 2k Icon - */ -unsigned char savebuffer[0x24000] ATTRIBUTE_ALIGN (32); - -card_dir CardDir; -card_file CardFile; -card_stat CardStatus; -extern int CARDSLOT; -extern int use_SDCARD; - -int ManageSRAM (int direction); -int ManageState (int direction); - -/**************************************************************************** - * SRAM autoload - * - * the detection order is the following: - * MCARD (SLOTA) > MCARD (SLOTB) > SDCARD (SLOTA) > SDCARD (SLOTB) - * - *****************************************************************************/ -extern u8 SILENT; - -void sram_autoload() -{ - int ret = 0; - int i = 0; - int old_cardslot = CARDSLOT; - int old_sdcard = use_SDCARD; - - SILENT = 1; /* this should be transparent to the user */ - while ((i < 4) && (!ret)) - { - use_SDCARD = (i&2) ? 1 : 0; - CARDSLOT = (i&1) ? CARD_SLOTB : CARD_SLOTA; - ret = ManageSRAM(1); - i++; - } - if (!ret) - { - /* restore old settings if not found */ - CARDSLOT = old_cardslot; - use_SDCARD = old_sdcard; - } - SILENT = 0; -} - -/**************************************************************************** - * SDCARD Access functions - * - * We use the same buffer as for Memory Card manager - * Function returns TRUE on success. - *****************************************************************************/ -int SD_ManageFile(char *filename, int direction, int filetype) -{ - char name[1024]; - sd_file *handle; - int len = 0; - int offset = 0; - int filesize; - unsigned long inbytes,outbytes; - - /* build complete SDCARD filename */ - sprintf (name, "dev%d:\\genplus\\saves\\%s", CARDSLOT, filename); - - /* open file */ - handle = direction ? SDCARD_OpenFile (name, "rb") : - SDCARD_OpenFile (name, "wb"); - - if (handle == NULL) - { - sprintf (filename, "Error opening %s", name); - WaitPrompt(filename); - return 0; - } - - switch (direction) - { - case 0: /* SAVING */ - - if (filetype) /* SRAM */ - { - inbytes = 0x10000; - outbytes = 0x12000; - compress2 ((char *) &savebuffer[sizeof(outbytes)], &outbytes, (char *) &sram.sram, inbytes, 9); - memcpy(&savebuffer[0], &outbytes, sizeof(outbytes)); - filesize = outbytes + sizeof(outbytes); - } - else filesize = state_save(&savebuffer[0]); /* STATE */ - - len = SDCARD_WriteFile (handle, savebuffer, filesize); - SDCARD_CloseFile (handle); - - if (len != filesize) - { - sprintf (filename, "Error writing %s", name); - WaitPrompt (filename); - return 0; - } - - if (filetype) sram.crc = crc32 (0, &sram.sram[0], 0x10000); - sprintf (filename, "Saved %d bytes successfully", filesize); - WaitPrompt (filename); - return 1; - - case 1: /* LOADING */ - - while ((len = SDCARD_ReadFile (handle, &savebuffer[offset], 2048)) > 0) offset += len; - if (filetype) /* SRAM */ - { - memcpy(&inbytes,&savebuffer[0],sizeof(inbytes)); - outbytes = 0x10000; - uncompress ((char *) &sram.sram, &outbytes, (char *) &savebuffer[sizeof(inbytes)], inbytes); - sram.crc = crc32 (0, &sram.sram[0], outbytes); - system_reset (); - } - else state_load(&savebuffer[0]); /* STATE */ - SDCARD_CloseFile (handle); - - sprintf (filename, "Loaded %d bytes successfully", offset); - WaitPrompt (filename); - return 1; - } - - return 0; -} - -/**************************************************************************** - * MountTheCard - * - * libOGC provides the CARD_Mount function, and it should be all you need. - * However, experience with previous emulators has taught me that you are - * better off doing a little bit more than that! - * - * Function returns TRUE on success. - *****************************************************************************/ -int MountTheCard () -{ - int tries = 0; - int CardError; - while (tries < 10) - { - *(unsigned long *) (0xcc006800) |= 1 << 13; /*** Disable Encryption ***/ - uselessinquiry (); - VIDEO_WaitVSync (); - CardError = CARD_Mount (CARDSLOT, SysArea, NULL); /*** Don't need or want a callback ***/ - if (CardError == 0) return 1; - else EXI_ProbeReset (); - tries++; - } - return 0; -} - -/**************************************************************************** - * CardFileExists - * - * Wrapper to search through the files on the card. - * Returns TRUE if found. - ****************************************************************************/ -int CardFileExists (char *filename) -{ - int CardError = CARD_FindFirst (CARDSLOT, &CardDir, TRUE); - while (CardError != CARD_ERROR_NOFILE) - { - CardError = CARD_FindNext (&CardDir); - if (strcmp ((char *) CardDir.filename, filename) == 0) return 1; - } - return 0; -} - -/**************************************************************************** - * ManageSRAM - * - * Here is the main SRAM Management stuff. - * The output file contains an icon (2K), 64 bytes comment and the SRAM (64k). - * As memcards are allocated in blocks of 8k or more, you have a around - * 6k bytes to save/load any other data you wish without altering any of the - * main save / load code. - * - * direction == 0 save, 1 load. - ****************************************************************************/ -int ManageSRAM (int direction) -{ - char filename[128]; - char action[80]; - int CardError; - unsigned int SectorSize; - int blocks; - char comment[2][32] = { {"Genesis Plus 1.2a"}, {"SRAM Save"} }; - int outbytes = 0; - int sbo; - int i; - unsigned long inzipped,outzipped; - - if (!genromsize) return 0; - - if (direction) ShowAction ("Loading SRAM ..."); - else ShowAction ("Saving SRAM ..."); - - /* First, build a filename based on the information retrieved for this ROM */ - if (strlen (rominfo.domestic)) strcpy (filename, rominfo.domestic); - else strcpy (filename, rominfo.international); - - /* As these names tend to be bulked with spaces, let's strip them */ - /* Name should be in 16 character blocks, so take first 16 */ - filename[16] = 0; - for (i = strlen (filename) - 1; i > 0; i--) - if (filename[i] != 32) break; - filename[i + 1] = 0; - - /* Now add the 16bit checksum, to ensure it's the same ROM */ - sprintf (filename, "%s%02X.srm", filename, rominfo.checksum); - strcpy (comment[1], filename); - - /* device is SDCARD, let's go */ - if (use_SDCARD) return SD_ManageFile(filename,direction,1); - - /* device is MCARD, we continue */ - if (direction == 0) /*** Saving ***/ - { - /*** Build the output buffer ***/ - memcpy (&savebuffer, &icon, 2048); - memcpy (&savebuffer[2048], &comment[0], 64); - - inzipped = 0x10000; - outzipped = 0x12000; - compress2 ((char *) &savebuffer[2112+sizeof(outzipped)], &outzipped, (char *) &sram.sram, inzipped, 9); - memcpy(&savebuffer[2112], &outzipped, sizeof(outzipped)); - } - - outbytes = 2048 + 64 + outzipped + sizeof(outzipped); - - /*** Initialise the CARD system ***/ - memset (&SysArea, 0, CARD_WORKAREA); - CARD_Init ("GENP", "00"); - - /*** Attempt to mount the card ***/ - CardError = MountTheCard (); - - if (CardError) - { - /*** Retrieve the sector size ***/ - CardError = CARD_GetSectorSize (CARDSLOT, &SectorSize); - - switch (direction) - { - case 0: /*** Saving ***/ - /*** Determine number of blocks on this card ***/ - blocks = (outbytes / SectorSize) * SectorSize; - if (outbytes % SectorSize) blocks += SectorSize; - - /*** Check if a previous save exists ***/ - if (CardFileExists (filename)) - { - CardError = CARD_Open (CARDSLOT, filename, &CardFile); - if (CardError) - { - sprintf (action, "Error Open : %d", CardError); - WaitPrompt (action); - CARD_Unmount (CARDSLOT); - return 0; - } - - int size = CardFile.len; - CARD_Close (&CardFile); - - if (size < blocks) - { - /* new size is bigger: check if there is enough space left */ - CardError = CARD_Create (CARDSLOT, "TEMP", blocks-size, &CardFile); - if (CardError) - { - sprintf (action, "Error Update : %d", CardError); - WaitPrompt (action); - CARD_Unmount (CARDSLOT); - return 0; - } - CARD_Close (&CardFile); - CARD_Delete(CARDSLOT, "TEMP"); - } - - /* always delete existing slot */ - CARD_Delete(CARDSLOT, filename); - } - - /*** Create a new slot ***/ - CardError = CARD_Create (CARDSLOT, filename, blocks, &CardFile); - if (CardError) - { - sprintf (action, "Error create : %d %d", CardError, CARDSLOT); - WaitPrompt (action); - CARD_Unmount (CARDSLOT); - return 0; - } - - /*** Continue and save ***/ - CARD_GetStatus (CARDSLOT, CardFile.filenum, &CardStatus); - CardStatus.icon_addr = 0x0; - CardStatus.icon_fmt = 2; - CardStatus.icon_speed = 1; - CardStatus.comment_addr = 2048; - CARD_SetStatus (CARDSLOT, CardFile.filenum, &CardStatus); - - /*** And write the blocks out ***/ - sbo = 0; - while (outbytes > 0) - { - CardError = CARD_Write (&CardFile, &savebuffer[sbo], SectorSize, sbo); - outbytes -= SectorSize; - sbo += SectorSize; - } - - CARD_Close (&CardFile); - CARD_Unmount (CARDSLOT); - sram.crc = crc32 (0, &sram.sram[0], 0x10000); - sprintf (action, "Saved %d bytes successfully", blocks); - WaitPrompt (action); - return 1; - - default: /*** Loading ***/ - if (!CardFileExists (filename)) - { - WaitPrompt ("No SRAM File Found"); - CARD_Unmount (CARDSLOT); - return 0; - } - - memset (&CardFile, 0, sizeof (CardFile)); - CardError = CARD_Open (CARDSLOT, filename, &CardFile); - if (CardError) - { - sprintf (action, "Error Open : %d", CardError); - WaitPrompt (action); - CARD_Unmount (CARDSLOT); - return 0; - } - - blocks = CardFile.len; - if (blocks < SectorSize) blocks = SectorSize; - if (blocks % SectorSize) blocks++; - - /*** Just read the file back in ***/ - sbo = 0; - int size = blocks; - while (blocks > 0) - { - CARD_Read (&CardFile, &savebuffer[sbo], SectorSize, sbo); - sbo += SectorSize; - blocks -= SectorSize; - } - CARD_Close (&CardFile); - CARD_Unmount (CARDSLOT); - - /* Copy to SRAM */ - memcpy(&inzipped,&savebuffer[2112],sizeof(inzipped)); - outzipped = 0x10000; - uncompress ((char *) &sram.sram, &outzipped, (char *) &savebuffer[2112+sizeof(inzipped)], inzipped); - sram.crc = crc32 (0, &sram.sram[0], 0x10000); - system_reset (); - - /*** Inform user ***/ - sprintf (action, "Loaded %d bytes successfully", size); - WaitPrompt (action); - return 1; - } - } - else WaitPrompt ("Unable to mount memory card"); - return 0; /*** Signal failure ***/ -} - -/**************************************************************************** - * ManageSTATE - * - * Here is the main Freeze File Management stuff. - * The output file contains an icon (2K), 64 bytes comment and the STATE (~128k) - * - * direction == 0 save, 1 load. - ****************************************************************************/ -int ManageState (int direction) -{ - char filename[128]; - char action[80]; - int CardError; - unsigned int SectorSize; - int blocks; - char comment[2][32] = { {"Genesis Plus 1.2a [FRZ]"}, {"Freeze State"} }; - int outbytes; - int sbo; - int i; - int state_size = 0; - - if (!genromsize) return 0; - - if (direction) ShowAction ("Loading State ..."); - else ShowAction ("Saving State ..."); - - /* First, build a filename based on the information retrieved for this ROM */ - if (strlen (rominfo.domestic)) strcpy (filename, rominfo.domestic); - else strcpy (filename, rominfo.international); - - /* As these names tend to be bulked with spaces, let's strip them */ - /* Name should be in 16 character blocks, so take first 16 */ - filename[16] = 0; - for (i = strlen (filename) - 1; i > 0; i--) if (filename[i] != 32) break; - filename[i + 1] = 0; - - /* Now add the 16bit checksum, to ensure it's the same ROM */ - sprintf (filename, "%s%02X.gpz", filename, rominfo.checksum); - strcpy (comment[1], filename); - - /* device is SDCARD, let's go */ - if (use_SDCARD) return SD_ManageFile(filename,direction,0); - - /* device is MCARD, we continue */ - if (direction == 0) /* Saving */ - { - /* Build the output buffer */ - memcpy (&savebuffer, &icon, 2048); - memcpy (&savebuffer[2048], &comment[0], 64); - state_size = state_save(&savebuffer[2112]); - } - - outbytes = 2048 + 64 + state_size; - - /*** Initialise the CARD system ***/ - memset (&SysArea, 0, CARD_WORKAREA); - CARD_Init ("GENP", "00"); - - /*** Attempt to mount the card ***/ - CardError = MountTheCard (); - - if (CardError) - { - /*** Retrieve the sector size ***/ - CardError = CARD_GetSectorSize (CARDSLOT, &SectorSize); - - switch (direction) - { - case 0: /*** Saving ***/ - /*** Determine number of blocks on this card ***/ - blocks = (outbytes / SectorSize) * SectorSize; - if (outbytes % SectorSize) blocks += SectorSize; - - /*** Check if a previous save exists ***/ - if (CardFileExists (filename)) - { - CardError = CARD_Open (CARDSLOT, filename, &CardFile); - if (CardError) - { - sprintf (action, "Error Open : %d", CardError); - WaitPrompt (action); - CARD_Unmount (CARDSLOT); - return 0; - } - - int size = CardFile.len; - CARD_Close (&CardFile); - - if (size < blocks) - { - /* new size is bigger: check if there is enough space left */ - CardError = CARD_Create (CARDSLOT, "TEMP", blocks-size, &CardFile); - if (CardError) - { - sprintf (action, "Error Update : %d", CardError); - WaitPrompt (action); - CARD_Unmount (CARDSLOT); - return 0; - } - CARD_Close (&CardFile); - CARD_Delete(CARDSLOT, "TEMP"); - } - - /* always delete existing slot */ - CARD_Delete(CARDSLOT, filename); - } - - /*** Create a new slot ***/ - CardError = CARD_Create (CARDSLOT, filename, blocks, &CardFile); - if (CardError) - { - sprintf (action, "Error create : %d %d", CardError, CARDSLOT); - WaitPrompt (action); - CARD_Unmount (CARDSLOT); - return 0; - } - - /*** Continue and save ***/ - CARD_GetStatus (CARDSLOT, CardFile.filenum, &CardStatus); - CardStatus.icon_addr = 0x0; - CardStatus.icon_fmt = 2; - CardStatus.icon_speed = 1; - CardStatus.comment_addr = 2048; - CARD_SetStatus (CARDSLOT, CardFile.filenum, &CardStatus); - - /*** And write the blocks out ***/ - sbo = 0; - while (outbytes > 0) - { - CardError = CARD_Write (&CardFile, &savebuffer[sbo], SectorSize, sbo); - outbytes -= SectorSize; - sbo += SectorSize; - } - - CARD_Close (&CardFile); - CARD_Unmount (CARDSLOT); - sprintf (action, "Saved %d bytes successfully", blocks); - WaitPrompt (action); - return 1; - - default: /*** Loading ***/ - if (!CardFileExists (filename)) - { - WaitPrompt ("No Savestate Found"); - CARD_Unmount (CARDSLOT); - return 0; - } - - memset (&CardFile, 0, sizeof (CardFile)); - CardError = CARD_Open (CARDSLOT, filename, &CardFile); - if (CardError) - { - sprintf (action, "Error Open : %d", CardError); - WaitPrompt (action); - CARD_Unmount (CARDSLOT); - return 0; - } - - blocks = CardFile.len; - if (blocks < SectorSize) blocks = SectorSize; - if (blocks % SectorSize) blocks++; - - /*** Just read the file back in ***/ - sbo = 0; - int size = blocks; - while (blocks > 0) - { - CARD_Read (&CardFile, &savebuffer[sbo], SectorSize, sbo); - sbo += SectorSize; - blocks -= SectorSize; - } - CARD_Close (&CardFile); - CARD_Unmount (CARDSLOT); - - state_load(&savebuffer[2112]); - - /*** Inform user ***/ - sprintf (action, "Loaded %d bytes successfully", size); - WaitPrompt (action); - return 1; - } - } - else WaitPrompt ("Unable to mount memory card"); - return 0; /*** Signal failure ***/ -} +/*************************************************************************** + * SDCARD/MEMCARD File support + * + * + ***************************************************************************/ +#include "shared.h" +#include "dvd.h" +#include "font.h" +#include "saveicon.h" /*** Nice little icon - thanks brakken! ***/ + +#include +#include + +/* Support for MemCards */ +/** + * libOGC System Work Area + */ +static u8 SysArea[CARD_WORKAREA] ATTRIBUTE_ALIGN (32); +static card_dir CardDir; +static card_file CardFile; +static card_stat CardStatus; + +/** + * DMA Transfer Area. + * Must be 32-byte aligned. + * 64k SRAM + 2k Icon + */ +static u8 savebuffer[0x26000] ATTRIBUTE_ALIGN (32); + +int ManageSRAM (u8 direction, u8 device); +int ManageState (u8 direction, u8 device); + +/**************************************************************************** + * FILE autoload (SRAM/FreezeState or Config File) + * + * + *****************************************************************************/ +void memfile_autoload() +{ + /* this should be transparent to the user */ + SILENT = 1; + + /* SRAM */ + if (config.sram_auto != -1) + ManageSRAM(1,config.sram_auto); + + /* STATE */ + if (config.freeze_auto != -1) + ManageState(1,config.freeze_auto); + + SILENT = 0; +} + +void memfile_autosave() +{ + int crccheck = crc32 (0, sram.sram, 0x10000); + + /* this should be transparent to the user */ + SILENT = 1; + + /* SRAM */ + if ((config.sram_auto != -1) && (crccheck != sram.crc)) + ManageSRAM(0, config.sram_auto); + + /* STATE */ + if (config.freeze_auto != -1) + ManageState(0,config.freeze_auto); + + SILENT = 0; + return; +} + + +/**************************************************************************** + * SDCARD Access functions + * + * We use the same buffer as for Memory Card manager + * Function returns TRUE on success. + *****************************************************************************/ +static int SD_ManageFile(char *filename, int direction, int filetype) +{ + char pathname[MAXPATHLEN]; + int done = 0; + int filesize; + unsigned long inbytes,outbytes; + + /* first check if directory exist */ + DIR_ITER *dir = diropen("/genplus/saves"); + if (dir == NULL) mkdir("/genplus/saves",S_IRWXU); + else dirclose(dir); + + /* build complete SDCARD filename */ + sprintf (pathname, "/genplus/saves/%s", filename); + + /* open file */ + FILE *fp = fopen(pathname, direction ? "rb" : "wb"); + if (fp == NULL) + { + sprintf (filename, "Error opening %s", pathname); + WaitPrompt(filename); + return 0; + } + + switch (direction) + { + case 0: /* SAVING */ + + if (filetype) /* SRAM */ + { + inbytes = 0x10000; + outbytes = 0x24000; + compress2 ((Bytef *)(savebuffer + 4), &outbytes, (Bytef *)(sram.sram), inbytes, 9); + memcpy(savebuffer, &outbytes, 4); + filesize = outbytes + 4; + sram.crc = crc32 (0, sram.sram, 0x10000); + } + else filesize = state_save(savebuffer); /* STATE */ + + /* write buffer */ + done = fwrite(savebuffer, 1, filesize, fp); + if (done < filesize) + { + sprintf (filename, "Error writing %s", pathname); + WaitPrompt(filename); + return 0; + } + + fclose(fp); + sprintf (filename, "Saved %d bytes successfully", done); + WaitPrompt (filename); + return 1; + + case 1: /* LOADING */ + + /* read size */ + fseek(fp , 0 , SEEK_END); + filesize = ftell (fp); + fseek(fp, 0, SEEK_SET); + + /* read into buffer (32k blocks) */ + done = fread(savebuffer, 1, filesize, fp); + if (done < filesize) + { + sprintf (filename, "Error reading %s", pathname); + WaitPrompt(filename); + return 0; + } + fclose(fp); + + if (filetype) /* SRAM */ + { + memcpy(&inbytes, savebuffer, 4); + outbytes = 0x10000; + uncompress ((Bytef *)(sram.sram), &outbytes, (Bytef *)(savebuffer + 4), inbytes); + sram.crc = crc32 (0, sram.sram, 0x10000); + system_reset (); + } + else state_load(savebuffer); /* STATE */ + + sprintf (filename, "Loaded %d bytes successfully", done); + WaitPrompt (filename); + return 1; + } + + return 0; +} + +/**************************************************************************** + * MountTheCard + * + * libOGC provides the CARD_Mount function, and it should be all you need. + * However, experience with previous emulators has taught me that you are + * better off doing a little bit more than that! + * + * Function returns TRUE on success. + *****************************************************************************/ +int MountTheCard (u8 slot) +{ + int tries = 0; + int CardError; + *(unsigned long *) (0xcc006800) |= 1 << 13; /*** Disable Encryption ***/ +#ifndef HW_RVL + uselessinquiry (); +#endif + while (tries < 10) + { + VIDEO_WaitVSync (); + CardError = CARD_Mount (slot, SysArea, NULL); /*** Don't need or want a callback ***/ + if (CardError == 0) return 1; + else EXI_ProbeReset (); + tries++; + } + return 0; +} + +/**************************************************************************** + * CardFileExists + * + * Wrapper to search through the files on the card. + * Returns TRUE if found. + ****************************************************************************/ +int CardFileExists (char *filename, u8 slot) +{ + int CardError = CARD_FindFirst (slot, &CardDir, TRUE); + while (CardError != CARD_ERROR_NOFILE) + { + CardError = CARD_FindNext (&CardDir); + if (strcmp ((char *) CardDir.filename, filename) == 0) return 1; + } + return 0; +} + +/**************************************************************************** + * ManageSRAM + * + * Here is the main SRAM Management stuff. + * The output file contains an icon (2K), 64 bytes comment and the SRAM (64k). + * As memcards are allocated in blocks of 8k or more, you have a around + * 6k bytes to save/load any other data you wish without altering any of the + * main save / load code. + * + * direction == 0 save, 1 load. + ****************************************************************************/ +int ManageSRAM (u8 direction, u8 device) +{ + char filename[128]; + char action[80]; + int CardError; + unsigned int SectorSize; + int blocks; + char comment[2][32] = { {"Genesis Plus 1.2a"}, {"SRAM Save"} }; + int outbytes = 0; + int sbo; + unsigned long inzipped,outzipped; + + if (!genromsize) return 0; + + /* clean buffer */ + memset(savebuffer, 0, 0x24000); + + if (direction) ShowAction ("Loading SRAM ..."); + else ShowAction ("Saving SRAM ..."); + + /* First, build a filename */ + sprintf (filename, "MD-%04X.srm", realchecksum); + strcpy (comment[1], filename); + + /* device is SDCARD, let's go */ + if (device == 0) return SD_ManageFile(filename,direction,1); + + /* set MCARD slot nr. */ + u8 CARDSLOT = device - 1; + + /* device is MCARD, we continue */ + if (direction == 0) /*** Saving ***/ + { + /*** Build the output buffer ***/ + memcpy (&savebuffer, &icon, 2048); + memcpy (&savebuffer[2048], &comment[0], 64); + + inzipped = 0x10000; + outzipped = 0x12000; + compress2 ((Bytef *) &savebuffer[2112+sizeof(outzipped)], &outzipped, (Bytef *) &sram.sram, inzipped, 9); + memcpy(&savebuffer[2112], &outzipped, sizeof(outzipped)); + } + + outbytes = 2048 + 64 + outzipped + sizeof(outzipped); + + /*** Initialise the CARD system ***/ + memset (&SysArea, 0, CARD_WORKAREA); + CARD_Init ("GENP", "00"); + + /*** Attempt to mount the card ***/ + CardError = MountTheCard (CARDSLOT); + + if (CardError) + { + /*** Retrieve the sector size ***/ + CardError = CARD_GetSectorSize (CARDSLOT, &SectorSize); + + switch (direction) + { + case 0: /*** Saving ***/ + /*** Determine number of blocks on this card ***/ + blocks = (outbytes / SectorSize) * SectorSize; + if (outbytes % SectorSize) blocks += SectorSize; + + /*** Check if a previous save exists ***/ + if (CardFileExists (filename,CARDSLOT)) + { + CardError = CARD_Open (CARDSLOT, filename, &CardFile); + if (CardError) + { + sprintf (action, "Error Open : %d", CardError); + WaitPrompt (action); + CARD_Unmount (CARDSLOT); + return 0; + } + + int size = CardFile.len; + CARD_Close (&CardFile); + + if (size < blocks) + { + /* new size is bigger: check if there is enough space left */ + CardError = CARD_Create (CARDSLOT, "TEMP", blocks-size, &CardFile); + if (CardError) + { + sprintf (action, "Error Update : %d", CardError); + WaitPrompt (action); + CARD_Unmount (CARDSLOT); + return 0; + } + CARD_Close (&CardFile); + CARD_Delete(CARDSLOT, "TEMP"); + } + + /* always delete existing slot */ + CARD_Delete(CARDSLOT, filename); + } + + /*** Create a new slot ***/ + CardError = CARD_Create (CARDSLOT, filename, blocks, &CardFile); + if (CardError) + { + sprintf (action, "Error create : %d %d", CardError, CARDSLOT); + WaitPrompt (action); + CARD_Unmount (CARDSLOT); + return 0; + } + + /*** Continue and save ***/ + CARD_GetStatus (CARDSLOT, CardFile.filenum, &CardStatus); + CardStatus.icon_addr = 0x0; + CardStatus.icon_fmt = 2; + CardStatus.icon_speed = 1; + CardStatus.comment_addr = 2048; + CARD_SetStatus (CARDSLOT, CardFile.filenum, &CardStatus); + + /*** And write the blocks out ***/ + sbo = 0; + while (outbytes > 0) + { + CardError = CARD_Write (&CardFile, &savebuffer[sbo], SectorSize, sbo); + outbytes -= SectorSize; + sbo += SectorSize; + } + + CARD_Close (&CardFile); + CARD_Unmount (CARDSLOT); + sram.crc = crc32 (0, &sram.sram[0], 0x10000); + sprintf (action, "Saved %d bytes successfully", blocks); + WaitPrompt (action); + return 1; + + default: /*** Loading ***/ + if (!CardFileExists (filename,CARDSLOT)) + { + WaitPrompt ("No SRAM File Found"); + CARD_Unmount (CARDSLOT); + return 0; + } + + memset (&CardFile, 0, sizeof (CardFile)); + CardError = CARD_Open (CARDSLOT, filename, &CardFile); + if (CardError) + { + sprintf (action, "Error Open : %d", CardError); + WaitPrompt (action); + CARD_Unmount (CARDSLOT); + return 0; + } + + blocks = CardFile.len; + if (blocks < SectorSize) blocks = SectorSize; + if (blocks % SectorSize) blocks++; + + /*** Just read the file back in ***/ + sbo = 0; + int size = blocks; + while (blocks > 0) + { + CARD_Read (&CardFile, &savebuffer[sbo], SectorSize, sbo); + sbo += SectorSize; + blocks -= SectorSize; + } + CARD_Close (&CardFile); + CARD_Unmount (CARDSLOT); + + /* Copy to SRAM */ + memcpy(&inzipped,&savebuffer[2112],sizeof(inzipped)); + outzipped = 0x10000; + uncompress ((Bytef *) &sram.sram, &outzipped, (Bytef *) &savebuffer[2112+sizeof(inzipped)], inzipped); + sram.crc = crc32 (0, &sram.sram[0], 0x10000); + system_reset (); + + /*** Inform user ***/ + sprintf (action, "Loaded %d bytes successfully", size); + WaitPrompt (action); + return 1; + } + } + else WaitPrompt ("Unable to mount memory card"); + return 0; /*** Signal failure ***/ +} + +/**************************************************************************** + * ManageState + * + * Here is the main Freeze File Management stuff. + * The output file contains an icon (2K), 64 bytes comment and the STATE (~128k) + * + * direction == 0 save, 1 load. + ****************************************************************************/ +int ManageState (u8 direction, u8 device) +{ + char filename[128]; + char action[80]; + int CardError; + unsigned int SectorSize; + int blocks; + char comment[2][32] = { {"Genesis Plus 1.2a [FRZ]"}, {"Freeze State"} }; + int outbytes = 0; + int sbo; + int state_size = 0; + + if (!genromsize) return 0; + + /* clean buffer */ + memset(savebuffer, 0, 0x24000); + + if (direction) ShowAction ("Loading State ..."); + else ShowAction ("Saving State ..."); + + /* First, build a filename */ + sprintf (filename, "MD-%04X.gpz", realchecksum); + strcpy (comment[1], filename); + + /* device is SDCARD, let's go */ + if (device == 0) return SD_ManageFile(filename,direction,0); + + /* set MCARD slot nr. */ + u8 CARDSLOT = device - 1; + + /* device is MCARD, we continue */ + if (direction == 0) /* Saving */ + { + /* Build the output buffer */ + memcpy (&savebuffer, &icon, 2048); + memcpy (&savebuffer[2048], &comment[0], 64); + state_size = state_save(&savebuffer[2112]); + } + + outbytes = 2048 + 64 + state_size; + + /*** Initialise the CARD system ***/ + memset (&SysArea, 0, CARD_WORKAREA); + CARD_Init ("GENP", "00"); + + /*** Attempt to mount the card ***/ + CardError = MountTheCard (CARDSLOT); + + if (CardError) + { + /*** Retrieve the sector size ***/ + CardError = CARD_GetSectorSize (CARDSLOT, &SectorSize); + + switch (direction) + { + case 0: /*** Saving ***/ + /*** Determine number of blocks on this card ***/ + blocks = (outbytes / SectorSize) * SectorSize; + if (outbytes % SectorSize) blocks += SectorSize; + + /*** Check if a previous save exists ***/ + if (CardFileExists (filename, CARDSLOT)) + { + CardError = CARD_Open (CARDSLOT, filename, &CardFile); + if (CardError) + { + sprintf (action, "Error Open : %d", CardError); + WaitPrompt (action); + CARD_Unmount (CARDSLOT); + return 0; + } + + int size = CardFile.len; + CARD_Close (&CardFile); + + if (size < blocks) + { + /* new size is bigger: check if there is enough space left */ + CardError = CARD_Create (CARDSLOT, "TEMP", blocks-size, &CardFile); + if (CardError) + { + sprintf (action, "Error Update : %d", CardError); + WaitPrompt (action); + CARD_Unmount (CARDSLOT); + return 0; + } + CARD_Close (&CardFile); + CARD_Delete(CARDSLOT, "TEMP"); + } + + /* always delete existing slot */ + CARD_Delete(CARDSLOT, filename); + } + + /*** Create a new slot ***/ + CardError = CARD_Create (CARDSLOT, filename, blocks, &CardFile); + if (CardError) + { + sprintf (action, "Error create : %d %d", CardError, CARDSLOT); + WaitPrompt (action); + CARD_Unmount (CARDSLOT); + return 0; + } + + /*** Continue and save ***/ + CARD_GetStatus (CARDSLOT, CardFile.filenum, &CardStatus); + CardStatus.icon_addr = 0x0; + CardStatus.icon_fmt = 2; + CardStatus.icon_speed = 1; + CardStatus.comment_addr = 2048; + CARD_SetStatus (CARDSLOT, CardFile.filenum, &CardStatus); + + /*** And write the blocks out ***/ + sbo = 0; + while (outbytes > 0) + { + CardError = CARD_Write (&CardFile, &savebuffer[sbo], SectorSize, sbo); + outbytes -= SectorSize; + sbo += SectorSize; + } + + CARD_Close (&CardFile); + CARD_Unmount (CARDSLOT); + sprintf (action, "Saved %d bytes successfully", blocks); + WaitPrompt (action); + return 1; + + default: /*** Loading ***/ + if (!CardFileExists (filename, CARDSLOT)) + { + WaitPrompt ("No Savestate Found"); + CARD_Unmount (CARDSLOT); + return 0; + } + + memset (&CardFile, 0, sizeof (CardFile)); + CardError = CARD_Open (CARDSLOT, filename, &CardFile); + if (CardError) + { + sprintf (action, "Error Open : %d", CardError); + WaitPrompt (action); + CARD_Unmount (CARDSLOT); + return 0; + } + + blocks = CardFile.len; + if (blocks < SectorSize) blocks = SectorSize; + if (blocks % SectorSize) blocks++; + + /*** Just read the file back in ***/ + sbo = 0; + int size = blocks; + while (blocks > 0) + { + CARD_Read (&CardFile, &savebuffer[sbo], SectorSize, sbo); + sbo += SectorSize; + blocks -= SectorSize; + } + CARD_Close (&CardFile); + CARD_Unmount (CARDSLOT); + + /*** Load State ***/ + state_load(&savebuffer[2112]); + + /*** Inform user ***/ + sprintf (action, "Loaded %d bytes successfully", size); + WaitPrompt (action); + return 1; + } + } + else WaitPrompt ("Unable to mount memory card"); + return 0; /*** Signal failure ***/ +} diff --git a/source/ngc/gui/menu.c b/source/ngc/gui/menu.c index c0ca9e9..e89e385 100644 --- a/source/ngc/gui/menu.c +++ b/source/ngc/gui/menu.c @@ -1,623 +1,1124 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Nintendo Gamecube Menus - * - * Please put any user menus here! - softdev March 12 2006 - ***************************************************************************/ -#include "shared.h" -#include "dvd.h" -#include "rominfo.h" -#include "font.h" - -#define PSOSDLOADID 0x7c6000a6 - -/*************************************************************************** - * drawmenu - * - * As it says, simply draws the menu with a highlight on the currently - * selected item :) - ***************************************************************************/ -char menutitle[60] = { "" }; -int menu = 0; - -void drawmenu (char items[][20], int maxitems, int selected) -{ - int i; - int ypos; - - ypos = (310 - (fheight * maxitems)) >> 1; - ypos += 130; - - ClearScreen (); - WriteCentre (134, menutitle); - - for (i = 0; i < maxitems; i++) - { - if (i == selected) WriteCentre_HL (i * fheight + ypos, (char *) items[i]); - else WriteCentre (i * fheight + ypos, (char *) items[i]); - } - - SetScreen (); -} - -/**************************************************************************** - * domenu - * - * Returns index into menu array when A is pressed, -1 for B - ****************************************************************************/ -int domenu (char items[][20], int maxitems) -{ - int redraw = 1; - int quit = 0; - short p; - int ret = 0; - signed char a,b; - - while (quit == 0) - { - if (redraw) - { - drawmenu (&items[0], maxitems, menu); - redraw = 0; - } - - p = PAD_ButtonsDown (0); - a = PAD_StickY (0); - b = PAD_StickX (0); - - /*** Look for up ***/ - if ((p & PAD_BUTTON_UP) || (a > 70)) - { - redraw = 1; - menu--; - if (menu < 0) menu = maxitems - 1; - } - - /*** Look for down ***/ - if ((p & PAD_BUTTON_DOWN) || (a < -70)) - { - redraw = 1; - menu++; - if (menu == maxitems) menu = 0; - } - - if ((p & PAD_BUTTON_A) || (b > 40) || (p & PAD_BUTTON_RIGHT)) - { - quit = 1; - ret = menu; - } - - if ((b < -40) || (p & PAD_BUTTON_LEFT)) - { - quit = 1; - ret = 0 - 2 - menu; - } - - if (p & PAD_BUTTON_B) - { - quit = 1; - ret = -1; - } - } - - return ret; -} - -/**************************************************************************** - * Sound Option menu - * - ****************************************************************************/ -double psg_preamp = 3.0; -double fm_preamp = 1.0; -u8 boost = 1; -uint8 clipping = 2; -uint8 hq_fm = 1; -uint8 FM_GENS = 0; -uint8 PSG_MAME = 0; - -void soundmenu () -{ - int ret; - int quit = 0; - int prevmenu = menu; - int count = 7; - char items[7][20]; - - strcpy (menutitle, "Sound Options"); - - sprintf (items[0], "PSG Volume : %1.2f", psg_preamp); - sprintf (items[1], "FM Volume : %1.2f", fm_preamp); - sprintf (items[2], "Volume Boost: %dX", boost); - sprintf (items[3], "HQ YM2612: %s", hq_fm ? "Y" : "N"); - sprintf (items[4], "FM core : %s", FM_GENS ? "GENS" : "MAME"); - sprintf (items[5], "PSG core: %s", PSG_MAME ? "MAME" : "SMSP"); - - strcpy (items[6], "Return to previous"); - - menu = 0; - while (quit == 0) - { - ret = domenu (&items[0], count); - switch (ret) - { - case 0: - case -2: - if (ret<0) psg_preamp -= 0.01; - else psg_preamp += 0.01; - if (psg_preamp < 0.0) psg_preamp = 5.0; - if (psg_preamp > 5.0) psg_preamp = 0.0; - sprintf (items[0], "PSG Volume : %1.2f", psg_preamp); - break; - - case 1: - case -3: - if (ret<0) fm_preamp -= 0.01; - else fm_preamp += 0.01; - if (fm_preamp < 0.0) fm_preamp = 5.0; - if (fm_preamp > 5.0) fm_preamp = 0.0; - sprintf (items[1], "FM Volume : %1.2f", fm_preamp); - break; - - case 2: - boost ++; - if (boost > 4) boost = 0; - sprintf (items[2], "Volume Boost: %dX", boost); - break; - - case 3: - hq_fm ^= 1; - sprintf (items[3], "HQ YM2612: %s", hq_fm ? "Y" : "N"); - if (genromsize) - { audio_init(48000); - fm_restore(); - } - break; - - case 4: - FM_GENS ^= 1; - psg_preamp = PSG_MAME ? (FM_GENS ? 0.85 : 0.50) : (FM_GENS ? 4.0 : 3.0); - fm_preamp = 1.0; - sprintf (items[0], "PSG Volume : %1.2f", psg_preamp); - sprintf (items[1], "FM Volume : %1.2f", fm_preamp); - sprintf (items[4], "FM core : %s", FM_GENS ? "GENS" : "MAME"); - if (genromsize) - { - audio_init(48000); - fm_restore(); - } - break; - - case 5: - PSG_MAME ^= 1; - psg_preamp = PSG_MAME ? (FM_GENS ? 0.85 : 0.50) : (FM_GENS ? 4.0 : 3.0); - fm_preamp = 1.0; - sprintf (items[0], "PSG Volume : %1.2f", psg_preamp); - sprintf (items[1], "FM Volume : %1.2f", fm_preamp); - sprintf (items[5], "PSG core: %s", PSG_MAME ? "MAME" : "SMSP"); - if (genromsize) audio_init(48000); - break; - - case 6: - case -1: - quit = 1; - break; - } - } - menu = prevmenu; -} - -/**************************************************************************** - * Misc Option menu - * - ****************************************************************************/ -extern void reloadrom (); -extern s16 square[]; -extern int oldvwidth, oldvheight; -extern uint8 alttiming; -extern uint8 dmatiming; -extern uint8 vdptiming; - -uint8 autoload = 0; -uint8 region_detect = 0; -uint8 cpu_detect = 0; - -void miscmenu () -{ - int ret; - int quit = 0; - int prevmenu = menu; - int count = 9; - char items[9][20]; - - sprintf (items[0], "Scale X: %02d", square[3]); - sprintf (items[1], "Scale Y: %02d", square[1]); - sprintf (items[2], "Vdp Latency: %s", vdptiming ? "Y" : "N"); - sprintf (items[3], "Dma Timing : %s", dmatiming ? "Y" : "N"); - sprintf (items[4], "Alt Timing : %s", alttiming ? "Y" : "N"); - if (cpu_detect == 0) sprintf (items[5], "Cpu Mode: AUTO"); - else if (cpu_detect == 1) sprintf (items[5], "Cpu Mode: NTSC"); - else if (cpu_detect == 2) sprintf (items[5], "Cpu Mode: PAL"); - if (region_detect == 0) sprintf (items[6], "Region: AUTO"); - else if (region_detect == 1) sprintf (items[6], "Region: USA"); - else if (region_detect == 2) sprintf (items[6], "Region: EUR"); - else if (region_detect == 3) sprintf (items[6], "Region: JAP-NTSC"); - else if (region_detect == 4) sprintf (items[6], "Region: JAP-PAL"); - sprintf (items[7], "SRAM autoload: %s", autoload ? "Y" : "N"); - strcpy (items[8], "Return to previous"); - - menu = 0; - while (quit == 0) - { - strcpy (menutitle, ""); - ret = domenu (&items[0], count); - switch (ret) - { - case 0: /*** Scale X ***/ - case -2: - if (ret<0) square[3] -= 2; - else square[3] += 2; - if (square[3] < 40) square[3] = 80; - if (square[3] > 80) square[3] = 40; - square[6] = square[3]; - square[0] = square[9] = -square[3]; - oldvwidth = -1; - sprintf (items[0], "Scale X: %02d", square[3]); - break; - - case 1: /*** Scale Y ***/ - case -3: - if (ret<0) square[1] -= 2; - else square[1] += 2; - if (square[1] < 30) square[1] = 60; - if (square[1] > 60) square[1] = 30; - square[4] = square[1]; - square[7] = square[10] = -square[1]; - oldvheight = -1; - sprintf (items[1], "Scale Y: %02d", square[1]); - break; - - case 2: /*** VDP access latency ***/ - vdptiming ^= 1; - sprintf (items[2], "Vdp Latency: %s", vdptiming ? "Y" : "N"); - break; - - case 3: /*** DMA timing fix ***/ - dmatiming ^= 1; - sprintf (items[3], "Dma Timing : %s", dmatiming ? "Y" : "N"); - break; - - case 4: /*** Alternate rendering timing ***/ - alttiming ^= 1; - sprintf (items[4], "Alt Timing : %s", alttiming ? "Y" : "N"); - break; - - case 5: /*** Cpu mode : PAL (50hz) or NTSC (60Hz) ***/ - cpu_detect ++; - if (cpu_detect > 2) cpu_detect = 0; - if (cpu_detect == 0) sprintf (items[5], "Cpu Mode: AUTO"); - else if (cpu_detect == 1) sprintf (items[5], "Cpu Mode: NTSC"); - else if (cpu_detect == 2) sprintf (items[5], "Cpu Mode: PAL"); - if (genromsize) reloadrom(); - break; - - case 6: /* region detection */ - region_detect ++; - if (region_detect > 4) region_detect = 0; - if (region_detect == 0) sprintf (items[6], "Region: AUTO"); - else if (region_detect == 1) sprintf (items[6], "Region: USA"); - else if (region_detect == 2) sprintf (items[6], "Region: EUR"); - else if (region_detect == 3) sprintf (items[6], "Region: JAP-NTSC"); - else if (region_detect == 4) sprintf (items[6], "Region: JAP-PAL"); - if (genromsize) reloadrom(); - break; - - case 7: /*** VDP access latency ***/ - autoload ^= 1; - sprintf (items[7], "SRAM autoload: %s", autoload ? "Y" : "N"); - break; - - case 8: - case -1: - quit = 1; - break; - } - } - menu = prevmenu; -} - -/**************************************************************************** - * Main Option menu - * - ****************************************************************************/ -extern void ConfigureJoypads(); -extern void GetGGEntries(); - -void optionmenu () -{ - int ret; - int quit = 0; - int prevmenu = menu; - int count = 5; - char items[5][20] = { - "Misc. Options", - "Sound Options", - "Configure Joypads", - "Game Genie Codes", - "Return to previous" - }; - - menu = 0; - while (quit == 0) - { - strcpy (menutitle, ""); - ret = domenu (&items[0], count); - switch (ret) - { - case 0: - miscmenu(); - break; - case 1: - soundmenu(); - break; - case 2: - ConfigureJoypads(); - break; - case 3: - GetGGEntries(); - break; - case 4: - case -1: - quit = 1; - break; - } - } - menu = prevmenu; -} - -/**************************************************************************** -* Generic Load/Save menu -* -****************************************************************************/ -int CARDSLOT = CARD_SLOTB; -int use_SDCARD = 0; -extern int ManageSRAM (int direction); -extern int ManageState (int direction); - -int loadsavemenu (int which) -{ - int prevmenu = menu; - int quit = 0; - int ret; - int count = 5; - char items[5][20]; - - strcpy (menutitle, ""); - - if (use_SDCARD) sprintf(items[0], "Device: SDCARD"); - else sprintf(items[0], "Device: MCARD"); - - if (CARDSLOT == CARD_SLOTA) sprintf(items[1], "Use: SLOT A"); - else sprintf(items[1], "Use: SLOT B"); - - if (which) - { - sprintf(items[2], "Save State"); - sprintf(items[3], "Load State"); - } - else - { - sprintf(items[2], "Save SRAM"); - sprintf(items[3], "Load SRAM"); - } - sprintf(items[4], "Return to previous"); - - menu = 2; - - while (quit == 0) - { - ret = domenu (&items[0], count); - switch (ret) - { - case -1: - case 4: - quit = 1; - break; - - case 0: - use_SDCARD ^= 1; - if (use_SDCARD) sprintf(items[0], "Device: SDCARD"); - else sprintf(items[0], "Device: MCARD"); - break; - case 1: - CARDSLOT ^= 1; - if (CARDSLOT == CARD_SLOTA) sprintf(items[1], "Use: SLOT A"); - else sprintf(items[1], "Use: SLOT B"); - break; - case 2: - case 3: - if (which) quit = ManageState(ret-2); - else quit = ManageSRAM(ret-2); - if (quit) return 1; - break; - } - } - - menu = prevmenu; - return 0; -} - - -/**************************************************************************** - * File Manager menu - * - ****************************************************************************/ -int filemenu () -{ - int prevmenu = menu; - int ret; - int quit = 0; - uint32 crccheck; - int count = 3; - char items[3][20] = { - {"SRAM Manager"}, - {"STATE Manager"}, - {"Return to previous"} - }; - - crccheck = crc32 (0, &sram.sram[0], 0x10000); - if (genromsize && (crccheck != sram.crc)) strcpy (menutitle, "*** SRAM has been modified ***"); - else strcpy (menutitle, ""); - - menu = 0; - - while (quit == 0) - { - ret = domenu (&items[0], count); - switch (ret) - { - case -1: /*** Button B ***/ - case 2: /*** Quit ***/ - ret = 0; - quit = 1; - break; - case 0: /*** SRAM Manager ***/ - case 1: /*** SaveState Manager ***/ - if (loadsavemenu(ret)) return 1; - break; - } - } - - menu = prevmenu; - return 0; -} - -/**************************************************************************** - * Load Rom menu - * - ****************************************************************************/ -extern void OpenDVD (); -extern int OpenSD (); -extern u8 UseSDCARD; - -void loadmenu () -{ - int prevmenu = menu; - int ret; - int quit = 0; - int count = 3; - char item[3][20] = { - {"Load from DVD"}, - {"Load from SDCARD"}, - {"Return to previous"} - }; - - menu = UseSDCARD ? 1 : 0; - - while (quit == 0) - { - strcpy (menutitle, ""); - ret = domenu (&item[0], count); - switch (ret) - { - case -1: /*** Button B ***/ - case 2: /*** Quit ***/ - quit = 1; - menu = prevmenu; - break; - case 0: /*** Load from DVD ***/ - OpenDVD (); - quit = 1; - break; - case 1: /*** Load from SCDARD ***/ - OpenSD (); - quit = 1; - break; - } - } -} - -/**************************************************************************** - * Main menu - * - ****************************************************************************/ - -void MainMenu () -{ - menu = 0; - int ret; - int quit = 0; - int *psoid = (int *) 0x80001800; - void (*PSOReload) () = (void (*)()) 0x80001800; /*** Stock PSO/SD Reload call ***/ - int count = 8; - char items[8][20] = { - {"Play Game"}, - {"Game Infos"}, - {"Reset Game"}, - {"Load New Game"}, - {"File Management"}, - {"Emulator Options"}, - {"Stop DVD Motor"}, - {"System Reboot"} - }; - - while (quit == 0) - { - strcpy (menutitle, ""); - ret = domenu (&items[0], count); - switch (ret) - { - case -1: /*** Button B ***/ - case 0: /*** Play Game ***/ - quit = 1; - break; - case 1: /*** ROM Information ***/ - showrominfo (); - break; - case 2: /*** Emulator Reset ***/ - system_reset (); - quit = 1; - break; - case 3: /*** Load ROM Menu ***/ - loadmenu(); - menu = 0; - break; - case 4: /*** Memory Manager ***/ - quit = filemenu (); - break; - case 5: /*** Emulator Options */ - optionmenu (); - break; - case 6: /*** Stop DVD Motor ***/ - ShowAction("Stopping DVD Motor ..."); - dvd_motor_off(); - break; - case 7: /*** SD/PSO Reload ***/ - if (psoid[0] == PSOSDLOADID) PSOReload (); - else SYS_ResetSystem(SYS_HOTRESET,0,FALSE); - break; - } - } - - /*** Remove any still held buttons ***/ - while(PAD_ButtonsHeld(0)) VIDEO_WaitVSync(); - - /*** Stop the DVD from causing clicks while playing ***/ - uselessinquiry (); -} +/**************************************************************************** + * Genesis Plus 1.2a + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Nintendo Gamecube Menus + * Please put any user menus here! - softdev March 12 2006 + ***************************************************************************/ + +#include "shared.h" +#include "dvd.h" +#include "font.h" +#include "history.h" + +#ifdef HW_RVL +#include +#endif + +/*************************************************************************** + * drawmenu + * + * As it says, simply draws the menu with a highlight on the currently + * selected item :) + ***************************************************************************/ +char menutitle[60] = { "" }; +int menu = 0; + +void drawmenu (char items[][20], int maxitems, int selected) +{ + int i; + int ypos; + + ypos = (310 - (fheight * maxitems)) >> 1; + ypos += 130; + + ClearScreen (); + WriteCentre (134, menutitle); + + for (i = 0; i < maxitems; i++) + { + if (i == selected) WriteCentre_HL (i * fheight + ypos, (char *) items[i]); + else WriteCentre (i * fheight + ypos, (char *) items[i]); + } + + SetScreen (); +} + +/**************************************************************************** + * domenu + * + * Returns index into menu array when A is pressed, -1 for B + ****************************************************************************/ +int domenu (char items[][20], int maxitems, u8 fastmove) +{ + int redraw = 1; + int quit = 0; + short p; + int ret = 0; + + while (quit == 0) + { + if (redraw) + { + drawmenu (&items[0], maxitems, menu); + redraw = 0; + } + + p = ogc_input__getMenuButtons(); + + if (p & PAD_BUTTON_UP) + { + redraw = 1; + menu--; + if (menu < 0) menu = maxitems - 1; + } + else if (p & PAD_BUTTON_DOWN) + { + redraw = 1; + menu++; + if (menu == maxitems) menu = 0; + } + + if (p & PAD_BUTTON_A) + { + quit = 1; + ret = menu; + } + else if (p & PAD_BUTTON_B) + { + quit = 1; + ret = -1; + } + + if (fastmove) + { + if (p & PAD_BUTTON_RIGHT) + { + quit = 1; + ret = menu; + } + else if (p & PAD_BUTTON_LEFT) + { + quit = 1; + ret = 0 - 2 - menu; + } + } + } + + return ret; +} + +/**************************************************************************** + * Sound Option menu + * + ****************************************************************************/ +extern struct ym2612__ YM2612; +void soundmenu () +{ + int ret; + int quit = 0; + int prevmenu = menu; + int count = 6; + char items[6][20]; + + strcpy (menutitle, "Press B to return"); + + menu = 0; + while (quit == 0) + { + sprintf (items[0], "PSG Volume: %1.2f", config.psg_preamp); + sprintf (items[1], "FM Volume: %1.2f", config.fm_preamp); + sprintf (items[2], "Volume Boost: %dX", config.boost); + sprintf (items[3], "HQ YM2612: %s", config.hq_fm ? "Y" : "N"); + sprintf (items[4], "SSG-EG: %s", config.ssg_enabled ? "ON" : "OFF"); + sprintf (items[5], "FM core: %s", config.fm_core ? "GENS" : "MAME"); + + ret = domenu (&items[0], count, 1); + switch (ret) + { + case 0: + case -2: + if (ret<0) config.psg_preamp -= 0.01; + else config.psg_preamp += 0.01; + if (config.psg_preamp < 0.0) config.psg_preamp = 5.0; + if (config.psg_preamp > 5.0) config.psg_preamp = 0.0; + break; + + case 1: + case -3: + if (ret<0) config.fm_preamp -= 0.01; + else config.fm_preamp += 0.01; + if (config.fm_preamp < 0.0) config.fm_preamp = 5.0; + if (config.fm_preamp > 5.0) config.fm_preamp = 0.0; + break; + + case 2: + config.boost ++; + if (config.boost > 4) config.boost = 0; + break; + + case 3: + config.hq_fm ^= 1; + if (genromsize) + { + audio_init(48000); + fm_restore(); + } + break; + + case 4: + config.ssg_enabled ^= 1; + break; + + case 5: + config.fm_core ^= 1; + config.psg_preamp = config.fm_core ? 2.5 : 1.5; + config.fm_preamp = 1.0; + if (genromsize) + { + if (!config.fm_core) memcpy(fm_reg,YM2612.REG,sizeof(fm_reg)); + audio_init(48000); + fm_restore(); + } + break; + + case -1: + quit = 1; + break; + } + } + menu = prevmenu; +} + +/**************************************************************************** + * Misc Option menu + * + ****************************************************************************/ +void miscmenu () +{ + int ret; + int quit = 0; + int prevmenu = menu; + int count = 6; + char items[6][20]; + strcpy (menutitle, "Press B to return"); + menu = 0; + + while (quit == 0) + { + if (config.region_detect == 0) sprintf (items[0], "Region: AUTO"); + else if (config.region_detect == 1) sprintf (items[0], "Region: USA"); + else if (config.region_detect == 2) sprintf (items[0], "Region: EUR"); + else if (config.region_detect == 3) sprintf (items[0], "Region: JAP"); + sprintf (items[1], "Force DTACK: %s", config.force_dtack ? "Y" : "N"); + if (config.bios_enabled & 1) sprintf (items[2], "Use BIOS: ON"); + else sprintf (items[2], "Use BIOS: OFF"); + sprintf (items[3], "SVP Cycles: %d", SVP_cycles); + if (config.sram_auto == 0) sprintf (items[4], "Auto SRAM: SDCARD"); + else if (config.sram_auto == 1) sprintf (items[4], "Auto SRAM: MCARD A"); + else if (config.sram_auto == 2) sprintf (items[4], "Auto SRAM: MCARD B"); + else sprintf (items[4], "Auto SRAM: OFF"); + if (config.freeze_auto == 0) sprintf (items[5], "Auto FREEZE: SDCARD"); + else if (config.freeze_auto == 1) sprintf (items[5], "Auto FREEZE: MCARD A"); + else if (config.freeze_auto == 2) sprintf (items[5], "Auto FREEZE: MCARD B"); + else sprintf (items[5], "Auto FREEZE: OFF"); + + ret = domenu (&items[0], count, 1); + switch (ret) + { + case 0: /*** Region Force ***/ + config.region_detect = (config.region_detect + 1) % 4; + if (genromsize) + { + /* force region & cpu mode */ + set_region(); + + /* reinitialize timings */ + system_init (); + audio_init(48000); + fm_restore(); + + /* reinitialize HVC tables */ + vctab = (vdp_pal) ? ((reg[1] & 8) ? vc_pal_240 : vc_pal_224) : vc_ntsc_224; + hctab = (reg[12] & 1) ? cycle2hc40 : cycle2hc32; + + /* reinitialize overscan area */ + bitmap.viewport.x = config.overscan ? ((reg[12] & 1) ? 16 : 12) : 0; + bitmap.viewport.y = config.overscan ? (((reg[1] & 8) ? 0 : 8) + (vdp_pal ? 24 : 0)) : 0; + bitmap.viewport.changed = 1; + } + break; + + case 1: /*** force DTACK ***/ + config.force_dtack ^= 1; + break; + + case 2: /*** BIOS support ***/ + config.bios_enabled ^= 1; + system_reset (); + break; + + case 3: /*** SVP emulation ***/ + case -5: + if (ret<0) SVP_cycles = SVP_cycles ? (SVP_cycles-1) : 1500; + else SVP_cycles++; + if (SVP_cycles > 1500) SVP_cycles = 0; + break; + + case 4: /*** SRAM autoload/autosave ***/ + config.sram_auto ++; + if (config.sram_auto > 2) config.sram_auto = -1; + break; + + case 5: /*** FreezeState autoload/autosave ***/ + config.freeze_auto ++; + if (config.freeze_auto > 2) config.freeze_auto = -1; + break; + + case -1: + quit = 1; + break; + } + } + + menu = prevmenu; +} + +/**************************************************************************** + * Display Option menu + * + ****************************************************************************/ +uint8 old_overscan = 1; + +void dispmenu () +{ + int ret; + int quit = 0; + int prevmenu = menu; + int count = config.aspect ? 6 : 8; + char items[8][20]; + + strcpy (menutitle, "Press B to return"); + menu = 0; + + while (quit == 0) + { + sprintf (items[0], "Aspect: %s", config.aspect ? "ORIGINAL" : "STRETCH"); + if (config.render == 1) sprintf (items[1], "Render: BILINEAR"); + else if (config.render == 2) sprintf (items[1], "Render: PROGRESS"); + else sprintf (items[1], "Render: ORIGINAL"); + if (config.tv_mode == 0) sprintf (items[2], "TV Mode: 60HZ"); + else if (config.tv_mode == 1) sprintf (items[2], "TV Mode: 50HZ"); + else sprintf (items[2], "TV Mode: 50/60HZ"); + sprintf (items[3], "Borders: %s", config.overscan ? " ON" : "OFF"); + sprintf (items[4], "Center X: %s%02d", config.xshift < 0 ? "-":"+", abs(config.xshift)); + sprintf (items[5], "Center Y: %s%02d", config.yshift < 0 ? "-":"+", abs(config.yshift)); + sprintf (items[6], "Scale X: %s%02d", config.xscale < 0 ? "-":"+", abs(config.xscale)); + sprintf (items[7], "Scale Y: %s%02d", config.yscale < 0 ? "-":"+", abs(config.yscale)); + + ret = domenu (&items[0], count, 1); + + switch (ret) + { + case 0: /*** config.aspect ratio ***/ + config.aspect ^= 1; + count = config.aspect ? 6 : 8; + bitmap.viewport.changed = 1; + break; + + case 1: /*** rendering ***/ + config.render = (config.render + 1) % 3; + if (config.render == 2) + { + if (VIDEO_HaveComponentCable()) + { + /* progressive mode (60hz only) */ + config.tv_mode = 0; + gc_pal = 0; + } + else + { + /* do nothing if component cable is not detected */ + config.render = 0; + } + } + bitmap.viewport.changed = 1; + break; + + case 2: /*** tv mode ***/ + if (config.render == 2) break; /* 60hz progressive only */ + config.tv_mode = (config.tv_mode + 1) % 3; + break; + + case 3: /*** overscan emulation ***/ + config.overscan ^= 1; + bitmap.viewport.x = config.overscan ? ((reg[12] & 1) ? 16 : 12) : 0; + bitmap.viewport.y = config.overscan ? (((reg[1] & 8) ? 0 : 8) + (vdp_pal ? 24 : 0)) : 0; + bitmap.viewport.changed = 1; + break; + + case 4: /*** Center X ***/ + case -6: + if (ret<0) config.xshift --; + else config.xshift ++; + break; + + case 5: /*** Center Y ***/ + case -7: + if (ret<0) config.yshift --; + else config.yshift ++; + break; + + case 6: /*** Scale X ***/ + case -8: + if (ret<0) config.xscale --; + else config.xscale ++; + break; + + case 7: /*** Scale Y ***/ + case -9: + if (ret<0) config.yscale --; + else config.yscale ++; + break; + + case -1: + quit = 1; + break; + } + } + menu = prevmenu; +} + +/**************************************************************************** + * ConfigureJoypads + ****************************************************************************/ +void ConfigureJoypads () +{ + int ret, max_players; + int i = 0; + int quit = 0; + int prevmenu = menu; + char padmenu[7][20]; + + int player = 0; +#ifdef HW_RVL + u32 exp; +#endif + + strcpy (menutitle, "Press B to return"); + + menu = 0; + while (quit == 0) + { + /* update max players */ + max_players = 0; + if (input.system[0] == SYSTEM_GAMEPAD) + { + sprintf (padmenu[0], "Port 1: GAMEPAD"); + max_players ++; + } + else if (input.system[0] == SYSTEM_WAYPLAY) + { + sprintf (padmenu[0], "Port 1: 4-WAYPLAY"); + max_players += 4; + } + else if (input.system[0] == SYSTEM_TEAMPLAYER) + { + sprintf (padmenu[0], "Port 1: TEAMPLAYER"); + max_players += 4; + } + else + sprintf (padmenu[0], "Port 1: NONE"); + + if (input.system[1] == SYSTEM_GAMEPAD) + { + sprintf (padmenu[1], "Port 2: GAMEPAD"); + max_players ++; + } + else if (input.system[1] == SYSTEM_WAYPLAY) + { + sprintf (padmenu[1], "Port 2: 4-WAYPLAY"); + } + else if (input.system[1] == SYSTEM_TEAMPLAYER) + { + sprintf (padmenu[1], "Port 2: TEAMPLAYER"); + max_players += 4; + } + else if (input.system[1] == SYSTEM_MENACER) + { + sprintf (padmenu[1], "Port 2: MENACER"); + max_players += 1; + } + else if (input.system[1] == SYSTEM_JUSTIFIER) + { + sprintf (padmenu[1], "Port 2: JUSTIFIERS"); + max_players += 1; + } + else + sprintf (padmenu[1], "Port 2: NONE"); + + /* JCART special case */ + if (j_cart) max_players +=2; + + /* reset current player nr */ + if (player >= max_players) + { + /* remove duplicate assigned inputs */ + if ((0!=player) && (config.input[0].device == config.input[player].device) && (config.input[0].port == config.input[player].port)) + { + config.input[0].device = -1; + config.input[0].port = i%4; + } + player = 0; + } + + sprintf (padmenu[2], "Gun Cursor: %s", config.crosshair ? " ON":"OFF"); + sprintf (padmenu[3], "Set Player: %d%s", player + 1, (j_cart && (player > 1)) ? "-JCART" : ""); + + if (config.input[player].device == 0) + sprintf (padmenu[4], "Device: GAMECUBE %d", config.input[player].port + 1); +#ifdef HW_RVL + else if (config.input[player].device == 1) + sprintf (padmenu[4], "Device: WIIMOTE %d", config.input[player].port + 1); + else if (config.input[player].device == 2) + sprintf (padmenu[4], "Device: NUNCHUK %d", config.input[player].port + 1); + else if (config.input[player].device == 3) + sprintf (padmenu[4], "Device: CLASSIC %d", config.input[player].port + 1); +#endif + else + sprintf (padmenu[4], "Device: NONE"); + + /* when using wiimote, force to 3Buttons pad */ + if (config.input[player].device == 1) input.padtype[player] = DEVICE_3BUTTON; + sprintf (padmenu[5], "%s", (input.padtype[player] == DEVICE_3BUTTON) ? "Type: 3BUTTONS":"Type: 6BUTTONS"); + + sprintf (padmenu[6], "Configure Input"); + + ret = domenu (&padmenu[0], 7,0); + + switch (ret) + { + case 0: + if (j_cart) + { + WaitPrompt("JCART detected !"); + break; + } + input.system[0] ++; + if (input.system[0] == SYSTEM_MENACER) input.system[0] ++; + if (input.system[0] == SYSTEM_JUSTIFIER) input.system[0] ++; + + if (input.system[0] == SYSTEM_WAYPLAY) input.system[1] = SYSTEM_WAYPLAY; + if (input.system[0] > SYSTEM_WAYPLAY) + { + input.system[0] = NO_SYSTEM; + input.system[1] = SYSTEM_GAMEPAD; + } + break; + + case 1: + if (j_cart) + { + WaitPrompt("JCART detected !"); + break; + } + input.system[1] ++; + if (input.system[1] == SYSTEM_WAYPLAY) input.system[0] = SYSTEM_WAYPLAY; + if (input.system[1] > SYSTEM_WAYPLAY) + { + input.system[1] = NO_SYSTEM; + input.system[0] = SYSTEM_GAMEPAD; + } + break; + + case 2: + config.crosshair ^= 1; + break; + + case 3: + /* remove duplicate assigned inputs */ + for (i=0; i<8; i++) + { + if ((i!=player) && (config.input[i].device == config.input[player].device) && (config.input[i].port == config.input[player].port)) + { + config.input[i].device = -1; + config.input[i].port = i%4; + } + } + player = (player + 1) % max_players; + break; + + case 4: +#ifdef HW_RVL + if (config.input[player].device == 1) + { + config.input[player].port ++; + } + else + { + config.input[player].device ++; + if (config.input[player].device == 1) config.input[player].port = 0; + } + + if (config.input[player].device == 1) + { + exp = 4; + if (config.input[player].port<4) + { + WPAD_Probe(config.input[player].port,&exp); + if ((exp == WPAD_EXP_NONE) && (config.input[player].port == (player % 4))) exp = WPAD_EXP_CLASSIC; + } + + while ((config.input[player].port<4) && (exp != WPAD_EXP_CLASSIC)) + { + config.input[player].port ++; + if (config.input[player].port<4) + { + exp = 4; + WPAD_Probe(config.input[player].port,&exp); + if ((exp == WPAD_EXP_NONE) && (config.input[player].port == (player % 4))) exp = WPAD_EXP_CLASSIC; + } + } + + if (config.input[player].port >= 4) + { + config.input[player].port = player % 4; + config.input[player].device = 2; + } + } + + if (config.input[player].device == 2) + { + exp = 4; + WPAD_Probe(config.input[player].port,&exp); + if (exp != WPAD_EXP_NUNCHUK) config.input[player].device ++; + } + + if (config.input[player].device == 3) + { + exp = 4; + WPAD_Probe(config.input[player].port,&exp); + if (exp != WPAD_EXP_CLASSIC) config.input[player].device ++; + } + + if (config.input[player].device > 3) + { + config.input[player].device = 0; + } +#else + config.input[player].device ++; + if (config.input[player].device > 3) + { + config.input[player].device = 0; + } +#endif + break; + + case 5: + if (config.input[player].device == 1) break; + input.padtype[player] ^= 1; + break; + + case 6: + ogc_input__config(config.input[player].port, config.input[player].device, input.padtype[player]); + break; + + case -1: + /* remove duplicate assigned inputs */ + for (i=0; i<8; i++) + { + if ((i!=player) && (config.input[i].device == config.input[player].device) && (config.input[i].port == config.input[player].port)) + { + config.input[i].device = -1; + config.input[i].port = i%4; + } + } + quit = 1; + break; + } + } + + menu = prevmenu; + io_reset(); +} + +/**************************************************************************** + * Main Option menu + * + ****************************************************************************/ +void optionmenu () +{ + int ret; + int quit = 0; + int prevmenu = menu; + int count = 5; + char items[5][20] = + { + "Video Options", + "Sound Options", + "System Options", + "Controls Options", + "Game Genie Codes" + }; + + menu = 0; + while (quit == 0) + { + strcpy (menutitle, "Press B to return"); + ret = domenu (&items[0], count, 0); + switch (ret) + { + case 0: + dispmenu(); + break; + case 1: + soundmenu(); + break; + case 2: + miscmenu(); + break; + case 3: + ConfigureJoypads(); + break; + case 4: + GetGGEntries(); + break; + case -1: + quit = 1; + break; + } + } + + config_save(); + menu = prevmenu; +} + +/**************************************************************************** +* Generic Load/Save menu +* +****************************************************************************/ +static u8 device = 0; + +int loadsavemenu (int which) +{ + int prevmenu = menu; + int quit = 0; + int ret; + int count = 3; + char items[3][20]; + + strcpy (menutitle, "Press B to return"); + + menu = 2; + + if (which == 1) + { + sprintf(items[1], "Save State"); + sprintf(items[2], "Load State"); + } + else + { + sprintf(items[1], "Save SRAM"); + sprintf(items[2], "Load SRAM"); + } + + while (quit == 0) + { + if (device == 0) sprintf(items[0], "Device: SDCARD"); + else if (device == 1) sprintf(items[0], "Device: MCARD A"); + else if (device == 2) sprintf(items[0], "Device: MCARD B"); + + ret = domenu (&items[0], count, 0); + switch (ret) + { + case -1: + quit = 1; + break; + + case 0: + device = (device + 1)%3; + break; + + case 1: + case 2: + if (which == 1) quit = ManageState(ret-1,device); + else if (which == 0) quit = ManageSRAM(ret-1,device); + if (quit) return 1; + break; + } + } + + menu = prevmenu; + return 0; +} + + +/**************************************************************************** + * File Manager menu + * + ****************************************************************************/ +int filemenu () +{ + int prevmenu = menu; + int ret; + int quit = 0; + int count = 2; + char items[2][20] = { + {"SRAM Manager"}, + {"STATE Manager"} + }; + + menu = 0; + + while (quit == 0) + { + strcpy (menutitle, "Press B to return"); + ret = domenu (&items[0], count, 0); + switch (ret) + { + case -1: /*** Button B ***/ + ret = 0; + quit = 1; + break; + case 0: /*** SRAM Manager ***/ + case 1: /*** SaveState Manager ***/ + if (loadsavemenu(ret)) return 1; + break; + } + } + + menu = prevmenu; + return 0; +} + + +/**************************************************************************** + * Load Rom menu + * + ****************************************************************************/ +static u8 load_menu = 0; + +void loadmenu () +{ + int ret; + int quit = 0; + int count = 3; + char item[3][20] = { + {"Load Recent"}, + {"Load from SDCARD"}, + {"Load from DVD"} + }; + + menu = load_menu; + + while (quit == 0) + { + strcpy (menutitle, "Press B to return"); + ret = domenu (&item[0], count, 0); + switch (ret) + { + case -1: /*** Button B ***/ + quit = 1; + break; + + case 0: /*** Load Recent ***/ + OpenHistory(); + quit = 1; + break; + + case 1: /*** Load from SCDARD ***/ + OpenSD(); + quit = 1; + break; + + case 2: /*** Load from DVD ***/ +#ifndef HW_RVL + OpenDVD(); + quit = 1; +#elif WII_DVD + OpenDVD(); + quit = 1; +#else + WaitPrompt("Not implemented... yet ;)"); +#endif + break; + } + } + + load_menu = menu; +} + +/*************************************************************************** + * Show rom info screen + ***************************************************************************/ +void showrominfo () +{ + int ypos; + u8 i,j,quit,redraw,max; + char msg[128]; + short p; + char pName[14][21]; + + quit = 0; + j = 0; + redraw = 1; + + /*** Remove any still held buttons ***/ + while (PAD_ButtonsHeld(0)) PAD_ScanPads(); +#ifdef HW_RVL + while (WPAD_ButtonsHeld(0)) WPAD_ScanPads(); +#endif + + max = 14; + for (i = 0; i < 14; i++) + { + if (peripherals & (1 << i)) + { + sprintf(pName[max-14],"%s", peripheralinfo[i].pName); + max ++; + } + } + + while (quit == 0) + { + if (redraw) + { + ClearScreen (); + + ypos = 134; + WriteCentre(ypos, "ROM Header Information"); + ypos += 2*fheight; + + for (i=0; i<8; i++) + { + switch (i+j) + { + case 0: + sprintf (msg, "Console type: %s", rominfo.consoletype); + break; + case 1: + sprintf (msg, "Copyright: %s", rominfo.copyright); + break; + case 2: + sprintf (msg, "Company: %s", companyinfo[getcompany ()].company); + break; + case 3: + sprintf (msg, "Game Domestic Name:"); + break; + case 4: + sprintf(msg, " %s",rominfo.domestic); + break; + case 5: + sprintf (msg, "Game International Name:"); + break; + case 6: + sprintf(msg, " %s",rominfo.international); + break; + case 7: + sprintf (msg, "Type - %s : %s", rominfo.ROMType, strcmp (rominfo.ROMType, "AI") ? "Game" : "Educational"); + break; + case 8: + sprintf (msg, "Product - %s", rominfo.product); + break; + case 9: + sprintf (msg, "Checksum - %04x (%04x) (%s)", rominfo.checksum, realchecksum, (rominfo.checksum == realchecksum) ? "Good" : "Bad"); + break; + case 10: + sprintf (msg, "ROM end: $%06X", rominfo.romend); + break; + case 11: + if (svp) sprintf (msg, "SVP Chip detected"); + else if (sram.custom) sprintf (msg, "EEPROM(%dK) - $%06X", ((eeprom.type.size_mask+1)* 8) /1024, (unsigned int)sram.start); + else if (sram.detected) sprintf (msg, "SRAM Start - $%06X", sram.start); + else sprintf (msg, "External RAM undetected"); + + break; + case 12: + if (sram.custom) sprintf (msg, "EEPROM(%dK) - $%06X", ((eeprom.type.size_mask+1)* 8) /1024, (unsigned int)sram.end); + else if (sram.detected) sprintf (msg, "SRAM End - $%06X", sram.end); + else if (sram.on) sprintf (msg, "Default SRAM activated "); + else sprintf (msg, "SRAM is disactivated "); + break; + case 13: + if (region_code == REGION_USA) sprintf (msg, "Region - %s (USA)", rominfo.country); + else if (region_code == REGION_EUROPE) sprintf (msg, "Region - %s (EUR)", rominfo.country); + else if (region_code == REGION_JAPAN_NTSC) sprintf (msg, "Region - %s (JAP)", rominfo.country); + else if (region_code == REGION_JAPAN_PAL) sprintf (msg, "Region - %s (JPAL)", rominfo.country); + break; + default: + sprintf (msg, "Supports - %s", pName[i+j-14]); + break; + } + + write_font (100, ypos, msg); + ypos += fheight; + } + + ypos += fheight; + WriteCentre (ypos, "Press A to Continue"); + SetScreen (); + } + + p = ogc_input__getMenuButtons(); + redraw = 0; + + if ((j<(max-8)) && (p & PAD_BUTTON_DOWN)) {redraw = 1; j++;} + if ((j>0) && (p & PAD_BUTTON_UP)) {redraw = 1; j--;} + if (p & PAD_BUTTON_A) quit = 1; + if (p & PAD_BUTTON_B) quit = 1; + } +} + +/**************************************************************************** + * Main Menu + * + ****************************************************************************/ +void MainMenu () +{ + menu = 0; + int ret; + int quit = 0; + uint32 crccheck; + +#ifdef HW_RVL + int count = 8; + char items[8][20] = +#else + int count = 9; + char items[9][20] = +#endif + { + {"Play Game"}, + {"Game Infos"}, + {"Hard Reset"}, + {"Load New Game"}, + {"File Management"}, + {"Emulator Options"}, +#ifdef HW_RVL + {"Return to Loader"}, + {"System Menu"} +#else + {"Stop DVD Motor"}, + {"SD/PSO Reload"}, + {"System Reboot"} +#endif + }; + + /* Switch to menu default rendering mode (60hz or 50hz, but always 480 lines) */ + VIDEO_Configure (vmode); + VIDEO_ClearFrameBuffer(vmode, xfb[whichfb], COLOR_BLACK); + VIDEO_Flush(); + VIDEO_WaitVSync(); + VIDEO_WaitVSync(); + + while (quit == 0) + { + crccheck = crc32 (0, &sram.sram[0], 0x10000); + if (genromsize && (crccheck != sram.crc)) strcpy (menutitle, "*** SRAM has been modified ***"); + else sprintf(menutitle, "%d FPS", FramesPerSecond); + + ret = domenu (&items[0], count, 0); + switch (ret) + { + case -1: /*** Button B ***/ + case 0: /*** Play Game ***/ + if (genromsize) + { + quit = 1; + } + break; + + case 1: /*** ROM Information ***/ + showrominfo (); + break; + + case 2: /*** Emulator Reset ***/ + if (genromsize || (config.bios_enabled == 3)) + { + system_init (); + audio_init(48000); + system_reset (); + quit = 1; + } + break; + + case 3: /*** Load ROM Menu ***/ + loadmenu(); + menu = 0; + break; + + case 4: /*** Memory Manager ***/ + quit = filemenu (); + break; + + case 5: /*** Emulator Options */ + optionmenu (); + break; + +#ifdef HW_RVL + case 6: /*** TP Reload ***/ + memfile_autosave(); + VIDEO_ClearFrameBuffer(vmode, xfb[whichfb], COLOR_BLACK); + VIDEO_Flush(); + VIDEO_WaitVSync(); + exit(0); + break; + + case 7: /*** Return to Wii System Menu ***/ + memfile_autosave(); + VIDEO_ClearFrameBuffer(vmode, xfb[whichfb], COLOR_BLACK); + VIDEO_Flush(); + VIDEO_WaitVSync(); + SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); + break; +#else + case 6: /*** Stop DVD Motor ***/ + ShowAction("Stopping DVD Motor ..."); + dvd_motor_off(); + break; + + case 7: /*** SD/PSO Reload ***/ + memfile_autosave(); + VIDEO_ClearFrameBuffer(vmode, xfb[whichfb], COLOR_BLACK); + VIDEO_Flush(); + VIDEO_WaitVSync(); + exit(0); + break; + + case 8: /*** Reboot Gamecube ***/ + memfile_autosave(); + SYS_ResetSystem(SYS_HOTRESET,0,0); + break; +#endif + } + } + + /*** Remove any still held buttons ***/ + while (PAD_ButtonsHeld(0)) PAD_ScanPads(); +#ifdef HW_RVL + while (WPAD_ButtonsHeld(0)) WPAD_ScanPads(); +#endif + + /*** Reinitialize GX ***/ + ogc_video__reset(); + +#ifndef HW_RVL + /*** Stop the DVD from causing clicks while playing ***/ + uselessinquiry (); +#endif +} diff --git a/source/ngc/gui/saveicon.h b/source/ngc/gui/saveicon.h index edf898d..a0ae754 100644 --- a/source/ngc/gui/saveicon.h +++ b/source/ngc/gui/saveicon.h @@ -1,136 +1,136 @@ -/*********************************************************** - * Genesis Plus Save Icon - * Made by Brakken (http://www.tehskeen.com) - * - ************************************************************/ -unsigned short icon[1024] = { - - 0xFFFF, 0xFFFF, 0xFBDE, 0xFBDE, 0xFBDE, 0xFBDE, 0xFBDE, 0xEB5A, - 0xFBDE, 0xFBDE, 0xFBDE, 0xBDCD, 0xFBDE, 0xF7BD, 0xF7BD, 0xAD49, - 0xEB59, 0xB9AD, 0xC1EF, 0xC1EF, 0x9062, 0x8000, 0x8C41, 0x8C41, - 0x8000, 0x9CE6, 0xA0E6, 0xA507, 0x8400, 0x9CC5, 0xA0E6, 0xA0E6, - 0xC1EF, 0xC1EF, 0xC1EF, 0xC1EF, 0x8000, 0x8000, 0x8000, 0x8000, - 0x9083, 0x8C63, 0x8C63, 0x9484, 0x8C63, 0x9083, 0x9484, 0x94A4, - 0xC1EF, 0xC20F, 0xC20F, 0xBDCE, 0x8000, 0x8000, 0x8000, 0x8000, - 0x9083, 0x8821, 0x8842, 0x8842, 0x8842, 0xA107, 0xB58C, 0xAD6B, - 0xA529, 0x94A4, 0x9083, 0x94A4, 0x8000, 0x8000, 0x8400, 0x8400, - 0x8842, 0x8842, 0x8842, 0x8821, 0xB18B, 0xA949, 0xA108, 0xA107, - 0xA528, 0xB9AD, 0xC630, 0xCE51, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8821, 0x8821, 0x8821, 0x8400, 0xA108, 0xA529, 0xA108, 0xA529, - 0xCA30, 0xC630, 0xCA30, 0xFBDE, 0x8000, 0x8000, 0x8000, 0xAD27, - 0x8400, 0x9083, 0x8863, 0x8400, 0x9CE6, 0x8842, 0x8C63, 0x8C20, - 0xFBDE, 0xFBDE, 0xFFFF, 0xFFFF, 0xFBDE, 0xFBDE, 0xFBDE, 0xFBDE, - 0xDA92, 0xFBDE, 0xFBDE, 0xFBDE, 0xC1AB, 0xF7BD, 0xFBDE, 0xFBDE, - 0xF7BD, 0xF7BD, 0xF7BD, 0xA0E6, 0xF7BD, 0xF7BD, 0xF39C, 0x9484, - 0xF39C, 0xF39C, 0xDEF7, 0x8C41, 0xF39C, 0xEF7B, 0xD272, 0x8400, - 0x8C42, 0x9CE6, 0xA507, 0xA0E6, 0x8C63, 0x9CC5, 0xA107, 0x9CE6, - 0x9484, 0x98A5, 0x9CE6, 0x98C5, 0x9CC5, 0x98C5, 0xA0E7, 0x98C5, - 0x8C42, 0x9083, 0x94A5, 0x9083, 0x8C42, 0x9083, 0x9084, 0x8C62, - 0x8C62, 0x9083, 0x9084, 0x8C62, 0x8C63, 0x9083, 0x94A4, 0x8C63, - 0x8842, 0x9CC6, 0xA107, 0xA0E7, 0x8842, 0x8842, 0xA108, 0xA54A, - 0x8842, 0x8C63, 0xB5AD, 0xB5AD, 0x8C63, 0x8C62, 0x8842, 0x8C63, - 0x98C5, 0xA528, 0xB5AC, 0xB5AC, 0xA52A, 0xBDEF, 0xC631, 0xCA52, - 0xB9CE, 0xB9CE, 0xA94A, 0xAD6B, 0x8C63, 0x8821, 0x8821, 0x8821, - 0xA529, 0x98C5, 0x98C5, 0xA0E6, 0xC210, 0xA529, 0xA529, 0xA529, - 0xB5AD, 0xB5CD, 0xB5AD, 0xBDEF, 0x8400, 0x8821, 0x8C62, 0x8821, - 0xA0E7, 0x8842, 0x8842, 0x8C41, 0x9083, 0x8842, 0x8842, 0x8842, - 0x94A5, 0x8842, 0x8C62, 0x8C62, 0x8C42, 0x9083, 0x8C62, 0x8C62, - 0xB548, 0xF7BD, 0xF7BD, 0xF7BD, 0xA4C4, 0xF7BD, 0xF7BD, 0xF7BD, - 0x9461, 0xDED5, 0xF39C, 0xF39C, 0x8C20, 0xD271, 0xF39C, 0xF39C, - 0xEF7B, 0xEF7B, 0xC610, 0x8400, 0xEF7B, 0xEB5A, 0xB9AC, 0x8000, - 0xEB5A, 0xEB5A, 0xA528, 0x9CC5, 0xE739, 0xE739, 0x9CC6, 0x98A5, - 0x98C5, 0x98C5, 0xA0E6, 0x94A4, 0x94A4, 0x98C5, 0x94A5, 0x9484, - 0xA528, 0x98C5, 0x9CE6, 0xA0E7, 0x9CE6, 0xA4E6, 0x98A4, 0xA507, - 0x8C62, 0x9083, 0x9484, 0x9083, 0x94A4, 0x94A5, 0x98C5, 0x98C5, - 0xA107, 0xA107, 0xA107, 0xB18B, 0xA907, 0x9062, 0x9484, 0x9CE6, - 0x8842, 0x94A4, 0x9484, 0x9084, 0x8C62, 0x8C63, 0x9CC5, 0x9CC5, - 0x98C6, 0x8C63, 0x9484, 0xA0E6, 0x9CE6, 0x9084, 0x94A4, 0x90A5, - 0x8C63, 0x8C42, 0x8C62, 0x8C62, 0x8C63, 0xA108, 0xA94A, 0xA528, - 0x94A5, 0x8884, 0x8884, 0x8884, 0xB0A5, 0xBC84, 0xA483, 0xA484, - 0x8C63, 0x8C42, 0x8C63, 0x9083, 0xA94A, 0x9083, 0x8C62, 0x94A4, - 0x8884, 0x8063, 0x90A5, 0x94A4, 0xA483, 0xBC63, 0xA884, 0x8884, - 0x9083, 0x8C63, 0x8C42, 0x8C63, 0x9084, 0x8842, 0x9083, 0x9084, - 0x8C42, 0x8C62, 0x98C6, 0xAD6A, 0x9083, 0x8C63, 0x98C5, 0xA107, - 0x8400, 0xC1ED, 0xEF7B, 0xEF7B, 0x8400, 0xAD27, 0xEF7B, 0xEF7B, - 0x9CE6, 0x9CA4, 0xEB5A, 0xEB5A, 0x9CE6, 0x9062, 0xDAB4, 0xE739, - 0xE739, 0xE318, 0x9483, 0x8C63, 0xE318, 0xCE72, 0x9062, 0x9CC5, - 0xDEF7, 0xC20F, 0x8C41, 0x9CE6, 0xDAD6, 0xB9AC, 0x8C20, 0x9CC5, - 0xA0E6, 0xA528, 0x9CC5, 0xA528, 0xA508, 0x94A5, 0x98C6, 0xA108, - 0x9CE6, 0x9CC5, 0xA0E7, 0xA94A, 0xA0E6, 0xA0E7, 0xA507, 0xAD6B, - 0xA107, 0x98C6, 0x9CE6, 0x9083, 0x98C6, 0xA108, 0xA107, 0x98C5, - 0xB9CD, 0xB18B, 0xA107, 0x9CC6, 0xC210, 0xB9CE, 0xA528, 0x9CC6, - 0x98C5, 0x94A5, 0x9084, 0x8884, 0x9CC6, 0x9CE6, 0x9CC6, 0x94A5, - 0x9CE6, 0x9CE6, 0x9CE7, 0xA108, 0x98C5, 0x98C5, 0x98C6, 0x98C6, - 0xB0C6, 0xD0C6, 0xD0C6, 0xD0C6, 0x90A4, 0x90A4, 0x98A5, 0x9CA4, - 0x9CE6, 0x90A4, 0x9084, 0x9084, 0x98C6, 0x98C6, 0x98C6, 0x98C6, - 0xD0A5, 0xD0A5, 0xA484, 0x8483, 0x9484, 0x9083, 0x8C83, 0x9084, - 0x90A5, 0x94A5, 0x9CE6, 0x9CE6, 0x98C6, 0x98C6, 0x9CE6, 0x98C6, - 0x8C63, 0x9084, 0x9484, 0x9083, 0x98C5, 0x98C5, 0x94A4, 0x94A5, - 0x98C6, 0x98C6, 0x98C5, 0x98C5, 0x98C6, 0x98C6, 0x98C6, 0x98C6, - 0x9084, 0x8821, 0xCE51, 0xE739, 0x94A5, 0x8C20, 0xBDCE, 0xE318, - 0x98C5, 0x8821, 0xB18B, 0xE318, 0x98C6, 0x8842, 0xAD49, 0xDEF7, - 0xDAD6, 0xAD49, 0x8C41, 0xA508, 0xD6B5, 0xBDCC, 0x8C20, 0x8C41, - 0xD6B5, 0xD294, 0xB98A, 0xAD06, 0xD294, 0xCE73, 0xCE73, 0xCA52, - 0xA94A, 0xB5AD, 0xB18C, 0xAD6B, 0x9062, 0x9062, 0x9062, 0x9062, - 0xAD27, 0xAD06, 0xAD06, 0xAD06, 0xCA52, 0xC631, 0xC631, 0xC210, - 0xA94B, 0xB18C, 0xB58D, 0xAD6B, 0x9062, 0x9484, 0x98A4, 0x98A4, - 0xA906, 0xA906, 0xA506, 0xA907, 0xC210, 0xC210, 0xB9F0, 0xBDEF, - 0xA94B, 0xA94B, 0xA94B, 0xA94B, 0x98A5, 0x98A5, 0x98A4, 0x98A4, - 0xA907, 0xA907, 0xA907, 0xA506, 0xBDEF, 0xBDEF, 0xBDEF, 0xB1F2, - 0xA94B, 0xA94A, 0xA54A, 0xA529, 0x9484, 0x9484, 0x9483, 0x9483, - 0xA4E6, 0xA4E6, 0xA4E6, 0xA4E6, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, - 0xA529, 0xA529, 0xA529, 0xA108, 0x9062, 0x8C63, 0x9062, 0x9062, - 0xA4E6, 0x9CE6, 0xA0E6, 0xA506, 0xBDEF, 0xC210, 0xC210, 0xC210, - 0xA108, 0x9CE7, 0x9CE7, 0x98C6, 0x8C41, 0x8C42, 0x8C41, 0x8C41, - 0xA507, 0xA508, 0xAD27, 0xB127, 0xC631, 0xC631, 0xCA52, 0xCA52, - 0x98C6, 0x8C63, 0xA0E6, 0xDAD6, 0x8C41, 0x8400, 0xB548, 0xDAD6, - 0xB127, 0xB548, 0xD6B5, 0xD6B5, 0xCE73, 0xCE73, 0xD294, 0xD6B5, - 0xD294, 0xCA74, 0xBA56, 0xB635, 0x9A3B, 0x81FF, 0x81FF, 0x81FF, - 0x81FF, 0x8A1F, 0xA27F, 0xA27F, 0x81FF, 0xA27F, 0xFFFF, 0xFFFF, - 0xB635, 0xB214, 0xB214, 0xBE11, 0x81FF, 0x81FF, 0x81FF, 0x81FF, - 0xA27F, 0xA27F, 0xA27F, 0x8A1F, 0xFFFF, 0xFFFF, 0xFFFF, 0xDF7F, - 0xA1F7, 0x91FA, 0x81FF, 0x95F9, 0x81FF, 0x81FF, 0x8A1F, 0x81FF, - 0x81FF, 0xD75F, 0xBEFF, 0x81FF, 0x81FF, 0xFFFF, 0xBEFF, 0x81FF, - 0xB9CE, 0xB9CE, 0x8DFC, 0x81FF, 0xA9D2, 0xA9D2, 0x81FF, 0x9A5F, - 0x99D6, 0x99D6, 0x81FF, 0xBEFF, 0x99D6, 0x99D6, 0x81FF, 0xBEFF, - 0x85FD, 0x95F9, 0xB5CF, 0xB1F1, 0x81FF, 0x81FF, 0x95F9, 0x81FF, - 0xEFBF, 0x81FF, 0x85FD, 0x81FF, 0xFFFF, 0x81FF, 0x81FF, 0x81FF, - 0xA5F5, 0xA5F5, 0xB5F2, 0xB214, 0x81FF, 0x81FF, 0x81FF, 0x81FF, - 0xB2BF, 0xB2BF, 0x81FF, 0x9A5F, 0xDF7F, 0xDF7F, 0x81FF, 0xE79F, - 0xA218, 0xA218, 0xA218, 0xA639, 0x81FF, 0x81FF, 0x81FF, 0x81FF, - 0xBEFF, 0xBEFF, 0xBEFF, 0xBEFF, 0xF7DF, 0xDF7F, 0xDF7F, 0xDF7F, - 0xA639, 0xB657, 0xCA75, 0xD294, 0x81FF, 0x81FF, 0x861E, 0xCA95, - 0xBEFF, 0xAA9F, 0x81FF, 0xB658, 0xD75F, 0x8A1F, 0x81FF, 0xCA75, - 0x81FF, 0xA27F, 0xFFFF, 0xA27F, 0x81FF, 0xA27F, 0xFFFF, 0xFFFF, - 0x81FF, 0xA27F, 0xFFFF, 0xBADF, 0x81FF, 0xA27F, 0xFFFF, 0xA27F, - 0x81FF, 0x81FF, 0xCF3F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBADF, - 0xA27F, 0xA27F, 0xA27F, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x81FF, - 0x923F, 0xFFFF, 0xBEFF, 0x81FF, 0x81FF, 0xFFFF, 0xBEFF, 0x81FF, - 0x81FF, 0xFFFF, 0xCF3F, 0xA27F, 0x81FF, 0xFFFF, 0xFFFF, 0xFFFF, - 0x99D6, 0x99D6, 0x81FF, 0xBEFF, 0x81FF, 0x81FF, 0x81FF, 0xBEFF, - 0xA27F, 0xA27F, 0x9A5F, 0xBADF, 0xFFFF, 0xFFFF, 0xA27F, 0x81FF, - 0xFFFF, 0x81FF, 0x81FF, 0x81FF, 0xFFFF, 0x81FF, 0x81FF, 0x81FF, - 0xFFFF, 0xBEFF, 0xBEFF, 0xBEFF, 0xC71F, 0xDF7F, 0xDF7F, 0xDF7F, - 0xDF7F, 0xDF7F, 0x923F, 0xF7DF, 0xDF7F, 0xDF7F, 0x81FF, 0xAA9F, - 0xEFBF, 0xC71F, 0x81FF, 0x9A5F, 0xCF3F, 0x81FF, 0x8A1F, 0xD75F, - 0xE79F, 0xBEFF, 0xBEFF, 0xBEFF, 0xDF7F, 0xDF7F, 0xDF7F, 0xDF7F, - 0xBEFF, 0xBEFF, 0xBEFF, 0xC71F, 0xDF7F, 0xDF7F, 0xDF7F, 0xDF7F, - 0xBEFF, 0x81FF, 0x81FF, 0xB657, 0xFFFF, 0xC71F, 0x81FF, 0xA23A, - 0xFFFF, 0xC71F, 0x81FF, 0xA23A, 0xD75F, 0x8A1F, 0x81FF, 0xB658, - 0x81FF, 0x9A5F, 0xAA9F, 0x81FF, 0x921D, 0x81FF, 0x81FF, 0x85FE, - 0xD294, 0xBE55, 0xB657, 0xC653, 0xD294, 0xD294, 0xCE73, 0xCA52, - 0x8A1D, 0xB214, 0xB214, 0x8DFC, 0xBA34, 0xC631, 0xC210, 0xB612, - 0xC631, 0xC631, 0xC631, 0xC210, 0xCA52, 0xCA52, 0xC631, 0xC631, - 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x8DFC, 0x81FF, 0x81FF, 0x81FF, - 0xC210, 0xBE10, 0xBDEF, 0xBDEF, 0xC210, 0xC210, 0xC210, 0xBE10, - 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x8DFB, 0xA5D4, - 0xBDEF, 0xB9CE, 0xB9CE, 0xB9CE, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, - 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x99F8, 0x8DFB, 0x8DFB, 0x8DFB, - 0xB9CE, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, 0xBE10, 0xC210, - 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x95F9, 0xA5F5, 0xA1F7, 0x91FA, - 0xBDEF, 0xBE10, 0xC210, 0xC210, 0xC210, 0xC210, 0xC631, 0xC631, - 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x921C, 0x921C, 0x921C, 0x921C, - 0xC631, 0xC631, 0xCA52, 0xCA52, 0xC631, 0xCA52, 0xCA52, 0xCE73, - 0x81FF, 0x81FF, 0x9A3B, 0xD294, 0x961B, 0xAA39, 0xD294, 0xD294, - 0xCE73, 0xCE73, 0xD294, 0xD6B5, 0xCE73, 0xD294, 0xD6B5, 0xD6B5, -}; +/*********************************************************** + * Genesis Plus Save Icon + * Made by Brakken (http://www.tehskeen.com) + * + ************************************************************/ +unsigned short icon[1024] = { + + 0xFFFF, 0xFFFF, 0xFBDE, 0xFBDE, 0xFBDE, 0xFBDE, 0xFBDE, 0xEB5A, + 0xFBDE, 0xFBDE, 0xFBDE, 0xBDCD, 0xFBDE, 0xF7BD, 0xF7BD, 0xAD49, + 0xEB59, 0xB9AD, 0xC1EF, 0xC1EF, 0x9062, 0x8000, 0x8C41, 0x8C41, + 0x8000, 0x9CE6, 0xA0E6, 0xA507, 0x8400, 0x9CC5, 0xA0E6, 0xA0E6, + 0xC1EF, 0xC1EF, 0xC1EF, 0xC1EF, 0x8000, 0x8000, 0x8000, 0x8000, + 0x9083, 0x8C63, 0x8C63, 0x9484, 0x8C63, 0x9083, 0x9484, 0x94A4, + 0xC1EF, 0xC20F, 0xC20F, 0xBDCE, 0x8000, 0x8000, 0x8000, 0x8000, + 0x9083, 0x8821, 0x8842, 0x8842, 0x8842, 0xA107, 0xB58C, 0xAD6B, + 0xA529, 0x94A4, 0x9083, 0x94A4, 0x8000, 0x8000, 0x8400, 0x8400, + 0x8842, 0x8842, 0x8842, 0x8821, 0xB18B, 0xA949, 0xA108, 0xA107, + 0xA528, 0xB9AD, 0xC630, 0xCE51, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8821, 0x8821, 0x8821, 0x8400, 0xA108, 0xA529, 0xA108, 0xA529, + 0xCA30, 0xC630, 0xCA30, 0xFBDE, 0x8000, 0x8000, 0x8000, 0xAD27, + 0x8400, 0x9083, 0x8863, 0x8400, 0x9CE6, 0x8842, 0x8C63, 0x8C20, + 0xFBDE, 0xFBDE, 0xFFFF, 0xFFFF, 0xFBDE, 0xFBDE, 0xFBDE, 0xFBDE, + 0xDA92, 0xFBDE, 0xFBDE, 0xFBDE, 0xC1AB, 0xF7BD, 0xFBDE, 0xFBDE, + 0xF7BD, 0xF7BD, 0xF7BD, 0xA0E6, 0xF7BD, 0xF7BD, 0xF39C, 0x9484, + 0xF39C, 0xF39C, 0xDEF7, 0x8C41, 0xF39C, 0xEF7B, 0xD272, 0x8400, + 0x8C42, 0x9CE6, 0xA507, 0xA0E6, 0x8C63, 0x9CC5, 0xA107, 0x9CE6, + 0x9484, 0x98A5, 0x9CE6, 0x98C5, 0x9CC5, 0x98C5, 0xA0E7, 0x98C5, + 0x8C42, 0x9083, 0x94A5, 0x9083, 0x8C42, 0x9083, 0x9084, 0x8C62, + 0x8C62, 0x9083, 0x9084, 0x8C62, 0x8C63, 0x9083, 0x94A4, 0x8C63, + 0x8842, 0x9CC6, 0xA107, 0xA0E7, 0x8842, 0x8842, 0xA108, 0xA54A, + 0x8842, 0x8C63, 0xB5AD, 0xB5AD, 0x8C63, 0x8C62, 0x8842, 0x8C63, + 0x98C5, 0xA528, 0xB5AC, 0xB5AC, 0xA52A, 0xBDEF, 0xC631, 0xCA52, + 0xB9CE, 0xB9CE, 0xA94A, 0xAD6B, 0x8C63, 0x8821, 0x8821, 0x8821, + 0xA529, 0x98C5, 0x98C5, 0xA0E6, 0xC210, 0xA529, 0xA529, 0xA529, + 0xB5AD, 0xB5CD, 0xB5AD, 0xBDEF, 0x8400, 0x8821, 0x8C62, 0x8821, + 0xA0E7, 0x8842, 0x8842, 0x8C41, 0x9083, 0x8842, 0x8842, 0x8842, + 0x94A5, 0x8842, 0x8C62, 0x8C62, 0x8C42, 0x9083, 0x8C62, 0x8C62, + 0xB548, 0xF7BD, 0xF7BD, 0xF7BD, 0xA4C4, 0xF7BD, 0xF7BD, 0xF7BD, + 0x9461, 0xDED5, 0xF39C, 0xF39C, 0x8C20, 0xD271, 0xF39C, 0xF39C, + 0xEF7B, 0xEF7B, 0xC610, 0x8400, 0xEF7B, 0xEB5A, 0xB9AC, 0x8000, + 0xEB5A, 0xEB5A, 0xA528, 0x9CC5, 0xE739, 0xE739, 0x9CC6, 0x98A5, + 0x98C5, 0x98C5, 0xA0E6, 0x94A4, 0x94A4, 0x98C5, 0x94A5, 0x9484, + 0xA528, 0x98C5, 0x9CE6, 0xA0E7, 0x9CE6, 0xA4E6, 0x98A4, 0xA507, + 0x8C62, 0x9083, 0x9484, 0x9083, 0x94A4, 0x94A5, 0x98C5, 0x98C5, + 0xA107, 0xA107, 0xA107, 0xB18B, 0xA907, 0x9062, 0x9484, 0x9CE6, + 0x8842, 0x94A4, 0x9484, 0x9084, 0x8C62, 0x8C63, 0x9CC5, 0x9CC5, + 0x98C6, 0x8C63, 0x9484, 0xA0E6, 0x9CE6, 0x9084, 0x94A4, 0x90A5, + 0x8C63, 0x8C42, 0x8C62, 0x8C62, 0x8C63, 0xA108, 0xA94A, 0xA528, + 0x94A5, 0x8884, 0x8884, 0x8884, 0xB0A5, 0xBC84, 0xA483, 0xA484, + 0x8C63, 0x8C42, 0x8C63, 0x9083, 0xA94A, 0x9083, 0x8C62, 0x94A4, + 0x8884, 0x8063, 0x90A5, 0x94A4, 0xA483, 0xBC63, 0xA884, 0x8884, + 0x9083, 0x8C63, 0x8C42, 0x8C63, 0x9084, 0x8842, 0x9083, 0x9084, + 0x8C42, 0x8C62, 0x98C6, 0xAD6A, 0x9083, 0x8C63, 0x98C5, 0xA107, + 0x8400, 0xC1ED, 0xEF7B, 0xEF7B, 0x8400, 0xAD27, 0xEF7B, 0xEF7B, + 0x9CE6, 0x9CA4, 0xEB5A, 0xEB5A, 0x9CE6, 0x9062, 0xDAB4, 0xE739, + 0xE739, 0xE318, 0x9483, 0x8C63, 0xE318, 0xCE72, 0x9062, 0x9CC5, + 0xDEF7, 0xC20F, 0x8C41, 0x9CE6, 0xDAD6, 0xB9AC, 0x8C20, 0x9CC5, + 0xA0E6, 0xA528, 0x9CC5, 0xA528, 0xA508, 0x94A5, 0x98C6, 0xA108, + 0x9CE6, 0x9CC5, 0xA0E7, 0xA94A, 0xA0E6, 0xA0E7, 0xA507, 0xAD6B, + 0xA107, 0x98C6, 0x9CE6, 0x9083, 0x98C6, 0xA108, 0xA107, 0x98C5, + 0xB9CD, 0xB18B, 0xA107, 0x9CC6, 0xC210, 0xB9CE, 0xA528, 0x9CC6, + 0x98C5, 0x94A5, 0x9084, 0x8884, 0x9CC6, 0x9CE6, 0x9CC6, 0x94A5, + 0x9CE6, 0x9CE6, 0x9CE7, 0xA108, 0x98C5, 0x98C5, 0x98C6, 0x98C6, + 0xB0C6, 0xD0C6, 0xD0C6, 0xD0C6, 0x90A4, 0x90A4, 0x98A5, 0x9CA4, + 0x9CE6, 0x90A4, 0x9084, 0x9084, 0x98C6, 0x98C6, 0x98C6, 0x98C6, + 0xD0A5, 0xD0A5, 0xA484, 0x8483, 0x9484, 0x9083, 0x8C83, 0x9084, + 0x90A5, 0x94A5, 0x9CE6, 0x9CE6, 0x98C6, 0x98C6, 0x9CE6, 0x98C6, + 0x8C63, 0x9084, 0x9484, 0x9083, 0x98C5, 0x98C5, 0x94A4, 0x94A5, + 0x98C6, 0x98C6, 0x98C5, 0x98C5, 0x98C6, 0x98C6, 0x98C6, 0x98C6, + 0x9084, 0x8821, 0xCE51, 0xE739, 0x94A5, 0x8C20, 0xBDCE, 0xE318, + 0x98C5, 0x8821, 0xB18B, 0xE318, 0x98C6, 0x8842, 0xAD49, 0xDEF7, + 0xDAD6, 0xAD49, 0x8C41, 0xA508, 0xD6B5, 0xBDCC, 0x8C20, 0x8C41, + 0xD6B5, 0xD294, 0xB98A, 0xAD06, 0xD294, 0xCE73, 0xCE73, 0xCA52, + 0xA94A, 0xB5AD, 0xB18C, 0xAD6B, 0x9062, 0x9062, 0x9062, 0x9062, + 0xAD27, 0xAD06, 0xAD06, 0xAD06, 0xCA52, 0xC631, 0xC631, 0xC210, + 0xA94B, 0xB18C, 0xB58D, 0xAD6B, 0x9062, 0x9484, 0x98A4, 0x98A4, + 0xA906, 0xA906, 0xA506, 0xA907, 0xC210, 0xC210, 0xB9F0, 0xBDEF, + 0xA94B, 0xA94B, 0xA94B, 0xA94B, 0x98A5, 0x98A5, 0x98A4, 0x98A4, + 0xA907, 0xA907, 0xA907, 0xA506, 0xBDEF, 0xBDEF, 0xBDEF, 0xB1F2, + 0xA94B, 0xA94A, 0xA54A, 0xA529, 0x9484, 0x9484, 0x9483, 0x9483, + 0xA4E6, 0xA4E6, 0xA4E6, 0xA4E6, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, + 0xA529, 0xA529, 0xA529, 0xA108, 0x9062, 0x8C63, 0x9062, 0x9062, + 0xA4E6, 0x9CE6, 0xA0E6, 0xA506, 0xBDEF, 0xC210, 0xC210, 0xC210, + 0xA108, 0x9CE7, 0x9CE7, 0x98C6, 0x8C41, 0x8C42, 0x8C41, 0x8C41, + 0xA507, 0xA508, 0xAD27, 0xB127, 0xC631, 0xC631, 0xCA52, 0xCA52, + 0x98C6, 0x8C63, 0xA0E6, 0xDAD6, 0x8C41, 0x8400, 0xB548, 0xDAD6, + 0xB127, 0xB548, 0xD6B5, 0xD6B5, 0xCE73, 0xCE73, 0xD294, 0xD6B5, + 0xD294, 0xCA74, 0xBA56, 0xB635, 0x9A3B, 0x81FF, 0x81FF, 0x81FF, + 0x81FF, 0x8A1F, 0xA27F, 0xA27F, 0x81FF, 0xA27F, 0xFFFF, 0xFFFF, + 0xB635, 0xB214, 0xB214, 0xBE11, 0x81FF, 0x81FF, 0x81FF, 0x81FF, + 0xA27F, 0xA27F, 0xA27F, 0x8A1F, 0xFFFF, 0xFFFF, 0xFFFF, 0xDF7F, + 0xA1F7, 0x91FA, 0x81FF, 0x95F9, 0x81FF, 0x81FF, 0x8A1F, 0x81FF, + 0x81FF, 0xD75F, 0xBEFF, 0x81FF, 0x81FF, 0xFFFF, 0xBEFF, 0x81FF, + 0xB9CE, 0xB9CE, 0x8DFC, 0x81FF, 0xA9D2, 0xA9D2, 0x81FF, 0x9A5F, + 0x99D6, 0x99D6, 0x81FF, 0xBEFF, 0x99D6, 0x99D6, 0x81FF, 0xBEFF, + 0x85FD, 0x95F9, 0xB5CF, 0xB1F1, 0x81FF, 0x81FF, 0x95F9, 0x81FF, + 0xEFBF, 0x81FF, 0x85FD, 0x81FF, 0xFFFF, 0x81FF, 0x81FF, 0x81FF, + 0xA5F5, 0xA5F5, 0xB5F2, 0xB214, 0x81FF, 0x81FF, 0x81FF, 0x81FF, + 0xB2BF, 0xB2BF, 0x81FF, 0x9A5F, 0xDF7F, 0xDF7F, 0x81FF, 0xE79F, + 0xA218, 0xA218, 0xA218, 0xA639, 0x81FF, 0x81FF, 0x81FF, 0x81FF, + 0xBEFF, 0xBEFF, 0xBEFF, 0xBEFF, 0xF7DF, 0xDF7F, 0xDF7F, 0xDF7F, + 0xA639, 0xB657, 0xCA75, 0xD294, 0x81FF, 0x81FF, 0x861E, 0xCA95, + 0xBEFF, 0xAA9F, 0x81FF, 0xB658, 0xD75F, 0x8A1F, 0x81FF, 0xCA75, + 0x81FF, 0xA27F, 0xFFFF, 0xA27F, 0x81FF, 0xA27F, 0xFFFF, 0xFFFF, + 0x81FF, 0xA27F, 0xFFFF, 0xBADF, 0x81FF, 0xA27F, 0xFFFF, 0xA27F, + 0x81FF, 0x81FF, 0xCF3F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBADF, + 0xA27F, 0xA27F, 0xA27F, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x81FF, + 0x923F, 0xFFFF, 0xBEFF, 0x81FF, 0x81FF, 0xFFFF, 0xBEFF, 0x81FF, + 0x81FF, 0xFFFF, 0xCF3F, 0xA27F, 0x81FF, 0xFFFF, 0xFFFF, 0xFFFF, + 0x99D6, 0x99D6, 0x81FF, 0xBEFF, 0x81FF, 0x81FF, 0x81FF, 0xBEFF, + 0xA27F, 0xA27F, 0x9A5F, 0xBADF, 0xFFFF, 0xFFFF, 0xA27F, 0x81FF, + 0xFFFF, 0x81FF, 0x81FF, 0x81FF, 0xFFFF, 0x81FF, 0x81FF, 0x81FF, + 0xFFFF, 0xBEFF, 0xBEFF, 0xBEFF, 0xC71F, 0xDF7F, 0xDF7F, 0xDF7F, + 0xDF7F, 0xDF7F, 0x923F, 0xF7DF, 0xDF7F, 0xDF7F, 0x81FF, 0xAA9F, + 0xEFBF, 0xC71F, 0x81FF, 0x9A5F, 0xCF3F, 0x81FF, 0x8A1F, 0xD75F, + 0xE79F, 0xBEFF, 0xBEFF, 0xBEFF, 0xDF7F, 0xDF7F, 0xDF7F, 0xDF7F, + 0xBEFF, 0xBEFF, 0xBEFF, 0xC71F, 0xDF7F, 0xDF7F, 0xDF7F, 0xDF7F, + 0xBEFF, 0x81FF, 0x81FF, 0xB657, 0xFFFF, 0xC71F, 0x81FF, 0xA23A, + 0xFFFF, 0xC71F, 0x81FF, 0xA23A, 0xD75F, 0x8A1F, 0x81FF, 0xB658, + 0x81FF, 0x9A5F, 0xAA9F, 0x81FF, 0x921D, 0x81FF, 0x81FF, 0x85FE, + 0xD294, 0xBE55, 0xB657, 0xC653, 0xD294, 0xD294, 0xCE73, 0xCA52, + 0x8A1D, 0xB214, 0xB214, 0x8DFC, 0xBA34, 0xC631, 0xC210, 0xB612, + 0xC631, 0xC631, 0xC631, 0xC210, 0xCA52, 0xCA52, 0xC631, 0xC631, + 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x8DFC, 0x81FF, 0x81FF, 0x81FF, + 0xC210, 0xBE10, 0xBDEF, 0xBDEF, 0xC210, 0xC210, 0xC210, 0xBE10, + 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x8DFB, 0xA5D4, + 0xBDEF, 0xB9CE, 0xB9CE, 0xB9CE, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, + 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x99F8, 0x8DFB, 0x8DFB, 0x8DFB, + 0xB9CE, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, 0xBE10, 0xC210, + 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x95F9, 0xA5F5, 0xA1F7, 0x91FA, + 0xBDEF, 0xBE10, 0xC210, 0xC210, 0xC210, 0xC210, 0xC631, 0xC631, + 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x921C, 0x921C, 0x921C, 0x921C, + 0xC631, 0xC631, 0xCA52, 0xCA52, 0xC631, 0xCA52, 0xCA52, 0xCE73, + 0x81FF, 0x81FF, 0x9A3B, 0xD294, 0x961B, 0xAA39, 0xD294, 0xD294, + 0xCE73, 0xCE73, 0xD294, 0xD6B5, 0xCE73, 0xD294, 0xD6B5, 0xD6B5, +}; diff --git a/source/ngc/history.c b/source/ngc/history.c new file mode 100644 index 0000000..bb5739e --- /dev/null +++ b/source/ngc/history.c @@ -0,0 +1,101 @@ +/* + * history.c + * genplusgx-mdisibio + * + * Created by Martin Disibio on 6/17/08. + * Copyright 2008 __MyCompanyName__. All rights reserved. + * + */ + +#include "shared.h" +#include "font.h" +#include "history.h" + +t_history history; + +void history_save() +{ + /* first check if directory exist */ + DIR_ITER *dir = diropen("/genplus"); + if (dir == NULL) mkdir("/genplus",S_IRWXU); + else dirclose(dir); + + /* open file for writing */ + FILE *fp = fopen("/genplus/romhistory.ini", "wb"); + if (fp == NULL) return; + + /* save options */ + fwrite(&history, sizeof(history), 1, fp); + + fclose(fp); +} + +/**************************************************************************** + * history_add_file + * + * Adds the given file path to the top of the history list, shifting each + * existing entry in the history down one place. If given file path is + * already in the list then the existing entry is (in effect) moved to the + * top instead. + ****************************************************************************/ +void history_add_file(char *filepath, char *filename) +{ + /* Create the new entry for this path. */ + t_history_entry newentry; + strncpy(newentry.filepath, filepath, MAXJOLIET - 1); + strncpy(newentry.filename, filename, MAXJOLIET - 1); + newentry.filepath[MAXJOLIET - 1] = '\0'; + newentry.filename[MAXJOLIET - 1] = '\0'; + + t_history_entry oldentry; /* Old entry is the one being shuffled down a spot. */ + t_history_entry currentry; /* Curr entry is the one that just replaced old path. */ + + /* Initially set curr entry to the new value. */ + memcpy(¤try, &newentry, sizeof(t_history_entry)); + + int i; + for(i=0; i < NUM_HISTORY_ENTRIES; i++) + { + /* Save off the next entry. */ + memcpy(&oldentry, &history.entries[i], sizeof(t_history_entry)); + + /* Overwrite with the previous entry. */ + memcpy(&history.entries[i], ¤try, sizeof(t_history_entry)); + + /* Switch the old entry to the curr entry now. */ + memcpy(¤try, &oldentry, sizeof(t_history_entry)); + + /* If the entry in the list at this spot matches + the new entry then do nothing and let this + entry get deleted. */ + if(strcmp(newentry.filepath, currentry.filepath) == 0 && strcmp(newentry.filename, currentry.filename) == 0) + break; + } + + /* now save to disk */ + history_save(); +} + +void history_load() +{ + /* open file for reading */ + FILE *fp = fopen("/genplus/romhistory.ini", "rb"); + if (fp == NULL) return; + + /* read file */ + fread(&history, sizeof(history), 1, fp); + + fclose(fp); +} + +void set_history_defaults(void) +{ + int i; + for(i=0; i < NUM_HISTORY_ENTRIES; i++) + { + memset(&history.entries[i], 0, sizeof(t_history_entry)); + } +} + + + diff --git a/source/ngc/history.h b/source/ngc/history.h new file mode 100644 index 0000000..62ba94c --- /dev/null +++ b/source/ngc/history.h @@ -0,0 +1,40 @@ +/* + * history.h + * genplusgx-mdisibio + * + * Created by Martin Disibio on 6/17/08. + * + */ + #ifndef _HISTORY_H + #define _HISTORY_H + + #include "types.h" + #include "iso9660.h" + + + /**************************************************************************** + * ROM Play History + * + ****************************************************************************/ + #define NUM_HISTORY_ENTRIES (10) + + +typedef struct +{ + char filepath[MAXJOLIET]; + char filename[MAXJOLIET]; +} t_history_entry; + +typedef struct +{ + t_history_entry entries[NUM_HISTORY_ENTRIES]; +} t_history; + +extern t_history history; +extern void history_add_file(char *filepath, char *filename); +extern void history_load(); +extern void set_history_defaults(); + + + #endif + diff --git a/source/ngc/loadrom.c b/source/ngc/loadrom.c deleted file mode 100644 index e8274a0..0000000 --- a/source/ngc/loadrom.c +++ /dev/null @@ -1,196 +0,0 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - ***************************************************************************/ - -#include "shared.h" -#include "rominfo.h" -#include - -/* 05/05/2006: new region detection routine (taken from GENS sourcecode) */ -extern uint8 region_detect; -extern uint8 cpu_detect; - -void genesis_set_region () -{ - /* country codes used to differentiate region */ - /* 0001 = japan ntsc (1) */ - /* 0010 = japan pal (2) */ - /* 0100 = usa (4) */ - /* 1000 = europe (8) */ - - int country = 0; - int i = 0; - char c; - - /* reading header to find the country */ - if (!strnicmp(rominfo.country, "eur", 3)) country |= 8; - else if (!strnicmp(rominfo.country, "usa", 3)) country |= 4; - else if (!strnicmp(rominfo.country, "jap", 3)) country |= 1; - - else for(i = 0; i < 4; i++) - { - c = toupper((int)rominfo.country[i]); - if (c == 'U') country |= 4; - else if (c == 'J') country |= 1; - else if (c == 'E') country |= 8; - else if (c < 16) country |= c; - else if ((c >= '0') && (c <= '9')) country |= c - '0'; - else if ((c >= 'A') && (c <= 'F')) country |= c - 'A' + 10; - } - - /* automatic detection */ - /* setting region */ - /* this is used by IO register */ - if (country & 4) region_code = REGION_USA; - else if (country & 8) region_code = REGION_EUROPE; - else if (country & 1) region_code = REGION_JAPAN_NTSC; - else if (country & 2) region_code = REGION_JAPAN_PAL; - else region_code = REGION_USA; - - /* cpu mode: PAL or NTSC */ - if ((region_code == REGION_EUROPE) || (region_code == REGION_JAPAN_PAL)) vdp_pal = 1; - else vdp_pal = 0; - - /* Force region setting */ - if (region_detect == 1) region_code = REGION_USA; - else if (region_detect == 2) region_code = REGION_EUROPE; - else if (region_detect == 3) region_code = REGION_JAPAN_NTSC; - else if (region_detect == 4) region_code = REGION_JAPAN_PAL; - - /* Force CPU mode */ - if (cpu_detect == 1) vdp_pal = 0; - else if (cpu_detect == 2) vdp_pal = 1; -} - - -/* patch_game - * set specific timings for some games - */ - extern uint8 alttiming; - extern uint8 vdptiming; - extern uint8 sys_type[2]; - - void detect_game() - { - /* Lotus 2 RECS */ - if (strstr(rominfo.product,"T-50746") != NULL) alttiming = 1; - else alttiming = 0; - - /* Chaos Engine / Soldier of Fortune */ - if ((strstr(rominfo.product,"T-104066") != NULL) || - (strstr(rominfo.product,"T-124016") != NULL)) vdptiming = 1; - else vdptiming = 0; - - /* Menacer 6-in-1 Pack */ - if (strstr(rominfo.product,"MK-1658") != NULL) - { - input.system[0] = NO_SYSTEM; - input.system[1] = SYSTEM_MENACER; - } - else - { - if (sys_type[0] == 0) input.system[0] = SYSTEM_GAMEPAD; - else if (sys_type[0] == 1) input.system[0] = SYSTEM_TEAMPLAYER; - else if (sys_type[0] == 2) input.system[0] = NO_SYSTEM; - - if (sys_type[1] == 0) input.system[1] = SYSTEM_GAMEPAD; - else if (sys_type[1] == 1) input.system[1] = SYSTEM_TEAMPLAYER; - else if (sys_type[1] == 2) input.system[1] = NO_SYSTEM; - } - -} - -/* SMD -interleaved) rom support */ -static uint8 block[0x4000]; - -void deinterleave_block (uint8 * src) -{ - int i; - memcpy (block, src, 0x4000); - for (i = 0; i < 0x2000; i += 1) - { - src[i * 2 + 0] = block[0x2000 + (i)]; - src[i * 2 + 1] = block[0x0000 + (i)]; - } -} - -/* - * load_memrom - * softdev 12 March 2006 - * Changed from using ROM buffer to a single copy in cart_rom - * - * Saving ROM size in bytes :) - * Required for remote loading. - * - * WIP3 - Removed 5Mb SSF2TNC from main memory to Audio ROM - */ -void load_memrom (int size) -{ - int offset = 0; - - SSF2TNC = 0; - - /* Support for interleaved roms */ - if ((size / 512) & 1) - { - int i; - size -= 512; - offset += 512; - - for (i = 0; i < (size / 0x4000); i += 1) - { - deinterleave_block (cart_rom + offset + (i * 0x4000)); - } - } - - if (size > 0x500000) size = 0x500000; - if (offset) memcpy (cart_rom, cart_rom + offset, size); - if (size > 0x400000) SSF2TNC = 1; /*** Assume SSF2TNC (mapped ROM) ***/ - - genromsize = size; - - /*** Clear out space ***/ - if (size < 0x500000) memset (cart_rom + size, 0, 0x500000 - size); - return; -} - -/*** Reloadrom - performs some initialization before running the new rom - ***/ -extern void decode_ggcodes (); -extern void ClearGGCodes (); -extern void sram_autoload(); -extern uint8 autoload; - -void reloadrom () -{ - load_memrom (genromsize); - getrominfo (cart_rom); /* Other Infos from ROM Header */ - genesis_set_region (); /* Region Detection */ - detect_game(); /* game special patches */ - SRAM_Init (); /* SRAM Infos from ROM header */ - - system_init (); - audio_init(48000); - ClearGGCodes (); /* Game Genie */ - decode_ggcodes (); - - system_reset (); - if (autoload) sram_autoload(); -} diff --git a/source/ngc/ngc.c b/source/ngc/ngc.c index c13b3f0..f69fce6 100644 --- a/source/ngc/ngc.c +++ b/source/ngc/ngc.c @@ -1,640 +1,238 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - ***************************************************************************/ -#include "shared.h" -#include "gcaram.h" -#include "dvd.h" -#include "font.h" - -#define ROMOFFSET 0x80600000 - -unsigned char *gen_bmp; /*** Work bitmap ***/ -int frameticker = 0; -int ConfigRequested = 0; -int padcal = 70; -int RenderedFrameCount = 0; -int FrameCount = 0; -int FramesPerSecond = 0; -u8 isWII = 0; - -/*************************************************************************** - * Nintendo Gamecube Hardware Specific Functions - * - * T I M E R - ***************************************************************************/ -#define TB_CLOCK 40500000 -#define mftb(rval) ({unsigned long u; do { \ - asm volatile ("mftbu %0" : "=r" (u)); \ - asm volatile ("mftb %0" : "=r" ((rval)->l)); \ - asm volatile ("mftbu %0" : "=r" ((rval)->u)); \ - } while(u != ((rval)->u)); }) - -typedef struct -{ - unsigned long l, u; -} tb_t; - -unsigned long tb_diff_msec(tb_t *end, tb_t *start) -{ - unsigned long upper, lower; - upper = end->u - start->u; - if (start->l > end->l) upper--; - lower = end->l - start->l; - return ((upper*((unsigned long)0x80000000/(TB_CLOCK/2000))) + (lower/(TB_CLOCK/1000))); -} - -int msBetweenFrames = 20; -tb_t now, prev; - - -/*************************************************************************** - * Nintendo Gamecube Hardware Specific Functions - * - * V I D E O - ***************************************************************************/ -/*** 2D Video ***/ -unsigned int *xfb[2]; /*** Double buffered ***/ -int whichfb = 0; /*** Switch ***/ -GXRModeObj *vmode; /*** General video mode ***/ - -/*** GX ***/ -#define TEX_WIDTH 320 -#define TEX_HEIGHT 256 -#define DEFAULT_FIFO_SIZE 256 * 1024 - -static u8 gp_fifo[DEFAULT_FIFO_SIZE] ATTRIBUTE_ALIGN (32); -static u8 texturemem[TEX_WIDTH * (TEX_HEIGHT + 8) * 2] ATTRIBUTE_ALIGN (32); -GXTexObj texobj; -static Mtx view; -int vwidth, vheight, oldvwidth, oldvheight; - -/* New texture based scaler */ -#define HASPECT 76 -#define VASPECT 54 - -typedef struct tagcamera -{ - Vector pos; - Vector up; - Vector view; -} camera; - -/*** Square Matrix - This structure controls the size of the image on the screen. - Think of the output as a -80 x 80 by -60 x 60 graph. -***/ -s16 square[] ATTRIBUTE_ALIGN (32) = -{ - /* - * X, Y, Z - * Values set are for roughly 4:3 aspect - */ - -HASPECT, VASPECT, 0, // 0 - HASPECT, VASPECT, 0, // 1 - HASPECT, -VASPECT, 0, // 2 - -HASPECT, -VASPECT, 0, // 3 -}; - -static camera cam = { {0.0F, 0.0F, 0.0F}, -{0.0F, 0.5F, 0.0F}, -{0.0F, 0.0F, -0.5F} -}; - -/*** Framestart function - Simply increment the tick counter - ***/ -static void framestart() -{ - frameticker++; -} - -/*** WIP3 - Scaler Support Functions - ***/ -static void draw_init (void) -{ - GX_ClearVtxDesc (); - GX_SetVtxDesc (GX_VA_POS, GX_INDEX8); - GX_SetVtxDesc (GX_VA_CLR0, GX_INDEX8); - GX_SetVtxDesc (GX_VA_TEX0, GX_DIRECT); - GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0); - GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); - GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); - GX_SetArray (GX_VA_POS, square, 3 * sizeof (s16)); - GX_SetNumTexGens (1); - GX_SetTexCoordGen (GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); - GX_InvalidateTexAll (); - GX_InitTexObj (&texobj, texturemem, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); -} - -static void draw_vert (u8 pos, u8 c, f32 s, f32 t) -{ - GX_Position1x8 (pos); - GX_Color1x8 (c); - GX_TexCoord2f32 (s, t); -} - -static void draw_square (Mtx v) -{ - Mtx m; // model matrix. - Mtx mv; // modelview matrix. - - guMtxIdentity (m); - guMtxTransApply (m, m, 0, 0, -100); - guMtxConcat (v, m, mv); - GX_LoadPosMtxImm (mv, GX_PNMTX0); - GX_Begin (GX_QUADS, GX_VTXFMT0, 4); - draw_vert (0, 0, 0.0, 0.0); - draw_vert (1, 0, 1.0, 0.0); - draw_vert (2, 0, 1.0, 1.0); - draw_vert (3, 0, 0.0, 1.0); - GX_End (); -} - -/*** StartGX - This function initialises the GX. - WIP3 - Based on texturetest from libOGC examples. - ***/ -static void StartGX (void) -{ - Mtx p; - GXColor gxbackground = { 0, 0, 0, 0xff }; - - /*** Clear out FIFO area ***/ - memset (&gp_fifo, 0, DEFAULT_FIFO_SIZE); - - /*** Initialise GX ***/ - GX_Init (&gp_fifo, DEFAULT_FIFO_SIZE); - GX_SetCopyClear (gxbackground, 0x00ffffff); - GX_SetViewport (0, 0, vmode->fbWidth, vmode->efbHeight, 0, 1); - GX_SetDispCopyYScale ((f32) vmode->xfbHeight / (f32) vmode->efbHeight); - GX_SetScissor (0, 0, vmode->fbWidth, vmode->efbHeight); - GX_SetDispCopySrc (0, 0, vmode->fbWidth, vmode->efbHeight); - GX_SetDispCopyDst (vmode->fbWidth, vmode->xfbHeight); - GX_SetCopyFilter (vmode->aa, vmode->sample_pattern, GX_TRUE, vmode->vfilter); - GX_SetFieldMode (vmode->field_rendering, ((vmode->viHeight == 2 * vmode->xfbHeight) ? GX_ENABLE : GX_DISABLE)); - GX_SetPixelFmt (GX_PF_RGB8_Z24, GX_ZC_LINEAR); - GX_SetCullMode (GX_CULL_NONE); - GX_CopyDisp (xfb[whichfb ^ 1], GX_TRUE); - GX_SetDispCopyGamma (GX_GM_1_0); - guPerspective (p, 60, 1.33F, 10.0F, 1000.0F); - GX_LoadProjectionMtx (p, GX_PERSPECTIVE); - memset (texturemem, 0, TEX_WIDTH * TEX_HEIGHT * 2); - vwidth = 100; - vheight = 100; -} - -/*** InitGCVideo - This function MUST be called at startup. - ***/ -static void InitGCVideo () -{ - int *romptr = (int *)ROMOFFSET; - - /* - * Before doing anything else under libogc, - * Call VIDEO_Init - */ - VIDEO_Init (); - - /* - * Before any memory is allocated etc. - * Rescue any tagged ROM in data 2 - */ - StartARAM(); - if ( memcmp((char *)romptr,"GENPLUSR",8) == 0 ) - { - genromsize = romptr[2]; - ARAMPut ((char *) 0x80600020, (char *) 0x8000, genromsize); - } - else genromsize = 0; - - /* Init Gamepads */ - PAD_Init (); - - /* - * Reset the video mode - * This is always set to 60hz - * Whether your running PAL or NTSC - */ - vmode = &TVNtsc480IntDf; - VIDEO_Configure (vmode); - - /*** Now configure the framebuffer. - Really a framebuffer is just a chunk of memory - to hold the display line by line. - **/ - xfb[0] = (u32 *) MEM_K0_TO_K1((u32 *) SYS_AllocateFramebuffer(vmode)); - - /*** I prefer also to have a second buffer for double-buffering. - This is not needed for the console demo. - ***/ - xfb[1] = (u32 *) MEM_K0_TO_K1((u32 *) SYS_AllocateFramebuffer(vmode)); - - /*** Define a console ***/ - console_init(xfb[0], 20, 64, vmode->fbWidth, vmode->xfbHeight, vmode->fbWidth * 2); - - /*** Clear framebuffer to black ***/ - VIDEO_ClearFrameBuffer(vmode, xfb[0], COLOR_BLACK); - VIDEO_ClearFrameBuffer(vmode, xfb[1], COLOR_BLACK); - - /*** Set the framebuffer to be displayed at next VBlank ***/ - VIDEO_SetNextFramebuffer(xfb[0]); - - /*** Increment frameticker and timer ***/ - VIDEO_SetPreRetraceCallback(framestart); - - /*** Get the PAD status updated by libogc ***/ - VIDEO_SetPostRetraceCallback(PAD_ScanPads); - VIDEO_SetBlack (FALSE); - - /*** Update the video for next vblank ***/ - VIDEO_Flush(); - - /*** Wait for VBL ***/ - VIDEO_WaitVSync(); - if (vmode->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync(); - - DVD_Init (); - SDCARD_Init (); - unpackBackdrop (); - init_font(); - StartGX (); - - /* Wii drive detection for 4.7Gb support */ - int driveid = dvd_inquiry(); - if ((driveid == 4) || (driveid == 6) || (driveid == 8)) isWII = 0; - else isWII = 1; -} - -/*** Video Update - called after each emulation frame - ***/ -static void update_video () -{ - int h, w; - vwidth = (reg[12] & 1) ? 320 : 256; - vheight = (reg[1] & 8) ? 240 : 224; - - long long int *dst = (long long int *)texturemem; - long long int *src1 = (long long int *)(bitmap.data + 64); - long long int *src2 = src1 + 256; - long long int *src3 = src2 + 256; - long long int *src4 = src3 + 256; - long long int stride = 1024 - ( vwidth >> 2 ); - - whichfb ^= 1; - - if ((oldvheight != vheight) || (oldvwidth != vwidth)) - { - /** Update scaling **/ - oldvwidth = vwidth; - oldvheight = vheight; - draw_init (); - memset (&view, 0, sizeof (Mtx)); - guLookAt(view, &cam.pos, &cam.up, &cam.view); - GX_SetViewport (0, 0, vmode->fbWidth, vmode->efbHeight, 0, 1); - } - - GX_InvVtxCache (); - GX_InvalidateTexAll (); - GX_SetTevOp (GX_TEVSTAGE0, GX_DECAL); - GX_SetTevOrder (GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); - - for (h = 0; h < vheight; h += 4) - { - for (w = 0; w < (vwidth >> 2); w++ ) - { - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src3++; - *dst++ = *src4++; - } - - src1 += stride; - src2 += stride; - src3 += stride; - src4 += stride; - } - - DCFlushRange (texturemem, TEX_WIDTH * TEX_HEIGHT * 2); - GX_SetNumChans (1); - GX_LoadTexObj (&texobj, GX_TEXMAP0); - draw_square (view); - GX_DrawDone (); - GX_SetZMode (GX_TRUE, GX_LEQUAL, GX_TRUE); - GX_SetColorUpdate (GX_TRUE); - GX_CopyDisp (xfb[whichfb], GX_TRUE); - GX_Flush (); - VIDEO_SetNextFramebuffer (xfb[whichfb]); - VIDEO_Flush (); -} - -/*************************************************************************** - * Nintendo Gamecube Hardware Specific Functions - * - * A U D I O - ***************************************************************************/ -unsigned char soundbuffer[16][3840] ATTRIBUTE_ALIGN(32); -int mixbuffer = 0; -int playbuffer = 0; -int IsPlaying = 0; - -/*** AudioSwitchBuffers - Genesis Plus only provides sound data on completion of each frame. - To try to make the audio less choppy, this function is called from both the - DMA completion and update_audio. - Testing for data in the buffer ensures that there are no clashes. - ***/ -static void AudioSwitchBuffers() -{ - u32 dma_len = (vdp_pal) ? 3840 : 3200; - - if ( !ConfigRequested ) - { - AUDIO_InitDMA((u32) soundbuffer[playbuffer], dma_len); - DCFlushRange(soundbuffer[playbuffer], dma_len); - AUDIO_StartDMA(); - playbuffer++; - playbuffer &= 0xf; - if ( playbuffer == mixbuffer ) playbuffer--; - if ( playbuffer < 0 ) playbuffer = 15; - IsPlaying = 1; - } - else IsPlaying = 0; -} - -/*** InitGCAudio - Stock code to set the DSP at 48Khz - ***/ -static void InitGCAudio () -{ - AUDIO_Init (NULL); - AUDIO_SetDSPSampleRate (AI_SAMPLERATE_48KHZ); - AUDIO_RegisterDMACallback (AudioSwitchBuffers); - memset(soundbuffer, 0, 16 * 3840); -} - -/*** Audio Update - called after each emulation frame - ***/ -static void update_audio () -{ - if (IsPlaying == 0) AudioSwitchBuffers (); -} - -/*************************************************************************** - * Nintendo Gamecube Hardware Specific Functions - * - * I N P U T - ***************************************************************************/ -/** - * IMPORTANT - * If you change the padmap here, be sure to update confjoy to - * reflect the changes - or confusion will ensue! - * - * DEFAULT MAPPING IS: - * Genesis Gamecube - * A B - * B A - * C X - * X LT - * Y Y - * Z RT - * - * Mode is unused, as it's our menu hotkey for now :) - * Also note that libOGC has LT/RT reversed - it's not a typo! - */ -unsigned int gppadmap[] = { INPUT_A, INPUT_B, INPUT_C, - INPUT_X, INPUT_Y, INPUT_Z, - INPUT_UP, INPUT_DOWN, - INPUT_LEFT, INPUT_RIGHT, - INPUT_START, INPUT_MODE -}; - -unsigned short gcpadmap[] = { PAD_BUTTON_B, PAD_BUTTON_A, PAD_BUTTON_X, - PAD_TRIGGER_L, PAD_BUTTON_Y, PAD_TRIGGER_R, - PAD_BUTTON_UP, PAD_BUTTON_DOWN, - PAD_BUTTON_LEFT, PAD_BUTTON_RIGHT, - PAD_BUTTON_START, PAD_TRIGGER_Z -}; - -static unsigned int DecodeJoy (unsigned short p) -{ - unsigned int J = 0; - int i; - - for (i = 0; i < 12; i++) if (p & gcpadmap[i]) J |= gppadmap[i]; - return J; -} - -static unsigned int GetAnalog (int Joy) -{ - signed char x, y; - unsigned int i = 0; - - x = PAD_StickX (Joy); - y = PAD_StickY (Joy); - if (x > padcal) i |= INPUT_RIGHT; - if (x < -padcal) i |= INPUT_LEFT; - if (y > padcal) i |= INPUT_UP; - if (y < -padcal) i |= INPUT_DOWN; - return i; -} - -/*** Inputs Update - called before each emulation frame - ***/ -static void update_inputs() -{ - int i = 0; - int joynum = 0; - - /*** Check for SOFT-RESET combo ***/ - if ((PAD_ButtonsHeld (0) & PAD_TRIGGER_Z) && - (PAD_ButtonsHeld (0) & PAD_TRIGGER_L)) - { - m68k_pulse_reset (); - return; - } - - /*** Check for menu combo ***/ - if (PAD_ButtonsHeld (0) & PAD_TRIGGER_Z) - { - ConfigRequested = 1; - return; - } - - for (i=0; i msBetweenFrames) - { - memcpy(&prev, &now, sizeof(tb_t)); - system_frame(1); - } - else - { - /*** Delay ***/ - while (tb_diff_msec(&now, &prev) < msBetweenFrames) mftb(&now); - memcpy(&prev, &now, sizeof(tb_t) ); - system_frame(0); - RenderedFrameCount++; - } - } - else /* NTSC 60Hz (use vsync) */ - { - while ( frameticker < 1 ) usleep(10); - - /** Simulate a frame **/ - if (frameticker > 1) - { - frameticker--; - if (frameticker > 5) - { - system_frame (0); - RenderedFrameCount++; - frameticker = 1; - } - else system_frame (1); - } - else - { - system_frame (0); - RenderedFrameCount++; - } - } - - frameticker--; - - /** Draw the frame **/ - update_video (); - - /** add the audio **/ - update_audio (); - - /** Check render frames **/ - if ((FrameCount == vdp_rate)) - { - FramesPerSecond = RenderedFrameCount; - RenderedFrameCount = 0; - FrameCount = 0; - } - - if (ConfigRequested) - { - AUDIO_StopDMA (); - IsPlaying = mixbuffer = playbuffer = 0; - MainMenu (); - ConfigRequested = 0; - } - } - return 0; -} +/**************************************************************************** + * Genesis Plus 1.2a + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ***************************************************************************/ +#include "shared.h" +#include "gcaram.h" +#include "dvd.h" +#include "font.h" +#include "history.h" + +#ifdef WII_DVD +#include "wdvd.h" +#endif + +/*************************************************************************** + * Genesis Virtual Machine + * + ***************************************************************************/ +static void load_bios() +{ + /* reset BIOS found flag */ + config.bios_enabled &= ~2; + + /* open file */ + FILE *fp = fopen("/genplus/BIOS.bin", "rb"); + if (fp == NULL) return; + + /* read file */ + fread(bios_rom, 1, 0x800, fp); + fclose(fp); + + /* update BIOS flags */ + config.bios_enabled |= 2; +} + +static void init_machine() +{ + /* Allocate cart_rom here */ + cart_rom = memalign(32, 0xA00000); + + /* BIOS support */ + load_bios(); + + /* allocate global work bitmap */ + memset (&bitmap, 0, sizeof (bitmap)); + bitmap.width = 360; + bitmap.height = 576; + bitmap.depth = 16; + bitmap.granularity = 2; + bitmap.pitch = bitmap.width * bitmap.granularity; + bitmap.viewport.w = 256; + bitmap.viewport.h = 224; + bitmap.viewport.x = 0; + bitmap.viewport.y = 0; + bitmap.remap = 1; + bitmap.data = malloc (bitmap.width * bitmap.height * bitmap.granularity); + + /* default system */ + input.system[0] = SYSTEM_GAMEPAD; + input.system[1] = SYSTEM_GAMEPAD; +} + +/************************************************** + Load a new rom and performs some initialization +***************************************************/ +void reloadrom () +{ + load_rom(""); /* Load ROM */ + system_init (); /* Initialize System */ + audio_init(48000); /* Audio System initialization */ + ClearGGCodes (); /* Clear Game Genie patches */ + system_reset (); /* System Power ON */ +} + +/*************************************************************************** + * M A I N + * + ***************************************************************************/ +int FramesPerSecond = 0; +int frameticker = 0; + +int main (int argc, char *argv[]) +{ + u16 usBetweenFrames; + long long now, prev; + int RenderedFrameCount = 0; + int FrameCount = 0; + + /* load hacked IOS with full access to DVD interface (WIP) */ +#ifdef WII_DVD + IOS_ReloadIOS(5); +#endif + + /* Initialize OGC subsystems */ + ogc_video__init(); + ogc_input__init(); + ogc_audio__init(); + + /* Initialize DVD interface */ +#ifndef HW_RVL + DVD_Init (); + dvd_drive_detect(); + +#elif WII_DVD + if (WDVD_Init()) + { + if (WDVD_Reset()) + { + u64 id; + WDVD_LowReadDiskId(&id); + } + } +#endif + + /* Initialize SDCARD Interface (LibFAT) */ + fatInitDefault(); + + /* Restore User Configuration */ + set_config_defaults(); + config_load(); + + /* Restore Recent Files list */ + set_history_defaults(); + history_load(); + + /* Initialize Genesis Virtual Machine */ + init_machine (); + + /* Load any injected rom */ + if (genromsize) + { + ARAMFetch((char *)cart_rom, (void *)0x8000, genromsize); + reloadrom (); + } + + /* Show Menu */ + legal(); + MainMenu(); + ConfigRequested = 0; + + /* Initialize Frame timings */ + frameticker = 0; + prev = gettime(); + + /* Emulation Loop */ + while (1) + { + /* Frame synchronization */ + if (gc_pal != vdp_pal) + { + /* use timers */ + usBetweenFrames = vdp_pal ? 20000 : 16666; + now = gettime(); + if (diff_usec(prev, now) > usBetweenFrames) + { + /* Frame skipping */ + prev = now; + system_frame(1); + } + else + { + /* Delay */ + while (diff_usec(prev, now) < usBetweenFrames) now = gettime(); + + /* Render Frame */ + prev = now; + system_frame(0); + RenderedFrameCount++; + } + } + else + { + /* use VSync */ + if (frameticker > 1) + { + /* Frame skipping */ + frameticker--; + system_frame (1); + } + else + { + /* Delay */ + while (!frameticker) usleep(10); + + system_frame (0); + RenderedFrameCount++; + } + + frameticker--; + } + + /* update video & audio */ + ogc_video__update(); + ogc_audio__update(); + + /* Check rendered frames (FPS) */ + FrameCount++; + if (FrameCount == vdp_rate) + { + FramesPerSecond = RenderedFrameCount; + RenderedFrameCount = 0; + FrameCount = 0; + } + + /* Check for Menu request */ + if (ConfigRequested) + { + /* reset AUDIO */ + ogc_audio__reset(); + + /* go to menu */ + MainMenu (); + ConfigRequested = 0; + + /* reset frame timings */ + frameticker = 0; + prev = gettime(); + FrameCount = 0; + RenderedFrameCount = 0; + } + } + return 0; +} diff --git a/source/ngc/ogc_audio.c b/source/ngc/ogc_audio.c new file mode 100644 index 0000000..619a5ce --- /dev/null +++ b/source/ngc/ogc_audio.c @@ -0,0 +1,86 @@ +/****************************************************************************** + * + * Genesis Plus - Sega Megadrive / Genesis Emulator + * + * NGC/Wii Audio support + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ***************************************************************************/ + +#include "shared.h" +#include "ogc_input.h" + +/* global datas */ +unsigned char soundbuffer[16][3840] ATTRIBUTE_ALIGN(32); +int mixbuffer = 0; + +static int playbuffer = 0; +static int IsPlaying = 0; + +/*** AudioSwitchBuffers + Genesis Plus only provides sound data on completion of each frame. + To try to make the audio less choppy, this function is called from both the + DMA completion and update_audio. + Testing for data in the buffer ensures that there are no clashes. + ***/ +static void AudioSwitchBuffers() +{ + if (ConfigRequested) + { + IsPlaying = 0; + return; + } + + u32 dma_len = (vdp_pal) ? 3840 : 3200; + + /* restart audio DMA with current soundbuffer */ + AUDIO_InitDMA((u32) soundbuffer[playbuffer], dma_len); + DCFlushRange(soundbuffer[playbuffer], dma_len); + AUDIO_StartDMA(); + + /* increment soundbuffers index */ + playbuffer++; + playbuffer &= 0xf; + if (playbuffer == mixbuffer) + { + playbuffer--; + if ( playbuffer < 0 ) playbuffer = 15; + } + + IsPlaying = 1; +} + + +void ogc_audio__init(void) +{ + AUDIO_Init (NULL); + AUDIO_SetDSPSampleRate (AI_SAMPLERATE_48KHZ); + AUDIO_RegisterDMACallback (AudioSwitchBuffers); + memset(soundbuffer, 0, 16 * 3840); +} + +void ogc_audio__reset(void) +{ + AUDIO_StopDMA (); + IsPlaying = 0; + mixbuffer = 0; + playbuffer = 0; +} + +void ogc_audio__update(void) +{ + /* restart Audio DMA if needed */ + if (!IsPlaying) AudioSwitchBuffers(); +} diff --git a/source/ngc/ogc_audio.h b/source/ngc/ogc_audio.h new file mode 100644 index 0000000..c6fdac0 --- /dev/null +++ b/source/ngc/ogc_audio.h @@ -0,0 +1,31 @@ +/****************************************************************************** + * + * SMS Plus - Sega Master System / GameGear Emulator + * + * NGC/Wii Audio support + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ***************************************************************************/ +#ifndef _GC_AUDIO_H_ +#define _GC_AUDIO_H_ + +extern u8 soundbuffer[16][3840]; +extern int mixbuffer; + +extern void ogc_audio__init(void); +extern void ogc_audio__reset(void); +extern void ogc_audio__update(void); + +#endif diff --git a/source/ngc/ogc_input.c b/source/ngc/ogc_input.c new file mode 100644 index 0000000..789f5a4 --- /dev/null +++ b/source/ngc/ogc_input.c @@ -0,0 +1,671 @@ +/****************************************************************************** + * + * SMS Plus GX - Sega Master System / GameGear Emulator + * + * SMS Plus - Sega Master System / GameGear Emulator + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ***************************************************************************/ + +#include "shared.h" +#include "font.h" + +#ifdef HW_RVL +#include +#endif + +/* configurable keys */ +#define KEY_BUTTONA 0 +#define KEY_BUTTONB 1 +#define KEY_BUTTONC 2 +#define KEY_START 3 +#define KEY_MENU 4 +#define KEY_BUTTONX 5 // 6-buttons only +#define KEY_BUTTONY 6 // 6-buttons only +#define KEY_BUTTONZ 7 // 6-buttons only + +int ConfigRequested = 1; + +static const char *keys_name[MAX_KEYS] = +{ + "Button A", + "Button B", + "Button C", + "Button START ", + "Menu", + "Button X", + "Button Y", + "Button Z", +}; + +/* gamepad available buttons */ +static const u16 pad_keys[8] = +{ + PAD_TRIGGER_Z, + PAD_TRIGGER_R, + PAD_TRIGGER_L, + PAD_BUTTON_A, + PAD_BUTTON_B, + PAD_BUTTON_X, + PAD_BUTTON_Y, + PAD_BUTTON_START, +}; + +#ifdef HW_RVL + +/* directional buttons mapping */ +#define PAD_UP 0 +#define PAD_DOWN 1 +#define PAD_LEFT 2 +#define PAD_RIGHT 3 + +static u32 wpad_dirmap[3][4] = +{ + {WPAD_BUTTON_RIGHT, WPAD_BUTTON_LEFT, WPAD_BUTTON_UP, WPAD_BUTTON_DOWN}, // WIIMOTE only + {WPAD_BUTTON_UP, WPAD_BUTTON_DOWN, WPAD_BUTTON_LEFT, WPAD_BUTTON_RIGHT}, // WIIMOTE + NUNCHUK + {WPAD_CLASSIC_BUTTON_UP, WPAD_CLASSIC_BUTTON_DOWN, WPAD_CLASSIC_BUTTON_LEFT, WPAD_CLASSIC_BUTTON_RIGHT} // CLASSIC +}; + +/* wiimote/expansion available buttons */ +static u32 wpad_keys[20] = +{ + WPAD_BUTTON_2, + WPAD_BUTTON_1, + WPAD_BUTTON_B, + WPAD_BUTTON_A, +/* WPAD_BUTTON_MINUS, used for mode */ + WPAD_BUTTON_HOME, + WPAD_BUTTON_PLUS, + WPAD_NUNCHUK_BUTTON_Z, + WPAD_NUNCHUK_BUTTON_C, + WPAD_CLASSIC_BUTTON_ZR, + WPAD_CLASSIC_BUTTON_X, + WPAD_CLASSIC_BUTTON_A, + WPAD_CLASSIC_BUTTON_Y, + WPAD_CLASSIC_BUTTON_B, + WPAD_CLASSIC_BUTTON_ZL, + WPAD_CLASSIC_BUTTON_FULL_R, + WPAD_CLASSIC_BUTTON_PLUS, + WPAD_CLASSIC_BUTTON_HOME, + WPAD_CLASSIC_BUTTON_MINUS, + WPAD_CLASSIC_BUTTON_FULL_L, +}; +#endif + + +/******************************* + gamepad support +*******************************/ +static void pad_config(int num, int padtype) +{ + int i,j,max; + u16 p; + u8 quit; + char msg[30]; + + u32 pad = PAD_ScanPads() & (1< 70)) input.pad[i] |= INPUT_UP; + else if ((p & PAD_BUTTON_DOWN) || (y < -70)) input.pad[i] |= INPUT_DOWN; + if ((p & PAD_BUTTON_LEFT) || (x < -60)) input.pad[i] |= INPUT_LEFT; + else if ((p & PAD_BUTTON_RIGHT) || (x > 60)) input.pad[i] |= INPUT_RIGHT; + + /* get current key config */ + u16 pad_keymap[MAX_KEYS]; + memcpy(pad_keymap, config.pad_keymap[num], MAX_KEYS * sizeof(u16)); + + /* SOFTRESET */ + if ((p & PAD_TRIGGER_L) && (p & PAD_TRIGGER_Z)) + { + set_softreset(); + } + + /* BUTTONS */ + if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; + if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; + if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C; + if (p & pad_keymap[KEY_BUTTONX]) input.pad[i] |= INPUT_X; + if (p & pad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_Y; + if (p & pad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_Z; + + /* MODE/START */ + if ((p & PAD_BUTTON_START) && (p & PAD_TRIGGER_Z)) input.pad[i] |= INPUT_MODE; + else if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START; + + /* MENU */ + if (p & pad_keymap[KEY_MENU]) + { + ConfigRequested = 1; + } + + int temp; + if (input.dev[i] == DEVICE_LIGHTGUN) + { + temp = input.analog[i-4][0]; + if ((input.pad[i] & INPUT_RIGHT)) temp ++; + else if ((input.pad[i] & INPUT_LEFT)) temp --; + if (temp < 0) temp = 0; + else if (temp > bitmap.viewport.w) temp = bitmap.viewport.w; + input.analog[i-4][0] = temp; + + temp = input.analog[i-4][1]; + if ((input.pad[i] & INPUT_UP)) temp --; + if ((input.pad[i] & INPUT_DOWN)) temp ++; + if (temp < 0) temp = 0; + else if (temp > bitmap.viewport.h) temp = bitmap.viewport.h; + input.analog[i-4][1] = temp; + } + else if ((system_hw == SYSTEM_PICO) && (i == 0)) + { + temp = input.analog[0][0]; + if ((input.pad[i] & INPUT_RIGHT)) temp ++; + else if ((input.pad[i] & INPUT_LEFT)) temp --; + if (temp < 0x17c) temp = 0x17c; + else if (temp > 0x3c) temp = 0x3c; + input.analog[0][0] = temp; + + temp = input.analog[0][1]; + if ((input.pad[i] & INPUT_UP)) temp --; + if ((input.pad[i] & INPUT_DOWN)) temp ++; + if (temp < 0x1fc) temp = 0x1fc; + else if (temp > 0x3f3) temp = 0x3f3; + input.analog[0][1] = temp; + } + +} + +/******************************* + wiimote support +*******************************/ +#ifdef HW_RVL + +#define PI 3.14159265f + +static s8 WPAD_StickX(u8 chan,u8 right) +{ + float mag = 0.0; + float ang = 0.0; + WPADData *data = WPAD_Data(chan); + + switch (data->exp.type) + { + case WPAD_EXP_NUNCHUK: + case WPAD_EXP_GUITARHERO3: + if (right == 0) + { + mag = data->exp.nunchuk.js.mag; + ang = data->exp.nunchuk.js.ang; + } + break; + + case WPAD_EXP_CLASSIC: + if (right == 0) + { + mag = data->exp.classic.ljs.mag; + ang = data->exp.classic.ljs.ang; + } + else + { + mag = data->exp.classic.rjs.mag; + ang = data->exp.classic.rjs.ang; + } + break; + + default: + break; + } + + /* calculate X value (angle need to be converted into radian) */ + if (mag > 1.0) mag = 1.0; + else if (mag < -1.0) mag = -1.0; + double val = mag * sin(PI * ang/180.0f); + + return (s8)(val * 128.0f); +} + + +static s8 WPAD_StickY(u8 chan, u8 right) +{ + float mag = 0.0; + float ang = 0.0; + WPADData *data = WPAD_Data(chan); + + switch (data->exp.type) + { + case WPAD_EXP_NUNCHUK: + case WPAD_EXP_GUITARHERO3: + if (right == 0) + { + mag = data->exp.nunchuk.js.mag; + ang = data->exp.nunchuk.js.ang; + } + break; + + case WPAD_EXP_CLASSIC: + if (right == 0) + { + mag = data->exp.classic.ljs.mag; + ang = data->exp.classic.ljs.ang; + } + else + { + mag = data->exp.classic.rjs.mag; + ang = data->exp.classic.rjs.ang; + } + break; + + default: + break; + } + + /* calculate X value (angle need to be converted into radian) */ + if (mag > 1.0) mag = 1.0; + else if (mag < -1.0) mag = -1.0; + double val = mag * cos(PI * ang/180.0f); + + return (s8)(val * 128.0f); +} + +static void wpad_config(u8 num, u8 exp, u8 padtype) +{ + int i,j,max; + u8 quit; + char msg[30]; + u32 current = 255; + + /* check wiimote status */ + WPAD_Probe(num, ¤t); + if (((exp > WPAD_EXP_NONE) && (current != exp)) || (current == 255)) + { + if (exp == WPAD_EXP_NONE) sprintf(msg, "WIIMOTE #%d is not connected !", num+1); + if (exp == WPAD_EXP_NUNCHUK) sprintf(msg, "NUNCHUK #%d is not connected !", num+1); + if (exp == WPAD_EXP_CLASSIC) sprintf(msg, "CLASSIC #%d is not connected !", num+1); + WaitPrompt(msg); + return; + } + + /* index for wpad_keymap */ + u8 index = exp + (num * 3); + + /* loop on each mapped keys */ + max = (padtype == DEVICE_6BUTTON) ? MAX_KEYS : (MAX_KEYS - 3); + for (i=0; i 70)) input.pad[i] |= INPUT_UP; + else if ((p & wpad_dirmap[exp][PAD_DOWN]) || (y < -70)) input.pad[i] |= INPUT_DOWN; + if ((p & wpad_dirmap[exp][PAD_LEFT]) || (x < -60)) input.pad[i] |= INPUT_LEFT; + else if ((p & wpad_dirmap[exp][PAD_RIGHT]) || (x > 60)) input.pad[i] |= INPUT_RIGHT; + + /* retrieve current key mapping */ + u32 *wpad_keymap = config.wpad_keymap[exp + (3 * num)]; + + /* BUTTONS */ + if (p & wpad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; + if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; + if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C; + if (p & wpad_keymap[KEY_BUTTONX]) input.pad[i] |= INPUT_X; + if (p & wpad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_Y; + if (p & wpad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_Z; + if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; + + /* MODE Button */ + if ((p & WPAD_CLASSIC_BUTTON_MINUS) || (p & WPAD_BUTTON_MINUS)) input.pad[i] |= INPUT_MODE; + + /* ANALOG Device (use IR pointing by default) */ + if (input.dev[i] == DEVICE_LIGHTGUN) + { + struct ir_t ir; + WPAD_IR(num, &ir); + if (ir.valid) + { + input.analog[i-4][0] = (ir.x * bitmap.viewport.w) / 640; + input.analog[i-4][1] = (ir.y * bitmap.viewport.h) / 480; + } + } + else if ((system_hw == SYSTEM_PICO) && (i == 0)) + { + struct ir_t ir; + WPAD_IR(num, &ir); + if (ir.valid) + { + input.analog[0][0] = 0x3c + (ir.x * (0x17c - 0x3c + 1)) / 640; + input.analog[0][1] = 0x1fc + (ir.y * (0x3f3 - 0x1fc + 1)) / 480; + } + } + + /* SOFTRESET */ + if (((p & WPAD_CLASSIC_BUTTON_PLUS) && (p & WPAD_CLASSIC_BUTTON_MINUS)) || + ((p & WPAD_BUTTON_PLUS) && (p & WPAD_BUTTON_MINUS))) + { + set_softreset(); + } + + /* MENU */ + if (p & wpad_keymap[KEY_MENU]) + { + ConfigRequested = 1; + } +} +#endif + +/***************************************************************** + Generic input handlers +******************************************************************/ + +void ogc_input__init(void) +{ + PAD_Init (); + +#ifdef HW_RVL + WPAD_Init(); + WPAD_SetIdleTimeout(60); + WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); + WPAD_SetVRes(WPAD_CHAN_ALL,640,480); +#endif +} + +void ogc_input__set_defaults(void) +{ + int i; + + /* set default key mapping for each type of devices */ + for (i=0; i<4; i++) + { + config.pad_keymap[i][KEY_BUTTONA] = PAD_BUTTON_B; + config.pad_keymap[i][KEY_BUTTONB] = PAD_BUTTON_A; + config.pad_keymap[i][KEY_BUTTONC] = PAD_BUTTON_X; + config.pad_keymap[i][KEY_START] = PAD_BUTTON_START; + config.pad_keymap[i][KEY_MENU] = PAD_TRIGGER_Z; + config.pad_keymap[i][KEY_BUTTONX] = PAD_TRIGGER_L; + config.pad_keymap[i][KEY_BUTTONY] = PAD_BUTTON_Y; + config.pad_keymap[i][KEY_BUTTONZ] = PAD_TRIGGER_R; + } + +#ifdef HW_RVL + for (i=0; i<4; i++) + { + /* WIIMOTE */ + config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_BUTTONA] = WPAD_BUTTON_A; + config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_BUTTONB] = WPAD_BUTTON_2; + config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_BUTTONC] = WPAD_BUTTON_1; + config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_START] = WPAD_BUTTON_PLUS; + config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_MENU] = WPAD_BUTTON_HOME; + config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_BUTTONX] = 0; + config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_BUTTONY] = 0; + config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_BUTTONZ] = 0; + + /* WIIMOTE + NUNCHUK */ + config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_BUTTONA] = WPAD_NUNCHUK_BUTTON_Z; + config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_BUTTONB] = WPAD_BUTTON_A; + config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_BUTTONC] = WPAD_BUTTON_B; + config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_START] = WPAD_BUTTON_PLUS; + config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_MENU] = WPAD_BUTTON_HOME; + config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_BUTTONX] = WPAD_NUNCHUK_BUTTON_C; + config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_BUTTONY] = WPAD_BUTTON_1; + config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_BUTTONZ] = WPAD_BUTTON_2; + + /* CLASSIC CONTROLLER */ + config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_BUTTONA] = WPAD_CLASSIC_BUTTON_Y; + config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_BUTTONB] = WPAD_CLASSIC_BUTTON_B; + config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_BUTTONC] = WPAD_CLASSIC_BUTTON_A; + config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_START] = WPAD_CLASSIC_BUTTON_PLUS; + config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_MENU] = WPAD_CLASSIC_BUTTON_HOME; + config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_BUTTONX] = WPAD_CLASSIC_BUTTON_ZL; + config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_BUTTONY] = WPAD_CLASSIC_BUTTON_X; + config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_BUTTONZ] = WPAD_CLASSIC_BUTTON_ZR; + } +#endif + + /* set default device assigantion */ + for (i=0; i 0) + wpad_update(config.input[num].port,i, config.input[num].device - 1); +#endif + num ++; + } + } +} + +void ogc_input__config(u8 num, u8 type, u8 padtype) +{ + switch (type) + { + case 0: + pad_config(num, padtype); + break; + + default: +#ifdef HW_RVL + wpad_config(num,type-1, padtype); +#endif + break; + } +} + +u16 ogc_input__getMenuButtons(void) +{ + /* gamecube pad */ + PAD_ScanPads(); + u16 p = PAD_ButtonsDown(0); + s8 x = PAD_StickX(0); + s8 y = PAD_StickY(0); + if (x > 70) p |= PAD_BUTTON_RIGHT; + else if (x < -70) p |= PAD_BUTTON_LEFT; + if (y > 60) p |= PAD_BUTTON_UP; + else if (y < -60) p |= PAD_BUTTON_DOWN; + +#ifdef HW_RVL + /* wiimote support */ + struct ir_t ir; + u32 exp; + + WPAD_ScanPads(); + if (WPAD_Probe(0, &exp) == WPAD_ERR_NONE) + { + u32 q = WPAD_ButtonsDown(0); + x = WPAD_StickX(0, 0); + y = WPAD_StickY(0, 0); + + /* default directions */ + WPAD_IR(0, &ir); + if (ir.valid) + { + /* Wiimote is pointed toward screen */ + if ((q & WPAD_BUTTON_UP) || (y > 70)) p |= PAD_BUTTON_UP; + else if ((q & WPAD_BUTTON_DOWN) || (y < -70)) p |= PAD_BUTTON_DOWN; + if ((q & WPAD_BUTTON_LEFT) || (x < -60)) p |= PAD_BUTTON_LEFT; + else if ((q & WPAD_BUTTON_RIGHT) || (x > 60)) p |= PAD_BUTTON_RIGHT; + } + else + { + /* Wiimote is used horizontally */ + if ((q & WPAD_BUTTON_RIGHT) || (y > 70)) p |= PAD_BUTTON_UP; + else if ((q & WPAD_BUTTON_LEFT) || (y < -70)) p |= PAD_BUTTON_DOWN; + if ((q & WPAD_BUTTON_UP) || (x < -60)) p |= PAD_BUTTON_LEFT; + else if ((q & WPAD_BUTTON_DOWN) || (x > 60)) p |= PAD_BUTTON_RIGHT; + } + + /* default keys */ + if (q & WPAD_BUTTON_MINUS) p |= PAD_TRIGGER_L; + if (q & WPAD_BUTTON_PLUS) p |= PAD_TRIGGER_R; + if (q & WPAD_BUTTON_A) p |= PAD_BUTTON_A; + if (q & WPAD_BUTTON_B) p |= PAD_BUTTON_B; + if (q & WPAD_BUTTON_2) p |= PAD_BUTTON_A; + if (q & WPAD_BUTTON_1) p |= PAD_BUTTON_B; + if (q & WPAD_BUTTON_HOME) p |= PAD_TRIGGER_Z; + + /* classic controller expansion */ + if (exp == WPAD_EXP_CLASSIC) + { + if (q & WPAD_CLASSIC_BUTTON_UP) p |= PAD_BUTTON_UP; + else if (q & WPAD_CLASSIC_BUTTON_DOWN) p |= PAD_BUTTON_DOWN; + if (q & WPAD_CLASSIC_BUTTON_LEFT) p |= PAD_BUTTON_LEFT; + else if (q & WPAD_CLASSIC_BUTTON_RIGHT) p |= PAD_BUTTON_RIGHT; + + if (q & WPAD_CLASSIC_BUTTON_FULL_L) p |= PAD_TRIGGER_L; + if (q & WPAD_CLASSIC_BUTTON_FULL_R) p |= PAD_TRIGGER_R; + if (q & WPAD_CLASSIC_BUTTON_A) p |= PAD_BUTTON_A; + if (q & WPAD_CLASSIC_BUTTON_B) p |= PAD_BUTTON_B; + if (q & WPAD_CLASSIC_BUTTON_HOME) p |= PAD_TRIGGER_Z; + } + } +#endif + + return p; +} diff --git a/source/ngc/ogc_input.h b/source/ngc/ogc_input.h new file mode 100644 index 0000000..f096a40 --- /dev/null +++ b/source/ngc/ogc_input.h @@ -0,0 +1,42 @@ +/****************************************************************************** + * + * SMS Plus - Sega Master System / GameGear Emulator + * + * NGC/Wii Controller support + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ***************************************************************************/ +#ifndef _GC_INPUT_H_ +#define _GC_INPUT_H_ + +/* number of configurable keys */ +#define MAX_KEYS 8 + +typedef struct +{ + s8 device; + u8 port; +} t_input_config; + + +extern int ConfigRequested; + +extern void ogc_input__init(void); +extern void ogc_input__set_defaults(void); +extern void ogc_input__update(void); +extern void ogc_input__config(u8 num, u8 type, u8 padtype); +extern u16 ogc_input__getMenuButtons(void); + +#endif diff --git a/source/ngc/ogc_video.c b/source/ngc/ogc_video.c new file mode 100644 index 0000000..ca41c46 --- /dev/null +++ b/source/ngc/ogc_video.c @@ -0,0 +1,713 @@ +/****************************************************************************** + * + * Genesis Plus - Sega Megadrive / Genesis Emulator + * + * NGC/Wii Video support + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ***************************************************************************/ + +#include "shared.h" +#include "font.h" +#include "gcaram.h" + +/*** PAL 50hz flag ***/ +uint8 gc_pal = 0; + +/*** VI ***/ +unsigned int *xfb[2]; /*** Double buffered ***/ +int whichfb = 0; /*** External framebuffer index ***/ +GXRModeObj *vmode; /*** Menu video mode ***/ + +/*** GX ***/ +#define TEX_WIDTH 356 +#define TEX_HEIGHT 576 +#define DEFAULT_FIFO_SIZE 256 * 1024 +#define HASPECT 320 +#define VASPECT 240 + +static u8 gp_fifo[DEFAULT_FIFO_SIZE] ATTRIBUTE_ALIGN (32); +static u8 texturemem[TEX_WIDTH * (TEX_HEIGHT + 8) * 2] ATTRIBUTE_ALIGN (32); +static GXTexObj texobj; +static Mtx view; +static int vwidth, vheight; +static long long int stride; + +/*** custom Video modes (used to emulate original console video modes) ***/ +/* 288 lines progressive (PAL 50Hz) */ +GXRModeObj TV50hz_288p = +{ + VI_TVMODE_PAL_DS, // viDisplayMode + 640, // fbWidth + 286, // efbHeight + 286, // xfbHeight + (VI_MAX_WIDTH_PAL - 720)/2, // viXOrigin + (VI_MAX_HEIGHT_PAL - 572)/2, // viYOrigin + 720, // viWidth + 572, // viHeight + VI_XFBMODE_SF, // xFBmode + GX_FALSE, // field_rendering + GX_FALSE, // aa + + // sample points arranged in increasing Y order + { + {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each + {6,6},{6,6},{6,6}, // pix 1 + {6,6},{6,6},{6,6}, // pix 2 + {6,6},{6,6},{6,6} // pix 3 + }, + + // vertical filter[7], 1/64 units, 6 bits each + { + 0, // line n-1 + 0, // line n-1 + 21, // line n + 22, // line n + 21, // line n + 0, // line n+1 + 0 // line n+1 + } +}; + +/* 288 lines interlaced (PAL 50Hz) */ +GXRModeObj TV50hz_288i = +{ + VI_TVMODE_PAL_INT, // viDisplayMode + 640, // fbWidth + 286, // efbHeight + 286, // xfbHeight + (VI_MAX_WIDTH_PAL - 720)/2, // viXOrigin + (VI_MAX_HEIGHT_PAL - 572)/2, // viYOrigin + 720, // viWidth + 572, // viHeight + VI_XFBMODE_SF, // xFBmode + GX_TRUE, // field_rendering + GX_FALSE, // aa + + // sample points arranged in increasing Y order + { + {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each + {6,6},{6,6},{6,6}, // pix 1 + {6,6},{6,6},{6,6}, // pix 2 + {6,6},{6,6},{6,6} // pix 3 + }, + + // vertical filter[7], 1/64 units, 6 bits each + { + 0, // line n-1 + 0, // line n-1 + 21, // line n + 22, // line n + 21, // line n + 0, // line n+1 + 0 // line n+1 + } +}; + +/* 576 lines interlaced (PAL 50Hz, scaled) */ +GXRModeObj TV50hz_576i = +{ + VI_TVMODE_PAL_INT, // viDisplayMode + 640, // fbWidth + 480, // efbHeight + 574, // xfbHeight + (VI_MAX_WIDTH_PAL - 720)/2, // viXOrigin + (VI_MAX_HEIGHT_PAL - 574)/2, // viYOrigin + 720, // viWidth + 574, // viHeight + VI_XFBMODE_DF, // xFBmode + GX_FALSE, // field_rendering + GX_FALSE, // aa + + // sample points arranged in increasing Y order + { + {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each + {6,6},{6,6},{6,6}, // pix 1 + {6,6},{6,6},{6,6}, // pix 2 + {6,6},{6,6},{6,6} // pix 3 + }, + + // vertical filter[7], 1/64 units, 6 bits each + { + 8, // line n-1 + 8, // line n-1 + 10, // line n + 12, // line n + 10, // line n + 8, // line n+1 + 8 // line n+1 + } +}; + +/* 240 lines progressive (NTSC or PAL 60Hz) */ +GXRModeObj TV60hz_240p = +{ + VI_TVMODE_EURGB60_DS, // viDisplayMode + 640, // fbWidth + 240, // efbHeight + 240, // xfbHeight + (VI_MAX_WIDTH_NTSC - 720)/2, // viXOrigin + (VI_MAX_HEIGHT_NTSC/2 - 480/2)/2, // viYOrigin + 720, // viWidth + 480, // viHeight + VI_XFBMODE_SF, // xFBmode + GX_FALSE, // field_rendering + GX_FALSE, // aa + + // sample points arranged in increasing Y order + { + {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each + {6,6},{6,6},{6,6}, // pix 1 + {6,6},{6,6},{6,6}, // pix 2 + {6,6},{6,6},{6,6} // pix 3 + }, + + // vertical filter[7], 1/64 units, 6 bits each + { + 0, // line n-1 + 0, // line n-1 + 21, // line n + 22, // line n + 21, // line n + 0, // line n+1 + 0 // line n+1 + } +}; + +/* 240 lines interlaced (NTSC or PAL 60Hz) */ +GXRModeObj TV60hz_240i = +{ + VI_TVMODE_EURGB60_INT, // viDisplayMode + 640, // fbWidth + 240, // efbHeight + 240, // xfbHeight + (VI_MAX_WIDTH_NTSC - 720)/2, // viXOrigin + (VI_MAX_HEIGHT_NTSC - 480)/2, // viYOrigin + 720, // viWidth + 480, // viHeight + VI_XFBMODE_SF, // xFBmode + GX_TRUE, // field_rendering + GX_FALSE, // aa + + // sample points arranged in increasing Y order + { + {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each + {6,6},{6,6},{6,6}, // pix 1 + {6,6},{6,6},{6,6}, // pix 2 + {6,6},{6,6},{6,6} // pix 3 + }, + + // vertical filter[7], 1/64 units, 6 bits each + { + 0, // line n-1 + 0, // line n-1 + 21, // line n + 22, // line n + 21, // line n + 0, // line n+1 + 0 // line n+1 + } +}; + +/* 480 lines interlaced (NTSC or PAL 60Hz) */ +GXRModeObj TV60hz_480i = +{ + VI_TVMODE_EURGB60_INT, // viDisplayMode + 640, // fbWidth + 480, // efbHeight + 480, // xfbHeight + (VI_MAX_WIDTH_NTSC - 720)/2, // viXOrigin + (VI_MAX_HEIGHT_NTSC - 480)/2, // viYOrigin + 720, // viWidth + 480, // viHeight + VI_XFBMODE_DF, // xFBmode + GX_FALSE, // field_rendering + GX_FALSE, // aa + + // sample points arranged in increasing Y order + { + {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each + {6,6},{6,6},{6,6}, // pix 1 + {6,6},{6,6},{6,6}, // pix 2 + {6,6},{6,6},{6,6} // pix 3 + }, + + // vertical filter[7], 1/64 units, 6 bits each + { + 8, // line n-1 + 8, // line n-1 + 10, // line n + 12, // line n + 10, // line n + 8, // line n+1 + 8 // line n+1 + } +}; + +/* TV Modes table */ +GXRModeObj *tvmodes[6] = { + &TV60hz_240p, &TV60hz_240i, &TV60hz_480i, /* 60hz modes */ + &TV50hz_288p, &TV50hz_288i, &TV50hz_576i /* 50Hz modes */ +}; + +typedef struct tagcamera +{ + Vector pos; + Vector up; + Vector view; +} camera; + +/*** Square Matrix + This structure controls the size of the image on the screen. + Think of the output as a -80 x 80 by -60 x 60 graph. +***/ +static s16 square[] ATTRIBUTE_ALIGN (32) = +{ + /* + * X, Y, Z + * Values set are for roughly 4:3 aspect + */ + -HASPECT, VASPECT, 0, // 0 + HASPECT, VASPECT, 0, // 1 + HASPECT, -VASPECT, 0, // 2 + -HASPECT, -VASPECT, 0, // 3 +}; + +static camera cam = { + {0.0F, 0.0F, -100.0F}, + {0.0F, -1.0F, 0.0F}, + {0.0F, 0.0F, 0.0F} +}; + +/* rendering initialization */ +/* should be called each time you change quad aspect ratio */ +static void draw_init(void) +{ + /* Clear all Vertex params */ + GX_ClearVtxDesc (); + + /* Set Position Params (set quad aspect ratio) */ + GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0); + GX_SetVtxDesc (GX_VA_POS, GX_INDEX8); + GX_SetArray (GX_VA_POS, square, 3 * sizeof (s16)); + + /* Set Tex Coord Params */ + GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + GX_SetVtxDesc (GX_VA_TEX0, GX_DIRECT); + GX_SetTevOp (GX_TEVSTAGE0, GX_REPLACE); + GX_SetTevOrder (GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLORNULL); + GX_SetNumTexGens (1); + GX_SetNumChans(0); + + /** Set Modelview **/ + memset (&view, 0, sizeof (Mtx)); + guLookAt(view, &cam.pos, &cam.up, &cam.view); + GX_LoadPosMtxImm (view, GX_PNMTX0); +} + +/* vertex rendering */ +static void draw_vert(u8 pos, f32 s, f32 t) +{ + GX_Position1x8 (pos); + GX_TexCoord2f32 (s, t); +} + +/* textured quad rendering */ +static void draw_square (void) +{ + GX_Begin (GX_QUADS, GX_VTXFMT0, 4); + draw_vert (3, 0.0, 0.0); + draw_vert (2, 1.0, 0.0); + draw_vert (1, 1.0, 1.0); + draw_vert (0, 0.0, 1.0); + GX_End (); +} + +/* retrace handler */ +static void framestart(u32 retraceCnt) +{ + /* simply increment the tick counter */ + frameticker++; +} + +static void gxStart(void) +{ + Mtx p; + GXColor gxbackground = { 0, 0, 0, 0xff }; + + /*** Clear out FIFO area ***/ + memset (&gp_fifo, 0, DEFAULT_FIFO_SIZE); + + /*** GX default ***/ + GX_Init (&gp_fifo, DEFAULT_FIFO_SIZE); + GX_SetCopyClear (gxbackground, 0x00ffffff); + + GX_SetViewport (0.0F, 0.0F, vmode->fbWidth, vmode->efbHeight, 0.0F, 1.0F); + GX_SetScissor (0, 0, vmode->fbWidth, vmode->efbHeight); + f32 yScale = GX_GetYScaleFactor(vmode->efbHeight, vmode->xfbHeight); + u16 xfbHeight = GX_SetDispCopyYScale (yScale); + GX_SetDispCopySrc (0, 0, vmode->fbWidth, vmode->efbHeight); + GX_SetDispCopyDst (vmode->fbWidth, xfbHeight); + GX_SetCopyFilter (vmode->aa, vmode->sample_pattern, GX_TRUE, vmode->vfilter); + GX_SetFieldMode (vmode->field_rendering, ((vmode->viHeight == 2 * vmode->xfbHeight) ? GX_ENABLE : GX_DISABLE)); + GX_SetPixelFmt (GX_PF_RGB8_Z24, GX_ZC_LINEAR); + GX_SetCullMode (GX_CULL_NONE); + GX_SetDispCopyGamma (GX_GM_1_0); + GX_SetZMode(GX_FALSE, GX_ALWAYS, GX_TRUE); + GX_SetColorUpdate (GX_TRUE); + guOrtho(p, vmode->efbHeight/2, -(vmode->efbHeight/2), -(vmode->fbWidth/2), vmode->fbWidth/2, 100, 1000); + GX_LoadProjectionMtx (p, GX_ORTHOGRAPHIC); + + /*** reset XFB ***/ + GX_CopyDisp (xfb[whichfb ^ 1], GX_TRUE); + + /*** Initialize texture data ***/ + memset (texturemem, 0, TEX_WIDTH * TEX_HEIGHT * 2); +} + +/* set GX scaler */ +static void gxScale(void) +{ + int xscale, yscale, xshift, yshift, i; + + if (config.overscan) + { + if (config.aspect) + { + /* borders are emulated */ + xscale = (reg[12] & 1) ? 360 : 358; + if (gc_pal) xscale -= 1; + yscale = (gc_pal && !config.render) ? (vdp_pal ? 144:143) : (vdp_pal ? 121:120); + } + else + { + /* fullscreen stretch */ + xscale = gc_pal ? 354 : 367; + yscale = (gc_pal && !config.render) ? (vdp_pal ? (268*144 / bitmap.viewport.h):143) : (vdp_pal ? (224*144 / bitmap.viewport.h):120); + } + + xshift = (config.aspect || !gc_pal) ? 8 : 4; + yshift = vdp_pal ? 1 : -1; + } + else + { + if (config.aspect) + { + /* borders are simulated (black) */ + xscale = 327; + yscale = bitmap.viewport.h / 2; + if (vdp_pal && (!gc_pal || config.render)) yscale = yscale * 243 / 288; + else if (!vdp_pal && gc_pal && !config.render) yscale = yscale * 288 / 243; + } + else + { + /* fullscreen stretch */ + xscale = gc_pal ? 321 : 334; + yscale = (gc_pal && !config.render) ? 134 : 112; + } + + xshift = config.aspect ? 8 : 0; + yshift = vdp_pal ? 0 : 2; + } + + if (!config.aspect) + { + xscale += config.xscale; + yscale += config.yscale; + } + + xshift += config.xshift; + yshift += config.yshift; + + /* check horizontal upscaling */ + if (xscale > 320) + { + /* let VI do horizontal scaling */ + uint32 scale = (xscale <= 360) ? xscale : 360; + for (i=0; i<6; i++) + { + tvmodes[i]->viXOrigin = (720 - (scale * 2)) / 2; + tvmodes[i]->viWidth = scale * 2; + } + xscale -= (scale - 320); + } + else + { + /* let GX do horizontal downscaling */ + for (i=0; i<6; i++) + { + tvmodes[i]->viXOrigin = 40; + tvmodes[i]->viWidth = 640; + } + } + + /* double resolution */ + if (config.render) + { + yscale *= 2; + yshift *= 2; + } + + /* update matrix */ + square[6] = square[3] = xscale + xshift; + square[0] = square[9] = -xscale + xshift; + square[4] = square[1] = yscale + yshift; + square[7] = square[10] = -yscale + yshift; + draw_init(); + + /* vertex array have been modified */ + GX_InvVtxCache (); + +} + +/* Reinitialize GX */ +void ogc_video__reset() +{ + GXRModeObj *rmode; + Mtx p; + + /* reinitialize GC/Wii PAL mode */ + if ((config.tv_mode == 1) || ((config.tv_mode == 2) && vdp_pal)) gc_pal = 1; + else gc_pal = 0; + + /* reset scaler */ + gxScale(); + + /* reinitialize current TV mode */ + if (config.render == 2) + { + tvmodes[2]->viTVMode = VI_TVMODE_NTSC_PROG; + tvmodes[2]->xfbMode = VI_XFBMODE_SF; + } + else + { + tvmodes[2]->viTVMode = tvmodes[0]->viTVMode & ~3; + tvmodes[2]->xfbMode = VI_XFBMODE_DF; + } + + if (config.render) rmode = tvmodes[gc_pal*3 + 2]; + else rmode = tvmodes[gc_pal*3 + interlaced]; + + + VIDEO_Configure (rmode); + VIDEO_ClearFrameBuffer(rmode, xfb[whichfb], COLOR_BLACK); + VIDEO_Flush(); + VIDEO_WaitVSync(); + if (rmode->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync(); + else while (VIDEO_GetNextField()) VIDEO_WaitVSync(); + odd_frame = 1; + + /* reset rendering mode */ + GX_SetViewport (0.0F, 0.0F, rmode->fbWidth, rmode->efbHeight, 0.0F, 1.0F); + GX_SetScissor (0, 0, rmode->fbWidth, rmode->efbHeight); + f32 yScale = GX_GetYScaleFactor(rmode->efbHeight, rmode->xfbHeight); + u16 xfbHeight = GX_SetDispCopyYScale (yScale); + GX_SetDispCopySrc (0, 0, rmode->fbWidth, rmode->efbHeight); + GX_SetDispCopyDst (rmode->fbWidth, xfbHeight); + GX_SetCopyFilter (rmode->aa, rmode->sample_pattern, config.render ? GX_TRUE : GX_FALSE, rmode->vfilter); + GX_SetFieldMode (rmode->field_rendering, ((rmode->viHeight == 2 * rmode->xfbHeight) ? GX_ENABLE : GX_DISABLE)); + GX_SetPixelFmt (GX_PF_RGB8_Z24, GX_ZC_LINEAR); + guOrtho(p, rmode->efbHeight/2, -(rmode->efbHeight/2), -(rmode->fbWidth/2), rmode->fbWidth/2, 100, 1000); + GX_LoadProjectionMtx (p, GX_ORTHOGRAPHIC); +} + +/* GX render update */ +void ogc_video__update() +{ + int h, w; + + /* texture and bitmap buffers (buffers width is fixed to 360 pixels) */ + long long int *dst = (long long int *)texturemem; + long long int *src1 = (long long int *)(bitmap.data); /* line n */ + long long int *src2 = src1 + 90; /* line n+1 */ + long long int *src3 = src2 + 90; /* line n+2 */ + long long int *src4 = src3 + 90; /* line n+3 */ + + /* check if viewport has changed */ + if (bitmap.viewport.changed) + { + /* Check interlaced mode changes */ + if ((bitmap.viewport.changed & 2) && (!config.render)) + { + GXRModeObj *rmode; + rmode = tvmodes[gc_pal*3 + interlaced]; + VIDEO_Configure (rmode); + GX_SetFieldMode (rmode->field_rendering, ((rmode->viHeight == 2 * rmode->xfbHeight) ? GX_ENABLE : GX_DISABLE)); + VIDEO_WaitVSync(); + if (rmode->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync(); + else while (VIDEO_GetNextField()) VIDEO_WaitVSync(); + } + + bitmap.viewport.changed = 0; + + /* update texture size */ + vwidth = bitmap.viewport.w + 2 * bitmap.viewport.x; + vheight = bitmap.viewport.h + 2 * bitmap.viewport.y; + if (interlaced && config.render) vheight *= 2; + stride = bitmap.width - (vwidth >> 2); + + /* reset GX scaler */ + gxScale(); + + /* reinitialize texture */ + GX_InvalidateTexAll (); + GX_InitTexObj (&texobj, texturemem, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); + + /* original H40 mode: force filtering OFF */ + if (!config.render && (reg[12]&1)) + { + GX_InitTexObjLOD(&texobj,GX_NEAR,GX_NEAR_MIP_NEAR,2.5,9.0,0.0,GX_FALSE,GX_FALSE,GX_ANISO_1); + } + } + + GX_InvalidateTexAll (); + + /* update texture data */ + for (h = 0; h < vheight; h += 4) + { + for (w = 0; w < (vwidth >> 2); w++) + { + *dst++ = *src1++; + *dst++ = *src2++; + *dst++ = *src3++; + *dst++ = *src4++; + } + + /* jump to next four lines */ + src1 += stride; + src2 += stride; + src3 += stride; + src4 += stride; + } + + /* load texture into GX */ + DCFlushRange (texturemem, vwidth * vheight * 2); + GX_LoadTexObj (&texobj, GX_TEXMAP0); + + /* render textured quad */ + draw_square (); + GX_DrawDone (); + + /* switch external framebuffers then copy EFB to XFB */ + whichfb ^= 1; + GX_CopyDisp (xfb[whichfb], GX_TRUE); + GX_Flush (); + + /* set next XFB */ + VIDEO_SetNextFramebuffer (xfb[whichfb]); + VIDEO_Flush (); +} + +/* Initialize VIDEO subsystem */ +void ogc_video__init(void) +{ + /* + * Before doing anything else under libogc, + * Call VIDEO_Init + */ + VIDEO_Init (); + + /* + * Before any memory is allocated etc. + * Rescue any tagged ROM in data 2 + */ + int *romptr = (int *)0x80700000; + StartARAM(); + genromsize = 0; + if ( memcmp((char *)romptr,"GENPLUSR",8) == 0 ) + { + genromsize = romptr[2]; + ARAMPut ((char *) 0x80700000 + 0x20, (char *) 0x8000, genromsize); + } + + /* Get the current video mode then : + - set menu video mode (fullscreen, 480i or 576i) + - set emulator rendering TV modes (PAL/MPAL/NTSC/EURGB60) + */ + vmode = VIDEO_GetPreferredMode(NULL); + + /* adjust display settings */ + switch (vmode->viTVMode >> 2) + { + case VI_PAL: /* 576 lines (PAL 50Hz) */ + + TV60hz_240p.viTVMode = VI_TVMODE_EURGB60_DS; + TV60hz_240i.viTVMode = VI_TVMODE_EURGB60_INT; + TV60hz_480i.viTVMode = VI_TVMODE_EURGB60_INT; + config.tv_mode = 1; + gc_pal = 1; + + /* display should be centered vertically (borders) */ + vmode = &TVPal574IntDfScale; + vmode->xfbHeight = 480; + vmode->viYOrigin = (VI_MAX_HEIGHT_PAL - 480)/2; + vmode->viHeight = 480; + + break; + + case VI_NTSC: /* 480 lines (NTSC 60hz) */ + TV60hz_240p.viTVMode = VI_TVMODE_NTSC_DS; + TV60hz_240i.viTVMode = VI_TVMODE_NTSC_INT; + TV60hz_480i.viTVMode = VI_TVMODE_NTSC_INT; + config.tv_mode = 0; + gc_pal = 0; + break; + + default: /* 480 lines (PAL 60Hz) */ + TV60hz_240p.viTVMode = VI_TVMODE(vmode->viTVMode >> 2, VI_NON_INTERLACE); + TV60hz_240i.viTVMode = VI_TVMODE(vmode->viTVMode >> 2, VI_INTERLACE); + TV60hz_480i.viTVMode = VI_TVMODE(vmode->viTVMode >> 2, VI_INTERLACE); + config.tv_mode = 2; + gc_pal = 0; + break; + } + + /* configure video mode */ + VIDEO_Configure (vmode); + + /* Configure the framebuffers (double-buffering) */ + xfb[0] = (u32 *) MEM_K0_TO_K1((u32 *) SYS_AllocateFramebuffer(&TV50hz_576i)); + xfb[1] = (u32 *) MEM_K0_TO_K1((u32 *) SYS_AllocateFramebuffer(&TV50hz_576i)); + + /* Define a console */ + console_init(xfb[0], 20, 64, 640, 574, 574 * 2); + + /* Clear framebuffers to black */ + VIDEO_ClearFrameBuffer (vmode, xfb[0], COLOR_BLACK); + VIDEO_ClearFrameBuffer (vmode, xfb[1], COLOR_BLACK); + + /* Set the framebuffer to be displayed at next VBlank */ + VIDEO_SetNextFramebuffer (xfb[0]); + + /* Register Video Retrace handlers */ + VIDEO_SetPreRetraceCallback(framestart); + + /* Enable Video Interface */ + VIDEO_SetBlack (FALSE); + + /* Update video settings for next VBlank */ + VIDEO_Flush (); + + /* Wait for VBlank */ + VIDEO_WaitVSync(); + VIDEO_WaitVSync(); + + /* initialize GUI */ + unpackBackdrop (); + init_font(); + + /* Initialize GX */ + gxStart(); +} diff --git a/source/ngc/ogc_video.h b/source/ngc/ogc_video.h new file mode 100644 index 0000000..eac3e04 --- /dev/null +++ b/source/ngc/ogc_video.h @@ -0,0 +1,34 @@ +/****************************************************************************** + * + * SMS Plus - Sega Master System / GameGear Emulator + * + * NGC/Wii Video support + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ***************************************************************************/ +#ifndef _GC_VIDEO_H_ +#define _GC_VIDEO_H_ + +extern void ogc_video__init(void); +extern void ogc_video__update(void); +extern void ogc_video__reset(void); + +extern u8 gc_pal; +extern unsigned int *xfb[2]; +extern int whichfb; +extern GXRModeObj *tvmodes[6]; +extern GXRModeObj *vmode; + +#endif diff --git a/source/ngc/osd.h b/source/ngc/osd.h index 4fca201..cc3bc34 100644 --- a/source/ngc/osd.h +++ b/source/ngc/osd.h @@ -1,17 +1,47 @@ - -#ifndef _OSD_H_ -#define _OSD_H_ - -#define NGC 1 - -#include -#include -#include -#include -#include -#include -#include - -extern void error (char *format, ...); - -#endif /* _OSD_H_ */ + +#ifndef _OSD_H_ +#define _OSD_H_ + +#define NGC 1 + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ogc_input.h" +#include "ogc_audio.h" +#include "ogc_video.h" +#include "config.h" +#include "history.h" + +#define update_input() ogc_input__update() + +/* globals */ +extern u32 diff_usec(long long start,long long end); +extern long long gettime(); +extern void error(char *format, ...); +extern int getcompany(); +extern void reloadrom(); +extern void ClearGGCodes(); +extern void GetGGEntries(); +extern void legal(); +extern void MainMenu(); +extern void set_region(); +extern int ManageSRAM(u8 direction, u8 device); +extern int ManageState(u8 direction, u8 device); +extern void OpenDVD(); +extern int OpenSD(); +extern void OpenHistory(); +extern void memfile_autosave(); +extern void memfile_autoload(); + +extern int peripherals; +extern int frameticker; +extern int FramesPerSecond; + +#endif /* _OSD_H_ */ diff --git a/source/ngc/png/crosshair-1.c b/source/ngc/png/crosshair-1.c new file mode 100644 index 0000000..b6fd5de --- /dev/null +++ b/source/ngc/png/crosshair-1.c @@ -0,0 +1,1863 @@ +/* + This file was autogenerated by raw2c. +Visit http://www.devkitpro.org +*/ + +const unsigned char crosshair-1[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1e, 0x84, 0x5a, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, + 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x30, 0x36, 0x2f, 0x32, + 0x34, 0x2f, 0x30, 0x38, 0x86, 0x74, 0x9e, 0x5f, 0x00, 0x00, 0x00, 0x20, 0x74, 0x45, 0x58, 0x74, + 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x4d, 0x58, + 0xbb, 0x91, 0x2a, 0x24, 0x00, 0x00, 0x01, 0xda, 0x70, 0x72, 0x56, 0x57, 0x78, 0x9c, 0xed, 0x98, + 0x49, 0x52, 0xc4, 0x30, 0x0c, 0x45, 0x6d, 0xcb, 0x26, 0x37, 0xcd, 0xba, 0xaf, 0x93, 0xcb, 0x70, + 0x00, 0x2a, 0x77, 0xe1, 0x06, 0x80, 0xe5, 0x81, 0x28, 0xb6, 0xa0, 0xd8, 0xc8, 0xcd, 0xe2, 0x3f, + 0x35, 0x45, 0x55, 0xf7, 0xe2, 0x6b, 0xb2, 0x3c, 0xbc, 0x7d, 0xbc, 0xbe, 0xbb, 0x87, 0x7b, 0x7c, + 0x32, 0xe7, 0x79, 0xf2, 0xdf, 0x71, 0xe4, 0xcf, 0xb1, 0xef, 0xe7, 0xbe, 0x1f, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x13, 0xd3, 0xd6, 0xa1, 0xf0, + 0x44, 0xf1, 0xe6, 0xc2, 0x4a, 0x75, 0x2a, 0x92, 0x29, 0x12, 0xf9, 0x40, 0x54, 0x7d, 0x49, 0x71, + 0x99, 0x7a, 0xaa, 0x39, 0xf7, 0xd9, 0xc8, 0x15, 0x2b, 0x0e, 0xa5, 0x35, 0x55, 0x60, 0xad, 0x44, + 0x4d, 0xf8, 0xb2, 0x55, 0x45, 0x88, 0xac, 0x43, 0xae, 0x44, 0x2f, 0x32, 0xe0, 0x88, 0x7f, 0xb0, + 0xaf, 0x41, 0x91, 0xaf, 0x82, 0x3e, 0xf8, 0xbb, 0x17, 0x0b, 0x1c, 0x60, 0x8d, 0x31, 0xf3, 0xb7, + 0x1a, 0xd8, 0x96, 0x20, 0x5c, 0xd1, 0x6b, 0x16, 0x72, 0x67, 0x9a, 0xea, 0xa7, 0x5f, 0xe5, 0xcb, + 0x3a, 0x48, 0x86, 0xf2, 0x91, 0x0b, 0x3c, 0x64, 0xdc, 0x91, 0x68, 0x03, 0x1f, 0x4d, 0x2b, 0xc0, + 0x6b, 0x5c, 0x74, 0x7c, 0xb6, 0x29, 0x1f, 0x96, 0x15, 0xa0, 0xb2, 0xf2, 0x86, 0xf8, 0x65, 0xf4, + 0xec, 0x9c, 0x61, 0x02, 0x6a, 0xf8, 0xd9, 0x64, 0xfc, 0x7e, 0x70, 0xc0, 0x30, 0x01, 0x53, 0xf5, + 0x95, 0xf8, 0xb9, 0x03, 0x8c, 0xe4, 0xa3, 0x08, 0x56, 0xc6, 0x3f, 0xb9, 0x64, 0x54, 0x80, 0x1c, + 0xbe, 0x32, 0x71, 0xa6, 0x45, 0xb8, 0x59, 0x25, 0xa0, 0xea, 0xf7, 0x3e, 0xab, 0xff, 0xee, 0xc3, + 0xb8, 0xed, 0x03, 0x46, 0x23, 0xe0, 0xea, 0xfe, 0xab, 0xda, 0x1c, 0xff, 0xaa, 0x06, 0xd0, 0x66, + 0x9f, 0xf2, 0x1d, 0xd9, 0xe9, 0xf7, 0x56, 0xdb, 0x34, 0x64, 0x4f, 0x18, 0xe9, 0xf7, 0x1c, 0xab, + 0xfa, 0xdf, 0x9b, 0x90, 0x61, 0xfe, 0xff, 0xd2, 0xff, 0x86, 0xf1, 0xd3, 0x38, 0x6c, 0xc2, 0xda, + 0xfa, 0xc7, 0x51, 0xde, 0x8f, 0xf1, 0xe7, 0x35, 0x68, 0xd6, 0xff, 0x49, 0x1d, 0x36, 0x4a, 0xfa, + 0x8d, 0x0e, 0x61, 0x51, 0x15, 0x53, 0x5d, 0xb2, 0x41, 0x69, 0x40, 0xe1, 0x52, 0x9b, 0x80, 0xe9, + 0xc5, 0x70, 0xff, 0x9b, 0xa2, 0xed, 0xdf, 0xc8, 0x8e, 0x34, 0xd3, 0xa7, 0xb2, 0x02, 0xb8, 0xc5, + 0xe7, 0xf8, 0xfb, 0x29, 0xdc, 0xf2, 0xfc, 0xe1, 0xe6, 0xd3, 0xef, 0x94, 0x11, 0xc3, 0xf0, 0x4b, + 0x02, 0xe6, 0x2d, 0xf8, 0x66, 0xc9, 0xf6, 0x06, 0x90, 0xb4, 0x19, 0x28, 0xf6, 0x43, 0xbb, 0xc5, + 0x57, 0xe1, 0xd3, 0x1d, 0xc9, 0xf3, 0xdf, 0x54, 0x0e, 0xdb, 0xfb, 0x07, 0x2b, 0x28, 0x77, 0x5f, + 0x21, 0x6f, 0x7d, 0x05, 0x6e, 0xd7, 0x5f, 0xcd, 0xe2, 0x92, 0x1b, 0x38, 0xfd, 0xe0, 0x80, 0x5f, + 0x23, 0xdf, 0xde, 0x1f, 0x62, 0x19, 0x39, 0x42, 0x7e, 0xd9, 0xfb, 0x43, 0x6d, 0x42, 0x7e, 0xfc, + 0xe9, 0x57, 0xb1, 0x7a, 0xe6, 0x33, 0x6f, 0x3d, 0x41, 0x7f, 0x71, 0x8a, 0x94, 0x89, 0x55, 0x7c, + 0x5b, 0xfa, 0x06, 0x17, 0x9e, 0xfa, 0xfe, 0x56, 0x3c, 0xa0, 0xad, 0x05, 0xce, 0x33, 0x11, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x33, + 0xbe, 0x00, 0x51, 0xd5, 0x26, 0x86, 0xe8, 0x6c, 0x41, 0x26, 0x00, 0x00, 0x00, 0x48, 0x6d, 0x6b, + 0x42, 0x46, 0xfa, 0xde, 0xca, 0xfe, 0x00, 0x00, 0x00, 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, 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, 0x29, 0xa4, 0x33, 0xa1, 0x00, 0x00, + 0x1f, 0x8d, 0x6d, 0x6b, 0x54, 0x53, 0x78, 0x9c, 0xed, 0x5d, 0x5b, 0x73, 0xdc, 0x36, 0xb2, 0xe6, + 0x66, 0x37, 0x9b, 0x48, 0x76, 0xec, 0x38, 0xd9, 0xda, 0x3d, 0x55, 0xe7, 0x45, 0x55, 0xa7, 0x4e, + 0xed, 0x53, 0xb4, 0x04, 0xef, 0x7c, 0xd4, 0x68, 0x34, 0x92, 0xd6, 0x23, 0x69, 0x76, 0x66, 0xe4, + 0xd8, 0x79, 0x49, 0xcd, 0x8d, 0xb6, 0x36, 0xf2, 0x65, 0x25, 0x59, 0x1b, 0x9f, 0x29, 0xfe, 0xe0, + 0xfd, 0x17, 0xa7, 0xbb, 0x01, 0x70, 0x08, 0x90, 0xc3, 0xcb, 0xe8, 0x1e, 0xd3, 0x2a, 0x8b, 0x1c, + 0x80, 0x00, 0x81, 0x0f, 0xdd, 0x5f, 0x37, 0x1a, 0xc0, 0xe8, 0xe0, 0x79, 0xeb, 0x72, 0xde, 0xe9, + 0x6f, 0x9f, 0xcc, 0x59, 0xdc, 0xff, 0xc7, 0xe1, 0xc9, 0xdc, 0x9a, 0xd8, 0xb3, 0x71, 0x30, 0xf1, + 0xe3, 0x97, 0xdd, 0xed, 0x68, 0x6e, 0x79, 0x56, 0xfc, 0x0a, 0x6f, 0x58, 0x60, 0xc6, 0x3f, 0xee, + 0xb7, 0xa3, 0xb9, 0xe3, 0xc4, 0x7b, 0xfb, 0x43, 0xba, 0xf6, 0x77, 0x06, 0xd1, 0xdc, 0xb7, 0xe2, + 0xfe, 0xe0, 0xf8, 0x64, 0x6e, 0xc6, 0xad, 0x5d, 0xa8, 0x25, 0xa2, 0x7f, 0x71, 0xaf, 0xdb, 0xbd, + 0x9c, 0xb7, 0x7a, 0xf0, 0x6b, 0x7b, 0x6b, 0x78, 0x3e, 0x37, 0xd6, 0x8c, 0xb1, 0x31, 0x31, 0x7e, + 0x36, 0x7a, 0xc6, 0xcc, 0x78, 0x07, 0x77, 0x27, 0xc6, 0x69, 0xbc, 0x7f, 0x78, 0x00, 0x39, 0x7f, + 0x81, 0x9c, 0x77, 0x90, 0xc3, 0x8c, 0x1f, 0x20, 0xf7, 0xc4, 0xf8, 0x15, 0x9e, 0x38, 0x35, 0x36, + 0x8c, 0x2d, 0x48, 0xbd, 0x80, 0xcf, 0x3f, 0xc0, 0xdd, 0x29, 0x5c, 0x47, 0xc6, 0x39, 0xe4, 0x4c, + 0xe3, 0x7e, 0xfb, 0x68, 0x8c, 0x2f, 0xdb, 0x3a, 0xa4, 0x77, 0x6e, 0x0d, 0x4e, 0xe6, 0xf6, 0x2c, + 0x88, 0x5b, 0xed, 0x7d, 0xec, 0x42, 0xeb, 0xe0, 0x00, 0xda, 0x00, 0x17, 0x48, 0x1e, 0xc5, 0xad, + 0xc1, 0x0e, 0x3d, 0x34, 0xe8, 0x50, 0xde, 0x60, 0x8f, 0x2e, 0xad, 0x2e, 0x25, 0xb6, 0x9e, 0xd3, + 0x65, 0xfb, 0x50, 0x54, 0xb0, 0xd3, 0xa1, 0xcf, 0xfd, 0x21, 0x3d, 0xd4, 0x69, 0xf1, 0x4b, 0x9f, + 0x12, 0x0f, 0x79, 0xe2, 0xa0, 0x77, 0x32, 0x0f, 0xbd, 0xb8, 0x35, 0x6c, 0x51, 0xea, 0x90, 0xd7, + 0x3e, 0x1c, 0xf0, 0x97, 0x1c, 0xf0, 0xfa, 0xf8, 0x65, 0x7f, 0x6b, 0x0c, 0x25, 0xe2, 0x4a, 0x10, + 0xac, 0xe7, 0x41, 0x70, 0x9b, 0x1d, 0x35, 0xaf, 0xd8, 0x51, 0xb3, 0x62, 0x47, 0x9f, 0x89, 0x8e, + 0x6e, 0x1b, 0xef, 0x61, 0x4c, 0xdf, 0x1b, 0x67, 0x38, 0xa2, 0x30, 0xd6, 0xe9, 0x27, 0xd3, 0xdd, + 0x76, 0x47, 0xbc, 0xdf, 0x96, 0x2b, 0xfa, 0xed, 0xf0, 0x7e, 0xcf, 0x94, 0x7e, 0x8f, 0x94, 0x7e, + 0x9b, 0x55, 0xfa, 0x6d, 0x56, 0x1f, 0xe0, 0x11, 0xef, 0x37, 0xcb, 0xef, 0xf7, 0x60, 0xf0, 0xd3, + 0xc9, 0xdc, 0xf3, 0xe2, 0x41, 0xef, 0x08, 0x9b, 0x39, 0x82, 0x04, 0x79, 0xd3, 0x6b, 0xf1, 0x9c, + 0x81, 0xb8, 0xf6, 0xba, 0xe2, 0x33, 0xbf, 0x56, 0x43, 0xec, 0x91, 0x40, 0x6c, 0x17, 0xb0, 0x1a, + 0x19, 0x1f, 0x8c, 0x37, 0x90, 0x77, 0x61, 0xcc, 0x0a, 0x85, 0x23, 0x17, 0x24, 0xb3, 0x02, 0x48, + 0x93, 0x49, 0x65, 0x90, 0x26, 0x01, 0x07, 0xc9, 0xb6, 0x54, 0xf1, 0xc8, 0x85, 0x89, 0x41, 0xe7, + 0x01, 0xa6, 0xc9, 0x98, 0xc3, 0x85, 0xd7, 0x1c, 0xb8, 0xa0, 0x3d, 0xcc, 0x0a, 0x39, 0x3e, 0x78, + 0x93, 0x06, 0xe8, 0x6b, 0x01, 0x50, 0x8b, 0x68, 0xe0, 0xc4, 0x98, 0x08, 0x78, 0x1e, 0x0b, 0x78, + 0x06, 0x20, 0x4c, 0x11, 0x00, 0xb3, 0x61, 0x74, 0x21, 0xf7, 0xdd, 0x2a, 0x00, 0xb1, 0xc8, 0xa9, + 0x2f, 0x47, 0x45, 0x44, 0x61, 0x4f, 0xf2, 0xf4, 0x67, 0x09, 0x40, 0x75, 0x3a, 0xbb, 0x07, 0xe9, + 0x67, 0xa4, 0x37, 0x2b, 0x77, 0xb6, 0x8a, 0x34, 0xd4, 0xa0, 0x8a, 0x1a, 0x5d, 0x35, 0x2b, 0x75, + 0xf5, 0x69, 0x66, 0x5c, 0xfb, 0x70, 0xf7, 0x11, 0xd2, 0xa6, 0xa5, 0x46, 0xa0, 0xd2, 0xe8, 0x5e, + 0xd9, 0x0c, 0x5c, 0xfb, 0xe8, 0x3e, 0xcd, 0x8c, 0xee, 0x15, 0xbb, 0x7c, 0xcd, 0xe6, 0x60, 0xe5, + 0x31, 0xfe, 0x46, 0x74, 0xf8, 0x47, 0xe8, 0x18, 0x50, 0x17, 0x74, 0x6e, 0x22, 0xe9, 0x5f, 0x74, + 0xfd, 0x6b, 0xd1, 0xf5, 0x21, 0xd1, 0xdb, 0xc4, 0xf8, 0xa5, 0xb0, 0xb3, 0x56, 0x90, 0xd7, 0x5b, + 0x6b, 0x3c, 0xa9, 0xd0, 0x5f, 0xd7, 0xaa, 0xcc, 0x70, 0x9e, 0x23, 0x19, 0x8e, 0x77, 0x98, 0xb9, + 0xb3, 0x62, 0x4b, 0xd0, 0x13, 0x96, 0x60, 0xa9, 0x45, 0xa8, 0x07, 0xca, 0x57, 0x0a, 0x28, 0xef, + 0x0a, 0x21, 0x89, 0x38, 0x22, 0x4c, 0xf8, 0x03, 0xd8, 0x74, 0xc4, 0x24, 0x1a, 0x55, 0x80, 0x64, + 0xec, 0x55, 0x86, 0x04, 0xcd, 0x71, 0x65, 0x99, 0x27, 0x3c, 0xac, 0x71, 0xc4, 0x01, 0xe1, 0x14, + 0x0f, 0x40, 0xd8, 0x6c, 0xca, 0x11, 0xc1, 0x9b, 0xd5, 0xc4, 0x64, 0x0f, 0x72, 0x47, 0xc6, 0xa5, + 0xf1, 0xa9, 0x10, 0x13, 0x1c, 0xb7, 0x94, 0x98, 0x90, 0x0b, 0x51, 0x9d, 0x09, 0x6a, 0x08, 0x8a, + 0xf4, 0x17, 0x98, 0x35, 0xe1, 0xb8, 0xd8, 0xd3, 0x0a, 0x92, 0xc2, 0x71, 0x90, 0x10, 0x21, 0x32, + 0xd8, 0x30, 0x42, 0x86, 0x6e, 0xfa, 0x47, 0x5c, 0x8a, 0xfa, 0xf0, 0x3e, 0x06, 0x65, 0xfa, 0x7b, + 0x0b, 0x2f, 0x82, 0x0c, 0xa9, 0xb8, 0xf6, 0xb3, 0xde, 0xc4, 0x63, 0x81, 0xe4, 0x16, 0xc8, 0xcd, + 0x19, 0xf0, 0x48, 0x0b, 0x7e, 0x7f, 0x04, 0xae, 0x79, 0xa3, 0xe1, 0xb8, 0x60, 0xa0, 0x42, 0x1c, + 0x27, 0x0a, 0x8e, 0x52, 0xb6, 0x28, 0xbf, 0x14, 0xc6, 0xc0, 0x29, 0x80, 0x91, 0x7c, 0x87, 0x14, + 0x90, 0xd3, 0x3a, 0x0c, 0x43, 0x20, 0x72, 0xc8, 0x52, 0x2e, 0x05, 0xb6, 0x8a, 0x30, 0x84, 0x84, + 0x3a, 0x90, 0x3c, 0x4a, 0x94, 0x6d, 0x06, 0xde, 0xf7, 0x05, 0xe4, 0x9d, 0x95, 0x92, 0xae, 0x26, + 0x60, 0xa3, 0x2a, 0xb8, 0xb0, 0x50, 0x20, 0x43, 0x74, 0x55, 0x19, 0x99, 0x5a, 0xde, 0x96, 0xc4, + 0x86, 0x7c, 0xa9, 0x0a, 0xd8, 0x3c, 0x11, 0xd8, 0x6c, 0x83, 0x38, 0x9c, 0xd2, 0x54, 0xeb, 0x75, + 0xe2, 0x6c, 0x7e, 0x12, 0xf8, 0xac, 0xa5, 0x44, 0xe6, 0x2d, 0xdc, 0xbf, 0x37, 0xde, 0x17, 0xcf, + 0x4f, 0x84, 0x45, 0x62, 0x76, 0x65, 0x93, 0xc4, 0x4c, 0xa7, 0xbe, 0xaf, 0xee, 0x9a, 0x42, 0xf7, + 0x50, 0xa9, 0x87, 0x82, 0xf2, 0xca, 0x48, 0xc9, 0x0e, 0x2c, 0x8e, 0x8c, 0x4e, 0x41, 0x55, 0x90, + 0x28, 0x56, 0x1e, 0x7f, 0xca, 0x81, 0x08, 0x26, 0x1c, 0x87, 0xd9, 0x35, 0x39, 0x5f, 0x66, 0x91, + 0x61, 0xb6, 0x56, 0xf4, 0x44, 0xaa, 0x74, 0xf7, 0x8f, 0xa2, 0xbb, 0x3f, 0x82, 0x3a, 0x5c, 0xe4, + 0x76, 0xd5, 0xd7, 0x86, 0x5c, 0xf3, 0xbb, 0x8a, 0x9c, 0x6a, 0x2c, 0xaa, 0xf4, 0xd6, 0x2a, 0x1f, + 0xf1, 0x5a, 0x7e, 0x17, 0xcd, 0xc1, 0x88, 0x2d, 0x5b, 0x2b, 0x89, 0xbd, 0x1c, 0xec, 0x7f, 0x00, + 0x21, 0x9c, 0xe0, 0x53, 0x0a, 0x02, 0x8e, 0xcb, 0x11, 0x60, 0x63, 0x0d, 0x02, 0x39, 0x2d, 0x37, + 0x39, 0x06, 0x93, 0x22, 0x46, 0x40, 0x81, 0x2d, 0x97, 0x7a, 0x22, 0xd2, 0x1c, 0xe7, 0x84, 0xc4, + 0xbd, 0x9a, 0x29, 0x56, 0xa4, 0x3e, 0x21, 0x84, 0x55, 0x89, 0xa0, 0x0f, 0xb9, 0x63, 0x22, 0x82, + 0x77, 0x85, 0x0a, 0xc0, 0xc2, 0xeb, 0xd5, 0x80, 0xeb, 0xf5, 0xc5, 0xd7, 0x92, 0x1e, 0x63, 0x3f, + 0x3f, 0x51, 0x6f, 0x56, 0xb1, 0x91, 0xaa, 0x89, 0xe4, 0xae, 0xe8, 0x6a, 0x1e, 0x78, 0x15, 0x8f, + 0xd4, 0x0a, 0xc4, 0xa8, 0x93, 0x35, 0x29, 0xb3, 0x03, 0xdc, 0x05, 0x55, 0x1c, 0x0d, 0xb2, 0x0c, + 0x47, 0xc2, 0x7f, 0x80, 0x96, 0x59, 0x11, 0xf7, 0x23, 0xe0, 0x5a, 0x0f, 0x9d, 0x6a, 0x0e, 0xbb, + 0xc6, 0x0c, 0x95, 0xe0, 0xa9, 0xa6, 0x16, 0xf9, 0xf8, 0x90, 0xb5, 0xdc, 0x11, 0xae, 0x6d, 0xa9, + 0x1f, 0x46, 0x56, 0x51, 0xc2, 0xd3, 0x97, 0x86, 0x53, 0x71, 0x55, 0x57, 0xc6, 0xe9, 0xab, 0x44, + 0x5b, 0x46, 0xc6, 0x2f, 0x25, 0xf3, 0x74, 0x31, 0xab, 0x09, 0x39, 0x48, 0xa4, 0xf0, 0x29, 0x90, + 0xcc, 0xab, 0xca, 0x90, 0xc3, 0x31, 0xe2, 0x4e, 0x6a, 0xae, 0x10, 0xa1, 0x77, 0x8f, 0x30, 0x59, + 0xd5, 0xa4, 0x28, 0x99, 0xda, 0x48, 0x74, 0x60, 0xc8, 0xf2, 0xd0, 0x79, 0x24, 0xd0, 0xe9, 0x50, + 0x5c, 0x17, 0xa7, 0xf2, 0x43, 0x90, 0x99, 0x0f, 0x2b, 0xcc, 0x72, 0x6a, 0xcf, 0x72, 0x2b, 0x7a, + 0x5b, 0xf9, 0xee, 0x7c, 0x75, 0x03, 0xc3, 0x27, 0x39, 0xad, 0xec, 0x24, 0xaf, 0xb8, 0xeb, 0x72, + 0xc2, 0xdf, 0x25, 0xa2, 0x7d, 0x43, 0xf9, 0x07, 0x34, 0xf9, 0xff, 0x05, 0xa7, 0x3f, 0x85, 0xc6, + 0x76, 0x92, 0xeb, 0x7a, 0x5a, 0x05, 0xb4, 0x4a, 0x03, 0x5f, 0x57, 0xa3, 0x9c, 0x7a, 0x58, 0xa4, + 0xa5, 0x82, 0x5b, 0x99, 0x34, 0x3a, 0x2c, 0x98, 0xd5, 0x40, 0xe7, 0x89, 0x40, 0xa7, 0x2d, 0x10, + 0x59, 0x8e, 0xcd, 0x12, 0x45, 0xaa, 0xc3, 0x36, 0x34, 0xb7, 0x2f, 0x9f, 0xb0, 0x5c, 0x09, 0x9c, + 0x96, 0x9c, 0xae, 0x64, 0x5d, 0x91, 0x6a, 0x48, 0xec, 0x09, 0x39, 0x39, 0x4d, 0xe4, 0x45, 0x47, + 0x42, 0x86, 0xcb, 0xd9, 0xc4, 0x12, 0xcc, 0x6b, 0x2a, 0xa4, 0x92, 0xcc, 0x81, 0x55, 0x52, 0xc9, + 0xb5, 0xbf, 0xe4, 0x51, 0xdf, 0x44, 0x5c, 0x20, 0xaf, 0xe3, 0xdb, 0xd0, 0x9d, 0x91, 0x98, 0xf1, + 0x8f, 0x92, 0xd8, 0xb7, 0xe4, 0x06, 0x11, 0x04, 0xac, 0x63, 0x63, 0x26, 0x95, 0x26, 0xfb, 0x0b, + 0x9d, 0xc0, 0x79, 0x55, 0x55, 0x2b, 0x33, 0xd3, 0xa6, 0xfb, 0x61, 0x89, 0x95, 0x41, 0x9b, 0x62, + 0xcd, 0x66, 0x70, 0xd3, 0xca, 0xfa, 0x5c, 0xc5, 0x08, 0x48, 0x6f, 0x6b, 0x9b, 0xa6, 0xa3, 0x38, + 0xf5, 0x2a, 0x8e, 0x79, 0x68, 0x28, 0x50, 0x13, 0x73, 0xbc, 0x70, 0x0d, 0x05, 0xff, 0x0a, 0xcc, + 0x30, 0x32, 0x65, 0xcc, 0xc3, 0xa9, 0x60, 0x6b, 0x55, 0x17, 0xb4, 0x25, 0xe9, 0x42, 0xa8, 0x46, + 0x7d, 0x5c, 0x7a, 0xe4, 0x9d, 0x5d, 0x94, 0x2f, 0x97, 0x69, 0xb8, 0x44, 0x4e, 0x05, 0x4e, 0x88, + 0x9c, 0x15, 0x84, 0x43, 0xfa, 0xe5, 0x02, 0x16, 0x72, 0x45, 0xaa, 0x46, 0x82, 0x12, 0xc7, 0x23, + 0x71, 0xd0, 0x78, 0x4a, 0x4b, 0x7a, 0x29, 0xf2, 0x66, 0x4f, 0xcc, 0x6a, 0x5e, 0x88, 0x6b, 0x5f, + 0x72, 0x4b, 0x5e, 0x70, 0x68, 0x09, 0xd7, 0xe4, 0x03, 0xbb, 0x4a, 0x1c, 0x24, 0x7f, 0xe2, 0xc7, + 0xb9, 0x66, 0x29, 0xb8, 0xc8, 0x50, 0x75, 0x65, 0x2e, 0x89, 0x82, 0xb8, 0x32, 0x24, 0x4b, 0x2a, + 0x58, 0x04, 0x6f, 0x1a, 0x3a, 0xcd, 0x2f, 0xf9, 0xa3, 0x00, 0xe2, 0x28, 0x67, 0xb5, 0x6d, 0x00, + 0x73, 0x9e, 0x53, 0x8a, 0x43, 0x66, 0x49, 0x56, 0xef, 0xfe, 0x28, 0x97, 0x78, 0xaa, 0xb8, 0xfe, + 0x18, 0x26, 0x5c, 0x3e, 0xe3, 0x9b, 0x8c, 0x72, 0x3b, 0x9f, 0xd0, 0x4e, 0x61, 0xa4, 0x43, 0xd0, + 0x0e, 0xf5, 0x3d, 0xbb, 0xd4, 0xd6, 0x97, 0x41, 0xc6, 0x5e, 0x7f, 0x11, 0x64, 0x24, 0xf7, 0x6d, + 0x90, 0x65, 0xa8, 0x3c, 0x9c, 0x9e, 0x25, 0xb3, 0xa3, 0x33, 0x12, 0x1f, 0x5c, 0xad, 0xb8, 0x15, + 0xcc, 0x90, 0x47, 0x2b, 0x60, 0x66, 0x09, 0x67, 0x77, 0x62, 0x69, 0xa0, 0x4d, 0xa5, 0xc0, 0x10, + 0x03, 0x94, 0x4f, 0x99, 0x08, 0xad, 0x74, 0xf8, 0x3a, 0x0b, 0x24, 0xbf, 0x91, 0x82, 0x86, 0x88, + 0x92, 0xd6, 0x22, 0xa4, 0x94, 0x52, 0x15, 0xd3, 0xf5, 0x44, 0xf6, 0x2e, 0x68, 0x1e, 0x81, 0xeb, + 0x3e, 0xe7, 0x55, 0x1c, 0x1d, 0x19, 0x63, 0x93, 0x91, 0x59, 0x36, 0x9a, 0x5d, 0x35, 0x32, 0x2b, + 0xf4, 0xce, 0xd5, 0xe6, 0x0c, 0xaa, 0x7d, 0x47, 0xbb, 0x87, 0x10, 0xb2, 0x3c, 0xc9, 0x4b, 0x42, + 0xd7, 0x91, 0x3a, 0x75, 0xa2, 0xf4, 0x41, 0x25, 0x65, 0x5c, 0x4f, 0x09, 0xd9, 0x09, 0xd1, 0xfc, + 0x69, 0xc9, 0x14, 0x6a, 0x54, 0x77, 0x82, 0x20, 0xc1, 0xa8, 0xb2, 0x06, 0x62, 0x6b, 0x60, 0xc8, + 0x59, 0xa6, 0xa4, 0x78, 0xf2, 0xbe, 0x33, 0xd3, 0x27, 0xc6, 0xe1, 0x20, 0x32, 0xde, 0xe2, 0x4a, + 0xd6, 0x93, 0x91, 0xfd, 0x3d, 0x32, 0xa3, 0xb9, 0xa4, 0x1d, 0x3a, 0x1c, 0x26, 0x56, 0x0e, 0xd3, + 0xf7, 0xf9, 0x94, 0x2d, 0x82, 0xdc, 0xd5, 0x80, 0xf3, 0x57, 0x04, 0xae, 0xd2, 0xbc, 0x4a, 0xcc, + 0x3c, 0xa3, 0x91, 0x16, 0xaa, 0x15, 0x62, 0xe4, 0x8c, 0x15, 0xdc, 0x1c, 0x25, 0x68, 0x95, 0x04, + 0xb1, 0xb9, 0x25, 0xec, 0x73, 0x41, 0x1a, 0xf4, 0x05, 0x52, 0xe2, 0x33, 0x22, 0x49, 0x82, 0x96, + 0x45, 0x4c, 0xce, 0xcd, 0xfb, 0x42, 0xa3, 0xde, 0x1b, 0x6f, 0x33, 0xfa, 0xf6, 0x2f, 0xc0, 0x6c, + 0x44, 0xa8, 0x15, 0xeb, 0x9b, 0xbb, 0x6a, 0x28, 0xab, 0xc6, 0x62, 0x12, 0x47, 0x27, 0x25, 0x5e, + 0xa5, 0xde, 0xe5, 0xd6, 0x22, 0xc2, 0xcf, 0x7c, 0xe1, 0x36, 0xf8, 0x1c, 0x2b, 0x89, 0x11, 0x51, + 0xfb, 0x9e, 0x24, 0xa6, 0x9c, 0xed, 0x15, 0xcb, 0x51, 0x7a, 0x94, 0x78, 0xa0, 0xef, 0xe1, 0x1a, + 0x61, 0x14, 0x18, 0x77, 0x65, 0xe5, 0xe1, 0xc4, 0x5c, 0x87, 0xe3, 0xe4, 0xa9, 0xab, 0x91, 0x02, + 0xa8, 0x4a, 0x8b, 0x91, 0x5e, 0x2e, 0x52, 0x66, 0x2e, 0x52, 0x14, 0xb7, 0xa8, 0xbc, 0x5c, 0xb4, + 0xb7, 0x25, 0xf8, 0xf8, 0x85, 0xbc, 0x21, 0x7a, 0xf2, 0xc4, 0xd2, 0x9a, 0xbe, 0x14, 0xb0, 0x1c, + 0x11, 0x39, 0x2b, 0x79, 0x45, 0x32, 0x53, 0x1c, 0xb1, 0x08, 0xea, 0xbb, 0x9d, 0x12, 0x89, 0x2a, + 0x7b, 0x71, 0x84, 0x66, 0x8d, 0x9d, 0x3c, 0x20, 0x34, 0xbd, 0x32, 0x0b, 0x82, 0xc1, 0x08, 0x00, + 0xc9, 0x10, 0x8a, 0x06, 0x4b, 0xc9, 0x08, 0x69, 0x94, 0xe6, 0x40, 0x2e, 0x47, 0x46, 0xae, 0x15, + 0x74, 0x90, 0x83, 0xf2, 0x70, 0x19, 0x3b, 0x0a, 0x4f, 0x4b, 0x01, 0xa9, 0xe3, 0x33, 0x15, 0xc2, + 0x42, 0x3e, 0x67, 0x5e, 0xb0, 0x2b, 0xdf, 0x70, 0x09, 0x64, 0xec, 0x22, 0x19, 0x11, 0xda, 0xd5, + 0x3f, 0x5a, 0x78, 0xda, 0x52, 0xab, 0xf0, 0xba, 0xb7, 0x27, 0x4b, 0xc8, 0x1b, 0x89, 0x65, 0x8e, + 0xeb, 0x5d, 0x2e, 0x53, 0x6d, 0x48, 0xbb, 0x28, 0x61, 0x21, 0x3b, 0x8f, 0x85, 0xb4, 0x25, 0x86, + 0x7c, 0x1a, 0x32, 0xab, 0x8b, 0x14, 0x21, 0x99, 0x45, 0x6e, 0xec, 0x14, 0x84, 0x08, 0x31, 0xbe, + 0xc3, 0xb9, 0x1a, 0x6f, 0x7a, 0x52, 0xbb, 0x06, 0x92, 0x80, 0xfa, 0xc2, 0xe9, 0x94, 0x76, 0x8f, + 0x84, 0xcc, 0xcf, 0x5d, 0xa6, 0x3d, 0x06, 0x34, 0xde, 0x91, 0x2f, 0xf9, 0x91, 0x7c, 0x21, 0x69, + 0xeb, 0xbe, 0x14, 0x38, 0xd9, 0x46, 0x7b, 0x85, 0x29, 0x89, 0x5f, 0x65, 0xc5, 0xba, 0xca, 0x7c, + 0xc4, 0x56, 0x27, 0x7b, 0x1a, 0x01, 0xf9, 0x79, 0xf6, 0x4c, 0xd0, 0x0c, 0x06, 0xc3, 0xea, 0x74, + 0xf8, 0xcf, 0xa2, 0xc3, 0x2f, 0xc8, 0x90, 0x4f, 0x68, 0x43, 0xd0, 0x39, 0x6d, 0x8e, 0xc5, 0x28, + 0x10, 0x6e, 0x16, 0xdc, 0xa0, 0x49, 0x30, 0x6e, 0x03, 0x2b, 0x0e, 0x90, 0xe4, 0x46, 0x0c, 0x79, + 0x80, 0xa0, 0x2a, 0x24, 0x76, 0x39, 0x24, 0x13, 0x55, 0x6c, 0x68, 0x69, 0x32, 0xeb, 0x1b, 0x39, + 0x8a, 0xdc, 0x88, 0xf8, 0x7b, 0x20, 0xa2, 0xef, 0x24, 0x3c, 0x42, 0xdd, 0x94, 0xdd, 0x10, 0xc4, + 0x50, 0x29, 0x0f, 0x20, 0x50, 0x1d, 0x80, 0x25, 0x2b, 0xfe, 0xcb, 0x90, 0x7d, 0x9c, 0x18, 0xb6, + 0x37, 0x14, 0x58, 0xc1, 0xc8, 0xdb, 0x2c, 0xb3, 0x9c, 0xa5, 0xa3, 0xe8, 0xad, 0xea, 0x61, 0xb2, + 0xea, 0xd1, 0xb4, 0x64, 0x3f, 0x89, 0xed, 0x55, 0x5d, 0xe6, 0xd9, 0x93, 0x13, 0x13, 0x79, 0xb3, + 0x27, 0x6f, 0x5e, 0xc8, 0x1b, 0xe2, 0x76, 0xd2, 0x50, 0x71, 0x53, 0x07, 0x2c, 0xe9, 0x2b, 0x1d, + 0x41, 0xfa, 0x05, 0x89, 0x5e, 0xd9, 0xae, 0x43, 0x96, 0x4b, 0x53, 0xd5, 0x36, 0x8d, 0x48, 0x79, + 0x73, 0xab, 0x3b, 0x95, 0x9a, 0x0a, 0x86, 0xcb, 0x5c, 0xf1, 0x15, 0x54, 0xf0, 0x9b, 0xc4, 0xbf, + 0x7e, 0x4f, 0xec, 0xfc, 0x06, 0xe6, 0xb9, 0x22, 0xea, 0x54, 0x8c, 0x40, 0xee, 0xf6, 0x90, 0x95, + 0xf6, 0x21, 0x16, 0x69, 0x5c, 0x90, 0xbb, 0xfa, 0x8f, 0x7b, 0xe4, 0x52, 0x08, 0x58, 0x0a, 0x09, + 0x71, 0x9b, 0xdf, 0x95, 0x37, 0x83, 0xac, 0xf7, 0x53, 0x86, 0xc9, 0x93, 0x14, 0x26, 0xbf, 0xd2, + 0x0a, 0xe0, 0x06, 0xed, 0xdb, 0xaa, 0x8d, 0x0a, 0xc5, 0xd6, 0x6a, 0x6c, 0x9b, 0x49, 0x90, 0x71, + 0xca, 0x1d, 0xc4, 0x1a, 0x0b, 0x39, 0x62, 0x1f, 0xb7, 0x35, 0xf1, 0x73, 0x56, 0x48, 0x29, 0x72, + 0x4f, 0x09, 0xf2, 0xe6, 0x45, 0x4b, 0x9d, 0x7f, 0xf4, 0x84, 0xcd, 0x1f, 0xe8, 0x4e, 0xc0, 0x9e, + 0x98, 0xd2, 0xbd, 0x90, 0x53, 0xbb, 0x9c, 0x58, 0x40, 0x19, 0xd6, 0x32, 0xd6, 0x92, 0xd0, 0x7c, + 0xcd, 0x58, 0x4b, 0xfe, 0x52, 0x51, 0x21, 0xdc, 0x99, 0xc5, 0xd7, 0x5c, 0xe6, 0xb7, 0xc3, 0x40, + 0x8d, 0xb6, 0x44, 0xb9, 0xf6, 0x30, 0x7f, 0x5e, 0x6c, 0x66, 0xb7, 0x84, 0x2f, 0xe2, 0x2c, 0xc2, + 0xb9, 0x4a, 0x4f, 0xf3, 0x88, 0xba, 0x10, 0x56, 0xdf, 0xe5, 0x30, 0x2e, 0xd9, 0xf3, 0x56, 0x86, + 0x62, 0x07, 0x70, 0xc3, 0xbd, 0x1c, 0x75, 0x23, 0x56, 0x2b, 0xa0, 0xa8, 0x8b, 0x2c, 0xcb, 0x05, + 0x71, 0xea, 0x28, 0x20, 0x8e, 0xf2, 0x09, 0x6d, 0x56, 0x10, 0x6a, 0xe1, 0xd0, 0x24, 0x71, 0xa7, + 0x94, 0x77, 0x55, 0x13, 0xa3, 0xf5, 0x85, 0x77, 0x05, 0xe8, 0xec, 0xd2, 0xde, 0xcb, 0x7f, 0xdf, + 0x38, 0xcb, 0xe7, 0xc2, 0xa2, 0xb2, 0xfc, 0x24, 0xd7, 0x19, 0x95, 0xa0, 0xa8, 0x6e, 0x7c, 0x9a, + 0xe5, 0xe3, 0x4e, 0xb7, 0x7d, 0x39, 0xef, 0xa4, 0xf7, 0x5e, 0x47, 0x84, 0xc0, 0x80, 0x76, 0x96, + 0x82, 0x14, 0x24, 0xeb, 0x09, 0x11, 0xf5, 0xfc, 0x90, 0xce, 0xa4, 0xbc, 0x25, 0x4c, 0x8e, 0x97, + 0xe6, 0x08, 0x44, 0x3a, 0xbc, 0x49, 0x1d, 0x4e, 0xd4, 0x1d, 0xde, 0x94, 0xce, 0x0e, 0x11, 0x50, + 0xa7, 0xdf, 0xa6, 0x47, 0xfa, 0x7d, 0x9e, 0x47, 0x3e, 0x79, 0xdc, 0x49, 0xcf, 0x05, 0x78, 0x4b, + 0xc4, 0x0e, 0x7e, 0x9c, 0x4b, 0x6a, 0x6d, 0x49, 0xe7, 0x1c, 0x2f, 0xcd, 0x59, 0xad, 0x2d, 0x90, + 0xb7, 0x9b, 0x34, 0xe5, 0x19, 0x34, 0x64, 0x92, 0x1c, 0x31, 0x99, 0x0a, 0xbf, 0xf2, 0x22, 0x75, + 0x48, 0xe7, 0x3c, 0x31, 0x85, 0x13, 0x11, 0x91, 0x43, 0xb5, 0x99, 0x18, 0xbf, 0x00, 0xe9, 0xcb, + 0x03, 0x29, 0x9d, 0xdd, 0x17, 0x00, 0xf5, 0xe1, 0x36, 0xaf, 0x7c, 0x1f, 0xee, 0x77, 0x7b, 0x11, + 0xbe, 0x8f, 0x1f, 0x0a, 0x33, 0xe9, 0x5f, 0x9c, 0xca, 0x62, 0x32, 0x4b, 0x9c, 0x18, 0xc3, 0xbc, + 0x57, 0x98, 0x67, 0x5e, 0xbd, 0x1e, 0xb6, 0x62, 0x15, 0x32, 0x0b, 0xff, 0x75, 0xd2, 0x6b, 0x26, + 0x91, 0x58, 0x33, 0x39, 0xa1, 0x15, 0x93, 0x8f, 0xd4, 0x7f, 0x7d, 0xc0, 0xfa, 0x02, 0xbd, 0xac, + 0xf0, 0xa4, 0x73, 0x56, 0x1b, 0x30, 0xbb, 0x19, 0xb0, 0x3a, 0x03, 0xf6, 0x44, 0x0c, 0x58, 0x1f, + 0x90, 0x99, 0x40, 0x6f, 0x71, 0xbe, 0xfd, 0x5a, 0x1b, 0xb6, 0x27, 0xc9, 0xe0, 0xe4, 0x3d, 0x73, + 0x5c, 0xe1, 0x99, 0xd5, 0x86, 0x72, 0xd4, 0x0c, 0x65, 0x9d, 0xa1, 0x5c, 0x4f, 0x74, 0x0f, 0x03, + 0x90, 0xe8, 0x6a, 0xa6, 0x0d, 0x56, 0x94, 0x0a, 0x4e, 0xca, 0xbc, 0xe3, 0x82, 0xbc, 0xd5, 0x86, + 0xcc, 0x69, 0x86, 0xac, 0xce, 0x90, 0x2d, 0xac, 0xec, 0x88, 0x4e, 0xf0, 0x2e, 0x76, 0x0d, 0x46, + 0x22, 0xe2, 0x2e, 0xd3, 0x8f, 0x97, 0xa4, 0xaf, 0x36, 0x4c, 0x6e, 0x33, 0x4c, 0xab, 0x0c, 0x53, + 0x8f, 0xdc, 0x89, 0x49, 0xea, 0x78, 0x48, 0x24, 0x26, 0x1c, 0x32, 0xfd, 0x78, 0x49, 0xfa, 0x6a, + 0xc3, 0xe4, 0x37, 0xc3, 0xb4, 0xca, 0x30, 0x75, 0x08, 0x91, 0x69, 0x82, 0x87, 0x1c, 0x8e, 0x45, + 0xfa, 0xf1, 0x92, 0xf4, 0xd5, 0x86, 0x29, 0x68, 0x86, 0xa9, 0xce, 0x30, 0x7d, 0x23, 0x86, 0x69, + 0x47, 0x6c, 0x9d, 0xff, 0x40, 0x54, 0x96, 0xb6, 0x56, 0xdf, 0x88, 0x81, 0xc9, 0x7b, 0xe2, 0xb8, + 0xf4, 0x89, 0xd5, 0x06, 0x31, 0x6c, 0x06, 0xb1, 0xce, 0x20, 0x7e, 0x25, 0x06, 0xb1, 0x45, 0x6b, + 0x7b, 0xe7, 0xc9, 0xea, 0x4c, 0x94, 0x9c, 0x05, 0x38, 0x4b, 0xf4, 0x4c, 0x4f, 0x5d, 0x6d, 0x80, + 0x26, 0xcd, 0x00, 0xd5, 0x19, 0xa0, 0xb5, 0xc4, 0xb1, 0x47, 0xed, 0xf8, 0x40, 0x1b, 0x1b, 0xf4, + 0x59, 0xd8, 0x22, 0x47, 0x9f, 0x85, 0x2d, 0x72, 0x56, 0x1b, 0xac, 0x69, 0x33, 0x58, 0xab, 0x58, + 0xae, 0x1f, 0xe9, 0xb4, 0xee, 0x2c, 0x63, 0xb9, 0x16, 0xe9, 0xc7, 0x4b, 0xd2, 0x57, 0x1b, 0xa6, + 0x59, 0x33, 0x4c, 0xab, 0xcc, 0xb0, 0x7a, 0x8b, 0x50, 0x68, 0xe2, 0xb2, 0xaf, 0x27, 0x3e, 0x5f, + 0x3a, 0xef, 0xb8, 0x20, 0x6f, 0xb5, 0x21, 0x8b, 0x94, 0x16, 0x3d, 0x4e, 0x04, 0x67, 0x66, 0x8c, + 0x8d, 0x36, 0x8d, 0xc1, 0x1b, 0x0a, 0xd1, 0xca, 0xb5, 0x3b, 0x29, 0x28, 0x7a, 0xfe, 0x71, 0x49, + 0xfe, 0x6a, 0xad, 0x63, 0x70, 0x6d, 0xb3, 0x14, 0x84, 0x9d, 0xb6, 0xa5, 0x7c, 0xb2, 0x95, 0x4f, + 0x8e, 0xf2, 0x69, 0x48, 0xdf, 0x87, 0x10, 0xef, 0x52, 0x28, 0x72, 0x15, 0xb9, 0x5c, 0x13, 0x72, + 0x39, 0xa0, 0x23, 0x88, 0x97, 0xd4, 0x8f, 0x85, 0x3c, 0x7a, 0x79, 0x42, 0x10, 0xda, 0xa1, 0x19, + 0x2a, 0x42, 0x60, 0x6e, 0x5a, 0x81, 0xcc, 0x75, 0x2c, 0xfc, 0x51, 0x73, 0x1d, 0x57, 0xe6, 0x8e, + 0xdd, 0xb1, 0x3d, 0x66, 0x6a, 0xae, 0x27, 0x33, 0x3d, 0xfa, 0xa7, 0x66, 0xfa, 0x49, 0xd1, 0xe9, + 0x0c, 0x7f, 0x72, 0x65, 0x2f, 0x30, 0xf1, 0x27, 0xab, 0x06, 0x0f, 0xaf, 0xf9, 0xd7, 0xa0, 0x7d, + 0x57, 0xa2, 0xa7, 0x84, 0x94, 0x16, 0x44, 0x55, 0x46, 0x4f, 0x92, 0x3b, 0x8a, 0x5a, 0x55, 0x85, + 0x9e, 0xaa, 0xd5, 0x73, 0x57, 0x00, 0x3d, 0x11, 0x00, 0x61, 0xce, 0x98, 0x8e, 0xb0, 0x5e, 0xd0, + 0x26, 0x48, 0x5c, 0xf0, 0x49, 0x33, 0x78, 0xae, 0xc8, 0x99, 0xa6, 0x1d, 0xa8, 0x5d, 0x4b, 0x8b, + 0x9c, 0x69, 0x5a, 0xe1, 0xc8, 0x5f, 0x26, 0x72, 0xa6, 0x39, 0xf6, 0xf4, 0xb2, 0x5e, 0x51, 0x51, + 0xbf, 0xa0, 0x28, 0xd3, 0x5b, 0x54, 0x49, 0x63, 0xee, 0x75, 0xf3, 0xef, 0x4a, 0x20, 0x9e, 0xa5, + 0x0c, 0x3a, 0x88, 0x80, 0xf1, 0x8a, 0x36, 0x79, 0xd0, 0xaa, 0x56, 0x8e, 0x58, 0xd8, 0x4a, 0x1f, + 0x17, 0x8d, 0x18, 0x9b, 0xd6, 0x68, 0xa4, 0x02, 0x90, 0xf4, 0x3f, 0x9a, 0x46, 0x90, 0xad, 0x66, + 0x86, 0x7a, 0x49, 0x7d, 0x00, 0x6f, 0xf2, 0x45, 0x77, 0x05, 0xf5, 0xb7, 0x1a, 0xd4, 0x7d, 0xda, + 0x82, 0x9c, 0x02, 0x7c, 0x19, 0xd0, 0x49, 0x03, 0x42, 0x90, 0x25, 0x6b, 0x59, 0xef, 0xa3, 0x22, + 0xb7, 0x68, 0x92, 0xc7, 0x5f, 0x37, 0xf5, 0x92, 0xbb, 0x02, 0x78, 0x2d, 0x45, 0x6e, 0x38, 0x89, + 0x51, 0x9d, 0x00, 0x27, 0xd7, 0x8a, 0xfa, 0x8e, 0xc7, 0x34, 0x81, 0xb2, 0x93, 0x2e, 0x8d, 0xa7, + 0xc1, 0xc4, 0x55, 0x33, 0x83, 0x24, 0xd7, 0x9b, 0x58, 0x33, 0xe6, 0xe5, 0x76, 0x64, 0x16, 0x4d, + 0xc7, 0x93, 0x69, 0x16, 0xf0, 0xbb, 0x69, 0xc2, 0x5d, 0x1b, 0xe3, 0xcf, 0x61, 0xae, 0xb0, 0x12, + 0x40, 0xeb, 0x02, 0xa0, 0xd4, 0x09, 0x3d, 0xc8, 0x2b, 0x31, 0xc2, 0xdc, 0x41, 0x5b, 0x66, 0xc5, + 0xd0, 0x03, 0xd3, 0xed, 0xd4, 0xc2, 0x8a, 0x79, 0x9e, 0xee, 0x9b, 0xa4, 0xac, 0x18, 0x16, 0xf4, + 0xb5, 0x4c, 0xdf, 0x4d, 0xc3, 0xe5, 0xe5, 0x8b, 0x1a, 0x16, 0x8b, 0xfc, 0x8a, 0x46, 0xf8, 0x5e, + 0x37, 0xff, 0xae, 0x05, 0x81, 0x5b, 0x84, 0xac, 0xd9, 0x5d, 0xe2, 0x68, 0x2e, 0x6f, 0x8f, 0xe0, + 0xf0, 0x4a, 0x3a, 0x52, 0xad, 0x9e, 0xbb, 0x82, 0xe6, 0xa9, 0x02, 0xcd, 0x2e, 0x9d, 0x40, 0xc1, + 0x67, 0x4b, 0x7c, 0x93, 0xe5, 0x9d, 0x4b, 0x59, 0x33, 0xd3, 0xc4, 0xff, 0x4b, 0x9b, 0x9d, 0xc7, + 0x32, 0x37, 0xf5, 0x92, 0xbb, 0x82, 0xf7, 0x51, 0x32, 0x6f, 0xfe, 0x20, 0x96, 0xef, 0xf1, 0x3b, + 0xbf, 0xde, 0x96, 0x93, 0x50, 0xb6, 0xc7, 0x56, 0x3a, 0x33, 0xa3, 0xc4, 0x8b, 0x06, 0x5b, 0xa3, + 0x02, 0x47, 0x5a, 0xc7, 0x0a, 0xac, 0x5d, 0x5a, 0x85, 0x97, 0x72, 0x79, 0xfe, 0x04, 0xed, 0x81, + 0xb5, 0xfd, 0xae, 0x1d, 0xd3, 0x1d, 0xda, 0xe2, 0x4d, 0xbb, 0xdd, 0x68, 0xef, 0x5f, 0xa2, 0x6d, + 0x65, 0xe2, 0x60, 0x99, 0xf6, 0x24, 0x03, 0x69, 0xd2, 0x79, 0x36, 0x0e, 0x7d, 0x36, 0x5e, 0x46, + 0xea, 0x6c, 0xe6, 0x44, 0x8e, 0xbb, 0x04, 0x54, 0x6f, 0x34, 0x9b, 0x98, 0x5a, 0xa0, 0x62, 0x41, + 0xea, 0xd9, 0x8a, 0x99, 0xde, 0xa2, 0x4a, 0x12, 0x71, 0xaf, 0x9b, 0x7f, 0xd7, 0xc4, 0x8b, 0xa7, + 0x2a, 0xde, 0xd3, 0xbe, 0xff, 0x0b, 0xe3, 0x48, 0x1c, 0xba, 0x7d, 0x5d, 0x6e, 0x9d, 0xac, 0xd0, + 0x1c, 0xb9, 0xe1, 0x32, 0x83, 0x9b, 0x3b, 0x36, 0x57, 0xa8, 0xe7, 0x3a, 0xa2, 0xbd, 0x3b, 0x9d, + 0xf6, 0xe5, 0x7c, 0xa7, 0x93, 0x5a, 0xac, 0x9c, 0x11, 0x54, 0xfb, 0xb4, 0x13, 0x14, 0xf5, 0xa2, + 0x05, 0xbf, 0x2f, 0xe9, 0x7b, 0x14, 0xe4, 0x7c, 0x63, 0x26, 0xc8, 0xf3, 0xad, 0xdc, 0xf7, 0x1e, + 0xef, 0xf4, 0x06, 0x97, 0xf3, 0xf6, 0xf6, 0x0e, 0xfe, 0x7a, 0x4e, 0x30, 0xee, 0x18, 0x11, 0x9d, + 0x09, 0x44, 0x72, 0xdd, 0x07, 0x3f, 0x8f, 0x1f, 0x53, 0xc1, 0x6f, 0x06, 0xc3, 0x45, 0x96, 0xf6, + 0xf6, 0x0b, 0x78, 0xea, 0x0f, 0x82, 0x78, 0x67, 0x71, 0x9c, 0x2a, 0xfb, 0x48, 0x29, 0x7b, 0x40, + 0xa7, 0xc8, 0xf7, 0x8d, 0xb6, 0x28, 0xf3, 0xbf, 0xc6, 0xdc, 0xf0, 0x29, 0xd7, 0x33, 0x18, 0xfc, + 0x98, 0x86, 0x65, 0xfc, 0x00, 0xf7, 0x13, 0x48, 0xc1, 0x3b, 0x4c, 0x9b, 0xd2, 0xd7, 0xa5, 0x07, + 0x90, 0xe6, 0x43, 0x8e, 0x49, 0x3f, 0x2e, 0x3d, 0xe9, 0xc3, 0x6f, 0x06, 0x39, 0xf8, 0x29, 0x56, + 0xde, 0xfa, 0x0d, 0x7d, 0xab, 0xfc, 0x6b, 0x1a, 0x72, 0xf9, 0xd5, 0xc2, 0xd8, 0xff, 0x73, 0x10, + 0x0d, 0xfe, 0xe6, 0xdf, 0x19, 0xb6, 0x52, 0xe2, 0x31, 0x7d, 0xed, 0xcc, 0x39, 0x38, 0xf8, 0xcb, + 0x9e, 0x37, 0xb5, 0x37, 0x2c, 0xbe, 0xce, 0xa7, 0x2d, 0x4e, 0xdf, 0x8e, 0x68, 0xbb, 0x84, 0xc4, + 0xe3, 0xf7, 0xd4, 0x1f, 0xb5, 0xd4, 0x7a, 0xaa, 0x54, 0xd2, 0xc2, 0xd4, 0xf3, 0xb6, 0xe1, 0x2a, + 0xcf, 0xaf, 0x41, 0x6b, 0x4e, 0x69, 0x26, 0x38, 0x33, 0x86, 0xc6, 0x27, 0xbc, 0x26, 0xed, 0x61, + 0xca, 0x93, 0x4f, 0x53, 0x4f, 0x1e, 0xd0, 0xce, 0xb5, 0x0b, 0x5a, 0x06, 0xe3, 0xc7, 0x87, 0xce, + 0x96, 0x96, 0xe2, 0x27, 0x3d, 0x14, 0xc9, 0x58, 0x28, 0x92, 0x28, 0xf5, 0x95, 0xf1, 0x3f, 0x30, + 0x0a, 0x91, 0xc0, 0x5e, 0xed, 0xd1, 0x13, 0x3a, 0xcb, 0xf6, 0x6f, 0xe1, 0xcd, 0xa0, 0x2c, 0x4d, + 0x33, 0xe5, 0xd7, 0xa0, 0xbc, 0x99, 0xfa, 0xb1, 0x8d, 0x48, 0xc3, 0x72, 0x8f, 0xa6, 0x54, 0xc5, + 0x35, 0x44, 0xa9, 0x1f, 0xbd, 0x86, 0x47, 0x54, 0xc3, 0xa9, 0x88, 0x97, 0xe6, 0xb5, 0x3f, 0x55, + 0x5a, 0x2b, 0x39, 0xa0, 0x83, 0x41, 0x53, 0xea, 0x45, 0x5e, 0xc9, 0x54, 0xcb, 0x35, 0xec, 0x76, + 0xc4, 0x57, 0x64, 0x82, 0x94, 0x18, 0x1d, 0x9a, 0x1e, 0x66, 0xdf, 0xad, 0xf7, 0x3d, 0x2b, 0x11, + 0xf8, 0x7e, 0x7c, 0xf7, 0x11, 0xd4, 0xf5, 0x4f, 0xae, 0x27, 0xa2, 0xec, 0x97, 0xd0, 0x5a, 0xb4, + 0x63, 0xe7, 0x19, 0x9d, 0x6a, 0xd1, 0xa8, 0x5d, 0xd0, 0x96, 0xb7, 0x01, 0x49, 0xde, 0x45, 0x4a, + 0x32, 0xd4, 0x37, 0x3c, 0x93, 0x3b, 0xbc, 0xc5, 0x93, 0x67, 0x4b, 0x25, 0x56, 0x2f, 0xb9, 0x96, + 0x94, 0xfc, 0x91, 0x76, 0xd2, 0x23, 0x37, 0x2c, 0x7b, 0x72, 0x21, 0x3d, 0xba, 0x9c, 0xea, 0xfd, + 0x5d, 0x3c, 0xa9, 0xd7, 0xfa, 0x05, 0x6a, 0x8c, 0x26, 0x19, 0xaa, 0x54, 0xbe, 0x13, 0xdf, 0x99, + 0x70, 0x9e, 0x60, 0xf4, 0x05, 0xb0, 0x80, 0xab, 0x95, 0xd9, 0x81, 0x5a, 0x5f, 0x93, 0xc6, 0xbc, + 0xe1, 0xa7, 0xbd, 0x09, 0x61, 0xf0, 0x07, 0x96, 0xb4, 0xe9, 0xaf, 0x30, 0x8e, 0xbf, 0x00, 0xfa, + 0x1d, 0x92, 0xa1, 0x19, 0xc5, 0xde, 0xcf, 0x84, 0x2c, 0x1d, 0xc1, 0x3b, 0x4f, 0xa1, 0x47, 0xfc, + 0xdc, 0xfd, 0x5b, 0xe8, 0xd9, 0x7b, 0x6a, 0xc1, 0x19, 0xa4, 0xa5, 0x99, 0xed, 0x18, 0x9e, 0x3f, + 0xe4, 0x07, 0xcc, 0xc4, 0x5b, 0xbe, 0x85, 0xb6, 0x9f, 0xd0, 0xdf, 0xb2, 0x18, 0xc1, 0x68, 0x6d, + 0x88, 0x33, 0x1d, 0xff, 0xa1, 0x9a, 0x67, 0x74, 0x72, 0x96, 0x08, 0xbb, 0x06, 0x57, 0x7f, 0x25, + 0xb8, 0xba, 0x4f, 0x75, 0xbd, 0x6e, 0x78, 0xfa, 0x41, 0xf0, 0xb4, 0xdb, 0xf0, 0x74, 0xc3, 0xd3, + 0x0d, 0x4f, 0x7f, 0x46, 0x3c, 0x2d, 0x7d, 0xea, 0x9f, 0x88, 0x43, 0x7e, 0x82, 0x7a, 0x1b, 0xae, + 0x7e, 0x18, 0x5c, 0x6d, 0x37, 0x5c, 0xdd, 0x70, 0x75, 0xc3, 0xd5, 0x9f, 0x11, 0x57, 0xaf, 0x67, + 0xb9, 0xda, 0xb0, 0x1a, 0xb6, 0x7e, 0x10, 0x6c, 0xed, 0x34, 0x6c, 0xdd, 0xb0, 0x75, 0xc3, 0xd6, + 0x9f, 0x11, 0x5b, 0x7f, 0x67, 0x64, 0xa2, 0xd5, 0xe2, 0x79, 0xda, 0x2e, 0x4b, 0xed, 0x9d, 0x36, + 0xec, 0xfd, 0x20, 0xd8, 0xdb, 0x6a, 0xd8, 0xbb, 0x61, 0xef, 0x86, 0xbd, 0x3f, 0x23, 0xf6, 0x96, + 0x71, 0x91, 0x3e, 0x94, 0xc6, 0x37, 0x23, 0x77, 0x34, 0x5c, 0xfd, 0x10, 0xb8, 0xda, 0x6b, 0xb8, + 0xba, 0xe1, 0xea, 0x86, 0xab, 0x3f, 0x23, 0xae, 0x96, 0x6b, 0x8d, 0xf8, 0x3d, 0x6a, 0x30, 0xe2, + 0x0d, 0x4f, 0x3f, 0x08, 0x9e, 0xd6, 0x59, 0xa3, 0xe1, 0xe9, 0x86, 0xa7, 0x1b, 0x9e, 0x7e, 0xf8, + 0x3c, 0x9d, 0xa3, 0x91, 0xcd, 0xfe, 0xbd, 0x07, 0xce, 0xd5, 0xcd, 0xfe, 0xbd, 0x86, 0xab, 0x1f, + 0x02, 0x57, 0xb3, 0x86, 0xab, 0x89, 0xab, 0xf9, 0x5f, 0xdd, 0xb9, 0x0a, 0x57, 0x37, 0xfb, 0xf7, + 0x1e, 0x22, 0x4f, 0x37, 0xfb, 0xf7, 0x1a, 0x9e, 0x6e, 0x78, 0xfa, 0x73, 0xe2, 0xe9, 0x66, 0xff, + 0xde, 0x43, 0xe5, 0xea, 0x66, 0xff, 0x5e, 0xc3, 0xd5, 0x0d, 0x57, 0x7f, 0x4e, 0x5c, 0xdd, 0xec, + 0xdf, 0x7b, 0xb8, 0x6c, 0xdd, 0xec, 0xdf, 0x6b, 0xd8, 0xba, 0x61, 0xeb, 0xcf, 0x89, 0xad, 0x9b, + 0xfd, 0x7b, 0xbf, 0x1d, 0xf6, 0x6e, 0xf6, 0xef, 0x35, 0xec, 0xdd, 0xb0, 0xf7, 0xe7, 0xc4, 0xde, + 0xcd, 0xfe, 0xbd, 0x87, 0xca, 0xd5, 0xcd, 0xfe, 0xbd, 0x86, 0xab, 0x1b, 0xae, 0xfe, 0x9c, 0xb8, + 0xba, 0xd9, 0xbf, 0xf7, 0x10, 0x79, 0xba, 0xd9, 0xbf, 0xd7, 0xf0, 0x74, 0xc3, 0xd3, 0xbf, 0x3d, + 0x9e, 0x6e, 0xc3, 0x13, 0xa8, 0xc7, 0x29, 0xb9, 0xd4, 0x78, 0x5a, 0x30, 0xd4, 0x2d, 0xf3, 0xf4, + 0x08, 0x90, 0x0e, 0x0d, 0x07, 0x7e, 0xa6, 0x50, 0x5f, 0x70, 0x2d, 0x3c, 0x5d, 0xac, 0x7d, 0xba, + 0xee, 0x78, 0x9a, 0x6f, 0x7a, 0x33, 0xe3, 0xf6, 0x18, 0xca, 0xa2, 0x5e, 0xa3, 0xe4, 0x6c, 0x88, + 0x72, 0x38, 0x6e, 0xb3, 0x1c, 0xbd, 0x95, 0x2d, 0x2f, 0xdb, 0xb3, 0x9a, 0x7e, 0x96, 0x7f, 0x93, + 0xef, 0x82, 0x91, 0x03, 0x8d, 0x4f, 0xd3, 0xcf, 0xe6, 0xeb, 0x29, 0xea, 0x89, 0x55, 0x80, 0x63, + 0xd6, 0xb2, 0xd8, 0x50, 0xc2, 0xad, 0x2d, 0x6f, 0x4f, 0x85, 0xbc, 0x2d, 0xbe, 0xd0, 0xfc, 0x67, + 0xe5, 0xa9, 0xcf, 0x4d, 0xfe, 0x46, 0x1a, 0xea, 0xbf, 0x0d, 0xf9, 0x73, 0x6a, 0xcb, 0xdf, 0xef, + 0x0c, 0xff, 0xca, 0xd2, 0xf7, 0x44, 0x48, 0x5f, 0xda, 0x86, 0xea, 0x7e, 0xe9, 0xd7, 0x42, 0xfe, + 0x30, 0xe6, 0x8b, 0x3c, 0xda, 0x78, 0xa6, 0xf9, 0xcf, 0x5b, 0xda, 0x1b, 0x1a, 0xcf, 0xb4, 0xf1, + 0x4c, 0xeb, 0x7b, 0xa6, 0x2c, 0x97, 0x61, 0x7e, 0xcb, 0x9e, 0xa9, 0xad, 0xf5, 0x77, 0xb9, 0x67, + 0x9a, 0xd5, 0xb1, 0x87, 0xeb, 0x97, 0x3e, 0x83, 0x7c, 0x8e, 0xf0, 0x5b, 0xd2, 0xc9, 0x0d, 0x2a, + 0xf7, 0x41, 0xb5, 0x34, 0x2b, 0x73, 0x75, 0x1f, 0xea, 0x22, 0xaf, 0xb7, 0xe1, 0xea, 0x86, 0xab, + 0x1b, 0xae, 0x6e, 0xa2, 0x08, 0xd7, 0xc4, 0xd5, 0x56, 0xc3, 0xd5, 0xc4, 0xd5, 0x28, 0xd9, 0x1b, + 0xd4, 0x22, 0xae, 0x93, 0x91, 0xc6, 0xd5, 0x4f, 0x15, 0x49, 0xdc, 0xa0, 0xb1, 0xe1, 0x7f, 0xdb, + 0xe2, 0x34, 0x35, 0xb3, 0x5b, 0x4f, 0x9d, 0xe6, 0x5e, 0xe4, 0xdd, 0x2e, 0x63, 0x5b, 0xf4, 0x07, + 0x19, 0x03, 0xc0, 0x1e, 0x66, 0xb3, 0xa0, 0x8b, 0xc8, 0xce, 0x16, 0xfc, 0x98, 0x09, 0x63, 0x63, + 0x1a, 0x3e, 0x83, 0xbd, 0x91, 0x72, 0x1f, 0x10, 0xc7, 0x47, 0x34, 0x0b, 0x44, 0xde, 0x8e, 0x6b, + 0xf2, 0xaf, 0xbe, 0x8f, 0xac, 0x2a, 0x73, 0x2d, 0xd3, 0xbc, 0x9b, 0xd1, 0x0b, 0xa7, 0xb6, 0x04, + 0x7b, 0x9a, 0x04, 0xdf, 0x8c, 0x3c, 0x7e, 0x4f, 0xf6, 0xfd, 0x13, 0xb5, 0xe1, 0x1d, 0x95, 0xe5, + 0x7f, 0x4e, 0x43, 0x9e, 0x4e, 0xa5, 0x3f, 0xf7, 0x9b, 0xf1, 0x1f, 0xaa, 0xc9, 0xe4, 0x63, 0x45, + 0x26, 0xef, 0x2e, 0xce, 0xe0, 0x0a, 0xff, 0x20, 0x22, 0xcf, 0x00, 0xfd, 0x07, 0x1f, 0x7e, 0x1c, + 0x78, 0x7e, 0x75, 0xb9, 0xac, 0x1b, 0x67, 0xb8, 0x8d, 0xb1, 0xfc, 0x56, 0x89, 0x33, 0x64, 0x4e, + 0x17, 0xff, 0xc6, 0xe2, 0x0d, 0x8f, 0xe1, 0xb9, 0x29, 0x58, 0xc6, 0x8f, 0x54, 0xff, 0x46, 0x6a, + 0x0c, 0xe4, 0x1f, 0x86, 0xda, 0x22, 0x26, 0x78, 0x0f, 0x79, 0xdd, 0x44, 0xdb, 0xce, 0x33, 0xb2, + 0x57, 0x2e, 0x3f, 0x38, 0xfe, 0x0e, 0x32, 0x33, 0x79, 0x9b, 0x8c, 0xe4, 0x87, 0x01, 0xce, 0x4e, + 0xc6, 0x13, 0x0d, 0x88, 0xed, 0x70, 0xbc, 0x51, 0xce, 0x50, 0xc2, 0xa6, 0xf0, 0x1f, 0x3d, 0x9b, + 0x50, 0x93, 0x9f, 0x9b, 0x91, 0x80, 0x3f, 0xc1, 0xe7, 0x13, 0xea, 0x29, 0x46, 0xa8, 0x7f, 0x25, + 0xcd, 0xe4, 0x18, 0xbc, 0x25, 0x5f, 0xe0, 0xc4, 0xf8, 0x17, 0xfd, 0xe1, 0xce, 0x73, 0x6d, 0xc4, + 0xce, 0xe1, 0x09, 0x94, 0x90, 0x09, 0xb5, 0x84, 0x73, 0xd8, 0xcf, 0xf0, 0xf9, 0xb5, 0x31, 0x5e, + 0xea, 0x57, 0xaa, 0x65, 0xde, 0x08, 0xff, 0x55, 0x2d, 0xf5, 0x7b, 0x40, 0xc1, 0xd5, 0x64, 0xff, + 0x31, 0x60, 0x32, 0xa3, 0x31, 0xab, 0xf6, 0xa6, 0x6f, 0x52, 0xcf, 0x57, 0x7f, 0xcb, 0x1a, 0xe4, + 0x23, 0x32, 0xd8, 0x6f, 0xbd, 0x7e, 0x56, 0xb1, 0xf7, 0xb3, 0xa5, 0xbe, 0x41, 0x51, 0xef, 0x17, + 0xa5, 0xaa, 0xf7, 0x7e, 0xf9, 0x9b, 0x96, 0xf5, 0xbe, 0xf8, 0x2d, 0x7a, 0xef, 0xd3, 0xf5, 0xab, + 0xbd, 0xff, 0x76, 0x49, 0xef, 0x5f, 0x1b, 0xf2, 0x2f, 0x67, 0x2d, 0xf3, 0x1e, 0x97, 0x21, 0xa0, + 0x97, 0xcc, 0x6b, 0xdf, 0x93, 0x1c, 0x14, 0xca, 0xde, 0xf8, 0x34, 0x17, 0x89, 0x2a, 0x6f, 0x7b, + 0xa4, 0xa0, 0x91, 0x7d, 0x8f, 0x3e, 0xf7, 0xc9, 0x47, 0x64, 0x6c, 0xf0, 0xbf, 0xd7, 0x97, 0xdf, + 0x3a, 0x1d, 0xc7, 0x45, 0x0b, 0xd5, 0x72, 0x79, 0xed, 0xfb, 0x26, 0x07, 0x8d, 0xe2, 0xb7, 0x3d, + 0xc9, 0xc5, 0xa2, 0xfc, 0x4d, 0xeb, 0x0a, 0x12, 0xfa, 0x3b, 0x54, 0x1c, 0xfe, 0x1b, 0xb8, 0xb0, + 0x05, 0x4f, 0x45, 0xc4, 0x50, 0xdc, 0x13, 0xf8, 0x19, 0xb8, 0xe8, 0x8c, 0xb8, 0x14, 0x6d, 0x0a, + 0xb6, 0xf3, 0x22, 0xe1, 0x2f, 0xb4, 0xd6, 0xff, 0x97, 0xd4, 0xf6, 0x25, 0x71, 0xe3, 0x06, 0xfe, + 0xae, 0xc9, 0xdb, 0x7f, 0x86, 0xb7, 0x9e, 0x25, 0xb3, 0x61, 0xe1, 0xed, 0x19, 0x7f, 0xd3, 0xfd, + 0x24, 0x63, 0x13, 0x7f, 0x56, 0x60, 0x73, 0x1b, 0x78, 0x19, 0xf9, 0x78, 0x4c, 0x36, 0x9e, 0xfb, + 0x00, 0x21, 0x60, 0xc5, 0x14, 0x6f, 0x00, 0xf3, 0x11, 0x63, 0x64, 0xf3, 0x19, 0xb1, 0x79, 0x48, + 0xf3, 0xf6, 0x29, 0x60, 0x1a, 0x64, 0xe2, 0x0a, 0x37, 0xc3, 0xe6, 0x7f, 0x01, 0xbb, 0xf5, 0x11, + 0x3e, 0xa3, 0x25, 0x7f, 0x4f, 0xf8, 0xa2, 0x3d, 0xcf, 0x22, 0x31, 0x13, 0x58, 0xa8, 0xfa, 0x39, + 0xce, 0x41, 0xf1, 0x67, 0xaa, 0x1f, 0xe5, 0xf4, 0x5d, 0xe2, 0x69, 0x66, 0xf5, 0x6c, 0xa2, 0xd5, + 0x5f, 0xa5, 0xd4, 0x5d, 0x49, 0xcb, 0x7a, 0xea, 0x0f, 0xbf, 0x6d, 0x08, 0xfc, 0x4f, 0x6f, 0xd9, + 0xbf, 0x9c, 0x92, 0x54, 0x38, 0xe4, 0xbf, 0x4c, 0x68, 0xb6, 0x33, 0xa2, 0x28, 0x54, 0xa8, 0xf9, + 0x97, 0x28, 0x65, 0x23, 0x25, 0x52, 0x45, 0x11, 0x0b, 0x5a, 0xfd, 0x9a, 0x69, 0x12, 0xf5, 0xe5, + 0xd2, 0x68, 0x45, 0xde, 0x9c, 0xe5, 0x2b, 0x90, 0xb2, 0x0f, 0x14, 0x69, 0x40, 0x19, 0xf9, 0x54, + 0x10, 0x69, 0x5a, 0x4b, 0x45, 0x53, 0x70, 0x4c, 0xa7, 0x4b, 0x39, 0xe6, 0xa6, 0x7c, 0xd4, 0x21, + 0x3d, 0xf9, 0x96, 0x7c, 0xd4, 0x29, 0xfd, 0x9e, 0x90, 0x6c, 0x9d, 0x1a, 0x79, 0x6b, 0xe8, 0x65, + 0xe3, 0xbf, 0x06, 0x29, 0xc8, 0xba, 0x97, 0x24, 0xe1, 0xd7, 0xc3, 0x09, 0xb3, 0x84, 0x13, 0xec, + 0x7b, 0xc7, 0x09, 0x5c, 0xde, 0xb1, 0xc7, 0xe3, 0x54, 0x8f, 0x55, 0x8e, 0x27, 0x6f, 0x87, 0xb4, + 0xef, 0xbd, 0x98, 0x05, 0x9c, 0xc7, 0xbb, 0x3d, 0x80, 0x74, 0xb7, 0x37, 0xbc, 0x9c, 0xbf, 0xec, + 0x6e, 0xe3, 0x9f, 0x16, 0x7c, 0xc5, 0x2f, 0xf1, 0x22, 0xcd, 0x72, 0x5d, 0x9e, 0x8a, 0x37, 0x71, + 0xa6, 0x4e, 0xfc, 0xeb, 0xb5, 0xd7, 0x59, 0xe7, 0xe3, 0x85, 0x25, 0xbe, 0xd6, 0x7a, 0x1f, 0x49, + 0xbb, 0x76, 0xad, 0xb5, 0xde, 0x15, 0xbf, 0x3d, 0x33, 0xf6, 0xa8, 0x2f, 0x7f, 0x83, 0x19, 0x12, + 0x7a, 0xf0, 0x1f, 0x49, 0x4e, 0xf0, 0x3d, 0xc8, 0xd1, 0xd7, 0x23, 0xef, 0xd3, 0x44, 0xde, 0xad, + 0x7b, 0x27, 0xef, 0x7f, 0xa2, 0x12, 0x32, 0x16, 0x51, 0x84, 0x82, 0xea, 0x8d, 0x9d, 0xae, 0x64, + 0xfb, 0x1e, 0x43, 0x89, 0x53, 0x7a, 0x76, 0x92, 0x58, 0x15, 0x75, 0x1c, 0xf3, 0x23, 0xaf, 0xd7, + 0x28, 0x1d, 0x8a, 0xd6, 0xbd, 0x11, 0x72, 0x5c, 0xde, 0x72, 0xf4, 0xc7, 0xb3, 0xc8, 0x2c, 0x2d, + 0x59, 0x4b, 0x06, 0xff, 0x98, 0x3e, 0xa3, 0xb5, 0xd2, 0xfc, 0xd9, 0x22, 0xfb, 0xc8, 0x84, 0x04, + 0xfd, 0x40, 0x71, 0x98, 0xa9, 0xe1, 0xe5, 0xcc, 0x9f, 0x65, 0xbc, 0xe4, 0x6e, 0xe6, 0xcf, 0x5f, + 0xa7, 0x7a, 0x8a, 0xfb, 0x13, 0xce, 0xee, 0x05, 0x07, 0xac, 0xa5, 0xe3, 0x17, 0x2b, 0xeb, 0xbc, + 0x1a, 0xc5, 0xb0, 0x92, 0x28, 0x86, 0x7b, 0xef, 0xa2, 0x18, 0xeb, 0x5a, 0x14, 0x23, 0xab, 0xdf, + 0x4d, 0xc4, 0xa2, 0x89, 0x58, 0x34, 0x11, 0x8b, 0x26, 0x62, 0x71, 0x3b, 0x11, 0x8b, 0x2f, 0x81, + 0xcb, 0xf0, 0xac, 0xf2, 0x2c, 0x61, 0xe4, 0x6f, 0xc5, 0x1c, 0x5c, 0x9e, 0x5b, 0xde, 0x10, 0x71, + 0xe6, 0x2d, 0xa8, 0xf9, 0x03, 0x46, 0xb2, 0x57, 0xe0, 0x67, 0xb4, 0x8d, 0x36, 0xfc, 0x46, 0xef, + 0x6a, 0x44, 0xfc, 0x3c, 0x81, 0xab, 0x43, 0xfb, 0x22, 0xd3, 0xfc, 0xec, 0xd2, 0xba, 0x44, 0xb5, + 0xfd, 0x0e, 0x37, 0xc3, 0xcf, 0xdf, 0x69, 0xbd, 0x3f, 0xa1, 0xb9, 0x37, 0x5f, 0xc7, 0x5c, 0x20, + 0x70, 0x37, 0x23, 0xb3, 0x4e, 0x7d, 0xe5, 0xab, 0x51, 0x72, 0xc5, 0x77, 0x95, 0x98, 0x7f, 0x44, + 0xfb, 0x4a, 0x4c, 0x1a, 0x93, 0x88, 0x90, 0x8f, 0xe0, 0xde, 0x4d, 0xad, 0x19, 0x99, 0x34, 0x1a, + 0x38, 0x0b, 0xbb, 0xeb, 0x98, 0x7f, 0x9f, 0xf2, 0x08, 0x85, 0xe4, 0xba, 0x41, 0x6f, 0x38, 0x87, + 0xeb, 0x98, 0x6a, 0x9a, 0x6a, 0x31, 0xff, 0x9b, 0x1a, 0x91, 0x3f, 0x24, 0xab, 0x43, 0x7c, 0x3c, + 0x16, 0x9f, 0x57, 0x19, 0x03, 0x06, 0x79, 0x11, 0xf1, 0x93, 0x93, 0xac, 0xbb, 0xc8, 0xf9, 0xf9, + 0x7d, 0xf2, 0x58, 0xfe, 0x40, 0x27, 0xad, 0x80, 0x4d, 0xef, 0x04, 0xe3, 0x35, 0xf9, 0x19, 0x9e, + 0x3e, 0xa0, 0x36, 0x67, 0xf7, 0x6a, 0xd5, 0x45, 0xdb, 0xba, 0xc7, 0x68, 0x3f, 0x03, 0x96, 0x99, + 0x50, 0x3b, 0xdf, 0xd1, 0x8c, 0x67, 0x21, 0xef, 0x1b, 0x46, 0x74, 0x87, 0xe3, 0xf0, 0xad, 0xb1, + 0x4b, 0x1e, 0xeb, 0x39, 0xd5, 0x30, 0x22, 0x3e, 0x94, 0x23, 0x73, 0x3d, 0x5e, 0xbb, 0x99, 0x78, + 0xed, 0xf6, 0xbd, 0x1b, 0x95, 0x6f, 0xa5, 0x0e, 0x40, 0xaf, 0x5f, 0xa7, 0x70, 0x98, 0xe5, 0xce, + 0xd0, 0xff, 0xa4, 0x3c, 0x33, 0xa2, 0xb9, 0xea, 0x58, 0x60, 0xf5, 0x33, 0xbd, 0x71, 0x0a, 0xe9, + 0x1f, 0x93, 0x7d, 0x1e, 0xdf, 0x41, 0x8f, 0x36, 0x89, 0x8f, 0x97, 0xff, 0x78, 0xb7, 0x32, 0xea, + 0x5f, 0x89, 0xb5, 0xea, 0x33, 0xda, 0xbf, 0xf3, 0x2e, 0x39, 0xc9, 0xa3, 0xa6, 0xd6, 0x1f, 0xe9, + 0x09, 0x8d, 0x1f, 0xda, 0x18, 0xdc, 0x47, 0xc3, 0x2d, 0x0e, 0xdf, 0xdb, 0x98, 0xb5, 0x38, 0xfe, + 0x9d, 0x8e, 0xf4, 0x5a, 0x56, 0xff, 0xee, 0x10, 0xf9, 0xc7, 0x6a, 0xea, 0x95, 0x38, 0x10, 0xf7, + 0x7b, 0x58, 0xf4, 0xdf, 0x15, 0x91, 0x8a, 0x90, 0xa2, 0xf3, 0x7e, 0x46, 0xdb, 0xe4, 0x4e, 0x91, + 0xbb, 0x1a, 0x83, 0xef, 0x73, 0x39, 0x70, 0x0a, 0xcf, 0x5c, 0x92, 0x36, 0xe1, 0x8e, 0x8b, 0xd7, + 0x37, 0x17, 0xa5, 0xaa, 0x30, 0x2e, 0x4f, 0xa1, 0xd5, 0xef, 0x68, 0x97, 0x1d, 0xcf, 0xd9, 0x48, + 0x76, 0x72, 0xad, 0xca, 0x85, 0xaa, 0x85, 0x72, 0xee, 0xb1, 0x85, 0xfa, 0x2f, 0xd1, 0x57, 0xbe, + 0xdb, 0x02, 0xc7, 0xe5, 0xaf, 0xb4, 0x3a, 0xb3, 0x18, 0xaf, 0xa2, 0xe8, 0xe5, 0xcd, 0x44, 0x13, + 0xbf, 0xa7, 0x28, 0xe0, 0x62, 0x3c, 0x7e, 0xa6, 0x39, 0xd5, 0x39, 0x9d, 0x01, 0xbb, 0x0e, 0xbe, + 0x2d, 0xaa, 0x3f, 0x1b, 0x85, 0xfc, 0x02, 0x67, 0x2b, 0x4a, 0xf9, 0x3f, 0x17, 0x94, 0xbf, 0x28, + 0xda, 0xb3, 0xa9, 0xc8, 0xe2, 0x77, 0xe4, 0xf7, 0x7f, 0x22, 0xd4, 0xb7, 0x0d, 0xbe, 0x2f, 0xed, + 0x13, 0xdc, 0x3b, 0x62, 0xc6, 0x84, 0x7b, 0x81, 0x76, 0x84, 0x84, 0xa6, 0x77, 0xe1, 0xa1, 0xa5, + 0xe6, 0x3b, 0x76, 0x57, 0xb7, 0xd4, 0x01, 0xcd, 0xcb, 0x66, 0x24, 0x7d, 0x9c, 0xbf, 0x71, 0x0f, + 0xd9, 0x58, 0xe1, 0x6f, 0x8f, 0xe6, 0x6f, 0x36, 0xf9, 0xb3, 0xf8, 0x9b, 0x7f, 0xc6, 0x6b, 0x48, + 0x76, 0xfe, 0x36, 0xa4, 0xb3, 0xa8, 0xdf, 0xb7, 0xc1, 0x17, 0x75, 0xc6, 0x68, 0x8d, 0x34, 0xe9, + 0x8c, 0xaf, 0xd3, 0xde, 0xd9, 0xd8, 0x4c, 0x29, 0xed, 0x76, 0x6c, 0x6b, 0xb6, 0xbf, 0xf7, 0x6d, + 0x4c, 0x9e, 0x12, 0xc6, 0x92, 0xbf, 0x36, 0xc4, 0x8a, 0x2e, 0xbe, 0xf1, 0xee, 0xc6, 0x07, 0xd7, + 0x17, 0x6e, 0x63, 0x7c, 0xca, 0xfa, 0x7e, 0x1b, 0x63, 0xf5, 0x3d, 0x45, 0x59, 0x4e, 0x84, 0xb7, + 0x33, 0x80, 0x5e, 0x9e, 0x88, 0x3b, 0x3c, 0xd7, 0x31, 0xa2, 0x78, 0xd4, 0x62, 0xb4, 0xbe, 0x5e, + 0xc4, 0x41, 0x6e, 0x78, 0x7c, 0x7c, 0x18, 0x15, 0xb4, 0xc8, 0x0e, 0xdd, 0x31, 0xfa, 0xed, 0x91, + 0x07, 0xeb, 0x92, 0xbd, 0xbe, 0x9d, 0x15, 0x1c, 0xbd, 0xb7, 0xb7, 0xe3, 0x01, 0xf1, 0xf3, 0x54, + 0xea, 0xfe, 0x67, 0xf9, 0x8d, 0x59, 0x87, 0xd4, 0x7a, 0xb4, 0x66, 0xb7, 0xbd, 0x33, 0xe5, 0x6e, + 0xce, 0x50, 0x7d, 0x81, 0xfe, 0x73, 0xad, 0x5d, 0xfc, 0xd9, 0xf3, 0xef, 0xcd, 0x39, 0x2a, 0x19, + 0x37, 0x6f, 0xce, 0x51, 0x7d, 0x8e, 0xe7, 0xa8, 0x74, 0x39, 0x5d, 0x7e, 0x8e, 0xca, 0xd1, 0xfa, + 0x7b, 0xdd, 0xdf, 0xc6, 0xa2, 0x9f, 0x43, 0xa9, 0x72, 0x92, 0x8a, 0xdd, 0x02, 0xd3, 0xaf, 0x27, + 0xf9, 0x68, 0xef, 0x0e, 0x8d, 0xff, 0x60, 0xfb, 0x2b, 0xf1, 0xb2, 0xfc, 0xd6, 0x95, 0x3d, 0x1a, + 0xfd, 0xf7, 0x0d, 0x27, 0xe7, 0x96, 0xd0, 0x65, 0xb0, 0x61, 0xe4, 0x86, 0x91, 0x7f, 0x7b, 0x8c, + 0x1c, 0x54, 0x66, 0x64, 0xe7, 0x1e, 0x31, 0xb2, 0x5e, 0xe6, 0x9e, 0x33, 0x72, 0x7c, 0x30, 0x00, + 0x4a, 0x8e, 0x7b, 0x5b, 0xc3, 0xcb, 0x79, 0x6b, 0xbb, 0x7b, 0x32, 0x8f, 0x22, 0x0f, 0xfe, 0x85, + 0x61, 0xdc, 0xe1, 0x9f, 0x26, 0xf4, 0x2f, 0x6e, 0xf5, 0x12, 0xe6, 0x5e, 0x83, 0xd6, 0x21, 0x73, + 0xf7, 0x48, 0x3f, 0x70, 0x5f, 0xb3, 0xfc, 0x5e, 0x82, 0xbf, 0x40, 0x0e, 0xb2, 0x37, 0xb2, 0x64, + 0x0f, 0xd2, 0x7f, 0x15, 0x71, 0x8c, 0x2d, 0xc2, 0xea, 0x04, 0x52, 0xf9, 0xec, 0x68, 0x44, 0x3b, + 0xb8, 0xa6, 0xf1, 0x31, 0x95, 0x7a, 0x42, 0x9e, 0xfb, 0x87, 0xd4, 0xf3, 0x5c, 0x03, 0x3e, 0x62, + 0xdd, 0x71, 0xbf, 0x7d, 0x34, 0x9e, 0x9b, 0x71, 0x6b, 0xeb, 0xf0, 0x84, 0x2e, 0x83, 0x93, 0xb9, + 0x3d, 0x0b, 0xe2, 0x56, 0x7b, 0xff, 0x64, 0x6e, 0xc5, 0xad, 0x83, 0x03, 0x68, 0x24, 0x5c, 0x20, + 0x79, 0x14, 0xb7, 0x06, 0x3b, 0xf4, 0xd0, 0xa0, 0x73, 0x32, 0x67, 0x70, 0xd9, 0xa3, 0x4b, 0xab, + 0x4b, 0x89, 0xad, 0xe7, 0x74, 0xd9, 0x3e, 0x14, 0x15, 0xec, 0x74, 0xe8, 0x73, 0x7f, 0x48, 0x0f, + 0x75, 0x5a, 0xfc, 0xd2, 0xa7, 0xc4, 0x43, 0x9e, 0x38, 0xe8, 0x9d, 0xcc, 0x43, 0x2f, 0x6e, 0x0d, + 0x5b, 0x94, 0x3a, 0xe4, 0xb5, 0x0f, 0x07, 0xfc, 0x25, 0x07, 0xbc, 0x3e, 0x7e, 0xd9, 0xdf, 0x1a, + 0x43, 0x89, 0xb8, 0xb3, 0x80, 0xe9, 0x6b, 0x0a, 0x87, 0xf2, 0x2f, 0x10, 0xc3, 0x4e, 0x4f, 0x93, + 0x65, 0x57, 0x0c, 0xbe, 0x02, 0x11, 0x8a, 0xee, 0x2f, 0x3e, 0x8b, 0xae, 0x76, 0xf8, 0xeb, 0x3a, + 0xbc, 0x81, 0x1d, 0x7c, 0x8f, 0x05, 0x9f, 0xa8, 0x49, 0x9d, 0x7e, 0x9b, 0x1e, 0xe9, 0xf7, 0x79, + 0xde, 0x1e, 0x5e, 0xe2, 0xe1, 0xcb, 0xd6, 0xe5, 0x9c, 0xd7, 0xfe, 0x25, 0xa8, 0x09, 0x9f, 0xf6, + 0xbe, 0x83, 0xa1, 0x7d, 0x7e, 0x39, 0xff, 0xb1, 0xf7, 0xf2, 0x64, 0x1e, 0x98, 0xf1, 0x9e, 0xb8, + 0x0e, 0x07, 0x3f, 0x41, 0x45, 0x26, 0xdc, 0xec, 0x43, 0x53, 0x87, 0xfb, 0x6d, 0xf8, 0xe4, 0x8f, + 0xad, 0x59, 0x44, 0xe1, 0xba, 0xe1, 0xcb, 0xce, 0x35, 0xd5, 0x14, 0xef, 0xbc, 0xec, 0x5d, 0xce, + 0x3b, 0x07, 0x43, 0x6c, 0xe1, 0x76, 0x97, 0xda, 0xdb, 0xeb, 0x52, 0x27, 0x7a, 0x5b, 0x24, 0x72, + 0xdd, 0x43, 0x9e, 0xd6, 0xa7, 0xda, 0x7a, 0xc3, 0x43, 0xec, 0x67, 0xaf, 0x7b, 0x84, 0x40, 0x6e, + 0xf5, 0xba, 0xfc, 0x32, 0xa0, 0xcb, 0xd6, 0x36, 0xbf, 0xb4, 0xe9, 0x32, 0x80, 0x5a, 0x66, 0xf0, + 0x64, 0x1b, 0xcb, 0xef, 0x76, 0xe9, 0x0d, 0x7f, 0xef, 0xfd, 0xe3, 0x64, 0xee, 0xe2, 0x75, 0xc0, + 0x3f, 0x1e, 0xf1, 0x4b, 0x0f, 0xe1, 0xda, 0xed, 0xec, 0xe3, 0xe5, 0xef, 0x03, 0x7c, 0x66, 0x04, + 0xd7, 0x1d, 0xfe, 0x71, 0x88, 0xd5, 0xfd, 0x7d, 0xd0, 0x22, 0x48, 0xbb, 0x3d, 0xaa, 0x6e, 0xd0, + 0xc5, 0x4f, 0xdd, 0xc1, 0x31, 0x5e, 0xda, 0xfc, 0xd2, 0x1d, 0x10, 0xea, 0x87, 0xaf, 0xa8, 0x35, + 0xdd, 0xc1, 0x00, 0x7b, 0xb1, 0x37, 0xa4, 0x91, 0xdf, 0x1b, 0x0e, 0x89, 0x05, 0xdb, 0xa4, 0xdd, + 0xa8, 0x73, 0xff, 0xa6, 0x2b, 0xed, 0xc0, 0x88, 0x5f, 0x76, 0xa8, 0x39, 0x2f, 0x0f, 0xa8, 0xad, + 0xc3, 0xfe, 0xc1, 0x98, 0x97, 0xc4, 0xcb, 0xcb, 0x36, 0xc9, 0xcc, 0xe1, 0x81, 0x73, 0x39, 0x87, + 0x5f, 0x27, 0x73, 0x2f, 0xa6, 0x4b, 0xc4, 0x2f, 0x8c, 0x5f, 0x4c, 0xed, 0x02, 0xd7, 0x0e, 0x3e, + 0x0f, 0xc2, 0xe1, 0xc6, 0x74, 0x01, 0xb1, 0x1b, 0x6e, 0x91, 0x8c, 0xc7, 0x07, 0x87, 0x90, 0x77, + 0x70, 0xd8, 0x86, 0x16, 0x81, 0x1b, 0xd2, 0x7d, 0x05, 0x38, 0x77, 0xb7, 0x5e, 0x81, 0x66, 0x3f, + 0xdf, 0xc5, 0x0e, 0x1c, 0xf7, 0x79, 0xe7, 0x44, 0xf0, 0x61, 0x9b, 0x08, 0x5d, 0x06, 0xc2, 0x19, + 0x52, 0x01, 0x66, 0x1f, 0x6c, 0x13, 0xf6, 0xed, 0x7d, 0xea, 0xed, 0x76, 0x17, 0x25, 0x7a, 0x07, + 0x6b, 0xda, 0x7e, 0x8e, 0xd9, 0x3b, 0xdd, 0x83, 0xcb, 0x79, 0x6f, 0xb8, 0x07, 0xbf, 0x1a, 0xd2, + 0xb8, 0x16, 0xd2, 0x48, 0xa9, 0xef, 0x63, 0xf2, 0xc9, 0xd0, 0xdb, 0xfb, 0x01, 0xbc, 0x08, 0xb9, + 0xc7, 0x79, 0xc3, 0xb0, 0x53, 0x2a, 0xe8, 0x70, 0x0d, 0x74, 0x72, 0x15, 0x30, 0xf0, 0x2c, 0xe6, + 0x06, 0xd7, 0xac, 0xca, 0xad, 0x7e, 0x8f, 0xf4, 0x76, 0xc8, 0x39, 0xe8, 0x68, 0x88, 0xe0, 0xf6, + 0x0f, 0xdb, 0xa8, 0x71, 0x81, 0xed, 0xdb, 0xf1, 0xf0, 0xe8, 0x65, 0x34, 0xff, 0xc1, 0x83, 0xeb, + 0x2b, 0xb8, 0x3a, 0x71, 0x6f, 0xbb, 0x83, 0x3d, 0xeb, 0x0d, 0x20, 0xd9, 0x82, 0x8f, 0x03, 0x4c, + 0x0e, 0x36, 0x7d, 0x2f, 0xb4, 0x1c, 0x48, 0xde, 0x11, 0xc9, 0x3b, 0x6a, 0x72, 0x47, 0x24, 0x77, + 0xd4, 0xe4, 0x16, 0x34, 0xa9, 0xd7, 0x02, 0x32, 0xd9, 0x1f, 0x10, 0x0d, 0xb4, 0x06, 0x5d, 0x3c, + 0x1c, 0xd0, 0xeb, 0x6d, 0x23, 0x08, 0xbd, 0x56, 0x72, 0x44, 0xc0, 0x73, 0xc4, 0x11, 0x01, 0xd3, + 0x8a, 0x5f, 0xf5, 0xf0, 0x86, 0xd9, 0x9b, 0xa6, 0xe3, 0x06, 0xae, 0x1d, 0xbf, 0x1a, 0xc0, 0x67, + 0x16, 0x9a, 0x9b, 0xa1, 0xeb, 0x30, 0xcf, 0x8e, 0xb7, 0xfb, 0x2f, 0xb0, 0x2e, 0xea, 0x84, 0x3d, + 0xb6, 0xed, 0xf8, 0x70, 0xd0, 0x8e, 0xe6, 0x36, 0xdb, 0x74, 0x4c, 0xdf, 0x87, 0xfc, 0xd6, 0x4f, + 0xf0, 0xd6, 0xd6, 0x4f, 0xdb, 0x34, 0xa4, 0x5b, 0x3f, 0x01, 0x5f, 0xc5, 0xe9, 0x57, 0x05, 0xe2, + 0x55, 0x2c, 0xb0, 0xe2, 0x97, 0xf4, 0x2a, 0xdf, 0x92, 0x55, 0xbf, 0xc4, 0x57, 0x59, 0xa1, 0x4b, + 0xaf, 0xb6, 0x7d, 0xfd, 0x55, 0x56, 0xbd, 0x57, 0xd9, 0xa6, 0xde, 0xab, 0x54, 0x2f, 0xa8, 0x57, + 0xa9, 0x5e, 0x6a, 0xaf, 0x62, 0xca, 0xab, 0x7c, 0x56, 0xb5, 0x57, 0x96, 0x25, 0x7b, 0xb5, 0xe8, + 0x05, 0xef, 0xd5, 0xa2, 0x97, 0xda, 0xab, 0xcc, 0x2a, 0xaf, 0x82, 0x97, 0x6d, 0xe3, 0x60, 0x22, + 0x2d, 0x88, 0xc1, 0xe4, 0xa3, 0x88, 0xd7, 0xdc, 0x61, 0xec, 0xf5, 0x07, 0xd0, 0xe1, 0xf8, 0xc5, + 0x0e, 0x0e, 0xf9, 0x26, 0xb3, 0xdc, 0xb8, 0x7d, 0x4c, 0xda, 0xb6, 0x18, 0xb8, 0xa3, 0x43, 0xaa, + 0x48, 0xad, 0x61, 0x93, 0x99, 0x36, 0x0a, 0x0f, 0x1f, 0xa4, 0x30, 0x84, 0x56, 0xbb, 0x66, 0x68, + 0x97, 0xd7, 0xe7, 0xe8, 0x15, 0x39, 0xa6, 0x67, 0xb3, 0xa4, 0x22, 0x7f, 0x33, 0x04, 0xa9, 0xf4, + 0xc2, 0xf2, 0x8a, 0x5c, 0xbd, 0xa2, 0x20, 0x0c, 0x99, 0x1d, 0xca, 0x8a, 0xbc, 0x4d, 0xd3, 0xb5, + 0x5c, 0xcf, 0x2f, 0xaf, 0xc8, 0x53, 0x2b, 0x72, 0x37, 0x5d, 0x9f, 0x79, 0xf2, 0x34, 0x0c, 0x0b, + 0x9d, 0x4d, 0x50, 0x78, 0xd3, 0xa9, 0x00, 0x95, 0xaf, 0x56, 0xe4, 0x6d, 0x3a, 0xcc, 0x0e, 0x9c, + 0xa4, 0x45, 0xd6, 0xa6, 0xe3, 0x79, 0x3e, 0xbc, 0xae, 0xb4, 0xa2, 0x40, 0xad, 0xc8, 0x87, 0x8a, + 0x5c, 0x6f, 0x51, 0x91, 0xb9, 0x19, 0x30, 0xdf, 0x77, 0x2a, 0x60, 0x14, 0xaa, 0x15, 0x05, 0x9b, + 0x2e, 0x18, 0x11, 0xd7, 0x93, 0xaa, 0x15, 0x6e, 0x5a, 0x7e, 0x60, 0x86, 0xac, 0xbc, 0xa2, 0x91, + 0x5a, 0x51, 0xb8, 0x19, 0xb8, 0xbe, 0x1f, 0x04, 0xb2, 0x22, 0x1f, 0x3f, 0x07, 0xac, 0x42, 0x8b, + 0xc6, 0x4a, 0x45, 0x3e, 0xa3, 0x16, 0xf8, 0x49, 0x8b, 0x3c, 0x6a, 0x61, 0x50, 0x01, 0xa3, 0x89, + 0x5a, 0x91, 0x25, 0x31, 0x11, 0x15, 0xb9, 0x12, 0xb3, 0xd2, 0x8a, 0xa6, 0x6a, 0x45, 0x8e, 0x1c, + 0x25, 0x51, 0x91, 0x43, 0xa3, 0x08, 0x2a, 0x53, 0x5a, 0xd1, 0x4c, 0xad, 0xc8, 0x23, 0xb9, 0xb1, + 0x7c, 0x59, 0x91, 0x4d, 0x72, 0x55, 0xa5, 0x6b, 0x91, 0x5a, 0x51, 0x40, 0x92, 0xec, 0xb2, 0x84, + 0x10, 0xa5, 0xa4, 0x97, 0x55, 0xe4, 0x98, 0x6a, 0x45, 0x21, 0xe9, 0x96, 0x1d, 0x2c, 0x2a, 0x12, + 0xba, 0x57, 0x5a, 0x91, 0xaa, 0xfd, 0x01, 0x23, 0x6d, 0xf7, 0x53, 0x15, 0x09, 0x36, 0x28, 0xad, + 0xc8, 0x52, 0x2b, 0x4a, 0x91, 0x7c, 0x29, 0x2a, 0x56, 0x1e, 0x11, 0x81, 0xc0, 0x98, 0x8e, 0x13, + 0x02, 0x9d, 0xd6, 0x6d, 0x0a, 0x10, 0x9b, 0x52, 0x11, 0xa0, 0x6c, 0x83, 0x20, 0x5a, 0xb5, 0xc1, + 0xd1, 0x18, 0x0d, 0x94, 0x2a, 0x74, 0x7c, 0x67, 0x21, 0x89, 0x95, 0x87, 0x4b, 0x63, 0xb4, 0x90, + 0x6d, 0xfa, 0xc0, 0x1e, 0x60, 0xfc, 0x6b, 0x0b, 0x90, 0xca, 0x68, 0x21, 0x14, 0xb4, 0xed, 0x84, + 0xf5, 0xeb, 0x88, 0xb4, 0xca, 0x68, 0x60, 0xab, 0xa0, 0x3b, 0xd6, 0x42, 0x12, 0xab, 0x2b, 0x99, + 0xca, 0x68, 0x40, 0xce, 0xbe, 0x05, 0x84, 0xe8, 0xd4, 0x57, 0x7b, 0x95, 0xd1, 0xc2, 0x60, 0x93, + 0x39, 0x96, 0xc5, 0xac, 0xfa, 0x44, 0xa4, 0x32, 0x1a, 0x18, 0x30, 0xc7, 0x06, 0x4f, 0xc0, 0xa9, + 0x4f, 0x8d, 0x0a, 0xa3, 0xd9, 0xa6, 0xb9, 0xe9, 0x06, 0x8e, 0x9d, 0x60, 0x54, 0x83, 0xac, 0x27, + 0x6a, 0x45, 0x0c, 0x2a, 0xf2, 0xd8, 0xa2, 0xa2, 0xea, 0xe6, 0x63, 0xaa, 0x56, 0x04, 0x05, 0xad, + 0xc0, 0x76, 0x56, 0x30, 0x68, 0x33, 0xb5, 0x22, 0x1b, 0x74, 0xcb, 0x84, 0x36, 0xd5, 0x37, 0xb1, + 0x91, 0x5e, 0x91, 0x1b, 0xda, 0x5e, 0x10, 0xd6, 0x36, 0xfa, 0x2a, 0xa3, 0x61, 0x45, 0x41, 0xe8, + 0xf9, 0x6e, 0x58, 0xdb, 0x0d, 0x51, 0x19, 0x4d, 0x71, 0x01, 0x4b, 0x3b, 0xc3, 0x72, 0x88, 0x48, + 0x6f, 0x8a, 0x65, 0x3a, 0x44, 0x4c, 0x66, 0x05, 0x70, 0xac, 0x22, 0x70, 0x2c, 0xd3, 0x23, 0x62, + 0xb2, 0xeb, 0x32, 0x9a, 0x3e, 0x5c, 0x96, 0xe9, 0x13, 0x31, 0xd9, 0x75, 0x7d, 0x34, 0x5d, 0x80, + 0x2c, 0x33, 0x24, 0x62, 0x82, 0x49, 0x50, 0x3d, 0x46, 0xd3, 0x45, 0xda, 0x62, 0x4c, 0x12, 0x53, + 0x3d, 0x46, 0xd3, 0x95, 0x0c, 0xfd, 0x73, 0x41, 0x4c, 0x75, 0x19, 0x4d, 0x55, 0x7b, 0x8b, 0x39, + 0x44, 0x4c, 0x66, 0x7d, 0x46, 0x53, 0x89, 0xc8, 0x62, 0x1e, 0x7e, 0x66, 0x41, 0x85, 0x16, 0x85, + 0x45, 0xd4, 0x68, 0x31, 0x9f, 0x5a, 0xc8, 0x2a, 0x60, 0x34, 0x2a, 0x22, 0x6b, 0x68, 0x8b, 0xc4, + 0xac, 0xa6, 0x8f, 0xa6, 0x99, 0x0f, 0x68, 0x1c, 0x8d, 0x62, 0x15, 0x22, 0x9a, 0x14, 0x19, 0x34, + 0xcb, 0x32, 0x49, 0xae, 0xaa, 0x74, 0x6d, 0x5a, 0x64, 0x62, 0x01, 0x76, 0x29, 0xe9, 0x35, 0x7d, + 0x34, 0xcd, 0xe8, 0x63, 0x45, 0x42, 0xf7, 0x6a, 0xfa, 0x68, 0x9a, 0x1b, 0x82, 0x15, 0x09, 0x36, + 0xa8, 0xe9, 0xa3, 0xa5, 0x27, 0x88, 0xa5, 0x6d, 0x30, 0x73, 0x3d, 0x22, 0xd5, 0x39, 0xab, 0xd1, + 0x14, 0x5b, 0xad, 0x48, 0x73, 0x17, 0xeb, 0x80, 0xa3, 0x7a, 0x79, 0x9a, 0x03, 0x5b, 0x67, 0xb8, + 0x54, 0x1f, 0x4d, 0x73, 0xa9, 0xeb, 0x08, 0x90, 0xea, 0xa3, 0x69, 0x4e, 0x7e, 0x1d, 0x91, 0x56, + 0x7d, 0x34, 0x6d, 0xda, 0x51, 0x47, 0xc9, 0x54, 0x1f, 0x4d, 0x9b, 0x08, 0xd5, 0x51, 0x7b, 0x6d, + 0xd6, 0xa9, 0x4e, 0xcd, 0xea, 0x10, 0x91, 0x36, 0xeb, 0x54, 0x27, 0x8b, 0x75, 0xa8, 0x51, 0x9b, + 0x75, 0xaa, 0xd3, 0xd7, 0x3a, 0x64, 0xad, 0xcd, 0x3a, 0xd5, 0x09, 0x75, 0x1d, 0xf3, 0xa1, 0x32, + 0x9a, 0x36, 0xc5, 0xaf, 0x63, 0xd0, 0x54, 0x46, 0xd3, 0x82, 0x0e, 0x75, 0x4c, 0xec, 0x54, 0xaf, + 0x28, 0x1d, 0x06, 0xa9, 0x63, 0xf4, 0x67, 0x7a, 0x45, 0xe9, 0xc0, 0x4c, 0x1d, 0x37, 0x24, 0xd2, + 0x2a, 0x5a, 0x29, 0x46, 0x84, 0x11, 0xa8, 0xe2, 0xc8, 0xb5, 0x49, 0xff, 0x9a, 0xc8, 0x75, 0xed, + 0xc8, 0xf5, 0xfd, 0x59, 0x78, 0x4a, 0x47, 0xab, 0x4d, 0x25, 0x5a, 0xed, 0x8c, 0x22, 0x16, 0x4c, + 0x78, 0xb4, 0xda, 0xe4, 0xc1, 0x6a, 0x35, 0x56, 0x0d, 0x8e, 0x1b, 0x0f, 0x56, 0x7b, 0xd6, 0x26, + 0x98, 0x12, 0xd4, 0x41, 0x0a, 0x56, 0x53, 0xfa, 0x8e, 0x9a, 0xde, 0x91, 0xe9, 0x1d, 0x35, 0x5d, + 0x0d, 0x57, 0x9b, 0x4a, 0xb8, 0xda, 0xca, 0x8d, 0x21, 0x87, 0x16, 0x6f, 0x1e, 0x1b, 0x4d, 0x44, + 0xc4, 0xd6, 0x32, 0x2b, 0x87, 0x6a, 0xd9, 0xa2, 0x70, 0x7e, 0xa1, 0x4c, 0xd0, 0x75, 0xd1, 0x96, + 0x9c, 0x50, 0x47, 0x58, 0xa6, 0x4f, 0xd4, 0xc8, 0x3c, 0xc3, 0x9e, 0x6a, 0x50, 0x69, 0x0d, 0x66, + 0xa3, 0x91, 0x8d, 0x46, 0x92, 0x46, 0x8e, 0x41, 0xe2, 0x02, 0xae, 0x91, 0x36, 0xd7, 0x48, 0xa6, + 0x68, 0x64, 0x60, 0x82, 0xf1, 0x03, 0x73, 0x68, 0x73, 0xbd, 0x64, 0x9b, 0x42, 0x23, 0x53, 0xe9, + 0x3b, 0x32, 0xbd, 0xa3, 0xa6, 0x77, 0x64, 0x7a, 0x65, 0x8d, 0xf4, 0x53, 0x56, 0x85, 0x9a, 0x17, + 0x3a, 0x41, 0x65, 0x8d, 0x0c, 0x73, 0x0a, 0x5f, 0x41, 0x23, 0xfd, 0xca, 0x16, 0x8e, 0x1a, 0x99, + 0xa3, 0x91, 0x61, 0x9d, 0x1a, 0xea, 0x68, 0x64, 0xb3, 0xba, 0xdb, 0x6c, 0x09, 0xb9, 0x9d, 0x75, + 0xe4, 0xa3, 0xde, 0x16, 0x3c, 0x19, 0xb9, 0xcd, 0x82, 0x72, 0xb3, 0xa0, 0xdc, 0x2c, 0x28, 0x37, + 0x0b, 0xca, 0xcd, 0x82, 0x72, 0xb3, 0xa0, 0xdc, 0x2c, 0x28, 0x37, 0x0b, 0xca, 0xcd, 0x82, 0x72, + 0xb3, 0xa0, 0xdc, 0x2c, 0x28, 0x37, 0x0b, 0xca, 0xcd, 0x82, 0x72, 0xb3, 0xa0, 0xdc, 0x2c, 0x28, + 0x37, 0x0b, 0xca, 0xcd, 0x82, 0x72, 0xb3, 0xa0, 0xdc, 0x2c, 0x28, 0x37, 0x0b, 0xca, 0xcd, 0x82, + 0xf2, 0x03, 0x0f, 0x96, 0x3f, 0xb0, 0xb0, 0xb5, 0x33, 0x89, 0x2c, 0x4f, 0x2c, 0x28, 0x33, 0x47, + 0xc6, 0xad, 0x43, 0x97, 0x07, 0xae, 0x4d, 0x25, 0x6c, 0xcd, 0x6c, 0x20, 0x4f, 0xfc, 0x27, 0x96, + 0x98, 0x7f, 0x60, 0x26, 0x4e, 0xde, 0x2d, 0x60, 0x2f, 0x1e, 0xc0, 0x4e, 0x3f, 0xb0, 0xa3, 0x3f, + 0xd0, 0xd1, 0x1e, 0xe8, 0xe8, 0x0f, 0xd4, 0x0e, 0x6a, 0x33, 0xb4, 0x9c, 0xf0, 0x0f, 0xa6, 0x21, + 0xd4, 0x97, 0x28, 0x90, 0x31, 0xeb, 0x50, 0xa6, 0x97, 0x05, 0x92, 0x6d, 0xf9, 0xe0, 0x92, 0x0a, + 0x45, 0x64, 0xda, 0x29, 0x5b, 0x3b, 0xd3, 0x6b, 0x42, 0x93, 0xa9, 0xd6, 0xc4, 0xea, 0x35, 0x6d, + 0xa1, 0xce, 0x99, 0x9a, 0xcc, 0xc2, 0x36, 0x2d, 0x0b, 0x28, 0xbb, 0x79, 0x5c, 0x91, 0xea, 0x70, + 0x31, 0x65, 0x20, 0xb4, 0xf9, 0x73, 0xa8, 0x25, 0xf8, 0x95, 0x55, 0x97, 0x17, 0x1b, 0x2a, 0x00, + 0xb1, 0xac, 0xba, 0xdc, 0xe5, 0xc3, 0x1c, 0x08, 0xcb, 0xea, 0xc9, 0x75, 0xd0, 0xae, 0x84, 0x16, + 0xd4, 0xd4, 0xdf, 0x87, 0xf1, 0xb8, 0x35, 0x3d, 0x3a, 0x18, 0xbe, 0xbc, 0x9c, 0x1f, 0x98, 0x26, + 0x2e, 0x1d, 0x33, 0xfa, 0x17, 0x1f, 0x98, 0x0c, 0x35, 0xe9, 0xc0, 0xb4, 0xe8, 0xc2, 0x4c, 0x7e, + 0x61, 0xf8, 0x08, 0x14, 0xf2, 0xc0, 0xf8, 0x1c, 0x30, 0x9e, 0x67, 0x99, 0xa9, 0xda, 0x43, 0xf8, + 0xcc, 0x52, 0xb5, 0x07, 0xf0, 0xd9, 0xc2, 0x7e, 0xc7, 0xfd, 0x6d, 0x40, 0xa7, 0xdf, 0x1e, 0x60, + 0x99, 0x6e, 0x67, 0x08, 0x69, 0x0c, 0xd7, 0xc0, 0x7b, 0xe8, 0x18, 0xf9, 0x71, 0x7f, 0x1f, 0x53, + 0x5c, 0x27, 0x6e, 0x1d, 0x0d, 0x71, 0x01, 0xc4, 0x8b, 0xf9, 0xbf, 0x17, 0xfb, 0xc0, 0x68, 0x2f, + 0xf8, 0xa9, 0xdc, 0x38, 0xce, 0x9c, 0xeb, 0x65, 0xe2, 0x5c, 0xef, 0xba, 0x76, 0xae, 0xf7, 0x47, + 0xf8, 0x3d, 0xe6, 0x67, 0x7b, 0x19, 0x3f, 0xdb, 0x6b, 0x16, 0x9f, 0xed, 0xcd, 0xbc, 0x2a, 0xde, + 0xed, 0xb7, 0x2f, 0xe7, 0xbb, 0x48, 0x72, 0x16, 0xcc, 0x1d, 0x76, 0x69, 0x95, 0x3e, 0xc0, 0xb3, + 0xd2, 0xb8, 0x6a, 0xef, 0xc1, 0xf5, 0x15, 0xbf, 0x72, 0x8b, 0xc7, 0x4c, 0xfc, 0x81, 0x52, 0xed, + 0x01, 0x94, 0x6a, 0xd3, 0x0b, 0x77, 0xdb, 0xcf, 0xb9, 0x31, 0xc4, 0xff, 0xf0, 0x09, 0x4c, 0x26, + 0xfc, 0x7e, 0x81, 0x2f, 0x3b, 0x1a, 0x90, 0x75, 0x38, 0x1a, 0x10, 0x63, 0xc6, 0xff, 0x0f, 0x6a, + 0x3a, 0xbb, 0x3d, 0xc0, 0x44, 0x15, 0x5a, 0x00, 0x00, 0x00, 0xbf, 0x6d, 0x6b, 0x42, 0x53, 0x78, + 0x9c, 0x5d, 0x4e, 0xbb, 0x0e, 0xc2, 0x30, 0x0c, 0xf4, 0xc8, 0x67, 0xf0, 0x09, 0x29, 0x8f, 0x00, + 0x23, 0x0d, 0xa5, 0x44, 0x4d, 0x00, 0xf5, 0x21, 0x5a, 0x36, 0xa8, 0x6a, 0xa9, 0x12, 0x0b, 0x42, + 0x64, 0xb1, 0xfc, 0xef, 0x24, 0x14, 0x18, 0xb8, 0xe5, 0x7c, 0x3e, 0x9f, 0x75, 0x36, 0x8b, 0x1d, + 0x6d, 0x73, 0xd5, 0x53, 0xc4, 0xb5, 0x51, 0x48, 0x82, 0x9b, 0x81, 0x4e, 0x7a, 0x83, 0x34, 0x99, + 0x4b, 0xde, 0xe9, 0x12, 0x29, 0x5a, 0x4c, 0x38, 0x4f, 0x0a, 0xa4, 0xc0, 0x45, 0xd5, 0xfb, 0x83, + 0x38, 0xf5, 0x29, 0xfc, 0x80, 0x4d, 0x63, 0x1c, 0x99, 0x75, 0xe3, 0x28, 0xce, 0xd2, 0xab, 0xb7, + 0xab, 0xdc, 0x04, 0x32, 0x7b, 0xfb, 0x20, 0x18, 0x81, 0x82, 0x0b, 0xdc, 0xe0, 0x0e, 0x4f, 0xe8, + 0x60, 0x0c, 0x11, 0xdb, 0xe2, 0x6d, 0x2b, 0xe3, 0x63, 0x2a, 0x09, 0x59, 0x95, 0x85, 0x45, 0x62, + 0xac, 0x23, 0x6d, 0x53, 0x47, 0xf5, 0x61, 0xfb, 0xae, 0x33, 0xd0, 0x5f, 0xb9, 0x63, 0xed, 0x1b, + 0x0b, 0xc1, 0xbb, 0x30, 0x5c, 0x5a, 0x2e, 0x8b, 0x73, 0x4f, 0x4b, 0xc1, 0xa5, 0xf6, 0xaf, 0x4a, + 0xbd, 0xe9, 0x69, 0x8a, 0x53, 0x31, 0xeb, 0x96, 0x3c, 0x88, 0x0e, 0x5b, 0x21, 0xbf, 0x02, 0x23, + 0xd9, 0xa2, 0xf8, 0x39, 0x52, 0xae, 0x04, 0x7f, 0xf1, 0x02, 0xe5, 0x62, 0x5c, 0x2f, 0xca, 0x8a, + 0xa4, 0x3f, 0x00, 0x00, 0x2a, 0x1b, 0x6d, 0x6b, 0x42, 0x54, 0xfa, 0xce, 0xca, 0xfe, 0x01, 0x7b, + 0x2e, 0xf0, 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, 0x78, 0x9c, 0xed, 0x7d, 0x2b, 0xc0, 0x24, 0x2b, 0x92, 0x6e, + 0xca, 0x94, 0x69, 0x53, 0xa6, 0x4c, 0x99, 0x16, 0x99, 0x12, 0x89, 0xc4, 0x22, 0x91, 0x29, 0xb1, + 0x48, 0x64, 0x4a, 0x2c, 0x12, 0x89, 0x44, 0x62, 0x91, 0x48, 0x24, 0x16, 0x89, 0x8c, 0x1b, 0x54, + 0x9f, 0x33, 0x3b, 0x3b, 0xb3, 0xb3, 0x57, 0xd6, 0x8a, 0x8a, 0xf3, 0xe8, 0xee, 0x7a, 0xfc, 0x5d, + 0x40, 0x3c, 0xbe, 0x2f, 0x1e, 0x94, 0xac, 0xc7, 0x76, 0xb0, 0xaa, 0x00, 0xd8, 0x72, 0x8f, 0x5b, + 0xeb, 0xf5, 0x1e, 0x70, 0xc1, 0x49, 0xe1, 0x05, 0xd8, 0x77, 0xe1, 0x8c, 0x0f, 0x80, 0xcf, 0x02, + 0xdd, 0x60, 0x59, 0x1b, 0x05, 0x58, 0x80, 0x03, 0x68, 0x80, 0x9b, 0xc3, 0x0d, 0x9d, 0xaa, 0x3c, + 0xf0, 0x59, 0xb7, 0xc8, 0x76, 0xbe, 0x86, 0x54, 0x7c, 0x52, 0x6e, 0x15, 0x5f, 0x7e, 0xc6, 0x1b, + 0x80, 0xd7, 0x70, 0x39, 0x60, 0x82, 0xbb, 0x1a, 0xc8, 0x4d, 0xdf, 0x7b, 0xe1, 0xa5, 0x03, 0x9c, + 0xeb, 0x01, 0x1d, 0x4e, 0xa1, 0xce, 0xb0, 0x7c, 0x59, 0xb6, 0x7d, 0x97, 0xcb, 0x76, 0x40, 0x06, + 0x10, 0x5b, 0x2f, 0xef, 0xa0, 0x3b, 0xab, 0x50, 0xf9, 0x36, 0x40, 0x5f, 0x15, 0x57, 0xe7, 0xee, + 0x80, 0xeb, 0x03, 0xb5, 0x96, 0x72, 0x6b, 0x95, 0xf0, 0x0f, 0xa2, 0xcc, 0x47, 0x04, 0x3d, 0x2d, + 0x3c, 0xc0, 0xf7, 0xfb, 0xee, 0xb8, 0x1b, 0x62, 0x39, 0x46, 0xa9, 0xdd, 0xfa, 0x21, 0x21, 0x91, + 0x32, 0xdf, 0x72, 0xbe, 0x20, 0xb3, 0x5f, 0x16, 0x09, 0x10, 0x82, 0xb9, 0x9f, 0x1c, 0x70, 0x1f, + 0x55, 0xba, 0x1f, 0x7c, 0xef, 0xba, 0x31, 0x90, 0x57, 0xb5, 0xec, 0xdb, 0xeb, 0xdf, 0xb5, 0x79, + 0xed, 0xdd, 0x82, 0xb1, 0x00, 0x76, 0xa4, 0x44, 0x21, 0x38, 0x85, 0x87, 0x18, 0x44, 0x86, 0xa7, + 0xf2, 0x3d, 0x79, 0x31, 0x72, 0x90, 0x56, 0x9b, 0xb8, 0x74, 0xc7, 0x60, 0xf7, 0x40, 0xd9, 0x85, + 0xab, 0xbb, 0xb4, 0xe4, 0x0f, 0xbe, 0x09, 0x76, 0xf7, 0x74, 0x86, 0xea, 0xc3, 0x82, 0x37, 0x41, + 0x7b, 0xf3, 0x7a, 0x6f, 0xf5, 0xad, 0x4d, 0x05, 0x0f, 0x9e, 0x39, 0x58, 0x2e, 0x28, 0xdd, 0x2d, + 0xa6, 0xe3, 0xef, 0xf9, 0xdc, 0x96, 0x1d, 0x5f, 0x4d, 0x8f, 0x63, 0xf7, 0xfa, 0xb4, 0xf9, 0xdb, + 0xeb, 0x9f, 0x07, 0xe5, 0xe8, 0x28, 0x0f, 0x51, 0x78, 0x4e, 0x5e, 0x15, 0x1b, 0x5e, 0xc0, 0xa5, + 0x78, 0x26, 0x60, 0x70, 0xb8, 0x54, 0x73, 0x5e, 0x54, 0x54, 0x7b, 0x90, 0x50, 0x01, 0x3f, 0xb9, + 0x39, 0xbd, 0x7b, 0x85, 0x83, 0x60, 0xf0, 0xa1, 0x7b, 0xbe, 0xdd, 0x83, 0x63, 0xb7, 0x03, 0x7b, + 0x72, 0xfb, 0xe2, 0x66, 0x5e, 0x37, 0xb1, 0xd3, 0x74, 0xf0, 0xf8, 0x01, 0x12, 0xea, 0x95, 0xb7, + 0xb8, 0xb9, 0xb2, 0x77, 0xcb, 0x06, 0x2c, 0x0e, 0x77, 0x6a, 0xe3, 0x1e, 0x44, 0xda, 0x4f, 0xf7, + 0xdc, 0xdf, 0x5f, 0x7f, 0x47, 0xa5, 0xe4, 0x8f, 0x02, 0x7b, 0x6d, 0x97, 0x76, 0xd5, 0x3e, 0x26, + 0xbf, 0xfa, 0x2d, 0x59, 0xd1, 0x3e, 0x1e, 0x5c, 0x00, 0x79, 0xd4, 0xd9, 0x86, 0x79, 0xd8, 0x74, + 0x02, 0xe1, 0x63, 0x0b, 0xcd, 0xc1, 0x75, 0xe2, 0xaf, 0x2f, 0x24, 0xa9, 0x9e, 0x17, 0x9e, 0xa4, + 0xe5, 0xd1, 0x80, 0x87, 0xe6, 0x5f, 0xe9, 0x0a, 0xdd, 0x88, 0x86, 0x1a, 0x76, 0x76, 0xe2, 0x76, + 0x85, 0x84, 0x87, 0xcd, 0x85, 0xec, 0x55, 0xbe, 0xa8, 0x4a, 0x1c, 0x95, 0x40, 0xed, 0xac, 0xc1, + 0x34, 0x9d, 0x1b, 0x5a, 0xfb, 0xfa, 0xfa, 0x61, 0x45, 0x97, 0x86, 0x36, 0x19, 0x48, 0x78, 0x56, + 0x3a, 0x46, 0xc4, 0xc5, 0x36, 0xf4, 0x51, 0x3e, 0x4b, 0xd3, 0x53, 0x79, 0xf7, 0x2e, 0xf6, 0x26, + 0x17, 0xdb, 0x7b, 0xf1, 0x83, 0xcb, 0x3c, 0x7d, 0x41, 0x64, 0xe4, 0x3a, 0x08, 0x4b, 0x15, 0x4e, + 0xfc, 0x95, 0x3f, 0x32, 0xf0, 0x13, 0x17, 0x83, 0xff, 0x0c, 0x6e, 0x33, 0x9c, 0xb0, 0xe0, 0xf6, + 0xec, 0x37, 0x2c, 0x12, 0x4f, 0x1c, 0x4d, 0x45, 0x4e, 0x23, 0x10, 0x1b, 0x48, 0x46, 0x60, 0x3f, + 0xa6, 0x16, 0x2d, 0x0a, 0x9d, 0x6a, 0xa2, 0x14, 0xbe, 0xbd, 0xfe, 0xcc, 0x21, 0xa2, 0xf7, 0x6a, + 0x0d, 0x14, 0x83, 0x7b, 0x17, 0x05, 0x72, 0x2b, 0xe8, 0x9c, 0xc3, 0x1d, 0x25, 0x41, 0xd3, 0x18, + 0xbe, 0xbb, 0x71, 0xac, 0x68, 0x0c, 0x8f, 0x8b, 0xe3, 0x24, 0x53, 0xa9, 0xaf, 0x81, 0x8e, 0x40, + 0xdc, 0xfb, 0xde, 0xdb, 0x25, 0x8c, 0x25, 0x7c, 0x39, 0x60, 0xc6, 0x85, 0xd0, 0x7d, 0x36, 0xa2, + 0xd7, 0xf9, 0x07, 0x2e, 0x3f, 0x9a, 0xf2, 0x6a, 0x15, 0x55, 0x99, 0xeb, 0x14, 0x10, 0x09, 0xa0, + 0xff, 0x37, 0x4b, 0x42, 0x43, 0x02, 0xb2, 0xe3, 0x5f, 0x7b, 0x2d, 0xe6, 0xdb, 0xeb, 0xd7, 0xae, + 0x38, 0xf4, 0xd6, 0xe9, 0x60, 0x53, 0x13, 0x82, 0x15, 0xaa, 0x99, 0x65, 0x9c, 0x5b, 0xf2, 0x0b, + 0x6c, 0x68, 0xde, 0x46, 0xe7, 0x18, 0x05, 0xfa, 0x2d, 0xe5, 0x05, 0x2a, 0x2c, 0xba, 0x3f, 0x80, + 0xc2, 0xf8, 0xc7, 0xee, 0x87, 0x6e, 0x74, 0x0b, 0xf3, 0x84, 0x57, 0x54, 0x7f, 0x18, 0xc0, 0x65, + 0xbc, 0xd1, 0x00, 0x00, 0x8d, 0x5c, 0xbe, 0xf8, 0xc3, 0x9a, 0xfc, 0xec, 0xcb, 0x4d, 0x4f, 0xaf, + 0x73, 0xeb, 0xf8, 0x66, 0xc2, 0x5e, 0x7c, 0xe0, 0xc5, 0x9d, 0x7d, 0x45, 0xc4, 0x6d, 0xf8, 0xf6, + 0xf2, 0x97, 0x0a, 0x99, 0xa0, 0x3b, 0x47, 0x85, 0x46, 0x03, 0xf7, 0xc1, 0xd4, 0xf3, 0x8e, 0x6e, + 0xd1, 0x5e, 0x4b, 0x01, 0x62, 0x9d, 0x9f, 0xbf, 0x5b, 0xf4, 0x64, 0x41, 0xdd, 0x9c, 0xd2, 0xa5, + 0x79, 0x8e, 0x1e, 0xc0, 0x5f, 0x67, 0xa7, 0xb9, 0x3a, 0xd2, 0x3d, 0x68, 0x35, 0x3d, 0x23, 0x2a, + 0x7c, 0x03, 0x33, 0x06, 0x7a, 0xc2, 0xa1, 0x46, 0xc1, 0xc7, 0x23, 0x24, 0x7f, 0x1e, 0xcc, 0xa3, + 0x5b, 0x90, 0x5e, 0x59, 0xfc, 0x09, 0xe9, 0x45, 0x4f, 0x29, 0xf1, 0xd4, 0x1f, 0xfe, 0xd9, 0x80, + 0x9d, 0x1f, 0x15, 0xbe, 0x7e, 0xfe, 0xb9, 0x9b, 0xf7, 0xb8, 0xe1, 0xbc, 0x49, 0xc8, 0x91, 0x9b, + 0xec, 0x8c, 0x38, 0xe9, 0xfe, 0xe0, 0x09, 0x9a, 0x1d, 0x1e, 0x95, 0x0c, 0xb8, 0xc4, 0xbd, 0xe3, + 0xaf, 0x26, 0x0e, 0x43, 0xc3, 0x7d, 0x32, 0x1e, 0x34, 0xa3, 0x0b, 0x4c, 0x0b, 0xa0, 0x02, 0x3e, + 0x62, 0x13, 0x58, 0x07, 0xcd, 0xda, 0x58, 0x46, 0x7f, 0x6b, 0xb5, 0x68, 0xdc, 0x46, 0xdd, 0x57, + 0x49, 0xb7, 0x01, 0xb1, 0xa3, 0x2e, 0xc0, 0xd8, 0x0b, 0xfc, 0x2d, 0x68, 0x2d, 0x96, 0x83, 0x79, + 0xec, 0x55, 0xbf, 0xae, 0x00, 0x60, 0xde, 0x06, 0xb5, 0xa1, 0xe7, 0x46, 0x0d, 0xee, 0x6d, 0x3c, + 0x7d, 0x68, 0x52, 0x19, 0xe5, 0x05, 0x76, 0x54, 0xd2, 0x66, 0x8f, 0xab, 0x0e, 0x7d, 0x9e, 0x7c, + 0x64, 0xf4, 0xe4, 0xc5, 0x1c, 0xa2, 0x54, 0x40, 0x4f, 0xbe, 0x50, 0x5c, 0xd9, 0x49, 0xfa, 0x27, + 0x20, 0x84, 0xfd, 0xc1, 0x30, 0x82, 0x18, 0xef, 0xd4, 0x25, 0x55, 0x2d, 0x84, 0x62, 0xfc, 0xda, + 0xee, 0xd4, 0xf8, 0xc5, 0x32, 0xb0, 0xd6, 0x93, 0x91, 0xac, 0x79, 0x78, 0x9f, 0xcf, 0xfa, 0x05, + 0xd5, 0xf1, 0xe4, 0xe8, 0x64, 0x9a, 0xd6, 0xdf, 0x5e, 0xbf, 0xc6, 0xa3, 0xd6, 0xd3, 0x63, 0x81, + 0x41, 0xc4, 0x93, 0xfb, 0x3c, 0xa5, 0x8e, 0xbe, 0x9e, 0x51, 0x7a, 0x42, 0xb1, 0x1d, 0x9d, 0xc0, + 0x0b, 0x2f, 0xdb, 0x2f, 0x03, 0xe6, 0x42, 0x5d, 0xd7, 0x61, 0x00, 0x62, 0xe3, 0x7a, 0x6e, 0xbb, + 0x73, 0xa4, 0xdd, 0x44, 0x15, 0x44, 0x35, 0x7e, 0xdf, 0x0f, 0x72, 0x28, 0x7c, 0xd6, 0x8e, 0x4e, + 0xa8, 0xb4, 0x03, 0x8d, 0x6a, 0xe1, 0x40, 0xae, 0x30, 0x83, 0x60, 0x7d, 0x34, 0xa8, 0xc1, 0xef, + 0xe5, 0x11, 0xf7, 0x29, 0x60, 0x41, 0xed, 0xc7, 0xa7, 0x06, 0xee, 0x78, 0xfd, 0xf6, 0xfa, 0x39, + 0xc7, 0x45, 0x2d, 0x5b, 0x8f, 0xad, 0x6e, 0xfb, 0x05, 0x86, 0x18, 0x3a, 0xb7, 0xe0, 0x4c, 0x69, + 0xad, 0x43, 0x7e, 0x1c, 0x00, 0xba, 0x87, 0x25, 0xa0, 0x91, 0x7b, 0xb6, 0xb4, 0xe9, 0xcf, 0x18, + 0x06, 0xb7, 0xf7, 0xd0, 0xe2, 0x3c, 0x31, 0x4a, 0xbc, 0x64, 0x91, 0xf5, 0x80, 0xb8, 0xb9, 0x65, + 0x7f, 0xa8, 0x76, 0x6d, 0xdc, 0x3b, 0xac, 0x54, 0x8f, 0x0d, 0xe3, 0x3e, 0xab, 0x77, 0xbe, 0x50, + 0xc9, 0x11, 0x29, 0x58, 0xc9, 0xcd, 0xa3, 0x17, 0x0c, 0xfe, 0x4b, 0x86, 0x5a, 0x51, 0x97, 0x58, + 0x21, 0x2b, 0x7d, 0xbe, 0xbd, 0x7e, 0x43, 0x1a, 0x58, 0x40, 0x2d, 0x20, 0xd1, 0x3e, 0xeb, 0x19, + 0x3c, 0x21, 0xbc, 0x9b, 0x89, 0x5b, 0x18, 0x2d, 0x12, 0x28, 0x7e, 0xf8, 0x8a, 0x9b, 0x80, 0x94, + 0x26, 0xd6, 0x66, 0x0b, 0xfa, 0x05, 0x78, 0xca, 0x31, 0xc0, 0x4c, 0x07, 0x86, 0x80, 0xb0, 0x40, + 0xdc, 0x17, 0xa4, 0x42, 0x2f, 0x86, 0xb5, 0x01, 0x68, 0xff, 0x12, 0x63, 0xa5, 0x36, 0xd4, 0xd5, + 0x75, 0xea, 0x54, 0xe6, 0x4e, 0x6d, 0x1f, 0xd4, 0xe4, 0x8f, 0x3f, 0xc1, 0x00, 0x5e, 0x85, 0x1b, + 0x63, 0x35, 0x03, 0x4e, 0xb7, 0xcb, 0x7f, 0x7b, 0xfd, 0xe0, 0x09, 0x62, 0x1f, 0x90, 0xfa, 0x8d, + 0x12, 0x2c, 0xbb, 0x2e, 0x1b, 0x36, 0x2f, 0x7d, 0x8b, 0xe8, 0xb3, 0x84, 0x8e, 0xaf, 0x84, 0x5c, + 0xa6, 0x46, 0x5c, 0x21, 0x71, 0xd4, 0x7c, 0x8d, 0xd6, 0x2f, 0x85, 0x7b, 0x13, 0x86, 0xc6, 0x20, + 0x69, 0x64, 0xbb, 0x9b, 0xa1, 0x11, 0x7f, 0x02, 0x5b, 0x06, 0x82, 0x5d, 0x1b, 0xd5, 0x03, 0xfb, + 0x6b, 0xdf, 0xa7, 0xf0, 0x55, 0xc1, 0x78, 0x89, 0x9b, 0x4c, 0xe9, 0x9c, 0xaf, 0xba, 0x99, 0x9d, + 0x60, 0x79, 0x6a, 0xd7, 0x85, 0x8c, 0x69, 0x97, 0xb2, 0xbc, 0x5f, 0xe7, 0x7f, 0xd0, 0xcf, 0x03, + 0x61, 0x7b, 0x66, 0x48, 0xf4, 0xd0, 0x2f, 0xbf, 0xda, 0x57, 0x7f, 0x3d, 0xc4, 0x88, 0x00, 0xfc, + 0x7a, 0x22, 0x25, 0xe7, 0x3d, 0x49, 0x0c, 0x5c, 0x24, 0x88, 0x13, 0x8c, 0x34, 0xad, 0x5e, 0x9b, + 0xeb, 0x93, 0xf3, 0x02, 0x39, 0xa4, 0x20, 0x68, 0xcb, 0xe4, 0xe3, 0xd5, 0x9c, 0x75, 0x9c, 0xda, + 0x8a, 0xfb, 0x76, 0x74, 0xa1, 0x9d, 0xb1, 0x12, 0x21, 0x30, 0x6e, 0x18, 0x28, 0x64, 0x04, 0x3b, + 0x7a, 0xbe, 0xac, 0x90, 0x59, 0x06, 0xc1, 0x3b, 0xa4, 0x7d, 0x92, 0x87, 0x0b, 0xd2, 0xf7, 0x01, + 0x00, 0x32, 0xf8, 0xc7, 0x8a, 0xf1, 0xfa, 0x2d, 0x74, 0x84, 0xaf, 0x79, 0xe0, 0xc2, 0x4d, 0xcb, + 0xe4, 0xa9, 0x06, 0xe3, 0x17, 0xd4, 0xbc, 0xae, 0xb2, 0xe6, 0x07, 0xe2, 0x75, 0xd6, 0x9a, 0x9b, + 0x7b, 0xa8, 0xc9, 0xfe, 0xa2, 0x1d, 0x86, 0x0c, 0x8e, 0x1c, 0x37, 0x63, 0x51, 0x33, 0x8c, 0x02, + 0x6e, 0x60, 0x20, 0x15, 0xfb, 0xe8, 0xb6, 0xc0, 0x49, 0x2f, 0x0c, 0x82, 0xc9, 0x37, 0xbd, 0xe2, + 0x62, 0x35, 0xe9, 0x3d, 0xf0, 0x0f, 0x7d, 0xe8, 0xfa, 0x6c, 0xb7, 0x35, 0x12, 0x66, 0x52, 0x60, + 0xba, 0x3f, 0x2f, 0xbf, 0xbd, 0xfe, 0x89, 0x53, 0x8d, 0x99, 0x21, 0x79, 0x31, 0x70, 0xb2, 0x20, + 0x99, 0x8a, 0x68, 0xc8, 0x17, 0xb2, 0x1a, 0x41, 0x3f, 0xe7, 0x4a, 0xcf, 0x30, 0xb1, 0x5d, 0xd8, + 0xce, 0x8a, 0xcf, 0x18, 0x82, 0x8f, 0x06, 0x2a, 0xc7, 0xb8, 0x2f, 0x59, 0xce, 0xf3, 0x1d, 0x8a, + 0x0d, 0x26, 0xe3, 0xc8, 0xb8, 0x23, 0xa8, 0x16, 0xe8, 0x32, 0x47, 0x5d, 0xc7, 0x71, 0x7b, 0x1f, + 0x30, 0x82, 0x54, 0x58, 0xcb, 0x33, 0xb5, 0x65, 0x59, 0xa4, 0xc4, 0xe3, 0x46, 0x1d, 0x9a, 0x9c, + 0x19, 0x19, 0x47, 0xda, 0x7a, 0x1d, 0x41, 0x7d, 0x7b, 0xfd, 0x81, 0xa4, 0xf1, 0xde, 0xf0, 0xa0, + 0x93, 0x5f, 0x93, 0xbe, 0x2f, 0xc8, 0x03, 0x83, 0xf5, 0x86, 0x8b, 0x14, 0x63, 0x90, 0xf3, 0x31, + 0x17, 0x3c, 0x27, 0xb9, 0xff, 0x00, 0x97, 0xb0, 0x49, 0xb7, 0xf8, 0x63, 0x83, 0x77, 0x93, 0x8c, + 0x01, 0xc5, 0x87, 0x6b, 0x41, 0x17, 0x46, 0xdc, 0xa4, 0x8a, 0x6f, 0x1a, 0x03, 0x99, 0xb2, 0x2c, + 0x94, 0xc1, 0xa0, 0x18, 0xed, 0x05, 0xba, 0xc0, 0x1b, 0x1d, 0xc9, 0x4e, 0x26, 0xe3, 0xa1, 0x73, + 0xe7, 0xe0, 0x06, 0xc3, 0xe6, 0x76, 0x12, 0xe4, 0x4c, 0xa3, 0x1a, 0xf1, 0xed, 0xf5, 0x8b, 0x70, + 0x90, 0x6e, 0xed, 0xd0, 0x77, 0xaf, 0x1b, 0xd8, 0x77, 0x6f, 0x1b, 0x32, 0x54, 0xfc, 0xa4, 0xe8, + 0xb7, 0xf0, 0xc3, 0x27, 0xb7, 0x40, 0xae, 0x69, 0xe9, 0x30, 0x7d, 0x20, 0x90, 0x75, 0xc2, 0x77, + 0x8c, 0x6b, 0xfb, 0x86, 0x21, 0x7d, 0x12, 0x9c, 0x81, 0xfb, 0xf0, 0x98, 0xe7, 0x6d, 0xbe, 0x8a, + 0x9c, 0xe1, 0x79, 0xa3, 0xfe, 0x80, 0xc2, 0x71, 0xf6, 0xee, 0x65, 0xc9, 0x70, 0x10, 0xb3, 0xef, + 0x13, 0x04, 0x5c, 0x9e, 0xb2, 0x08, 0x3d, 0x4e, 0xee, 0xa7, 0x21, 0x30, 0xaf, 0x32, 0x28, 0xf2, + 0xed, 0xf5, 0x9f, 0xd6, 0x5c, 0x7e, 0xaa, 0x64, 0xe1, 0x16, 0xb1, 0xfc, 0xbb, 0x65, 0x49, 0x2c, + 0x7a, 0xa7, 0x84, 0x1b, 0x80, 0x5b, 0xe0, 0xd1, 0x2a, 0x22, 0xc9, 0xf8, 0xdb, 0x44, 0xbd, 0xba, + 0x41, 0x4e, 0xde, 0x0f, 0xb7, 0x98, 0x6e, 0x2e, 0xc2, 0xeb, 0xde, 0x33, 0x88, 0x98, 0x8b, 0xbc, + 0x7b, 0xb1, 0xd4, 0xd3, 0x93, 0xd0, 0xf8, 0x5c, 0x7c, 0xf2, 0x5f, 0xc5, 0xda, 0x70, 0x82, 0x76, + 0xcf, 0x36, 0x6e, 0xf9, 0xde, 0xe1, 0x4a, 0x80, 0xea, 0x05, 0xda, 0xc1, 0x62, 0x4d, 0x06, 0xfe, + 0x14, 0x24, 0x40, 0x5f, 0xf7, 0xff, 0xf2, 0x8e, 0xd1, 0xb8, 0xd8, 0x1b, 0x67, 0xd7, 0x73, 0x24, + 0x69, 0xd1, 0xdd, 0xb3, 0x19, 0xa8, 0x12, 0x68, 0xfc, 0xb4, 0xb7, 0xa9, 0x36, 0x71, 0x36, 0xe3, + 0xd6, 0x43, 0xe5, 0xe2, 0x80, 0x20, 0x2d, 0x9a, 0x64, 0x46, 0x8f, 0xe2, 0x78, 0x3f, 0xef, 0xd7, + 0x68, 0xd3, 0xc4, 0xed, 0x9b, 0xca, 0x55, 0xae, 0x6b, 0xae, 0x50, 0xae, 0xdb, 0xf8, 0xd5, 0xab, + 0x03, 0xf5, 0x1b, 0x99, 0x4f, 0xe7, 0x04, 0x97, 0xb9, 0xaf, 0x80, 0xc1, 0x0e, 0x50, 0x1f, 0x20, + 0x83, 0x20, 0xa0, 0x02, 0xa4, 0x28, 0x46, 0xff, 0xba, 0xff, 0xa3, 0xb7, 0x03, 0x8e, 0x67, 0x57, + 0xdb, 0x8e, 0xfe, 0xea, 0x82, 0x7a, 0x08, 0x17, 0x6b, 0x7d, 0xa2, 0x7f, 0x74, 0x96, 0x16, 0xa1, + 0x1a, 0x47, 0x7e, 0x70, 0x1b, 0xd4, 0x76, 0x53, 0xdb, 0x53, 0x81, 0xf6, 0xbc, 0xd9, 0x81, 0x34, + 0xc7, 0xa7, 0xdc, 0x52, 0x81, 0x9c, 0xa2, 0x91, 0xa7, 0x19, 0x81, 0xe3, 0xbb, 0x61, 0xb0, 0x5d, + 0xe1, 0xe2, 0xff, 0xc4, 0x8e, 0x82, 0xdb, 0x63, 0xd5, 0x3d, 0x41, 0xff, 0x98, 0x09, 0x23, 0xa4, + 0x49, 0x4a, 0x38, 0x78, 0x9a, 0xd4, 0xe6, 0x78, 0x74, 0x7c, 0x4e, 0xf1, 0x75, 0xfc, 0x7b, 0xbe, + 0x0e, 0xdd, 0x74, 0x44, 0x72, 0xd7, 0xdb, 0x13, 0xfe, 0x41, 0xd1, 0xf8, 0x29, 0x50, 0x7f, 0x6f, + 0xc4, 0x2d, 0x54, 0x50, 0xab, 0xce, 0x9b, 0x17, 0x86, 0xcf, 0x56, 0xd5, 0x5d, 0x83, 0x72, 0xfb, + 0x02, 0x9e, 0x4f, 0x07, 0xa0, 0xe4, 0x93, 0x12, 0x52, 0xa6, 0x3d, 0x40, 0x5e, 0xae, 0x8d, 0x23, + 0xac, 0xd5, 0x70, 0x2e, 0x1f, 0xec, 0x70, 0x93, 0x93, 0x07, 0x64, 0x79, 0x50, 0x3b, 0x99, 0xf9, + 0xd1, 0x03, 0xdc, 0xc2, 0x05, 0x03, 0x84, 0x7e, 0x8f, 0x57, 0x27, 0xd2, 0x05, 0xb5, 0xad, 0xdf, + 0x5e, 0x3f, 0xcc, 0x9c, 0xec, 0xbe, 0x37, 0xcb, 0x76, 0x01, 0x7e, 0x66, 0xb7, 0xd0, 0xd1, 0xf1, + 0x4e, 0x16, 0xf4, 0xed, 0xbd, 0x5c, 0x8b, 0xf4, 0x64, 0x39, 0xd4, 0x72, 0x9e, 0x87, 0x46, 0x27, + 0x88, 0x07, 0x89, 0xff, 0x1b, 0x23, 0x84, 0x9c, 0xca, 0x7e, 0xcb, 0xf6, 0x5e, 0x2d, 0x33, 0x24, + 0xc9, 0x1b, 0x52, 0x00, 0xdc, 0x34, 0xfc, 0x19, 0x70, 0xfe, 0xe1, 0x78, 0x7f, 0x63, 0xc7, 0xdc, + 0x94, 0x63, 0xc8, 0x26, 0x79, 0x3b, 0x1f, 0x58, 0x8e, 0x46, 0x24, 0xf4, 0xfa, 0x46, 0x10, 0xcb, + 0x4c, 0x90, 0xf2, 0xef, 0xaf, 0x7f, 0x7e, 0xd8, 0x5d, 0x6b, 0x36, 0x64, 0x06, 0xbd, 0xf8, 0x0a, + 0x0e, 0x63, 0x3f, 0x7e, 0xbc, 0x0b, 0x44, 0x7c, 0xf9, 0x82, 0x61, 0x0c, 0x01, 0xc0, 0x6b, 0x98, + 0xd0, 0xd7, 0x33, 0xf3, 0xbf, 0xb8, 0x41, 0xc3, 0x3f, 0x62, 0x34, 0x2d, 0x99, 0x2e, 0xab, 0x0c, + 0xfe, 0x31, 0xa0, 0xce, 0xbd, 0x82, 0x6d, 0xe7, 0x75, 0x83, 0xbb, 0x07, 0xfc, 0x83, 0x3b, 0x14, + 0xd9, 0xfa, 0xf6, 0x6a, 0x1e, 0x00, 0x79, 0x9f, 0x7e, 0x35, 0x01, 0x79, 0xe4, 0x61, 0xaa, 0xb3, + 0x50, 0x8e, 0x4d, 0xfd, 0x1f, 0xc0, 0x7f, 0x3e, 0x39, 0x8c, 0x46, 0x77, 0x78, 0x2b, 0x24, 0x82, + 0x1b, 0x40, 0x3e, 0xb0, 0x2c, 0x82, 0xbe, 0x23, 0xe5, 0x16, 0xcc, 0x02, 0xe5, 0xa3, 0x16, 0x08, + 0x58, 0xd9, 0xb5, 0xef, 0x18, 0xd6, 0xcd, 0xdc, 0x31, 0x76, 0xf7, 0x51, 0x35, 0x25, 0x10, 0x74, + 0x98, 0x11, 0x0f, 0xe1, 0x91, 0x84, 0x4a, 0xf7, 0xa3, 0x9b, 0xe3, 0x18, 0xff, 0xc4, 0x1d, 0xc7, + 0x16, 0x23, 0x35, 0xcc, 0x96, 0x33, 0xc1, 0x53, 0x3d, 0x52, 0x0d, 0x1a, 0x10, 0x65, 0xe3, 0x5b, + 0xcc, 0xc1, 0xdb, 0xf7, 0xf9, 0x4f, 0xd8, 0x6a, 0x52, 0xe0, 0xaf, 0x16, 0x67, 0x66, 0x1e, 0xf2, + 0x4d, 0xdf, 0x89, 0x5a, 0x70, 0x45, 0x39, 0x25, 0xfc, 0x98, 0xe8, 0xbe, 0xb4, 0x74, 0xd3, 0xe5, + 0x63, 0xb0, 0xe2, 0x8f, 0xa5, 0x0f, 0x52, 0xa0, 0x31, 0x9e, 0xf3, 0x2e, 0xae, 0xaa, 0x92, 0x20, + 0x07, 0x8a, 0x70, 0x38, 0x59, 0x77, 0x80, 0xa1, 0xf8, 0x68, 0xc9, 0xe6, 0xfa, 0x3b, 0x77, 0x40, + 0x5e, 0xf0, 0x74, 0xbf, 0x75, 0x15, 0x67, 0x2e, 0xea, 0xa9, 0x05, 0x58, 0x08, 0xb7, 0xd2, 0x48, + 0xaf, 0xf1, 0xef, 0x54, 0xec, 0xa1, 0xdf, 0x5e, 0x3f, 0xf2, 0x1d, 0x32, 0xf3, 0xb1, 0x82, 0xde, + 0x06, 0xec, 0x96, 0x21, 0xb3, 0x2b, 0xaa, 0x1d, 0x9d, 0xf5, 0x74, 0xdb, 0xe1, 0x88, 0x08, 0x8d, + 0xfd, 0x55, 0x1e, 0x23, 0x5f, 0xd0, 0x3a, 0x7b, 0xdb, 0x2a, 0x95, 0x21, 0x8a, 0x6e, 0x79, 0xb3, + 0x67, 0x18, 0xd0, 0x6e, 0x92, 0x3a, 0xff, 0x40, 0xba, 0x0d, 0x03, 0x5a, 0x67, 0xbe, 0x70, 0xfa, + 0x77, 0xee, 0xe8, 0xac, 0x70, 0x1f, 0xa8, 0xf9, 0xd9, 0xa7, 0x50, 0xc5, 0xf5, 0xf6, 0xfe, 0xe6, + 0xa0, 0xa2, 0xdd, 0x3d, 0xda, 0x0e, 0xd4, 0x87, 0x7c, 0xbd, 0xfe, 0x55, 0xeb, 0x00, 0x74, 0x6c, + 0xe8, 0xdb, 0x37, 0x7e, 0xe4, 0x99, 0x94, 0x40, 0x1b, 0x90, 0x30, 0x09, 0x2b, 0x97, 0xab, 0x07, + 0x84, 0xb2, 0x68, 0x10, 0x8b, 0x25, 0xe2, 0xc3, 0x5c, 0x27, 0x81, 0x87, 0xc3, 0xe0, 0xaa, 0xe3, + 0xc3, 0xcc, 0x8a, 0x11, 0x0f, 0x21, 0xdc, 0x4c, 0x75, 0x60, 0x90, 0x04, 0x74, 0x70, 0x2f, 0x98, + 0xf9, 0xd8, 0xdf, 0xb9, 0xc3, 0xb7, 0x30, 0x8c, 0x81, 0x01, 0x21, 0x96, 0xf3, 0xfa, 0x3a, 0x11, + 0x6c, 0x48, 0x2d, 0x09, 0x8c, 0x67, 0x41, 0xae, 0xf5, 0x09, 0x88, 0xdf, 0x5e, 0x7f, 0x16, 0x17, + 0x5a, 0xf7, 0x31, 0x9d, 0xf6, 0x10, 0x4b, 0x4f, 0xbd, 0xa2, 0x83, 0x5f, 0x1a, 0xe7, 0x9f, 0x3c, + 0xed, 0x92, 0x2a, 0xc2, 0x95, 0xcd, 0x04, 0x8d, 0x14, 0x47, 0x7d, 0x7c, 0x3b, 0x6e, 0x19, 0x27, + 0x65, 0x16, 0x7d, 0x85, 0xf0, 0x2a, 0xc9, 0xe9, 0x23, 0x28, 0x34, 0x8d, 0x68, 0x16, 0x8a, 0x42, + 0xcf, 0x39, 0x54, 0x68, 0x7f, 0xe7, 0x8e, 0xa1, 0x9c, 0xf8, 0xae, 0x4e, 0xc8, 0xc5, 0xb6, 0xe6, + 0x19, 0xe2, 0x86, 0x40, 0x85, 0x25, 0x66, 0xee, 0xa3, 0xc4, 0xa0, 0x70, 0x96, 0x6f, 0xaf, 0x9f, + 0xec, 0xe8, 0xdd, 0x13, 0x9c, 0x17, 0x9a, 0x39, 0xa4, 0x05, 0xd5, 0x13, 0xff, 0x2c, 0xef, 0x76, + 0xe3, 0x72, 0x64, 0x03, 0xab, 0x96, 0x02, 0xd4, 0xac, 0xe7, 0x2c, 0x71, 0x63, 0x44, 0x98, 0xf5, + 0xef, 0x1b, 0x2d, 0x37, 0x1b, 0xdf, 0x3d, 0x0c, 0xbb, 0xcc, 0x37, 0xe3, 0x56, 0x04, 0x1f, 0xfc, + 0xb4, 0x99, 0x89, 0x20, 0x12, 0x3e, 0xfc, 0xa7, 0x76, 0x60, 0x66, 0x31, 0xc5, 0x42, 0x2b, 0x82, + 0xf3, 0x1b, 0x0e, 0x3f, 0x60, 0x14, 0xae, 0x82, 0xc1, 0xcd, 0xe3, 0x11, 0xd8, 0x95, 0x97, 0xfd, + 0xdb, 0xeb, 0x3f, 0xd5, 0xbb, 0xfb, 0x2b, 0xc2, 0x79, 0x00, 0x4b, 0x90, 0x56, 0x22, 0x6f, 0x0f, + 0xf2, 0xfa, 0x14, 0x36, 0xc0, 0x8f, 0x01, 0x54, 0xc1, 0x70, 0xfa, 0xc4, 0xc5, 0x9a, 0x55, 0xd5, + 0x6b, 0x96, 0xf4, 0xaa, 0x7d, 0x19, 0x22, 0xb9, 0xe4, 0xc0, 0x88, 0xdd, 0x00, 0x62, 0x1c, 0x84, + 0xc7, 0xf1, 0x99, 0xc9, 0x8d, 0x0e, 0xe6, 0x05, 0x37, 0xfe, 0xaa, 0x1d, 0x21, 0x81, 0x48, 0x2a, + 0x33, 0x28, 0x54, 0xa2, 0x75, 0x7c, 0x6a, 0x47, 0xa4, 0x79, 0xd3, 0xd1, 0xc5, 0xaa, 0xdb, 0xda, + 0xf7, 0x45, 0xa8, 0xf4, 0x65, 0x99, 0x31, 0x38, 0xf1, 0x2d, 0x42, 0xba, 0xf6, 0x59, 0xd5, 0x59, + 0x64, 0xa0, 0x83, 0x66, 0x5b, 0xc8, 0x4c, 0xf9, 0x8e, 0x3e, 0x94, 0xae, 0x3d, 0x85, 0x9d, 0x27, + 0x83, 0x34, 0x10, 0x22, 0x9f, 0xe6, 0x7d, 0x9d, 0x5c, 0xf4, 0xd3, 0x78, 0xc7, 0xe4, 0xb9, 0xa2, + 0x32, 0x13, 0x0e, 0x45, 0xe7, 0xf6, 0x01, 0x4f, 0xe7, 0xc1, 0x63, 0xfb, 0xab, 0x76, 0x78, 0x56, + 0xa1, 0x7c, 0xe7, 0x1b, 0x4d, 0xce, 0xc0, 0x9f, 0xda, 0xa1, 0x8e, 0x42, 0xa8, 0x73, 0x25, 0xc8, + 0xa7, 0x1e, 0xd4, 0x9c, 0xf8, 0xed, 0xf5, 0x9f, 0x14, 0x3f, 0x55, 0xdd, 0x0f, 0x24, 0x67, 0xd5, + 0x7b, 0x30, 0x37, 0x35, 0x8e, 0x8c, 0x99, 0xd5, 0xba, 0xcf, 0x5b, 0xb0, 0xa7, 0x3d, 0x87, 0x68, + 0x60, 0xf4, 0x49, 0x75, 0x1a, 0x12, 0x37, 0xab, 0x9d, 0xf4, 0x3c, 0xb6, 0x83, 0x83, 0xbb, 0x6e, + 0x86, 0x6e, 0x80, 0xae, 0x68, 0x2a, 0x14, 0xb1, 0x30, 0xbf, 0x1f, 0x34, 0x18, 0xe0, 0xc7, 0xf1, + 0xc0, 0x5f, 0xb5, 0xe3, 0x8b, 0xc5, 0x50, 0x9e, 0x4f, 0xd1, 0x07, 0x95, 0xe9, 0xef, 0xda, 0x31, + 0x95, 0x45, 0x1c, 0x15, 0x03, 0x0d, 0xc3, 0x40, 0xfa, 0xed, 0xf5, 0xe3, 0x89, 0x7f, 0x8a, 0x97, + 0xb3, 0xfe, 0x07, 0xcc, 0x23, 0x60, 0x39, 0x46, 0x5d, 0xe0, 0x3a, 0x7b, 0x43, 0x0c, 0xc3, 0xef, + 0x12, 0xb7, 0xdb, 0x74, 0x27, 0xf6, 0x83, 0x3d, 0xa9, 0xad, 0xdb, 0x34, 0x76, 0x39, 0xd3, 0x18, + 0x14, 0xcf, 0xda, 0x9f, 0x70, 0x0d, 0xbe, 0xac, 0x74, 0xdc, 0x18, 0x1e, 0x38, 0x5c, 0x12, 0x95, + 0xc1, 0xb3, 0x37, 0x7c, 0x7a, 0x07, 0x30, 0xee, 0xbd, 0x08, 0x74, 0xed, 0x9f, 0xd4, 0x09, 0xbe, + 0xe1, 0x4f, 0xef, 0x80, 0x74, 0x35, 0xa0, 0x9a, 0x0c, 0x35, 0x96, 0x4d, 0x7c, 0xdd, 0xff, 0xa3, + 0x8d, 0x2f, 0x0d, 0x0d, 0x73, 0xd9, 0x11, 0xe8, 0xc4, 0xe9, 0xd6, 0x3d, 0x9d, 0x38, 0xdf, 0xdf, + 0x19, 0xa1, 0xaf, 0x7f, 0x1e, 0x0c, 0x54, 0x33, 0x37, 0x84, 0x4e, 0xd1, 0xf0, 0xa8, 0xd9, 0x5d, + 0x5b, 0xfd, 0x03, 0x07, 0x47, 0x6b, 0x70, 0xae, 0x61, 0x16, 0xff, 0x96, 0x9d, 0x4c, 0xc7, 0x90, + 0xfb, 0xcc, 0x03, 0x29, 0x15, 0xe3, 0x9f, 0xde, 0x91, 0x66, 0xba, 0xb1, 0xfa, 0x13, 0x32, 0x97, + 0x2c, 0xe9, 0x3f, 0x7a, 0x47, 0xfa, 0x15, 0x4b, 0x57, 0xc7, 0xab, 0x97, 0xfd, 0xeb, 0xf9, 0xaf, + 0x0a, 0x7b, 0xff, 0x90, 0x80, 0x65, 0x7f, 0x4b, 0xce, 0x93, 0xf8, 0x2f, 0xe8, 0xc9, 0xb3, 0x7d, + 0x15, 0x4f, 0x88, 0xf0, 0x58, 0xfe, 0xab, 0x00, 0xd0, 0x20, 0xab, 0x56, 0x03, 0xe7, 0xcf, 0x73, + 0x20, 0x4c, 0x02, 0x17, 0x73, 0x92, 0xe0, 0xd4, 0x8b, 0x7b, 0xe6, 0xd0, 0xaa, 0x71, 0x03, 0x48, + 0x48, 0xce, 0xca, 0x61, 0xe9, 0xf5, 0xe9, 0x1d, 0x7a, 0xc2, 0x42, 0x66, 0x89, 0x77, 0x26, 0xbf, + 0x30, 0x94, 0x3e, 0xf9, 0xaf, 0xde, 0xa1, 0x31, 0xb8, 0x74, 0xe8, 0x28, 0xd1, 0x66, 0xe4, 0xd7, + 0xf5, 0x1f, 0xa3, 0x7f, 0xd8, 0xe3, 0x5c, 0xb7, 0xb3, 0x25, 0xc9, 0x17, 0x7d, 0x52, 0x40, 0x75, + 0x50, 0xdb, 0xcb, 0x41, 0x28, 0x13, 0x11, 0x06, 0xce, 0x02, 0x40, 0x8f, 0x07, 0xa3, 0x1b, 0x99, + 0x30, 0x01, 0x4d, 0x1f, 0xb6, 0x1d, 0x7a, 0x3e, 0x6e, 0x87, 0x0c, 0x2f, 0x96, 0x8f, 0x3a, 0xe4, + 0x7b, 0x97, 0x37, 0xb5, 0x6c, 0x36, 0x75, 0x5d, 0x7e, 0xf6, 0x8e, 0x6d, 0xe7, 0x27, 0x33, 0x8e, + 0xe6, 0x75, 0x2f, 0xc8, 0xfc, 0xb6, 0x4f, 0x1d, 0xe9, 0x4f, 0xef, 0x58, 0xbf, 0x2d, 0xf4, 0x3f, + 0x4a, 0xf4, 0xed, 0xf5, 0x9f, 0x6b, 0x06, 0xa4, 0xa4, 0x33, 0x70, 0xe7, 0xfa, 0xc9, 0x4d, 0x4e, + 0x56, 0xcf, 0x6e, 0x75, 0x8e, 0xb4, 0x53, 0x1b, 0x3e, 0x05, 0x00, 0xea, 0xc1, 0x71, 0x24, 0x74, + 0x10, 0x3e, 0x8d, 0x4e, 0x53, 0xe3, 0x67, 0x02, 0xfc, 0xd9, 0x90, 0x2c, 0xbd, 0x16, 0x1e, 0x8c, + 0x79, 0xc8, 0x66, 0xae, 0x7a, 0x99, 0xc6, 0x6b, 0x11, 0x66, 0x36, 0x03, 0xf0, 0x93, 0xf1, 0x93, + 0x7b, 0x92, 0x90, 0x05, 0x34, 0xb5, 0x21, 0xda, 0xb5, 0x0a, 0x59, 0x81, 0xcc, 0xb3, 0x1e, 0x96, + 0xdf, 0x58, 0x3f, 0xee, 0xf0, 0xfd, 0xf6, 0xfa, 0x25, 0xc5, 0xa3, 0x47, 0xf7, 0xfd, 0x7c, 0xc8, + 0x6a, 0xee, 0x7d, 0xc2, 0x7e, 0xba, 0xf5, 0xcc, 0xd3, 0x48, 0xae, 0xfe, 0x29, 0x00, 0xb4, 0xfc, + 0xb6, 0xd8, 0x27, 0x12, 0x46, 0x43, 0x87, 0x8a, 0x1c, 0x79, 0x36, 0xb5, 0xc1, 0xab, 0x29, 0x1b, + 0x10, 0x24, 0x9e, 0x2e, 0x5b, 0x10, 0x07, 0xad, 0xa7, 0x78, 0x67, 0x9a, 0xdf, 0x8d, 0x14, 0xc0, + 0xbf, 0x4a, 0x3c, 0x06, 0xd7, 0x4d, 0x17, 0x43, 0x0e, 0xf4, 0x2b, 0x51, 0xf2, 0xc9, 0x07, 0xf1, + 0x67, 0x1e, 0x50, 0x58, 0x12, 0x97, 0x0d, 0x37, 0xbf, 0xbe, 0xbd, 0x7e, 0x50, 0xb0, 0x54, 0xa2, + 0xa5, 0xd6, 0x9c, 0xd1, 0xfb, 0x7e, 0x96, 0x8d, 0xa4, 0x35, 0xcd, 0xd5, 0x3d, 0x34, 0xbb, 0xfa, + 0x57, 0x01, 0xa0, 0x61, 0x48, 0x17, 0xe0, 0xf1, 0xb8, 0x5d, 0x30, 0x2f, 0x71, 0x81, 0x1e, 0xb3, + 0x4a, 0x1a, 0x21, 0xda, 0xd1, 0xa6, 0x1d, 0x3f, 0x05, 0x71, 0x3f, 0xe5, 0x88, 0xe7, 0x2b, 0x6b, + 0x70, 0xaf, 0xa7, 0xc1, 0x80, 0xf0, 0x42, 0x37, 0xfd, 0xde, 0xa0, 0x22, 0xa4, 0x02, 0x3e, 0x91, + 0xf0, 0xf2, 0x81, 0x18, 0xc2, 0xd9, 0x47, 0xaa, 0x7d, 0xc5, 0x57, 0x7f, 0x3d, 0xff, 0x8b, 0xca, + 0x0e, 0xcf, 0x5c, 0xae, 0xf1, 0xe7, 0x26, 0xd9, 0xc9, 0x10, 0xab, 0xcf, 0x66, 0x48, 0x30, 0x65, + 0x97, 0xe1, 0xfe, 0x14, 0x00, 0x14, 0xa1, 0xd7, 0x0b, 0xbc, 0xe6, 0x6b, 0xc6, 0xb2, 0xfb, 0xd2, + 0xc1, 0xa8, 0x5d, 0x4e, 0x30, 0xf0, 0x47, 0xbc, 0x8d, 0xd5, 0x67, 0x34, 0xee, 0xec, 0x12, 0xf8, + 0x03, 0x35, 0x2a, 0xf6, 0x83, 0x98, 0x4f, 0x82, 0xdc, 0xef, 0x0d, 0x78, 0x46, 0x9f, 0xb7, 0x44, + 0xe0, 0x0b, 0x82, 0x0d, 0xb5, 0x10, 0x7e, 0x50, 0x81, 0xbb, 0x76, 0xe1, 0x5f, 0xfe, 0x75, 0xfe, + 0x9b, 0xc1, 0x39, 0xe8, 0xde, 0x25, 0xff, 0xbc, 0x7c, 0x3f, 0x76, 0xa8, 0xc7, 0xbe, 0x61, 0x6c, + 0x0f, 0xb0, 0x2a, 0xe1, 0xfe, 0x2e, 0x00, 0xd8, 0xfd, 0xc9, 0x70, 0xe8, 0xd6, 0x2c, 0x53, 0x05, + 0x3f, 0xfb, 0x35, 0x6a, 0xbc, 0xcf, 0x19, 0xed, 0x91, 0xcd, 0xef, 0x8e, 0x50, 0xbb, 0x11, 0x74, + 0xe8, 0x7e, 0xdb, 0xa2, 0xbe, 0x34, 0x02, 0xdd, 0x07, 0xc3, 0x24, 0x46, 0x4d, 0xd2, 0x6d, 0xd4, + 0xc7, 0x33, 0xba, 0x5c, 0x39, 0x84, 0x13, 0x9d, 0x81, 0x5c, 0x10, 0x66, 0x56, 0x85, 0x64, 0xa8, + 0x01, 0xd9, 0xbf, 0xdf, 0xff, 0x82, 0x9a, 0x49, 0x95, 0xbe, 0xcc, 0x75, 0x4b, 0x6b, 0xac, 0xdf, + 0x2b, 0x08, 0x73, 0xed, 0xd2, 0x5d, 0x68, 0xc1, 0xf0, 0xf6, 0x3f, 0x05, 0x00, 0x3a, 0x13, 0xf5, + 0x69, 0xb2, 0xc4, 0xba, 0x88, 0x99, 0x2d, 0x98, 0xd5, 0x1e, 0x86, 0x5e, 0x70, 0xd0, 0x59, 0x10, + 0xe7, 0x6c, 0x17, 0x6a, 0xbf, 0x11, 0xf0, 0xa4, 0x6b, 0x65, 0xd1, 0x18, 0x1a, 0x41, 0xcd, 0x0a, + 0xa9, 0xd6, 0xa3, 0x3b, 0x85, 0x24, 0xc2, 0x33, 0xd5, 0xd8, 0x7e, 0x8a, 0xe7, 0x3a, 0xf4, 0x4c, + 0x9a, 0x8e, 0xce, 0x48, 0x0d, 0xef, 0x49, 0xbe, 0x8f, 0x7f, 0x70, 0xfd, 0x23, 0x91, 0x57, 0xed, + 0x2c, 0x25, 0xc4, 0xfb, 0x65, 0x62, 0xf8, 0xc2, 0x04, 0x62, 0x61, 0x64, 0x7b, 0xe3, 0x4f, 0x01, + 0x60, 0xfa, 0xc8, 0x65, 0x45, 0xb7, 0x7d, 0x39, 0x86, 0x21, 0x6d, 0x42, 0xe6, 0x0d, 0xb7, 0xc0, + 0x2c, 0xfa, 0x99, 0xee, 0x92, 0xc5, 0xfb, 0xc6, 0x88, 0x79, 0xd7, 0xfb, 0x41, 0xb5, 0x80, 0xa8, + 0xa1, 0x55, 0xa1, 0x6b, 0xee, 0xe8, 0xec, 0x62, 0x03, 0xa4, 0xbd, 0x5d, 0x08, 0x4e, 0xa9, 0xc3, + 0xb8, 0x20, 0x0c, 0x88, 0xcb, 0x8c, 0x87, 0xb7, 0x92, 0x44, 0x16, 0x5f, 0xd7, 0xff, 0xcb, 0x81, + 0x6a, 0x1d, 0x35, 0x9d, 0x6a, 0x0f, 0x25, 0x75, 0xa9, 0xc1, 0x5e, 0xd7, 0xb8, 0xe4, 0x0c, 0x60, + 0xee, 0x4f, 0x01, 0x20, 0xb7, 0x84, 0x20, 0x67, 0x39, 0x63, 0x45, 0x0d, 0x40, 0x3d, 0x08, 0x97, + 0x42, 0xb4, 0x8f, 0x48, 0x01, 0x4d, 0xc7, 0x07, 0xc3, 0x6c, 0x84, 0x6b, 0xe6, 0x40, 0x06, 0x1c, + 0xc8, 0x24, 0x09, 0xd8, 0xa1, 0xf7, 0x81, 0xdb, 0x96, 0x93, 0xf1, 0x1e, 0x1d, 0x23, 0x69, 0x42, + 0xe2, 0x4f, 0xca, 0x4f, 0x1c, 0xbe, 0xa0, 0x41, 0x1d, 0xf0, 0xf2, 0x5c, 0xe5, 0xec, 0x17, 0xfb, + 0x7a, 0xfe, 0xbb, 0xec, 0xe1, 0x93, 0xd6, 0x58, 0x43, 0x1e, 0xde, 0xe0, 0xc1, 0x52, 0xd7, 0x25, + 0xa5, 0x18, 0xcb, 0x86, 0xf8, 0xbb, 0x00, 0xc0, 0x9d, 0x36, 0xa8, 0x17, 0x0b, 0xf1, 0x0e, 0x5f, + 0xcd, 0x6c, 0xf5, 0x6f, 0xea, 0x94, 0x4e, 0x56, 0x13, 0x9e, 0x4c, 0x8e, 0xed, 0x1d, 0xb5, 0x3f, + 0x1a, 0xd0, 0x37, 0x5c, 0x69, 0x96, 0x8e, 0x17, 0x91, 0x90, 0xfb, 0x42, 0xf2, 0xbd, 0x23, 0x7e, + 0x92, 0x10, 0x1c, 0xf2, 0x5f, 0x97, 0x6c, 0x35, 0x14, 0xdc, 0x7a, 0xf6, 0x71, 0x23, 0x77, 0x16, + 0x52, 0xa3, 0x66, 0x7c, 0x7b, 0xfd, 0x6a, 0xc2, 0x53, 0xf4, 0x4b, 0xa0, 0xe5, 0x11, 0xcb, 0x6c, + 0xdc, 0x17, 0x63, 0xd4, 0x81, 0xc4, 0x74, 0x87, 0x94, 0x2a, 0x99, 0x05, 0x80, 0x9d, 0x3d, 0xfb, + 0x4c, 0x66, 0xef, 0x4c, 0xe2, 0x51, 0xf3, 0xfb, 0x9a, 0x4a, 0x5f, 0x4b, 0x01, 0x65, 0xca, 0xed, + 0x1f, 0xca, 0x5b, 0x4c, 0xb7, 0x83, 0x45, 0x9b, 0x93, 0x28, 0xc4, 0x45, 0x13, 0xd7, 0x55, 0xad, + 0xb2, 0x89, 0xec, 0xc3, 0xfc, 0x30, 0x8e, 0x22, 0xb0, 0xb2, 0x52, 0x05, 0xa4, 0xc0, 0x34, 0x68, + 0xd0, 0x62, 0x52, 0x0b, 0x7c, 0x1d, 0xfb, 0xbe, 0xfd, 0x3b, 0xa4, 0x69, 0xe3, 0x40, 0x13, 0xf5, + 0xbb, 0x66, 0x08, 0x7f, 0x54, 0x2c, 0x06, 0xa1, 0x7d, 0xb1, 0x88, 0x58, 0xdf, 0x3f, 0x05, 0x80, + 0x47, 0xb0, 0xeb, 0x42, 0x7f, 0x50, 0x37, 0xd9, 0x41, 0xed, 0x17, 0x23, 0x48, 0x19, 0x6b, 0x32, + 0xa7, 0x64, 0xb6, 0x77, 0xb5, 0xd5, 0xa8, 0x55, 0xa2, 0xc2, 0xa2, 0xa7, 0xbc, 0xd8, 0x0b, 0xb6, + 0xc2, 0x7b, 0x15, 0x92, 0x33, 0x97, 0x8a, 0x65, 0x8c, 0xf8, 0xe5, 0x89, 0xe0, 0x4b, 0x78, 0x05, + 0xc5, 0xa8, 0x0f, 0x21, 0x74, 0x8c, 0xb0, 0x8c, 0xcf, 0xbc, 0xd1, 0x9d, 0xbe, 0xbd, 0xfe, 0x04, + 0x3b, 0x5a, 0xb3, 0xd9, 0x87, 0x9b, 0x4d, 0x4b, 0xc9, 0x2b, 0x32, 0x53, 0x3a, 0xc2, 0xbe, 0xa5, + 0x6d, 0x8a, 0xcf, 0xe4, 0xde, 0x3a, 0xca, 0x8b, 0x54, 0xcf, 0x2c, 0x9f, 0x06, 0xc6, 0x07, 0xd6, + 0xd9, 0xd8, 0xb4, 0x74, 0x7c, 0x06, 0x48, 0xbf, 0x3e, 0x28, 0xa0, 0x9f, 0xba, 0x3b, 0x3a, 0xfb, + 0x48, 0xb5, 0xd9, 0x66, 0x85, 0xb3, 0x54, 0xae, 0xcb, 0xec, 0xab, 0x2b, 0xfc, 0xb9, 0xc8, 0x5f, + 0x8e, 0x6f, 0xa8, 0x47, 0x3d, 0xcd, 0xcb, 0x13, 0xed, 0xea, 0x01, 0x33, 0x66, 0x06, 0xf4, 0xfe, + 0xf6, 0xfa, 0x19, 0xbc, 0xb4, 0xe9, 0x4c, 0xc3, 0xc3, 0xa1, 0x8d, 0x6c, 0x04, 0x13, 0x2c, 0xe3, + 0xf1, 0xf7, 0x90, 0x9a, 0x30, 0xd1, 0x4b, 0x40, 0xa7, 0xce, 0x49, 0xb9, 0x0a, 0x72, 0xd8, 0xe1, + 0x06, 0x48, 0xbd, 0x6d, 0xb4, 0xa4, 0xf3, 0x44, 0x83, 0x86, 0x83, 0x2d, 0x88, 0x8b, 0x1b, 0xba, + 0x4b, 0xc7, 0xc9, 0xb5, 0xb7, 0x00, 0x95, 0xa2, 0xaf, 0xa8, 0x15, 0xf9, 0x84, 0x22, 0x13, 0xf4, + 0x22, 0xb7, 0xf8, 0xa7, 0xc0, 0x37, 0xb3, 0x40, 0xe6, 0xc6, 0x38, 0x62, 0x9b, 0x52, 0x82, 0x1b, + 0xf8, 0x7a, 0xff, 0xbf, 0x98, 0x3d, 0x8d, 0xf7, 0x44, 0x6d, 0x63, 0x20, 0xcb, 0x43, 0x46, 0xd7, + 0x5f, 0xd5, 0xc5, 0x80, 0x54, 0xbc, 0xcf, 0x2d, 0x9c, 0xe8, 0xdb, 0xe7, 0x44, 0x8f, 0xb8, 0xd1, + 0x4d, 0x32, 0xb7, 0xce, 0x04, 0xc1, 0xb3, 0x1e, 0xe2, 0xb9, 0x5f, 0xd8, 0x1b, 0x3d, 0xa3, 0x57, + 0x6c, 0xbd, 0xbb, 0x40, 0x46, 0x03, 0xe4, 0xb4, 0xa6, 0xdd, 0x18, 0xdb, 0x22, 0xd3, 0x08, 0x94, + 0x25, 0x62, 0x05, 0xc4, 0x7c, 0xff, 0x04, 0x7c, 0xd0, 0x2b, 0xb8, 0x82, 0x68, 0xf0, 0x0a, 0xe9, + 0x55, 0x94, 0x6e, 0xac, 0x7f, 0xdd, 0xff, 0x81, 0x8f, 0xe7, 0xbb, 0x16, 0x90, 0x2b, 0x82, 0xf4, + 0x7a, 0x60, 0x10, 0x44, 0x0f, 0x76, 0xb6, 0x99, 0xd1, 0x7e, 0x5f, 0x43, 0x6c, 0xe7, 0xa3, 0x4f, + 0xea, 0x0f, 0x18, 0xf8, 0xfd, 0xa5, 0xdc, 0x24, 0x3e, 0x59, 0x1f, 0x0a, 0x42, 0xec, 0x63, 0x05, + 0x79, 0x67, 0x09, 0x7c, 0x83, 0xd6, 0x72, 0xa2, 0x70, 0x5d, 0xcd, 0x6f, 0x3a, 0xda, 0x38, 0x6b, + 0x68, 0xdb, 0x98, 0xc0, 0x17, 0x4d, 0xe5, 0x9f, 0x81, 0x2f, 0xf1, 0x85, 0x57, 0xe2, 0xea, 0xf1, + 0x5e, 0xd6, 0x86, 0x45, 0x1d, 0xdf, 0x5e, 0xff, 0xe6, 0x9d, 0xd2, 0x6c, 0xbd, 0xf0, 0x73, 0x09, + 0xa0, 0x77, 0x9f, 0x66, 0xee, 0x59, 0xc8, 0x7e, 0x28, 0x63, 0x55, 0xb8, 0x53, 0xcd, 0x4d, 0xe9, + 0x36, 0xe3, 0x3a, 0x1e, 0xe4, 0x91, 0x2d, 0x12, 0x3d, 0x9a, 0x6a, 0x30, 0xe1, 0x8d, 0x05, 0x79, + 0xa3, 0xa4, 0xe8, 0xf2, 0x2d, 0xc6, 0x41, 0x67, 0xd0, 0x80, 0x4e, 0x04, 0x4e, 0x32, 0xa2, 0x67, + 0xa8, 0xef, 0x24, 0x3e, 0x8d, 0xfc, 0x2b, 0xf1, 0x79, 0x85, 0x7c, 0xdb, 0x0d, 0x47, 0x14, 0x41, + 0x5d, 0x63, 0xd9, 0xbe, 0xce, 0xff, 0xac, 0x36, 0xe0, 0xd0, 0x6d, 0x05, 0x0c, 0x6e, 0x82, 0x1a, + 0x35, 0x76, 0xa0, 0x7b, 0x8c, 0x79, 0x34, 0x79, 0x3a, 0xff, 0xb4, 0xf4, 0x6c, 0xbe, 0xf9, 0x8e, + 0x3c, 0x16, 0xfa, 0xa1, 0xde, 0x35, 0x0f, 0x79, 0x93, 0x80, 0xd4, 0x37, 0xb8, 0x99, 0x2f, 0x1a, + 0x43, 0xe4, 0xd9, 0x42, 0x16, 0xf8, 0xf4, 0x71, 0x50, 0xa3, 0x83, 0xf0, 0x21, 0xbe, 0xfb, 0xff, + 0x4c, 0x7c, 0xab, 0x7c, 0x52, 0xed, 0xdb, 0x9d, 0x02, 0x06, 0x89, 0x1b, 0x49, 0xd7, 0xb7, 0xd7, + 0xff, 0x49, 0x77, 0x7c, 0x58, 0x5c, 0xbc, 0xf6, 0x12, 0x5a, 0x11, 0xea, 0x91, 0xbd, 0xdc, 0xb3, + 0x9b, 0x75, 0x75, 0x7d, 0x16, 0x31, 0xb4, 0xb6, 0x63, 0x9e, 0xbe, 0x9a, 0x99, 0xbc, 0x25, 0xdf, + 0xf7, 0x28, 0xdc, 0x17, 0x48, 0xea, 0xe5, 0xf6, 0xb1, 0x68, 0xfa, 0x9f, 0xc1, 0x21, 0xd3, 0x21, + 0xa4, 0x81, 0xf2, 0xbf, 0x26, 0x3e, 0xaa, 0x7b, 0x4e, 0x79, 0x21, 0x0a, 0x42, 0x00, 0xd8, 0x43, + 0xfe, 0x7e, 0xfd, 0x7b, 0x82, 0x10, 0x09, 0x55, 0xe0, 0x7a, 0xfd, 0x11, 0xea, 0xa3, 0xf8, 0x98, + 0x2d, 0x0e, 0x62, 0xf1, 0x09, 0x69, 0x00, 0x3e, 0xf9, 0x88, 0x68, 0xf1, 0x03, 0xc3, 0xe5, 0xef, + 0x54, 0x4e, 0x84, 0x2e, 0x2f, 0x8c, 0x68, 0x3c, 0xe7, 0x54, 0x57, 0xb3, 0x33, 0x93, 0xd5, 0xfd, + 0x19, 0x1c, 0x82, 0x18, 0x08, 0x1f, 0xff, 0x9f, 0xc4, 0x17, 0xdc, 0xbc, 0xc9, 0x96, 0x91, 0x46, + 0x96, 0x71, 0x3d, 0x55, 0x9b, 0xaf, 0xf7, 0xbf, 0xcf, 0x35, 0x8a, 0xae, 0xaf, 0xb7, 0x22, 0x66, + 0x93, 0xf6, 0x64, 0x5a, 0x23, 0x1f, 0xce, 0x60, 0x67, 0x97, 0xb7, 0x0f, 0x0a, 0x91, 0xbe, 0xea, + 0x14, 0x43, 0xbe, 0x23, 0xef, 0x96, 0x5f, 0x0e, 0xae, 0xfb, 0x91, 0xf9, 0x99, 0xae, 0x7d, 0x20, + 0xce, 0x97, 0x08, 0xf2, 0x05, 0x05, 0x76, 0xde, 0xb6, 0xcf, 0xf6, 0xcf, 0xff, 0x35, 0xf1, 0xf9, + 0x67, 0x68, 0xb2, 0x31, 0x5f, 0xa2, 0x07, 0x49, 0x4c, 0x19, 0xdf, 0x3f, 0xff, 0x42, 0x37, 0x5c, + 0x2f, 0x8d, 0xa9, 0xb2, 0xd6, 0x9b, 0x48, 0x25, 0x29, 0x79, 0xcb, 0xf5, 0xf1, 0x82, 0x19, 0x34, + 0x73, 0x88, 0xfd, 0x45, 0x1b, 0x76, 0x4d, 0x89, 0xf3, 0x76, 0x1e, 0xfd, 0x1c, 0xf4, 0x1d, 0xff, + 0x7b, 0xc5, 0x44, 0x2f, 0xa6, 0x05, 0xa7, 0x59, 0xab, 0xfb, 0xf0, 0x0e, 0x31, 0xc4, 0xf8, 0x7b, + 0x68, 0xf2, 0x3f, 0x25, 0xbe, 0xe7, 0xd0, 0xa4, 0x54, 0xa8, 0x23, 0xc5, 0x85, 0x23, 0x62, 0x04, + 0xf9, 0x7e, 0xff, 0xff, 0xf5, 0x68, 0xe5, 0x2d, 0x12, 0xb2, 0x02, 0x6e, 0x8c, 0xd7, 0x87, 0xae, + 0xe8, 0xb1, 0xf2, 0x5c, 0xda, 0x79, 0x6a, 0x8f, 0xb4, 0x05, 0x02, 0xbd, 0x39, 0xd4, 0xfb, 0x08, + 0xb3, 0x69, 0xd9, 0x10, 0x24, 0x47, 0x0e, 0x23, 0xe2, 0x8b, 0x04, 0x60, 0xc2, 0x3d, 0xce, 0x5f, + 0x11, 0x20, 0xa6, 0xb7, 0x8a, 0x18, 0xfe, 0x1a, 0x9a, 0xfc, 0x0f, 0x85, 0x8f, 0x3f, 0x43, 0x93, + 0x43, 0xb2, 0x59, 0x3e, 0x59, 0x7d, 0xab, 0xea, 0xd4, 0x5f, 0xef, 0x7f, 0x73, 0xc8, 0x50, 0xf4, + 0x70, 0xcd, 0xa0, 0xba, 0x17, 0xff, 0xb2, 0xfb, 0x09, 0x27, 0xe5, 0x9f, 0xf9, 0x2e, 0x44, 0x03, + 0xee, 0xbc, 0x31, 0xd2, 0x1f, 0x9b, 0x62, 0x12, 0xc9, 0xea, 0xe0, 0xd4, 0xbf, 0xeb, 0x8d, 0xf4, + 0x6f, 0xce, 0x4b, 0x27, 0x6d, 0x43, 0x6e, 0xf2, 0x30, 0x48, 0x1a, 0xa6, 0xde, 0x18, 0x5d, 0x8a, + 0xfa, 0x5f, 0x0b, 0x5f, 0x7f, 0x86, 0x26, 0x6b, 0xb0, 0xc7, 0x08, 0x64, 0xb0, 0x78, 0x91, 0xe3, + 0xeb, 0xfd, 0xaf, 0x33, 0x7b, 0x47, 0x90, 0xd7, 0x21, 0x03, 0x7e, 0x8c, 0x4b, 0x19, 0xc3, 0xdd, + 0x64, 0x6c, 0xe5, 0x1e, 0x66, 0x50, 0xe1, 0xd7, 0x65, 0xce, 0x6a, 0x92, 0x39, 0xc4, 0x05, 0xaa, + 0x11, 0xa1, 0x64, 0x6d, 0x35, 0x5a, 0xe3, 0x71, 0x5b, 0x6e, 0x4a, 0xc9, 0x3b, 0xf8, 0xe6, 0x23, + 0xf4, 0x3a, 0x8a, 0x75, 0x88, 0x1c, 0x92, 0x7c, 0xff, 0x43, 0xe1, 0xf3, 0x1f, 0x43, 0x93, 0x2d, + 0xdc, 0x79, 0x20, 0xe0, 0xbc, 0xcb, 0x1d, 0xae, 0xaf, 0x9f, 0xbf, 0x8d, 0x4f, 0xa1, 0xab, 0xe8, + 0xe3, 0xbd, 0x6f, 0x9d, 0x21, 0xa1, 0x9a, 0x4e, 0xe7, 0x8d, 0xbc, 0x37, 0x3b, 0x74, 0x59, 0x57, + 0xb8, 0xc4, 0x3c, 0x44, 0x5e, 0x30, 0x06, 0xf2, 0x7d, 0x9b, 0x33, 0xbf, 0xb5, 0x44, 0x67, 0x51, + 0xd3, 0x31, 0x2c, 0x90, 0xc5, 0x82, 0x3c, 0x6b, 0x95, 0xbc, 0x8e, 0xd7, 0x54, 0x4f, 0xed, 0x7f, + 0x2c, 0x7c, 0xff, 0x35, 0x34, 0xb9, 0xed, 0xad, 0x33, 0x8c, 0x8d, 0xc8, 0x35, 0xbd, 0xd1, 0xfc, + 0xeb, 0xfc, 0x67, 0x5f, 0x4e, 0x3e, 0x19, 0x5b, 0x94, 0xaa, 0xa9, 0xd0, 0xf4, 0xa7, 0x6b, 0x63, + 0x64, 0x08, 0x0b, 0x92, 0x93, 0x5b, 0x40, 0x50, 0xfb, 0x0b, 0xfa, 0x91, 0xb3, 0xfd, 0x83, 0x91, + 0x7b, 0xce, 0x71, 0x94, 0x37, 0x77, 0x7f, 0xce, 0x8e, 0x08, 0x64, 0xb2, 0x27, 0x3e, 0x7b, 0x88, + 0x2a, 0xd0, 0xf3, 0x51, 0xc1, 0xc5, 0x1e, 0x56, 0xfa, 0xdf, 0x1b, 0x1f, 0xd8, 0xbf, 0x0e, 0x4d, + 0x9a, 0x41, 0x4e, 0x06, 0x3a, 0x0d, 0x5a, 0xea, 0xf7, 0xeb, 0xff, 0x6c, 0x5d, 0xf6, 0xd1, 0x93, + 0xe4, 0xaf, 0xb9, 0xd9, 0x63, 0x5b, 0x99, 0xd8, 0x7d, 0x90, 0x08, 0x0f, 0xeb, 0xea, 0x3a, 0xe7, + 0x20, 0x70, 0x7a, 0x84, 0x14, 0x90, 0xc0, 0x24, 0x31, 0x0b, 0x03, 0x55, 0x8d, 0xd9, 0x04, 0xf0, + 0x28, 0xf0, 0x0e, 0x1e, 0x72, 0x74, 0xa4, 0x48, 0x90, 0x29, 0x3a, 0x3d, 0x29, 0xf6, 0x18, 0xc4, + 0xfd, 0xdf, 0x1a, 0x5f, 0xce, 0x7f, 0x1f, 0x9a, 0xcc, 0xe0, 0x8b, 0x5d, 0xd2, 0x32, 0x7b, 0x85, + 0xbf, 0xde, 0xff, 0x84, 0xa7, 0x78, 0xb0, 0x6c, 0x99, 0x75, 0x3a, 0xe4, 0x30, 0x27, 0x59, 0x30, + 0x76, 0xbd, 0x7e, 0x8d, 0x70, 0x20, 0xf1, 0x25, 0xfb, 0xc7, 0x8b, 0x0b, 0x0c, 0x01, 0x92, 0xa1, + 0x82, 0xa3, 0x23, 0x6f, 0x5e, 0x27, 0x58, 0xd5, 0x9c, 0x0f, 0xf8, 0x54, 0xc2, 0xaf, 0x87, 0x2d, + 0xc3, 0x64, 0x27, 0x96, 0xdd, 0x64, 0x54, 0x7b, 0x84, 0x76, 0xee, 0x1d, 0x6f, 0xe1, 0x9f, 0xc6, + 0xa7, 0xe3, 0xdf, 0x87, 0x26, 0x39, 0x82, 0x08, 0xb9, 0xe2, 0xde, 0x8e, 0xce, 0xed, 0xd7, 0xe3, + 0xff, 0x6c, 0xf4, 0x4f, 0x7a, 0xd8, 0xc4, 0xd0, 0xc1, 0x83, 0x7c, 0xc4, 0x04, 0x6c, 0x78, 0xdc, + 0xeb, 0x71, 0x21, 0xe1, 0x83, 0xeb, 0x96, 0x05, 0xf2, 0x6c, 0x89, 0xa2, 0x65, 0x99, 0x50, 0x3e, + 0xdd, 0xde, 0x93, 0x0c, 0xcb, 0x10, 0xdb, 0xec, 0x83, 0x34, 0x1f, 0xf4, 0x6c, 0x11, 0x07, 0x98, + 0x42, 0xef, 0x10, 0xde, 0x9e, 0x8b, 0x7d, 0xd5, 0x79, 0x95, 0xd9, 0xf8, 0xc6, 0xa1, 0xfc, 0xfb, + 0xd0, 0x24, 0x39, 0x45, 0x67, 0x90, 0x2f, 0x3e, 0x12, 0x15, 0x5f, 0xef, 0xff, 0xf0, 0x59, 0x5c, + 0xc3, 0x6a, 0x2a, 0x53, 0x43, 0xc5, 0x9f, 0x13, 0x1a, 0x81, 0xee, 0xec, 0xae, 0x39, 0xdf, 0x50, + 0xe6, 0x64, 0x6f, 0x2f, 0x8f, 0x0e, 0xf8, 0xf8, 0xe1, 0x67, 0xe2, 0x5f, 0x4a, 0xb0, 0xb7, 0x37, + 0xf9, 0xa5, 0xb0, 0x89, 0xb9, 0xfa, 0xf0, 0xd9, 0x03, 0xb3, 0xd9, 0x77, 0x47, 0xe5, 0x60, 0xbe, + 0x66, 0xd7, 0xa2, 0xfd, 0x34, 0x3e, 0xce, 0x2a, 0xd8, 0xff, 0x30, 0x34, 0x79, 0x57, 0xc4, 0x89, + 0x09, 0x0d, 0xa3, 0x26, 0x1f, 0xbf, 0x8e, 0x7f, 0x6f, 0x44, 0xb7, 0xa7, 0xe6, 0x06, 0xc9, 0x39, + 0x9b, 0x33, 0x6d, 0xd9, 0xcf, 0xbb, 0x4c, 0xba, 0x7d, 0x35, 0xc4, 0x8c, 0xde, 0x8e, 0x76, 0x24, + 0xad, 0xee, 0x4f, 0xe7, 0x1f, 0x45, 0x88, 0xfc, 0xa7, 0x41, 0xda, 0x30, 0xde, 0xe2, 0xfe, 0x68, + 0x36, 0x31, 0xfd, 0x73, 0x02, 0x5f, 0xaf, 0x86, 0x0c, 0xc9, 0x12, 0x71, 0x1b, 0x68, 0xb5, 0xb5, + 0x4c, 0x60, 0xfc, 0x87, 0xa1, 0x49, 0x8c, 0xfd, 0x97, 0x97, 0x77, 0xda, 0x5e, 0x10, 0xec, 0xeb, + 0xf3, 0x8f, 0xef, 0x25, 0xe3, 0xc5, 0x4d, 0x84, 0xe5, 0x32, 0xc8, 0xd6, 0x67, 0x16, 0xf3, 0x99, + 0xd3, 0x09, 0x30, 0xd3, 0x3d, 0xf2, 0x05, 0x66, 0x5f, 0x04, 0x76, 0xe8, 0x18, 0xe7, 0x9d, 0x05, + 0x09, 0xf1, 0xef, 0x93, 0xc7, 0x66, 0xf2, 0x4d, 0xd9, 0xd8, 0x37, 0x52, 0x9e, 0x91, 0x9d, 0x3b, + 0x49, 0x9b, 0xb9, 0xfc, 0x8d, 0xc3, 0x10, 0xd3, 0xe3, 0x45, 0x84, 0x4a, 0x51, 0x8f, 0xff, 0x30, + 0x34, 0x59, 0xfa, 0x73, 0x91, 0x80, 0x0a, 0x84, 0x4e, 0xd3, 0x7f, 0xbd, 0xff, 0x5b, 0x34, 0x48, + 0xec, 0xe3, 0xb1, 0x57, 0x52, 0x13, 0xa4, 0x39, 0xab, 0x9d, 0xca, 0xe7, 0x97, 0x39, 0xb6, 0xc3, + 0xed, 0xa5, 0xd1, 0x73, 0x5f, 0x3b, 0x6f, 0x40, 0x4f, 0xf9, 0xe4, 0xc2, 0x37, 0x0c, 0x0d, 0x12, + 0xff, 0x40, 0x91, 0xe1, 0x9d, 0x73, 0xd0, 0x1b, 0xf4, 0x32, 0x81, 0x31, 0x1a, 0x07, 0xe2, 0x1c, + 0x46, 0xf7, 0x85, 0x8e, 0xab, 0xcd, 0x51, 0x89, 0xff, 0x79, 0x68, 0x92, 0xc5, 0xf3, 0x6d, 0x60, + 0xea, 0xe3, 0x12, 0x3a, 0x83, 0x6f, 0xaf, 0x5f, 0x0a, 0xe3, 0x98, 0x0c, 0xcf, 0x80, 0x0f, 0xbe, + 0x1f, 0x37, 0xfa, 0x3a, 0x7a, 0xdf, 0xeb, 0x41, 0xd0, 0x45, 0x1d, 0x5e, 0x8d, 0x2c, 0xf9, 0xb9, + 0xce, 0xad, 0x78, 0x21, 0x05, 0xc7, 0xdf, 0x01, 0x7b, 0x3e, 0xcc, 0xfb, 0x21, 0x37, 0x72, 0x23, + 0xb6, 0xf8, 0x0f, 0xd3, 0x7b, 0x37, 0x11, 0xd2, 0xf4, 0x1f, 0x37, 0xf0, 0xcb, 0xf7, 0x3b, 0x22, + 0x7b, 0xfa, 0x9f, 0x87, 0x26, 0x2f, 0xc1, 0x8a, 0x01, 0x9b, 0x30, 0x96, 0xc6, 0xff, 0x03, 0xf5, + 0xbf, 0x57, 0x8b, 0x1e, 0xe0, 0x9c, 0xc3, 0x9f, 0xf8, 0xef, 0xb3, 0xa0, 0x41, 0x5b, 0x79, 0xcd, + 0xcf, 0x85, 0xeb, 0x1a, 0x6d, 0x6b, 0x7d, 0xdf, 0x10, 0xdd, 0xb2, 0xf5, 0xc4, 0x43, 0x2c, 0x4e, + 0x5a, 0x0b, 0x0e, 0x0f, 0xfb, 0xa5, 0xde, 0x4d, 0xfa, 0xea, 0x03, 0x39, 0x40, 0xec, 0x15, 0x95, + 0x60, 0x43, 0x74, 0x44, 0xc0, 0x22, 0x3c, 0xc6, 0x1f, 0x70, 0xfb, 0xfa, 0x1f, 0x86, 0x26, 0xd9, + 0x13, 0x0a, 0x06, 0x1b, 0xb9, 0x5e, 0x17, 0x4b, 0x5f, 0xcf, 0x7f, 0x4a, 0x7d, 0xa3, 0x47, 0x52, + 0xe6, 0x7d, 0x2f, 0x0c, 0xf5, 0xec, 0xa9, 0x2b, 0x2d, 0x6b, 0x9d, 0x68, 0x07, 0x4f, 0x2e, 0xd0, + 0xd0, 0x99, 0xcd, 0x5a, 0x22, 0x57, 0x0b, 0xe8, 0x07, 0x38, 0x9a, 0xfb, 0x33, 0x3b, 0xbd, 0x26, + 0x5f, 0x20, 0xa7, 0x45, 0x14, 0x4b, 0xd9, 0x8b, 0xb4, 0xc6, 0x1c, 0x48, 0x7c, 0x87, 0xbf, 0xd1, + 0xe0, 0x21, 0xc4, 0x47, 0x43, 0x56, 0xba, 0x95, 0xff, 0x79, 0x68, 0xb2, 0x1a, 0x4b, 0xf3, 0xf1, + 0x6a, 0x0e, 0x2d, 0xd2, 0xaf, 0xf7, 0x7f, 0x91, 0x50, 0xf6, 0x8c, 0x7e, 0x5a, 0xcc, 0x9a, 0xf6, + 0xac, 0x6c, 0x70, 0x04, 0xa7, 0xc8, 0x79, 0x4e, 0x37, 0xb3, 0xb7, 0xef, 0x3b, 0x1b, 0x61, 0x9a, + 0x41, 0x43, 0x4e, 0x9a, 0x86, 0x81, 0x68, 0xb7, 0xb5, 0x0b, 0x7d, 0xc3, 0xec, 0x96, 0xc9, 0xd5, + 0x70, 0x2a, 0xa9, 0x82, 0x7d, 0xd4, 0xd9, 0x46, 0x5a, 0xdb, 0x4d, 0x1b, 0xdc, 0xf5, 0xd3, 0x38, + 0x9c, 0x6f, 0x4d, 0xdb, 0x47, 0xe1, 0xff, 0x65, 0x68, 0x92, 0x09, 0xc5, 0x95, 0x9d, 0x57, 0x26, + 0xf5, 0x02, 0xe6, 0xeb, 0xfe, 0xcf, 0x3b, 0xfc, 0xc8, 0xe0, 0x30, 0xdc, 0x95, 0x0c, 0x8c, 0x0d, + 0xe4, 0xf2, 0x2b, 0x24, 0x44, 0x7a, 0x0b, 0xc6, 0x73, 0xd1, 0x44, 0x09, 0x25, 0x30, 0xef, 0x78, + 0x2f, 0xb7, 0x19, 0x7f, 0xf5, 0x7b, 0xf0, 0xa6, 0x12, 0xc7, 0x13, 0x8d, 0xa2, 0xa8, 0x03, 0xdd, + 0xdf, 0x67, 0xb0, 0xf3, 0xdd, 0xb7, 0xbf, 0x1b, 0x42, 0x1c, 0x23, 0x94, 0x63, 0x70, 0x44, 0xb3, + 0xf9, 0xf7, 0xa1, 0xc9, 0x1e, 0xc4, 0xcb, 0xb5, 0x23, 0x65, 0x22, 0x4b, 0xf7, 0xed, 0xe5, 0x2f, + 0x8a, 0x29, 0x20, 0x21, 0xa2, 0x11, 0xd7, 0x59, 0xe2, 0x91, 0xd6, 0x23, 0xcd, 0x83, 0x44, 0xda, + 0x6c, 0x67, 0xa1, 0x82, 0xed, 0x94, 0x34, 0x62, 0x3e, 0x45, 0x4d, 0x04, 0x33, 0xa3, 0x54, 0x84, + 0xf7, 0x0a, 0x28, 0x9d, 0x05, 0xd0, 0x39, 0xf0, 0x26, 0xae, 0xd9, 0x10, 0x70, 0xf3, 0xd9, 0x0f, + 0xff, 0x7e, 0x10, 0xd1, 0x2d, 0x27, 0x8c, 0xa6, 0xa2, 0x47, 0xdd, 0x13, 0xfb, 0x97, 0xa1, 0xc9, + 0x91, 0x1a, 0xcf, 0x1b, 0xc9, 0x6c, 0xd6, 0xcb, 0x11, 0x14, 0x7f, 0xbd, 0xfe, 0x07, 0xfa, 0xe4, + 0xcd, 0x59, 0x5b, 0xf1, 0x03, 0xa3, 0xeb, 0x3f, 0xea, 0x45, 0xeb, 0x2e, 0x60, 0xde, 0x80, 0xd4, + 0x4d, 0x0d, 0x91, 0xb3, 0x45, 0x8e, 0xf8, 0x76, 0xc0, 0xa0, 0x6e, 0x34, 0x88, 0x73, 0xbf, 0x9e, + 0x84, 0x07, 0xed, 0x3c, 0x7b, 0xc4, 0xcc, 0x6e, 0x03, 0xd2, 0x9f, 0xfb, 0xb8, 0x0e, 0x34, 0x1f, + 0x81, 0x7a, 0x84, 0x00, 0xf7, 0x33, 0x18, 0x07, 0x97, 0x87, 0xe2, 0xc6, 0xbf, 0x0e, 0x4d, 0xa6, + 0x88, 0x28, 0x70, 0xef, 0xa5, 0x34, 0x78, 0xd0, 0xf8, 0xaf, 0xef, 0xfb, 0xff, 0x1e, 0xd6, 0x89, + 0x6d, 0x90, 0x8a, 0x9e, 0xfe, 0xda, 0xd1, 0x05, 0xec, 0x0b, 0x7c, 0x26, 0x78, 0xd5, 0x25, 0x5a, + 0xc2, 0x40, 0xad, 0x28, 0x84, 0x7b, 0x03, 0x04, 0xf7, 0x7e, 0xbb, 0xab, 0x14, 0xf7, 0x4e, 0x31, + 0xb4, 0x71, 0xee, 0xa3, 0xf3, 0xdc, 0x79, 0x88, 0x9b, 0xc1, 0x38, 0x46, 0xf7, 0xc7, 0x50, 0x6a, + 0x0e, 0x8e, 0x44, 0x6f, 0x36, 0x53, 0x15, 0xff, 0x58, 0xa7, 0xfe, 0x79, 0x68, 0x72, 0xa2, 0x20, + 0xf5, 0x98, 0xe0, 0x9e, 0xae, 0x3a, 0xfa, 0x4a, 0x84, 0x8b, 0x67, 0xfc, 0xba, 0xff, 0xf7, 0xd0, + 0xc7, 0xbe, 0x82, 0x9a, 0xe4, 0x66, 0x4e, 0x26, 0x62, 0x08, 0xe7, 0x37, 0xd4, 0x8a, 0x7b, 0xc0, + 0x64, 0xae, 0xd9, 0x4b, 0x3c, 0xda, 0x9c, 0x77, 0x19, 0xcb, 0x23, 0xea, 0xe2, 0x1f, 0x9e, 0x73, + 0xb2, 0xda, 0xba, 0x8c, 0xb8, 0xc9, 0x12, 0x4e, 0x02, 0x90, 0x7d, 0x78, 0x55, 0xc2, 0x7e, 0xd2, + 0xdb, 0x4d, 0x66, 0xec, 0x5f, 0x20, 0x32, 0x0f, 0xa7, 0xa4, 0xc8, 0xff, 0x34, 0x34, 0x79, 0x59, + 0x68, 0xe2, 0x91, 0x74, 0x76, 0x1c, 0xd1, 0x88, 0xcc, 0xaa, 0xfb, 0xaa, 0xbe, 0x3e, 0xff, 0x51, + 0x63, 0x19, 0xee, 0x98, 0x38, 0x04, 0xa1, 0xfa, 0xc7, 0x7b, 0x59, 0xbf, 0x8e, 0x20, 0x6f, 0xdf, + 0x9b, 0x7c, 0x1e, 0x75, 0xdf, 0x84, 0xec, 0xaf, 0xeb, 0xa2, 0xf1, 0xb7, 0x36, 0x8c, 0xef, 0x02, + 0x57, 0x98, 0x28, 0x2d, 0x9c, 0xdf, 0xba, 0xc8, 0x8d, 0xa2, 0xde, 0x23, 0xbc, 0x0b, 0x16, 0x6e, + 0xd6, 0x9a, 0x99, 0xc9, 0x4d, 0x50, 0x6a, 0x0e, 0x04, 0xbf, 0x82, 0x5d, 0xe7, 0x7f, 0x0d, 0x4d, + 0xc2, 0x70, 0x23, 0xc7, 0xe2, 0xec, 0x08, 0x0c, 0xcd, 0xc6, 0xcd, 0xd9, 0x79, 0x7d, 0x7f, 0x1d, + 0xff, 0xed, 0xaa, 0xe1, 0xc1, 0x58, 0x0e, 0x4b, 0x0c, 0x73, 0x12, 0x08, 0xfc, 0x53, 0x82, 0x55, + 0xf2, 0x3e, 0xba, 0x71, 0x95, 0xea, 0xdd, 0x81, 0x28, 0xa0, 0x79, 0xa0, 0x06, 0x75, 0x85, 0xec, + 0xf0, 0x67, 0x04, 0xea, 0xda, 0xf3, 0x35, 0x73, 0x03, 0x94, 0xab, 0x99, 0x1e, 0x1b, 0x33, 0x71, + 0xb0, 0x20, 0xc0, 0xb9, 0x1e, 0x21, 0x7b, 0x3b, 0xdf, 0x93, 0x22, 0xae, 0x34, 0x86, 0xff, 0xd3, + 0xd0, 0x64, 0x47, 0xc8, 0x14, 0xba, 0xce, 0x09, 0x5f, 0x34, 0x3e, 0x37, 0xe9, 0x49, 0xae, 0xbf, + 0x9e, 0xff, 0xbe, 0xbd, 0xee, 0xb8, 0x01, 0x48, 0x03, 0x34, 0x28, 0x2e, 0x15, 0xf8, 0x23, 0x42, + 0xf1, 0x1c, 0x0d, 0xd8, 0x9c, 0x9c, 0xdc, 0x63, 0x9d, 0xd9, 0x7a, 0x0b, 0x9c, 0x28, 0x98, 0x23, + 0xff, 0x93, 0x1a, 0x7d, 0xda, 0x25, 0xc5, 0x9f, 0x6e, 0x08, 0x4d, 0xab, 0x02, 0xfd, 0x9e, 0x12, + 0x43, 0x9d, 0xb8, 0x2d, 0x92, 0xc1, 0x93, 0xd2, 0x0d, 0x99, 0x82, 0xc5, 0x7d, 0x80, 0xff, 0x1a, + 0x9a, 0x7c, 0x5b, 0xcf, 0xb8, 0x25, 0x36, 0x86, 0x50, 0x65, 0x04, 0xee, 0x3e, 0xed, 0x34, 0xed, + 0xeb, 0xfd, 0x7f, 0x52, 0xf1, 0x51, 0x6f, 0x5a, 0xfa, 0x0c, 0x5d, 0x72, 0x3b, 0x5e, 0x40, 0x55, + 0x6f, 0xcd, 0xf3, 0x66, 0x1c, 0x15, 0x4a, 0xab, 0x19, 0xd4, 0x5f, 0x84, 0xbb, 0x6e, 0xde, 0x6e, + 0x61, 0xdb, 0x4c, 0xeb, 0x9f, 0x33, 0xde, 0x7f, 0x00, 0x03, 0x9c, 0x9d, 0x52, 0xa2, 0x6c, 0xc6, + 0x50, 0x19, 0x3f, 0x0f, 0x02, 0xbe, 0xe5, 0x79, 0xd7, 0xa8, 0x98, 0xb6, 0x66, 0xfc, 0x63, 0x68, + 0x52, 0x96, 0x96, 0x72, 0x24, 0x52, 0xce, 0x84, 0x88, 0x85, 0x22, 0xfa, 0xe0, 0x72, 0xcc, 0x4b, + 0x47, 0xbf, 0x2c, 0x2d, 0x63, 0xb8, 0x4a, 0xb3, 0xa3, 0xe9, 0x93, 0x9e, 0x5c, 0xf6, 0xb3, 0xb4, + 0xeb, 0xe0, 0xa9, 0x82, 0x4a, 0x71, 0xa6, 0x84, 0xc0, 0x7b, 0xeb, 0x7d, 0x1c, 0x11, 0x09, 0x9b, + 0x1b, 0x95, 0x79, 0x2b, 0x77, 0xdc, 0xa5, 0x99, 0x08, 0xe4, 0xf2, 0x4d, 0x0e, 0x59, 0x61, 0x89, + 0x06, 0xc1, 0x71, 0x24, 0xf0, 0x0f, 0xa1, 0x97, 0x78, 0x48, 0xf8, 0x7b, 0x68, 0x32, 0xd8, 0x82, + 0x48, 0xb7, 0xea, 0x21, 0xb6, 0xf1, 0x9a, 0x58, 0x47, 0xd6, 0xe2, 0x2d, 0x03, 0x43, 0xa2, 0xfa, + 0x7a, 0xff, 0x87, 0x2b, 0xe6, 0x86, 0xc4, 0xd5, 0x16, 0x4e, 0x81, 0x67, 0xc3, 0xb7, 0x4d, 0x23, + 0x59, 0x23, 0x84, 0x97, 0x18, 0xc7, 0x64, 0x6e, 0xb8, 0x18, 0x72, 0xf1, 0xdc, 0x6a, 0xed, 0x45, + 0xb2, 0x21, 0xa9, 0xd9, 0xaf, 0x88, 0x04, 0x2e, 0xcd, 0x54, 0xb8, 0x68, 0xd9, 0x22, 0x3b, 0x86, + 0x76, 0xe9, 0x02, 0xb8, 0x1d, 0x76, 0xa0, 0x06, 0x20, 0xf5, 0xd7, 0x8f, 0x49, 0xe3, 0x34, 0x9c, + 0x7f, 0x32, 0x27, 0xb0, 0xf6, 0xa2, 0x10, 0x5a, 0x8a, 0x4a, 0x46, 0xef, 0xf6, 0x42, 0xa0, 0xd1, + 0xb3, 0x24, 0x2e, 0xbd, 0xfc, 0xeb, 0xf9, 0x7f, 0xee, 0x9b, 0xb6, 0xd5, 0x32, 0xa7, 0xd4, 0xf5, + 0xdc, 0x17, 0xfa, 0x6e, 0x3b, 0xd3, 0xb9, 0xc5, 0x74, 0x77, 0x3d, 0x78, 0xd2, 0x74, 0x16, 0x87, + 0xef, 0xa7, 0x87, 0x66, 0x10, 0x1d, 0xbf, 0xe0, 0x0e, 0xe4, 0xf6, 0x18, 0x00, 0x3e, 0x57, 0x3a, + 0x6d, 0xa9, 0x2b, 0xb4, 0x97, 0xf5, 0x7a, 0xcc, 0x6c, 0x1d, 0x3c, 0x10, 0x06, 0x51, 0xc6, 0x14, + 0xa1, 0xa6, 0x94, 0x0b, 0x43, 0xa2, 0xe0, 0x73, 0x8a, 0xf6, 0x42, 0xca, 0x4c, 0x05, 0x86, 0x40, + 0x47, 0x31, 0xf2, 0xcd, 0xc2, 0xe8, 0xec, 0x9f, 0xf3, 0xfa, 0xb8, 0x52, 0xff, 0xfe, 0xfd, 0x17, + 0xa2, 0xdc, 0xec, 0x42, 0xc2, 0x17, 0xe1, 0x39, 0xce, 0x1d, 0x17, 0x18, 0x06, 0xf2, 0x96, 0xd1, + 0x7a, 0x42, 0x47, 0x2f, 0xe6, 0x75, 0x85, 0xb3, 0xd7, 0x39, 0xdf, 0xb1, 0x5c, 0x8f, 0xe7, 0x21, + 0xf9, 0x70, 0x22, 0xf4, 0x4d, 0x6a, 0x7d, 0x90, 0x0a, 0xad, 0xd3, 0x86, 0xc7, 0xfb, 0xcc, 0x72, + 0xf7, 0x29, 0x19, 0x6e, 0xc0, 0xb2, 0xef, 0x97, 0x53, 0x54, 0x8d, 0x26, 0x74, 0xc4, 0x60, 0xb2, + 0x93, 0x26, 0x59, 0x07, 0x87, 0x66, 0x70, 0xa6, 0x4b, 0xc0, 0xed, 0xce, 0x4f, 0x9f, 0x6d, 0xb7, + 0xe9, 0x35, 0xde, 0xf6, 0x6f, 0xaf, 0x7f, 0x90, 0x49, 0x7e, 0xef, 0x36, 0x87, 0x3b, 0x36, 0x82, + 0x91, 0xbc, 0x07, 0xae, 0xba, 0x86, 0x86, 0x68, 0x27, 0x21, 0x0e, 0xaa, 0x61, 0x47, 0x5e, 0xa0, + 0x64, 0x08, 0x72, 0x45, 0x25, 0xb6, 0x09, 0xf4, 0x18, 0xc5, 0xd0, 0x76, 0x20, 0x11, 0x08, 0x3c, + 0x87, 0x91, 0x07, 0x52, 0xba, 0x01, 0xf3, 0x9e, 0xe0, 0x31, 0xe7, 0x25, 0x2f, 0xf5, 0x4c, 0x50, + 0x9c, 0x73, 0x3c, 0x51, 0x6b, 0xde, 0x1b, 0x43, 0x27, 0x9f, 0x69, 0x43, 0x73, 0xec, 0x67, 0x7e, + 0x11, 0x1c, 0x79, 0x84, 0x1a, 0x10, 0xe0, 0xe9, 0xf1, 0x51, 0x5f, 0xbf, 0xff, 0x54, 0x7b, 0x33, + 0x0e, 0x33, 0x86, 0xa1, 0x92, 0xcc, 0x24, 0x1e, 0xe4, 0x87, 0xcf, 0x76, 0x87, 0xe2, 0xd9, 0x0d, + 0x23, 0xdc, 0xd9, 0x55, 0x9b, 0xd1, 0xa9, 0x47, 0x3c, 0xcd, 0x9b, 0x69, 0xf4, 0x03, 0x32, 0xc6, + 0x39, 0x07, 0xd0, 0x9e, 0x53, 0xa3, 0x0b, 0xbc, 0x71, 0x0b, 0x60, 0x71, 0x1d, 0x43, 0x80, 0xcf, + 0xc3, 0xe6, 0xa2, 0x74, 0x88, 0xd5, 0x79, 0x24, 0x37, 0x0f, 0xc3, 0xa0, 0x1f, 0x03, 0x71, 0x4e, + 0x22, 0xd8, 0x85, 0x98, 0xec, 0xc5, 0xfc, 0x8c, 0x12, 0x6a, 0xe6, 0x8d, 0x8b, 0x50, 0xe5, 0xa5, + 0x5f, 0xef, 0x7f, 0x22, 0xf0, 0xf8, 0x01, 0x3e, 0xf3, 0x8d, 0xcf, 0x6b, 0x8f, 0xf7, 0x4b, 0x5c, + 0x77, 0x49, 0x0e, 0xce, 0x8c, 0x5c, 0x08, 0x11, 0xfa, 0x15, 0x9a, 0x8f, 0x8d, 0xd3, 0x80, 0x78, + 0xb7, 0xa0, 0x49, 0x37, 0x4a, 0xc2, 0xcb, 0xd9, 0xe4, 0xff, 0xf3, 0x62, 0x28, 0x91, 0xa3, 0x8d, + 0xde, 0xc8, 0xe8, 0x69, 0x9f, 0xf7, 0x28, 0x48, 0x8b, 0x0e, 0xc4, 0xee, 0xa5, 0xd2, 0xec, 0xb7, + 0x3c, 0x27, 0xdf, 0x9f, 0x9b, 0xba, 0x16, 0xe8, 0xd5, 0x2d, 0xd4, 0xa4, 0x29, 0x79, 0xca, 0x63, + 0x4e, 0x84, 0xc5, 0x9a, 0x9e, 0x3a, 0xb1, 0xaf, 0xcf, 0xff, 0x56, 0x0c, 0x4a, 0x3e, 0xe7, 0xf0, + 0xcc, 0x9b, 0xda, 0xd8, 0x6a, 0x0f, 0x41, 0x1f, 0xb4, 0x06, 0x54, 0x67, 0xf4, 0x09, 0x2f, 0x64, + 0xa9, 0xde, 0x5e, 0x59, 0x4f, 0x04, 0x1f, 0xec, 0xf1, 0xb4, 0x43, 0x72, 0xdf, 0x47, 0x3a, 0x69, + 0xef, 0x63, 0x3b, 0xd9, 0xe8, 0x43, 0xda, 0xca, 0x80, 0xb4, 0xba, 0x57, 0xf9, 0x34, 0x27, 0x0c, + 0xb9, 0xd5, 0xea, 0xf4, 0x68, 0xf2, 0x08, 0x0f, 0xd1, 0xf1, 0x4a, 0x37, 0xd2, 0x5f, 0x73, 0xf7, + 0x51, 0x18, 0x95, 0x83, 0x4c, 0x84, 0xd1, 0x33, 0x21, 0xa2, 0xc9, 0x4d, 0xdb, 0xaf, 0xfb, 0x7f, + 0x36, 0xaf, 0xbd, 0xa0, 0xb3, 0x85, 0x4b, 0x87, 0x79, 0x07, 0x98, 0x7b, 0xe2, 0xbc, 0xb2, 0x1c, + 0x71, 0x20, 0xaf, 0x86, 0xa0, 0x37, 0x78, 0xcb, 0xbc, 0xdd, 0x60, 0x5b, 0x10, 0xff, 0xc1, 0xb5, + 0x28, 0xfa, 0xf4, 0x1a, 0x73, 0x89, 0x6b, 0xb3, 0xe3, 0x33, 0x34, 0x39, 0x62, 0xc2, 0x78, 0xe6, + 0x11, 0xd3, 0x37, 0x7c, 0x71, 0xbc, 0x09, 0x54, 0x87, 0x80, 0xe9, 0xfc, 0xdc, 0x0d, 0x7a, 0xed, + 0xf4, 0xd5, 0xa8, 0x48, 0xf8, 0xd2, 0x3f, 0x97, 0x89, 0x2d, 0xb3, 0x6d, 0xe4, 0x99, 0x84, 0x33, + 0x9a, 0xce, 0x90, 0x1a, 0x7f, 0x7b, 0xfd, 0x9e, 0xa0, 0x8b, 0x4b, 0xfc, 0x40, 0x6c, 0xeb, 0x67, + 0x29, 0x17, 0xad, 0x13, 0xdd, 0xba, 0x95, 0x19, 0x96, 0xf5, 0xda, 0xd0, 0xfd, 0x07, 0x84, 0xae, + 0x40, 0x0d, 0x52, 0x04, 0x99, 0x74, 0x98, 0x69, 0x9f, 0x4d, 0x64, 0xb5, 0xb7, 0xf5, 0x0f, 0x5c, + 0x7a, 0x4b, 0xca, 0xf3, 0x2e, 0x28, 0x5c, 0xca, 0xc8, 0xde, 0x72, 0x1d, 0x5a, 0xb9, 0xae, 0xc8, + 0x9e, 0x0f, 0xa2, 0xe2, 0x8d, 0x71, 0x70, 0xfc, 0xec, 0x83, 0x7e, 0x92, 0xec, 0xf2, 0x9d, 0x4d, + 0x60, 0x64, 0x36, 0x0d, 0x2f, 0xb0, 0x77, 0x4f, 0xbf, 0xce, 0xff, 0x64, 0x60, 0x2e, 0x48, 0xc9, + 0xee, 0x79, 0x45, 0xcf, 0xbc, 0xb3, 0xe8, 0x0d, 0x7a, 0xf6, 0xb0, 0x64, 0xee, 0xaf, 0xdb, 0x1c, + 0x26, 0xa5, 0xe8, 0xc3, 0x3c, 0xca, 0x89, 0x64, 0xdd, 0x07, 0xbb, 0x12, 0x64, 0xb6, 0xe1, 0x39, + 0xff, 0x7d, 0x68, 0x52, 0x5e, 0xd6, 0x85, 0xa4, 0x3d, 0x57, 0x07, 0xf1, 0xf3, 0x86, 0xd7, 0x05, + 0x22, 0x33, 0x1d, 0xb9, 0xb4, 0x44, 0x08, 0xe8, 0x5f, 0x1f, 0x3d, 0x91, 0x2c, 0x21, 0xf7, 0xa9, + 0x12, 0x6c, 0xb4, 0x2c, 0x90, 0xaf, 0xfb, 0xbf, 0xeb, 0xc5, 0x8f, 0x71, 0x3f, 0xe8, 0xe0, 0xe7, + 0x84, 0x03, 0x45, 0xbf, 0x3f, 0xef, 0xbb, 0x7f, 0x42, 0xd0, 0x86, 0x5e, 0x5e, 0x87, 0x8c, 0xfc, + 0xce, 0xc3, 0x63, 0x02, 0x98, 0x5d, 0x20, 0x8d, 0xeb, 0xc0, 0xfa, 0xf3, 0x4a, 0x2a, 0xa5, 0xfe, + 0xd7, 0xa1, 0x49, 0x71, 0x2b, 0x5c, 0x62, 0x6a, 0xc5, 0x8d, 0x1e, 0x10, 0x0b, 0x30, 0xb8, 0xa0, + 0xe8, 0x7d, 0x36, 0x3f, 0xbc, 0xb4, 0x06, 0x74, 0x98, 0xb4, 0xc5, 0x36, 0x47, 0xc9, 0xd0, 0xbb, + 0xcc, 0x82, 0x3a, 0xc4, 0xfb, 0xfb, 0xeb, 0x3f, 0x94, 0xb7, 0xcd, 0x01, 0x7f, 0xaa, 0x00, 0x73, + 0xd5, 0x1a, 0x25, 0x82, 0x56, 0xc4, 0xc4, 0xf1, 0xb9, 0xaa, 0x2f, 0x90, 0xe3, 0x44, 0xb6, 0xa8, + 0x1c, 0x66, 0x3d, 0x05, 0x8d, 0x0d, 0xb8, 0x7e, 0x8f, 0x34, 0x87, 0x5f, 0xc4, 0x03, 0xea, 0xbf, + 0x0d, 0x4d, 0xee, 0x3d, 0x3f, 0xae, 0x0d, 0x8b, 0xe0, 0xf6, 0x75, 0x0f, 0x41, 0xcf, 0x3f, 0x9b, + 0x88, 0x1e, 0x0c, 0xfe, 0x99, 0x07, 0xe4, 0xd0, 0x4c, 0x9e, 0xa8, 0x60, 0x52, 0xf0, 0xca, 0x2e, + 0x5b, 0x1a, 0x0c, 0x0f, 0xe6, 0xeb, 0xf5, 0xdf, 0xeb, 0xc9, 0x42, 0x07, 0x17, 0x3a, 0x52, 0x1b, + 0x18, 0x5a, 0xf5, 0x5e, 0x8e, 0xb3, 0x41, 0x29, 0x8c, 0x44, 0xa4, 0x28, 0xcf, 0xbc, 0xae, 0x52, + 0x53, 0xc8, 0xf7, 0x4a, 0xd1, 0xc0, 0xd9, 0x75, 0x21, 0xe4, 0x1b, 0x6c, 0xf6, 0xbc, 0xc7, 0xf8, + 0xbe, 0xea, 0x9f, 0x86, 0x26, 0xa3, 0x04, 0x2f, 0xce, 0x9b, 0x9e, 0x10, 0x0e, 0x0c, 0x1e, 0x63, + 0xf6, 0x4d, 0x7d, 0xb8, 0x10, 0x85, 0xb4, 0x5b, 0xb8, 0x8f, 0x63, 0x06, 0x58, 0x1a, 0x61, 0x44, + 0x99, 0x65, 0x28, 0xec, 0xb8, 0xc8, 0xf7, 0xe7, 0x5f, 0xfe, 0x4c, 0x7a, 0x22, 0xda, 0x6f, 0x1e, + 0xd1, 0x1a, 0xc8, 0xd9, 0xd0, 0x48, 0x04, 0x01, 0x71, 0xbc, 0x63, 0x54, 0x93, 0x78, 0x77, 0xe2, + 0x1e, 0x74, 0x5d, 0xf8, 0x38, 0x61, 0x8b, 0x20, 0x53, 0x9a, 0x93, 0x0f, 0x94, 0x21, 0x42, 0x1e, + 0xc9, 0x84, 0xff, 0x1a, 0x9a, 0x4c, 0x7d, 0x58, 0x4a, 0x97, 0x85, 0x22, 0x8a, 0x92, 0xa8, 0x19, + 0xb1, 0xc3, 0x0d, 0xb3, 0xf5, 0x91, 0xb5, 0x59, 0x5b, 0xe0, 0x1b, 0x38, 0x02, 0xc9, 0xc0, 0xac, + 0xb0, 0x01, 0x93, 0x0f, 0x08, 0xc2, 0x97, 0xaf, 0xe3, 0x7f, 0xe8, 0x3e, 0x3b, 0x72, 0xbe, 0x11, + 0x8a, 0x09, 0x78, 0xa6, 0x44, 0x76, 0xe9, 0x0f, 0xd8, 0x85, 0x86, 0x37, 0xc8, 0x51, 0xf1, 0xb0, + 0x2f, 0xb2, 0xcf, 0x62, 0x98, 0x0c, 0x0b, 0x2e, 0xd2, 0x3d, 0x15, 0xc1, 0xb1, 0x5f, 0x83, 0x97, + 0x55, 0xd8, 0x24, 0xcd, 0x3f, 0x86, 0x26, 0x59, 0x0b, 0x1e, 0x5d, 0x85, 0x58, 0x3e, 0x65, 0x80, + 0xa3, 0xcd, 0x0b, 0xd2, 0x46, 0xc2, 0x80, 0x22, 0x8d, 0x89, 0xde, 0x55, 0x45, 0xea, 0x11, 0x2c, + 0x68, 0xf7, 0x69, 0x04, 0xf2, 0x9f, 0xa1, 0x23, 0xf8, 0x7a, 0xfc, 0xcf, 0x40, 0xa5, 0x37, 0x48, + 0x7a, 0x63, 0xad, 0x96, 0x12, 0x2f, 0x78, 0x32, 0x99, 0xee, 0x8a, 0xce, 0xc1, 0x37, 0x6d, 0x19, + 0x30, 0x22, 0xa2, 0x9e, 0xc1, 0xed, 0xd5, 0x1e, 0x66, 0x86, 0x8c, 0xbe, 0xe1, 0x5c, 0x30, 0xd0, + 0x83, 0x3e, 0x23, 0x61, 0xf6, 0x75, 0x7f, 0x0d, 0x4d, 0x62, 0x08, 0x35, 0x73, 0x00, 0x16, 0x24, + 0x18, 0x54, 0x91, 0xca, 0x76, 0x62, 0x31, 0xf6, 0xe1, 0x8e, 0x38, 0xb0, 0xf4, 0xbc, 0x92, 0xb1, + 0x02, 0xa3, 0x8a, 0x23, 0x7b, 0x81, 0x16, 0x63, 0xfa, 0xe3, 0x34, 0xbf, 0xbd, 0xfe, 0x2b, 0xa0, + 0xce, 0x8f, 0xd1, 0xad, 0xa6, 0x0d, 0x90, 0x99, 0x5f, 0x27, 0xe9, 0xf0, 0x32, 0x45, 0x65, 0xd0, + 0xfa, 0xbd, 0x6f, 0xb9, 0xdf, 0x9f, 0xf9, 0xfe, 0xcf, 0xc7, 0x65, 0x02, 0xde, 0x2d, 0xdd, 0x32, + 0x1c, 0x24, 0x1a, 0x84, 0x87, 0x69, 0x25, 0xb3, 0x0b, 0x14, 0xfe, 0x0c, 0x4d, 0x72, 0xe5, 0x9e, + 0xd9, 0x4e, 0xe9, 0x4d, 0xdd, 0x11, 0xf2, 0xe1, 0xf6, 0xe0, 0x41, 0xa3, 0x4e, 0x08, 0x2e, 0x1f, + 0xb7, 0x1c, 0x39, 0x24, 0xe4, 0x11, 0x44, 0x61, 0x3c, 0x45, 0xf2, 0x20, 0xa9, 0xc2, 0xf0, 0x19, + 0xbe, 0x9e, 0xff, 0x71, 0xad, 0xcc, 0xd0, 0xa7, 0x64, 0x43, 0x20, 0x30, 0x6f, 0xfd, 0xbb, 0x44, + 0x1f, 0xe8, 0xfc, 0x91, 0xc5, 0xe8, 0x8e, 0x68, 0xe5, 0x3a, 0x90, 0xac, 0xbc, 0xe6, 0x73, 0x71, + 0xf9, 0x2c, 0xd9, 0x57, 0x3a, 0x87, 0x59, 0x76, 0x85, 0xeb, 0x37, 0x48, 0x7d, 0x66, 0x8a, 0x68, + 0xcc, 0x50, 0x60, 0xaf, 0xab, 0xb3, 0x57, 0xa9, 0x4f, 0x62, 0xa8, 0xc1, 0xca, 0x2c, 0xb4, 0x4a, + 0x78, 0xb1, 0x15, 0x79, 0xb5, 0xd3, 0x55, 0x5c, 0xd3, 0xf6, 0x7b, 0xdf, 0x3e, 0x79, 0xc3, 0x6a, + 0xf5, 0x7e, 0x5c, 0x12, 0xe2, 0xd7, 0xf3, 0x7f, 0x6c, 0xd6, 0x3b, 0xfa, 0xb5, 0xae, 0x11, 0xde, + 0x5d, 0x3f, 0x42, 0xbf, 0x7e, 0x5e, 0x03, 0xf2, 0x4e, 0x82, 0x67, 0xe5, 0xb9, 0xe2, 0xc1, 0xcf, + 0xe1, 0x7e, 0x35, 0x2f, 0xf8, 0x42, 0x80, 0x80, 0xb1, 0x10, 0x6d, 0x80, 0x8e, 0x75, 0x99, 0x25, + 0x83, 0xc1, 0xdb, 0x68, 0x14, 0xf7, 0x6b, 0x5e, 0x0f, 0x42, 0x69, 0xe5, 0x01, 0xf6, 0xaa, 0xef, + 0xf9, 0x4a, 0xca, 0xb5, 0x2b, 0xe8, 0xf8, 0xe7, 0x77, 0x0b, 0x40, 0x46, 0xd3, 0x21, 0x9c, 0x4d, + 0x07, 0x88, 0xe1, 0x16, 0x2a, 0x79, 0x67, 0x5f, 0x38, 0x2c, 0xc2, 0x7c, 0xbd, 0x00, 0x88, 0xcb, + 0x3a, 0xd6, 0x86, 0xee, 0x6d, 0x57, 0xc3, 0xa0, 0xe6, 0x63, 0x0c, 0x33, 0xe7, 0x46, 0x47, 0xe5, + 0x75, 0x81, 0xd9, 0xda, 0x7e, 0x99, 0x32, 0x27, 0x15, 0xc3, 0x75, 0x46, 0x3c, 0xfb, 0x79, 0x77, + 0xb5, 0x5a, 0xe5, 0xcc, 0x81, 0x93, 0x20, 0x57, 0x22, 0xb8, 0x52, 0x17, 0x8c, 0xeb, 0x4f, 0xe9, + 0xd3, 0xde, 0x05, 0x9f, 0x79, 0xe4, 0xd4, 0x81, 0x7d, 0xb6, 0xfe, 0x8f, 0xeb, 0x74, 0xa0, 0xe7, + 0x68, 0xfc, 0xfb, 0xcc, 0x1f, 0x3e, 0xa7, 0x86, 0x3d, 0x21, 0x1b, 0x8d, 0x22, 0x63, 0x74, 0x38, + 0xd9, 0xd7, 0xf1, 0x2f, 0x5a, 0xb1, 0x9b, 0xb7, 0xda, 0xd4, 0xb8, 0x7f, 0x72, 0x75, 0xda, 0x90, + 0xa3, 0x47, 0x74, 0x58, 0x87, 0x43, 0x67, 0xff, 0x19, 0xea, 0xf7, 0x35, 0x5a, 0x1f, 0xa8, 0x62, + 0x18, 0x16, 0x4b, 0x5a, 0xd2, 0x62, 0xff, 0xba, 0xbb, 0x62, 0x5b, 0x5e, 0x56, 0x03, 0xd3, 0x16, + 0x83, 0xc4, 0xe7, 0x0a, 0xd9, 0xa4, 0x94, 0xf6, 0xaa, 0x29, 0x45, 0xf4, 0x3d, 0x2b, 0x21, 0x4b, + 0xce, 0x94, 0x80, 0x5c, 0xa9, 0x43, 0x35, 0xb8, 0x30, 0xba, 0xce, 0x21, 0xea, 0x78, 0x56, 0x7e, + 0x26, 0xa7, 0xf4, 0x2c, 0x94, 0x7e, 0xbd, 0xff, 0xeb, 0x22, 0x1a, 0xa2, 0xb5, 0x31, 0x3e, 0xfe, + 0xcf, 0x8d, 0x04, 0xad, 0xd5, 0x07, 0x5e, 0xa2, 0x2f, 0x1d, 0xb7, 0xcd, 0x6b, 0x03, 0x64, 0x43, + 0xef, 0x6d, 0xf9, 0xeb, 0x42, 0x9c, 0xc3, 0x62, 0x90, 0x34, 0x20, 0x0c, 0xc2, 0x17, 0x72, 0x51, + 0x13, 0x22, 0x78, 0x0c, 0x07, 0x3c, 0x47, 0x54, 0x7d, 0x5d, 0x1e, 0xf4, 0xec, 0xe4, 0x2e, 0x01, + 0xdc, 0x75, 0x40, 0x40, 0xc0, 0xa4, 0xf8, 0xfb, 0xc4, 0xc8, 0x4d, 0x7d, 0x17, 0x73, 0x51, 0xa7, + 0xe0, 0xf5, 0xf3, 0xae, 0x55, 0xe4, 0x85, 0x61, 0xd6, 0xdb, 0xe8, 0xf9, 0xf5, 0xfe, 0xd7, 0x75, + 0x3b, 0xf3, 0x6c, 0xe2, 0xcc, 0xec, 0x29, 0xed, 0x33, 0xcd, 0x3e, 0x14, 0x44, 0x8a, 0x21, 0x9b, + 0xad, 0x57, 0x12, 0x27, 0xdc, 0xbb, 0x12, 0xdb, 0x7d, 0x51, 0xce, 0x8f, 0x79, 0xbd, 0xab, 0x9f, + 0x17, 0x9c, 0x22, 0x42, 0x02, 0x17, 0x78, 0x83, 0x7c, 0xee, 0x94, 0x92, 0x9b, 0xfb, 0x17, 0xd9, + 0x33, 0xb1, 0xd9, 0xf9, 0x31, 0x48, 0x2e, 0xcd, 0xb6, 0xd4, 0x32, 0x7f, 0x21, 0x71, 0x62, 0xda, + 0xcc, 0xac, 0x3f, 0xef, 0x82, 0xf1, 0xaf, 0x9c, 0x08, 0xa5, 0x4d, 0xd8, 0x21, 0x3f, 0x7f, 0x86, + 0x03, 0xee, 0xaf, 0xaf, 0xbf, 0x71, 0xf2, 0x82, 0x39, 0xe4, 0xc5, 0xf4, 0x13, 0x3e, 0xb5, 0x3c, + 0x2d, 0xd0, 0x7f, 0xcf, 0x6c, 0x57, 0xac, 0xcf, 0x5d, 0xef, 0x4d, 0xc1, 0x7d, 0x95, 0xf3, 0xed, + 0x6d, 0x8e, 0x35, 0x90, 0x4e, 0x0e, 0x8f, 0x67, 0x4f, 0xef, 0x34, 0x10, 0xc1, 0xeb, 0x5a, 0x7b, + 0x6d, 0x88, 0x86, 0xdd, 0x85, 0xf0, 0x6f, 0xc0, 0xec, 0x8d, 0x0d, 0x03, 0x23, 0x43, 0xc3, 0x87, + 0xd2, 0x4d, 0x11, 0x5d, 0x91, 0x0c, 0x02, 0x82, 0xce, 0xe9, 0x85, 0x06, 0x82, 0x32, 0xef, 0xdb, + 0xec, 0xb2, 0x68, 0x7f, 0x32, 0xe3, 0x5f, 0xaf, 0x7f, 0x41, 0x47, 0xab, 0xac, 0x40, 0x6e, 0xa6, + 0xe9, 0xfc, 0x0e, 0xb0, 0x6e, 0x2a, 0xec, 0x1a, 0x49, 0x0c, 0x81, 0x88, 0x4a, 0x3c, 0x26, 0xdf, + 0x9f, 0xed, 0x0b, 0xee, 0xd3, 0xe8, 0x4a, 0x08, 0xcc, 0x6b, 0x8e, 0x60, 0xf3, 0xfe, 0x3a, 0x84, + 0x98, 0x95, 0xa1, 0xa9, 0x31, 0xcf, 0xa8, 0xbb, 0xe8, 0x9f, 0xdf, 0x23, 0x7b, 0x44, 0x2b, 0x42, + 0x10, 0x3c, 0x99, 0x21, 0xe2, 0x47, 0xf9, 0xa7, 0x5e, 0xb8, 0xcd, 0xfe, 0x87, 0x86, 0x3f, 0xa2, + 0xe1, 0xcf, 0xe9, 0xed, 0x71, 0x7a, 0x3f, 0xfb, 0x83, 0x50, 0xf1, 0xeb, 0xeb, 0x2f, 0xb8, 0xc2, + 0x47, 0x3e, 0xf8, 0xc9, 0x32, 0x9d, 0x79, 0x1f, 0x5c, 0x69, 0x16, 0xe8, 0xaf, 0x31, 0x5e, 0x5f, + 0x45, 0x31, 0xd0, 0xcf, 0x6c, 0xf6, 0x41, 0x62, 0xd8, 0xfe, 0x42, 0x41, 0x6e, 0x45, 0xcf, 0x0d, + 0x8f, 0x46, 0x84, 0xdc, 0x58, 0xaa, 0x87, 0xc3, 0x30, 0x8e, 0x3e, 0x81, 0xda, 0x3e, 0x93, 0x48, + 0x31, 0xb8, 0xd9, 0x27, 0xb1, 0x48, 0x24, 0x4b, 0xf3, 0x5b, 0x7e, 0xe6, 0x0c, 0x6c, 0xaf, 0xc5, + 0x13, 0x35, 0xe4, 0xec, 0xaa, 0x6e, 0x04, 0xe1, 0xc2, 0x7d, 0x2a, 0x6a, 0x16, 0x04, 0x56, 0xcb, + 0xd7, 0xf1, 0xef, 0x81, 0x07, 0x39, 0x2f, 0x40, 0x98, 0x83, 0x3e, 0x52, 0x4c, 0x2e, 0x24, 0x3f, + 0x6d, 0x3e, 0xf8, 0x7f, 0x45, 0x4e, 0xa3, 0x17, 0xf0, 0x97, 0x1f, 0xed, 0xf2, 0x24, 0x44, 0x27, + 0x93, 0x0f, 0x7e, 0x8f, 0x2e, 0x0f, 0x84, 0xf1, 0x25, 0x38, 0xb1, 0x79, 0x46, 0x1f, 0x63, 0x60, + 0x8c, 0xf3, 0x7d, 0x7b, 0x15, 0x43, 0x08, 0x3b, 0x2b, 0x40, 0x30, 0x33, 0x46, 0x74, 0xaf, 0xa9, + 0xcc, 0x8b, 0x10, 0x07, 0x67, 0xf7, 0x82, 0x94, 0x97, 0x06, 0xb2, 0x01, 0x3b, 0x0a, 0xbb, 0xd5, + 0x24, 0xd0, 0x4f, 0x29, 0xf6, 0xeb, 0xfd, 0x4f, 0x8b, 0xcb, 0x1b, 0x3a, 0x66, 0xef, 0xdc, 0xc8, + 0xf2, 0xd3, 0x07, 0xba, 0x0d, 0x84, 0x7c, 0xd5, 0x22, 0x08, 0xbe, 0x22, 0x22, 0x79, 0x41, 0xd0, + 0x91, 0x17, 0x87, 0x6c, 0x95, 0xdd, 0x44, 0x8a, 0x6b, 0xe5, 0x23, 0xc4, 0xe4, 0x89, 0x7f, 0x2f, + 0xba, 0x06, 0x7b, 0xb5, 0x1c, 0xa5, 0xcf, 0x86, 0xb6, 0xf1, 0xfa, 0x37, 0x0e, 0x24, 0xc5, 0x90, + 0x3b, 0x0b, 0xe1, 0xc5, 0xbd, 0x7a, 0x11, 0xf3, 0xf8, 0xbb, 0x81, 0xe5, 0xde, 0x1a, 0x01, 0xf2, + 0xca, 0xcb, 0x0b, 0x2c, 0x5e, 0x72, 0x84, 0x8b, 0xc3, 0x70, 0x22, 0x7e, 0x7d, 0xfd, 0x35, 0x43, + 0x96, 0x7c, 0x70, 0xc9, 0xcb, 0x4b, 0x1b, 0x41, 0xbb, 0xd5, 0x1b, 0x82, 0xf9, 0x79, 0xc3, 0xc9, + 0xbc, 0xc0, 0xe7, 0x22, 0x37, 0x7a, 0x71, 0x25, 0x12, 0x7b, 0x53, 0x4a, 0xb7, 0x7b, 0x2e, 0xc4, + 0x00, 0xcc, 0xa5, 0xdc, 0x85, 0xcd, 0xd2, 0xd8, 0xc7, 0xd8, 0x94, 0x4e, 0x49, 0x9f, 0xee, 0xed, + 0x43, 0x43, 0x1b, 0xbd, 0x21, 0x6e, 0x56, 0x0f, 0x7a, 0xd0, 0xa1, 0xca, 0xc3, 0x92, 0x2b, 0x65, + 0x31, 0xc6, 0x66, 0x28, 0x87, 0xaa, 0x99, 0xc1, 0xc5, 0x12, 0x47, 0x8c, 0x9c, 0x09, 0xc2, 0x81, + 0x82, 0xde, 0xf3, 0xdb, 0xeb, 0x9f, 0x2d, 0xdd, 0x2f, 0xb5, 0xb9, 0xdb, 0x33, 0xa9, 0xee, 0xf6, + 0x68, 0x81, 0x29, 0xc8, 0x49, 0x3d, 0xf3, 0xd2, 0x9b, 0xb6, 0x9f, 0x17, 0xcf, 0x55, 0x1d, 0x62, + 0x92, 0xf6, 0x1e, 0x8c, 0xae, 0x50, 0x85, 0xc9, 0x78, 0x92, 0xfe, 0x46, 0x83, 0x3f, 0x92, 0xf0, + 0x4d, 0xf0, 0xdd, 0xd5, 0x3b, 0x59, 0xcd, 0xb6, 0x81, 0x54, 0x6a, 0x5e, 0x95, 0x7a, 0x57, 0x04, + 0xbe, 0xef, 0x79, 0x8b, 0x72, 0xbd, 0x18, 0x3e, 0x26, 0x87, 0x08, 0x35, 0xdc, 0x11, 0x7a, 0x91, + 0x84, 0xbe, 0x52, 0x84, 0x6e, 0x71, 0xfd, 0x88, 0x17, 0xbe, 0xbd, 0xfe, 0xa2, 0xa6, 0x4f, 0xdb, + 0x11, 0xc3, 0xb7, 0x0b, 0x4d, 0x14, 0x9e, 0x79, 0xe7, 0x95, 0x7d, 0x97, 0x1b, 0x76, 0x50, 0x2f, + 0x9e, 0x76, 0x46, 0x12, 0x8b, 0x5a, 0xdb, 0x34, 0x05, 0x5a, 0x23, 0xea, 0x47, 0x71, 0x45, 0x53, + 0xfa, 0xb9, 0xc3, 0xc1, 0xd6, 0x3a, 0x2f, 0xf3, 0x5d, 0xdf, 0xf0, 0x60, 0x3c, 0x7b, 0x66, 0x23, + 0xdc, 0x79, 0x33, 0xae, 0xc4, 0x6c, 0x8d, 0x66, 0xc8, 0x10, 0x0e, 0x54, 0x9f, 0x39, 0x46, 0xf3, + 0xd7, 0xf7, 0x47, 0x20, 0xdb, 0xeb, 0x97, 0x4f, 0xc8, 0x08, 0x79, 0x07, 0x36, 0x8c, 0xfa, 0xbe, + 0xff, 0x93, 0x75, 0x8e, 0xe7, 0xc2, 0xc3, 0xd0, 0x42, 0x25, 0xbd, 0xfe, 0x7c, 0xce, 0x40, 0xe6, + 0x75, 0xee, 0x66, 0x7e, 0x89, 0x13, 0xcd, 0x33, 0xcf, 0xcb, 0x99, 0xd8, 0x40, 0x93, 0x7d, 0xd8, + 0xdb, 0x58, 0xc9, 0x53, 0x9c, 0x77, 0x78, 0x24, 0xb4, 0xe3, 0xf6, 0x22, 0x92, 0x85, 0xac, 0x9e, + 0xf3, 0x51, 0x7d, 0xba, 0xd0, 0x53, 0xbc, 0xce, 0x21, 0x18, 0x54, 0xb3, 0x09, 0xee, 0x41, 0x93, + 0x48, 0xa7, 0x50, 0xd3, 0x21, 0xc2, 0xe7, 0x2e, 0xb1, 0x45, 0xa9, 0x65, 0x76, 0x89, 0x5f, 0x5c, + 0xce, 0xba, 0xb0, 0xff, 0xfa, 0xfd, 0x37, 0x2b, 0x6d, 0x69, 0x06, 0xe8, 0xc0, 0x87, 0x79, 0x92, + 0x34, 0x71, 0x76, 0x30, 0xc2, 0x89, 0x6a, 0x8c, 0x3c, 0xfe, 0xa8, 0x68, 0x0c, 0x8e, 0xa9, 0xb6, + 0xd8, 0xd3, 0xb9, 0x75, 0x41, 0xe4, 0x27, 0xfb, 0x6c, 0x6a, 0x9f, 0x77, 0xb8, 0x70, 0xb0, 0xce, + 0xe1, 0x96, 0x6d, 0x7d, 0x36, 0x3c, 0x9d, 0x9f, 0x2f, 0x4e, 0xc1, 0xa0, 0x90, 0x43, 0x7e, 0xe8, + 0xcc, 0x08, 0xcf, 0xaf, 0x4a, 0xcd, 0xd9, 0x9d, 0x9f, 0x3b, 0x60, 0x48, 0xb0, 0xda, 0x04, 0x17, + 0x81, 0x37, 0x47, 0x3e, 0xc9, 0xe2, 0xbd, 0xcb, 0xc7, 0x86, 0xaf, 0xcf, 0x3f, 0x9e, 0xe4, 0xa9, + 0xf3, 0x2b, 0x6f, 0x5e, 0x1b, 0x2b, 0xf2, 0xde, 0xf9, 0xed, 0x2d, 0xd0, 0x59, 0x93, 0xa6, 0x0f, + 0xe9, 0x3e, 0xe3, 0x9b, 0x56, 0x48, 0x3f, 0xbf, 0x14, 0x75, 0xe3, 0xa7, 0xd3, 0x68, 0xf3, 0x52, + 0x8c, 0x3f, 0x77, 0xf8, 0xc4, 0xcf, 0x58, 0x5b, 0xd0, 0xa6, 0x4b, 0xed, 0x5a, 0x24, 0x27, 0xcd, + 0xa1, 0xb4, 0x57, 0xdc, 0x46, 0xb2, 0x0a, 0x45, 0x09, 0x17, 0x63, 0xbd, 0x91, 0x5b, 0xb8, 0xb7, + 0xf9, 0xed, 0x60, 0x86, 0x93, 0x1d, 0x50, 0x5b, 0x9c, 0xd0, 0x8f, 0x09, 0x71, 0x19, 0x82, 0x5c, + 0x5f, 0xf7, 0xff, 0x5d, 0x08, 0x52, 0x0b, 0xbf, 0x0e, 0x82, 0x8b, 0xad, 0x84, 0xcf, 0x2b, 0x7a, + 0x5a, 0x89, 0x51, 0x3e, 0x9c, 0xbf, 0x33, 0xf3, 0xd3, 0xd1, 0xc8, 0x11, 0xc7, 0xe0, 0xd9, 0xe5, + 0x6a, 0x1e, 0x9e, 0x51, 0xf9, 0xff, 0xba, 0xc3, 0x89, 0xa6, 0x28, 0xe4, 0xcc, 0x63, 0xe9, 0x91, + 0x12, 0x46, 0xcc, 0xac, 0x9a, 0xa3, 0xe8, 0xda, 0x42, 0x06, 0x59, 0xdf, 0x42, 0xfc, 0xec, 0x8a, + 0x2d, 0x15, 0xc4, 0x79, 0xf0, 0x46, 0x76, 0x72, 0x51, 0xb9, 0xd3, 0x19, 0x59, 0xe4, 0xb1, 0x63, + 0xa0, 0xb9, 0xb5, 0xd4, 0xf9, 0xeb, 0xe7, 0x3f, 0xda, 0xfd, 0x0c, 0xe0, 0xf5, 0x50, 0x43, 0xe9, + 0x74, 0xef, 0xfc, 0x38, 0xa2, 0xd4, 0xef, 0xa3, 0x84, 0x7c, 0x5d, 0xfc, 0xcc, 0x3b, 0x00, 0x5f, + 0xb9, 0x0c, 0x73, 0x76, 0x7f, 0x58, 0x56, 0x10, 0xed, 0xff, 0xb9, 0xc3, 0x0b, 0xf4, 0xd5, 0xc9, + 0xfa, 0xcc, 0x2b, 0x02, 0x50, 0xd9, 0xad, 0xcd, 0x6f, 0xe8, 0x29, 0xb3, 0x31, 0x5b, 0x81, 0x11, + 0xf2, 0xdc, 0x48, 0x07, 0x3e, 0x97, 0xca, 0xe2, 0x66, 0x1c, 0x1b, 0x6f, 0x5d, 0x48, 0x87, 0xf0, + 0xc8, 0x4c, 0x88, 0xd5, 0xfb, 0x40, 0x63, 0x39, 0xc7, 0xff, 0x81, 0xf9, 0x77, 0xe8, 0x1c, 0x0c, + 0x74, 0x74, 0x57, 0x86, 0x9c, 0x23, 0x30, 0x2a, 0xc9, 0x2d, 0x1d, 0x5a, 0x44, 0x78, 0x7d, 0x06, + 0x6e, 0xce, 0xf6, 0x1c, 0x3b, 0x2c, 0x5e, 0xd1, 0x79, 0xc7, 0x7b, 0x52, 0xef, 0xfb, 0xf7, 0x1d, + 0x6e, 0xb3, 0x5d, 0xec, 0x1c, 0x09, 0x19, 0xe0, 0x2a, 0xbb, 0xa7, 0x6a, 0x5e, 0x96, 0xfd, 0x44, + 0x3b, 0xa0, 0xf2, 0x15, 0x62, 0xef, 0xb8, 0x15, 0x30, 0xfa, 0xf5, 0xe9, 0x0a, 0x37, 0x0b, 0x83, + 0x36, 0x33, 0x02, 0x8a, 0x26, 0xb0, 0x37, 0x94, 0xc5, 0x2a, 0x7d, 0x51, 0x78, 0xbe, 0xce, 0xff, + 0xe6, 0x04, 0x97, 0xa5, 0xfc, 0xb0, 0x9f, 0x6f, 0xc1, 0x9b, 0x9d, 0xef, 0xf8, 0xc9, 0xb6, 0x52, + 0x8e, 0xde, 0x5e, 0x64, 0x74, 0x65, 0x33, 0xca, 0x00, 0x61, 0xe1, 0xda, 0x28, 0xd4, 0x8d, 0xca, + 0x9b, 0xfe, 0xe3, 0x0e, 0x3f, 0x98, 0xdf, 0x9a, 0x94, 0x12, 0xee, 0xe1, 0xc6, 0xd0, 0xf7, 0x57, + 0xff, 0xbe, 0xe2, 0x99, 0xb0, 0xe9, 0x5c, 0xc8, 0x23, 0x7a, 0x7a, 0x10, 0xe6, 0x18, 0xcb, 0x3e, + 0x25, 0x06, 0x0c, 0x88, 0xe9, 0x54, 0x2c, 0x81, 0x19, 0xc8, 0xa6, 0x52, 0x93, 0xf3, 0x02, 0xf8, + 0x83, 0x7f, 0xbd, 0xfd, 0x6b, 0x59, 0xac, 0xf7, 0x70, 0x5c, 0x56, 0x24, 0x50, 0x55, 0xe0, 0xaa, + 0x90, 0xe8, 0x75, 0x41, 0xe0, 0x58, 0x63, 0x67, 0xf3, 0x7b, 0x0f, 0x10, 0x0b, 0x9b, 0x05, 0x2e, + 0x75, 0xbc, 0xa0, 0x9e, 0xd0, 0xcc, 0xfe, 0xf7, 0x55, 0x36, 0x9f, 0x39, 0x57, 0x84, 0x44, 0xb0, + 0xd4, 0xb6, 0xe2, 0xe9, 0x97, 0x2c, 0x7c, 0x3d, 0x3f, 0x5f, 0x78, 0xeb, 0xf7, 0x62, 0x7d, 0x9c, + 0x4e, 0x03, 0xc1, 0xaf, 0x40, 0xca, 0x3b, 0x15, 0x9d, 0xbe, 0x7c, 0x96, 0x50, 0xdf, 0x17, 0x95, + 0x8a, 0x25, 0x7d, 0x29, 0xe4, 0x41, 0xe1, 0xeb, 0xf9, 0x3f, 0x7a, 0x52, 0x21, 0x9c, 0x40, 0xb2, + 0x8b, 0x40, 0xf8, 0x12, 0x50, 0x92, 0xb7, 0xfe, 0xd3, 0xc6, 0x3f, 0xef, 0xf0, 0x74, 0x40, 0x11, + 0x17, 0xad, 0xf3, 0x4a, 0xf8, 0x79, 0x31, 0x50, 0x7b, 0x6d, 0x1d, 0xff, 0xb8, 0xc3, 0x53, 0xcc, + 0x94, 0xc7, 0xec, 0x65, 0x59, 0x10, 0x17, 0x5a, 0x15, 0x5e, 0xa7, 0xe7, 0x77, 0x5e, 0xcf, 0x31, + 0x2a, 0x7c, 0x09, 0xa7, 0xd6, 0x8a, 0x39, 0xfd, 0xf8, 0xac, 0x4c, 0x27, 0xdc, 0x64, 0x0a, 0x83, + 0x21, 0xce, 0x50, 0x27, 0x17, 0x68, 0x4b, 0x68, 0x37, 0x30, 0x62, 0xf8, 0xbe, 0xfd, 0x97, 0x3a, + 0xe7, 0x15, 0xdb, 0x6c, 0x66, 0x19, 0x27, 0x62, 0xdd, 0x1a, 0x59, 0xf8, 0xb8, 0xad, 0x79, 0x87, + 0x6b, 0x78, 0x44, 0xa5, 0xb3, 0xd7, 0x6d, 0x96, 0xb7, 0x1f, 0x31, 0x6d, 0x78, 0xfc, 0xe3, 0x2a, + 0x1b, 0xee, 0x05, 0xff, 0x7c, 0xc9, 0xf5, 0xa7, 0x75, 0x92, 0xd5, 0x27, 0x99, 0x38, 0xbf, 0x42, + 0xf0, 0x40, 0x28, 0x88, 0xe6, 0x9e, 0xe5, 0xa1, 0xc4, 0x8d, 0x08, 0x62, 0xa3, 0xe8, 0x4a, 0x4a, + 0xab, 0x63, 0x7e, 0xc5, 0x30, 0x9d, 0xa5, 0xcf, 0x79, 0x37, 0xe6, 0x07, 0x0f, 0xf5, 0xef, 0xaf, + 0xff, 0x8f, 0x9c, 0xe3, 0xc5, 0x8f, 0x7a, 0x0b, 0x23, 0xb4, 0x9d, 0x39, 0x8b, 0x7b, 0xae, 0x6b, + 0x06, 0x68, 0x41, 0xe6, 0xd7, 0xbf, 0x95, 0x59, 0x26, 0x59, 0x19, 0x37, 0x4e, 0xff, 0xd3, 0x55, + 0x36, 0xfc, 0xee, 0xf9, 0x53, 0x18, 0x40, 0xfe, 0x63, 0x46, 0xe5, 0xc1, 0xbc, 0x19, 0x83, 0xc4, + 0x4c, 0xf2, 0x52, 0x7a, 0x7d, 0x6e, 0x40, 0x2a, 0x18, 0x26, 0x64, 0x5e, 0x4f, 0x3f, 0xbf, 0x62, + 0x97, 0x9f, 0x1b, 0x46, 0xbd, 0x99, 0x34, 0xf9, 0xbc, 0x6b, 0x40, 0xfe, 0x7e, 0xff, 0xff, 0x4f, + 0x7e, 0xf2, 0x93, 0x9f, 0xfc, 0xe4, 0x27, 0x3f, 0xf9, 0xc9, 0x4f, 0x7e, 0xf2, 0x93, 0x9f, 0xfc, + 0xe4, 0x27, 0x3f, 0xf9, 0xc9, 0x4f, 0x7e, 0xf2, 0x93, 0x9f, 0xfc, 0xe4, 0x27, 0x3f, 0xf9, 0xc9, + 0x4f, 0x7e, 0xf2, 0x93, 0x9f, 0xfc, 0xe4, 0x27, 0x3f, 0xf9, 0xc9, 0x4f, 0x7e, 0xf2, 0x93, 0x9f, + 0xfc, 0xe4, 0x27, 0x3f, 0xf9, 0xc9, 0x4f, 0x7e, 0xf2, 0x93, 0x9f, 0xfc, 0xe4, 0x27, 0x3f, 0xf9, + 0xc9, 0x4f, 0x7e, 0xf2, 0x93, 0x9f, 0xfc, 0xe4, 0x27, 0x3f, 0xf9, 0xc9, 0x4f, 0x7e, 0xf2, 0x93, + 0x9f, 0xfc, 0xe4, 0x27, 0x3f, 0xf9, 0xc9, 0x4f, 0x7e, 0xf2, 0x93, 0x9f, 0xfc, 0xe4, 0x27, 0x3f, + 0xf9, 0xc9, 0x4f, 0x7e, 0xf2, 0x93, 0x9f, 0xfc, 0xe4, 0x27, 0x3f, 0xf9, 0xc9, 0x4f, 0x7e, 0xf2, + 0x93, 0x9f, 0xfc, 0xe4, 0x27, 0x3f, 0xf9, 0xc9, 0x4f, 0x7e, 0xf2, 0x93, 0x9f, 0xfc, 0xe4, 0x27, + 0x3f, 0xf9, 0xc9, 0x4f, 0x7e, 0xf2, 0x93, 0x9f, 0xfc, 0xe4, 0x27, 0x3f, 0xf9, 0xc9, 0x4f, 0x7e, + 0xf2, 0x93, 0x9f, 0xfc, 0xe4, 0x27, 0x3f, 0xf9, 0xc9, 0x4f, 0x7e, 0xf2, 0x93, 0x9f, 0xfc, 0xe4, + 0x27, 0x3f, 0xf9, 0xc9, 0x4f, 0x7e, 0xf2, 0x93, 0x9f, 0xfc, 0xe4, 0x27, 0x3f, 0x59, 0x96, 0xff, + 0x07, 0x4d, 0x77, 0xaa, 0x1a, 0xd5, 0x0d, 0x27, 0xae, 0x00, 0x00, 0x00, 0xa8, 0x6d, 0x6b, 0x42, + 0x54, 0xfa, 0xce, 0xca, 0xfe, 0x01, 0x86, 0x21, 0x58, 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, 0x78, 0x9c, 0xed, + 0xcf, 0x31, 0x01, 0x00, 0x00, 0x08, 0xc0, 0x20, 0xfb, 0x97, 0x9e, 0x97, 0x29, 0x84, 0x06, 0x54, + 0xcd, 0x63, 0x3d, 0xff, 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, 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, 0x9c, 0x05, 0x6f, 0x67, 0x07, 0xf9, 0x97, 0x03, 0xbf, 0xdd, 0x00, 0x00, 0x0e, + 0xd7, 0x6d, 0x6b, 0x42, 0x54, 0xfa, 0xce, 0xca, 0xfe, 0x03, 0xf3, 0x04, 0xe8, 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, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x9c, 0xed, 0x9d, 0x8d, 0x91, 0x1c, 0x29, 0x0c, 0x85, 0x1d, 0x88, 0x13, 0x71, 0x20, + 0x0e, 0xc4, 0x89, 0x38, 0x10, 0x07, 0xe2, 0x44, 0x1c, 0xc8, 0x5e, 0xe9, 0xea, 0x3e, 0xd7, 0xbb, + 0x67, 0x49, 0x40, 0xcf, 0xcf, 0xfe, 0x58, 0xaf, 0x6a, 0x6a, 0x67, 0xbb, 0x69, 0x10, 0x12, 0x08, + 0xd0, 0x83, 0x9e, 0x97, 0x97, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, + 0x0c, 0x06, 0x83, 0xc1, 0xe0, 0x3f, 0xfc, 0xfa, 0xf5, 0xeb, 0xe5, 0xe7, 0xcf, 0x9f, 0x7f, 0x7c, + 0xe2, 0x3a, 0xf7, 0xaa, 0xe7, 0xe2, 0x73, 0xa5, 0xac, 0x00, 0x65, 0xf8, 0xf7, 0xc1, 0xff, 0x51, + 0xe9, 0xf9, 0x8a, 0xfe, 0x33, 0x7c, 0xff, 0xfe, 0xfd, 0xe5, 0xd3, 0xa7, 0x4f, 0x7f, 0x7c, 0xe2, + 0x3a, 0xf7, 0x32, 0x7c, 0xf9, 0xf2, 0xe5, 0xdf, 0xcf, 0x2e, 0xbe, 0x7d, 0xfb, 0xf6, 0x3b, 0xef, + 0xb0, 0x37, 0x65, 0x04, 0xf4, 0xfb, 0x47, 0x46, 0xd4, 0xfb, 0xb4, 0x9e, 0x95, 0x9e, 0x4f, 0xf5, + 0xbf, 0x02, 0x36, 0xd1, 0xfe, 0xae, 0xf6, 0x5f, 0xf5, 0x51, 0xfa, 0x76, 0x95, 0xa6, 0x93, 0xd7, + 0xed, 0xdf, 0xf9, 0x9d, 0x5d, 0x54, 0xf2, 0xac, 0xe4, 0x04, 0x5d, 0x1a, 0xbd, 0x5e, 0xa5, 0xcb, + 0xae, 0x67, 0xed, 0xbc, 0x7b, 0x3e, 0x70, 0x6a, 0xe7, 0xab, 0x7a, 0xeb, 0xec, 0x1f, 0xe5, 0x6b, + 0xdf, 0x75, 0xb9, 0xb4, 0x6f, 0x7b, 0x1e, 0x9a, 0x0f, 0x79, 0x05, 0xaa, 0xfe, 0xaf, 0x79, 0x65, + 0xf5, 0x8e, 0xfb, 0x9f, 0x3f, 0x7f, 0xfe, 0xf7, 0x7b, 0xe8, 0x2d, 0xd2, 0xfd, 0xf8, 0xf1, 0xe3, + 0xf7, 0xbd, 0x78, 0x86, 0xba, 0xa8, 0x2f, 0x0b, 0x44, 0x3a, 0xbd, 0x1e, 0xe9, 0x33, 0x44, 0xfe, + 0x9e, 0x26, 0xf2, 0x88, 0xbc, 0xb9, 0x17, 0x65, 0xab, 0x5e, 0x48, 0x17, 0xd7, 0xf5, 0x79, 0xea, + 0xa0, 0x69, 0x23, 0x2f, 0x4f, 0x47, 0x1d, 0xf4, 0x7a, 0xfc, 0x8d, 0xcf, 0xaa, 0xff, 0xc7, 0xdf, + 0xaf, 0x5f, 0xbf, 0xfe, 0x7e, 0xee, 0x0a, 0x3a, 0xfb, 0x73, 0x4d, 0x65, 0xd1, 0xf2, 0x23, 0x4d, + 0x94, 0xcf, 0x33, 0x59, 0x9f, 0x23, 0x3d, 0xf7, 0x32, 0xfb, 0xbb, 0x0c, 0x51, 0x9e, 0xdb, 0x08, + 0x9b, 0xc7, 0xdf, 0xd0, 0x99, 0xa6, 0x89, 0xef, 0x8c, 0x5b, 0x5c, 0x73, 0x3d, 0x45, 0x1a, 0x9d, + 0xf3, 0x38, 0xb4, 0x7d, 0x45, 0x3e, 0xa4, 0x47, 0x17, 0xc8, 0xa9, 0xe9, 0x54, 0xee, 0xf8, 0xa0, + 0x0b, 0xda, 0xb2, 0xca, 0x1d, 0xd7, 0x54, 0x1f, 0xaa, 0x67, 0x2d, 0x9f, 0xf1, 0x7d, 0xd7, 0xfe, + 0xfa, 0xcc, 0x15, 0xac, 0xfc, 0x7f, 0x56, 0x66, 0xd6, 0xff, 0xe9, 0x7f, 0x9d, 0xbc, 0x81, 0xcc, + 0xfe, 0xea, 0x6f, 0xa8, 0x53, 0x56, 0x77, 0xec, 0x1c, 0x7a, 0x56, 0x7d, 0xd1, 0x2e, 0xe2, 0x83, + 0x2f, 0xd0, 0x3e, 0xa8, 0x7e, 0x81, 0x3c, 0x56, 0x72, 0x76, 0xba, 0x40, 0x3e, 0xca, 0x21, 0x3f, + 0xf7, 0x15, 0x55, 0x9d, 0xfd, 0xf9, 0x90, 0xcf, 0xcb, 0xdf, 0x19, 0xff, 0xef, 0x31, 0x17, 0xb8, + 0xc5, 0xfe, 0xe8, 0x3c, 0xfa, 0x23, 0xf5, 0xee, 0xe4, 0xa5, 0xfe, 0x95, 0xfd, 0x7d, 0x1d, 0xe2, + 0xc0, 0xb6, 0xd8, 0x3d, 0xfe, 0x46, 0x5b, 0x20, 0x7f, 0xfe, 0xf7, 0x7e, 0x86, 0xac, 0xf4, 0x51, + 0xda, 0x8b, 0x42, 0xf3, 0xa1, 0x4e, 0x99, 0x2e, 0xf0, 0xb7, 0x2e, 0x2b, 0xed, 0x91, 0xb9, 0x5e, + 0x65, 0x7f, 0x64, 0xd4, 0xe7, 0xbd, 0xfc, 0x4c, 0x6f, 0x2b, 0x5b, 0x5c, 0xc5, 0x2d, 0xf6, 0xa7, + 0x1d, 0x6b, 0xbb, 0xef, 0xe4, 0x0d, 0x64, 0xf6, 0x57, 0x7f, 0x87, 0xef, 0xcd, 0xfa, 0x28, 0x7d, + 0xdd, 0xfd, 0x8f, 0xea, 0x36, 0xee, 0x71, 0xdd, 0xfd, 0x24, 0xbe, 0x23, 0xb3, 0x3f, 0x7a, 0xd0, + 0x36, 0x96, 0xe9, 0x42, 0xd3, 0xa9, 0xcd, 0x69, 0x17, 0xc8, 0xef, 0xf6, 0xc7, 0x3f, 0xf2, 0x4c, + 0xfc, 0xe5, 0x19, 0xcd, 0x37, 0xae, 0x21, 0xe3, 0x33, 0xec, 0x4f, 0x5f, 0x51, 0x7d, 0xd0, 0x9f, + 0x01, 0x75, 0xf5, 0xef, 0xea, 0x6f, 0x19, 0xdf, 0x1c, 0x9a, 0x1e, 0x99, 0xe9, 0x5b, 0xfa, 0x3d, + 0x9e, 0xa5, 0x0f, 0x74, 0x6b, 0xa5, 0xc8, 0x8b, 0xfb, 0xf8, 0x4d, 0xc0, 0xff, 0x91, 0xc6, 0xef, + 0x21, 0x27, 0x7d, 0x2f, 0x03, 0xf5, 0xc6, 0x87, 0x64, 0xba, 0xd0, 0x72, 0x32, 0xf9, 0xc9, 0x5f, + 0xc7, 0x43, 0xfa, 0x87, 0xff, 0xef, 0xb2, 0xa8, 0xfc, 0x3a, 0x97, 0xa9, 0xf4, 0xe9, 0xba, 0x1d, + 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x3a, 0x38, 0xf7, 0x97, 0xdd, 0x7f, 0xcd, 0xf2, + 0x6f, 0xc1, 0x3d, 0xb8, 0x84, 0x2b, 0x38, 0x2d, 0xf3, 0x34, 0x7d, 0xc5, 0xdb, 0x9e, 0xc2, 0x63, + 0xe5, 0xc4, 0xa5, 0x58, 0xcf, 0x64, 0x71, 0x81, 0x7b, 0x62, 0x55, 0xfe, 0xea, 0xd9, 0x15, 0x9f, + 0xd6, 0x71, 0x98, 0x8f, 0xc2, 0xa9, 0xce, 0xae, 0xe8, 0xb8, 0xe2, 0x6d, 0xef, 0x21, 0xab, 0xc6, + 0xb6, 0xab, 0x67, 0x2a, 0xce, 0xaa, 0xf2, 0x1f, 0x55, 0x5c, 0x7a, 0xb7, 0xfc, 0x5b, 0xf9, 0xb4, + 0x47, 0x41, 0xe5, 0xd6, 0x3d, 0x13, 0x5e, 0xa7, 0x2b, 0x72, 0x75, 0xf1, 0xfc, 0x7b, 0xb5, 0xeb, + 0x4c, 0x56, 0xe5, 0xd5, 0xfc, 0xfe, 0x09, 0xe7, 0x55, 0xa5, 0x3f, 0x29, 0xff, 0x56, 0x3e, 0xad, + 0xd2, 0x93, 0xf3, 0x86, 0xce, 0x29, 0xfa, 0x1e, 0x05, 0xe7, 0x78, 0x90, 0x85, 0x7c, 0x9c, 0x03, + 0x59, 0xe9, 0xac, 0xd2, 0x81, 0xc6, 0x15, 0xbb, 0x67, 0x1e, 0x69, 0x7f, 0xf4, 0xe3, 0x9c, 0x5c, + 0xc5, 0x79, 0x69, 0xdc, 0x5e, 0x63, 0xe6, 0x55, 0xfa, 0xd3, 0xf2, 0x6f, 0xe1, 0xd3, 0x2a, 0x3d, + 0x11, 0xa3, 0x0b, 0xc0, 0xb3, 0xc2, 0xf3, 0x21, 0xf3, 0xca, 0xfe, 0xc4, 0xed, 0x54, 0x16, 0x95, + 0xb3, 0xd3, 0x59, 0xa5, 0x03, 0xb5, 0x3f, 0x72, 0x66, 0xf2, 0x67, 0xfe, 0xff, 0xca, 0x1e, 0x9a, + 0x13, 0xfb, 0x57, 0x9c, 0x97, 0x73, 0xd6, 0xca, 0xbd, 0x56, 0x1c, 0xd9, 0x6e, 0xf9, 0xd4, 0xf5, + 0x2a, 0x9f, 0x56, 0xd9, 0x1f, 0xee, 0x58, 0xf9, 0x23, 0xe5, 0x14, 0x3d, 0xff, 0xcc, 0x46, 0xc8, + 0xdc, 0xfd, 0x7f, 0xaa, 0x03, 0xcf, 0xab, 0x92, 0x7f, 0x97, 0x2b, 0x5b, 0xa1, 0x1a, 0xab, 0xe0, + 0x46, 0xf4, 0x7e, 0xc5, 0x79, 0x05, 0x48, 0xab, 0x5c, 0x4c, 0x97, 0x7e, 0xb7, 0xfc, 0x5b, 0xf9, + 0xb4, 0xce, 0x4f, 0xd2, 0x87, 0xa3, 0x8c, 0x68, 0x0f, 0xf4, 0x35, 0x9e, 0xdd, 0xb5, 0xbf, 0x8e, + 0x19, 0x9e, 0xf6, 0x54, 0x07, 0xa7, 0xf6, 0xbf, 0x15, 0xea, 0x6f, 0xe0, 0x1a, 0x94, 0x77, 0xaf, + 0x7c, 0x53, 0x66, 0x17, 0xae, 0xfb, 0xdc, 0xc1, 0xd3, 0x9f, 0x94, 0x7f, 0x2b, 0x9f, 0xd6, 0xe9, + 0x29, 0xb3, 0xb7, 0xce, 0x3b, 0x19, 0x17, 0xb4, 0xec, 0xcc, 0x46, 0x01, 0xe5, 0x16, 0xb3, 0xb4, + 0x3b, 0x3a, 0x78, 0x0d, 0xfb, 0xeb, 0xd8, 0xc9, 0xc7, 0xf7, 0xe2, 0x29, 0x2f, 0x88, 0x4f, 0x53, + 0xce, 0x0b, 0x79, 0xb2, 0xeb, 0x55, 0xfa, 0x93, 0xf2, 0x6f, 0xe1, 0xd3, 0x32, 0xde, 0xce, 0x65, + 0x03, 0xca, 0x29, 0x56, 0x65, 0x33, 0x27, 0x77, 0xae, 0x94, 0xe7, 0x91, 0x67, 0x47, 0x67, 0x99, + 0x8e, 0x3d, 0xef, 0x4a, 0xfe, 0xae, 0x5e, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, + 0x0a, 0xc4, 0xbe, 0x88, 0xf9, 0x9c, 0x82, 0x75, 0x20, 0x6b, 0x98, 0x55, 0x2c, 0xaa, 0x4b, 0x13, + 0x73, 0xdb, 0x1d, 0xfe, 0xe7, 0x1e, 0xd8, 0x91, 0x35, 0x80, 0x6e, 0x1e, 0x59, 0xe6, 0xae, 0x2c, + 0xf7, 0x06, 0xe7, 0x62, 0x58, 0x77, 0x7b, 0x0c, 0x7f, 0x05, 0xe2, 0x1f, 0xac, 0xbf, 0x77, 0xd6, + 0x26, 0xdd, 0xfa, 0xf5, 0x99, 0xfb, 0x19, 0x33, 0xae, 0x51, 0xd7, 0x94, 0x81, 0xf8, 0x4e, 0xac, + 0xf0, 0x51, 0x65, 0x76, 0xd7, 0x1f, 0x09, 0x8f, 0x5d, 0x07, 0xa8, 0xaf, 0xc6, 0xb7, 0xba, 0xf6, + 0xaf, 0x67, 0x63, 0x48, 0xaf, 0xfa, 0xcb, 0x9e, 0xe7, 0x19, 0xee, 0x69, 0xbd, 0x9d, 0xf7, 0x8a, + 0x7b, 0xee, 0x97, 0xf4, 0xcc, 0x41, 0xa6, 0x33, 0x9e, 0xe9, 0xf4, 0x49, 0x7f, 0xf3, 0x38, 0x86, + 0xc7, 0x68, 0xb3, 0xf2, 0x77, 0xf2, 0xca, 0x64, 0xcc, 0xd2, 0x75, 0xd7, 0x77, 0xcb, 0xc8, 0xf4, + 0xb8, 0x83, 0x55, 0x1c, 0x49, 0xf7, 0xe4, 0x57, 0xe7, 0x71, 0x94, 0x83, 0xf0, 0x38, 0xad, 0xee, + 0xd5, 0xd7, 0xe7, 0x49, 0xa3, 0x3e, 0x07, 0x9d, 0x2b, 0x97, 0xa3, 0xf1, 0x40, 0xe5, 0xec, 0x94, + 0x0f, 0x70, 0x99, 0xf4, 0x1c, 0x51, 0xc5, 0x9f, 0xe1, 0xf3, 0xc8, 0x47, 0x63, 0xfe, 0x5a, 0x97, + 0xaa, 0xfc, 0x9d, 0xf2, 0x5c, 0xc6, 0xaa, 0xcc, 0xea, 0xfa, 0x8e, 0xbc, 0xc4, 0x1b, 0x55, 0xc6, + 0x13, 0xac, 0xec, 0xdf, 0x9d, 0xb7, 0x04, 0x5d, 0xcc, 0xd2, 0xf9, 0x2f, 0xf8, 0x3a, 0xed, 0xff, + 0xe8, 0xca, 0xcf, 0x33, 0x64, 0xe7, 0x3b, 0xc9, 0xab, 0x3a, 0x67, 0x42, 0x39, 0xc8, 0x52, 0x9d, + 0x8d, 0xc8, 0xf4, 0xef, 0x7c, 0x47, 0x57, 0x7e, 0x95, 0x97, 0xee, 0xd7, 0x77, 0x19, 0xab, 0x32, + 0xab, 0xeb, 0x3b, 0xf2, 0x66, 0x7a, 0x3c, 0x41, 0xc7, 0x8f, 0x91, 0xdf, 0x8a, 0x67, 0xec, 0xec, + 0x5f, 0xe9, 0x7f, 0xe7, 0x6c, 0x11, 0xf9, 0xfa, 0xa7, 0xcb, 0x17, 0x79, 0xd0, 0xfd, 0x8e, 0xcf, + 0xd2, 0xfe, 0x9e, 0xc5, 0xe2, 0xb3, 0xf2, 0x3d, 0xaf, 0x9d, 0xb3, 0x84, 0x55, 0x99, 0xd5, 0xf5, + 0x1d, 0x79, 0x33, 0x3d, 0x9e, 0x20, 0x1b, 0xff, 0x95, 0x5b, 0xf4, 0x36, 0x5f, 0xed, 0xfb, 0xb9, + 0xda, 0xff, 0x33, 0x5d, 0x55, 0xfd, 0x5f, 0xcb, 0xee, 0xec, 0xef, 0x1c, 0xf4, 0xaa, 0xff, 0x6b, + 0xde, 0x5d, 0xff, 0xaf, 0xe6, 0x7f, 0x5d, 0xff, 0xd7, 0xb2, 0xab, 0x32, 0xab, 0xeb, 0x3b, 0xf2, + 0xde, 0x6a, 0xff, 0x80, 0x8e, 0x2d, 0x3e, 0x86, 0xe1, 0x9f, 0x74, 0x7c, 0xe9, 0xf8, 0x2b, 0x97, + 0x69, 0x35, 0xfe, 0xab, 0xdc, 0x6e, 0xff, 0x80, 0x9e, 0xe1, 0xab, 0xce, 0x9f, 0x67, 0xba, 0x5a, + 0xcd, 0x59, 0x7c, 0x3c, 0xf5, 0x31, 0x4e, 0x79, 0xc5, 0xac, 0x7c, 0x45, 0x37, 0xfe, 0x6b, 0xfa, + 0xaa, 0xcc, 0xea, 0xfa, 0x8e, 0xbc, 0xf7, 0xb0, 0x3f, 0xf5, 0xae, 0xd6, 0xff, 0x7a, 0x2f, 0x6b, + 0x9b, 0xdc, 0xd7, 0x3e, 0xe4, 0x3c, 0x9a, 0xcf, 0xff, 0x3d, 0x8d, 0xce, 0x91, 0x7d, 0x4e, 0x9f, + 0xcd, 0xe5, 0xbb, 0x18, 0x81, 0xce, 0x85, 0xf9, 0x9e, 0x01, 0x19, 0xfc, 0x3e, 0xe5, 0x75, 0xe5, + 0x57, 0x79, 0xad, 0x64, 0xac, 0xca, 0xac, 0xae, 0xaf, 0xd2, 0x64, 0x7a, 0x1c, 0x0c, 0x06, 0x83, + 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x2a, 0xe8, 0xdc, 0x5c, 0x3f, 0x57, 0x38, 0xc0, 0x47, 0xa3, 0x92, + 0xcb, 0xd7, 0x1f, 0x1f, 0x01, 0xcf, 0xe2, 0x02, 0x59, 0xbb, 0xfb, 0x1e, 0xcc, 0xd5, 0x3a, 0x82, + 0xfd, 0xd2, 0xcf, 0x44, 0x15, 0x67, 0xab, 0xf6, 0x63, 0xbe, 0x67, 0x3c, 0x8b, 0x0b, 0xcc, 0xf6, + 0x32, 0x2b, 0xb2, 0xb8, 0x80, 0xee, 0xd9, 0xd5, 0xfd, 0xff, 0x27, 0xeb, 0x57, 0xb5, 0x15, 0xb1, + 0x36, 0xbd, 0x9e, 0x71, 0x6e, 0xd8, 0x9f, 0x7b, 0x9e, 0x07, 0x72, 0xe8, 0x75, 0xe7, 0x22, 0x77, + 0xb8, 0x3c, 0xd2, 0x54, 0x6b, 0xf4, 0xce, 0x2e, 0x99, 0x1e, 0xf4, 0x5c, 0xa0, 0x72, 0xa4, 0x95, + 0xbe, 0x6e, 0xe5, 0x1b, 0x4f, 0xe0, 0xfb, 0xef, 0xd5, 0x3e, 0x55, 0xec, 0x8f, 0x98, 0x13, 0x7e, + 0x63, 0x87, 0x23, 0x54, 0x3f, 0xa3, 0xf1, 0x2b, 0xae, 0xeb, 0x9e, 0x79, 0xf6, 0xef, 0x7b, 0xbc, + 0x51, 0xf9, 0xc2, 0x2c, 0x8f, 0x2c, 0x5e, 0x9d, 0x71, 0x46, 0x1d, 0x2f, 0x58, 0xc5, 0xfb, 0x76, + 0x38, 0xba, 0x2e, 0xd6, 0xa9, 0x67, 0x13, 0xe1, 0xd7, 0x33, 0x7d, 0xed, 0xc8, 0xb8, 0xe2, 0x02, + 0x4f, 0x50, 0xf9, 0x7f, 0xec, 0x8f, 0x0c, 0x7e, 0x6e, 0x25, 0xe3, 0x68, 0x55, 0x07, 0xde, 0x47, + 0x34, 0x0e, 0xa7, 0xe7, 0xf8, 0x28, 0x5f, 0xfb, 0x85, 0x73, 0x6e, 0x7c, 0x57, 0x7d, 0x54, 0x67, + 0x26, 0x78, 0x5e, 0x63, 0xeb, 0xf4, 0x93, 0x2c, 0x46, 0xed, 0xfd, 0x85, 0xb6, 0xc7, 0xf9, 0x15, + 0xb0, 0xc3, 0xd1, 0xad, 0xb8, 0x0e, 0xf2, 0xab, 0xf4, 0xb5, 0x2b, 0xe3, 0x8a, 0x0b, 0x3c, 0xc1, + 0xca, 0xff, 0x23, 0x2b, 0x7d, 0x2f, 0xe3, 0x55, 0x77, 0x38, 0x42, 0xce, 0x52, 0x68, 0x5f, 0xcf, + 0xca, 0xef, 0xe4, 0xd1, 0x7c, 0xbb, 0x33, 0x33, 0x21, 0x0f, 0x6d, 0x96, 0x72, 0x5c, 0x37, 0x55, + 0x39, 0x8c, 0x6d, 0xea, 0xdf, 0x28, 0x7b, 0xc5, 0xd1, 0x9d, 0x70, 0x9d, 0x99, 0xbe, 0x76, 0x65, + 0xdc, 0xe5, 0x02, 0x77, 0xd0, 0xe9, 0x5b, 0xfb, 0xac, 0xfa, 0x78, 0xaf, 0xeb, 0x0e, 0x47, 0xa8, + 0xef, 0xb5, 0xcc, 0xfa, 0xbf, 0x8e, 0xdf, 0x5d, 0xff, 0xdf, 0xb1, 0x3f, 0x67, 0x3b, 0xf5, 0x2c, + 0xe7, 0x6e, 0xdf, 0xd2, 0xbd, 0x03, 0xda, 0x6f, 0x77, 0x38, 0xba, 0x5d, 0xae, 0xb3, 0xd2, 0xd7, + 0x95, 0xfe, 0xaf, 0xcf, 0xdf, 0x62, 0x7f, 0xf7, 0xff, 0xc8, 0xee, 0xe3, 0x3f, 0xfa, 0xc7, 0x4f, + 0x56, 0xe9, 0xbc, 0x3d, 0xf9, 0xb8, 0x5a, 0xd9, 0x5f, 0xf3, 0xce, 0xc6, 0xff, 0x1d, 0xfb, 0xa3, + 0x23, 0xbf, 0x76, 0x65, 0xfc, 0x3f, 0xe1, 0xe8, 0x76, 0xb9, 0xce, 0x4e, 0x5f, 0x57, 0xc6, 0xff, + 0x9d, 0xb3, 0x8e, 0x15, 0xaa, 0xf5, 0xbf, 0x72, 0xde, 0x59, 0x4c, 0x80, 0xeb, 0xda, 0x6f, 0x3b, + 0x8e, 0x10, 0xf9, 0xb0, 0x9f, 0xce, 0x31, 0xb3, 0x67, 0xb2, 0x39, 0x70, 0x56, 0x5e, 0x95, 0x47, + 0xb5, 0x7e, 0x3e, 0x99, 0x5b, 0x5f, 0xe1, 0xe8, 0x76, 0xb8, 0x4e, 0x4f, 0xb7, 0x53, 0xf7, 0x1d, + 0x19, 0x9f, 0x15, 0x33, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0xbc, 0x7f, 0xc0, 0xe7, + 0xe8, 0xda, 0xef, 0x51, 0xb8, 0x92, 0xb7, 0xbe, 0x5b, 0xe3, 0x1e, 0xef, 0xbe, 0xd7, 0xd8, 0xc0, + 0x09, 0x76, 0x65, 0x7f, 0x4f, 0x5c, 0x14, 0x6b, 0x5e, 0x38, 0x00, 0xd6, 0x94, 0x8f, 0xa8, 0x03, + 0x76, 0x3c, 0x01, 0xeb, 0x5a, 0x62, 0x7a, 0xba, 0xaf, 0xb2, 0xdb, 0x07, 0x5c, 0x01, 0x8e, 0xe1, + 0x14, 0x1a, 0x4f, 0xec, 0x70, 0xa5, 0x8e, 0xaf, 0x05, 0x62, 0x16, 0xbe, 0x6e, 0x24, 0x7e, 0x16, + 0xf0, 0x7d, 0xac, 0xbe, 0x0e, 0xc7, 0x6f, 0xe8, 0x7a, 0x95, 0x33, 0x18, 0xf1, 0xd1, 0x98, 0x0d, + 0x6d, 0x4b, 0xe3, 0x0b, 0xe8, 0xab, 0xe3, 0x76, 0x55, 0xc6, 0xce, 0xfe, 0x5d, 0x5e, 0xbb, 0x69, + 0xb4, 0x4e, 0xba, 0x0f, 0xde, 0xe5, 0xb8, 0x57, 0x1d, 0x41, 0xf6, 0xbb, 0x23, 0xb4, 0xf7, 0x78, + 0x8e, 0xeb, 0x94, 0xab, 0xe9, 0x02, 0x91, 0xe6, 0x6a, 0xdf, 0xca, 0x74, 0xc4, 0xf5, 0xec, 0x1c, + 0x0b, 0x71, 0x0b, 0x8d, 0xb3, 0x3a, 0x07, 0xa3, 0xbf, 0xcf, 0x45, 0x3d, 0xd0, 0x0d, 0x7a, 0x25, + 0xd6, 0x85, 0xdf, 0x71, 0xf9, 0x29, 0x43, 0x63, 0xf1, 0xd5, 0x59, 0x01, 0xb5, 0x45, 0xc5, 0xd1, + 0xed, 0xa4, 0x71, 0x99, 0xb4, 0xae, 0xca, 0x79, 0x52, 0x47, 0xfd, 0x2d, 0xa1, 0x2b, 0x75, 0x0c, + 0x28, 0x0f, 0x4b, 0x5c, 0x0f, 0xfb, 0x68, 0xac, 0x50, 0xd3, 0x11, 0x27, 0xa5, 0xdc, 0x2a, 0x5e, + 0xd8, 0xa1, 0xb2, 0xbf, 0x5e, 0xaf, 0xec, 0xaf, 0xf1, 0x71, 0xda, 0x3d, 0x6d, 0x12, 0x3d, 0x79, + 0x7c, 0x4b, 0xf3, 0xf2, 0xf8, 0x76, 0xc5, 0xab, 0x65, 0xfc, 0x89, 0xdb, 0x5c, 0xfd, 0x98, 0x72, + 0xc8, 0x8a, 0x9d, 0x34, 0x01, 0xb5, 0x9f, 0xc7, 0x1f, 0x3d, 0x8e, 0x9b, 0xf1, 0x7b, 0x57, 0xea, + 0xb8, 0xfa, 0xdd, 0x31, 0xd2, 0xfb, 0xfb, 0x04, 0x9d, 0x3b, 0x3d, 0xdd, 0xb7, 0xe5, 0xf2, 0x78, + 0x1c, 0xda, 0xeb, 0x13, 0x70, 0xfb, 0x3b, 0x6f, 0x40, 0x3e, 0xfa, 0x9b, 0x94, 0xc8, 0x98, 0xe9, + 0x06, 0x54, 0x5c, 0xd4, 0x8e, 0xfd, 0x2b, 0x1e, 0x43, 0xb1, 0x93, 0x06, 0x3d, 0x2a, 0xef, 0x99, + 0xc9, 0xab, 0x7c, 0x98, 0xbf, 0x47, 0xf0, 0x4a, 0x1d, 0x4f, 0xb8, 0x43, 0xca, 0xe5, 0x03, 0x57, + 0x5d, 0xf9, 0x96, 0x15, 0x78, 0x8e, 0x31, 0x2e, 0xb3, 0x99, 0xef, 0xb5, 0xa0, 0x0f, 0x39, 0x5f, + 0x45, 0x9f, 0xd0, 0xb1, 0xa9, 0xe2, 0x0d, 0xbd, 0xfd, 0x56, 0xfd, 0x71, 0xc7, 0xfe, 0x01, 0xf5, + 0x7f, 0xca, 0xe3, 0x29, 0x76, 0xd2, 0x28, 0xe7, 0xa8, 0xe3, 0xa0, 0xca, 0x91, 0x7d, 0xcf, 0xec, + 0xbf, 0x5b, 0x47, 0xe5, 0x04, 0xf1, 0xf9, 0x1d, 0x77, 0xa8, 0x9c, 0x9f, 0xee, 0xc7, 0xba, 0x02, + 0x1d, 0xdb, 0xf4, 0xe3, 0x7b, 0x2d, 0xe2, 0x83, 0x6f, 0xf4, 0xbd, 0x1c, 0xdc, 0x53, 0x1d, 0x64, + 0xd7, 0x95, 0x5f, 0xcb, 0x9e, 0xef, 0xce, 0xd7, 0x83, 0xca, 0xfe, 0xf8, 0x32, 0xe5, 0xd4, 0x1d, + 0x3b, 0x69, 0x54, 0x26, 0x9f, 0x77, 0x2a, 0xdf, 0xce, 0x77, 0xfa, 0x87, 0xb7, 0x99, 0x93, 0x3a, + 0x06, 0xd4, 0x06, 0xba, 0xa7, 0xc7, 0xc7, 0x67, 0xd7, 0xad, 0xb6, 0x93, 0x53, 0xfe, 0x4f, 0xa1, + 0xe3, 0x07, 0x73, 0xcc, 0xec, 0xde, 0x6a, 0x8f, 0xdd, 0xea, 0xba, 0xef, 0x25, 0x5a, 0x8d, 0x5b, + 0x7e, 0x5f, 0xcb, 0xaf, 0x64, 0xe9, 0xd6, 0xae, 0xb7, 0xa4, 0xf1, 0xb2, 0x2b, 0x9d, 0x9c, 0xd6, + 0xf1, 0xf4, 0xb9, 0xcc, 0x77, 0x5d, 0xd9, 0xff, 0x37, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, + 0xf8, 0xbb, 0xa0, 0xeb, 0x18, 0x5d, 0xcf, 0xdc, 0x6b, 0x1e, 0xd9, 0xed, 0x49, 0x8c, 0x75, 0x90, + 0xbe, 0x2b, 0x65, 0xa7, 0x4c, 0x5d, 0xab, 0x12, 0xef, 0xce, 0xd6, 0x82, 0xef, 0x01, 0x6f, 0x41, + 0x5e, 0x8f, 0xe7, 0xb0, 0xee, 0x3b, 0x3d, 0x47, 0x52, 0xa1, 0xb3, 0x3f, 0x9c, 0x00, 0xe9, 0x76, + 0xec, 0xaf, 0xb1, 0x16, 0xd6, 0x3b, 0x3c, 0xf7, 0x16, 0xf4, 0x79, 0x82, 0xb7, 0x20, 0x6f, 0x16, + 0x8f, 0x24, 0x4e, 0xee, 0x31, 0x1b, 0xe7, 0xb4, 0x88, 0x3d, 0x3a, 0xdf, 0xa5, 0x50, 0xee, 0x56, + 0xe3, 0x15, 0x01, 0x9e, 0x75, 0x9f, 0xa3, 0x3c, 0xb4, 0xc7, 0x20, 0x3c, 0x26, 0xab, 0xfc, 0xbf, + 0xea, 0x33, 0x4b, 0xab, 0x79, 0x13, 0x43, 0xa9, 0xb8, 0x18, 0x2f, 0x17, 0xf9, 0x34, 0x96, 0xa3, + 0x1c, 0x72, 0xc7, 0x29, 0x69, 0x3d, 0xb5, 0xfe, 0x2a, 0x2f, 0x7c, 0xce, 0x8e, 0x5e, 0x90, 0x5d, + 0xcb, 0x51, 0xb9, 0x4e, 0xd0, 0x9d, 0x31, 0x71, 0x8e, 0x47, 0xb9, 0x08, 0x8d, 0xa5, 0x77, 0x3e, + 0xc3, 0xb9, 0x7b, 0xe5, 0x95, 0xe1, 0x0b, 0x3c, 0x46, 0xaa, 0xf5, 0xf3, 0xf3, 0x8d, 0xce, 0xc1, + 0x56, 0xfe, 0x9f, 0x72, 0xb2, 0x32, 0xbd, 0x6e, 0xd9, 0xde, 0x6c, 0x6f, 0xff, 0xd8, 0x8d, 0xd8, + 0xa7, 0xc7, 0x7c, 0xb1, 0x6d, 0xb6, 0x6f, 0x9b, 0xb6, 0x02, 0x27, 0xe2, 0x71, 0x62, 0xec, 0xad, + 0xed, 0xa2, 0xd3, 0x8b, 0xcb, 0xee, 0x72, 0x9d, 0x60, 0x65, 0x7f, 0xec, 0xea, 0x65, 0x66, 0xb1, + 0xff, 0x15, 0x8f, 0xe8, 0x36, 0x0a, 0x30, 0x07, 0xa8, 0x6c, 0x7a, 0x92, 0x9f, 0x73, 0x41, 0xde, + 0x5f, 0xb2, 0xbc, 0xab, 0x18, 0xb0, 0xee, 0x0f, 0xd2, 0x78, 0x37, 0xb1, 0xd6, 0xec, 0xb7, 0xa3, + 0x2a, 0xee, 0x55, 0x7d, 0x8d, 0xee, 0xad, 0x52, 0xae, 0x25, 0xf3, 0x19, 0x2b, 0xbd, 0xb8, 0xbf, + 0x43, 0xae, 0x13, 0xac, 0xfc, 0xbf, 0xdb, 0x5f, 0xe7, 0x09, 0xb7, 0xda, 0x9f, 0x7e, 0x49, 0x5c, + 0xfd, 0x51, 0xf6, 0xd7, 0x7e, 0xb1, 0x6b, 0x7f, 0xfc, 0x06, 0x79, 0xa9, 0xcf, 0x23, 0x5f, 0xb7, + 0xff, 0x6a, 0x6f, 0x07, 0x7e, 0x44, 0x79, 0x55, 0xe5, 0x0f, 0xc0, 0xae, 0x5e, 0xaa, 0xfa, 0x9e, + 0x60, 0x35, 0xff, 0xa3, 0x9e, 0x70, 0x8c, 0xba, 0x07, 0xe5, 0x16, 0xfb, 0x6b, 0xb9, 0xee, 0x87, + 0x6f, 0xb5, 0x3f, 0x3a, 0xa4, 0x1c, 0xd5, 0xcb, 0xae, 0xfd, 0xc9, 0x43, 0xc7, 0x0e, 0xb5, 0xb9, + 0xee, 0x77, 0xd9, 0xc9, 0x07, 0x7f, 0xae, 0xfc, 0x9f, 0xcb, 0xeb, 0x3e, 0x3f, 0xd3, 0x4b, 0x76, + 0xcf, 0xe5, 0x3a, 0x41, 0xb6, 0xfe, 0xf3, 0x7d, 0x45, 0x3a, 0xb7, 0xc8, 0xce, 0x5f, 0xab, 0x6e, + 0x1c, 0x2b, 0x7b, 0xd1, 0xfe, 0x75, 0xff, 0xc3, 0x3d, 0xec, 0xaf, 0xf3, 0xbf, 0xea, 0xdc, 0x72, + 0xa0, 0xb3, 0x9b, 0xf7, 0x71, 0xcd, 0x93, 0xbe, 0xcc, 0xb3, 0x5d, 0x3e, 0x3e, 0xff, 0xcb, 0x64, + 0xd1, 0x7d, 0x18, 0x2b, 0xbd, 0xf8, 0xfc, 0xcf, 0xe5, 0x1a, 0x7c, 0x4c, 0xbc, 0x85, 0xf5, 0xe2, + 0xe0, 0xf5, 0x30, 0xf6, 0xff, 0xbb, 0x31, 0xfc, 0xfe, 0x60, 0x30, 0x18, 0x0c, 0xee, 0x85, 0x6c, + 0xfd, 0xb7, 0x8a, 0x65, 0x80, 0xb7, 0xf4, 0xae, 0xf9, 0x8e, 0x67, 0x3a, 0x85, 0xae, 0xd7, 0xba, + 0xf1, 0xb6, 0x8a, 0x9d, 0x9e, 0x60, 0x57, 0xd7, 0xf7, 0x2c, 0x33, 0xcb, 0x4f, 0xe3, 0x3f, 0xab, + 0xbd, 0x91, 0x01, 0x5d, 0x97, 0xbe, 0x05, 0x5c, 0x39, 0xfb, 0x50, 0x81, 0xf8, 0xd7, 0xee, 0x7e, + 0xcd, 0x5b, 0xb0, 0xa3, 0x6b, 0x4f, 0xff, 0x08, 0xfb, 0x57, 0xf9, 0x69, 0xec, 0x47, 0x63, 0x15, + 0x7e, 0xc6, 0x29, 0xe3, 0x08, 0x1d, 0xc4, 0x2d, 0x3c, 0x9e, 0x0e, 0x77, 0xa6, 0xbc, 0x2e, 0xfd, + 0x8f, 0x33, 0x71, 0xcc, 0x7d, 0x95, 0x0f, 0xe3, 0x9e, 0x7f, 0x27, 0x76, 0xaa, 0x75, 0xf0, 0x77, + 0x24, 0x56, 0xb1, 0x92, 0xac, 0x6e, 0x1a, 0x93, 0xd1, 0x76, 0xe1, 0xf2, 0x28, 0xb2, 0x72, 0xb2, + 0xba, 0xc2, 0xff, 0xb8, 0xae, 0x35, 0x8e, 0xef, 0x32, 0xa9, 0xbd, 0x88, 0x53, 0x3b, 0x57, 0xb8, + 0x8b, 0xca, 0xff, 0x6b, 0x8c, 0x5f, 0xcf, 0x4b, 0xd1, 0xcf, 0x94, 0xf3, 0xad, 0x38, 0x42, 0x2f, + 0x07, 0xdd, 0xc1, 0x9d, 0x68, 0xf9, 0xe8, 0x45, 0xcf, 0xd5, 0xa0, 0x1f, 0x97, 0x27, 0x8b, 0x39, + 0xea, 0x77, 0x3f, 0x7f, 0x4b, 0x3b, 0xd2, 0x78, 0x3a, 0xf2, 0x78, 0x1b, 0xf0, 0xba, 0x05, 0x3c, + 0x96, 0xec, 0x7c, 0x40, 0xb6, 0x0f, 0xdb, 0x63, 0xb3, 0xc4, 0xcf, 0xbd, 0xae, 0x15, 0x87, 0xa7, + 0xf9, 0x56, 0xfa, 0xe0, 0x79, 0xe2, 0xc6, 0x15, 0x07, 0xbb, 0x63, 0x7f, 0xf7, 0xff, 0x40, 0xdb, + 0x96, 0x8e, 0x53, 0x1e, 0x77, 0xcd, 0x38, 0x42, 0x07, 0x1c, 0x95, 0xf2, 0x71, 0xae, 0xc3, 0xee, + 0xff, 0x5d, 0xfb, 0xa3, 0x17, 0x3d, 0x8f, 0xe9, 0x32, 0x07, 0xf4, 0x6c, 0x8f, 0x42, 0xd3, 0x65, + 0x36, 0x56, 0x7d, 0x65, 0xf6, 0xf7, 0xb9, 0x88, 0x9e, 0xad, 0xab, 0xf2, 0x52, 0xfd, 0x28, 0xb7, + 0xd8, 0xe9, 0xc3, 0xcb, 0xe1, 0xde, 0x09, 0x56, 0xfe, 0xdf, 0x65, 0xca, 0xf6, 0x5a, 0x54, 0x1c, + 0xa1, 0xeb, 0x84, 0x34, 0xdd, 0xfb, 0x1f, 0xef, 0x61, 0x7f, 0x64, 0xa2, 0xad, 0x65, 0x32, 0x07, + 0xde, 0x92, 0xfd, 0x2b, 0x6e, 0xf1, 0x59, 0xf6, 0xcf, 0xe6, 0x7f, 0xf8, 0x42, 0xf5, 0x97, 0xba, + 0x8f, 0x02, 0x9f, 0x54, 0x71, 0x84, 0xae, 0x53, 0xfc, 0x7f, 0xd7, 0xff, 0x03, 0xbb, 0xfe, 0x0e, + 0xdf, 0x94, 0xe9, 0x3c, 0x9b, 0xc3, 0xef, 0xf8, 0x7f, 0xad, 0x5b, 0x26, 0xcf, 0x3d, 0xfc, 0x7f, + 0x66, 0xff, 0x8e, 0x5b, 0x7c, 0x86, 0xff, 0xf7, 0x0f, 0xf5, 0xf7, 0x73, 0xb0, 0x7a, 0xee, 0x50, + 0xe7, 0x29, 0x19, 0x47, 0xe8, 0xe5, 0xe8, 0xd9, 0xc1, 0xaa, 0x7d, 0x7b, 0x5a, 0xd7, 0x85, 0xce, + 0x33, 0xab, 0xb3, 0x99, 0x6e, 0x37, 0xc5, 0x6a, 0xfe, 0x17, 0x70, 0xfb, 0x57, 0xf3, 0xbf, 0xce, + 0x77, 0x66, 0xe5, 0x74, 0xf6, 0xef, 0xb8, 0x45, 0xbf, 0x77, 0xcf, 0xf9, 0xdf, 0x5b, 0xc7, 0xbd, + 0xd7, 0x3b, 0x83, 0xf7, 0x85, 0xb1, 0xff, 0x60, 0x6c, 0x3f, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, + 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0xf0, 0xf7, + 0xe1, 0x11, 0x7b, 0xd1, 0xd9, 0xfb, 0xf4, 0x91, 0xc1, 0x7e, 0x13, 0xff, 0xac, 0xf6, 0xbd, 0xb3, + 0xc7, 0xd2, 0xdf, 0x69, 0x11, 0x60, 0x6f, 0x4c, 0xf6, 0x79, 0x84, 0x3e, 0x75, 0x6f, 0xa9, 0xc3, + 0xdf, 0x69, 0x5c, 0x71, 0x89, 0xec, 0x4b, 0xf3, 0x7c, 0x7d, 0xff, 0x08, 0xef, 0x00, 0xd2, 0x0f, + 0xfb, 0x37, 0x9e, 0xc9, 0x53, 0x76, 0x75, 0x39, 0xcd, 0x47, 0xf7, 0xed, 0xf1, 0xa9, 0xec, 0xaf, + 0xbf, 0x63, 0xc2, 0xbe, 0x23, 0xf6, 0xd9, 0xe9, 0x3e, 0xb7, 0x2c, 0xcf, 0x6a, 0x6f, 0xf0, 0xad, + 0xf2, 0x77, 0x7b, 0xf5, 0xd5, 0x86, 0xfa, 0x1e, 0x10, 0x87, 0xd6, 0x1b, 0xdd, 0xb2, 0x87, 0x4c, + 0xfb, 0x04, 0xf9, 0x3d, 0xab, 0x6d, 0x57, 0xe8, 0xea, 0xf2, 0xc8, 0x32, 0x75, 0x5f, 0xa4, 0xf6, + 0x8d, 0xac, 0xff, 0x38, 0xd8, 0xaf, 0x96, 0xe5, 0xe9, 0x9f, 0x6a, 0x6f, 0x9e, 0x3f, 0xbb, 0xda, + 0x1b, 0xb2, 0x6b, 0x7f, 0xde, 0xcb, 0x44, 0xfa, 0xf8, 0xdf, 0xdf, 0xb1, 0xa1, 0xf6, 0x7f, 0x6d, + 0xbc, 0x86, 0xfd, 0xfd, 0x77, 0x07, 0xd4, 0x3e, 0xf4, 0xc3, 0x0e, 0xec, 0x23, 0xae, 0xa0, 0x7d, + 0xa9, 0xdb, 0xcb, 0x16, 0xd7, 0xf5, 0xb7, 0x45, 0x3a, 0xac, 0xec, 0x4f, 0xdb, 0xa1, 0x4f, 0x3b, + 0x3c, 0xff, 0xac, 0xff, 0x73, 0x9d, 0xfc, 0x79, 0x97, 0x9b, 0xee, 0xa1, 0xd4, 0x7d, 0x9b, 0x01, + 0xda, 0x9b, 0xbe, 0x6b, 0x89, 0x7d, 0x7e, 0xfa, 0x8c, 0xee, 0xb1, 0xd5, 0x7c, 0xb5, 0x4d, 0x92, + 0x86, 0xef, 0x27, 0x38, 0x19, 0x43, 0x54, 0x17, 0xfe, 0xae, 0xa1, 0xac, 0x6f, 0x2b, 0xa8, 0x5b, + 0x57, 0x9e, 0xfa, 0x82, 0xcc, 0xf6, 0x8c, 0xbd, 0xf8, 0x86, 0x55, 0x99, 0xe4, 0xa9, 0xef, 0xef, + 0x51, 0x99, 0xf5, 0xfd, 0x72, 0x27, 0xf6, 0xf7, 0xbd, 0xee, 0x5c, 0xe7, 0x7f, 0xad, 0x27, 0xe7, + 0x92, 0x74, 0x9c, 0x54, 0x59, 0xb8, 0xcf, 0x77, 0xf4, 0x8a, 0xcc, 0x7a, 0x2e, 0x44, 0xf3, 0xa5, + 0x3d, 0xa8, 0xdc, 0x57, 0x7c, 0xd3, 0xc9, 0x7e, 0x71, 0x3d, 0x5f, 0xa1, 0xbe, 0x00, 0x79, 0xaa, + 0xbe, 0x4d, 0xbb, 0xdc, 0xf1, 0xe7, 0xd9, 0xd9, 0x01, 0xcd, 0xc7, 0xf7, 0x96, 0xaf, 0xe4, 0xc7, + 0x8f, 0x6b, 0xfe, 0x01, 0x74, 0xa7, 0xef, 0x62, 0x53, 0x3d, 0x32, 0xe6, 0xfb, 0x7c, 0xa5, 0xd2, + 0xb1, 0xcf, 0x79, 0xb4, 0x4e, 0xda, 0x5f, 0x7d, 0x4f, 0xaf, 0xee, 0x65, 0xd7, 0xf9, 0x94, 0xe6, + 0x91, 0xbd, 0xdb, 0x8f, 0xf6, 0xe0, 0xfd, 0xf0, 0x74, 0x4c, 0xe0, 0x9c, 0x53, 0x36, 0x9f, 0x71, + 0x60, 0x43, 0xff, 0xed, 0xcc, 0x6a, 0x1c, 0x66, 0xfd, 0xb4, 0x33, 0x96, 0x23, 0xcb, 0xe9, 0xdc, + 0xb0, 0xb3, 0x3f, 0x7a, 0xd5, 0x31, 0x0b, 0xff, 0xe9, 0xed, 0x48, 0xed, 0xaf, 0xfe, 0x5d, 0xf7, + 0x9a, 0x93, 0xe7, 0x89, 0xfd, 0xf5, 0x5c, 0x22, 0xed, 0x57, 0xcb, 0xcc, 0xde, 0x5d, 0xe5, 0xf3, + 0xac, 0xca, 0xfe, 0xfc, 0x4f, 0x3b, 0xbe, 0x32, 0x27, 0x40, 0xbe, 0xec, 0xe3, 0x40, 0x7e, 0x74, + 0x47, 0x1b, 0xce, 0xfc, 0x3a, 0xba, 0xab, 0xfc, 0xaa, 0xe7, 0x7b, 0xe5, 0xdd, 0x75, 0x81, 0xca, + 0xfe, 0xea, 0x37, 0x01, 0x6d, 0x31, 0x8b, 0x15, 0xe8, 0x99, 0x51, 0x5d, 0xdf, 0x50, 0x57, 0x9d, + 0x1f, 0x56, 0xe7, 0x1b, 0x32, 0xfb, 0x53, 0xae, 0x8e, 0xe5, 0x7a, 0x5d, 0xcf, 0xa5, 0x7a, 0x9f, + 0xd2, 0x73, 0x1f, 0x9d, 0xfd, 0x91, 0xc9, 0xdb, 0xd7, 0x33, 0xd0, 0xc5, 0x5d, 0x76, 0xe7, 0x16, + 0x91, 0xee, 0xaa, 0xdc, 0xdd, 0x78, 0x77, 0xd2, 0x9e, 0xf4, 0xdd, 0x3a, 0xda, 0x97, 0x3e, 0xda, + 0x79, 0x8a, 0xc1, 0x60, 0xf0, 0xa1, 0xf1, 0x0f, 0x88, 0x24, 0x6a, 0xa2, 0x49, 0xcb, 0xe6, 0x89, + 0x00, 0x00, 0x0a, 0xb5, 0x6d, 0x6b, 0x42, 0x54, 0xfa, 0xce, 0xca, 0xfe, 0x03, 0xef, 0xc0, 0x68, + 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, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x9c, 0xed, 0x9d, 0x8d, 0x91, 0xdb, 0x38, 0x0c, 0x46, 0x53, 0x48, + 0x1a, 0x49, 0x21, 0x29, 0x24, 0x8d, 0xa4, 0x90, 0x14, 0x92, 0x46, 0x52, 0x48, 0x6e, 0x90, 0x9b, + 0x77, 0xf3, 0xee, 0x0b, 0x48, 0xc9, 0x59, 0xaf, 0x1d, 0xdb, 0x78, 0x33, 0x9e, 0xd5, 0xea, 0x87, + 0xa4, 0x08, 0x12, 0xa2, 0x00, 0x90, 0xfa, 0xf9, 0x73, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, + 0x86, 0x61, 0x18, 0x86, 0x61, 0x78, 0x49, 0xbe, 0x7f, 0xff, 0xfe, 0xdb, 0xef, 0xc7, 0x8f, 0x1f, + 0xff, 0x1d, 0xbb, 0x27, 0x55, 0x8e, 0x7b, 0x97, 0xe1, 0xd9, 0xf9, 0xf0, 0xe1, 0xc3, 0x6f, 0xbf, + 0xaf, 0x5f, 0xbf, 0xfe, 0xaa, 0xf7, 0xda, 0xbe, 0x67, 0xfd, 0x57, 0x39, 0xaa, 0x0c, 0xc3, 0xfb, + 0x81, 0xbc, 0xcf, 0xe2, 0xf6, 0xf0, 0x96, 0xfe, 0xb9, 0xbb, 0xb6, 0x8e, 0xd5, 0x6f, 0x27, 0x7f, + 0xae, 0x47, 0x57, 0x0d, 0x7b, 0x3e, 0x7e, 0xfc, 0xd8, 0xd6, 0xd5, 0x4a, 0xfe, 0xee, 0xff, 0x6c, + 0x7f, 0xfa, 0xf4, 0xe9, 0xd7, 0xdf, 0x6f, 0xdf, 0xbe, 0xfd, 0xfc, 0xf2, 0xe5, 0xcb, 0x7f, 0xfa, + 0xa2, 0xf6, 0x17, 0xb5, 0xaf, 0xf2, 0x29, 0x2a, 0x2f, 0xce, 0xe5, 0x18, 0xe7, 0x91, 0x4e, 0xfd, + 0x5c, 0xae, 0xda, 0xcf, 0xb1, 0xda, 0x6f, 0xf9, 0x93, 0x76, 0x9d, 0x5b, 0x69, 0x5a, 0x5f, 0xd5, + 0xb1, 0x61, 0xcf, 0x4a, 0xce, 0x9d, 0xfe, 0x2f, 0x3a, 0xf9, 0x7f, 0xfe, 0xfc, 0xf9, 0xd7, 0x36, + 0xf5, 0x4f, 0xff, 0x2d, 0xb9, 0x94, 0x0c, 0x90, 0x39, 0x32, 0x62, 0x3f, 0xe7, 0x54, 0xfe, 0xc8, + 0x14, 0x99, 0xd7, 0xfe, 0x6c, 0x17, 0xf4, 0x6b, 0xce, 0x25, 0x3f, 0xb7, 0x13, 0xda, 0x02, 0xe5, + 0x1b, 0xf6, 0xec, 0xe4, 0x5f, 0x32, 0xf2, 0xf8, 0xaf, 0xe8, 0xe4, 0xcf, 0x31, 0xe4, 0x42, 0x7f, + 0xb5, 0x0c, 0x91, 0x73, 0xb5, 0x15, 0xf7, 0x59, 0xe4, 0xc7, 0x35, 0xe0, 0x3e, 0xbe, 0x3a, 0x86, + 0x3e, 0x00, 0xca, 0x63, 0x3d, 0x31, 0xec, 0xd9, 0xc9, 0xff, 0xac, 0xfe, 0x4f, 0xf9, 0x77, 0xef, + 0x0c, 0xe8, 0x79, 0xe4, 0x5e, 0x7f, 0xab, 0x2d, 0x20, 0xd7, 0xda, 0xb6, 0x2c, 0xfd, 0xcc, 0x58, + 0xc9, 0xdf, 0x7a, 0x00, 0xe8, 0xfb, 0x95, 0x9e, 0x75, 0xc3, 0xd0, 0x73, 0x4d, 0xf9, 0x23, 0xd7, + 0x92, 0x55, 0x5d, 0xeb, 0x3e, 0x48, 0x5f, 0xf7, 0x98, 0xc0, 0x79, 0xf8, 0x59, 0x92, 0xc7, 0x76, + 0xba, 0x21, 0xdb, 0x89, 0xf5, 0x8c, 0xe5, 0x5f, 0x6d, 0xc4, 0x69, 0x0c, 0xff, 0x52, 0x75, 0xe2, + 0xfe, 0x73, 0xb4, 0x1f, 0x5d, 0xcd, 0x58, 0x9c, 0x6d, 0x1f, 0xa7, 0x5f, 0x67, 0xfb, 0x29, 0x59, + 0x59, 0xde, 0x29, 0x0f, 0xfa, 0x6d, 0xe6, 0x5d, 0xd7, 0x79, 0x2c, 0x97, 0xb2, 0xac, 0x6d, 0xda, + 0x20, 0x7a, 0x86, 0x31, 0xc9, 0xea, 0x9a, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x78, 0x45, + 0x18, 0xc7, 0xdf, 0x93, 0x47, 0xb0, 0xd7, 0xa7, 0xff, 0xf3, 0x6f, 0x2f, 0xef, 0x59, 0xf2, 0xdd, + 0xfa, 0x1e, 0x5c, 0xea, 0x6b, 0xba, 0x36, 0xf5, 0xae, 0x78, 0x84, 0xcb, 0xe8, 0xed, 0x6a, 0x07, + 0xcf, 0xe6, 0x67, 0x48, 0x9d, 0xf0, 0x96, 0xf6, 0xbe, 0xbb, 0x96, 0xf7, 0xf3, 0x9d, 0xfc, 0xcf, + 0xd8, 0xf1, 0x8f, 0x7c, 0x86, 0x79, 0x9e, 0xf7, 0x75, 0xbe, 0xc4, 0x2e, 0xbd, 0x95, 0xfc, 0xff, + 0x86, 0xfe, 0xf3, 0x16, 0x5c, 0xfe, 0xf4, 0xb3, 0x61, 0xcf, 0xc3, 0xa6, 0x8e, 0x4d, 0x26, 0xfd, + 0x77, 0xe9, 0xdb, 0xc3, 0x17, 0xe4, 0x6b, 0xe9, 0x23, 0x9d, 0xcf, 0x90, 0xfa, 0x24, 0x3f, 0xce, + 0x5d, 0xf9, 0x03, 0x4d, 0xe7, 0x6f, 0xa4, 0x8c, 0x5c, 0x8f, 0xfd, 0xc8, 0xbe, 0x2c, 0xdb, 0x2f, + 0xed, 0xdf, 0xda, 0xa5, 0x97, 0xf2, 0xb7, 0x1f, 0xe2, 0x51, 0xdb, 0x40, 0xca, 0xdf, 0x7e, 0x36, + 0x1f, 0x73, 0x3f, 0x29, 0x7d, 0x89, 0xce, 0x2c, 0xb9, 0x20, 0x1b, 0x6c, 0xbe, 0xec, 0xe7, 0x9c, + 0xf4, 0x0b, 0xd8, 0x67, 0x58, 0x20, 0x23, 0xec, 0x76, 0x05, 0xe7, 0x51, 0xe7, 0xb4, 0x0f, 0x93, + 0xf6, 0x67, 0xb7, 0x1d, 0xda, 0x0c, 0xf7, 0x42, 0x9e, 0x99, 0x16, 0xf2, 0xee, 0xec, 0xd9, 0x99, + 0x5e, 0xca, 0xdf, 0x75, 0xf4, 0xa8, 0xe3, 0x81, 0xae, 0xff, 0x03, 0x75, 0x68, 0xbd, 0xe0, 0xbe, + 0x6d, 0x3f, 0x8e, 0x7d, 0x7b, 0x5d, 0x8c, 0xd0, 0x2e, 0x7e, 0xc8, 0x7d, 0xd0, 0x76, 0x5f, 0xf7, + 0xff, 0x4a, 0x3b, 0xeb, 0x78, 0xe7, 0x6f, 0xcc, 0x67, 0x4a, 0xf6, 0xeb, 0xf4, 0x59, 0x5d, 0x92, + 0xde, 0xb3, 0xeb, 0x7f, 0x40, 0xb6, 0xe9, 0x03, 0x2e, 0xec, 0xab, 0x29, 0x99, 0xe1, 0x6f, 0x71, + 0x7f, 0x43, 0x96, 0xfc, 0xbf, 0x93, 0x3f, 0x7d, 0xdf, 0x3e, 0x40, 0xc7, 0xfb, 0x58, 0x9f, 0xc0, + 0xce, 0xdf, 0x98, 0xf2, 0x27, 0x2d, 0xfc, 0x00, 0xe4, 0xd3, 0xc9, 0xff, 0x28, 0xbd, 0x57, 0x91, + 0x3f, 0xcf, 0xf6, 0xfa, 0x9b, 0xb2, 0xb1, 0xbc, 0x8b, 0xf4, 0xc5, 0xdb, 0x17, 0xe7, 0xfa, 0xde, + 0xe9, 0x06, 0xf4, 0x89, 0xdb, 0x09, 0xba, 0xc5, 0xba, 0x18, 0x76, 0xfe, 0xc6, 0x94, 0xbf, 0xcf, + 0xeb, 0xe4, 0x4f, 0x9c, 0xca, 0x99, 0xf4, 0x52, 0xfe, 0x9c, 0xd7, 0xf9, 0xc3, 0xfe, 0x76, 0xec, + 0x5b, 0x4b, 0x3f, 0x5b, 0x41, 0x7d, 0xa5, 0x3f, 0x2d, 0xfd, 0x77, 0xf6, 0xed, 0xe5, 0xb5, 0xd4, + 0x6d, 0xd1, 0xd5, 0x91, 0xfd, 0x7d, 0x3c, 0x47, 0xc8, 0x63, 0xe5, 0x4b, 0x84, 0x95, 0xbf, 0x31, + 0x7d, 0x88, 0xbc, 0xa7, 0x75, 0xe5, 0xf1, 0x78, 0xe6, 0x4c, 0x7a, 0xde, 0xa6, 0x1e, 0x1e, 0x55, + 0xfe, 0xc3, 0x30, 0x0c, 0xc3, 0x30, 0x0c, 0xc3, 0x50, 0x63, 0x5b, 0xec, 0x9b, 0xfc, 0x3c, 0x3e, + 0xbf, 0x67, 0x5c, 0x3d, 0xf6, 0x80, 0x19, 0x63, 0xbf, 0x1f, 0xb6, 0x7d, 0xf1, 0xb3, 0x4d, 0xbe, + 0x8b, 0x0b, 0xbd, 0x15, 0x7f, 0xc3, 0xfc, 0xc3, 0x67, 0x67, 0x67, 0xd3, 0xea, 0xfc, 0xe0, 0xd6, + 0x09, 0xe8, 0x0e, 0xc7, 0x84, 0xe7, 0xdc, 0xc0, 0xf4, 0x2d, 0x42, 0x5e, 0xeb, 0xf3, 0x6b, 0x5f, + 0x67, 0x3f, 0xcc, 0xf2, 0xa0, 0xaf, 0x46, 0x3f, 0x9c, 0xa3, 0xb3, 0xab, 0x20, 0xff, 0x95, 0xdd, + 0xd7, 0x76, 0x30, 0x7c, 0x7c, 0xd8, 0x8e, 0xd0, 0x1b, 0xd8, 0x7f, 0x3d, 0xc7, 0xa7, 0x48, 0xbf, + 0x50, 0xc6, 0xee, 0xdb, 0x67, 0xe7, 0x73, 0xec, 0xb7, 0xe3, 0x2f, 0xc7, 0x68, 0x1f, 0xd8, 0x91, + 0xf1, 0x49, 0x0d, 0xc7, 0x74, 0xfd, 0xdc, 0x7e, 0x17, 0xd7, 0x7b, 0x91, 0xf2, 0xe7, 0xfa, 0x6e, + 0x5e, 0xa7, 0x7d, 0x81, 0xb6, 0xef, 0x5a, 0xe6, 0xf8, 0x0f, 0xba, 0x79, 0x44, 0x9e, 0xeb, 0x97, + 0xf3, 0xcf, 0xec, 0xb7, 0xf3, 0x35, 0xe8, 0x88, 0xe9, 0xff, 0xe7, 0x58, 0xc9, 0x7f, 0xa5, 0xff, + 0x57, 0x76, 0xf0, 0xf4, 0xa5, 0xa7, 0x4f, 0x1d, 0x1b, 0x29, 0xed, 0x22, 0xfb, 0xb1, 0x63, 0x30, + 0xce, 0x1c, 0xcb, 0x76, 0x59, 0xe0, 0x93, 0xd8, 0xc5, 0x0b, 0x0c, 0xff, 0xe7, 0x5a, 0xf2, 0xef, + 0x7c, 0x7e, 0xe0, 0xb9, 0x5f, 0x25, 0x2f, 0xcf, 0x05, 0x2c, 0xce, 0xf4, 0x7f, 0x70, 0x5c, 0x80, + 0xcb, 0xc9, 0xb9, 0x79, 0xce, 0xb0, 0xe7, 0x5a, 0xf2, 0x2f, 0xd0, 0xc9, 0xe9, 0x3b, 0x2f, 0x78, + 0x86, 0x17, 0xd6, 0xe1, 0xce, 0x73, 0xf5, 0xfc, 0x5f, 0xe9, 0x06, 0xb7, 0x39, 0x3f, 0xff, 0x1d, + 0xab, 0x50, 0xcc, 0xdc, 0xaf, 0x35, 0xdd, 0xbb, 0x5c, 0xed, 0x5b, 0xbd, 0xe3, 0x79, 0x7c, 0xde, + 0xd9, 0x02, 0x18, 0xc3, 0xe7, 0xf5, 0xc4, 0x8d, 0x38, 0x9d, 0xd4, 0xcf, 0xdd, 0xf8, 0x9f, 0x67, + 0x00, 0xe4, 0xfb, 0xbf, 0xcb, 0xca, 0xb1, 0x4c, 0x7b, 0xe4, 0x3f, 0x0c, 0xc3, 0x30, 0x0c, 0xc3, + 0x30, 0x0c, 0xe7, 0x18, 0x5f, 0xe0, 0x6b, 0x33, 0xbe, 0xc0, 0xe7, 0x86, 0x3e, 0xb4, 0x92, 0xe3, + 0xf8, 0x02, 0x9f, 0x1b, 0xdb, 0xdc, 0xc6, 0x17, 0xf8, 0x7a, 0xe4, 0x1a, 0xab, 0xc9, 0xf8, 0x02, + 0x5f, 0x83, 0x9d, 0xfc, 0xc7, 0x17, 0xf8, 0xfc, 0x5c, 0x53, 0xfe, 0xe3, 0x0b, 0x7c, 0x3c, 0xae, + 0x29, 0xff, 0x62, 0x7c, 0x81, 0x8f, 0xc5, 0xca, 0xe7, 0x37, 0xbe, 0xc0, 0x61, 0x18, 0x86, 0x61, + 0x18, 0x86, 0x61, 0x78, 0x6e, 0x2e, 0xb5, 0x95, 0x74, 0xeb, 0x86, 0x1c, 0x61, 0x7f, 0x12, 0x3f, + 0x6c, 0xc4, 0xf7, 0x5e, 0x43, 0xe3, 0x95, 0xdf, 0x11, 0x76, 0x6b, 0xad, 0xac, 0xd8, 0xbd, 0x23, + 0xae, 0xe0, 0xfd, 0xdc, 0x7e, 0x65, 0xfb, 0x90, 0xee, 0x29, 0xff, 0xb4, 0x33, 0x3c, 0x33, 0x5e, + 0xd7, 0x07, 0xdb, 0x1b, 0xb6, 0xb9, 0xc2, 0x6b, 0xf0, 0xac, 0x64, 0x6c, 0xf9, 0x63, 0x7f, 0xc1, + 0x26, 0xb7, 0x6a, 0x4b, 0x2b, 0x9b, 0x9c, 0xe5, 0x6f, 0x7f, 0x22, 0x65, 0xf2, 0xfa, 0x3c, 0x2e, + 0xe3, 0xca, 0x9e, 0x60, 0x9b, 0xc1, 0xea, 0x5e, 0x28, 0x33, 0x7a, 0xcc, 0xf2, 0xcf, 0xf6, 0xe8, + 0x75, 0x0a, 0x9f, 0xc1, 0xa6, 0x6c, 0xdb, 0x2b, 0x36, 0xbb, 0xfa, 0xdf, 0x76, 0xb4, 0xee, 0x9b, + 0x3c, 0x99, 0x86, 0xd7, 0x10, 0xc3, 0xaf, 0x87, 0x0d, 0xbe, 0x6b, 0x37, 0x5d, 0xff, 0x2f, 0x6c, + 0xd3, 0x63, 0x1b, 0x5b, 0x60, 0xfd, 0x4f, 0xda, 0xf6, 0xf9, 0xd0, 0x6e, 0x7d, 0xbd, 0xd7, 0xe7, + 0xf2, 0x9a, 0x84, 0xab, 0xef, 0x0b, 0x91, 0x47, 0xca, 0xdf, 0xeb, 0x8e, 0xb1, 0x06, 0x9a, 0xd7, + 0xc4, 0x7a, 0x74, 0x90, 0x11, 0xb8, 0x5e, 0x76, 0xdf, 0xe4, 0x32, 0x29, 0x7f, 0x3f, 0x3b, 0x57, + 0x6d, 0xc6, 0x72, 0xf5, 0x35, 0x9d, 0xfc, 0x1d, 0x6f, 0xe4, 0x63, 0xf6, 0x1f, 0xb3, 0x9f, 0xfe, + 0x49, 0x7a, 0xec, 0x3f, 0xfa, 0xbe, 0x98, 0x8f, 0x91, 0x4f, 0xee, 0xf7, 0x7a, 0x78, 0xf7, 0x8c, + 0x7b, 0xb9, 0x26, 0xd8, 0xc7, 0x21, 0xfb, 0x85, 0x65, 0xb9, 0x7a, 0x2e, 0xfe, 0xa9, 0xfc, 0xbb, + 0xfd, 0x9d, 0xfc, 0xd3, 0x17, 0xd4, 0xc5, 0x22, 0xd1, 0xaf, 0xd1, 0xed, 0xa4, 0x7f, 0xf4, 0x0d, + 0xb9, 0xdd, 0x31, 0xfc, 0x14, 0xd6, 0xf3, 0xe4, 0xc1, 0xf1, 0x47, 0x67, 0xd7, 0xff, 0xed, 0x7b, + 0x2b, 0xd2, 0x8f, 0x03, 0xb7, 0x92, 0x7f, 0xd7, 0x1e, 0x6c, 0xfb, 0x77, 0x3c, 0x01, 0xfd, 0x3d, + 0x7d, 0x47, 0xdd, 0xbd, 0xec, 0xda, 0x46, 0xc6, 0xa8, 0x90, 0x5e, 0xfa, 0x29, 0x1f, 0xf5, 0x9d, + 0x81, 0xb6, 0xec, 0x7a, 0x49, 0x1d, 0x70, 0xe4, 0x47, 0xbf, 0x95, 0xfc, 0x0b, 0xaf, 0xe3, 0x4b, + 0xec, 0x00, 0xac, 0xd6, 0x9c, 0xce, 0x7b, 0xcd, 0x7b, 0xd9, 0xc9, 0xdf, 0x65, 0xc8, 0xef, 0x0b, + 0xfb, 0x9a, 0x47, 0x95, 0x7f, 0x91, 0x31, 0x32, 0xe9, 0xc7, 0xdb, 0xad, 0xaf, 0xcf, 0x71, 0xaf, + 0xa7, 0x99, 0x69, 0x75, 0x6d, 0x66, 0x17, 0x97, 0x93, 0x3e, 0xbf, 0x2e, 0xbf, 0xd5, 0xfe, 0xdd, + 0x7d, 0xac, 0xae, 0xcd, 0xeb, 0xf2, 0x9c, 0xae, 0x7e, 0x9e, 0x61, 0xec, 0x3f, 0x0c, 0xc3, 0x30, + 0x0c, 0xc3, 0x30, 0x0c, 0xb0, 0x9a, 0x5b, 0x75, 0xb4, 0xbf, 0x9b, 0x2b, 0xf0, 0x37, 0xf8, 0x53, + 0x76, 0x71, 0xac, 0xc3, 0xef, 0xec, 0xe6, 0xd6, 0xad, 0xf6, 0x79, 0xce, 0x85, 0xe7, 0x0a, 0x1d, + 0xbd, 0x3f, 0xde, 0x82, 0x91, 0x7f, 0x8f, 0x7d, 0x18, 0xb6, 0xa1, 0xe5, 0x9c, 0x1a, 0x58, 0xf9, + 0xe7, 0x77, 0xed, 0xc5, 0xb6, 0x91, 0xda, 0x76, 0xcc, 0x3f, 0xdf, 0xe5, 0xb0, 0xdf, 0xa9, 0xf0, + 0xf7, 0x44, 0xf0, 0xff, 0x81, 0x8f, 0xf9, 0x5a, 0xdb, 0x93, 0xf0, 0x2d, 0x71, 0x2f, 0x96, 0x3f, + 0xdf, 0xb3, 0xf1, 0x3d, 0xbf, 0xea, 0x3c, 0x11, 0xcb, 0xcc, 0x7e, 0xb6, 0x8c, 0x9b, 0x87, 0x23, + 0xfd, 0xdf, 0xd9, 0xe6, 0xad, 0xff, 0xd9, 0xe6, 0xbb, 0x3e, 0xb6, 0xd3, 0xd9, 0x46, 0x6b, 0xff, + 0x8c, 0xdb, 0x22, 0x71, 0xfe, 0xf8, 0x7a, 0xb0, 0x01, 0x72, 0xad, 0xbf, 0x51, 0xe8, 0x6f, 0x09, + 0x39, 0xc6, 0xc4, 0x72, 0xa6, 0x2c, 0xf8, 0x88, 0xee, 0xad, 0xa7, 0x6e, 0xcd, 0x59, 0x5b, 0x3b, + 0x1c, 0xed, 0xa7, 0x6f, 0xe6, 0x3a, 0x01, 0x29, 0x7f, 0x40, 0x0f, 0xb8, 0x2d, 0x60, 0xd7, 0xa7, + 0x2d, 0xd8, 0x37, 0x8b, 0xfc, 0x28, 0x7b, 0xce, 0x1b, 0xb1, 0xdf, 0xaf, 0x9b, 0x53, 0xd2, 0xed, + 0xa7, 0xdd, 0xfa, 0xbb, 0x40, 0xaf, 0xc2, 0xb5, 0xe5, 0xdf, 0xf5, 0x9f, 0x4b, 0xe4, 0xef, 0x39, + 0x1f, 0xe8, 0xee, 0xfc, 0xd6, 0xa0, 0xbf, 0xc9, 0xb8, 0x93, 0x7f, 0x3e, 0x0f, 0x3a, 0x9f, 0x6e, + 0xc1, 0x33, 0xe9, 0x15, 0xe7, 0x0a, 0x5f, 0x5b, 0xff, 0x5f, 0x2a, 0x7f, 0xeb, 0x6d, 0x74, 0xb0, + 0x63, 0x6d, 0xec, 0xc3, 0x43, 0x3e, 0xe4, 0x71, 0xa4, 0xff, 0x53, 0xfe, 0xb4, 0x8d, 0x4c, 0x93, + 0xf8, 0x10, 0xc7, 0x08, 0x3c, 0xb2, 0x3f, 0xe7, 0x12, 0x3c, 0x6e, 0xa2, 0x8f, 0xd1, 0xaf, 0x6e, + 0x21, 0xff, 0xc2, 0x3e, 0x3d, 0xf7, 0xe7, 0xdd, 0x3c, 0xf2, 0xbc, 0x36, 0xc7, 0x7f, 0x3b, 0xf9, + 0xe3, 0xc7, 0xab, 0xf4, 0x73, 0xfc, 0xf7, 0xe8, 0xfe, 0xdc, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, + 0x61, 0x18, 0x86, 0x7b, 0xe0, 0x78, 0xcb, 0x8c, 0x99, 0x5c, 0xc5, 0x7f, 0xde, 0x8a, 0xdd, 0xfb, + 0xea, 0x70, 0x1d, 0x78, 0xe7, 0xb6, 0x3f, 0x30, 0xd7, 0x8b, 0xbc, 0x17, 0x23, 0xff, 0x35, 0x9e, + 0xdf, 0xe0, 0xf8, 0x7a, 0xe6, 0xc7, 0xd1, 0x8f, 0x99, 0x83, 0x63, 0xbf, 0x5d, 0xa6, 0xb3, 0xb2, + 0xa1, 0x78, 0x0e, 0x5e, 0xfa, 0xea, 0x6c, 0x87, 0xf2, 0xbc, 0xa0, 0x95, 0x0f, 0xd0, 0xc7, 0x28, + 0x13, 0xd7, 0x66, 0xf9, 0xb1, 0xff, 0x3a, 0x7e, 0x1f, 0x9f, 0xa6, 0xcb, 0xd3, 0xd9, 0xa3, 0x5e, + 0x01, 0x6c, 0xa0, 0x69, 0x0f, 0xc5, 0x6e, 0xe7, 0x35, 0x1a, 0x39, 0xaf, 0xb3, 0xa9, 0x17, 0x9e, + 0x57, 0xc7, 0xcf, 0x7e, 0xb7, 0x5c, 0x3b, 0x14, 0xdb, 0x3f, 0x76, 0xfe, 0x6e, 0x8e, 0x97, 0xed, + 0xbb, 0xf6, 0xe7, 0x92, 0x36, 0x65, 0xcc, 0x72, 0xa5, 0xdf, 0xd1, 0xfd, 0xbf, 0xf3, 0x55, 0x62, + 0x53, 0x7e, 0x76, 0xf9, 0xa7, 0xfe, 0xa3, 0x5e, 0xb9, 0xf7, 0x55, 0x0c, 0x4f, 0x37, 0x4f, 0x28, + 0xe9, 0x7c, 0x3b, 0x2b, 0xf9, 0x53, 0xcf, 0xe9, 0x47, 0xf4, 0xfc, 0x34, 0x7c, 0x3f, 0xd8, 0x66, + 0xed, 0x1f, 0xb4, 0xff, 0xd0, 0xf7, 0xb6, 0x2a, 0x3f, 0xc7, 0x72, 0x8e, 0x97, 0xf7, 0x57, 0x7e, + 0xcf, 0x32, 0xcf, 0x6f, 0xc5, 0x4e, 0xfe, 0x96, 0xd9, 0x9f, 0xca, 0x7f, 0xa5, 0xff, 0x53, 0xfe, + 0x39, 0xff, 0xd7, 0x7e, 0x64, 0x8e, 0x61, 0xab, 0xe7, 0x98, 0xe7, 0xf2, 0xee, 0xd6, 0x87, 0xdc, + 0xc9, 0xdf, 0x6d, 0x14, 0x48, 0x8b, 0x36, 0xf6, 0xec, 0x6d, 0xc0, 0x58, 0xff, 0x5b, 0xff, 0xdd, + 0x4a, 0xfe, 0x85, 0xfd, 0x90, 0x7e, 0xce, 0x73, 0x2e, 0xe3, 0x12, 0xda, 0x03, 0x79, 0x9c, 0xd1, + 0xff, 0x90, 0x6d, 0x83, 0x34, 0xd9, 0xb6, 0x4f, 0xdc, 0xed, 0xef, 0x15, 0x7c, 0x42, 0x1e, 0xff, + 0xad, 0x64, 0xfc, 0x9e, 0xf2, 0xf7, 0xf8, 0x2f, 0xe7, 0xf8, 0xd9, 0x07, 0x98, 0xfe, 0xc1, 0x62, + 0x35, 0xfe, 0xdb, 0xc9, 0xbf, 0xc8, 0x79, 0xfe, 0xdd, 0xf8, 0xef, 0x55, 0xe4, 0x3f, 0x0c, 0xc3, + 0x30, 0x0c, 0xc3, 0x30, 0x0c, 0xc3, 0x30, 0x0c, 0xc3, 0x30, 0x0c, 0xc3, 0x30, 0x0c, 0xc3, 0x30, + 0x0c, 0xc3, 0x30, 0xbc, 0x2e, 0xc4, 0x50, 0x16, 0x97, 0x7e, 0x0f, 0x04, 0x1f, 0xfe, 0x2a, 0xd6, + 0xce, 0x31, 0x40, 0x47, 0x5c, 0xe2, 0x9f, 0xbf, 0xe4, 0xdc, 0x4b, 0xca, 0xf0, 0xde, 0x10, 0xdf, + 0x72, 0x4b, 0x58, 0xff, 0x98, 0xb5, 0x73, 0x32, 0x7f, 0xe2, 0xb1, 0x28, 0xdf, 0xa5, 0xf2, 0xe7, + 0xba, 0x8e, 0x4a, 0xeb, 0xec, 0xb7, 0x16, 0xba, 0x38, 0x94, 0x8e, 0x8c, 0x27, 0x3e, 0xe2, 0x92, + 0x58, 0x40, 0xe2, 0x96, 0xbc, 0x0e, 0xce, 0x51, 0xac, 0xfb, 0x51, 0xfd, 0x1a, 0x62, 0xa3, 0xe0, + 0xda, 0x71, 0xf4, 0x8e, 0x9d, 0xf2, 0x77, 0x78, 0x89, 0x0b, 0xec, 0x62, 0xf7, 0x29, 0x93, 0xbf, + 0xeb, 0xee, 0xb8, 0x5f, 0xca, 0x4b, 0x7c, 0x95, 0x8f, 0x91, 0x76, 0xce, 0x17, 0x20, 0xde, 0xdc, + 0x31, 0xe7, 0x8e, 0xd5, 0x4d, 0xbc, 0x36, 0x10, 0x6b, 0x08, 0x65, 0x9f, 0x65, 0x2d, 0x32, 0xc7, + 0x9b, 0xef, 0xfa, 0x35, 0xf9, 0x9f, 0x39, 0x97, 0xf3, 0x1d, 0x3f, 0x4b, 0x5e, 0x8e, 0x45, 0xba, + 0xa4, 0x7e, 0x89, 0x39, 0xf2, 0xcf, 0xb1, 0x51, 0xef, 0xb1, 0xae, 0x59, 0xae, 0xd7, 0x46, 0xb9, + 0x38, 0x96, 0xeb, 0x7f, 0x11, 0x0f, 0x4e, 0x3f, 0xe5, 0x7e, 0x3b, 0x3a, 0x3d, 0x4a, 0x3c, 0x97, + 0xef, 0xdb, 0xdf, 0xfe, 0xa1, 0x2d, 0xec, 0x74, 0x00, 0xf1, 0xba, 0xc4, 0x92, 0x79, 0x4e, 0x41, + 0xde, 0x1b, 0xc7, 0xe9, 0x67, 0xbb, 0xfe, 0x43, 0xfe, 0x8e, 0x09, 0x5c, 0xe1, 0xfb, 0x4e, 0xfd, + 0xe2, 0x58, 0xca, 0x4b, 0xea, 0x97, 0x73, 0x29, 0x27, 0xe9, 0x5e, 0x4b, 0xff, 0x67, 0x5c, 0x7e, + 0xe2, 0xe7, 0x32, 0x7d, 0x9b, 0x36, 0xed, 0x7d, 0xd4, 0xb3, 0xbf, 0xb7, 0xe1, 0xef, 0x29, 0xb9, + 0x1e, 0xdc, 0x6e, 0x5d, 0x4f, 0xbb, 0xfb, 0x72, 0xde, 0x1d, 0x5e, 0x1b, 0xcc, 0xf7, 0xb3, 0x6a, + 0x87, 0x7e, 0x86, 0x22, 0xb7, 0xee, 0x7b, 0x1f, 0x70, 0xe6, 0xb9, 0xe2, 0xf9, 0x32, 0x39, 0x77, + 0x80, 0x36, 0x94, 0x1c, 0xd5, 0x2f, 0xd0, 0x2e, 0x1c, 0x9f, 0x7a, 0x2d, 0x76, 0xed, 0x3a, 0xfb, + 0x2b, 0xfd, 0xc7, 0xff, 0xa3, 0xf3, 0xb2, 0x4d, 0x7b, 0xde, 0x57, 0x97, 0x1e, 0xfd, 0x8f, 0xfb, + 0x4a, 0x59, 0xb9, 0xaf, 0x5a, 0xf7, 0xad, 0xca, 0xea, 0xb5, 0xa2, 0x60, 0x25, 0xb7, 0x8c, 0x0d, + 0xed, 0xd2, 0xa4, 0x6c, 0x39, 0x8f, 0x85, 0xbc, 0x12, 0xe7, 0x95, 0xed, 0x9e, 0xb6, 0x99, 0x1c, + 0xd5, 0xaf, 0xcf, 0x23, 0x4f, 0xcf, 0x55, 0x7a, 0x2b, 0xe8, 0xc1, 0x55, 0xff, 0x3f, 0x3b, 0xee, + 0xfd, 0x13, 0xf9, 0x73, 0x8e, 0xe7, 0xdc, 0x64, 0x9a, 0x7e, 0x1e, 0x76, 0xf1, 0xe0, 0x4e, 0xb7, + 0x9b, 0x87, 0x44, 0x9d, 0xe7, 0x37, 0x2a, 0x2e, 0x59, 0xe7, 0xab, 0x1b, 0x2b, 0x76, 0x3a, 0xd3, + 0x79, 0x65, 0x3b, 0xf4, 0xf8, 0x38, 0xcb, 0x7d, 0xa6, 0x7e, 0xe9, 0xff, 0xdd, 0x7c, 0x85, 0xb7, + 0xb2, 0x2b, 0xc3, 0x91, 0xde, 0x85, 0x4e, 0xfe, 0x39, 0x7f, 0xa3, 0xe0, 0xdd, 0xc0, 0x7d, 0x95, + 0x7b, 0x42, 0xc6, 0x9e, 0x23, 0x74, 0x06, 0xaf, 0xe9, 0x98, 0xd7, 0x78, 0xee, 0x90, 0xe3, 0xd5, + 0xad, 0x73, 0x8f, 0x58, 0xc9, 0xbf, 0x6b, 0xaf, 0x8c, 0x53, 0xac, 0x1f, 0x56, 0xed, 0x9b, 0xfc, + 0x2f, 0xd5, 0xe7, 0xbb, 0x75, 0x4a, 0x3d, 0x6f, 0xea, 0x0c, 0x47, 0xfd, 0xbf, 0xf0, 0x3c, 0x8b, + 0xd5, 0xbb, 0x4c, 0x27, 0xff, 0xa3, 0xb2, 0xf3, 0x4c, 0xac, 0xf2, 0x3a, 0x0f, 0xe4, 0x44, 0x5d, + 0xb2, 0x36, 0xdc, 0x6a, 0xac, 0x66, 0x9d, 0x99, 0xf2, 0x67, 0x4c, 0x98, 0xeb, 0x04, 0x7a, 0x9d, + 0x2f, 0xaf, 0x2b, 0xd8, 0xbd, 0x5b, 0x7b, 0x8e, 0x99, 0xdf, 0x1d, 0xba, 0x72, 0xf0, 0xdd, 0x43, + 0xf4, 0x4d, 0xae, 0x59, 0xd7, 0x71, 0xa6, 0x7e, 0xe1, 0xe8, 0x5b, 0xbb, 0x1c, 0x7b, 0x8f, 0x79, + 0x8b, 0xbc, 0xa3, 0xae, 0xf2, 0xcd, 0x79, 0x1a, 0x09, 0x63, 0x05, 0xc8, 0x7a, 0x41, 0xbf, 0xa7, + 0xde, 0xf4, 0xbb, 0xf4, 0x91, 0xde, 0x3b, 0xd3, 0xee, 0x77, 0xef, 0x84, 0xab, 0xb1, 0x80, 0xc7, + 0x39, 0x97, 0xac, 0x13, 0x7a, 0xc9, 0x73, 0x7a, 0x57, 0xbf, 0x94, 0xfb, 0x48, 0xae, 0x9c, 0xf3, + 0xec, 0xf3, 0x56, 0x87, 0x61, 0x78, 0x33, 0xff, 0x00, 0xa0, 0x82, 0xfa, 0x20, 0xff, 0x3f, 0xe1, + 0xbc, 0x00, 0x00, 0x04, 0x66, 0x6d, 0x6b, 0x42, 0x54, 0xfa, 0xce, 0xca, 0xfe, 0x03, 0xf1, 0x6c, + 0xf0, 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, 0x00, 0x00, 0x00, 0x00, 0x78, 0x9c, 0xed, 0xda, 0x8d, 0x6d, 0xea, 0x30, 0x14, 0x86, 0x61, + 0x06, 0x61, 0x91, 0x0e, 0xd2, 0x41, 0x58, 0x84, 0x41, 0x18, 0xa4, 0x8b, 0x74, 0x10, 0xae, 0x4e, + 0x75, 0xdf, 0xea, 0xd3, 0xa9, 0x1d, 0x7e, 0x02, 0xa2, 0x85, 0xf7, 0x91, 0x22, 0x42, 0x7e, 0x1c, + 0xc7, 0xc7, 0x76, 0x82, 0xcd, 0xf1, 0x28, 0x49, 0x92, 0x24, 0x49, 0x92, 0xf4, 0xdf, 0xe7, 0xe7, + 0xe7, 0xf1, 0xe3, 0xe3, 0x63, 0xba, 0xd4, 0xfe, 0xbf, 0x20, 0xef, 0xe3, 0x9e, 0x69, 0xdf, 0x23, + 0xfd, 0x47, 0xaa, 0xfb, 0xd9, 0x6c, 0x36, 0xd3, 0xe5, 0x70, 0x38, 0x1c, 0xdf, 0xde, 0xde, 0xbe, + 0xd6, 0x7f, 0xf3, 0xbd, 0x73, 0x1f, 0x95, 0xd7, 0x5b, 0xaa, 0xd8, 0x6f, 0xb7, 0xdb, 0xef, 0xf2, + 0xb8, 0x75, 0xfa, 0x8f, 0x96, 0xf1, 0xdf, 0xed, 0x76, 0x3f, 0x96, 0x52, 0x9f, 0x75, 0xdf, 0xaf, + 0x18, 0x7f, 0xea, 0xfe, 0x2b, 0xc4, 0x7f, 0x66, 0xbf, 0xdf, 0x7f, 0xd5, 0x01, 0x9e, 0x05, 0xd4, + 0x8d, 0xfa, 0x5e, 0xfb, 0xa8, 0x17, 0x7c, 0xaf, 0x7d, 0xf5, 0xc9, 0xf1, 0xb5, 0x9f, 0x6d, 0xb3, + 0x34, 0xeb, 0x33, 0x8f, 0x99, 0xa5, 0xd5, 0xcf, 0xad, 0x75, 0xf2, 0x90, 0xf1, 0x21, 0xbd, 0x5a, + 0xc8, 0x1f, 0xf9, 0x18, 0xa5, 0x39, 0x52, 0xc7, 0x55, 0x9a, 0xd5, 0xfe, 0x59, 0x7f, 0xe6, 0xf8, + 0xd7, 0xbd, 0xe5, 0x42, 0x2c, 0x7a, 0xff, 0xcf, 0xf1, 0xf4, 0x8b, 0xc4, 0x22, 0xfb, 0xc9, 0x7c, + 0x7e, 0xd4, 0x3e, 0x8e, 0x2f, 0x7c, 0xe7, 0xdc, 0x52, 0xd7, 0xaa, 0xef, 0xf5, 0x59, 0xe7, 0xcc, + 0x9e, 0x45, 0x99, 0x1f, 0xae, 0x47, 0xdf, 0x94, 0xeb, 0x99, 0xb7, 0x4c, 0x3f, 0x97, 0x3a, 0x66, + 0x56, 0x07, 0xb2, 0x5c, 0xea, 0xba, 0xaf, 0x10, 0xff, 0xbe, 0x50, 0x76, 0xb3, 0xf8, 0xbf, 0xbf, + 0xbf, 0x7f, 0xbf, 0x23, 0x52, 0x3e, 0x9c, 0xd3, 0xdb, 0x63, 0xa6, 0x91, 0xb1, 0xa0, 0x4e, 0xb0, + 0xbf, 0xd2, 0x62, 0x9d, 0xfa, 0xc7, 0xf1, 0x3d, 0xad, 0xfa, 0xac, 0xd8, 0xf0, 0x5e, 0x46, 0x7a, + 0x3d, 0xf6, 0x79, 0x4e, 0xa6, 0x49, 0x7d, 0xea, 0xb2, 0x2e, 0xe7, 0x33, 0xf0, 0xd9, 0xe3, 0x3f, + 0x33, 0x8b, 0x7f, 0xb6, 0x9d, 0xfe, 0x9c, 0xcc, 0xa5, 0x10, 0xc3, 0x2a, 0xc7, 0xaa, 0x37, 0xd9, + 0xa7, 0x92, 0x87, 0xda, 0x9e, 0xe9, 0xa7, 0xdc, 0xc6, 0xb5, 0x32, 0x7e, 0xa3, 0x7a, 0x9c, 0xed, + 0xbb, 0xf6, 0x57, 0xfa, 0xc4, 0xb0, 0xd6, 0x67, 0xcf, 0x00, 0x8e, 0x23, 0x8f, 0xbc, 0xff, 0xe4, + 0xb6, 0x67, 0xb1, 0x26, 0xfe, 0x89, 0x32, 0xe3, 0x79, 0x4b, 0x3b, 0xcf, 0x77, 0x03, 0xca, 0x9e, + 0x32, 0xcc, 0x76, 0x9d, 0x6d, 0x93, 0xb6, 0x97, 0xef, 0x06, 0xa3, 0xbe, 0x22, 0xdf, 0x47, 0xb3, + 0xfd, 0x67, 0x1f, 0x92, 0xb1, 0xca, 0xbc, 0x64, 0x7e, 0x67, 0xf7, 0xbb, 0xb4, 0x3c, 0x8b, 0x5b, + 0xc5, 0x9f, 0x58, 0x12, 0xdb, 0x6c, 0x6b, 0x3d, 0x9d, 0xfe, 0x5e, 0xd0, 0xfb, 0x93, 0xec, 0x6b, + 0xb3, 0xed, 0xcd, 0x9e, 0x47, 0x79, 0x1f, 0x5c, 0xaf, 0xd7, 0x87, 0xec, 0xcf, 0x33, 0x4d, 0xfa, + 0x9c, 0x5e, 0x26, 0x7d, 0xc9, 0x3c, 0xfd, 0xe6, 0xdf, 0x41, 0x97, 0xba, 0x55, 0xfc, 0x4b, 0x95, + 0x51, 0xbe, 0x03, 0x56, 0xd9, 0xf6, 0xf7, 0xf6, 0x1e, 0x6b, 0xea, 0x49, 0xc6, 0x81, 0xf7, 0x09, + 0xd2, 0xa2, 0x4e, 0x71, 0xce, 0x39, 0xf1, 0xcf, 0xe3, 0xe8, 0x93, 0xb8, 0x16, 0x69, 0xf6, 0xfc, + 0x2d, 0x79, 0xd6, 0xe7, 0xbf, 0x24, 0x49, 0x92, 0x5e, 0xd3, 0xbd, 0xe6, 0x79, 0x33, 0xdd, 0xbf, + 0x32, 0x97, 0xfc, 0xdb, 0xe4, 0x38, 0xc8, 0x3d, 0xca, 0xb0, 0x7e, 0x1b, 0xcd, 0x7e, 0xd7, 0xf4, + 0xdf, 0x53, 0x97, 0x5a, 0x7b, 0xbe, 0x8e, 0xdf, 0x63, 0x0e, 0x35, 0x66, 0x32, 0x1b, 0xb3, 0x5e, + 0x23, 0xe3, 0xdf, 0xc7, 0x36, 0xf2, 0x77, 0xfe, 0xe8, 0x37, 0xff, 0xd2, 0x58, 0x08, 0xe3, 0x26, + 0x7d, 0xfd, 0x11, 0x32, 0x9f, 0xa3, 0x76, 0xc4, 0x7f, 0x3c, 0x66, 0xdb, 0x97, 0xd2, 0x1b, 0x7d, + 0x9f, 0x5d, 0x6b, 0x96, 0xd6, 0xa8, 0x5d, 0x73, 0xec, 0x6c, 0xcc, 0x69, 0x96, 0xe7, 0x4b, 0x31, + 0x5f, 0x96, 0x73, 0x7f, 0x5c, 0x97, 0x31, 0x8f, 0x5c, 0xa7, 0xbe, 0x70, 0x4e, 0x8e, 0xb3, 0x67, + 0x1d, 0xc9, 0xb9, 0x57, 0xd6, 0x19, 0xc3, 0x65, 0x5b, 0xf6, 0x09, 0xcc, 0xdd, 0xac, 0xd9, 0xdf, + 0xcb, 0x3a, 0xf3, 0x99, 0xe3, 0x89, 0xb5, 0x8d, 0xf1, 0x66, 0xc6, 0x9a, 0xfa, 0xb8, 0x52, 0xed, + 0xef, 0xf7, 0x58, 0xdb, 0x32, 0xad, 0x2c, 0xbb, 0xfa, 0xcc, 0x98, 0xb1, 0x70, 0xad, 0xfc, 0x8e, + 0x7e, 0x4c, 0x61, 0xbc, 0x92, 0xed, 0xa4, 0xcb, 0x5c, 0xf7, 0x52, 0x9e, 0xaf, 0xd1, 0xe3, 0x92, + 0xf5, 0x6d, 0xd4, 0xfe, 0x19, 0x6b, 0xa3, 0xac, 0x99, 0x8f, 0xef, 0x46, 0x7d, 0x7f, 0x1d, 0x97, + 0xf3, 0xb8, 0xb5, 0xd0, 0x46, 0x18, 0xe7, 0x5b, 0xb3, 0xff, 0xd4, 0x7d, 0x51, 0x7e, 0xd9, 0xe7, + 0xf5, 0xff, 0x36, 0xe4, 0x3c, 0x04, 0x98, 0xcb, 0xa8, 0xcf, 0x1c, 0xab, 0xcc, 0xb2, 0xca, 0x34, + 0xfb, 0xb5, 0x46, 0xe5, 0xdb, 0xff, 0x13, 0xc1, 0x31, 0xa3, 0xed, 0xa3, 0xf8, 0x8f, 0xf2, 0x7c, + 0x8d, 0xfe, 0xfc, 0x3f, 0x27, 0xfe, 0x79, 0xfc, 0xec, 0xfd, 0x21, 0xcb, 0x89, 0x75, 0xe6, 0x66, + 0xf8, 0x24, 0x9e, 0xf9, 0x9f, 0x8c, 0x35, 0xfb, 0xcf, 0xbd, 0xaf, 0xfe, 0xcc, 0xcb, 0x39, 0x01, + 0x62, 0x3d, 0xba, 0xa7, 0x8c, 0x41, 0x2f, 0x9f, 0xfc, 0x3e, 0xbb, 0x56, 0xee, 0x1b, 0xcd, 0x33, + 0xb1, 0x3d, 0xdb, 0x33, 0xdf, 0xf3, 0xda, 0xa3, 0x3c, 0x5f, 0xeb, 0x16, 0xf1, 0xef, 0xf3, 0x28, + 0x15, 0x13, 0xf2, 0x94, 0xeb, 0x85, 0xbe, 0x8e, 0xfe, 0x93, 0xbe, 0x8c, 0xfa, 0xbc, 0x76, 0xff, + 0x39, 0xf7, 0xc5, 0x3e, 0xfa, 0x0d, 0xfe, 0x47, 0x40, 0x19, 0x53, 0xbf, 0xc0, 0xb3, 0xb6, 0xc7, + 0xbf, 0xf7, 0x39, 0x39, 0x47, 0x79, 0x2a, 0xfe, 0xfc, 0x7f, 0x22, 0xaf, 0x51, 0xfa, 0xf6, 0x1e, + 0xff, 0x59, 0x9e, 0xaf, 0x75, 0x2a, 0xfe, 0xf9, 0x6c, 0xa7, 0x1c, 0x7a, 0x3b, 0xc9, 0x7b, 0x2d, + 0xbd, 0x7f, 0xca, 0xd8, 0x10, 0x2f, 0x8e, 0xe5, 0x39, 0x76, 0xab, 0xfd, 0xa7, 0xca, 0x3d, 0xf7, + 0x51, 0x96, 0xbc, 0x5f, 0xe7, 0x73, 0x98, 0x3e, 0x9c, 0x63, 0x29, 0xe7, 0x2c, 0x6b, 0xe6, 0x3a, + 0x89, 0x67, 0xce, 0x51, 0x9e, 0xca, 0x07, 0xff, 0xad, 0x25, 0x86, 0xd4, 0x9d, 0x2c, 0x53, 0xe6, + 0xcc, 0x46, 0xf1, 0x1f, 0xe5, 0xf9, 0x9a, 0x77, 0x41, 0xe6, 0xdb, 0xf2, 0x9e, 0x32, 0x76, 0xb4, + 0xed, 0xbc, 0x57, 0xca, 0x63, 0xd4, 0x57, 0x71, 0x6c, 0xa6, 0xd7, 0xaf, 0xd7, 0xe3, 0xd9, 0xdb, + 0xc1, 0x9a, 0xfd, 0xec, 0x5b, 0xba, 0xaf, 0xdc, 0xc7, 0x7d, 0xf0, 0x2c, 0xe9, 0xf1, 0xcd, 0x67, + 0xf9, 0xe8, 0x37, 0x18, 0xe7, 0xf7, 0xf3, 0x46, 0xd7, 0xea, 0xfb, 0xa8, 0x03, 0x7d, 0x2e, 0x32, + 0xcb, 0x98, 0xe3, 0xf3, 0xda, 0xb3, 0x3c, 0xf7, 0xb6, 0x76, 0x0f, 0x4b, 0xe3, 0x05, 0x7a, 0x7e, + 0xc6, 0x5f, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, + 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, + 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, + 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, + 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0xd2, 0x05, 0xfe, 0x01, 0x2d, 0xdd, 0x66, 0xe0, 0x4b, + 0x82, 0x8b, 0xda, 0x00, 0x00, 0x01, 0x41, 0x6d, 0x6b, 0x42, 0x54, 0xfa, 0xce, 0xca, 0xfe, 0x03, + 0xef, 0x66, 0x90, 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, 0x00, 0x00, 0x00, 0x00, 0x78, 0x9c, 0xed, 0xd6, 0xd1, 0x89, 0x83, 0x50, 0x10, + 0x05, 0x50, 0x0b, 0xb1, 0x11, 0x0b, 0xb1, 0x10, 0x1b, 0xb1, 0x10, 0x0b, 0xb1, 0x11, 0x0b, 0x71, + 0xb9, 0x81, 0x81, 0x89, 0xd9, 0x25, 0xf9, 0x74, 0xc3, 0x39, 0xf0, 0x50, 0x67, 0xc6, 0xaf, 0xab, + 0x4f, 0xcf, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, + 0xe1, 0x38, 0x8e, 0x73, 0xdf, 0xf7, 0x97, 0x7a, 0x6a, 0xe9, 0xbd, 0x9b, 0xff, 0x6b, 0x8e, 0xfb, + 0x5b, 0xd7, 0xf5, 0x1c, 0xc7, 0xf1, 0x9c, 0xa6, 0xe9, 0x71, 0x4c, 0x8e, 0x59, 0xbd, 0x96, 0x99, + 0x9a, 0xad, 0x5a, 0xd6, 0xb2, 0x2c, 0x8f, 0xeb, 0xac, 0x61, 0x18, 0x7e, 0x7d, 0x86, 0xb8, 0xb7, + 0xe4, 0x58, 0x92, 0x6f, 0x32, 0x4c, 0xae, 0x95, 0x79, 0x9f, 0xa9, 0xfc, 0x4b, 0xcf, 0xfc, 0x7a, + 0x0f, 0xf7, 0x97, 0xec, 0x7a, 0x9e, 0x25, 0xb5, 0xfe, 0x2e, 0xd7, 0x75, 0xf2, 0xed, 0x19, 0x27, + 0xff, 0x72, 0xed, 0x71, 0x7f, 0xd9, 0xe7, 0x7b, 0xfe, 0xf5, 0x5d, 0x9f, 0xe7, 0xf9, 0x25, 0xff, + 0xf4, 0xe4, 0xff, 0x7d, 0x92, 0x6d, 0xed, 0xfb, 0x75, 0xbe, 0x6d, 0xdb, 0xd3, 0x3b, 0xdf, 0xf7, + 0x7f, 0xf9, 0x7f, 0x9f, 0xfa, 0x8f, 0xeb, 0xf9, 0xd5, 0x33, 0x90, 0x5e, 0xfd, 0xdb, 0xa7, 0x96, + 0x55, 0xfa, 0xde, 0x71, 0xed, 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, 0x7c, 0xe0, 0x07, 0xb1, 0x30, 0x85, 0x2e, 0x94, 0x02, 0x80, 0x2d, + 0x00, 0x00, 0x06, 0x62, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0x99, 0x5b, 0x6c, 0x1b, 0x55, + 0x1a, 0xc7, 0x7f, 0x33, 0xe3, 0x49, 0xd2, 0xc4, 0x69, 0x6e, 0xa5, 0xb5, 0x9b, 0xd8, 0x69, 0x1b, + 0xb9, 0xd0, 0x82, 0x68, 0x49, 0x05, 0xda, 0x36, 0x50, 0x6d, 0xb7, 0x55, 0x1f, 0x68, 0x25, 0x10, + 0x12, 0x2a, 0x20, 0xe0, 0x81, 0x8a, 0x19, 0xa0, 0x5c, 0xc4, 0x03, 0x82, 0xaa, 0x20, 0x40, 0xab, + 0x55, 0xf7, 0x01, 0x09, 0xa9, 0x82, 0x5d, 0xc6, 0xab, 0xec, 0x52, 0xed, 0xae, 0xd0, 0xae, 0x40, + 0x80, 0x2a, 0x10, 0xb4, 0x29, 0x48, 0x20, 0xa1, 0xb6, 0x24, 0x69, 0xa3, 0xa8, 0xa8, 0x17, 0xea, + 0x34, 0x8d, 0x1d, 0xd7, 0x4e, 0xd2, 0x92, 0x8b, 0xd3, 0x24, 0x9e, 0x0b, 0x0f, 0x33, 0xc6, 0xc6, + 0x49, 0x9c, 0xc4, 0x09, 0xb1, 0xf8, 0x4b, 0xb6, 0xce, 0x9c, 0x39, 0x67, 0xbe, 0xdf, 0xf9, 0xe6, + 0xcc, 0xb9, 0x7c, 0x47, 0xb0, 0x2c, 0x8b, 0xdf, 0x93, 0x5c, 0xf3, 0xa9, 0xac, 0xaa, 0xc1, 0xf5, + 0xc0, 0x93, 0xc0, 0x76, 0x60, 0x25, 0x50, 0xe6, 0x3c, 0x53, 0x74, 0x8a, 0x98, 0x80, 0x0e, 0x0c, + 0x03, 0x61, 0xe0, 0x5b, 0xe0, 0x7d, 0x4d, 0x53, 0x4e, 0xe7, 0x6b, 0x53, 0x98, 0xab, 0x87, 0x55, + 0x35, 0x58, 0x01, 0xbc, 0x0c, 0x3c, 0x0c, 0xf8, 0x00, 0x21, 0xfb, 0x99, 0x59, 0xd7, 0xd9, 0x06, + 0x0c, 0xe0, 0x0a, 0x70, 0x18, 0x78, 0x4f, 0xd3, 0x94, 0xbe, 0xb9, 0xd8, 0x9f, 0x13, 0xb0, 0xaa, + 0x06, 0x5f, 0x03, 0x5e, 0x02, 0xdc, 0x0e, 0x98, 0x25, 0x08, 0x24, 0x64, 0x59, 0x0a, 0x2f, 0x5d, + 0x5a, 0x1c, 0xf6, 0x78, 0xca, 0xa2, 0x5e, 0x6f, 0xf9, 0xb5, 0xe5, 0xcb, 0xcb, 0x12, 0x92, 0x24, + 0x9a, 0xfd, 0xfd, 0xa3, 0xa5, 0x3d, 0x3d, 0x43, 0xcb, 0x7a, 0x7b, 0x87, 0xea, 0x86, 0x86, 0x26, + 0xea, 0x74, 0xdd, 0xf0, 0x58, 0x16, 0xe5, 0x19, 0x0d, 0xe9, 0x03, 0xfe, 0x06, 0xfc, 0x55, 0xd3, + 0x94, 0x89, 0x05, 0x03, 0x56, 0xd5, 0xe0, 0x76, 0xe0, 0x10, 0x70, 0x0b, 0xf6, 0xeb, 0xd6, 0x65, + 0x59, 0xec, 0x5e, 0xbb, 0xb6, 0xe6, 0xbb, 0xa6, 0x26, 0x7f, 0x68, 0xb6, 0x0d, 0xbe, 0x71, 0x23, + 0xe9, 0x6a, 0x6b, 0x8b, 0xd6, 0x5f, 0xb8, 0x30, 0xd0, 0xa4, 0xeb, 0x66, 0x2d, 0x50, 0x84, 0xdd, + 0x6d, 0x7e, 0x00, 0xee, 0xd3, 0x34, 0x65, 0xc6, 0x67, 0xe5, 0x04, 0x56, 0xd5, 0xa0, 0x0c, 0xec, + 0x03, 0x5e, 0x05, 0xaa, 0x01, 0x4b, 0x96, 0xc5, 0xcb, 0x77, 0xdf, 0xed, 0xff, 0x3c, 0x10, 0xa8, + 0x19, 0x98, 0x2d, 0xe8, 0x54, 0x3a, 0x7b, 0x36, 0xbe, 0xe2, 0xc4, 0x89, 0xc8, 0xbd, 0x86, 0x61, + 0xfa, 0x9c, 0xac, 0x6b, 0xc0, 0x01, 0x4d, 0x53, 0xb4, 0xf9, 0x00, 0xbf, 0x03, 0x3c, 0x05, 0x88, + 0x82, 0x20, 0x5c, 0x5f, 0xbd, 0xba, 0xf2, 0xab, 0xa6, 0x26, 0xdf, 0xf9, 0x25, 0x4b, 0x64, 0x7d, + 0x3e, 0xb0, 0x29, 0x25, 0x93, 0xa6, 0x78, 0xf4, 0xe8, 0x8f, 0x1b, 0x23, 0x91, 0xe1, 0x1d, 0x40, + 0x09, 0x30, 0x0e, 0xbc, 0x07, 0xbc, 0x3c, 0x5d, 0x17, 0x99, 0x76, 0x94, 0x50, 0xd5, 0xe0, 0x41, + 0x40, 0x05, 0x24, 0x51, 0x14, 0x62, 0x4d, 0x4d, 0xbe, 0x8f, 0xd6, 0xad, 0xbb, 0x69, 0x4e, 0x1f, + 0xc8, 0x4c, 0x92, 0x65, 0xd1, 0xdc, 0xb5, 0x6b, 0x6d, 0x7b, 0x67, 0x67, 0x3c, 0x72, 0xf2, 0x64, + 0xf8, 0x3e, 0xd3, 0xb4, 0xbc, 0xc0, 0xf3, 0x40, 0x02, 0xfb, 0xad, 0x4e, 0xd2, 0x94, 0x1e, 0x56, + 0xd5, 0xe0, 0x3e, 0xe0, 0x6d, 0xc0, 0xe5, 0x72, 0x89, 0x97, 0xf7, 0xec, 0xb9, 0xf5, 0x83, 0xb2, + 0xb2, 0xa2, 0xe4, 0x42, 0xc2, 0x66, 0x2b, 0x1e, 0x4f, 0x94, 0x1e, 0x39, 0x72, 0xfe, 0x61, 0xc3, + 0xb0, 0x6a, 0x81, 0x51, 0x60, 0x9f, 0xa6, 0x29, 0x87, 0x67, 0x04, 0x56, 0xd5, 0xe0, 0x5d, 0xc0, + 0x37, 0x40, 0xb1, 0x28, 0x0a, 0x57, 0x77, 0xee, 0x6c, 0xf8, 0xc0, 0xef, 0xaf, 0x18, 0xfa, 0x2d, + 0x61, 0x53, 0xea, 0xee, 0x1e, 0xac, 0x68, 0x69, 0xb9, 0xf4, 0xa0, 0x03, 0x3d, 0x06, 0x04, 0x34, + 0x4d, 0x09, 0x67, 0x96, 0x11, 0x33, 0x2f, 0x54, 0x35, 0xe8, 0x06, 0x9a, 0xb1, 0xbf, 0xde, 0xd1, + 0xdd, 0xbb, 0x03, 0xff, 0x59, 0x2c, 0x58, 0x80, 0xfa, 0xfa, 0x8a, 0xc1, 0xad, 0x5b, 0xeb, 0x3f, + 0xc6, 0x1e, 0xab, 0x8b, 0x81, 0x4f, 0x1c, 0xa6, 0xa9, 0x81, 0x81, 0x17, 0x81, 0xf5, 0x80, 0xb9, + 0x66, 0x4d, 0xd5, 0x67, 0x1e, 0x4f, 0x79, 0x22, 0x1f, 0xc3, 0xcd, 0xcd, 0xed, 0xfb, 0x9b, 0x9b, + 0xdb, 0xf7, 0xe7, 0x53, 0x37, 0x10, 0xa8, 0x19, 0x58, 0xb5, 0xaa, 0xf2, 0x53, 0xec, 0xe1, 0xee, + 0x0e, 0xe0, 0x99, 0x5c, 0xc0, 0x2f, 0x00, 0x42, 0x51, 0x91, 0x74, 0x61, 0xc7, 0x8e, 0x35, 0x3f, + 0xe4, 0x63, 0x10, 0xc0, 0x30, 0xac, 0x22, 0xc3, 0xb0, 0x8a, 0xf2, 0xad, 0xbf, 0x73, 0x67, 0x43, + 0xa7, 0xcb, 0x25, 0x86, 0xb1, 0x27, 0xa7, 0x67, 0x33, 0xbd, 0xfc, 0x0b, 0xb0, 0xaa, 0x06, 0x0f, + 0xe0, 0x8c, 0xb5, 0x9b, 0x37, 0xfb, 0xbe, 0xca, 0xd7, 0xd8, 0x42, 0x69, 0xd3, 0x26, 0xef, 0x97, + 0xd8, 0x5d, 0xa3, 0x16, 0x78, 0x2c, 0x95, 0x9f, 0xe9, 0x61, 0x15, 0x10, 0x64, 0x59, 0xec, 0xba, + 0xf9, 0xe6, 0x9a, 0xfe, 0x45, 0xe6, 0x9b, 0xa4, 0x0d, 0x1b, 0x3c, 0x51, 0x49, 0x12, 0xa3, 0x38, + 0x5e, 0x4e, 0xe5, 0x8b, 0x00, 0xaa, 0x1a, 0xbc, 0x15, 0xbb, 0x25, 0x56, 0x43, 0x43, 0xf5, 0xc9, + 0xc2, 0x20, 0x4e, 0x96, 0xdf, 0xbf, 0xf4, 0x94, 0x93, 0x6c, 0x50, 0xd5, 0xe0, 0x1a, 0x48, 0x7b, + 0xf8, 0x69, 0xec, 0x96, 0x8c, 0x6f, 0xde, 0xec, 0xbb, 0x54, 0x08, 0xb8, 0xa9, 0x74, 0xe7, 0x9d, + 0xb5, 0x17, 0xb1, 0x67, 0x3f, 0x19, 0xd8, 0x03, 0x69, 0xe0, 0xed, 0x00, 0x2e, 0x97, 0x78, 0x55, + 0x96, 0x45, 0xb3, 0x30, 0x78, 0x93, 0x55, 0x59, 0x59, 0x32, 0x2e, 0x49, 0x62, 0x1f, 0xb6, 0x33, + 0xef, 0x87, 0x34, 0xf0, 0x0a, 0x40, 0x28, 0x2f, 0x2f, 0xbe, 0x5c, 0x18, 0xb4, 0xe9, 0x55, 0x5a, + 0x2a, 0x47, 0x9c, 0xe4, 0x2a, 0x48, 0x03, 0xbb, 0x01, 0x56, 0xae, 0x74, 0xf7, 0x14, 0x80, 0x29, + 0xa7, 0xaa, 0xab, 0x97, 0x44, 0x9d, 0x64, 0x19, 0xa4, 0x81, 0x25, 0x00, 0xbf, 0xbf, 0xa2, 0xe0, + 0xa3, 0x43, 0xb6, 0x3c, 0x1e, 0x77, 0x6a, 0xc1, 0x55, 0x04, 0xe9, 0xd5, 0x9a, 0x00, 0x50, 0x5e, + 0x5e, 0x3c, 0x9e, 0xab, 0x72, 0x73, 0x73, 0xfb, 0xfe, 0xb9, 0x4c, 0x08, 0xc1, 0x60, 0xdb, 0xeb, + 0xb9, 0xee, 0x4b, 0x92, 0x30, 0xb1, 0x77, 0x6f, 0xe3, 0xc1, 0x5c, 0x65, 0xbc, 0x5e, 0xf7, 0xa0, + 0x93, 0x14, 0x7f, 0xf9, 0xc3, 0x01, 0x2e, 0x29, 0x71, 0x2d, 0xc8, 0x3a, 0x77, 0x21, 0x25, 0xcb, + 0x92, 0xe1, 0x24, 0x05, 0x48, 0x7b, 0x58, 0x07, 0xa4, 0xfe, 0xfe, 0xd1, 0xd2, 0xba, 0xba, 0xa5, + 0xc3, 0xd3, 0x55, 0x9e, 0xc9, 0x1b, 0x29, 0xa5, 0x3c, 0xab, 0x28, 0x9b, 0xde, 0x9c, 0x07, 0x2b, + 0x00, 0xf1, 0x78, 0x22, 0x35, 0x2d, 0x9b, 0x90, 0xf6, 0xb0, 0x0e, 0x58, 0x3d, 0x3d, 0x43, 0xcb, + 0xe6, 0x6b, 0x60, 0xa1, 0x75, 0xe5, 0xca, 0xa0, 0xc7, 0x49, 0xea, 0x90, 0x06, 0x1e, 0x01, 0x08, + 0x87, 0x07, 0xeb, 0x0b, 0x01, 0x95, 0x4b, 0x7d, 0x7d, 0x09, 0xbf, 0x93, 0xbc, 0x06, 0x69, 0xe0, + 0x1e, 0x80, 0x91, 0x91, 0x89, 0xba, 0x42, 0x40, 0xe5, 0xd2, 0xe8, 0x68, 0x32, 0x05, 0x7c, 0x11, + 0xd2, 0xc0, 0x2d, 0x00, 0xba, 0x6e, 0x2e, 0x4f, 0x24, 0x92, 0xf3, 0x8a, 0x06, 0x2d, 0xb4, 0x4c, + 0xd3, 0xaa, 0x71, 0x92, 0xff, 0x83, 0x34, 0xf0, 0x61, 0xc0, 0xb0, 0x2c, 0xdc, 0xdf, 0x7f, 0x1f, + 0x69, 0x28, 0x08, 0xd9, 0x14, 0xfa, 0xe2, 0x8b, 0x1f, 0x6f, 0xc7, 0x5e, 0x47, 0x98, 0xc0, 0xbf, + 0xc1, 0x01, 0xd6, 0x34, 0xe5, 0x2c, 0x70, 0x09, 0x20, 0x14, 0xba, 0x7e, 0x57, 0xa1, 0x00, 0x33, + 0x95, 0x4c, 0x9a, 0x62, 0x38, 0x3c, 0xf4, 0x07, 0xe7, 0xf2, 0xa2, 0xa6, 0x29, 0x23, 0xf0, 0xeb, + 0xf5, 0xf0, 0x3f, 0x01, 0x4b, 0xd7, 0x4d, 0x5f, 0x47, 0x47, 0xcc, 0xbb, 0xe8, 0x84, 0x59, 0x3a, + 0x73, 0x26, 0x5a, 0x67, 0x9a, 0xd6, 0x0a, 0x6c, 0xef, 0x1e, 0x4a, 0xe5, 0x67, 0x02, 0xbf, 0x8f, + 0x1d, 0xeb, 0x92, 0x5b, 0x5b, 0x23, 0xf7, 0xde, 0xb8, 0x91, 0x7f, 0x5f, 0x96, 0x24, 0x61, 0x42, + 0x92, 0x84, 0x59, 0xc5, 0xca, 0xa6, 0xd2, 0xd8, 0x98, 0x2e, 0x75, 0x76, 0xc6, 0xff, 0xe4, 0xf0, + 0xf5, 0x69, 0x9a, 0xf2, 0xf7, 0x49, 0xc0, 0x4e, 0x14, 0xf1, 0x2d, 0xc0, 0x32, 0x0c, 0xab, 0xf6, + 0xd8, 0xb1, 0x50, 0x63, 0xbe, 0x06, 0xf7, 0xee, 0x6d, 0x3c, 0x38, 0xdb, 0x49, 0x66, 0x2a, 0xb5, + 0xb4, 0x84, 0x36, 0xea, 0xba, 0xe9, 0xc7, 0x1e, 0x7b, 0xff, 0x9c, 0x79, 0x2f, 0x7b, 0x13, 0x7a, + 0x08, 0xe8, 0x00, 0x88, 0xc5, 0x46, 0xee, 0x39, 0x7d, 0x3a, 0xba, 0x32, 0x5f, 0xa3, 0xf9, 0xaa, + 0xb5, 0xb5, 0xb7, 0x2e, 0x1a, 0x1d, 0xfe, 0x23, 0x76, 0x74, 0xf3, 0x84, 0xa6, 0x29, 0xef, 0x66, + 0xde, 0xff, 0x15, 0xb0, 0x13, 0xcf, 0x7a, 0x1c, 0x88, 0x59, 0x16, 0x65, 0x6d, 0x6d, 0xd1, 0xdd, + 0xf1, 0x78, 0xa2, 0x74, 0xb1, 0x60, 0x43, 0xa1, 0xeb, 0x55, 0xed, 0xed, 0xd1, 0x87, 0x2c, 0x0b, + 0x37, 0x70, 0x15, 0x78, 0x2e, 0xbb, 0x4c, 0xb6, 0x87, 0xd1, 0x34, 0xa5, 0x13, 0x78, 0x05, 0x18, + 0x37, 0x4d, 0xcb, 0x7b, 0xe4, 0xc8, 0xf9, 0x47, 0xba, 0xba, 0xae, 0x57, 0x2e, 0x06, 0xec, 0xd7, + 0x5f, 0x77, 0x3d, 0x80, 0xbd, 0xee, 0x35, 0xb0, 0x03, 0x82, 0x67, 0xb2, 0xcb, 0x4d, 0x1b, 0xbd, + 0x54, 0xd5, 0xe0, 0x3f, 0x80, 0x27, 0x00, 0x41, 0x14, 0x85, 0xd8, 0x96, 0x2d, 0xbe, 0x8f, 0xd7, + 0xaf, 0xbf, 0x29, 0xfe, 0x5b, 0xc0, 0x76, 0x74, 0xc4, 0xbc, 0xa7, 0x4e, 0x85, 0x1f, 0x71, 0x3c, + 0x9b, 0x70, 0x60, 0xdf, 0x9d, 0xaa, 0xec, 0x4c, 0xe1, 0xd6, 0x03, 0xc0, 0x7e, 0x9c, 0x56, 0x07, + 0x02, 0xd5, 0x1f, 0x6e, 0xdb, 0xb6, 0xfa, 0xdc, 0x42, 0x81, 0x8e, 0x8d, 0xe9, 0x52, 0x4b, 0x4b, + 0x68, 0x63, 0x6f, 0xef, 0xf0, 0x36, 0xd2, 0x9e, 0x7d, 0x61, 0x3a, 0xd8, 0x19, 0x81, 0x1d, 0xe8, + 0x07, 0xb1, 0x67, 0xc2, 0x12, 0xc0, 0x94, 0x65, 0xf1, 0x72, 0x63, 0xa3, 0xf7, 0xf8, 0x86, 0x0d, + 0x9e, 0x68, 0xce, 0x8a, 0x39, 0x34, 0x31, 0x61, 0x48, 0xad, 0xad, 0x91, 0xfa, 0x73, 0xe7, 0x06, + 0xb6, 0x3a, 0xa3, 0x01, 0x40, 0x0c, 0x78, 0x56, 0xd3, 0x94, 0x8f, 0x72, 0xd5, 0x9d, 0xed, 0x91, + 0x41, 0x1d, 0xf0, 0x19, 0x70, 0x1b, 0xce, 0xd9, 0x86, 0x24, 0x09, 0xbd, 0x1e, 0x4f, 0xf9, 0xe9, + 0x2d, 0x5b, 0x7c, 0x67, 0xab, 0xaa, 0x4a, 0x72, 0xee, 0x54, 0x32, 0x75, 0xfc, 0x78, 0x68, 0x5d, + 0x57, 0xd7, 0x4f, 0xf7, 0x98, 0xa6, 0x95, 0x5a, 0x36, 0x1a, 0x40, 0x3b, 0xf0, 0xd4, 0x6c, 0x4e, + 0x97, 0x66, 0x7d, 0x28, 0xe3, 0x9c, 0x1e, 0xa9, 0xd8, 0xf1, 0x37, 0x0f, 0xe9, 0xd3, 0xa2, 0x71, + 0x97, 0x4b, 0x8c, 0x95, 0x96, 0xca, 0x91, 0xaa, 0xaa, 0x25, 0x31, 0x8f, 0xc7, 0xdd, 0xe7, 0xf5, + 0xba, 0x07, 0x65, 0x59, 0x34, 0xe3, 0xf1, 0x51, 0x77, 0x77, 0xf7, 0x4f, 0xde, 0x78, 0x3c, 0x51, + 0x3f, 0x36, 0xa6, 0xd7, 0x9a, 0xa6, 0xb5, 0x8c, 0xf4, 0xa6, 0xc1, 0x04, 0x7a, 0x81, 0x37, 0x34, + 0x4d, 0x69, 0x9e, 0x6d, 0x83, 0xe7, 0x7c, 0xec, 0xe5, 0xc0, 0x3f, 0x8a, 0x7d, 0xf4, 0x15, 0xc0, + 0xd9, 0x1c, 0xce, 0x41, 0x16, 0xd0, 0x05, 0xfc, 0x45, 0xd3, 0x94, 0x7f, 0xcd, 0xd5, 0x76, 0x5e, + 0xc0, 0x29, 0xa9, 0x6a, 0x30, 0x00, 0x3c, 0x04, 0xec, 0xc2, 0x8e, 0x1b, 0xb8, 0xb1, 0x1b, 0x20, + 0x3a, 0x3f, 0x13, 0x48, 0x02, 0x03, 0xc0, 0x79, 0xe0, 0xbf, 0xc0, 0xff, 0x53, 0x0b, 0x99, 0x7c, + 0x34, 0x2f, 0xe0, 0x42, 0xe8, 0x67, 0x32, 0x53, 0x67, 0xa6, 0x31, 0xb3, 0xd3, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +const int crosshair-1_size = sizeof(crosshair-1); diff --git a/source/ngc/png/crosshair-1.h b/source/ngc/png/crosshair-1.h new file mode 100644 index 0000000..908fe27 --- /dev/null +++ b/source/ngc/png/crosshair-1.h @@ -0,0 +1,14 @@ +/* + This file was autogenerated by raw2c. +Visit http://www.devkitpro.org +*/ + +//--------------------------------------------------------------------------------- +#ifndef _crosshair-1_h_ +#define _crosshair-1_h_ +//--------------------------------------------------------------------------------- +extern const unsigned char crosshair-1[]; +extern const int crosshair-1_size; +//--------------------------------------------------------------------------------- +#endif //_crosshair-1_h_ +//--------------------------------------------------------------------------------- diff --git a/source/ngc/png/crosshair-1.png b/source/ngc/png/crosshair-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b57ce592708acd715872b6f6a0dfc9bce2c8524f GIT binary patch literal 29674 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 literal 0 HcmV?d00001 diff --git a/source/ngc/unzip.c b/source/ngc/unzip.c index e7941a1..068506b 100644 --- a/source/ngc/unzip.c +++ b/source/ngc/unzip.c @@ -1,190 +1,180 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Nintendo Gamecube Zip Support - * - * Only partial support is included, in that only the first file within the archive - * is considered to be a Genesis ROM image. - ***************************************************************************/ -#include -#include -#include "shared.h" -#include "dvd.h" -#include "font.h" - -extern sd_file *filehandle; -extern u8 UseSDCARD; - -/* - * PKWare Zip Header - adopted into zip standard - */ -#define PKZIPID 0x504b0304 -#define MAXROM 0x500000 -#define ZIPCHUNK 2048 - -/* - * Zip file header definition - */ -typedef struct -{ - unsigned int zipid __attribute__ ((__packed__)); // 0x04034b50 - unsigned short zipversion __attribute__ ((__packed__)); - unsigned short zipflags __attribute__ ((__packed__)); - unsigned short compressionMethod __attribute__ ((__packed__)); - unsigned short lastmodtime __attribute__ ((__packed__)); - unsigned short lastmoddate __attribute__ ((__packed__)); - unsigned int crc32 __attribute__ ((__packed__)); - unsigned int compressedSize __attribute__ ((__packed__)); - unsigned int uncompressedSize __attribute__ ((__packed__)); - unsigned short filenameLength __attribute__ ((__packed__)); - unsigned short extraDataLength __attribute__ ((__packed__)); -} PKZIPHEADER; - -/* - * Zip files are stored little endian - * Support functions for short and int types - */ -static inline u32 FLIP32 (u32 b) -{ - unsigned int c; - c = (b & 0xff000000) >> 24; - c |= (b & 0xff0000) >> 8; - c |= (b & 0xff00) << 8; - c |= (b & 0xff) << 24; - return c; -} - -static inline u16 FLIP16 (u16 b) -{ - u16 c; - c = (b & 0xff00) >> 8; - c |= (b & 0xff) << 8; - return c; -} - -/**************************************************************************** - * IsZipFile - * - * Returns TRUE when PKZIPID is first four characters of buffer - ****************************************************************************/ -int IsZipFile (char *buffer) -{ - unsigned int *check; - check = (unsigned int *) buffer; - if (check[0] == PKZIPID) return 1; - return 0; -} - - /***************************************************************************** - * UnZipBuffer - * - * It should be noted that there is a limit of 5MB total size for any ROM - ******************************************************************************/ -int UnZipBuffer (unsigned char *outbuffer, u64 discoffset, int length) -{ - PKZIPHEADER pkzip; - int zipoffset = 0; - int zipchunk = 0; - char out[ZIPCHUNK]; - z_stream zs; - int res; - int bufferoffset = 0; - int have = 0; - char readbuffer[2048]; - char msg[128]; - - /*** Read Zip Header ***/ - if ( UseSDCARD ) - { - SDCARD_SeekFile(filehandle, 0, SDCARD_SEEK_SET); - SDCARD_ReadFile(filehandle, &readbuffer, 2048); - } - else dvd_read (&readbuffer, 2048, discoffset); - - /*** Copy PKZip header to local, used as info ***/ - memcpy (&pkzip, &readbuffer, sizeof (PKZIPHEADER)); - - sprintf (msg, "Unzipping %d bytes ... Wait", FLIP32 (pkzip.uncompressedSize)); - ShowAction (msg); - - /*** Prepare the zip stream ***/ - memset (&zs, 0, sizeof (z_stream)); - zs.zalloc = Z_NULL; - zs.zfree = Z_NULL; - zs.opaque = Z_NULL; - zs.avail_in = 0; - zs.next_in = Z_NULL; - res = inflateInit2 (&zs, -MAX_WBITS); - - if (res != Z_OK) return 0; - - /*** Set ZipChunk for first pass ***/ - zipoffset = (sizeof (PKZIPHEADER) + FLIP16 (pkzip.filenameLength) + FLIP16 (pkzip.extraDataLength)); - zipchunk = ZIPCHUNK - zipoffset; - - /*** Now do it! ***/ - do - { - zs.avail_in = zipchunk; - zs.next_in = (Bytef *) & readbuffer[zipoffset]; - - /*** Now inflate until input buffer is exhausted ***/ - do - { - zs.avail_out = ZIPCHUNK; - zs.next_out = (Bytef *) & out; - res = inflate (&zs, Z_NO_FLUSH); - - if (res == Z_MEM_ERROR) - { - inflateEnd (&zs); - return 0; - } - - have = ZIPCHUNK - zs.avail_out; - if (have) - { - /*** Copy to normal block buffer ***/ - memcpy (&outbuffer[bufferoffset], &out, have); - bufferoffset += have; - } - } - while (zs.avail_out == 0); - - /*** Readup the next 2k block ***/ - zipoffset = 0; - zipchunk = ZIPCHUNK; - discoffset += 2048; - - if (UseSDCARD) SDCARD_ReadFile(filehandle, &readbuffer, 2048); - else dvd_read (&readbuffer, 2048, discoffset); - } - while (res != Z_STREAM_END); - - inflateEnd (&zs); - - if ( UseSDCARD ) SDCARD_CloseFile(filehandle); - - if (res == Z_STREAM_END) - { - if (FLIP32 (pkzip.uncompressedSize) == (u32) bufferoffset) return bufferoffset; - else return FLIP32 (pkzip.uncompressedSize); - } - - return 0; -} +/****************************************************************************** + * + * Nintendo Gamecube Zip Support + * + * Only partial support is included, in that only the first file within the archive + * is considered to be a ROM image. + ***************************************************************************/ +#include "shared.h" +#include "dvd.h" +#include "font.h" +#include + +/* SDCARD File access */ +extern FILE *sdfile; + +/* + * PKWare Zip Header - adopted into zip standard + */ +#define PKZIPID 0x504b0304 +#define MAXROM 0x500000 +#define ZIPCHUNK 2048 + +/* + * Zip file header definition + */ +typedef struct +{ + unsigned int zipid __attribute__ ((__packed__)); // 0x04034b50 + unsigned short zipversion __attribute__ ((__packed__)); + unsigned short zipflags __attribute__ ((__packed__)); + unsigned short compressionMethod __attribute__ ((__packed__)); + unsigned short lastmodtime __attribute__ ((__packed__)); + unsigned short lastmoddate __attribute__ ((__packed__)); + unsigned int crc32 __attribute__ ((__packed__)); + unsigned int compressedSize __attribute__ ((__packed__)); + unsigned int uncompressedSize __attribute__ ((__packed__)); + unsigned short filenameLength __attribute__ ((__packed__)); + unsigned short extraDataLength __attribute__ ((__packed__)); +} PKZIPHEADER; + +/* + * Zip files are stored little endian + * Support functions for short and int types + */ +static inline u32 FLIP32 (u32 b) +{ + unsigned int c; + c = (b & 0xff000000) >> 24; + c |= (b & 0xff0000) >> 8; + c |= (b & 0xff00) << 8; + c |= (b & 0xff) << 24; + return c; +} + +static inline u16 FLIP16 (u16 b) +{ + u16 c; + c = (b & 0xff00) >> 8; + c |= (b & 0xff) << 8; + return c; +} + +/**************************************************************************** + * IsZipFile + * + * Returns TRUE when PKZIPID is first four characters of buffer + ****************************************************************************/ +int IsZipFile (char *buffer) +{ + unsigned int *check; + check = (unsigned int *) buffer; + if (check[0] == PKZIPID) return 1; + return 0; +} + + /***************************************************************************** + * UnZipBuffer + * + * It should be noted that there is a limit of 5MB total size for any ROM + ******************************************************************************/ +int UnZipBuffer (unsigned char *outbuffer, u64 discoffset, int length, u8 UseSDCARD) +{ + PKZIPHEADER pkzip; + int zipoffset = 0; + int zipchunk = 0; + char out[ZIPCHUNK]; + z_stream zs; + int res; + int bufferoffset = 0; + int have = 0; + char readbuffer[2048]; + char msg[128]; + + /*** Read Zip Header ***/ + if ( UseSDCARD ) + { + fseek(sdfile, 0, SEEK_SET); + fread(readbuffer, 1, 2048, sdfile); + } + else + { + dvd_read (&readbuffer, 2048, discoffset); + } + + /*** Copy PKZip header to local, used as info ***/ + memcpy (&pkzip, &readbuffer, sizeof (PKZIPHEADER)); + + sprintf (msg, "Unzipping %d bytes ... Wait", FLIP32 (pkzip.uncompressedSize)); + ShowAction (msg); + + /*** Prepare the zip stream ***/ + memset (&zs, 0, sizeof (z_stream)); + zs.zalloc = Z_NULL; + zs.zfree = Z_NULL; + zs.opaque = Z_NULL; + zs.avail_in = 0; + zs.next_in = Z_NULL; + res = inflateInit2 (&zs, -MAX_WBITS); + + if (res != Z_OK) return 0; + + /*** Set ZipChunk for first pass ***/ + zipoffset = (sizeof (PKZIPHEADER) + FLIP16 (pkzip.filenameLength) + FLIP16 (pkzip.extraDataLength)); + zipchunk = ZIPCHUNK - zipoffset; + + /*** Now do it! ***/ + do + { + zs.avail_in = zipchunk; + zs.next_in = (Bytef *) & readbuffer[zipoffset]; + + /*** Now inflate until input buffer is exhausted ***/ + do + { + zs.avail_out = ZIPCHUNK; + zs.next_out = (Bytef *) & out; + res = inflate (&zs, Z_NO_FLUSH); + + if (res == Z_MEM_ERROR) + { + inflateEnd (&zs); + return 0; + } + + have = ZIPCHUNK - zs.avail_out; + if (have) + { + /*** Copy to normal block buffer ***/ + memcpy (&outbuffer[bufferoffset], &out, have); + bufferoffset += have; + } + } + while (zs.avail_out == 0); + + /*** Readup the next 2k block ***/ + zipoffset = 0; + zipchunk = ZIPCHUNK; + + if (UseSDCARD) + { + fread(readbuffer, 1, 2048, sdfile); + } + else + { + discoffset += 2048; + dvd_read (&readbuffer, 2048, discoffset); + } + } + while (res != Z_STREAM_END); + + inflateEnd (&zs); + + if (res == Z_STREAM_END) + { + if (FLIP32 (pkzip.uncompressedSize) == (u32) bufferoffset) return bufferoffset; + else return FLIP32 (pkzip.uncompressedSize); + } + + return 0; +} diff --git a/source/ngc/unzip.c.new b/source/ngc/unzip.c.new deleted file mode 100644 index a629279..0000000 --- a/source/ngc/unzip.c.new +++ /dev/null @@ -1,193 +0,0 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Nintendo Gamecube Zip Support - * - * Only partial support is included, in that only the first file within the archive - * is considered to be a Genesis ROM image. - ***************************************************************************/ -#include -#include -#include "shared.h" -#include "dvd.h" -#include "font.h" -#include "diskio.h" -#include "vfat.h" - -extern VFATFS fs; -extern FSDIRENTRY f; -extern u8 UseSDCARD; - -/* - * PKWare Zip Header - adopted into zip standard - */ -#define PKZIPID 0x504b0304 -#define MAXROM 0x500000 -#define ZIPCHUNK 2048 - -/* - * Zip file header definition - */ -typedef struct -{ - unsigned int zipid __attribute__ ((__packed__)); // 0x04034b50 - unsigned short zipversion __attribute__ ((__packed__)); - unsigned short zipflags __attribute__ ((__packed__)); - unsigned short compressionMethod __attribute__ ((__packed__)); - unsigned short lastmodtime __attribute__ ((__packed__)); - unsigned short lastmoddate __attribute__ ((__packed__)); - unsigned int crc32 __attribute__ ((__packed__)); - unsigned int compressedSize __attribute__ ((__packed__)); - unsigned int uncompressedSize __attribute__ ((__packed__)); - unsigned short filenameLength __attribute__ ((__packed__)); - unsigned short extraDataLength __attribute__ ((__packed__)); -} PKZIPHEADER; - -/* - * Zip files are stored little endian - * Support functions for short and int types - */ -static inline u32 FLIP32 (u32 b) -{ - unsigned int c; - c = (b & 0xff000000) >> 24; - c |= (b & 0xff0000) >> 8; - c |= (b & 0xff00) << 8; - c |= (b & 0xff) << 24; - return c; -} - -static inline u16 FLIP16 (u16 b) -{ - u16 c; - c = (b & 0xff00) >> 8; - c |= (b & 0xff) << 8; - return c; -} - -/**************************************************************************** - * IsZipFile - * - * Returns TRUE when PKZIPID is first four characters of buffer - ****************************************************************************/ -int IsZipFile (char *buffer) -{ - unsigned int *check; - check = (unsigned int *) buffer; - if (check[0] == PKZIPID) return 1; - return 0; -} - - /***************************************************************************** - * UnZipBuffer - * - * It should be noted that there is a limit of 5MB total size for any ROM - ******************************************************************************/ -int UnZipBuffer (unsigned char *outbuffer, u64 discoffset, int length) -{ - PKZIPHEADER pkzip; - int zipoffset = 0; - int zipchunk = 0; - char out[ZIPCHUNK]; - z_stream zs; - int res; - int bufferoffset = 0; - int have = 0; - char readbuffer[2048]; - char msg[128]; - - /*** Read Zip Header ***/ - if ( UseSDCARD ) - { - VFAT_fseek(&f, 0, SEEK_SET); - VFAT_fread(&f, readbuffer, 2048); - } - else dvd_read (&readbuffer, 2048, discoffset); - - /*** Copy PKZip header to local, used as info ***/ - memcpy (&pkzip, &readbuffer, sizeof (PKZIPHEADER)); - - sprintf (msg, "Unzipping %d bytes ... Wait", FLIP32 (pkzip.uncompressedSize)); - ShowAction (msg); - - /*** Prepare the zip stream ***/ - memset (&zs, 0, sizeof (z_stream)); - zs.zalloc = Z_NULL; - zs.zfree = Z_NULL; - zs.opaque = Z_NULL; - zs.avail_in = 0; - zs.next_in = Z_NULL; - res = inflateInit2 (&zs, -MAX_WBITS); - - if (res != Z_OK) return 0; - - /*** Set ZipChunk for first pass ***/ - zipoffset = (sizeof (PKZIPHEADER) + FLIP16 (pkzip.filenameLength) + FLIP16 (pkzip.extraDataLength)); - zipchunk = ZIPCHUNK - zipoffset; - - /*** Now do it! ***/ - do - { - zs.avail_in = zipchunk; - zs.next_in = (Bytef *) & readbuffer[zipoffset]; - - /*** Now inflate until input buffer is exhausted ***/ - do - { - zs.avail_out = ZIPCHUNK; - zs.next_out = (Bytef *) & out; - res = inflate (&zs, Z_NO_FLUSH); - - if (res == Z_MEM_ERROR) - { - inflateEnd (&zs); - return 0; - } - - have = ZIPCHUNK - zs.avail_out; - if (have) - { - /*** Copy to normal block buffer ***/ - memcpy (&outbuffer[bufferoffset], &out, have); - bufferoffset += have; - } - } - while (zs.avail_out == 0); - - /*** Readup the next 2k block ***/ - zipoffset = 0; - zipchunk = ZIPCHUNK; - discoffset += 2048; - - if (UseSDCARD) VFAT_fread(&f, readbuffer, 2048); - else dvd_read (&readbuffer, 2048, discoffset); - } - while (res != Z_STREAM_END); - - inflateEnd (&zs); - - if ( UseSDCARD ) VFAT_fclose(&f); - - if (res == Z_STREAM_END) - { - if (FLIP32 (pkzip.uncompressedSize) == (u32) bufferoffset) return bufferoffset; - else return FLIP32 (pkzip.uncompressedSize); - } - - return 0; -} diff --git a/source/ngc/unzip.c.old b/source/ngc/unzip.c.old deleted file mode 100644 index e7941a1..0000000 --- a/source/ngc/unzip.c.old +++ /dev/null @@ -1,190 +0,0 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Nintendo Gamecube Zip Support - * - * Only partial support is included, in that only the first file within the archive - * is considered to be a Genesis ROM image. - ***************************************************************************/ -#include -#include -#include "shared.h" -#include "dvd.h" -#include "font.h" - -extern sd_file *filehandle; -extern u8 UseSDCARD; - -/* - * PKWare Zip Header - adopted into zip standard - */ -#define PKZIPID 0x504b0304 -#define MAXROM 0x500000 -#define ZIPCHUNK 2048 - -/* - * Zip file header definition - */ -typedef struct -{ - unsigned int zipid __attribute__ ((__packed__)); // 0x04034b50 - unsigned short zipversion __attribute__ ((__packed__)); - unsigned short zipflags __attribute__ ((__packed__)); - unsigned short compressionMethod __attribute__ ((__packed__)); - unsigned short lastmodtime __attribute__ ((__packed__)); - unsigned short lastmoddate __attribute__ ((__packed__)); - unsigned int crc32 __attribute__ ((__packed__)); - unsigned int compressedSize __attribute__ ((__packed__)); - unsigned int uncompressedSize __attribute__ ((__packed__)); - unsigned short filenameLength __attribute__ ((__packed__)); - unsigned short extraDataLength __attribute__ ((__packed__)); -} PKZIPHEADER; - -/* - * Zip files are stored little endian - * Support functions for short and int types - */ -static inline u32 FLIP32 (u32 b) -{ - unsigned int c; - c = (b & 0xff000000) >> 24; - c |= (b & 0xff0000) >> 8; - c |= (b & 0xff00) << 8; - c |= (b & 0xff) << 24; - return c; -} - -static inline u16 FLIP16 (u16 b) -{ - u16 c; - c = (b & 0xff00) >> 8; - c |= (b & 0xff) << 8; - return c; -} - -/**************************************************************************** - * IsZipFile - * - * Returns TRUE when PKZIPID is first four characters of buffer - ****************************************************************************/ -int IsZipFile (char *buffer) -{ - unsigned int *check; - check = (unsigned int *) buffer; - if (check[0] == PKZIPID) return 1; - return 0; -} - - /***************************************************************************** - * UnZipBuffer - * - * It should be noted that there is a limit of 5MB total size for any ROM - ******************************************************************************/ -int UnZipBuffer (unsigned char *outbuffer, u64 discoffset, int length) -{ - PKZIPHEADER pkzip; - int zipoffset = 0; - int zipchunk = 0; - char out[ZIPCHUNK]; - z_stream zs; - int res; - int bufferoffset = 0; - int have = 0; - char readbuffer[2048]; - char msg[128]; - - /*** Read Zip Header ***/ - if ( UseSDCARD ) - { - SDCARD_SeekFile(filehandle, 0, SDCARD_SEEK_SET); - SDCARD_ReadFile(filehandle, &readbuffer, 2048); - } - else dvd_read (&readbuffer, 2048, discoffset); - - /*** Copy PKZip header to local, used as info ***/ - memcpy (&pkzip, &readbuffer, sizeof (PKZIPHEADER)); - - sprintf (msg, "Unzipping %d bytes ... Wait", FLIP32 (pkzip.uncompressedSize)); - ShowAction (msg); - - /*** Prepare the zip stream ***/ - memset (&zs, 0, sizeof (z_stream)); - zs.zalloc = Z_NULL; - zs.zfree = Z_NULL; - zs.opaque = Z_NULL; - zs.avail_in = 0; - zs.next_in = Z_NULL; - res = inflateInit2 (&zs, -MAX_WBITS); - - if (res != Z_OK) return 0; - - /*** Set ZipChunk for first pass ***/ - zipoffset = (sizeof (PKZIPHEADER) + FLIP16 (pkzip.filenameLength) + FLIP16 (pkzip.extraDataLength)); - zipchunk = ZIPCHUNK - zipoffset; - - /*** Now do it! ***/ - do - { - zs.avail_in = zipchunk; - zs.next_in = (Bytef *) & readbuffer[zipoffset]; - - /*** Now inflate until input buffer is exhausted ***/ - do - { - zs.avail_out = ZIPCHUNK; - zs.next_out = (Bytef *) & out; - res = inflate (&zs, Z_NO_FLUSH); - - if (res == Z_MEM_ERROR) - { - inflateEnd (&zs); - return 0; - } - - have = ZIPCHUNK - zs.avail_out; - if (have) - { - /*** Copy to normal block buffer ***/ - memcpy (&outbuffer[bufferoffset], &out, have); - bufferoffset += have; - } - } - while (zs.avail_out == 0); - - /*** Readup the next 2k block ***/ - zipoffset = 0; - zipchunk = ZIPCHUNK; - discoffset += 2048; - - if (UseSDCARD) SDCARD_ReadFile(filehandle, &readbuffer, 2048); - else dvd_read (&readbuffer, 2048, discoffset); - } - while (res != Z_STREAM_END); - - inflateEnd (&zs); - - if ( UseSDCARD ) SDCARD_CloseFile(filehandle); - - if (res == Z_STREAM_END) - { - if (FLIP32 (pkzip.uncompressedSize) == (u32) bufferoffset) return bufferoffset; - else return FLIP32 (pkzip.uncompressedSize); - } - - return 0; -} diff --git a/source/ngc/unzip.h b/source/ngc/unzip.h index c033928..f84817a 100644 --- a/source/ngc/unzip.h +++ b/source/ngc/unzip.h @@ -1,26 +1,14 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Nintendo Gamecube Zip Support - * - * Only partial support is included, in that only the first file within the archive - * is considered to be a ROM image. - ***************************************************************************/ - -extern int IsZipFile (char *buffer); -int UnZipBuffer (unsigned char *outbuffer, u64 discoffset, int length); +/****************************************************************************** + * + * Nintendo Gamecube Zip Support + * + * Only partial support is included, in that only the first file within the archive + * is considered to be a ROM image. + ***************************************************************************/ +#ifndef _UNZIP_H_ +#define _UNZIP_H_ + +extern int IsZipFile (char *buffer); +int UnZipBuffer (unsigned char *outbuffer, u64 discoffset, int length, u8 UseSDCARD); + +#endif diff --git a/source/ngc/vfat/diskio.c b/source/ngc/vfat/diskio.c deleted file mode 100644 index 5775b85..0000000 --- a/source/ngc/vfat/diskio.c +++ /dev/null @@ -1,99 +0,0 @@ -/**************************************************************************** -* FAT16 - VFAT Support -* -* NOTE: Only supports FAT16 with Long File Names -* I have no interest in adding FAT32 -* -* Reference Documentation: -* -* FAT: General Overview of On-Disk Format -* Version 1.02 May 05, 1999 -* Microsoft Corporation -* -* FAT: General Overview of On-Disk Format -* Version 1.03 December 06, 2000 -* Microsoft Corporation -* -* This is targetted at MMC/SD cards. -* -* Copyright softdev 2007. All rights reserved. -* -* Diskio Module -* ------------- -* -* This module is almost identical to the one found in ChaN's TinyFAT FS. -* It's a logical abstration after all :) -* -* This covers stdio file on a SD image file -****************************************************************************/ -#include -#include -#include -#include -#include -#include "vfat.h" - -/* Not so public exports from card_io.c */ -#define MAX_DRIVE 2 -extern u8 g_CID[MAX_DRIVE][16]; -extern u8 g_CSD[MAX_DRIVE][16]; -extern u8 g_CardStatus[MAX_DRIVE][64]; -extern s32 card_initIO(s32 drv_no); -extern s32 card_readSector(s32 drv_no,u32 sector_no,u8 *buf,u32 len); -extern s32 card_writeSector(s32 drv_no,u32 sector_no,const void *buf,u32 len); -extern s32 card_readStatus(s32 drv_no); -#define CARDIO_ERROR_READY 0 - -/* End of not so public exports */ - -/**************************************************************************** -* DISKIO_Init -* -* Initialise communication with the disc -****************************************************************************/ -int DISKIO_Init( int drive ) -{ - int res; - - if ( drive < 0 || drive > 1 ) - return FS_ERR_PARAM; - - res = card_initIO( drive ); - - if ( res == CARDIO_ERROR_READY ) - return FS_SUCCESS; - - return FS_ERR_IO; - -} - -/**************************************************************************** -* DISKIO_ReadSectors -* -* Read sectors from the disc -****************************************************************************/ -int DISKIO_ReadSectors( int drive, void *buffer, int sector, int count ) -{ - int res = -1; - int i; - int bytes = 0; - - if ( drive != 0 && drive != 1 ) - return FS_ERR_PARAM; /* Must be 0 or 1 */ - - /* libOGC appears to only read in single sectors */ - for( i = 0; i < count; i++ ) - { - res = card_readSector( (int)drive, sector + i, buffer + bytes, SECTOR_SIZE); - if ( res != CARDIO_ERROR_READY ) - return FS_ERR_IO; - bytes += SECTOR_SIZE; - } - - if ( res == CARDIO_ERROR_READY ) - return FS_SUCCESS; - - return FS_ERR_IO; - -} - diff --git a/source/ngc/vfat/diskio.h b/source/ngc/vfat/diskio.h deleted file mode 100644 index d9e9313..0000000 --- a/source/ngc/vfat/diskio.h +++ /dev/null @@ -1,36 +0,0 @@ -/**************************************************************************** -* FAT16 - VFAT Support -* -* NOTE: Only supports FAT16 with Long File Names -* I have no interest in adding FAT32 -* -* Reference Documentation: -* -* FAT: General Overview of On-Disk Format -* Version 1.02 May 05, 1999 -* Microsoft Corporation -* -* FAT: General Overview of On-Disk Format -* Version 1.03 December 06, 2000 -* Microsoft Corporation -* -* This is targetted at MMC/SD cards. -* -* Copyright softdev 2007. All rights reserved. -* -* Diskio Module -* ------------- -* -* This module is almost identical to the one found in ChaN's TinyFAT FS. -* It's a logical abstration after all :) -* -* This covers stdio file on a SD image file -****************************************************************************/ -#ifndef __DISKIO__ -#define __DISKIO__ - -int DISKIO_Init( int drive ); -int DISKIO_ReadSectors( int drive, void *buffer, int sector, int count ); - -#endif - diff --git a/source/ngc/vfat/vfat.c b/source/ngc/vfat/vfat.c deleted file mode 100644 index 93ee705..0000000 --- a/source/ngc/vfat/vfat.c +++ /dev/null @@ -1,841 +0,0 @@ -/**************************************************************************** -* FAT16 - VFAT Support -* -* NOTE: Only supports FAT16 with Long File Names -* I have no interest in adding FAT32 -* -* Reference Documentation: -* -* FAT: General Overview of On-Disk Format -* Version 1.02 May 05, 1999 -* Microsoft Corporation -* -* FAT: General Overview of On-Disk Format -* Version 1.03 December 06, 2000 -* Microsoft Corporation -* -* This is targetted at MMC/SD cards. -* -* Copyright softdev 2007. All rights reserved. -* -* $Date: 2007-08-03 13:23:19 +0100 (Fri, 03 Aug 2007) $ -* $Rev: 3 $ -****************************************************************************/ -#include -#include -#include -#include -#include "vfat.h" -#include "diskio.h" - -static BYTE sector[SECTOR_SIZE]; /* Local sector buffer */ -static VFATFS *vfs[2]; /* VFAT Pointers for 2 drives */ - -#ifdef WORDS_BIGENDIAN -#define strcasecmp stricmp -#endif - -/** - * Z E R O S E C T O R / B I O S P A R A M E T E R B L O C K - * - * These functions take care of parsing the 0th sector/BPB - * Supports SuperFloppy Format and standard partitioning. - * - */ - -static int BPBCheck( BYTE *sector ) -{ - BPB16 *bpb = (BPB16 *)sector; - - /* Check signatures */ - if ( ( bpb->sigkey1 == 0x55 ) && ( bpb->sigkey2 == 0xAA ) ) - { - /* Check for FAT16 signature */ - if ( memcmp(bpb->FilSysType, "FAT16", 5) == 0 ) - return FS_TYPE_FAT16; - /* Non MS utilities simply put FAT */ - if ( memcmp(bpb->FilSysType, "FAT", 3) == 0 ) - return FS_TYPE_FAT16; - } - - return FS_TYPE_NONE; -} - -static int PECheck( BYTE *sector ) -{ - int i; - PARTENTRY *pe; - - if ( ( sector[SECTOR_SIZE-2] == 0x55 ) && ( sector[SECTOR_SIZE-1] == 0xAA ) ) - { - /* Find a FAT16 partition entry */ - for( i = 0; i < 4; i++ ) - { - pe = (PARTENTRY *)(sector + 446 + (i<<4)); - if ( pe->partitiontype == 0x06 ) - { - return SWAP32(pe->partitionstart); - } - } - } - - return FS_TYPE_NONE; -} - -/**************************************************************************** -* VFAT_Mount -* -* Function to mount a FAT16-VFAT volume -***************************************************************************/ -int VFAT_mount( int driveid, VFATFS *v ) -{ - int ret; - int bpbsector = 0; - BPB16 *bpb = (BPB16 *)sector; - BYTE media = 0; - - if ( driveid < 0 || driveid > 1 ) - return FS_TYPE_NONE; - - memset(v, 0, sizeof(VFATFS)); - - /* Copy pointer */ - vfs[driveid] = v; - - if ( DISKIO_Init( driveid ) != FS_SUCCESS ) - return FS_ERR_IO; - - if ( DISKIO_ReadSectors( driveid, sector, 0, 1 ) != FS_SUCCESS ) - return FS_ERR_IO; - - /* Check for SuperFloppy Format */ - ret = BPBCheck( sector ); - - if ( ret == FS_TYPE_NONE ) - { - /* Check for Partition Entry */ - bpbsector = PECheck(sector); - if ( !bpbsector ) - return FS_TYPE_NONE; - - if ( DISKIO_ReadSectors( driveid, sector, bpbsector, 1 ) != FS_SUCCESS ) - return FS_ERR_IO; - - /* Check BPB */ - ret = BPBCheck( sector ); - } - - if ( ret == FS_TYPE_FAT16 ) - { - /* Capture defaults to machine native format */ - v->BaseOffset = bpbsector; - v->BytesPerSector = SWAP16(bpb->bytesPerSec); - v->SectorsPerFAT = SWAP16(bpb->FATsz16); - v->ReservedSectors = SWAP16(bpb->reservedSec); - v->NumberOfFATs = bpb->numFATs; - v->SectorsPerCluster = bpb->secPerClust; - v->RootDirEntries = SWAP16(bpb->rootEntCount); - - /* Calculate number of root directory sectors */ - v->RootDirSectors = ( ( SWAP16(bpb->rootEntCount) << 5 ) + ( v->BytesPerSector - 1 ) ) / v->BytesPerSector; - - /* First data sector */ - v->FirstDataSector = v->ReservedSectors + (v->NumberOfFATs * v->SectorsPerFAT) + v->RootDirSectors + v->BaseOffset; - - /* Total sectors */ - if ( bpb->totSec16 == 0 ) - v->TotalSectors = SWAP32(bpb->totSec32); - else - v->TotalSectors = SWAP16(bpb->totSec16); - - /* Data Sectors */ - v->DataSectors = v->TotalSectors - ( v->ReservedSectors + ( v->NumberOfFATs * v->SectorsPerFAT ) + v->RootDirSectors ); - - /* Count of clusters */ - v->CountOfClusters = v->DataSectors / bpb->secPerClust; - - /* From v1.03 Document - Page 14 - FAT Type Determination */ - if ( v->CountOfClusters < 4085 ) - return FS_TYPE_NONE; /* FAT12 Volume */ - else - { - if ( v->CountOfClusters >= 65525 ) - return FS_TYPE_NONE; /* FAT32 Volume */ - } - - /* Root Directory Offset */ - v->RootDirOffset = v->ReservedSectors + ( bpb->numFATs * v->SectorsPerFAT ) + v->BaseOffset; - - /* First copy of FAT offset */ - v->FirstFATOffset = v->ReservedSectors + v->BaseOffset; - - media = bpb->media; - - /* Read first FAT */ - if ( DISKIO_ReadSectors( driveid, sector, v->FirstFATOffset, 1 ) != FS_SUCCESS ) - return FS_ERR_IO; - - if ( sector[0] == media ) - { - /* Allocate work spaces */ - v->FAT = (WORD *)malloc(v->SectorsPerFAT * SECTOR_SIZE); - if ( v->FAT == NULL ) - return FS_ERR_NOMEM; - - /* Save time running in and out - just load up the FAT table */ - if ( DISKIO_ReadSectors(driveid, v->FAT, v->FirstFATOffset, v->SectorsPerFAT) != FS_SUCCESS ) - { - free(v->FAT); - return FS_ERR_IO; - } - - /* Likewise, the same for the root directory */ - v->rootDir = (BYTE *)malloc(v->BytesPerSector * v->RootDirSectors); - if ( v->rootDir == NULL ) - { - free(v->FAT); - return FS_ERR_NOMEM; - } - - /* Read root directory */ - if ( DISKIO_ReadSectors(driveid, v->rootDir, v->RootDirOffset, v->RootDirSectors) != FS_SUCCESS ) - { - free(v->FAT); - free(v->rootDir); - return FS_ERR_IO; - } - return FS_TYPE_FAT16; - } - } - - return FS_TYPE_NONE; - -} - -/** - * F I L E N A M I N G S U P P O R T - * - * Routines to en/decode long and short file names - */ - -/**************************************************************************** -* CalcShortNameChecksum -* -* Calculate the checksum for a short filename -* Filename should be in UPPER case, and padded with spaces to match -* a standard directory entry -****************************************************************************/ -static unsigned char CalcShortNameCheckSum( BYTE *fname ) -{ - int i; - unsigned char sum = 0; - - for( i = 0; i < 11; i++ ) - sum = ( ( sum & 1 ) ? 0x80 : 0 ) + ( sum >> 1 ) + fname[i]; - - return sum; -} - -/**************************************************************************** -* BuildShortNameFromDirEntry -* -* User friendly shortname -****************************************************************************/ -static void BuildShortNameFromDirEntry( SFNDIRREC *sfn, BYTE *out ) -{ - int i,j; - - for(i = 0, j = 0; i < 11; i++ ) - { - if ( sfn->dirname[i] != 32 ) - { - out[j++] = sfn->dirname[i]; - } - - if ( (i == 7) && ( sfn->dirname[8] != 32 ) ) - out[j++] = '.'; - } -} - -/**************************************************************************** -* BuildLongNameFromDirEntry -* -* Build a long name from unicode to asciiz. -* Each directory entry may contain up to 13 characters for sub entry. -****************************************************************************/ -static void BuildLongNameFromDirEntry( LFNDIRREC *lfn, int position, BYTE *out ) -{ - int j = ( ( position - 1 ) * 13 ); - int i; - - /* Part one */ - for( i = 0; i < 10; i += 2 ) - { - if ( lfn->dirname1[i] == 0xFF ) - return; - - out[j++] = lfn->dirname1[i]; - } - - /* Part two */ - for( i = 0; i < 12; i += 2 ) - { - if ( lfn->dirname2[i] == 0xFF ) - return; - - out[j++] = lfn->dirname2[i]; - } - - /* Part three */ - for( i = 0; i < 4; i += 2 ) - { - if ( lfn->dirname3[i] == 0xFF ) - return; - - out[j++] = lfn->dirname3[i]; - } -} - -/** - * D I R E C T O R Y F U N C T I O N S - * - * These routines take care of all directory level parsing - */ - -static int SectorFromCluster( int drive, int cluster ) -{ - VFATFS *v = vfs[drive]; - return ( ( cluster - 2 ) * v->SectorsPerCluster ) + v->FirstDataSector; -} - -static int ReadCluster( FSDIRENTRY *d ) -{ - int sector; - - sector = SectorFromCluster( d->driveid, d->CurrentCluster ); - if ( DISKIO_ReadSectors( d->driveid, d->clusterdata, sector, vfs[d->driveid]->SectorsPerCluster) != FS_SUCCESS ) - return FS_ERR_IO; - - d->CachedCluster = d->CurrentCluster; - return FS_SUCCESS; -} - -static int NextCluster( FSDIRENTRY *d ) -{ - d->CurrentCluster = SWAP16(vfs[d->driveid]->FAT[d->CurrentCluster]); - if ( d->CurrentCluster >= CLUSTER_END_CHAIN ) - return 0; - - return 1; -} - -/**************************************************************************** -* FindEntry -* -* Look through a directory tree looking for an active entry. -* The current cluster should be available in d->clusterdata -****************************************************************************/ -static int FindEntry( FSDIRENTRY *d, int maxentries ) -{ - int found = 0; - unsigned char *direntry; - VFATFS *v = vfs[d->driveid]; - SFNDIRREC *sfn; - LFNDIRREC *lfn; - static BYTE checksum = 0; - - if ( !d->crosscluster ) - { - /* Clear names */ - memset(d->shortname, 0, 13); - memset(d->longname, 0, MAX_LONG_NAME); - } - - while( d->CurrentDirEntry < maxentries && !found ) - { - /* Pointer to this directory entry */ - if ( d->CurrentCluster == ROOTCLUSTER ) - direntry = (v->rootDir + ( d->CurrentDirEntry << 5 ) ); - else - direntry = (d->clusterdata + ( d->CurrentDirEntry << 5 ) ); - - switch( direntry[0] ) - { - case 0x00: - case 0xE5: - break; /* Inactive entries */ - - default: - - sfn = (SFNDIRREC *)direntry; - d->crosscluster = 1; - - if ( ( sfn->attribute & ATTR_LONG_NAME_MASK ) == ATTR_LONG_NAME ) - { - if ( direntry[0] & LFN_LAST_ENTRY ) - memset(&d->longname, 0, MAX_LONG_NAME); - - lfn = (LFNDIRREC *)direntry; - BuildLongNameFromDirEntry( lfn, direntry[0] & LFN_ENTRY_MASK, d->longname); - checksum = lfn->checksum; - } - else - { - /* Short name entry */ - found = 1; - memcpy(&d->dirent, direntry, 32); - BuildShortNameFromDirEntry( sfn, d->shortname ); - d->fsize = SWAP32(sfn->filesize); - d->crosscluster = 0; - /* Ensure long name is populated with something */ - if ( strlen((char *)d->longname) == 0 ) - { - strcpy((char *)d->longname, (char *)d->shortname); - return found; - } - else - { - /* If checksums don't match - the FS is inconsistent - To do no harm, skip this entry */ - if ( checksum == CalcShortNameCheckSum(sfn->dirname) ) - return found; - else - found = 0; - } - } - } - - d->CurrentDirEntry++; - - } - - return found; -} - -/**************************************************************************** -* FindInRootDirectory -* -* Root directory is somewhat special. It's a fixed length and has no entry -* in the FAT as such. -* -* Logically, this should be the first 2 clusters, but the spec says it can -* be set to any size by the format utility (Think NT! FAT64/128/256) -* -* For speed, as all searches begin here, the root directory is held in -* memory throughout. -* -* FSDIRENTRY should only have the drive id set. -****************************************************************************/ -static int FindInRootDirectory( FSDIRENTRY *d, char *search ) -{ - int found = 0; - - d->CurrentDirEntry++; - - while( (FindEntry(d, vfs[d->driveid]->RootDirEntries)) && !found ) - { - if ( strcasecmp(search, (char *) d->shortname) == 0 ) - { - found = 1; - } - - if ( strcasecmp(search, (char *) d->longname) == 0 ) - { - found = 1; - } - - if ( !found ) - d->CurrentDirEntry++; - } - - return found; -} - -/**************************************************************************** -* FindInClusters -* -* Generic routine to find a given name in a chain of clusters. -* Used for non-Root Directory searching -****************************************************************************/ -static int FindInClusters( FSDIRENTRY *d, char *findme ) -{ - int found = 0; - - if ( d->CurrentDirEntry == -1 ) - d->CurrentDirEntry = 0; - - /* While not at end of chain */ - while( !found && ( d->CurrentCluster < CLUSTER_END_CHAIN ) ) - { - /* Retrieve dir entries looking for match */ - while( !found && (FindEntry( d, ( vfs[d->driveid]->BytesPerSector * vfs[d->driveid]->SectorsPerCluster) >> 5 ) ) ) - { - if ( strcasecmp((char *)d->shortname, findme) == 0 ) - found = 1; - if ( strcasecmp((char *)d->longname, findme) == 0 ) - found = 1; - - if (!found) - d->CurrentDirEntry++; - } - - /* Read next cluster */ - if ( !found ) - { - if ( NextCluster(d) ) - { - d->CurrentDirEntry = 0; - ReadCluster(d); - } - } - } - - return found; -} - -/**************************************************************************** -* VFAT_opendir -* -* Find the requested directory. -****************************************************************************/ -int VFAT_opendir( int drive, FSDIRENTRY *d, char *search ) -{ - char *p; - char srchtmp[1024]; - int searchroot = 1; - int found = 0; - - /* Clear out FSDIRENTRY */ - memset(d, 0, sizeof(FSDIRENTRY)); - - /* Set drive and root */ - d->driveid = drive; - d->CurrentCluster = ROOTCLUSTER; - d->CurrentDirEntry = -1; - - /* Is this a request for root ? */ - if ( ( strlen(search) == 0 ) || ( strcmp(search,PSEPS) == 0 ) || ( strcmp(search, DIR_ROOT) == 0 ) ) - { - return FS_FILE_OK; - } - - /* Searching for a sub-directory */ - if ( search[0] == PSEP ) - strcpy(srchtmp, &search[1]); - else - strcpy(srchtmp, search); - - p = strtok(srchtmp, PSEPS); - while ( p ) - { - found = 0; - if ( searchroot ) - { - if ( !FindInRootDirectory(d, p) ) - return FS_NO_FILE; - else - { - /* MUST be a directory */ - if ( d->dirent.attribute & ATTR_DIRECTORY ) - { - d->CurrentCluster = d->FirstCluster = SWAP16(d->dirent.fstClustLow); - d->CurrentDirEntry = -1; - - /* Allocate the cluster for this data record */ - d->clusterdata = (BYTE *)malloc(vfs[d->driveid]->SectorsPerCluster * vfs[d->driveid]->BytesPerSector); - ReadCluster(d); - found = 1; - searchroot = 0; - } - else - return FS_NO_FILE; - } - } - else - { - if ( FindInClusters( d, p ) ) - { - /* MUST be a directory */ - if ( !( d->dirent.attribute & ATTR_DIRECTORY ) ) - { - free(d->clusterdata); - return FS_NO_FILE; - } - - /* Read up this cluster */ - d->CurrentCluster = d->FirstCluster = SWAP16(d->dirent.fstClustLow); - d->CurrentDirEntry = 0; - ReadCluster(d); - found = 1; - } - } - - p = strtok(NULL, PSEPS); - } - - if ( !found ) - { - if ( d->clusterdata != NULL ) - { - free(d->clusterdata); - d->clusterdata = NULL; - } - return FS_NO_FILE; - } - - return FS_FILE_OK; - -} - -/**************************************************************************** -* VFAT_readdir -****************************************************************************/ -int VFAT_readdir( FSDIRENTRY *d ) -{ - int ret; - - d->CurrentDirEntry++; - /* Are we in root ? */ - if ( d->CurrentCluster == ROOTCLUSTER ) - { - if( FindEntry( d, vfs[d->driveid]->RootDirEntries ) ) - return FS_FILE_OK; - } - else - { - while( d->CurrentCluster < CLUSTER_END_CHAIN ) - { - ret = FindEntry( d, ( vfs[d->driveid]->BytesPerSector * vfs[d->driveid]->SectorsPerCluster) >> 5 ); - - if ( ret ) - return FS_FILE_OK; - - if ( NextCluster(d) ) - { - d->CurrentDirEntry = 0; - ReadCluster(d); - } - } - } - return FS_NO_FILE; -} - -/**************************************************************************** -* VFAT_closedir -****************************************************************************/ -void VFAT_closedir( FSDIRENTRY *d ) -{ - if ( d->clusterdata != NULL ) - { - free(d->clusterdata); - d->clusterdata = NULL; - } -} - -/**************************************************************************** -* VFAT_fopen -* -* v0.1 - VFAT_READ_ONLY Supported -****************************************************************************/ -int VFAT_fopen( int drive, FSDIRENTRY *d, char *fname, int mode ) -{ - char filename[1024]; - char path[1024]; - char temp[1024]; - char *p; - - if ( drive < 0 || drive > 1 ) - return FS_NO_FILE; - - if ( mode != FS_READ ) - return FS_NO_FILE; - - /* Clear */ - memset(d, 0, sizeof(FSDIRENTRY)); - d->driveid = drive; - - path[0] = temp[0] = filename[0] = 0; - - if ( fname[0] == PSEP ) - strcpy(temp, &fname[1]); - else - strcpy(temp, fname); - - /* Split into filename and path */ - p = strrchr(temp, PSEP); - if ( p ) - { - /* Have path and filename */ - *p = 0; - strcpy(path, temp); - p++; - strcpy(filename, p); - } - else - strcpy(filename, temp); - - /* Do search */ - if ( strlen(path) ) - { - if ( VFAT_opendir(drive, d, path) != FS_FILE_OK ) - { - VFAT_closedir(d); - return FS_NO_FILE; - } - - if ( !FindInClusters( d, filename ) ) - { - VFAT_closedir(d); - return FS_NO_FILE; - } - } - else - { - /* Much simpler check on root directory */ - d->CurrentCluster = ROOTCLUSTER; - d->CurrentDirEntry = -1; - if ( !FindInRootDirectory( d, filename ) ) - { - VFAT_closedir(d); - return FS_NO_FILE; - } - d->clusterdata = (BYTE *)malloc(vfs[d->driveid]->SectorsPerCluster * vfs[d->driveid]->BytesPerSector); - } - - /* Must be a file only */ - if ( d->dirent.attribute & ( ATTR_DIRECTORY | ATTR_VOLUME_ID ) ) - { - VFAT_closedir(d); - return FS_NO_FILE; - } - - d->FirstCluster = d->CurrentCluster = SWAP16(d->dirent.fstClustLow); - d->CachedCluster = -1; - - return FS_FILE_OK; - -} - -/**************************************************************************** -* VFAT_fclose -****************************************************************************/ -void VFAT_fclose( FSDIRENTRY *d ) -{ - VFAT_closedir(d); -} - -/**************************************************************************** -* VFAT_fread -****************************************************************************/ -int VFAT_fread( FSDIRENTRY *d, void *buffer, int length ) -{ - int cluster; - int tbytes; - int umask; - int i; - int bytesdone = 0; - int reallength; - BYTE *p = (BYTE *)buffer; - - if ( length <= 0 ) - return 0; - - /* Determine which cluster in the chain we are in */ - tbytes = ( vfs[d->driveid]->SectorsPerCluster * vfs[d->driveid]->BytesPerSector ); - umask = tbytes - 1; - cluster = ( d->fpos / tbytes ); - - /* Rewind current cluster */ - d->CurrentCluster = d->FirstCluster; - - /* Bring this cluster into view */ - for ( i = 0; i < cluster; i++ ) - d->CurrentCluster = SWAP16(vfs[d->driveid]->FAT[d->CurrentCluster]); - - /* Read the cluster */ - if ( d->CachedCluster != d->CurrentCluster ) - ReadCluster(d); - - /* Get real read length */ - reallength = ( d->fpos + length ) < d->fsize ? length : d->fsize - d->fpos; - - if ( reallength <= 0 ) - return 0; - - /* Move data */ - while( reallength ) - { - if ( !(d->fpos & umask) && ( reallength >= tbytes ) ) - { - /* Move a full cluster */ - memcpy(p + bytesdone, d->clusterdata, tbytes); - reallength -= tbytes; - bytesdone += tbytes; - d->fpos += tbytes; - } - else - { - p[bytesdone++] = d->clusterdata[d->fpos & umask]; - d->fpos++; - reallength--; - } - - if ( !( d->fpos & umask ) ) - { - if ( NextCluster(d) ) - { - ReadCluster(d); - } - else - return bytesdone; - } - } - - return bytesdone; -} - -/**************************************************************************** -* VFAT_fseek -****************************************************************************/ -int VFAT_fseek( FSDIRENTRY *d, int where, int whence ) -{ - switch( whence ) - { - case SEEK_SET: - if ( ( where >= 0 ) && ( where <= d->fsize ) ) - { - d->fpos = where; - return FS_FILE_OK; - } - break; - - case SEEK_CUR: - if ( ( ( d->fpos + where ) >= 0 ) && ( ( d->fpos + where ) <= d->fsize ) ) - { - d->fpos += where; - return FS_FILE_OK; - } - break; - - case SEEK_END: - if ( ( where <= 0 ) && ( abs(where) <= d->fsize ) ) - { - d->fpos = d->fsize + where; - return FS_FILE_OK; - } - break; - } - - return FS_NO_FILE; -} - -/**************************************************************************** -* VFAT_ftell -* -* Return the current position of a file -****************************************************************************/ -int VFAT_ftell( FSDIRENTRY *d ) -{ - return d->fpos; -} - diff --git a/source/ngc/vfat/vfat.h b/source/ngc/vfat/vfat.h deleted file mode 100644 index e66341a..0000000 --- a/source/ngc/vfat/vfat.h +++ /dev/null @@ -1,226 +0,0 @@ -/**************************************************************************** -* FAT16 - VFAT Support -* -* NOTE: Only supports FAT16 with Long File Names -* I have no interest in adding FAT32 -* -* Reference Documentation: -* -* FAT: General Overview of On-Disk Format -* Version 1.02 May 05, 1999 -* Microsoft Corporation -* -* FAT: General Overview of On-Disk Format -* Version 1.03 December 06, 2000 -* Microsoft Corporation -* -* This is targetted at MMC/SD cards. -* -* Copyright softdev 2007. All rights reserved. -* -* $Date: 2007-08-03 13:23:19 +0100 (Fri, 03 Aug 2007) $ -* $Rev: 3 $ -****************************************************************************/ -#ifndef __FATVFAT__ -#define __FATVFAT__ - -/* x86 type definitions */ -typedef unsigned int DWORD; -typedef unsigned short WORD; -typedef unsigned char BYTE; - -/* Big Endian Support */ -#ifdef WORDS_BIGENDIAN -#define SWAP16(a) (((a&0xff)<<8) | ((a&0xff00)>>8)) -#define SWAP32(a) (((a&0xff000000)>>24) | ((a&0xff0000) >> 8) | ((a&0xff00)<<8) |((a&0xff)<<24)) -#else -#define SWAP16(a) (a) -#define SWAP32(a) (a) -#endif - -/* General */ -#define SECTOR_SIZE 512 -#define SECTOR_SHIFT_BITS 9 -#define LFN_LAST_ENTRY 0x40 -#define LFN_ENTRY_MASK 0x3F -#define ROOTCLUSTER 0xdeadc0de -#define PSEP '/' -#define PSEPS "/" -#define DIR_ROOT "." -#define DIR_PARENT ".." - -/* FSTYPES */ -#define FS_TYPE_NONE 0 -#define FS_TYPE_FAT16 1 - -/* Errors */ -#define FS_FILE_OK 0 -#define FS_SUCCESS FS_FILE_OK -#define FS_ERR_NOMEM -128 -#define FS_NO_FILE -64 -#define FS_ERR_IO -32 -#define FS_ERR_PARAM -16 - -/* File modes */ -#define FS_READ 1 - -/* Gamecube Specific */ -#define FS_SLOTA 0 -#define FS_SLOTB 1 - -/* FAT12/16 */ -typedef struct - { - BYTE jmpBoot[3]; /* Always 0xEBxx90 or 0xE9xxxx */ - BYTE OEMName[8]; /* OEM Name 'MSWIN4.1' or similar */ - WORD bytesPerSec; /* Bytes per sector */ - BYTE secPerClust; /* Sectors per cluster */ - WORD reservedSec; /* Reserved Sector Count */ - BYTE numFATs; /* Number of FAT copies */ - WORD rootEntCount; /* FAT12/16 number of root entries. */ - WORD totSec16; /* Sector count if < 0x10000 */ - BYTE media; /* Media ID byte (HD == 0xF8) */ - WORD FATsz16; /* Sectors occupied by one copy of FAT */ - WORD secPerTrack; /* Sectors per track */ - WORD numHeads; /* Number of heads */ - DWORD hiddenSec; /* Hidden sector count */ - DWORD totSec32; /* Total sectors when >= 0x10000 */ - BYTE drvNum; /* BIOS Drive Number (0x80) */ - BYTE reserved1; /* Unused - always zero */ - BYTE bootSig; /* Boot signature */ - DWORD volID; /* Volume serial number */ - BYTE volName[11]; /* Volume Name */ - BYTE FilSysType[8]; /* File system type */ - BYTE filler[SECTOR_SIZE-64]; - BYTE sigkey1; /* 0x55 */ - BYTE sigkey2; /* 0xAA */ - } -__attribute__((__packed__)) BPB16; - -/* Partition entry */ -typedef struct - { - BYTE bootindicator; - BYTE startCHS[3]; - BYTE partitiontype; - BYTE endCHS[3]; - DWORD partitionstart; - DWORD partitionsize; - } -__attribute__((__packed__)) PARTENTRY; - -/* VFAT - Main structure */ -typedef struct - { - DWORD BaseOffset; - DWORD SectorsPerCluster; - DWORD BytesPerSector; - DWORD ReservedSectors; - DWORD RootDirSectors; - DWORD SectorsPerFAT; - DWORD NumberOfFATs; - DWORD FirstDataSector; - DWORD TotalSectors; - DWORD CountOfClusters; - DWORD DataSectors; - DWORD RootDirOffset; - DWORD FirstFATOffset; - DWORD RootDirEntries; - WORD *FAT; /* Holds first FAT copy */ - BYTE *rootDir; /* Holds entire root directory */ - } -__attribute__((__packed__)) VFATFS; - -/** - * Directory - */ - -#define MAX_LONG_NAME 256 - -/* Directory entry attributes */ -#define ATTR_READ_ONLY 0x01 -#define ATTR_HIDDEN 0x02 -#define ATTR_SYSTEM 0x04 -#define ATTR_VOLUME_ID 0x08 -#define ATTR_DIRECTORY 0x10 -#define ATTR_ARCHIVE 0x20 -#define ATTR_LONG_NAME (ATTR_READ_ONLY | \ - ATTR_HIDDEN | \ - ATTR_SYSTEM | \ - ATTR_VOLUME_ID ) - -#define ATTR_LONG_NAME_MASK ( ATTR_READ_ONLY | \ - ATTR_HIDDEN | \ - ATTR_SYSTEM | \ - ATTR_VOLUME_ID | \ - ATTR_DIRECTORY | \ - ATTR_ARCHIVE ) - -#define CLUSTER_END_CHAIN 0xFFF8 -#define CLUSTER_BAD 0xFFF7 - -/* Short file name */ -typedef struct - { - BYTE dirname[11]; /* Record name */ - BYTE attribute; /* Attributes */ - BYTE NTReserved; /* Reserved for Window NT - set 0 */ - BYTE dirTenthSecs; /* Tenth of a second, 0-199 */ - WORD dirCreateTime; /* Time of creation */ - WORD dirCreateDate; /* Date of creation */ - WORD dirLastAccDate;/* Date of last access */ - WORD fstClustHigh; /* High word of first cluster - ZERO on FAT16 */ - WORD dirWriteTime; /* Time of last write */ - WORD dirWriteDate; /* Date of last write */ - WORD fstClustLow; /* Low word of first cluster */ - DWORD filesize; /* Filesize in bytes */ - } -__attribute__((__packed__)) SFNDIRREC; - -/* Long file name */ -typedef struct - { - BYTE ordinal; /* Entry number */ - BYTE dirname1[10]; - BYTE attribute; /* Attributes */ - BYTE type; /* Reserved */ - BYTE checksum; /* SFN Checksum */ - BYTE dirname2[12]; - WORD fstClustLo; /* MUST BE ZERO */ - BYTE dirname3[4]; - } -__attribute__((__packed__)) LFNDIRREC; - -/* User dir entry */ -typedef struct - { - BYTE longname[MAX_LONG_NAME]; - BYTE shortname[13]; /* Keep word aligned*/ - DWORD fpos; - DWORD fsize; - DWORD driveid; - DWORD FirstCluster; - DWORD CurrentCluster; - DWORD CachedCluster; - DWORD CurrentDirEntry; - DWORD crosscluster; - BYTE *clusterdata; - /* Now a copy of the current directory entry */ - SFNDIRREC dirent; - } -__attribute__((__packed__)) FSDIRENTRY; - -/* VFAT API */ -/* Directory */ -int VFAT_opendir( int drive, FSDIRENTRY *d, char *search ); -int VFAT_readdir( FSDIRENTRY *d ); -void VFAT_closedir( FSDIRENTRY *d ); -int VFAT_fopen( int drive, FSDIRENTRY *d, char *fname, int mode ); -void VFAT_fclose( FSDIRENTRY *d ); -int VFAT_fread( FSDIRENTRY *d, void *buffer, int length ); -int VFAT_ftell( FSDIRENTRY *d ); -int VFAT_fseek( FSDIRENTRY *d, int where, int whence ); -int VFAT_mount( int driveid, VFATFS *v ); - -#endif - diff --git a/source/ngc/wdvd.c b/source/ngc/wdvd.c new file mode 100644 index 0000000..aca9fae --- /dev/null +++ b/source/ngc/wdvd.c @@ -0,0 +1,160 @@ +/* + * Wii DVD interface API + * Copyright (C) 2008 Jeff Epler + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifdef WII_DVD +#include +#include +#include +#include "wdvd.h" + +static int di_fd = -1; +static s32 di_hid = 0; + + + +#include +#define DEBUG + +#ifdef DEBUG +#define debug_printf printf +#define debug_wait printf +#else +#define debug_printf(...) ; +#define debug_wait(...) ; +#endif + +bool WDVD_Init() +{ + if(di_fd >= 0) return 1; + + di_fd = IOS_Open("/dev/do", 0); + if(di_fd < 0) { + debug_printf("IOS_Open(/dev/di) failed with code %d\n", di_fd); + return 0; + } + + di_hid = iosCreateHeap(0x10000); + if(!di_hid) { + IOS_Close(di_fd); + di_fd = -1; + debug_printf("iosCreateHeap(0x20) failed with code %d\n", di_hid); + return 0; + } + + debug_printf("fd=%d hid=%d\n", di_fd, di_hid); + return 1; +} + +bool WDVD_Reset() +{ + bool result = false; + char *inbuf = (char*)iosAlloc(di_hid, 0x20); + char *outbuf = (char*)iosAlloc(di_hid, 0x20); + if(!inbuf || !outbuf) + goto out; + + ((u32*)inbuf)[0x00] = 0x8A000000; + ((u32*)inbuf)[0x01] = 1; + + result = IOS_Ioctl( di_fd, 0x8A, inbuf, 0x20, outbuf, 0x20); +out: + if(outbuf) iosFree(di_hid, outbuf); + if(inbuf) iosFree(di_hid, inbuf); + return result; +} + +#define max(a,b) ((a) > (b) ? (a) : (b)) + +unsigned char* ios_command = 0; +unsigned char* ios_out = 0; +unsigned int ios_outlen = 0; + +void WDVD_AllocCommand() +{ + if (ios_command == 0) + ios_command = (unsigned char*)iosAlloc(di_hid, 0x20); +} + +void WDVD_AllocOutput(unsigned int length) +{ + if (ios_out == 0 || ios_outlen != length) + { + if (ios_out) + iosFree(di_hid, ios_out); + + ios_out = (unsigned char*)iosAlloc(di_hid, max(length, 0x20)); + ios_outlen = length; + } +} + +int WDVD_LowUnencryptedRead(unsigned char **poutbuf, u32 len, u32 offset) +{ + WDVD_AllocCommand(); + WDVD_AllocOutput(len); + + unsigned char* inbuf = ios_command; + unsigned char* outbuf = ios_out; + + *poutbuf = ios_out; + int result = 0; + + if(!inbuf || !outbuf) { result = -1; goto out; } + + ((u32*)inbuf)[0] = 0x8d000000; + ((u32*)inbuf)[1] = len; + ((u32*)inbuf)[2] = offset; + +// memset(outbuf, 0x00, len); + + result = IOS_Ioctl(di_fd, 0x8d, inbuf, 0x20, outbuf, len); + + if (result != 1) + debug_printf("-> %d\n", result); + +// if(result >= 0) { +// memcpy(buf, outbuf, len); +// } + +out: + //if(outbuf) iosFree(di_hid, outbuf); + //if(inbuf) iosFree(di_hid, inbuf); + + return result; +} + +int WDVD_LowReadDiskId(u64 *id) +{ + int result; + char *inbuf = (char*)iosAlloc(di_hid, 0x20); + char *outbuf = (char*)iosAlloc(di_hid, 0x20); + if(!inbuf || !outbuf) { result = -1; goto out; } + ((u32*)inbuf)[0] = 0x70000000; + + *(u64*)outbuf = 0; + result = IOS_Ioctl(di_fd, 0x8D, inbuf, 0x20, outbuf, 0x20); + + *id = *(u64*) outbuf; + +out: + if(inbuf) iosFree(di_hid, inbuf); + if(outbuf) iosFree(di_hid, outbuf); + + return result; +} +#endif diff --git a/source/ngc/wdvd.h b/source/ngc/wdvd.h new file mode 100644 index 0000000..4f1af8a --- /dev/null +++ b/source/ngc/wdvd.h @@ -0,0 +1,27 @@ +/* + * Wii DVD interface API + * Copyright (C) 2008 Jeff Epler + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _WDVD_H_ +#define _WDVD_H_ +bool WDVD_Init(); +bool WDVD_Reset(); + +int WDVD_LowUnencryptedRead(unsigned char **outbuf, u32 len, u32 offset); +int WDVD_LowReadDiskId(u64 *id); +#endif diff --git a/source/render.c b/source/render.c index 7577516..b7cc4bc 100644 --- a/source/render.c +++ b/source/render.c @@ -1,1536 +1,1661 @@ -/* - only update window clip on window change (?) - fix leftmost window/nta render and window bug - sprite masking isn't right in sonic/micromachines 2, but - seems ok in galaxy force 2 - - Eke-Eke (2007): - . pixel sprite limit fixed (sonic/micromachines 2) - . sprite collision detection added - . big endian support improved - . fixed leftmost window/nta render and window bug - . some code speedup (minor) -*/ - - -#include "shared.h" - -#ifndef LSB_FIRST -static uint32 ATTR_MSB; -#endif - -#ifdef ALIGN_LONG - -/* Or change the names if you depend on these from elsewhere.. */ -#undef READ_LONG -#undef WRITE_LONG - -static __inline__ uint32 READ_LONG(void *address) -{ - if ((uint32)address & 3) - { -#ifdef LSB_FIRST /* little endian version */ - return ( *((uint8 *)address) + - (*((uint8 *)address+1) << 8) + - (*((uint8 *)address+2) << 16) + - (*((uint8 *)address+3) << 24) ); -#else /* big endian version */ - return ( *((uint8 *)address+3) + - (*((uint8 *)address+2) << 8) + - (*((uint8 *)address+1) << 16) + - (*((uint8 *)address) << 24) ); -#endif /* LSB_FIRST */ - } - else return *(uint32 *)address; -} - -static __inline__ void WRITE_LONG(void *address, uint32 data) -{ - if ((uint32)address & 3) - { -#ifdef LSB_FIRST - *((uint8 *)address) = data; - *((uint8 *)address+1) = (data >> 8); - *((uint8 *)address+2) = (data >> 16); - *((uint8 *)address+3) = (data >> 24); -#else - *((uint8 *)address+3) = data; - *((uint8 *)address+2) = (data >> 8); - *((uint8 *)address+1) = (data >> 16); - *((uint8 *)address) = (data >> 24); -#endif /* LSB_FIRST */ - return; - } - else *(uint32 *)address = data; -} - -#endif /* ALIGN_LONG */ - - -/* - Two Pattern Attributes are written in VRAM as two 16bits WORD: - - P = priority bit - C = color palette (2 bits) - V = Vertical Flip bit - H = Horizontal Flip bit - N = Pattern Number (11 bits) - - MSB PCCVHNNN NNNNNNNN LSB PCCVHNNN NNNNNNNN LSB - PATTERN1 PATTERN2 - - Pattern attributes are read from VRAM as 32bits WORD like this: - - LIT_ENDIAN: ATTR is MSB PCCVHNNN NNNNNNNN PCCVHNNN NNNNNNNN LSB - PATTERN2 PATTERN1 - - BIG_ENDIAN: ATTR is MSB PCCVHNNN NNNNNNNN PCCVHNNN NNNNNNNN LSB - PATTERN1 PATTERN2 - - - Each Line Buffer written byte describe one pixel data like this: - - msb SPppcccc lsb - - with: - S = sprite data indicator (not written here) - P = priority bit (from Pattern Attribute) - p = color palette (from Pattern Attribute) - c = color data (from Pattern Cache) - - - A column is 2 patterns wide - A pattern is 8 pixels wide = 8 bytes = two 32 bits write -*/ - -/* Draw a single 8-pixel column */ -/* - pattern cache is addressed like this: 00000VHN NNNNNNNN NNYYYXXX - with : Y = pattern row (1-8 lines) - X = pattern column (1-8 pixels) - V = Vertical Flip bit - H = Horizontal Flip bit - N = Pattern Number (1-2048) -*/ -#ifdef ALIGN_LONG -#ifdef LSB_FIRST -#define DRAW_COLUMN(ATTR, LINE) \ - atex = atex_table[(ATTR >> 13) & 7]; \ - src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; \ - ATTR >>= 16; \ - atex = atex_table[(ATTR >> 13) & 7]; \ - src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; -#else -#define DRAW_COLUMN(ATTR, LINE) \ - ATTR_MSB = ATTR >> 16; \ - atex = atex_table[(ATTR_MSB >> 13) & 7]; \ - src = (uint32 *)&bg_pattern_cache[(ATTR_MSB & 0x1FFF) << 6 | (LINE)]; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; \ - atex = atex_table[(ATTR >> 13) & 7]; \ - src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; -#endif -#else /* NOT ALIGNED */ -#ifdef LSB_FIRST -#define DRAW_COLUMN(ATTR, LINE) \ - atex = atex_table[(ATTR >> 13) & 7]; \ - src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ - *dst++ = (*src++ | atex); \ - *dst++ = (*src++ | atex); \ - ATTR >>= 16; \ - atex = atex_table[(ATTR >> 13) & 7]; \ - src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ - *dst++ = (*src++ | atex); \ - *dst++ = (*src++ | atex); -#else -#define DRAW_COLUMN(ATTR, LINE) \ - ATTR_MSB = ATTR >> 16; \ - atex = atex_table[(ATTR_MSB >> 13) & 7]; \ - src = (uint32 *)&bg_pattern_cache[(ATTR_MSB & 0x1FFF) << 6 | (LINE)]; \ - *dst++ = (*src++ | atex); \ - *dst++ = (*src++ | atex); \ - atex = atex_table[(ATTR >> 13) & 7]; \ - src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ - *dst++ = (*src++ | atex); \ - *dst++ = (*src++ | atex); -#endif -#endif /* ALIGN_LONG */ - - -/* Draw a single 16-pixel column */ -/* - pattern cache is addressed like this: 00000VHN NNNNNNNN NYYYYXXX - with : Y = pattern row (1-16 lines) - X = pattern column (1-8 pixels) - V = Vertical Flip bit - H = Horizontal Flip bit - N = Pattern Number (1-1024) - - one pattern line is 8 pixels = 8 bytes = 2 * 32 bits -*/ -#ifdef ALIGN_LONG -#ifdef LSB_FIRST -#define DRAW_COLUMN_IM2(ATTR, LINE) \ - atex = atex_table[(ATTR >> 13) & 7]; \ - offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ - if(ATTR & 0x1000) offs ^= 0x40; \ - src = (uint32 *)&bg_pattern_cache[offs]; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; \ - ATTR >>= 16; \ - atex = atex_table[(ATTR >> 13) & 7]; \ - offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ - if(ATTR & 0x1000) offs ^= 0x40; \ - src = (uint32 *)&bg_pattern_cache[offs]; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; -#else -#define DRAW_COLUMN_IM2(ATTR, LINE) \ - ATTR_MSB = ATTR >> 16; \ - atex = atex_table[(ATTR_MSB >> 13) & 7]; \ - offs = (ATTR_MSB & 0x03FF) << 7 | (ATTR_MSB & 0x1800) << 6 | (LINE); \ - if(ATTR_MSB & 0x1000) offs ^= 0x40; \ - src = (uint32 *)&bg_pattern_cache[offs]; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; \ - atex = atex_table[(ATTR >> 13) & 7]; \ - offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ - if(ATTR & 0x1000) offs ^= 0x40; \ - src = (uint32 *)&bg_pattern_cache[offs]; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; \ - WRITE_LONG(dst, READ_LONG(src) | atex); \ - dst++; \ - src++; -#endif -#else /* NOT ALIGNED */ -#ifdef LSB_FIRST -#define DRAW_COLUMN_IM2(ATTR, LINE) \ - atex = atex_table[(ATTR >> 13) & 7]; \ - offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ - if(ATTR & 0x1000) offs ^= 0x40; \ - src = (uint32 *)&bg_pattern_cache[offs]; \ - *dst++ = (*src++ | atex); \ - *dst++ = (*src++ | atex); \ - ATTR >>= 16; \ - atex = atex_table[(ATTR >> 13) & 7]; \ - offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ - if(ATTR & 0x1000) offs ^= 0x40; \ - src = (uint32 *)&bg_pattern_cache[offs]; \ - *dst++ = (*src++ | atex); \ - *dst++ = (*src++ | atex); -#else -#define DRAW_COLUMN_IM2(ATTR, LINE) \ - ATTR_MSB = ATTR >> 16; \ - atex = atex_table[(ATTR_MSB >> 13) & 7]; \ - offs = (ATTR_MSB & 0x03FF) << 7 | (ATTR_MSB & 0x1800) << 6 | (LINE); \ - if(ATTR_MSB & 0x1000) offs ^= 0x40; \ - src = (uint32 *)&bg_pattern_cache[offs]; \ - *dst++ = (*src++ | atex); \ - *dst++ = (*src++ | atex); \ - atex = atex_table[(ATTR >> 13) & 7]; \ - offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ - if(ATTR & 0x1000) offs ^= 0x40; \ - src = (uint32 *)&bg_pattern_cache[offs]; \ - *dst++ = (*src++ | atex); \ - *dst++ = (*src++ | atex); -#endif -#endif /* ALIGN_LONG */ - -/* - gcc complains about this: - *lb++ = table[(*lb << 8) |(*src++ | palette)]; - .. claiming the result on lb is undefined. - So we manually advance lb and use constant offsets into the line buffer. -*/ - -/* added sprite collision detection: - check if non-transparent sprite data has been previously drawn -*/ -#define DRAW_SPRITE_TILE \ - for(i=0; i<8; i++) \ - { \ - if ((lb[i] & 0x80) && ((lb[i] | src[i]) & 0x0F)) status |= 0x20; \ - lb[i] = table[(lb[i] << 8) |(src[i] | palette)]; \ - } - - -/* Pixel creation macros, input is four bits each */ -/* 8:8:8 RGB */ -#define MAKE_PIXEL_32(r,g,b) ((r) << 20 | (g) << 12 | (b) << 4) - -/* 5:5:5 RGB */ -#define MAKE_PIXEL_15(r,g,b) ((r) << 11 | (g) << 6 | (b) << 1) - -/* 5:6:5 RGB */ -#define MAKE_PIXEL_16(r,g,b) ((r) << 11 | (g) << 5 | (b)) - -/* 3:3:2 RGB */ -#define MAKE_PIXEL_8(r,g,b) ((r) << 5 | (g) << 2 | ((b) >> 1)) - -/* Clip data */ -static clip_t clip[2]; - -/* Attribute expansion table */ -static const uint32 atex_table[] = { - 0x00000000, 0x10101010, 0x20202020, 0x30303030, - 0x40404040, 0x50505050, 0x60606060, 0x70707070 -}; - -/* Sprite name look-up table */ -uint8 name_lut[0x400]; - -/* Sprite line buffer data */ -uint8 object_index_count; - -struct -{ - uint16 ypos; - uint16 xpos; - uint16 attr; - uint8 size; - uint8 index; -} object_info[20]; - -/* Pixel look-up tables and table base address */ -uint8 *lut[5]; -uint8 *lut_base = NULL; - -/* 8-bit pixel remapping data */ -uint8 pixel_8[0x100]; -uint8 pixel_8_lut[3][0x200]; - -/* 15-bit pixel remapping data */ -uint16 pixel_15[0x100]; -uint16 pixel_15_lut[3][0x200]; - -/* 16-bit pixel remapping data */ -uint16 pixel_16[0x100]; -uint16 pixel_16_lut[3][0x200]; - -/* 32-bit pixel remapping data */ -uint32 pixel_32[0x100]; -uint32 pixel_32_lut[3][0x200]; - -/* Line buffers */ -uint8 tmp_buf[0x400]; /* Temporary buffer */ -uint8 bg_buf[0x400]; /* Merged background buffer */ -uint8 nta_buf[0x400]; /* Plane A / Window line buffer */ -uint8 ntb_buf[0x400]; /* Plane B line buffer */ -uint8 obj_buf[0x400]; /* Object layer line buffer */ - -/* - 3:3:3 to 5:6:5 RGB pixel extrapolation tables - this is used to convert 3bits RGB values to 5bits (R,B) or 6bits (G) values - there is three color modes: - normal: RGB range is [0;MAX] - half: RGB range is [0;MAX/2] (shadow mode) - high: RGB range is [MAX/2;MAX] (highlight mode) - - MAX is 31 (R,B) or 63 (G) for 5:6:5 pixels and 7 (R,G,B) for 3:3:3 pixels - MAX/2 is rounded to inferior value (15, 31 or 3) - - the extrapolation is linear and calculated like this: - - for (i=0; i<8; i++) - { - rgb565_norm[0][i] = round(((double)i * 31.0) / 7.0); - rgb565_norm[1][i] = round(((double)i * 63.0) / 7.0); - - rgb565_half[0][i] = round(((double)i * 31.0) / 7.0 / 2.0); - rgb565_half[1][i] = round(((double)i * 63.0) / 7.0 / 2.0); - - rgb565_high[0][i] = round(((double)i * 31.0) / 7.0 / 2.0 + 15.5); - rgb565_high[1][i] = round(((double)i * 63.0) / 7.0 / 2.0 + 31.5); - } - -*/ - -uint8 rgb565_norm[2][8] = {{0 , 4, 9, 13, 18, 22, 27, 31}, - {0 , 9, 18, 27, 36, 45, 54, 63}}; -uint8 rgb565_half[2][8] = {{0 , 2, 4, 7, 9, 11, 13, 15}, - {0 , 4, 9, 13, 18, 22, 27, 31}}; -uint8 rgb565_high[2][8] = {{15, 18, 20, 22, 24, 27, 29, 31}, - {31, 36, 40, 45, 49, 54, 58, 63}}; - - -/*--------------------------------------------------------------------------*/ -/* Init, reset, shutdown routines */ -/*--------------------------------------------------------------------------*/ - -int render_init (void) -{ - int bx, ax, i; - - /* Allocate and align pixel look-up tables */ - if (lut_base == NULL) lut_base = malloc ((LUT_MAX * LUT_SIZE) + LUT_SIZE); - lut[0] = (uint8 *) (((uint32) lut_base + LUT_SIZE) & ~(LUT_SIZE - 1)); - for (i = 1; i < LUT_MAX; i += 1) lut[i] = lut[0] + (i * LUT_SIZE); - - /* Make pixel look-up table data */ - for (bx = 0; bx < 0x100; bx += 1) - for (ax = 0; ax < 0x100; ax += 1) - { - uint16 index = (bx << 8) | (ax); - lut[0][index] = make_lut_bg (bx, ax); - lut[1][index] = make_lut_obj (bx, ax); - lut[2][index] = make_lut_bg_ste (bx, ax); - lut[3][index] = make_lut_obj_ste (bx, ax); - lut[4][index] = make_lut_bgobj_ste (bx, ax); - } - - /* Make pixel data tables */ - for (i = 0; i < 0x200; i += 1) - { - int r, g, b; - - r = (i >> 6) & 7; - g = (i >> 3) & 7; - b = (i >> 0) & 7; - - pixel_8_lut[0][i] = MAKE_PIXEL_8(r>>1,g>>1,b>>1); - pixel_8_lut[1][i] = MAKE_PIXEL_8(r,g,b); - pixel_8_lut[2][i] = MAKE_PIXEL_8((r>>1)|4,(g>>1)|4,(b>>1)|4); - - pixel_15_lut[0][i] = MAKE_PIXEL_15(r,g,b); - pixel_15_lut[1][i] = MAKE_PIXEL_15(r<<1,g<<1,b<<1); - pixel_15_lut[2][i] = MAKE_PIXEL_15(r|8,g|8,b|8); - - /* RGB 565 format: we extrapolate each 3-bit value into a 5-bit (R,B) or 6-bit (G) value - this is needed to correctly cover full color range: [0-31] for R,B or [0-63] for G */ - pixel_16_lut[0][i] = MAKE_PIXEL_16(rgb565_half[0][r],rgb565_half[1][g],rgb565_half[0][b]); - pixel_16_lut[1][i] = MAKE_PIXEL_16(rgb565_norm[0][r],rgb565_norm[1][g],rgb565_norm[0][b]); - pixel_16_lut[2][i] = MAKE_PIXEL_16(rgb565_high[0][r],rgb565_high[1][g],rgb565_high[0][b]); - - pixel_32_lut[0][i] = MAKE_PIXEL_32(r,g,b); - pixel_32_lut[1][i] = MAKE_PIXEL_32(r<<1,g<<1,b<<1); - pixel_32_lut[2][i] = MAKE_PIXEL_32(r|8,g|8,b|8); - } - - /* Set up color update function */ - switch(bitmap.depth) - { - case 8: color_update = color_update_8; break; - case 15: color_update = color_update_15; break; - case 16: color_update = color_update_16; break; - case 32: color_update = color_update_32; break; - } - - /* Make sprite name look-up table */ - make_name_lut(); - - return (1); -} - -void make_name_lut(void) -{ - int col, row; - int vcol, vrow; - int width, height; - int flipx, flipy; - int i, name; - - memset (name_lut, 0, sizeof (name_lut)); - - for (i = 0; i < 0x400; i += 1) - { - vcol = col = i & 3; - vrow = row = (i >> 2) & 3; - height = (i >> 4) & 3; - width = (i >> 6) & 3; - flipx = (i >> 8) & 1; - flipy = (i >> 9) & 1; - - if(flipx) vcol = (width - col); - if(flipy) vrow = (height - row); - - name = vrow + (vcol * (height + 1)); - - if ((row > height) || col > width) name = -1; - - name_lut[i] = name; - } -} - -void render_reset(void) -{ - memset(&clip, 0, sizeof(clip)); - - memset(bg_buf, 0, sizeof(bg_buf)); - memset(tmp_buf, 0, sizeof(tmp_buf)); - memset(nta_buf, 0, sizeof(nta_buf)); - memset(ntb_buf, 0, sizeof(ntb_buf)); - memset(obj_buf, 0, sizeof(obj_buf)); - - memset(&pixel_8, 0, sizeof(pixel_8)); - memset(&pixel_15, 0, sizeof(pixel_15)); - memset(&pixel_16, 0, sizeof(pixel_16)); - memset(&pixel_32, 0, sizeof(pixel_32)); -} - - -void render_shutdown(void) -{ - if(lut_base) free(lut_base); -} - -/*--------------------------------------------------------------------------*/ -/* Line render function */ -/*--------------------------------------------------------------------------*/ - -void render_line(int line) -{ - uint8 *lb = tmp_buf; - int width = bitmap.viewport.w; - - if((reg[1] & 0x40) == 0x00) - { - memset(&lb[bitmap.viewport.x], 0x40 | border, width); - } - else - { - update_bg_pattern_cache(); - window_clip(line); - - if(im2_flag) - { - if (clip[0].enable) render_ntx_im2(0, line, nta_buf); - render_ntx_im2(1, line, ntb_buf); - if (clip[1].enable) render_ntw_im2(line, nta_buf); - } - else - { - if(reg[11] & 4) - { - if (clip[0].enable) render_ntx_vs(0, line, nta_buf); - render_ntx_vs(1, line, ntb_buf); - } - else - { - if (clip[0].enable) render_ntx(0, line, nta_buf); - render_ntx(1, line, ntb_buf); - } - if (clip[1].enable) render_ntw(line, nta_buf); - } - - if(reg[12] & 8) - { - merge(&nta_buf[0x20], &ntb_buf[0x20], &bg_buf[0x20], lut[2], width); - memset(&obj_buf[0x20], 0, width); - - if(im2_flag) render_obj_im2(line, obj_buf, lut[3]); - else render_obj(line, obj_buf, lut[3]); - - merge(&obj_buf[0x20], &bg_buf[0x20], &lb[0x20], lut[4], width); - } - else - { - merge(&nta_buf[0x20], &ntb_buf[0x20], &lb[0x20], lut[0], width); - if(im2_flag) render_obj_im2(line, lb, lut[1]); - else render_obj(line, lb, lut[1]); - } - } - - if(reg[0] & 0x20) - { - memset(&lb[bitmap.viewport.x], 0x40 | border, 0x08); - } - - void *out = (void *)&bitmap.data[(line * bitmap.pitch) + (bitmap.viewport.x * bitmap.granularity)]; - switch(bitmap.depth) - { - case 8: - remap_8(lb+0x20, (uint8 *)out, pixel_8, width); - break; - case 15: - remap_16(lb+0x20, (uint16 *)out, pixel_15, width); - break; - case 16: - remap_16(lb+0x20, (uint16 *)out, pixel_16, width); - break; - case 32: - remap_32(lb+0x20, (uint32 *)out, pixel_32, width); - break; - } - } - -/*--------------------------------------------------------------------------*/ -/* Window rendering */ -/*--------------------------------------------------------------------------*/ - -void render_ntw(int line, uint8 *buf) -{ - int column, v_line, width; - uint32 *nt, *src, *dst, atex, atbuf; - - v_line = (line & 7) << 3; - width = (reg[12] & 1) ? 7 : 6; - nt = (uint32 *)&vram[ntwb | ((line >> 3) << width)]; - dst = (uint32 *)&buf[0x20 + (clip[1].left << 4)]; - - for(column = clip[1].left; column < clip[1].right; column ++) - { - atbuf = nt[column]; - DRAW_COLUMN(atbuf, v_line) - } -} - -void render_ntw_im2(int line, uint8 *buf) -{ - int column, v_line, width; - uint32 *nt, *src, *dst, atex, atbuf, offs; - - v_line = ((line & 7) << 1 | ((status >> 4) & 1)) << 3; - width = (reg[12] & 1) ? 7 : 6; - nt = (uint32 *)&vram[ntwb | ((line >> 3) << width)]; - dst = (uint32 *)&buf[0x20 + (clip[1].left << 4)]; - - for(column = clip[1].left; column < clip[1].right; column ++) - { - atbuf = nt[column]; - DRAW_COLUMN_IM2(atbuf, v_line) - } -} - -/*--------------------------------------------------------------------------*/ -/* Background plane rendering */ -/*--------------------------------------------------------------------------*/ - -void render_ntx(int which, int line, uint8 *buf) -{ - int column; - int start, end; - int index; - int shift; - int v_line; - uint32 atex, atbuf, *src, *dst; - uint16 xscroll; - int y_scroll; - uint32 *nt; - uint32 *vs; - uint16 table[2] = {ntab,ntbb}; - uint8 xshift[2] = {0,2}; -#ifdef LSB_FIRST - uint8 vsr_shift[2] = {0,16}; -#else - uint8 vsr_shift[2] = {16,0}; -#endif - - get_hscroll(line, xshift[which], &xscroll); - shift = (xscroll & 0x0F); - index = playfield_col_mask + 1 - ((xscroll >> 4) & playfield_col_mask); - - if(which) - { - start = 0; - end = (reg[12] & 1) ? 20 : 16; - } - else - { - start = clip[0].left; - end = clip[0].right; - index = (index + clip[0].left) & playfield_col_mask; - } - - vs = (uint32 *)&vsram[0]; - y_scroll = (vs[0] >> vsr_shift[which]) & 0x3FF; - y_scroll = (line + y_scroll) & playfield_row_mask; - v_line = (y_scroll & 7) << 3; - nt = (uint32 *)&vram[table[which] + (((y_scroll >> 3) << playfield_shift) & y_mask)]; - - if(shift) - { - dst = (uint32 *)&buf[0x10 + shift + (start<<4)]; - - /* Window bug */ - if (start) atbuf = nt[(index) & playfield_col_mask]; - else atbuf = nt[(index-1) & playfield_col_mask]; - - DRAW_COLUMN(atbuf, v_line); - } - - dst = (uint32 *)&buf[0x20 + shift + (start<<4)]; - - for(column = start; column < end; column ++, index ++) - { - atbuf = nt[index & playfield_col_mask]; - DRAW_COLUMN(atbuf, v_line) - } -} - -void render_ntx_im2(int which, int line, uint8 *buf) -{ - int column; - int start, end; - int index; - int shift; - int v_line; - uint32 atex, atbuf, *src, *dst; - uint16 xscroll; - int y_scroll; - uint32 *nt; - uint32 *vs; - uint32 offs; - uint16 table[2] = {ntab,ntbb}; - uint8 xshift[2] = {0,2}; -#ifdef LSB_FIRST - uint8 vsr_shift[2] = {1,17}; -#else - uint8 vsr_shift[2] = {17,1}; -#endif - - get_hscroll(line, xshift[which], &xscroll); - shift = (xscroll & 0x0F); - index = playfield_col_mask + 1 - ((xscroll >> 4) & playfield_col_mask); - - if(which) - { - start = 0; - end = (reg[0x0C] & 1) ? 20 : 16; - } - else - { - start = clip[0].left; - end = clip[0].right; - index = (index + clip[0].left) & playfield_col_mask; - } - - vs = (uint32 *)&vsram[0]; - y_scroll = (vs[0] >> vsr_shift[which]) & 0x3FF; - y_scroll = (line + y_scroll) & playfield_row_mask; - v_line = (((y_scroll & 7) << 1) | ((status >> 4) & 1)) << 3; - nt = (uint32 *)&vram[table[which] + (((y_scroll >> 3) << playfield_shift) & y_mask)]; - - if(shift) - { - dst = (uint32 *)&buf[0x10 + shift + (start<<4)]; - - /* Window bug */ - if (start) atbuf = nt[(index) & playfield_col_mask]; - else atbuf = nt[(index-1) & playfield_col_mask]; - - DRAW_COLUMN(atbuf, v_line); - } - - dst = (uint32 *)&buf[0x20 + shift + (start<<4)]; - for(column = start; column < end; column ++, index ++) - { - atbuf = nt[index & playfield_col_mask]; - DRAW_COLUMN_IM2(atbuf, v_line) - } -} - -void render_ntx_vs(int which, int line, uint8 *buf) -{ - int column; - int start, end; - int index; - int shift; - int v_line; - uint32 atex, atbuf, *src, *dst; - uint16 xscroll; - int y_scroll; - uint32 *nt; - uint32 *vs; - uint16 table[2] = {ntab,ntbb}; - uint8 xshift[2] = {0,2}; -#ifdef LSB_FIRST - uint8 vsr_shift[2] = {0,16}; -#else - uint8 vsr_shift[2] = {16,0}; -#endif - - get_hscroll(line, xshift[which], &xscroll); - shift = (xscroll & 0x0F); - index = playfield_col_mask + 1 - ((xscroll >> 4) & playfield_col_mask); - - if(which) - { - start = 0; - end = (reg[0x0C] & 1) ? 20 : 16; - } - else - { - start = clip[0].left; - end = clip[0].right; - index = (index + clip[0].left) & playfield_col_mask; - } - - vs = (uint32 *)&vsram[0]; - - if(shift) - { - dst = (uint32 *)&buf[0x10 + shift + (start<<4)]; - y_scroll = (line & playfield_row_mask); - v_line = (y_scroll & 7) << 3; - nt = (uint32 *)&vram[table[which] + (((y_scroll >> 3) << playfield_shift) & y_mask)]; - - /* Window bug */ - if (start) atbuf = nt[(index) & playfield_col_mask]; - else atbuf = nt[(index-1) & playfield_col_mask]; - - DRAW_COLUMN(atbuf, v_line); - } - - dst = (uint32 *)&buf[0x20 + shift + (start<<4)]; - - for(column = start; column < end; column ++, index ++) - { - y_scroll = (vs[column] >> vsr_shift[which]) & 0x3FF; - y_scroll = (line + y_scroll) & playfield_row_mask; - v_line = (y_scroll & 7) << 3; - nt = (uint32 *)&vram[table[which] + (((y_scroll >> 3) << playfield_shift) & y_mask)]; - atbuf = nt[index & playfield_col_mask]; - DRAW_COLUMN(atbuf, v_line) - } -} - -/*--------------------------------------------------------------------------*/ -/* Helper functions (cache update, hscroll, window clip) */ -/*--------------------------------------------------------------------------*/ - -void update_bg_pattern_cache(void) -{ - int i; - uint8 x, y, c; - uint16 name; -#ifdef LSB_FIRST - uint8 shift_table[8] = {12, 8, 4, 0, 28, 24, 20, 16}; - #else - uint8 shift_table[8] = {28, 24, 20, 16, 12, 8, 4, 0}; - #endif - - if(!bg_list_index) return; - - for(i = 0; i < bg_list_index; i ++) - { - name = bg_name_list[i]; - bg_name_list[i] = 0; - - for(y = 0; y < 8; y ++) - { - if(bg_name_dirty[name] & (1 << y)) - { - uint8 *dst = &bg_pattern_cache[name << 6]; - uint32 bp = *(uint32 *)&vram[(name << 5) | (y << 2)]; - - for(x = 0; x < 8; x ++) - { - c = (bp >> shift_table[x]) & 0x0F; - dst[0x00000 | (y << 3) | (x)] = (c); /* hf=0, vf=0: normal */ - dst[0x20000 | (y << 3) | (x ^ 7)] = (c); /* hf=1, vf=0: horizontal flipped */ - dst[0x40000 | ((y ^ 7) << 3) | (x)] = (c); /* hf=0, vf=1: vertical flipped */ - dst[0x60000 | ((y ^ 7) << 3) | (x ^ 7)] = (c); /* hf=1, vf=1: horizontal & vertical flipped */ - } - } - } - bg_name_dirty[name] = 0; - } - bg_list_index = 0; -} - -void get_hscroll(int line, int shift, uint16 *scroll) -{ - switch(reg[11] & 3) - { - case 0: /* Full-screen */ - *scroll = *(uint16 *)&vram[hscb + shift]; - break; - - case 1: /* First 8 lines */ - *scroll = *(uint16 *)&vram[hscb + ((line & 7) << 2) + shift]; - break; - - case 2: /* Every 8 lines */ - *scroll = *(uint16 *)&vram[hscb + ((line & ~7) << 2) + shift]; - break; - - case 3: /* Every line */ - *scroll = *(uint16 *)&vram[hscb + (line << 2) + shift]; - break; - } - - *scroll &= 0x03FF; -} - -void window_clip(int line) -{ - /* Window size and invert flags */ - int hp = (reg[17] & 0x1F); - int hf = (reg[17] >> 7) & 1; - int vp = (reg[18] & 0x1F) << 3; - int vf = (reg[18] >> 7) & 1; - - /* Display size */ - int sw = (reg[12] & 1) ? 20 : 16; - - /* Clear clipping data */ - memset(&clip, 0, sizeof(clip)); - - /* Check if line falls within window range */ - if(vf == (line >= vp)) - { - /* Window takes up entire line */ - clip[1].right = sw; - clip[1].enable = 1; - } - else - { - /* Perform horizontal clipping; the results are applied in reverse - if the horizontal inversion flag is set */ - int a = hf; - int w = hf ^ 1; - - if(hp) - { - if(hp > sw) - { - /* Plane W takes up entire line */ - clip[w].right = sw; - clip[w].enable = 1; - } - else - { - /* Window takes left side, Plane A takes right side */ - clip[w].right = hp; - clip[a].left = hp; - clip[a].right = sw; - clip[0].enable = clip[1].enable = 1; - } - } - else - { - /* Plane A takes up entire line */ - clip[a].right = sw; - clip[a].enable = 1; - } - } -} - - -/*--------------------------------------------------------------------------*/ -/* Look-up table functions (handles priority between layers pixels) */ -/*--------------------------------------------------------------------------*/ - -/* Input (bx): d5-d0=color, d6=priority, d7=unused */ -/* Input (ax): d5-d0=color, d6=priority, d7=unused */ -/* Output: d5-d0=color, d6=priority, d7=unused */ -int make_lut_bg(int bx, int ax) -{ - int bf, bp, b; - int af, ap, a; - int x = 0; - int c; - - bf = (bx & 0x7F); - bp = (bx >> 6) & 1; - b = (bx & 0x0F); - - af = (ax & 0x7F); - ap = (ax >> 6) & 1; - a = (ax & 0x0F); - - c = (ap ? (a ? af : (b ? bf : x)) : \ - (bp ? (b ? bf : (a ? af : x)) : \ - ( (a ? af : (b ? bf : x)) ))); - - /* Strip palette bits from transparent pixels */ - if((c & 0x0F) == 0x00) c &= 0xC0; - - return (c); -} - - -/* Input (bx): d5-d0=color, d6=priority, d7=sprite pixel marker */ -/* Input (sx): d5-d0=color, d6=priority, d7=unused */ -/* Output: d5-d0=color, d6=zero, d7=sprite pixel marker */ -int make_lut_obj(int bx, int sx) -{ - int bf, bp, bs, b; - int sf, sp, s; - int c; - - bf = (bx & 0x3F); - bs = (bx >> 7) & 1; - bp = (bx >> 6) & 1; - b = (bx & 0x0F); - - sf = (sx & 0x3F); - sp = (sx >> 6) & 1; - s = (sx & 0x0F); - - if(s == 0) return bx; - - if(bs) - { - c = bf; /* previous sprite has higher priority */ - } - else - { - c = (sp ? (s ? sf : bf) : \ - (bp ? (b ? bf : (s ? sf : bf)) : \ - (s ? sf : bf) )); - } - - /* Strip palette bits from transparent pixels */ - if((c & 0x0F) == 0x00) c &= 0xC0; - - return (c | 0x80); -} - - -/* Input (bx): d5-d0=color, d6=priority, d7=unused */ -/* Input (sx): d5-d0=color, d6=priority, d7=unused */ -/* Output: d5-d0=color, d6=priority, d7=intensity select (half/normal) */ -int make_lut_bg_ste(int bx, int ax) -{ - int bf, bp, b; - int af, ap, a; - int gi; - int x = 0; - int c; - - bf = (bx & 0x7F); - bp = (bx >> 6) & 1; - b = (bx & 0x0F); - - af = (ax & 0x7F); - ap = (ax >> 6) & 1; - a = (ax & 0x0F); - - gi = (ap | bp) ? 0x80 : 0x00; - - c = (ap ? (a ? af : (b ? bf : x)) : - (bp ? (b ? bf : (a ? af : x)) : ((a ? af : (b ? bf : x))))); - - c |= gi; - - /* Strip palette bits from transparent pixels */ - if((c & 0x0F) == 0x00) c &= 0xC0; - - return (c); -} - - -/* Input (bx): d5-d0=color, d6=priority, d7=sprite pixel marker */ -/* Input (sx): d5-d0=color, d6=priority, d7=unused */ -/* Output: d5-d0=color, d6=priority, d7=sprite pixel marker */ -int make_lut_obj_ste(int bx, int sx) -{ - int bf, bs; - int sf; - int c; - - bf = (bx & 0x7F); - bs = (bx >> 7) & 1; - sf = (sx & 0x7F); - - if((sx & 0x0F) == 0) return bx; - - c = (bs) ? bf : sf; - - /* Strip palette bits from transparent pixels */ - if((c & 0x0F) == 0x00) c &= 0xC0; - - return (c | 0x80); -} - - -/* Input (bx): d5-d0=color, d6=priority, d7=intensity (half/normal) */ -/* Input (sx): d5-d0=color, d6=priority, d7=sprite marker */ -/* Output: d5-d0=color, d6=intensity (half/normal), d7=(double/invalid) */ -int make_lut_bgobj_ste(int bx, int sx) -{ - int c; - - int bf = (bx & 0x3F); - int bp = (bx >> 6) & 1; - int bi = (bx & 0x80) ? 0x40 : 0x00; - int b = (bx & 0x0F); - - int sf = (sx & 0x3F); - int sp = (sx >> 6) & 1; - int si = (sx & 0x40); - int s = (sx & 0x0F); - - if(bi & 0x40) si |= 0x40; - - if(sp) - { - if(s) - { - if((sf & 0x3E) == 0x3E) - { - if(sf & 1) - { - c = (bf | 0x00); - } - else - { - c = (bx & 0x80) ? (bf | 0x80) : (bf | 0x40); - } - } - else - { - if(sf == 0x0E || sf == 0x1E || sf == 0x2E) - { - c = (sf | 0x40); - } - else - { - c = (sf | si); - } - } - } - else - { - c = (bf | bi); - } - } - else - { - if(bp) - { - if(b) - { - c = (bf | bi); - } - else - { - if(s) - { - if((sf & 0x3E) == 0x3E) - { - if(sf & 1) - { - c = (bf | 0x00); - } - else - { - c = (bx & 0x80) ? (bf | 0x80) : (bf | 0x40); - } - } - else - { - if(sf == 0x0E || sf == 0x1E || sf == 0x2E) - { - c = (sf | 0x40); - } - else - { - c = (sf | si); - } - } - } - else - { - c = (bf | bi); - } - } - } - else - { - if(s) - { - if((sf & 0x3E) == 0x3E) - { - if(sf & 1) - { - c = (bf | 0x00); - } - else - { - c = (bx & 0x80) ? (bf | 0x80) : (bf | 0x40); - } - } - else - { - if(sf == 0x0E || sf == 0x1E || sf == 0x2E) - { - c = (sf | 0x40); - } - else - { - c = (sf | si); - } - } - } - else - { - c = (bf | bi); - } - } - } - - if((c & 0x0f) == 0x00) c &= 0xC0; - - return (c); -} - -/*--------------------------------------------------------------------------*/ -/* Remap functions */ -/*--------------------------------------------------------------------------*/ - -void remap_8(uint8 *src, uint8 *dst, uint8 *table, int length) -{ - int count; - for(count = 0; count < length; count += 1) - { - *dst++ = table[*src++]; - } -} - -void remap_16(uint8 *src, uint16 *dst, uint16 *table, int length) -{ - int count; - for(count = 0; count < length; count += 1) - { - *dst++ = table[*src++]; - } -} - -void remap_32(uint8 *src, uint32 *dst, uint32 *table, int length) -{ - int count; - for(count = 0; count < length; count += 1) - { - *dst++ = table[*src++]; - } -} - -/*--------------------------------------------------------------------------*/ -/* Merge functions */ -/*--------------------------------------------------------------------------*/ - -void merge(uint8 *srca, uint8 *srcb, uint8 *dst, uint8 *table, int width) -{ - int i; - for(i = 0; i < width; i += 1) - { - uint8 a = srca[i]; - uint8 b = srcb[i]; - uint8 c = table[(b << 8) | (a)]; - dst[i] = c; - } -} - -/*--------------------------------------------------------------------------*/ -/* Color update functions */ -/*--------------------------------------------------------------------------*/ - -void color_update_8(int index, uint16 data) -{ - if(reg[12] & 8) - { - pixel_8[0x00 | index] = pixel_8_lut[0][data]; - pixel_8[0x40 | index] = pixel_8_lut[1][data]; - pixel_8[0x80 | index] = pixel_8_lut[2][data]; - } - else - { - uint8 temp = pixel_8_lut[1][data]; - pixel_8[0x00 | index] = temp; - pixel_8[0x40 | index] = temp; - pixel_8[0x80 | index] = temp; - } -} - -void color_update_15(int index, uint16 data) -{ - if(reg[12] & 8) - { - pixel_15[0x00 | index] = pixel_15_lut[0][data]; - pixel_15[0x40 | index] = pixel_15_lut[1][data]; - pixel_15[0x80 | index] = pixel_15_lut[2][data]; - } - else - { - uint16 temp = pixel_15_lut[1][data]; - pixel_15[0x00 | index] = temp; - pixel_15[0x40 | index] = temp; - pixel_15[0x80 | index] = temp; - } -} - -void color_update_16(int index, uint16 data) -{ - if(reg[12] & 8) - { - pixel_16[0x00 | index] = pixel_16_lut[0][data]; - pixel_16[0x40 | index] = pixel_16_lut[1][data]; - pixel_16[0x80 | index] = pixel_16_lut[2][data]; - } - else - { - uint16 temp = pixel_16_lut[1][data]; - pixel_16[0x00 | index] = temp; - pixel_16[0x40 | index] = temp; - pixel_16[0x80 | index] = temp; - } -} - -void color_update_32(int index, uint16 data) -{ - if(reg[12] & 8) - { - pixel_32[0x00 | index] = pixel_32_lut[0][data]; - pixel_32[0x40 | index] = pixel_32_lut[1][data]; - pixel_32[0x80 | index] = pixel_32_lut[2][data]; - } - else - { - uint32 temp = pixel_32_lut[1][data]; - pixel_32[0x00 | index] = temp; - pixel_32[0x40 | index] = temp; - pixel_32[0x80 | index] = temp; - } -} - -/*--------------------------------------------------------------------------*/ -/* Object render functions */ -/*--------------------------------------------------------------------------*/ - -void parse_satb(int line) -{ - static uint8 sizetab[] = {8, 16, 24, 32}; - uint8 link = 0; - uint16 *p, *q; - uint16 ypos; - uint8 size; - int count; - int height; - - int limit = (reg[12] & 1) ? 20 : 16; - int total = (reg[12] & 1) ? 80 : 64; - - object_index_count = 0; - - for(count = 0; count < total; count += 1) - { - q = (uint16 *) &sat[link << 3]; - - ypos = q[0]; - if(im2_flag) ypos = (ypos >> 1) & 0x1FF; - else ypos &= 0x1FF; - - size = q[1] >> 8; - height = sizetab[size & 3]; - - if((line >= ypos) && (line < (ypos + height))) - { - /* sprite limit (max. 16 or 20 sprites displayed per line) */ - if(object_index_count == limit) - { - if(vint_pending == 0) status |= 0x40; - return; - } - - // using xpos from internal satb stops sprite x - // scrolling in bloodlin.bin, - // but this seems to go against the test prog - p = (uint16 *) &vram[satb + (link << 3)]; - object_info[object_index_count].ypos = q[0]; - object_info[object_index_count].xpos = p[3]; - object_info[object_index_count].attr = p[2]; - object_info[object_index_count].size = size; - object_info[object_index_count].index = count; - object_index_count += 1; - } - - link = q[1] & 0x7F; - if(link == 0) break; - } -} - -void render_obj(int line, uint8 *buf, uint8 *table) -{ - uint16 ypos; - uint16 attr; - uint16 xpos; - uint8 sizetab[] = {8, 16, 24, 32}; - uint8 size; - uint8 *src; - - int count; - int pixelcount = 0; - int width; - int height; - int v_line; - int column; - int sol_flag = 0; - int left = 0x80; - int right = 0x80 + bitmap.viewport.w; - int i; - - uint8 *s, *lb; - uint16 name, index; - uint8 palette; - - int attr_mask, nt_row; - - for(count = 0; count < object_index_count; count += 1) - { - xpos = object_info[count].xpos; - xpos &= 0x1ff; - - /* sprite masking */ - if(xpos != 0) sol_flag = 1; - else if(xpos == 0 && sol_flag) return; - - size = object_info[count].size & 0x0f; - width = sizetab[(size >> 2) & 3]; - - /* update pixel count (off-screen sprites included) */ - pixelcount += width; - - if(((xpos + width) >= left) && (xpos < right)) - { - ypos = object_info[count].ypos; - ypos &= 0x1ff; - attr = object_info[count].attr; - attr_mask = (attr & 0x1800); - - height = sizetab[size & 3]; - palette = (attr >> 9) & 0x70; - - v_line = (line - ypos); - nt_row = (v_line >> 3) & 3; - v_line = (v_line & 7) << 3; - - name = (attr & 0x07FF); - s = &name_lut[((attr >> 3) & 0x300) | (size << 4) | (nt_row << 2)]; - - lb = (uint8 *)&buf[0x20 + (xpos - 0x80)]; - - /* number of tiles to draw */ - width >>= 3; - - for(column = 0; column < width; column += 1, lb+=8) - { - index = attr_mask | ((name + s[column]) & 0x07FF); - src = &bg_pattern_cache[(index << 6) | (v_line)]; - DRAW_SPRITE_TILE; - } - - } - - /* sprite limit (256 or 320 pixels) */ - if (pixelcount >= bitmap.viewport.w) return; - - } -} - -void render_obj_im2(int line, uint8 *buf, uint8 *table) -{ - uint16 ypos; - uint16 attr; - uint16 xpos; - uint8 sizetab[] = {8, 16, 24, 32}; - uint8 size; - uint8 *src; - - int count; - int pixelcount = 0; - int width; - int height; - int v_line; - int column; - int sol_flag = 0; - int left = 0x80; - int right = 0x80 + bitmap.viewport.w; - int i; - - uint8 *s, *lb; - uint16 name, index; - uint8 palette; - uint32 offs; - - int attr_mask, nt_row; - - for(count = 0; count < object_index_count; count += 1) - { - xpos = object_info[count].xpos; - xpos &= 0x1ff; - - /* sprite masking */ - if(xpos != 0) sol_flag = 1; - else if(xpos == 0 && sol_flag) return; - - size = object_info[count].size & 0x0f; - width = sizetab[(size >> 2) & 3]; - - /* update pixel count (off-screen sprites included) */ - pixelcount += width; - - if(((xpos + width) >= left) && (xpos < right)) - { - ypos = object_info[count].ypos; - ypos = (ypos >> 1) & 0x1ff; - attr = object_info[count].attr; - attr_mask = (attr & 0x1800); - - height = sizetab[size & 3]; - palette = (attr >> 9) & 0x70; - - v_line = (line - ypos); - nt_row = (v_line >> 3) & 3; - v_line = (((v_line & 7) << 1) | ((status >> 4) & 1)) << 3; - - name = (attr & 0x03FF); - s = &name_lut[((attr >> 3) & 0x300) | (size << 4) | (nt_row << 2)]; - - lb = (uint8 *)&buf[0x20 + (xpos - 0x80)]; - - /* number of tiles to draw */ - width >>= 3; - - for(column = 0; column < width; column += 1, lb+=8) - { - index = (name + s[column]) & 0x3ff; - offs = index << 7 | attr_mask << 6 | v_line; - if(attr & 0x1000) offs ^= 0x40; - src = &bg_pattern_cache[offs]; - DRAW_SPRITE_TILE; - } - } - - /* sprite limit (256 or 320 pixels) */ - if (pixelcount >= bitmap.viewport.w) return; - } -} - +/*************************************************************************************** + * Genesis Plus 1.2a + * Video Display Processor (Rendering) + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#include "shared.h" + +/* Look-up pixel table information */ +#define LUT_MAX (5) +#define LUT_SIZE (0x10000) + +/* Clip structure */ +typedef struct +{ + uint8 left; + uint8 right; + uint8 enable; +}clip_t; + +/* Function prototypes */ +void render_obj(int line, uint8 *buf, uint8 *table); +void render_obj_im2(int line, uint8 *buf, uint8 *table, uint8 odd); +void render_ntw(int line, uint8 *buf); +void render_ntw_im2(int line, uint8 *buf, uint8 odd); +void render_ntx(int which, int line, uint8 *buf); +void render_ntx_im2(int which, int line, uint8 *buf, uint8 odd); +void render_ntx_vs(int which, int line, uint8 *buf); +void update_bg_pattern_cache(void); +void get_hscroll(int line, int shift, uint16 *scroll); +void window_clip(int line); +int make_lut_bg(int bx, int ax); +int make_lut_obj(int bx, int sx); +int make_lut_bg_ste(int bx, int ax); +int make_lut_obj_ste(int bx, int sx); +int make_lut_bgobj_ste(int bx, int sx); +void merge(uint8 *srca, uint8 *srcb, uint8 *dst, uint8 *table, int width); +void make_name_lut(void); +void (*color_update)(int index, uint16 data); +void remap_16(uint8 *src, uint16 *dst, uint16 *table, int length); +#ifndef NGC +void remap_8(uint8 *src, uint8 *dst, uint8 *table, int length); +void remap_32(uint8 *src, uint32 *dst, uint32 *table, int length); +#endif + +#ifndef LSB_FIRST +static uint32 ATTR_MSB; +#endif + +#ifdef ALIGN_LONG +/* Or change the names if you depend on these from elsewhere.. */ +#undef READ_LONG +#undef WRITE_LONG + +static __inline__ uint32 READ_LONG(void *address) +{ + if ((uint32)address & 3) + { +#ifdef LSB_FIRST /* little endian version */ + return ( *((uint8 *)address) + + (*((uint8 *)address+1) << 8) + + (*((uint8 *)address+2) << 16) + + (*((uint8 *)address+3) << 24) ); +#else /* big endian version */ + return ( *((uint8 *)address+3) + + (*((uint8 *)address+2) << 8) + + (*((uint8 *)address+1) << 16) + + (*((uint8 *)address) << 24) ); +#endif /* LSB_FIRST */ + } + else return *(uint32 *)address; +} + +static __inline__ void WRITE_LONG(void *address, uint32 data) +{ + if ((uint32)address & 3) + { +#ifdef LSB_FIRST + *((uint8 *)address) = data; + *((uint8 *)address+1) = (data >> 8); + *((uint8 *)address+2) = (data >> 16); + *((uint8 *)address+3) = (data >> 24); +#else + *((uint8 *)address+3) = data; + *((uint8 *)address+2) = (data >> 8); + *((uint8 *)address+1) = (data >> 16); + *((uint8 *)address) = (data >> 24); +#endif /* LSB_FIRST */ + return; + } + else *(uint32 *)address = data; +} + +#endif /* ALIGN_LONG */ + + +/* + Two Pattern Attributes are written in VRAM as two 16bits WORD: + + P = priority bit + C = color palette (2 bits) + V = Vertical Flip bit + H = Horizontal Flip bit + N = Pattern Number (11 bits) + + MSB PCCVHNNN NNNNNNNN LSB PCCVHNNN NNNNNNNN LSB + PATTERN1 PATTERN2 + + Pattern attributes are read from VRAM as 32bits WORD like this: + + LIT_ENDIAN: ATTR is MSB PCCVHNNN NNNNNNNN PCCVHNNN NNNNNNNN LSB + PATTERN2 PATTERN1 + + BIG_ENDIAN: ATTR is MSB PCCVHNNN NNNNNNNN PCCVHNNN NNNNNNNN LSB + PATTERN1 PATTERN2 + + + Each Line Buffer written byte describe one pixel data like this: + + msb SPppcccc lsb + + with: + S = sprite data indicator (not written here) + P = priority bit (from Pattern Attribute) + p = color palette (from Pattern Attribute) + c = color data (from Pattern Cache) + + + A column is 2 patterns wide + A pattern is 8 pixels wide = 8 bytes = two 32 bits write +*/ + +/* Draw a single 8-pixel column */ +/* + pattern cache is addressed like this: 00000VHN NNNNNNNN NNYYYXXX + with : Y = pattern row (1-8 lines) + X = pattern column (1-8 pixels) + V = Vertical Flip bit + H = Horizontal Flip bit + N = Pattern Number (1-2048) +*/ +#ifdef ALIGN_LONG +#ifdef LSB_FIRST +#define DRAW_COLUMN(ATTR, LINE) \ + atex = atex_table[(ATTR >> 13) & 7]; \ + src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; \ + ATTR >>= 16; \ + atex = atex_table[(ATTR >> 13) & 7]; \ + src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; +#else +#define DRAW_COLUMN(ATTR, LINE) \ + ATTR_MSB = ATTR >> 16; \ + atex = atex_table[(ATTR_MSB >> 13) & 7]; \ + src = (uint32 *)&bg_pattern_cache[(ATTR_MSB & 0x1FFF) << 6 | (LINE)]; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; \ + atex = atex_table[(ATTR >> 13) & 7]; \ + src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; +#endif +#else /* NOT ALIGNED */ +#ifdef LSB_FIRST +#define DRAW_COLUMN(ATTR, LINE) \ + atex = atex_table[(ATTR >> 13) & 7]; \ + src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ + *dst++ = (*src++ | atex); \ + *dst++ = (*src++ | atex); \ + ATTR >>= 16; \ + atex = atex_table[(ATTR >> 13) & 7]; \ + src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ + *dst++ = (*src++ | atex); \ + *dst++ = (*src++ | atex); +#else +#define DRAW_COLUMN(ATTR, LINE) \ + ATTR_MSB = ATTR >> 16; \ + atex = atex_table[(ATTR_MSB >> 13) & 7]; \ + src = (uint32 *)&bg_pattern_cache[(ATTR_MSB & 0x1FFF) << 6 | (LINE)]; \ + *dst++ = (*src++ | atex); \ + *dst++ = (*src++ | atex); \ + atex = atex_table[(ATTR >> 13) & 7]; \ + src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \ + *dst++ = (*src++ | atex); \ + *dst++ = (*src++ | atex); +#endif +#endif /* ALIGN_LONG */ + + +/* Draw a single 16-pixel column */ +/* + pattern cache is addressed like this: 00000VHN NNNNNNNN NYYYYXXX + with : Y = pattern row (1-16 lines) + X = pattern column (1-8 pixels) + V = Vertical Flip bit + H = Horizontal Flip bit + N = Pattern Number (1-1024) + + one pattern line is 8 pixels = 8 bytes = 2 * 32 bits +*/ +#ifdef ALIGN_LONG +#ifdef LSB_FIRST +#define DRAW_COLUMN_IM2(ATTR, LINE) \ + atex = atex_table[(ATTR >> 13) & 7]; \ + offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ + if(ATTR & 0x1000) offs ^= 0x40; \ + src = (uint32 *)&bg_pattern_cache[offs]; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; \ + ATTR >>= 16; \ + atex = atex_table[(ATTR >> 13) & 7]; \ + offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ + if(ATTR & 0x1000) offs ^= 0x40; \ + src = (uint32 *)&bg_pattern_cache[offs]; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; +#else +#define DRAW_COLUMN_IM2(ATTR, LINE) \ + ATTR_MSB = ATTR >> 16; \ + atex = atex_table[(ATTR_MSB >> 13) & 7]; \ + offs = (ATTR_MSB & 0x03FF) << 7 | (ATTR_MSB & 0x1800) << 6 | (LINE); \ + if(ATTR_MSB & 0x1000) offs ^= 0x40; \ + src = (uint32 *)&bg_pattern_cache[offs]; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; \ + atex = atex_table[(ATTR >> 13) & 7]; \ + offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ + if(ATTR & 0x1000) offs ^= 0x40; \ + src = (uint32 *)&bg_pattern_cache[offs]; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; \ + WRITE_LONG(dst, READ_LONG(src) | atex); \ + dst++; \ + src++; +#endif +#else /* NOT ALIGNED */ +#ifdef LSB_FIRST +#define DRAW_COLUMN_IM2(ATTR, LINE) \ + atex = atex_table[(ATTR >> 13) & 7]; \ + offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ + if(ATTR & 0x1000) offs ^= 0x40; \ + src = (uint32 *)&bg_pattern_cache[offs]; \ + *dst++ = (*src++ | atex); \ + *dst++ = (*src++ | atex); \ + ATTR >>= 16; \ + atex = atex_table[(ATTR >> 13) & 7]; \ + offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ + if(ATTR & 0x1000) offs ^= 0x40; \ + src = (uint32 *)&bg_pattern_cache[offs]; \ + *dst++ = (*src++ | atex); \ + *dst++ = (*src++ | atex); +#else +#define DRAW_COLUMN_IM2(ATTR, LINE) \ + ATTR_MSB = ATTR >> 16; \ + atex = atex_table[(ATTR_MSB >> 13) & 7]; \ + offs = (ATTR_MSB & 0x03FF) << 7 | (ATTR_MSB & 0x1800) << 6 | (LINE); \ + if(ATTR_MSB & 0x1000) offs ^= 0x40; \ + src = (uint32 *)&bg_pattern_cache[offs]; \ + *dst++ = (*src++ | atex); \ + *dst++ = (*src++ | atex); \ + atex = atex_table[(ATTR >> 13) & 7]; \ + offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \ + if(ATTR & 0x1000) offs ^= 0x40; \ + src = (uint32 *)&bg_pattern_cache[offs]; \ + *dst++ = (*src++ | atex); \ + *dst++ = (*src++ | atex); +#endif +#endif /* ALIGN_LONG */ + +/* + gcc complains about this: + *lb++ = table[(*lb << 8) |(*src++ | palette)]; + .. claiming the result on lb is undefined. + So we manually advance lb and use constant offsets into the line buffer. +*/ + +/* added sprite collision detection: + check if non-transparent sprite data has been previously drawn +*/ +#define DRAW_SPRITE_TILE \ + for(i=0; i<8; i++) \ + { \ + if ((lb[i] & 0x80) && ((lb[i] | src[i]) & 0x0F)) status |= 0x20; \ + lb[i] = table[(lb[i] << 8) |(src[i] | palette)]; \ + } + + +/* Pixel creation macros, input is four bits each */ +#ifndef NGC + +/* 8:8:8 RGB */ +#define MAKE_PIXEL_32(r,g,b) ((r) << 20 | (g) << 12 | (b) << 4) + +/* 5:5:5 RGB */ +#define MAKE_PIXEL_15(r,g,b) ((r) << 11 | (g) << 6 | (b) << 1) + +/* 3:3:2 RGB */ +#define MAKE_PIXEL_8(r,g,b) ((r) << 5 | (g) << 2 | ((b) >> 1)) + +#endif + +/* 5:6:5 RGB */ +#define MAKE_PIXEL_16(r,g,b) ((r) << 11 | (g) << 5 | (b)) + + +/* Clip data */ +static clip_t clip[2]; + +/* Attribute expansion table */ +static const uint32 atex_table[] = { + 0x00000000, 0x10101010, 0x20202020, 0x30303030, + 0x40404040, 0x50505050, 0x60606060, 0x70707070 +}; + +/* Sprite name look-up table */ +static uint8 name_lut[0x400]; + +struct +{ + uint16 ypos; + uint16 xpos; + uint16 attr; + uint8 size; + uint8 index; +} object_info[20]; + +/* Pixel look-up tables and table base address */ +static uint8 *lut[5]; +static uint8 *lut_base = NULL; + +#ifndef NGC +/* 8-bit pixel remapping data */ +static uint8 pixel_8[0x100]; +static uint8 pixel_8_lut[3][0x200]; + +/* 15-bit pixel remapping data */ +static uint16 pixel_15[0x100]; +static uint16 pixel_15_lut[3][0x200]; + +/* 32-bit pixel remapping data */ +static uint32 pixel_32[0x100]; +static uint32 pixel_32_lut[3][0x200]; +#endif + +/* 16-bit pixel remapping data */ +static uint16 pixel_16[0x100]; +static uint16 pixel_16_lut[3][0x200]; + +/* Line buffers */ +static uint8 tmp_buf[0x400]; /* Temporary buffer */ +static uint8 bg_buf[0x400]; /* Merged background buffer */ +static uint8 nta_buf[0x400]; /* Plane A / Window line buffer */ +static uint8 ntb_buf[0x400]; /* Plane B line buffer */ +static uint8 obj_buf[0x400]; /* Object layer line buffer */ + +/* Sprite line buffer data */ +static uint8 object_index_count; + +/* + 3:3:3 to 5:6:5 RGB pixel extrapolation tables + this is used to convert 3bits RGB values to 5bits (R,B) or 6bits (G) values + there is three color modes: + normal: RGB range is [0;MAX] + half: RGB range is [0;MAX/2] (shadow mode) + high: RGB range is [MAX/2;MAX] (highlight mode) + + MAX is 31 (R,B) or 63 (G) for 5:6:5 pixels and 7 (R,G,B) for 3:3:3 pixels + MAX/2 is rounded to inferior value (15, 31 or 3) + + the extrapolation is linear and calculated like this: + + for (i=0; i<8; i++) + { + rgb565_norm[0][i] = round(((double)i * 31.0) / 7.0); + rgb565_norm[1][i] = round(((double)i * 63.0) / 7.0); + + rgb565_half[0][i] = round(((double)i * 31.0) / 7.0 / 2.0); + rgb565_half[1][i] = round(((double)i * 63.0) / 7.0 / 2.0); + + rgb565_high[0][i] = round(((double)i * 31.0) / 7.0 / 2.0 + 15.5); + rgb565_high[1][i] = round(((double)i * 63.0) / 7.0 / 2.0 + 31.5); + } + +*/ + +uint8 rgb565_norm[2][8] = {{0 , 4, 9, 13, 18, 22, 27, 31}, + {0 , 9, 18, 27, 36, 45, 54, 63}}; +uint8 rgb565_half[2][8] = {{0 , 2, 4, 6, 9, 11, 13, 15}, + {0 , 4, 9, 13, 18, 22, 27, 31}}; +uint8 rgb565_high[2][8] = {{15, 17, 19, 21, 24, 26, 28, 31}, + {31, 35, 40, 44, 49, 53, 58, 63}}; + + +void palette_init(void) +{ + int i; + + for (i = 0; i < 0x200; i += 1) + { + int r, g, b; + + r = (i >> 6) & 7; + g = (i >> 3) & 7; + b = (i >> 0) & 7; + +#ifndef NGC + pixel_8_lut[0][i] = MAKE_PIXEL_8(r>>1,g>>1,b>>1); + pixel_8_lut[1][i] = MAKE_PIXEL_8(r,g,b); + pixel_8_lut[2][i] = MAKE_PIXEL_8((r>>1)|4,(g>>1)|4,(b>>1)|4); + + pixel_15_lut[0][i] = MAKE_PIXEL_15(r,g,b); + pixel_15_lut[1][i] = MAKE_PIXEL_15(r<<1,g<<1,b<<1); + pixel_15_lut[2][i] = MAKE_PIXEL_15(r|8,g|8,b|8); + + pixel_32_lut[0][i] = MAKE_PIXEL_32(r,g,b); + pixel_32_lut[1][i] = MAKE_PIXEL_32(r<<1,g<<1,b<<1); + pixel_32_lut[2][i] = MAKE_PIXEL_32(r|8,g|8,b|8); +#endif + + /* RGB 565 format: we extrapolate each 3-bit value into a 5-bit (R,B) or 6-bit (G) value + this is needed to correctly cover full color range: [0-31] for R,B or [0-63] for G */ + pixel_16_lut[0][i] = MAKE_PIXEL_16(rgb565_half[0][r],rgb565_half[1][g],rgb565_half[0][b]); + pixel_16_lut[1][i] = MAKE_PIXEL_16(rgb565_norm[0][r],rgb565_norm[1][g],rgb565_norm[0][b]); + pixel_16_lut[2][i] = MAKE_PIXEL_16(rgb565_high[0][r],rgb565_high[1][g],rgb565_high[0][b]); + } +} + +/*--------------------------------------------------------------------------*/ +/* Init, reset, shutdown routines */ +/*--------------------------------------------------------------------------*/ + +int render_init (void) +{ + int bx, ax, i; + + /* Allocate and align pixel look-up tables */ + if (lut_base == NULL) lut_base = malloc ((LUT_MAX * LUT_SIZE) + LUT_SIZE); + lut[0] = (uint8 *) (((uint32) lut_base + LUT_SIZE) & ~(LUT_SIZE - 1)); + for (i = 1; i < LUT_MAX; i += 1) lut[i] = lut[0] + (i * LUT_SIZE); + + /* Make pixel look-up table data */ + for (bx = 0; bx < 0x100; bx += 1) + for (ax = 0; ax < 0x100; ax += 1) + { + uint16 index = (bx << 8) | (ax); + lut[0][index] = make_lut_bg (bx, ax); + lut[1][index] = make_lut_obj (bx, ax); + lut[2][index] = make_lut_bg_ste (bx, ax); + lut[3][index] = make_lut_obj_ste (bx, ax); + lut[4][index] = make_lut_bgobj_ste (bx, ax); + } + + /* Make pixel data tables */ + palette_init(); + + /* Set up color update function */ +#ifndef NGC + switch(bitmap.depth) + { + case 8: color_update = color_update_8; break; + case 15: color_update = color_update_15; break; + case 16: color_update = color_update_16; break; + case 32: color_update = color_update_32; break; + } +#else + color_update = color_update_16; +#endif + + /* Make sprite name look-up table */ + make_name_lut(); + + return (1); +} + +void make_name_lut(void) +{ + int col, row; + int vcol, vrow; + int width, height; + int flipx, flipy; + int i, name; + + memset (name_lut, 0, sizeof (name_lut)); + + for (i = 0; i < 0x400; i += 1) + { + vcol = col = i & 3; + vrow = row = (i >> 2) & 3; + height = (i >> 4) & 3; + width = (i >> 6) & 3; + flipx = (i >> 8) & 1; + flipy = (i >> 9) & 1; + + if(flipx) vcol = (width - col); + if(flipy) vrow = (height - row); + + name = vrow + (vcol * (height + 1)); + + if ((row > height) || col > width) name = -1; + + name_lut[i] = name; + } +} + +void render_reset(void) +{ + /* Clear display bitmap */ + memset(bitmap.data, 0, bitmap.pitch * bitmap.height); + + memset(&clip, 0, sizeof(clip)); + memset(bg_buf, 0, sizeof(bg_buf)); + memset(tmp_buf, 0, sizeof(tmp_buf)); + memset(nta_buf, 0, sizeof(nta_buf)); + memset(ntb_buf, 0, sizeof(ntb_buf)); + memset(obj_buf, 0, sizeof(obj_buf)); + +#ifndef NGC + memset(&pixel_8, 0, sizeof(pixel_8)); + memset(&pixel_15, 0, sizeof(pixel_15)); + memset(&pixel_32, 0, sizeof(pixel_32)); +#endif + memset(&pixel_16, 0, sizeof(pixel_16)); +} + + +void render_shutdown(void) +{ + if(lut_base) free(lut_base); +} + +/*--------------------------------------------------------------------------*/ +/* Line render function */ +/*--------------------------------------------------------------------------*/ +void remap_buffer(int line, int width) +{ + /* get line offset from framebuffer */ + int offset = vdp_pal ? bitmap.viewport.y : (bitmap.viewport.y*11/8); // NTSC is 243 lines + int vline = (line + offset) % lines_per_frame; + + /* illegal video mode (screen rolls up) */ + if (!vdp_pal && (reg[1] & 8)) vline = (vline + frame_cnt)%240; + + /* double resolution mode */ + if (config.render && interlaced) vline = (vline * 2) + odd_frame; + + void *out =((void *)&bitmap.data[(vline * bitmap.pitch)]); + +#ifndef NGC + switch(bitmap.depth) + { + case 8: + remap_8(tmp_buf+0x20-bitmap.viewport.x, (uint8 *)out, pixel_8, width); + break; + case 15: + remap_16(tmp_buf+0x20-bitmap.viewport.x, (uint16 *)out, pixel_15, width); + break; + case 16: + remap_16(tmp_buf+0x20-bitmap.viewport.x, (uint16 *)out, pixel_16, width); + break; + case 32: + remap_32(tmp_buf+0x20-bitmap.viewport.x, (uint32 *)out, pixel_32, width); + break; + } +#else + remap_16(tmp_buf+0x20-bitmap.viewport.x, (uint16 *)out, pixel_16, width); +#endif +} + + +void render_line(int line, uint8 odd_frame) +{ + /* check if we are inside display area (including vertical borders) */ + int min = bitmap.viewport.h + bitmap.viewport.y; + int max = lines_per_frame - bitmap.viewport.y; + if ((line >= min) && (line < max)) return; + + uint8 *lb = tmp_buf; + int width = bitmap.viewport.w; + + /* vertical borders or display OFF */ + if ((line >= bitmap.viewport.h) || (!(reg[1] & 0x40))) + { + memset(&lb[0x20], 0x40 | border, width); + } + else + { + update_bg_pattern_cache(); + window_clip(line); + + if(im2_flag) + { + if (clip[0].enable) render_ntx_im2(0, line, nta_buf, odd_frame); + render_ntx_im2(1, line, ntb_buf, odd_frame); + if (clip[1].enable) render_ntw_im2(line, nta_buf, odd_frame); + } + else + { + if(reg[11] & 4) + { + if (clip[0].enable) render_ntx_vs(0, line, nta_buf); + render_ntx_vs(1, line, ntb_buf); + } + else + { + if (clip[0].enable) render_ntx(0, line, nta_buf); + render_ntx(1, line, ntb_buf); + } + if (clip[1].enable) render_ntw(line, nta_buf); + } + + if(reg[12] & 8) + { + merge(&nta_buf[0x20], &ntb_buf[0x20], &bg_buf[0x20], lut[2], width); + memset(&obj_buf[0x20], 0, width); + + if(im2_flag) render_obj_im2(line, obj_buf, lut[3], odd_frame); + else render_obj(line, obj_buf, lut[3]); + + merge(&obj_buf[0x20], &bg_buf[0x20], &lb[0x20], lut[4], width); + } + else + { + merge(&nta_buf[0x20], &ntb_buf[0x20], &lb[0x20], lut[0], width); + if(im2_flag) render_obj_im2(line, lb, lut[1], odd_frame); + else render_obj(line, lb, lut[1]); + } + + /* Mode 4 feature only (unemulated, no games rely on this) */ + /*if(!(reg[1] & 0x04) && (reg[0] & 0x20)) memset(&lb[0x20], 0x40 | border, 0x08);*/ + } + + /* horizontal borders */ + if (config.overscan) + { + memset(&lb[0x20 - bitmap.viewport.x], 0x40 | border, bitmap.viewport.x); + memset(&lb[0x20 + bitmap.viewport.w], 0x40 | border, bitmap.viewport.x); + width += 2 * bitmap.viewport.x; + } + + /* LightGun mark */ + if ((input.dev[4] == DEVICE_LIGHTGUN) && (config.crosshair)) + { + int dy = v_counter - input.analog[0][1]; + + if (abs(dy) < 6) + { + int i; + int start = input.analog[0][0] - 4; + int end = start + 8; + if (start < 0) start = 0; + if (end > bitmap.viewport.w) end = bitmap.viewport.w; + for (i=start; i> 3) << width)]; + dst = (uint32 *)&buf[0x20 + (clip[1].left << 4)]; + + for(column = clip[1].left; column < clip[1].right; column ++) + { + atbuf = nt[column]; + DRAW_COLUMN(atbuf, v_line) + } +} + +void render_ntw_im2(int line, uint8 *buf, uint8 odd) +{ + int column, v_line, width; + uint32 *nt, *src, *dst, atex, atbuf, offs; + + v_line = ((line & 7) << 1 | odd) << 3; + width = (reg[12] & 1) ? 7 : 6; + nt = (uint32 *)&vram[ntwb | ((line >> 3) << width)]; + dst = (uint32 *)&buf[0x20 + (clip[1].left << 4)]; + + for(column = clip[1].left; column < clip[1].right; column ++) + { + atbuf = nt[column]; + DRAW_COLUMN_IM2(atbuf, v_line) + } +} + +/*--------------------------------------------------------------------------*/ +/* Background plane rendering */ +/*--------------------------------------------------------------------------*/ + +void render_ntx(int which, int line, uint8 *buf) +{ + int column; + int start, end; + int index; + int shift; + int v_line; + uint32 atex, atbuf, *src, *dst; + uint16 xscroll; + int y_scroll; + uint32 *nt; + uint32 *vs; + uint16 table[2] = {ntab,ntbb}; + uint8 xshift[2] = {0,2}; +#ifdef LSB_FIRST + uint8 vsr_shift[2] = {0,16}; +#else + uint8 vsr_shift[2] = {16,0}; +#endif + + get_hscroll(line, xshift[which], &xscroll); + shift = (xscroll & 0x0F); + index = playfield_col_mask + 1 - ((xscroll >> 4) & playfield_col_mask); + + if(which) + { + start = 0; + end = (reg[12] & 1) ? 20 : 16; + } + else + { + start = clip[0].left; + end = clip[0].right; + index = (index + clip[0].left) & playfield_col_mask; + } + + vs = (uint32 *)&vsram[0]; + y_scroll = (vs[0] >> vsr_shift[which]) & 0x3FF; + y_scroll = (line + y_scroll) & playfield_row_mask; + v_line = (y_scroll & 7) << 3; + nt = (uint32 *)&vram[table[which] + (((y_scroll >> 3) << playfield_shift) & y_mask)]; + + if(shift) + { + dst = (uint32 *)&buf[0x10 + shift + (start<<4)]; + + /* Window bug */ + if (start) atbuf = nt[(index) & playfield_col_mask]; + else atbuf = nt[(index-1) & playfield_col_mask]; + + DRAW_COLUMN(atbuf, v_line); + } + + dst = (uint32 *)&buf[0x20 + shift + (start<<4)]; + + for(column = start; column < end; column ++, index ++) + { + atbuf = nt[index & playfield_col_mask]; + DRAW_COLUMN(atbuf, v_line) + } +} + +void render_ntx_im2(int which, int line, uint8 *buf, uint8 odd) +{ + int column; + int start, end; + int index; + int shift; + int v_line; + uint32 atex, atbuf, *src, *dst; + uint16 xscroll; + int y_scroll; + uint32 *nt; + uint32 *vs; + uint32 offs; + uint16 table[2] = {ntab,ntbb}; + uint8 xshift[2] = {0,2}; +#ifdef LSB_FIRST + uint8 vsr_shift[2] = {1,17}; +#else + uint8 vsr_shift[2] = {17,1}; +#endif + + get_hscroll(line, xshift[which], &xscroll); + shift = (xscroll & 0x0F); + index = playfield_col_mask + 1 - ((xscroll >> 4) & playfield_col_mask); + + if(which) + { + start = 0; + end = (reg[12] & 1) ? 20 : 16; + } + else + { + start = clip[0].left; + end = clip[0].right; + index = (index + clip[0].left) & playfield_col_mask; + } + + vs = (uint32 *)&vsram[0]; + y_scroll = (vs[0] >> vsr_shift[which]) & 0x3FF; + y_scroll = (line + y_scroll) & playfield_row_mask; + v_line = (((y_scroll & 7) << 1) | odd) << 3; + nt = (uint32 *)&vram[table[which] + (((y_scroll >> 3) << playfield_shift) & y_mask)]; + + if(shift) + { + dst = (uint32 *)&buf[0x10 + shift + (start<<4)]; + + /* Window bug */ + if (start) atbuf = nt[(index) & playfield_col_mask]; + else atbuf = nt[(index-1) & playfield_col_mask]; + DRAW_COLUMN_IM2(atbuf, v_line); + } + + dst = (uint32 *)&buf[0x20 + shift + (start<<4)]; + for(column = start; column < end; column ++, index ++) + { + atbuf = nt[index & playfield_col_mask]; + DRAW_COLUMN_IM2(atbuf, v_line) + } +} + +void render_ntx_vs(int which, int line, uint8 *buf) +{ + int column; + int start, end; + int index; + int shift; + int v_line; + uint32 atex, atbuf, *src, *dst; + uint16 xscroll; + int y_scroll; + uint32 *nt; + uint32 *vs; + uint16 table[2] = {ntab,ntbb}; + uint8 xshift[2] = {0,2}; +#ifdef LSB_FIRST + uint8 vsr_shift[2] = {0,16}; +#else + uint8 vsr_shift[2] = {16,0}; +#endif + + get_hscroll(line, xshift[which], &xscroll); + shift = (xscroll & 0x0F); + index = playfield_col_mask + 1 - ((xscroll >> 4) & playfield_col_mask); + + if(which) + { + start = 0; + end = (reg[12] & 1) ? 20 : 16; + } + else + { + start = clip[0].left; + end = clip[0].right; + index = (index + clip[0].left) & playfield_col_mask; + } + + vs = (uint32 *)&vsram[0]; + + if(shift) + { + dst = (uint32 *)&buf[0x10 + shift + (start<<4)]; + y_scroll = (line & playfield_row_mask); + v_line = (y_scroll & 7) << 3; + nt = (uint32 *)&vram[table[which] + (((y_scroll >> 3) << playfield_shift) & y_mask)]; + + /* Window bug */ + if (start) atbuf = nt[(index) & playfield_col_mask]; + else atbuf = nt[(index-1) & playfield_col_mask]; + + DRAW_COLUMN(atbuf, v_line); + } + + dst = (uint32 *)&buf[0x20 + shift + (start<<4)]; + + for(column = start; column < end; column ++, index ++) + { + y_scroll = (vs[column] >> vsr_shift[which]) & 0x3FF; + y_scroll = (line + y_scroll) & playfield_row_mask; + v_line = (y_scroll & 7) << 3; + nt = (uint32 *)&vram[table[which] + (((y_scroll >> 3) << playfield_shift) & y_mask)]; + atbuf = nt[index & playfield_col_mask]; + DRAW_COLUMN(atbuf, v_line) + } +} + +/*--------------------------------------------------------------------------*/ +/* Helper functions (cache update, hscroll, window clip) */ +/*--------------------------------------------------------------------------*/ + +void update_bg_pattern_cache(void) +{ + int i; + uint8 x, y, c; + uint16 name; +#ifdef LSB_FIRST + uint8 shift_table[8] = {12, 8, 4, 0, 28, 24, 20, 16}; + #else + uint8 shift_table[8] = {28, 24, 20, 16, 12, 8, 4, 0}; + #endif + + if(!bg_list_index) return; + + for(i = 0; i < bg_list_index; i ++) + { + name = bg_name_list[i]; + bg_name_list[i] = 0; + + for(y = 0; y < 8; y ++) + { + if(bg_name_dirty[name] & (1 << y)) + { + uint8 *dst = &bg_pattern_cache[name << 6]; + uint32 bp = *(uint32 *)&vram[(name << 5) | (y << 2)]; + + for(x = 0; x < 8; x ++) + { + c = (bp >> shift_table[x]) & 0x0F; + dst[0x00000 | (y << 3) | (x)] = (c); /* hf=0, vf=0: normal */ + dst[0x20000 | (y << 3) | (x ^ 7)] = (c); /* hf=1, vf=0: horizontal flipped */ + dst[0x40000 | ((y ^ 7) << 3) | (x)] = (c); /* hf=0, vf=1: vertical flipped */ + dst[0x60000 | ((y ^ 7) << 3) | (x ^ 7)] = (c); /* hf=1, vf=1: horizontal & vertical flipped */ + } + } + } + bg_name_dirty[name] = 0; + } + bg_list_index = 0; +} + +void get_hscroll(int line, int shift, uint16 *scroll) +{ + switch(reg[11] & 3) + { + case 0: /* Full-screen */ + *scroll = *(uint16 *)&vram[hscb + shift]; + break; + + case 1: /* First 8 lines */ + *scroll = *(uint16 *)&vram[hscb + ((line & 7) << 2) + shift]; + break; + + case 2: /* Every 8 lines */ + *scroll = *(uint16 *)&vram[hscb + ((line & ~7) << 2) + shift]; + break; + + case 3: /* Every line */ + *scroll = *(uint16 *)&vram[hscb + (line << 2) + shift]; + break; + } + + *scroll &= 0x03FF; +} + +void window_clip(int line) +{ + /* Window size and invert flags */ + int hp = (reg[17] & 0x1F); + int hf = (reg[17] >> 7) & 1; + int vp = (reg[18] & 0x1F) << 3; + int vf = (reg[18] >> 7) & 1; + + /* Display size */ + int sw = (reg[12] & 1) ? 20 : 16; + + /* Clear clipping data */ + memset(&clip, 0, sizeof(clip)); + + /* Check if line falls within window range */ + if(vf == (line >= vp)) + { + /* Window takes up entire line */ + clip[1].right = sw; + clip[1].enable = 1; + } + else + { + /* Perform horizontal clipping; the results are applied in reverse + if the horizontal inversion flag is set */ + int a = hf; + int w = hf ^ 1; + + if(hp) + { + if(hp > sw) + { + /* Plane W takes up entire line */ + clip[w].right = sw; + clip[w].enable = 1; + } + else + { + /* Window takes left side, Plane A takes right side */ + clip[w].right = hp; + clip[a].left = hp; + clip[a].right = sw; + clip[0].enable = clip[1].enable = 1; + } + } + else + { + /* Plane A takes up entire line */ + clip[a].right = sw; + clip[a].enable = 1; + } + } +} + + +/*--------------------------------------------------------------------------*/ +/* Look-up table functions (handles priority between layers pixels) */ +/*--------------------------------------------------------------------------*/ + +/* Input (bx): d5-d0=color, d6=priority, d7=unused */ +/* Input (ax): d5-d0=color, d6=priority, d7=unused */ +/* Output: d5-d0=color, d6=priority, d7=unused */ +int make_lut_bg(int bx, int ax) +{ + int bf, bp, b; + int af, ap, a; + int x = 0; + int c; + + bf = (bx & 0x7F); + bp = (bx >> 6) & 1; + b = (bx & 0x0F); + + af = (ax & 0x7F); + ap = (ax >> 6) & 1; + a = (ax & 0x0F); + + c = (ap ? (a ? af : (b ? bf : x)) : \ + (bp ? (b ? bf : (a ? af : x)) : \ + ( (a ? af : (b ? bf : x)) ))); + + /* Strip palette bits from transparent pixels */ + if((c & 0x0F) == 0x00) c &= 0xC0; + + return (c); +} + + +/* Input (bx): d5-d0=color, d6=priority, d7=sprite pixel marker */ +/* Input (sx): d5-d0=color, d6=priority, d7=unused */ +/* Output: d5-d0=color, d6=zero, d7=sprite pixel marker */ +int make_lut_obj(int bx, int sx) +{ + int bf, bp, bs, b; + int sf, sp, s; + int c; + + bf = (bx & 0x3F); + bs = (bx >> 7) & 1; + bp = (bx >> 6) & 1; + b = (bx & 0x0F); + + sf = (sx & 0x3F); + sp = (sx >> 6) & 1; + s = (sx & 0x0F); + + if(s == 0) return bx; + + if(bs) + { + c = bf; /* previous sprite has higher priority */ + } + else + { + c = (sp ? (s ? sf : bf) : \ + (bp ? (b ? bf : (s ? sf : bf)) : \ + (s ? sf : bf) )); + } + + /* Strip palette bits from transparent pixels */ + if((c & 0x0F) == 0x00) c &= 0xC0; + + return (c | 0x80); +} + + +/* Input (bx): d5-d0=color, d6=priority, d7=unused */ +/* Input (sx): d5-d0=color, d6=priority, d7=unused */ +/* Output: d5-d0=color, d6=priority, d7=intensity select (half/normal) */ +int make_lut_bg_ste(int bx, int ax) +{ + int bf, bp, b; + int af, ap, a; + int gi; + int x = 0; + int c; + + bf = (bx & 0x7F); + bp = (bx >> 6) & 1; + b = (bx & 0x0F); + + af = (ax & 0x7F); + ap = (ax >> 6) & 1; + a = (ax & 0x0F); + + gi = (ap | bp) ? 0x80 : 0x00; + + c = (ap ? (a ? af : (b ? bf : x)) : + (bp ? (b ? bf : (a ? af : x)) : ((a ? af : (b ? bf : x))))); + + c |= gi; + + /* Strip palette bits from transparent pixels */ + if((c & 0x0F) == 0x00) c &= 0xC0; + + return (c); +} + + +/* Input (bx): d5-d0=color, d6=priority, d7=sprite pixel marker */ +/* Input (sx): d5-d0=color, d6=priority, d7=unused */ +/* Output: d5-d0=color, d6=priority, d7=sprite pixel marker */ +int make_lut_obj_ste(int bx, int sx) +{ + int bf, bs; + int sf; + int c; + + bf = (bx & 0x7F); + bs = (bx >> 7) & 1; + sf = (sx & 0x7F); + + if((sx & 0x0F) == 0) return bx; + + c = (bs) ? bf : sf; + + /* Strip palette bits from transparent pixels */ + if((c & 0x0F) == 0x00) c &= 0xC0; + + return (c | 0x80); +} + + +/* Input (bx): d5-d0=color, d6=priority, d7=intensity (half/normal) */ +/* Input (sx): d5-d0=color, d6=priority, d7=sprite marker */ +/* Output: d5-d0=color, d6=intensity (half/normal), d7=(double/invalid) */ +int make_lut_bgobj_ste(int bx, int sx) +{ + int c; + + int bf = (bx & 0x3F); + int bp = (bx >> 6) & 1; + int bi = (bx & 0x80) ? 0x40 : 0x00; + int b = (bx & 0x0F); + + int sf = (sx & 0x3F); + int sp = (sx >> 6) & 1; + int si = (sx & 0x40); + int s = (sx & 0x0F); + + if(bi & 0x40) si |= 0x40; + + if(sp) + { + if(s) + { + if((sf & 0x3E) == 0x3E) + { + if(sf & 1) + { + c = (bf | 0x00); + } + else + { + c = (bx & 0x80) ? (bf | 0x80) : (bf | 0x40); + } + } + else + { + if(sf == 0x0E || sf == 0x1E || sf == 0x2E) + { + c = (sf | 0x40); + } + else + { + c = (sf | si); + } + } + } + else + { + c = (bf | bi); + } + } + else + { + if(bp) + { + if(b) + { + c = (bf | bi); + } + else + { + if(s) + { + if((sf & 0x3E) == 0x3E) + { + if(sf & 1) + { + c = (bf | 0x00); + } + else + { + c = (bx & 0x80) ? (bf | 0x80) : (bf | 0x40); + } + } + else + { + if(sf == 0x0E || sf == 0x1E || sf == 0x2E) + { + c = (sf | 0x40); + } + else + { + c = (sf | si); + } + } + } + else + { + c = (bf | bi); + } + } + } + else + { + if(s) + { + if((sf & 0x3E) == 0x3E) + { + if(sf & 1) + { + c = (bf | 0x00); + } + else + { + c = (bx & 0x80) ? (bf | 0x80) : (bf | 0x40); + } + } + else + { + if(sf == 0x0E || sf == 0x1E || sf == 0x2E) + { + c = (sf | 0x40); + } + else + { + c = (sf | si); + } + } + } + else + { + c = (bf | bi); + } + } + } + + if((c & 0x0f) == 0x00) c &= 0xC0; + + return (c); +} + +/*--------------------------------------------------------------------------*/ +/* Remap functions */ +/*--------------------------------------------------------------------------*/ +#ifndef NGC +void remap_8(uint8 *src, uint8 *dst, uint8 *table, int length) +{ + int count; + for(count = 0; count < length; count += 1) + { + *dst++ = table[*src++]; + } +} + +void remap_32(uint8 *src, uint32 *dst, uint32 *table, int length) +{ + int count; + for(count = 0; count < length; count += 1) + { + *dst++ = table[*src++]; + } +} +#endif + +void remap_16(uint8 *src, uint16 *dst, uint16 *table, int length) +{ + int count; + for(count = 0; count < length; count += 1) + { + *dst++ = table[*src++]; + } +} + + +/*--------------------------------------------------------------------------*/ +/* Merge functions */ +/*--------------------------------------------------------------------------*/ + +void merge(uint8 *srca, uint8 *srcb, uint8 *dst, uint8 *table, int width) +{ + int i; + for(i = 0; i < width; i += 1) + { + uint8 a = srca[i]; + uint8 b = srcb[i]; + uint8 c = table[(b << 8) | (a)]; + dst[i] = c; + } +} + +/*--------------------------------------------------------------------------*/ +/* Color update functions */ +/*--------------------------------------------------------------------------*/ +#ifndef NGC + +void color_update_8(int index, uint16 data) +{ + if(reg[12] & 8) + { + pixel_8[0x00 | index] = pixel_8_lut[0][data]; + pixel_8[0x40 | index] = pixel_8_lut[1][data]; + pixel_8[0x80 | index] = pixel_8_lut[2][data]; + } + else + { + uint8 temp = pixel_8_lut[1][data]; + pixel_8[0x00 | index] = temp; + pixel_8[0x40 | index] = temp; + pixel_8[0x80 | index] = temp; + } +} + +void color_update_15(int index, uint16 data) +{ + if(reg[12] & 8) + { + pixel_15[0x00 | index] = pixel_15_lut[0][data]; + pixel_15[0x40 | index] = pixel_15_lut[1][data]; + pixel_15[0x80 | index] = pixel_15_lut[2][data]; + } + else + { + uint16 temp = pixel_15_lut[1][data]; + pixel_15[0x00 | index] = temp; + pixel_15[0x40 | index] = temp; + pixel_15[0x80 | index] = temp; + } +} + +void color_update_32(int index, uint16 data) +{ + if(reg[12] & 8) + { + pixel_32[0x00 | index] = pixel_32_lut[0][data]; + pixel_32[0x40 | index] = pixel_32_lut[1][data]; + pixel_32[0x80 | index] = pixel_32_lut[2][data]; + } + else + { + uint32 temp = pixel_32_lut[1][data]; + pixel_32[0x00 | index] = temp; + pixel_32[0x40 | index] = temp; + pixel_32[0x80 | index] = temp; + } +} + +#endif + +void color_update_16(int index, uint16 data) +{ + if(reg[12] & 8) + { + pixel_16[0x00 | index] = pixel_16_lut[0][data]; + pixel_16[0x40 | index] = pixel_16_lut[1][data]; + pixel_16[0x80 | index] = pixel_16_lut[2][data]; + } + else + { + uint16 temp = pixel_16_lut[1][data]; + pixel_16[0x00 | index] = temp; + pixel_16[0x40 | index] = temp; + pixel_16[0x80 | index] = temp; + } +} + +/*--------------------------------------------------------------------------*/ +/* Object render functions */ +/*--------------------------------------------------------------------------*/ + +void parse_satb(int line) +{ + static uint8 sizetab[] = {8, 16, 24, 32}; + uint8 link = 0; + uint16 *p, *q; + uint16 ypos; + uint8 size; + int count; + int height; + + int limit = (reg[12] & 1) ? 20 : 16; + int total = (reg[12] & 1) ? 80 : 64; + + object_index_count = 0; + + for(count = 0; count < total; count += 1) + { + q = (uint16 *) &sat[link << 3]; + + ypos = q[0]; + if(im2_flag) ypos = (ypos >> 1) & 0x1FF; + else ypos &= 0x1FF; + + size = q[1] >> 8; + height = sizetab[size & 3]; + + if((line >= ypos) && (line < (ypos + height))) + { + /* sprite limit (max. 16 or 20 sprites displayed per line) */ + if(object_index_count == limit) + { + if(vint_pending == 0) status |= 0x40; + return; + } + + // using xpos from internal satb stops sprite x + // scrolling in bloodlin.bin, + // but this seems to go against the test prog + p = (uint16 *) &vram[satb + (link << 3)]; + object_info[object_index_count].ypos = q[0]; + object_info[object_index_count].xpos = p[3]; + object_info[object_index_count].attr = p[2]; + object_info[object_index_count].size = size; + object_info[object_index_count].index = count; + object_index_count += 1; + } + + link = q[1] & 0x7F; + if(link == 0) break; + } +} + +void render_obj(int line, uint8 *buf, uint8 *table) +{ + uint16 ypos; + uint16 attr; + uint16 xpos; + uint8 sizetab[] = {8, 16, 24, 32}; + uint8 size; + uint8 *src; + + int count; + int pixelcount = 0; + int width; + int height; + int v_line; + int column; + int sol_flag = 0; + int left = 0x80; + int right = 0x80 + bitmap.viewport.w; + int i; + + uint8 *s, *lb; + uint16 name, index; + uint8 palette; + + int attr_mask, nt_row; + + for(count = 0; count < object_index_count; count += 1) + { + xpos = object_info[count].xpos; + xpos &= 0x1ff; + + /* sprite masking */ + if(xpos != 0) sol_flag = 1; + else if(xpos == 0 && sol_flag) return; + + size = object_info[count].size & 0x0f; + width = sizetab[(size >> 2) & 3]; + + /* update pixel count (off-screen sprites included) */ + pixelcount += width; + + if(((xpos + width) >= left) && (xpos < right)) + { + ypos = object_info[count].ypos; + ypos &= 0x1ff; + attr = object_info[count].attr; + attr_mask = (attr & 0x1800); + + height = sizetab[size & 3]; + palette = (attr >> 9) & 0x70; + + v_line = (line - ypos); + nt_row = (v_line >> 3) & 3; + v_line = (v_line & 7) << 3; + + name = (attr & 0x07FF); + s = &name_lut[((attr >> 3) & 0x300) | (size << 4) | (nt_row << 2)]; + + lb = (uint8 *)&buf[0x20 + (xpos - 0x80)]; + + /* number of tiles to draw */ + width >>= 3; + + for(column = 0; column < width; column += 1, lb+=8) + { + index = attr_mask | ((name + s[column]) & 0x07FF); + src = &bg_pattern_cache[(index << 6) | (v_line)]; + DRAW_SPRITE_TILE; + } + + } + + /* sprite limit (256 or 320 pixels) */ + if (pixelcount >= bitmap.viewport.w) return; + + } +} + +void render_obj_im2(int line, uint8 *buf, uint8 *table, uint8 odd) +{ + uint16 ypos; + uint16 attr; + uint16 xpos; + uint8 sizetab[] = {8, 16, 24, 32}; + uint8 size; + uint8 *src; + + int count; + int pixelcount = 0; + int width; + int height; + int v_line; + int column; + int sol_flag = 0; + int left = 0x80; + int right = 0x80 + bitmap.viewport.w; + int i; + + uint8 *s, *lb; + uint16 name, index; + uint8 palette; + uint32 offs; + + int attr_mask, nt_row; + + for(count = 0; count < object_index_count; count += 1) + { + xpos = object_info[count].xpos; + xpos &= 0x1ff; + + /* sprite masking */ + if(xpos != 0) sol_flag = 1; + else if(xpos == 0 && sol_flag) return; + + size = object_info[count].size & 0x0f; + width = sizetab[(size >> 2) & 3]; + + /* update pixel count (off-screen sprites included) */ + pixelcount += width; + + if(((xpos + width) >= left) && (xpos < right)) + { + ypos = object_info[count].ypos; + ypos = (ypos >> 1) & 0x1ff; + attr = object_info[count].attr; + attr_mask = (attr & 0x1800); + + height = sizetab[size & 3]; + palette = (attr >> 9) & 0x70; + + v_line = (line - ypos); + nt_row = (v_line >> 3) & 3; + v_line = (((v_line & 7) << 1) | odd) << 3; + + name = (attr & 0x03FF); + s = &name_lut[((attr >> 3) & 0x300) | (size << 4) | (nt_row << 2)]; + + lb = (uint8 *)&buf[0x20 + (xpos - 0x80)]; + + /* number of tiles to draw */ + /* adjusted for sprite limit */ + if (pixelcount > bitmap.viewport.w) width -= (pixelcount - bitmap.viewport.w); + width >>= 3; + + for(column = 0; column < width; column += 1, lb+=8) + { + index = (name + s[column]) & 0x3ff; + offs = index << 7 | attr_mask << 6 | v_line; + if(attr & 0x1000) offs ^= 0x40; + src = &bg_pattern_cache[offs]; + DRAW_SPRITE_TILE; + } + } + + /* sprite limit (256 or 320 pixels) */ + if (pixelcount >= bitmap.viewport.w) return; + } +} + diff --git a/source/render.h b/source/render.h index 50cdd32..3da6635 100644 --- a/source/render.h +++ b/source/render.h @@ -1,53 +1,49 @@ - -#ifndef _RENDER_H_ -#define _RENDER_H_ - - -/* Look-up pixel table information */ -#define LUT_MAX (5) -#define LUT_SIZE (0x10000) - -/* Clip structure */ -typedef struct -{ - uint8 left; - uint8 right; - uint8 enable; -}clip_t; - -/* Function prototypes */ -int render_init(void); -void render_reset(void); -void render_shutdown(void); -void render_line(int line); -void render_obj(int line, uint8 *buf, uint8 *table); -void render_obj_im2(int line, uint8 *buf, uint8 *table); -void render_ntw(int line, uint8 *buf); -void render_ntw_im2(int line, uint8 *buf); -void render_ntx(int which, int line, uint8 *buf); -void render_ntx_im2(int which, int line, uint8 *buf); -void render_ntx_vs(int which, int line, uint8 *buf); -void update_bg_pattern_cache(void); -void get_hscroll(int line, int shift, uint16 *scroll); -void window_clip(int line); -int make_lut_bg(int bx, int ax); -int make_lut_obj(int bx, int sx); -int make_lut_bg_ste(int bx, int ax); -int make_lut_obj_ste(int bx, int sx); -int make_lut_bgobj_ste(int bx, int sx); -void remap_8(uint8 *src, uint8 *dst, uint8 *table, int length); -void remap_16(uint8 *src, uint16 *dst, uint16 *table, int length); -void remap_32(uint8 *src, uint32 *dst, uint32 *table, int length); -void merge(uint8 *srca, uint8 *srcb, uint8 *dst, uint8 *table, int width); -void color_update_8(int index, uint16 data); -void color_update_15(int index, uint16 data); -void color_update_16(int index, uint16 data); -void color_update_32(int index, uint16 data); -void make_name_lut(void); -void parse_satb(int line); - -/* global variables */ -extern uint8 object_index_count; - -#endif /* _RENDER_H_ */ - +/*************************************************************************************** + * Genesis Plus 1.2a + * Video Display Processor (Rendering) + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#ifndef _RENDER_H_ +#define _RENDER_H_ + +/* Global variables */ +extern uint8 rgb565_norm[2][8]; +extern uint8 rgb565_half[2][8]; +extern uint8 rgb565_high[2][8]; + +/* Function prototypes */ +extern int render_init(void); +extern void palette_init(void); +extern void render_reset(void); +extern void render_shutdown(void); +extern void render_line(int line, uint8 odd_frame); +#ifndef NGC +extern void color_update_8(int index, uint16 data); +extern void color_update_15(int index, uint16 data); +extern void color_update_32(int index, uint16 data); +#endif +extern void color_update_16(int index, uint16 data); +extern void parse_satb(int line); +extern void (*color_update)(int index, uint16 data); +extern void remap_buffer(int line,int width); + +#endif /* _RENDER_H_ */ + diff --git a/source/shared.h b/source/shared.h index 55035a4..0c1b993 100644 --- a/source/shared.h +++ b/source/shared.h @@ -1,43 +1,35 @@ -#ifndef _SHARED_H_ -#define _SHARED_H_ - - -#include -#include -#include - -#include "types.h" -#include "macros.h" -#include "m68k.h" -#include "z80.h" -#include "genesis.h" -#include "vdp.h" -#include "render.h" -#include "mem68k.h" -#include "memz80.h" -#include "membnk.h" -#include "memvdp.h" -#include "system.h" -#ifndef NGC -#include "unzip.h" -#include "fileio.h" -#include "loadrom.h" -#endif -#include "io.h" -#include "input.h" -#include "sound.h" -#include "fm.h" -#include "sn76496.h" -#include "osd.h" -#include "state.h" -#include "sram.h" -#include "eeprom.h" -#include "ssf2tnc.h" -#include "sn76489.h" -#include "ym2612.h" - -extern uint8 FM_GENS; -extern uint8 PSG_MAME; - -#endif /* _SHARED_H_ */ - +#ifndef _SHARED_H_ +#define _SHARED_H_ + +#include +#include +#include + +#include "types.h" +#include "macros.h" +#include "m68k.h" +#include "z80.h" +#include "system.h" +#include "genesis.h" +#include "vdp.h" +#include "render.h" +#include "mem68k.h" +#include "memz80.h" +#include "membnk.h" +#include "memvdp.h" +#include "io.h" +#include "input.h" +#include "state.h" +#include "sound.h" +#include "sn76489.h" +#include "fm.h" +#include "ym2612.h" +#include "loadrom.h" +#include "cart_hw.h" +#include "eeprom.h" +#include "sram.h" +#include "svp.h" +#include "osd.h" + +#endif /* _SHARED_H_ */ + diff --git a/source/sound/fm.c b/source/sound/fm.c index eaabaa5..12472bc 100644 --- a/source/sound/fm.c +++ b/source/sound/fm.c @@ -1,5 +1,3 @@ -#define YM2610B_WARNING - /* ** ** File: fm.c -- software implementation of Yamaha FM sound generator @@ -14,6 +12,18 @@ /* ** History: ** +** 2006-2008 Eke-Eke (Gamecube/Wii genesis plus port): +** - added DAC filtering +** - fixed internal FM timer emulation +** - removed unused multichip support and YMxxx support +** - fixed CH3 CSM mode (credits to Nemesis) +** - implemented PG overflow, aka "detune bug" (Ariel, Comix Zone, Shaq Fu, Spiderman,...), credits to Nemesis +** - implemented sample interpolation, highly based on GENS code (HQ YM2612) +** - fixed SSG-EG support, credits to Nemesis and additional fixes from Alone Coder +** - modified EG rates and frequency, tested by Nemesis on real hardware +** - fixed EG attenuation level on KEY ON (Ecco 2 splash sound) +** - fixed LFO phase update for CH3 special mode (Warlock, Alladin), thanks to AamirM +** ** 03-08-2003 Jarek Burczynski: ** - fixed YM2608 initial values (after the reset) ** - fixed flag and irqmask handling (YM2608) @@ -105,44 +115,9 @@ #include #include -#if 0 -#ifndef __RAINE__ -#include "sndintrf.h" /* use M.A.M.E. */ -#else -#include "deftypes.h" /* use RAINE */ -#include "support.h" /* use RAINE */ -#endif -#include "ay8910.h" -#endif - -#include "fm.h" - - -/* include external DELTA-T unit (when needed) */ -#if (BUILD_YM2608||BUILD_YM2610||BUILD_YM2610B) - #include "ymdeltat.h" -#endif - -/* shared function building option */ -#define BUILD_OPN (BUILD_YM2203||BUILD_YM2608||BUILD_YM2610||BUILD_YM2610B||BUILD_YM2612) -#define BUILD_OPN_PRESCALER (BUILD_YM2203||BUILD_YM2608) - +#include "shared.h" /* globals */ -#define TYPE_SSG 0x01 /* SSG support */ -#define TYPE_LFOPAN 0x02 /* OPN type LFO and PAN */ -#define TYPE_6CH 0x04 /* FM 6CH / 3CH */ -#define TYPE_DAC 0x08 /* YM2612's DAC device */ -#define TYPE_ADPCM 0x10 /* two ADPCM units */ - - -#define TYPE_YM2203 (TYPE_SSG) -#define TYPE_YM2608 (TYPE_SSG |TYPE_LFOPAN |TYPE_6CH |TYPE_ADPCM) -#define TYPE_YM2610 (TYPE_SSG |TYPE_LFOPAN |TYPE_6CH |TYPE_ADPCM) -#define TYPE_YM2612 (TYPE_DAC |TYPE_LFOPAN |TYPE_6CH) - - - #define FREQ_SH 16 /* 16.16 fixed point (frequency calculations) */ #define EG_SH 16 /* 16.16 fixed point (envelope generator timing) */ #define LFO_SH 24 /* 8.24 fixed point (LFO calculations) */ @@ -170,15 +145,8 @@ #define TL_RES_LEN (256) /* 8 bits addressing (real chip) */ -#if (FM_SAMPLE_BITS==16) - #define FINAL_SH (0) - #define MAXOUT (+32767) - #define MINOUT (-32768) -#else - #define FINAL_SH (8) - #define MAXOUT (+127) - #define MINOUT (-128) -#endif +#define MAXOUT (+16383) +#define MINOUT (-16384) /* TL_TAB_LEN is calculated as: @@ -250,8 +218,13 @@ O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18), O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18), /* rates 00-11 */ +/* O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), +*/ +O( 18),O( 18),O( 0),O( 0), +O( 0),O( 0),O( 2),O( 2), // Nemesis's tests + O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), @@ -490,36 +463,6 @@ static INT32 lfo_pm_table[128*8*32]; /* 128 combinations of 7 bits meaningful (o #define SLOT3 1 #define SLOT4 3 -/* bit0 = Right enable , bit1 = Left enable */ -#define OUTD_RIGHT 1 -#define OUTD_LEFT 2 -#define OUTD_CENTER 3 - - -/* save output as raw 16-bit sample */ -/* #define SAVE_SAMPLE */ - -#ifdef SAVE_SAMPLE -static FILE *sample[1]; - #if 1 /*save to MONO file */ - #define SAVE_ALL_CHANNELS \ - { signed int pom = lt; \ - fputc((unsigned short)pom&0xff,sample[0]); \ - fputc(((unsigned short)pom>>8)&0xff,sample[0]); \ - } - #else /*save to STEREO file */ - #define SAVE_ALL_CHANNELS \ - { signed int pom = lt; \ - fputc((unsigned short)pom&0xff,sample[0]); \ - fputc(((unsigned short)pom>>8)&0xff,sample[0]); \ - pom = rt; \ - fputc((unsigned short)pom&0xff,sample[0]); \ - fputc(((unsigned short)pom>>8)&0xff,sample[0]); \ - } - #endif -#endif - - /* struct describing a single operator (SLOT) */ typedef struct { @@ -534,7 +477,7 @@ typedef struct /* Phase Generator */ UINT32 phase; /* phase counter */ - UINT32 Incr; /* phase step */ + INT32 Incr; /* phase step */ /* Envelope Generator */ UINT8 state; /* phase type */ @@ -589,31 +532,26 @@ typedef struct typedef struct { - void * param; /* this chip parameter */ int clock; /* master clock (Hz) */ int rate; /* sampling rate (Hz) */ double freqbase; /* frequency base */ - double TimerBase; /* Timer base time */ -#if FM_BUSY_FLAG_SUPPORT - double BusyExpire; /* ExpireTime of Busy clear */ -#endif - UINT8 address; /* address register */ - UINT8 irq; /* interrupt level */ - UINT8 irqmask; /* irq mask */ + int TimerBase; /* Timer base time */ + UINT8 address[2]; /* address register */ UINT8 status; /* status flag */ UINT32 mode; /* mode CSM / 3SLOT */ - UINT8 prescaler_sel;/* prescaler selector */ UINT8 fn_h; /* freq latch */ - INT32 TA; /* timer a */ - INT32 TAC; /* timer a counter */ - UINT8 TB; /* timer b */ - INT32 TBC; /* timer b counter */ + int TA; /* timer a value */ + double TAL; /* timer a base */ + double TAC; /* timer a counter */ + int TB; /* timer b */ + double TBL; /* timer b base */ + double TBC; /* timer b counter */ /* local time tables */ INT32 dt_tab[8][32];/* DeTune table */ - /* Extention Timer and IRQ handler */ - FM_TIMERHANDLER Timer_Handler; - FM_IRQHANDLER IRQ_Handler; - const struct ssg_callbacks *SSG; + + UINT32 Inter_Cnt; // Interpolation Counter + UINT32 Inter_Step; // Interpolation Step + } FM_ST; @@ -634,10 +572,8 @@ typedef struct /* OPN/A/B common state */ typedef struct { - UINT8 type; /* chip type */ FM_ST ST; /* general state */ FM_3SLOT SL3; /* 3 slot mode state */ - FM_CH *P_CH; /* pointer of CH */ unsigned int pan[6*2]; /* fm channels output masks (0xffffffff = enable) */ UINT32 eg_cnt; /* global envelope generator counter */ @@ -659,32 +595,29 @@ typedef struct UINT32 lfo_freq[8]; /* LFO FREQ table */ } FM_OPN; +typedef struct +{ + FM_CH CH[6]; /* channel state */ + UINT8 dacen; /* DAC mode */ + INT32 dacout; /* DAC output */ + FM_OPN OPN; /* OPN state */ +} YM2612; +static YM2612 ym2612; +static long dac_highpass; /* current chip state */ static INT32 m2,c1,c2; /* Phase Modulation input for operators 2,3,4 */ static INT32 mem; /* one sample delay memory */ -static INT32 out_fm[8]; /* outputs of working channels */ - -#if (BUILD_YM2608||BUILD_YM2610||BUILD_YM2610B) -static INT32 out_adpcm[4]; /* channel output NONE,LEFT,RIGHT or CENTER for YM2608/YM2610 ADPCM */ -static INT32 out_delta[4]; /* channel output NONE,LEFT,RIGHT or CENTER for YM2608/YM2610 DELTAT*/ -#endif +static INT32 out_fm[8]; /* outputs of working channels */ +static INT32 old_out_fm[8]; /* old outputs of working channels */ static UINT32 LFO_AM; /* runtime LFO calculations helper */ static INT32 LFO_PM; /* runtime LFO calculations helper */ +static int fn_max; /* maximal phase increment (used for phase overflow) */ -/* log output level */ -#define LOG_ERR 3 /* ERROR */ -#define LOG_WAR 2 /* WARNING */ -#define LOG_INF 1 /* INFORMATION */ -#define LOG_LEVEL LOG_INF - -#ifndef __RAINE__ -#define LOG(n,x) if( (n)>=LOG_LEVEL ) logerror x -#endif /* limitter */ #define Limit(val, max,min) { \ @@ -692,44 +625,8 @@ static INT32 LFO_PM; /* runtime LFO calculations helper */ else if ( val < min ) val = min; \ } - -/* status set and IRQ handling */ -INLINE void FM_STATUS_SET(FM_ST *ST,int flag) -{ - /* set status flag */ - ST->status |= flag; - if ( !(ST->irq) && (ST->status & ST->irqmask) ) - { - ST->irq = 1; - /* callback user interrupt handler (IRQ is OFF to ON) */ - if(ST->IRQ_Handler) (ST->IRQ_Handler)(ST->param,1); - } -} - -/* status reset and IRQ handling */ -INLINE void FM_STATUS_RESET(FM_ST *ST,int flag) -{ - /* reset status flag */ - ST->status &=~flag; - if ( (ST->irq) && !(ST->status & ST->irqmask) ) - { - ST->irq = 0; - /* callback user interrupt handler (IRQ is ON to OFF) */ - if(ST->IRQ_Handler) (ST->IRQ_Handler)(ST->param,0); - } -} - -/* IRQ mask set */ -INLINE void FM_IRQMASK_SET(FM_ST *ST,int flag) -{ - ST->irqmask = flag; - /* IRQ handling check */ - FM_STATUS_SET(ST,0); - FM_STATUS_RESET(ST,0); -} - /* OPN Mode Register Write */ -INLINE void set_timers( FM_ST *ST, void *n, int v ) +INLINE void set_timers(int v ) { /* b7 = CSM MODE */ /* b6 = 3 slot mode */ @@ -739,129 +636,20 @@ INLINE void set_timers( FM_ST *ST, void *n, int v ) /* b2 = timer enable a */ /* b1 = load b */ /* b0 = load a */ - ST->mode = v; - /* reset Timer b flag */ - if( v & 0x20 ) - FM_STATUS_RESET(ST,0x02); - /* reset Timer a flag */ - if( v & 0x10 ) - FM_STATUS_RESET(ST,0x01); - /* load b */ - if( v & 0x02 ) - { - if( ST->TBC == 0 ) - { - ST->TBC = ( 256-ST->TB)<<4; - /* External timer handler */ - if (ST->Timer_Handler) (ST->Timer_Handler)(n,1,ST->TBC,ST->TimerBase); - } - } - else - { /* stop timer b */ - if( ST->TBC != 0 ) - { - ST->TBC = 0; - if (ST->Timer_Handler) (ST->Timer_Handler)(n,1,0,ST->TimerBase); - } - } - /* load a */ - if( v & 0x01 ) - { - if( ST->TAC == 0 ) - { - ST->TAC = (1024-ST->TA); - /* External timer handler */ - if (ST->Timer_Handler) (ST->Timer_Handler)(n,0,ST->TAC,ST->TimerBase); - } - } - else - { /* stop timer a */ - if( ST->TAC != 0 ) - { - ST->TAC = 0; - if (ST->Timer_Handler) (ST->Timer_Handler)(n,0,0,ST->TimerBase); - } - } + if ((ym2612.OPN.ST.mode ^ v) & 0xC0) ym2612.CH[2].SLOT[SLOT1].Incr=-1; /* recalculate phase (from gens) */ + + /* reload Timers */ + if ((v&1) & !(ym2612.OPN.ST.mode&1)) ym2612.OPN.ST.TAC = ym2612.OPN.ST.TAL; + if ((v&2) & !(ym2612.OPN.ST.mode&2)) ym2612.OPN.ST.TBC = ym2612.OPN.ST.TBL; + + /* reset Timers flags */ + ym2612.OPN.ST.status &= (~v >> 4); + + ym2612.OPN.ST.mode = v; } -/* Timer A Overflow */ -INLINE void TimerAOver(FM_ST *ST) -{ - /* set status (if enabled) */ - if(ST->mode & 0x04) FM_STATUS_SET(ST,0x01); - /* clear or reload the counter */ - ST->TAC = (1024-ST->TA); - if (ST->Timer_Handler) (ST->Timer_Handler)(ST->param,0,ST->TAC,ST->TimerBase); -} -/* Timer B Overflow */ -INLINE void TimerBOver(FM_ST *ST) -{ - /* set status (if enabled) */ - if(ST->mode & 0x08) FM_STATUS_SET(ST,0x02); - /* clear or reload the counter */ - ST->TBC = ( 256-ST->TB)<<4; - if (ST->Timer_Handler) (ST->Timer_Handler)(ST->param,1,ST->TBC,ST->TimerBase); -} - - -#if FM_INTERNAL_TIMER -/* ----- internal timer mode , update timer */ - -/* ---------- calculate timer A ---------- */ - #define INTERNAL_TIMER_A(ST,CSM_CH) \ - { \ - if( ST->TAC && (ST->Timer_Handler==0) ) \ - if( (ST->TAC -= (int)(ST->freqbase*4096)) <= 0 ) \ - { \ - TimerAOver( ST ); \ - /* CSM mode total level latch and auto key on */ \ - if( ST->mode & 0x80 ) \ - CSMKeyControll( CSM_CH ); \ - } \ - } -/* ---------- calculate timer B ---------- */ - #define INTERNAL_TIMER_B(ST,step) \ - { \ - if( ST->TBC && (ST->Timer_Handler==0) ) \ - if( (ST->TBC -= (int)(ST->freqbase*4096*step)) <= 0 ) \ - TimerBOver( ST ); \ - } -#else /* FM_INTERNAL_TIMER */ -/* external timer mode */ -#define INTERNAL_TIMER_A(ST,CSM_CH) -#define INTERNAL_TIMER_B(ST,step) -#endif /* FM_INTERNAL_TIMER */ - - - -#if FM_BUSY_FLAG_SUPPORT -INLINE UINT8 FM_STATUS_FLAG(FM_ST *ST) -{ - if( ST->BusyExpire ) - { - if( (ST->BusyExpire - FM_GET_TIME_NOW()) > 0) - return ST->status | 0x80; /* with busy */ - /* expire */ - ST->BusyExpire = 0; - } - return ST->status; -} -INLINE void FM_BUSY_SET(FM_ST *ST,int busyclock ) -{ - ST->BusyExpire = FM_GET_TIME_NOW() + (ST->TimerBase * busyclock); -} -#define FM_BUSY_CLEAR(ST) ((ST)->BusyExpire = 0) -#else -#define FM_STATUS_FLAG(ST) ((ST)->status) -#define FM_BUSY_SET(ST,bclock) {} -#define FM_BUSY_CLEAR(ST) {} -#endif - - - - INLINE void FM_KEYON(FM_CH *CH , int s ) { FM_SLOT *SLOT = &CH->SLOT[s]; @@ -869,7 +657,17 @@ INLINE void FM_KEYON(FM_CH *CH , int s ) { SLOT->key = 1; SLOT->phase = 0; /* restart Phase Generator */ - SLOT->state = EG_ATT; /* phase -> Attack */ + if ((SLOT->ar + SLOT->ksr) < 94 /*32+62*/) + { + SLOT->state = EG_ATT; /* phase -> Attack */ + SLOT->volume = MAX_ATT_INDEX; /* fix Ecco 2 splash sound */ + } + else + { + /* directly switch to Decay */ + SLOT->state = EG_DEC; + SLOT->volume = MIN_ATT_INDEX; + } } } @@ -880,8 +678,11 @@ INLINE void FM_KEYOFF(FM_CH *CH , int s ) { SLOT->key = 0; if (SLOT->state>EG_REL) - SLOT->state = EG_REL;/* phase -> Release */ - } + { + SLOT->state = EG_REL; /* phase -> Release */ + SLOT->ssgn = 0; /* reset Invert Flag (from Nemesis) */ + } + } } /* set algorithm connection */ @@ -896,86 +697,86 @@ static void setup_connection( FM_CH *CH, int ch ) INT32 **memc = &CH->mem_connect; switch( CH->ALGO ){ - case 0: - /* M1---C1---MEM---M2---C2---OUT */ - *om1 = &c1; - *oc1 = &mem; - *om2 = &c2; - *memc= &m2; - break; - case 1: - /* M1------+-MEM---M2---C2---OUT */ - /* C1-+ */ - *om1 = &mem; - *oc1 = &mem; - *om2 = &c2; - *memc= &m2; - break; - case 2: - /* M1-----------------+-C2---OUT */ - /* C1---MEM---M2-+ */ - *om1 = &c2; - *oc1 = &mem; - *om2 = &c2; - *memc= &m2; - break; - case 3: - /* M1---C1---MEM------+-C2---OUT */ - /* M2-+ */ - *om1 = &c1; - *oc1 = &mem; - *om2 = &c2; - *memc= &c2; - break; - case 4: - /* M1---C1-+-OUT */ - /* M2---C2-+ */ - /* MEM: not used */ - *om1 = &c1; - *oc1 = carrier; - *om2 = &c2; - *memc= &mem; /* store it anywhere where it will not be used */ - break; - case 5: - /* +----C1----+ */ - /* M1-+-MEM---M2-+-OUT */ - /* +----C2----+ */ - *om1 = 0; /* special mark */ - *oc1 = carrier; - *om2 = carrier; - *memc= &m2; - break; - case 6: - /* M1---C1-+ */ - /* M2-+-OUT */ - /* C2-+ */ - /* MEM: not used */ - *om1 = &c1; - *oc1 = carrier; - *om2 = carrier; - *memc= &mem; /* store it anywhere where it will not be used */ - break; - case 7: - /* M1-+ */ - /* C1-+-OUT */ - /* M2-+ */ - /* C2-+ */ - /* MEM: not used*/ - *om1 = carrier; - *oc1 = carrier; - *om2 = carrier; - *memc= &mem; /* store it anywhere where it will not be used */ - break; + case 0: + /* M1---C1---MEM---M2---C2---OUT */ + *om1 = &c1; + *oc1 = &mem; + *om2 = &c2; + *memc= &m2; + break; + case 1: + /* M1------+-MEM---M2---C2---OUT */ + /* C1-+ */ + *om1 = &mem; + *oc1 = &mem; + *om2 = &c2; + *memc= &m2; + break; + case 2: + /* M1-----------------+-C2---OUT */ + /* C1---MEM---M2-+ */ + *om1 = &c2; + *oc1 = &mem; + *om2 = &c2; + *memc= &m2; + break; + case 3: + /* M1---C1---MEM------+-C2---OUT */ + /* M2-+ */ + *om1 = &c1; + *oc1 = &mem; + *om2 = &c2; + *memc= &c2; + break; + case 4: + /* M1---C1-+-OUT */ + /* M2---C2-+ */ + /* MEM: not used */ + *om1 = &c1; + *oc1 = carrier; + *om2 = &c2; + *memc= &mem; /* store it anywhere where it will not be used */ + break; + case 5: + /* +----C1----+ */ + /* M1-+-MEM---M2-+-OUT */ + /* +----C2----+ */ + *om1 = 0; /* special mark */ + *oc1 = carrier; + *om2 = carrier; + *memc= &m2; + break; + case 6: + /* M1---C1-+ */ + /* M2-+-OUT */ + /* C2-+ */ + /* MEM: not used */ + *om1 = &c1; + *oc1 = carrier; + *om2 = carrier; + *memc= &mem; /* store it anywhere where it will not be used */ + break; + case 7: + /* M1-+ */ + /* C1-+-OUT */ + /* M2-+ */ + /* C2-+ */ + /* MEM: not used*/ + *om1 = carrier; + *oc1 = carrier; + *om2 = carrier; + *memc= &mem; /* store it anywhere where it will not be used */ + break; } CH->connect4 = carrier; } /* set detune & multiple */ -INLINE void set_det_mul(FM_ST *ST,FM_CH *CH,FM_SLOT *SLOT,int v) +INLINE void set_det_mul(FM_CH *CH,FM_SLOT *SLOT,int v) { SLOT->mul = (v&0x0f)? (v&0x0f)*2 : 1; - SLOT->DT = ST->dt_tab[(v>>4)&7]; + SLOT->DT = ym2612.OPN.ST.dt_tab[(v>>4)&7]; CH->SLOT[SLOT1].Incr=-1; } @@ -997,10 +798,11 @@ INLINE void set_ar_ksr(FM_CH *CH,FM_SLOT *SLOT,int v) { CH->SLOT[SLOT1].Incr=-1; } - else + + //else /* fix Batman&Robin */ { /* refresh Attack rate */ - if ((SLOT->ar + SLOT->ksr) < 32+62) + if ((SLOT->ar + SLOT->ksr) < 94 /*32+62*/) { SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ]; SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ]; @@ -1068,18 +870,18 @@ INLINE signed int op_calc1(UINT32 phase, unsigned int env, signed int pm) } /* advance LFO to next sample */ -INLINE void advance_lfo(FM_OPN *OPN) +INLINE void advance_lfo() { UINT8 pos; UINT8 prev_pos; - if (OPN->lfo_inc) /* LFO enabled ? */ + if (ym2612.OPN.lfo_inc) /* LFO enabled ? */ { - prev_pos = OPN->lfo_cnt>>LFO_SH & 127; - - OPN->lfo_cnt += OPN->lfo_inc; - - pos = (OPN->lfo_cnt >> LFO_SH) & 127; + prev_pos = ym2612.OPN.lfo_cnt>>LFO_SH & 127; + + ym2612.OPN.lfo_cnt += ym2612.OPN.lfo_inc; + + pos = ( ym2612.OPN.lfo_cnt >> LFO_SH) & 127; /* update AM when LFO output changes */ @@ -1114,113 +916,118 @@ INLINE void advance_lfo(FM_OPN *OPN) } } -INLINE void advance_eg_channel(FM_OPN *OPN, FM_SLOT *SLOT) +INLINE void advance_eg_channel(FM_SLOT *SLOT) { unsigned int out; unsigned int swap_flag = 0; unsigned int i; - i = 4; /* four operators per channel */ do { switch(SLOT->state) { - case EG_ATT: /* attack phase */ - if ( !(OPN->eg_cnt & ((1<eg_sh_ar)-1) ) ) - { - SLOT->volume += (~SLOT->volume * - (eg_inc[SLOT->eg_sel_ar + ((OPN->eg_cnt>>SLOT->eg_sh_ar)&7)]) - ) >>4; - - if (SLOT->volume <= MIN_ATT_INDEX) + case EG_ATT: /* attack phase */ + if (!(ym2612.OPN.eg_cnt & ((1<eg_sh_ar)-1))) { - SLOT->volume = MIN_ATT_INDEX; - SLOT->state = EG_DEC; - } - } - break; + SLOT->volume += (~SLOT->volume * + (eg_inc[SLOT->eg_sel_ar + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_ar)&7)]) + )>>4; - case EG_DEC: /* decay phase */ - if (SLOT->ssg&0x08) /* SSG EG type envelope selected */ - { - if ( !(OPN->eg_cnt & ((1<eg_sh_d1r)-1) ) ) - { - SLOT->volume += 4 * eg_inc[SLOT->eg_sel_d1r + ((OPN->eg_cnt>>SLOT->eg_sh_d1r)&7)]; - - if ( SLOT->volume >= SLOT->sl ) - SLOT->state = EG_SUS; - } - } - else - { - if ( !(OPN->eg_cnt & ((1<eg_sh_d1r)-1) ) ) - { - SLOT->volume += eg_inc[SLOT->eg_sel_d1r + ((OPN->eg_cnt>>SLOT->eg_sh_d1r)&7)]; - - if ( SLOT->volume >= SLOT->sl ) - SLOT->state = EG_SUS; - } - } - break; - - case EG_SUS: /* sustain phase */ - if (SLOT->ssg&0x08) /* SSG EG type envelope selected */ - { - if ( !(OPN->eg_cnt & ((1<eg_sh_d2r)-1) ) ) - { - SLOT->volume += 4 * eg_inc[SLOT->eg_sel_d2r + ((OPN->eg_cnt>>SLOT->eg_sh_d2r)&7)]; - - if ( SLOT->volume >= MAX_ATT_INDEX ) + if (SLOT->volume <= MIN_ATT_INDEX) { - SLOT->volume = MAX_ATT_INDEX; + SLOT->volume = MIN_ATT_INDEX; + SLOT->state = EG_DEC; + } + } + break; - if (SLOT->ssg&0x01) /* bit 0 = hold */ + case EG_DEC: /* decay phase */ + if (SLOT->ssg&0x08) /* SSG EG type envelope selected */ + { + if ( !(ym2612.OPN.eg_cnt & ((1<eg_sh_d1r)-1) ) ) + { + //SLOT->volume += 4 * eg_inc[SLOT->eg_sel_d1r + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_d1r)&7)]; + SLOT->volume += 6 * eg_inc[SLOT->eg_sel_d1r + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_d1r)&7)]; /* from Nemesis */ + + if ( SLOT->volume >= (INT32)(SLOT->sl) ) + SLOT->state = EG_SUS; + } + } + else + { + if ( !(ym2612.OPN.eg_cnt & ((1<eg_sh_d1r)-1) ) ) + { + SLOT->volume += eg_inc[SLOT->eg_sel_d1r + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_d1r)&7)]; + + if ( SLOT->volume >= (INT32)(SLOT->sl) ) + SLOT->state = EG_SUS; + } + } + break; + + case EG_SUS: /* sustain phase */ + if (SLOT->ssg&0x08) /* SSG EG type envelope selected */ + { + if ( !(ym2612.OPN.eg_cnt & ((1<eg_sh_d2r)-1) ) ) + { + //SLOT->volume += 4 * eg_inc[SLOT->eg_sel_d2r + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_d2r)&7)]; + SLOT->volume += 6 * eg_inc[SLOT->eg_sel_d2r + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_d2r)&7)]; /* from Nemesis */ + + if ( SLOT->volume >= 512 /* áûëî MAX_ATT_INDEX */ ) //Alone Coder { - if (SLOT->ssgn&1) /* have we swapped once ??? */ + SLOT->volume = MAX_ATT_INDEX; + + if (SLOT->ssg&0x01) /* bit 0 = hold */ { - /* yes, so do nothing, just hold current level */ + if (SLOT->ssgn&1) /* have we swapped once ??? */ + { + /* yes, so do nothing, just hold current level */ + } + else + swap_flag = (SLOT->ssg&0x02) | 1 ; /* bit 1 = alternate */ + } else - swap_flag = (SLOT->ssg&0x02) | 1 ; /* bit 1 = alternate */ + { + /* same as KEY-ON operation */ - } - else - { - /* same as KEY-ON operation */ + /* restart of the Phase Generator should be here, + only if AR is not maximum ??? ALWAYS! */ + SLOT->phase = 0; //Alone Coder - /* restart of the Phase Generator should be here, - only if AR is not maximum ??? */ - /*SLOT->phase = 0;*/ + /* phase -> Attack */ + SLOT->volume = 511; //Alone Coder + SLOT->state = EG_ATT; - /* phase -> Attack */ - SLOT->state = EG_ATT; - - swap_flag = (SLOT->ssg&0x02); /* bit 1 = alternate */ + swap_flag = (SLOT->ssg&0x02); /* bit 1 = alternate */ + } } } } - } - else - { - if ( !(OPN->eg_cnt & ((1<eg_sh_d2r)-1) ) ) + else { - SLOT->volume += eg_inc[SLOT->eg_sel_d2r + ((OPN->eg_cnt>>SLOT->eg_sh_d2r)&7)]; - - if ( SLOT->volume >= MAX_ATT_INDEX ) + if ( !(ym2612.OPN.eg_cnt & ((1<eg_sh_d2r)-1) ) ) { - SLOT->volume = MAX_ATT_INDEX; - /* do not change SLOT->state (verified on real chip) */ + SLOT->volume += eg_inc[SLOT->eg_sel_d2r + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_d2r)&7)]; + + if ( SLOT->volume >= MAX_ATT_INDEX ) + { + SLOT->volume = MAX_ATT_INDEX; + /* do not change SLOT->state (verified on real chip) */ + } } + } + break; - } - break; - - case EG_REL: /* release phase */ - if ( !(OPN->eg_cnt & ((1<eg_sh_rr)-1) ) ) + case EG_REL: /* release phase */ + if ( !(ym2612.OPN.eg_cnt & ((1<eg_sh_rr)-1) ) ) { - SLOT->volume += eg_inc[SLOT->eg_sel_rr + ((OPN->eg_cnt>>SLOT->eg_sh_rr)&7)]; + if (SLOT->ssg&0x08) + SLOT->volume += 6 * eg_inc[SLOT->eg_sel_rr + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_rr)&7)]; /* from Nemesis */ + else + SLOT->volume += eg_inc[SLOT->eg_sel_rr + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_rr)&7)]; if ( SLOT->volume >= MAX_ATT_INDEX ) { @@ -1228,14 +1035,14 @@ INLINE void advance_eg_channel(FM_OPN *OPN, FM_SLOT *SLOT) SLOT->state = EG_OFF; } } - break; + break; } out = SLOT->tl + ((UINT32)SLOT->volume); - if ((SLOT->ssg&0x08) && (SLOT->ssgn&2)) /* negate output (changes come from alternate bit, init comes from attack bit) */ - out ^= ((1<ssg&0x08) && (SLOT->ssgn&2) && (SLOT->state != EG_OFF/*Alone Coder*/)) /* negate output (changes come from alternate bit, init comes from attack bit) */ + out ^= 511/*Alone Coder*/; //((1<vol_out + (AM & (OP)->AMmask)) -INLINE void chan_calc(FM_OPN *OPN, FM_CH *CH) +INLINE void update_phase_lfo_slot(FM_SLOT *SLOT , INT32 pms, UINT32 block_fnum) +{ + UINT32 fnum_lfo = ((block_fnum & 0x7f0) >> 4) * 32 * 8; + INT32 lfo_fn_table_index_offset = lfo_pm_table[ fnum_lfo + pms + LFO_PM ]; + + if (lfo_fn_table_index_offset) /* LFO phase modulation active */ + { + block_fnum = block_fnum*2 + lfo_fn_table_index_offset; + + UINT8 blk = (block_fnum&0x7000) >> 12; + UINT32 fn = block_fnum & 0xfff; + + /* keyscale code */ + int kc = (blk<<2) | opn_fktable[fn >> 8]; + + /* phase increment counter */ + int fc = (ym2612.OPN.fn_table[fn]>>(7-blk)) + SLOT->DT[kc]; + + /* detects frequency overflow (credits to Nemesis) */ + if (fc < 0) fc += fn_max; + + /* update phase */ + SLOT->phase += (fc * SLOT->mul) >> 1; + } + else /* LFO phase modulation = zero */ + { + SLOT->phase += SLOT->Incr; + } +} + +INLINE void update_phase_lfo_channel(FM_CH *CH) +{ + UINT32 block_fnum = CH->block_fnum; + + UINT32 fnum_lfo = ((block_fnum & 0x7f0) >> 4) * 32 * 8; + INT32 lfo_fn_table_index_offset = lfo_pm_table[ fnum_lfo + CH->pms + LFO_PM ]; + + if (lfo_fn_table_index_offset) /* LFO phase modulation active */ + { + block_fnum = block_fnum*2 + lfo_fn_table_index_offset; + + UINT8 blk = (block_fnum&0x7000) >> 12; + UINT32 fn = block_fnum & 0xfff; + + /* keyscale code */ + int kc = (blk<<2) | opn_fktable[fn >> 8]; + + /* phase increment counter */ + int fc = (ym2612.OPN.fn_table[fn]>>(7-blk)); + + /* detects frequency overflow (credits to Nemesis) */ + int finc = fc + CH->SLOT[SLOT1].DT[kc]; + if (finc < 0) finc += fn_max; + CH->SLOT[SLOT1].phase += (finc*CH->SLOT[SLOT1].mul) >> 1; + + finc = fc + CH->SLOT[SLOT2].DT[kc]; + if (finc < 0) finc += fn_max; + CH->SLOT[SLOT2].phase += (finc*CH->SLOT[SLOT2].mul) >> 1; + + finc = fc + CH->SLOT[SLOT3].DT[kc]; + if (finc < 0) finc += fn_max; + CH->SLOT[SLOT3].phase += (finc*CH->SLOT[SLOT3].mul) >> 1; + + finc = fc + CH->SLOT[SLOT4].DT[kc]; + if (finc < 0) finc += fn_max; + CH->SLOT[SLOT4].phase += (finc*CH->SLOT[SLOT4].mul) >> 1; + } + else /* LFO phase modulation = zero */ + { + CH->SLOT[SLOT1].phase += CH->SLOT[SLOT1].Incr; + CH->SLOT[SLOT2].phase += CH->SLOT[SLOT2].Incr; + CH->SLOT[SLOT3].phase += CH->SLOT[SLOT3].Incr; + CH->SLOT[SLOT4].phase += CH->SLOT[SLOT4].Incr; + } +} + + +INLINE void chan_calc(FM_CH *CH) { unsigned int eg_out; @@ -1306,44 +1190,15 @@ INLINE void chan_calc(FM_OPN *OPN, FM_CH *CH) /* update phase counters AFTER output calculations */ if(CH->pms) { - - - /* add support for 3 slot mode */ - - - UINT32 block_fnum = CH->block_fnum; - - UINT32 fnum_lfo = ((block_fnum & 0x7f0) >> 4) * 32 * 8; - INT32 lfo_fn_table_index_offset = lfo_pm_table[ fnum_lfo + CH->pms + LFO_PM ]; - - if (lfo_fn_table_index_offset) /* LFO phase modulation active */ - { - UINT8 blk; - UINT32 fn; - int kc,fc; - - block_fnum = block_fnum*2 + lfo_fn_table_index_offset; - - blk = (block_fnum&0x7000) >> 12; - fn = block_fnum & 0xfff; - - /* keyscale code */ - kc = (blk<<2) | opn_fktable[fn >> 8]; - /* phase increment counter */ - fc = OPN->fn_table[fn]>>(7-blk); - - CH->SLOT[SLOT1].phase += ((fc+CH->SLOT[SLOT1].DT[kc])*CH->SLOT[SLOT1].mul) >> 1; - CH->SLOT[SLOT2].phase += ((fc+CH->SLOT[SLOT2].DT[kc])*CH->SLOT[SLOT2].mul) >> 1; - CH->SLOT[SLOT3].phase += ((fc+CH->SLOT[SLOT3].DT[kc])*CH->SLOT[SLOT3].mul) >> 1; - CH->SLOT[SLOT4].phase += ((fc+CH->SLOT[SLOT4].DT[kc])*CH->SLOT[SLOT4].mul) >> 1; - } - else /* LFO phase modulation = zero */ - { - CH->SLOT[SLOT1].phase += CH->SLOT[SLOT1].Incr; - CH->SLOT[SLOT2].phase += CH->SLOT[SLOT2].Incr; - CH->SLOT[SLOT3].phase += CH->SLOT[SLOT3].Incr; - CH->SLOT[SLOT4].phase += CH->SLOT[SLOT4].Incr; - } + /* add support for 3 slot mode */ + if ((ym2612.OPN.ST.mode & 0xC0) && (CH == &ym2612.CH[2])) + { + update_phase_lfo_slot(&ym2612.CH[2].SLOT[SLOT1], ym2612.CH[2].pms, ym2612.OPN.SL3.block_fnum[1]); + update_phase_lfo_slot(&ym2612.CH[2].SLOT[SLOT2], ym2612.CH[2].pms, ym2612.OPN.SL3.block_fnum[2]); + update_phase_lfo_slot(&ym2612.CH[2].SLOT[SLOT3], ym2612.CH[2].pms, ym2612.OPN.SL3.block_fnum[0]); + update_phase_lfo_slot(&ym2612.CH[2].SLOT[SLOT4], ym2612.CH[2].pms, ym2612.CH[2].block_fnum); + } + else update_phase_lfo_channel(CH); } else /* no LFO phase modulation */ { @@ -1357,18 +1212,22 @@ INLINE void chan_calc(FM_OPN *OPN, FM_CH *CH) /* update phase increment and envelope generator */ INLINE void refresh_fc_eg_slot(FM_SLOT *SLOT , int fc , int kc ) { - int ksr; + int ksr = kc >> SLOT->KSR; - /* (frequency) phase increment counter */ - SLOT->Incr = ((fc+SLOT->DT[kc])*SLOT->mul) >> 1; + fc += SLOT->DT[kc]; + + /* detects frequency overflow (credits to Nemesis) */ + if (fc < 0) fc += fn_max; + + /* (frequency) phase increment counter */ + SLOT->Incr = (fc * SLOT->mul) >> 1; - ksr = kc >> SLOT->KSR; if( SLOT->ksr != ksr ) { SLOT->ksr = ksr; /* calculate envelope generator rates */ - if ((SLOT->ar + SLOT->ksr) < 32+62) + if ((SLOT->ar + SLOT->ksr) < 94/*32+62*/) { SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ]; SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ]; @@ -1404,41 +1263,29 @@ INLINE void refresh_fc_eg_chan(FM_CH *CH ) } /* initialize time tables */ -static void init_timetables( FM_ST *ST , const UINT8 *dttable ) +static void init_timetables(const UINT8 *dttable ) { int i,d; double rate; -#if 0 - logerror("FM.C: samplerate=%8i chip clock=%8i freqbase=%f \n", - ST->rate, ST->clock, ST->freqbase ); -#endif - /* DeTune table */ - for (d = 0;d <= 3;d++){ - for (i = 0;i <= 31;i++){ - rate = ((double)dttable[d*32 + i]) * SIN_LEN * ST->freqbase * (1<dt_tab[d][i] = (INT32) rate; - ST->dt_tab[d+4][i] = -ST->dt_tab[d][i]; -#if 0 - logerror("FM.C: DT [%2i %2i] = %8x \n", d, i, ST->dt_tab[d][i] ); -#endif + for (d = 0;d <= 3;d++) + { + for (i = 0;i <= 31;i++) + { + rate = ((double)dttable[d*32 + i]) * SIN_LEN * ym2612.OPN.ST.freqbase * (1<mode = 0; /* normal mode */ - ST->TA = 0; - ST->TAC = 0; - ST->TB = 0; - ST->TBC = 0; - for( c = 0 ; c < num ; c++ ) { CH[c].fc = 0; @@ -1484,16 +1331,7 @@ static int init_tables(void) tl_tab[ x*2+0 + i*2*TL_RES_LEN ] = tl_tab[ x*2+0 ]>>i; tl_tab[ x*2+1 + i*2*TL_RES_LEN ] = -tl_tab[ x*2+0 + i*2*TL_RES_LEN ]; } - #if 0 - logerror("tl %04i", x); - for (i=0; i<13; i++) - logerror(", [%02i] %4x", i*2, tl_tab[ x*2 /*+1*/ + i*2*TL_RES_LEN ]); - logerror("\n"); - } - #endif } - /*logerror("FM.C: TL_TAB_LEN = %i elements (%i bytes)\n",TL_TAB_LEN, (int)sizeof(tl_tab));*/ - for (i=0; i>1; sin_tab[ i ] = n*2 + (m>=0.0? 0: 1 ); - /*logerror("FM.C: sin [%4i]= %4i (tl_tab value=%5i)\n", i, sin_tab[i],tl_tab[sin_tab[i]]);*/ } - /*logerror("FM.C: ENV_QUIET= %08x\n",ENV_QUIET );*/ - - /* build LFO PM modulation table */ for(i = 0; i < 8; i++) /* 8 PM depths */ { @@ -1550,34 +1384,10 @@ static int init_tables(void) lfo_pm_table[(fnum*32*8) + (i*32) + step +16] = -value; lfo_pm_table[(fnum*32*8) + (i*32) +(step^7)+24] = -value; } -#if 0 - logerror("LFO depth=%1x FNUM=%04x (<<4=%4x): ", i, fnum, fnum<<4); - for (step=0; step<16; step++) /* dump only positive part of waveforms */ - logerror("%02x ", lfo_pm_table[(fnum*32*8) + (i*32) + step] ); - logerror("\n"); -#endif - } } - - -#ifdef SAVE_SAMPLE - sample[0]=fopen("sampsum.pcm","wb"); -#endif - return 1; - -} - - - -static void FMCloseTable( void ) -{ -#ifdef SAVE_SAMPLE - fclose(sample[0]); -#endif - return; } @@ -1591,83 +1401,77 @@ INLINE void CSMKeyControll(FM_CH *CH) FM_KEYON(CH,SLOT2); FM_KEYON(CH,SLOT3); FM_KEYON(CH,SLOT4); + + /* all key off (credits to Nemesis) --> do not work properly atm */ + FM_KEYOFF(CH,SLOT1); + FM_KEYOFF(CH,SLOT2); + FM_KEYOFF(CH,SLOT3); + FM_KEYOFF(CH,SLOT4); } -#ifdef __STATE_H__ -/* FM channel save , internal state only */ -static void FMsave_state_channel(const char *name,int num,FM_CH *CH,int num_ch) +static void INTERNAL_TIMER_A() { - int slot , ch; - char state_name[20]; - static const char slot_array[4] = { 1 , 3 , 2 , 4 }; - - for(ch=0;chop1_out); - state_save_register_item(state_name, num, CH->fc); - /* slots */ - for(slot=0;slot<4;slot++) + if ((ym2612.OPN.ST.TAC -= ym2612.OPN.ST.TimerBase) <= 0) { - FM_SLOT *SLOT = &CH->SLOT[slot]; + /* set status (if enabled) */ + if (ym2612.OPN.ST.mode & 0x04) ym2612.OPN.ST.status |= 0x01; - sprintf(state_name,"%s.CH%d.SLOT%d",name,ch,slot_array[slot]); - state_save_register_item(state_name, num, SLOT->phase); - state_save_register_item(state_name, num, SLOT->state); - state_save_register_item(state_name, num, SLOT->volume); + /* reload the counter */ + ym2612.OPN.ST.TAC += ym2612.OPN.ST.TAL; + + /* CSM mode total level latch and auto key on */ + if ((ym2612.OPN.ST.mode & 0xC0) == 0x80) CSMKeyControll (&(ym2612.CH[2])); } } } -static void FMsave_state_st(const char *state_name,int num,FM_ST *ST) +static void INTERNAL_TIMER_B(int step) { -#if FM_BUSY_FLAG_SUPPORT - state_save_register_item(state_name, num, ST->BusyExpire ); -#endif - state_save_register_item(state_name, num, ST->address ); - state_save_register_item(state_name, num, ST->irq ); - state_save_register_item(state_name, num, ST->irqmask ); - state_save_register_item(state_name, num, ST->status ); - state_save_register_item(state_name, num, ST->mode ); - state_save_register_item(state_name, num, ST->prescaler_sel ); - state_save_register_item(state_name, num, ST->fn_h ); - state_save_register_item(state_name, num, ST->TA ); - state_save_register_item(state_name, num, ST->TAC ); - state_save_register_item(state_name, num, ST->TB ); - state_save_register_item(state_name, num, ST->TBC ); + if (ym2612.OPN.ST.mode & 0x02) + { + if ((ym2612.OPN.ST.TBC -= (ym2612.OPN.ST.TimerBase * (double)step)) <= 0) + { + /* set status (if enabled) */ + if (ym2612.OPN.ST.mode & 0x08) ym2612.OPN.ST.status |= 0x02; + + /* reload the counter */ + ym2612.OPN.ST.TBC += ym2612.OPN.ST.TBL; + } + } } -#endif /* _STATE_H */ - -#if BUILD_OPN - - /* prescaler set (and make time tables) */ -static void OPNSetPres(FM_OPN *OPN , int pres , int TimerPres, int SSGpres) +static void OPNSetPres(int pres) { int i; /* frequency base */ - OPN->ST.freqbase = (OPN->ST.rate) ? ((double)OPN->ST.clock / OPN->ST.rate) / pres : 0; + ym2612.OPN.ST.freqbase = ((double) ym2612.OPN.ST.clock / (double) ym2612.OPN.ST.rate) / ((double) pres); -#if 0 - OPN->ST.rate = (double)OPN->ST.clock / pres; - OPN->ST.freqbase = 1.0; -#endif + /* timer increment in usecs (timers are incremented after each updated samples) */ + ym2612.OPN.ST.TimerBase = 1000000.0 / (double)ym2612.OPN.ST.rate; - OPN->eg_timer_add = (1<ST.freqbase; - OPN->eg_timer_overflow = ( 3 ) * (1<ST.TimerBase = 1.0/((double)OPN->ST.clock / (double)TimerPres); - - /* SSG part prescaler set */ - if( SSGpres ) (*OPN->ST.SSG->set_clock)( OPN->ST.param, OPN->ST.clock * 2 / SSGpres ); /* make time tables */ - init_timetables( &OPN->ST, dt_tab ); + init_timetables(dt_tab); /* there are 2048 FNUMs that can be generated using FNUM/BLK registers but LFO works with one more bit of a precision so we really need 4096 elements */ @@ -1676,78 +1480,74 @@ static void OPNSetPres(FM_OPN *OPN , int pres , int TimerPres, int SSGpres) { /* freq table for octave 7 */ /* OPN phase increment counter = 20bit */ - OPN->fn_table[i] = (UINT32)( (double)i * 32 * OPN->ST.freqbase * (1<<(FREQ_SH-10)) ); /* -10 because chip works with 10.10 fixed point, while we use 16.16 */ -#if 0 - logerror("FM.C: fn_table[%4i] = %08x (dec=%8i)\n", - i, OPN->fn_table[i]>>6,OPN->fn_table[i]>>6 ); -#endif + ym2612.OPN.fn_table[i] = (UINT32)( (double)i * 32 * ym2612.OPN.ST.freqbase * (1<<(FREQ_SH-10)) ); /* -10 because chip works with 10.10 fixed point, while we use 16.16 */ } + /* maximal frequency, used for overflow, best setting with BLOCK=5 (notaz) */ + fn_max = ((UINT32)((double)ym2612.OPN.fn_table[0x7ff*2] / ym2612.OPN.ST.freqbase) >> 2); + /* LFO freq. table */ for(i = 0; i < 8; i++) { /* Amplitude modulation: 64 output levels (triangle waveform); 1 level lasts for one of "lfo_samples_per_step" samples */ /* Phase modulation: one entry from lfo_pm_output lasts for one of 4 * "lfo_samples_per_step" samples */ - OPN->lfo_freq[i] = (1.0 / lfo_samples_per_step[i]) * (1<ST.freqbase; -#if 0 - logerror("FM.C: lfo_freq[%i] = %08x (dec=%8i)\n", - i, OPN->lfo_freq[i],OPN->lfo_freq[i] ); -#endif + ym2612.OPN.lfo_freq[i] = (UINT32)((1.0 / lfo_samples_per_step[i]) * (1<type & TYPE_LFOPAN ) - { + case 0x21: /* Test */ + break; + + case 0x22: /* LFO FREQ (YM2608/YM2610/YM2610B/ym2612) */ if (v&0x08) /* LFO enabled ? */ { - OPN->lfo_inc = OPN->lfo_freq[v&7]; + ym2612.OPN.lfo_inc = ym2612.OPN.lfo_freq[v&7]; } else { - OPN->lfo_inc = 0; + ym2612.OPN.lfo_inc = 0; } - } - break; - case 0x24: /* timer A High 8*/ - OPN->ST.TA = (OPN->ST.TA & 0x03)|(((int)v)<<2); - break; - case 0x25: /* timer A Low 2*/ - OPN->ST.TA = (OPN->ST.TA & 0x3fc)|(v&3); - break; - case 0x26: /* timer B */ - OPN->ST.TB = v; - break; - case 0x27: /* mode, timer control */ - set_timers( &(OPN->ST),OPN->ST.param,v ); - break; - case 0x28: /* key on / off */ - c = v & 0x03; - if( c == 3 ) break; - if( (v&0x04) && (OPN->type & TYPE_6CH) ) c+=3; - CH = OPN->P_CH; - CH = &CH[c]; - if(v&0x10) FM_KEYON(CH,SLOT1); else FM_KEYOFF(CH,SLOT1); - if(v&0x20) FM_KEYON(CH,SLOT2); else FM_KEYOFF(CH,SLOT2); - if(v&0x40) FM_KEYON(CH,SLOT3); else FM_KEYOFF(CH,SLOT3); - if(v&0x80) FM_KEYON(CH,SLOT4); else FM_KEYOFF(CH,SLOT4); - break; + break; + case 0x24: /* timer A High 8*/ + ym2612.OPN.ST.TA = (ym2612.OPN.ST.TA & 0x03)|(((int)v)<<2); + ym2612.OPN.ST.TAL = fm_timera_tab[ym2612.OPN.ST.TA]; + break; + case 0x25: /* timer A Low 2*/ + ym2612.OPN.ST.TA = (ym2612.OPN.ST.TA & 0x3fc)|(v&3); + ym2612.OPN.ST.TAL = fm_timera_tab[ym2612.OPN.ST.TA]; + break; + case 0x26: /* timer B */ + ym2612.OPN.ST.TB = v; + ym2612.OPN.ST.TBL = fm_timerb_tab[ym2612.OPN.ST.TB]; + break; + case 0x27: /* mode, timer control */ + set_timers(v); + break; + case 0x28: /* key on / off */ + c = v & 0x03; + if( c == 3 ) break; + if (v&0x04) c+=3; /* CH 4-6 */ + CH = &ym2612.CH[c]; + + if (v&0x10) FM_KEYON(CH,SLOT1); else FM_KEYOFF(CH,SLOT1); + if (v&0x20) FM_KEYON(CH,SLOT2); else FM_KEYOFF(CH,SLOT2); + if (v&0x40) FM_KEYON(CH,SLOT3); else FM_KEYOFF(CH,SLOT3); + if (v&0x80) FM_KEYON(CH,SLOT4); else FM_KEYOFF(CH,SLOT4); + break; } } /* write a OPN register (0x30-0xff) */ -static void OPNWriteReg(FM_OPN *OPN, int r, int v) +static void OPNWriteReg(int r, int v) { FM_CH *CH; FM_SLOT *SLOT; @@ -1758,2680 +1558,226 @@ static void OPNWriteReg(FM_OPN *OPN, int r, int v) if (r >= 0x100) c+=3; - CH = OPN->P_CH; - CH = &CH[c]; + CH = &ym2612.CH[c]; SLOT = &(CH->SLOT[OPN_SLOT(r)]); switch( r & 0xf0 ) { - case 0x30: /* DET , MUL */ - set_det_mul(&OPN->ST,CH,SLOT,v); - break; + case 0x30: /* DET , MUL */ + set_det_mul(CH,SLOT,v); + break; - case 0x40: /* TL */ - set_tl(CH,SLOT,v); - break; + case 0x40: /* TL */ + set_tl(CH,SLOT,v); + break; - case 0x50: /* KS, AR */ - set_ar_ksr(CH,SLOT,v); - break; + case 0x50: /* KS, AR */ + set_ar_ksr(CH,SLOT,v); + break; - case 0x60: /* bit7 = AM ENABLE, DR */ - set_dr(SLOT,v); - - if(OPN->type & TYPE_LFOPAN) /* YM2608/2610/2610B/2612 */ - { + case 0x60: /* bit7 = AM ENABLE, DR */ + set_dr(SLOT,v); SLOT->AMmask = (v&0x80) ? ~0 : 0; - } - break; - - case 0x70: /* SR */ - set_sr(SLOT,v); - break; - - case 0x80: /* SL, RR */ - set_sl_rr(SLOT,v); - break; - - case 0x90: /* SSG-EG */ - - SLOT->ssg = v&0x0f; - SLOT->ssgn = (v&0x04)>>1; /* bit 1 in ssgn = attack */ - - /* SSG-EG envelope shapes : - - E AtAlH - 1 0 0 0 \\\\ - - 1 0 0 1 \___ - - 1 0 1 0 \/\/ - ___ - 1 0 1 1 \ - - 1 1 0 0 //// - ___ - 1 1 0 1 / - - 1 1 1 0 /\/\ - - 1 1 1 1 /___ - - - E = SSG-EG enable - - - The shapes are generated using Attack, Decay and Sustain phases. - - Each single character in the diagrams above represents this whole - sequence: - - - when KEY-ON = 1, normal Attack phase is generated (*without* any - difference when compared to normal mode), - - - later, when envelope level reaches minimum level (max volume), - the EG switches to Decay phase (which works with bigger steps - when compared to normal mode - see below), - - - later when envelope level passes the SL level, - the EG swithes to Sustain phase (which works with bigger steps - when compared to normal mode - see below), - - - finally when envelope level reaches maximum level (min volume), - the EG switches to Attack phase again (depends on actual waveform). - - Important is that when switch to Attack phase occurs, the phase counter - of that operator will be zeroed-out (as in normal KEY-ON) but not always. - (I havent found the rule for that - perhaps only when the output level is low) - - The difference (when compared to normal Envelope Generator mode) is - that the resolution in Decay and Sustain phases is 4 times lower; - this results in only 256 steps instead of normal 1024. - In other words: - when SSG-EG is disabled, the step inside of the EG is one, - when SSG-EG is enabled, the step is four (in Decay and Sustain phases). - - Times between the level changes are the same in both modes. - - - Important: - Decay 1 Level (so called SL) is compared to actual SSG-EG output, so - it is the same in both SSG and no-SSG modes, with this exception: - - when the SSG-EG is enabled and is generating raising levels - (when the EG output is inverted) the SL will be found at wrong level !!! - For example, when SL=02: - 0 -6 = -6dB in non-inverted EG output - 96-6 = -90dB in inverted EG output - Which means that EG compares its level to SL as usual, and that the - output is simply inverted afterall. - - - The Yamaha's manuals say that AR should be set to 0x1f (max speed). - That is not necessary, but then EG will be generating Attack phase. - - */ - - - break; - - case 0xa0: - switch( OPN_SLOT(r) ){ - case 0: /* 0xa0-0xa2 : FNUM1 */ - { - UINT32 fn = (((UINT32)( (OPN->ST.fn_h)&7))<<8) + v; - UINT8 blk = OPN->ST.fn_h>>3; - /* keyscale code */ - CH->kcode = (blk<<2) | opn_fktable[fn >> 7]; - /* phase increment counter */ - CH->fc = OPN->fn_table[fn*2]>>(7-blk); - - /* store fnum in clear form for LFO PM calculations */ - CH->block_fnum = (blk<<11) | fn; - - CH->SLOT[SLOT1].Incr=-1; - } break; - case 1: /* 0xa4-0xa6 : FNUM2,BLK */ - OPN->ST.fn_h = v&0x3f; + + case 0x70: /* SR */ + set_sr(SLOT,v); break; - case 2: /* 0xa8-0xaa : 3CH FNUM1 */ - if(r < 0x100) - { - UINT32 fn = (((UINT32)(OPN->SL3.fn_h&7))<<8) + v; - UINT8 blk = OPN->SL3.fn_h>>3; - /* keyscale code */ - OPN->SL3.kcode[c]= (blk<<2) | opn_fktable[fn >> 7]; - /* phase increment counter */ - OPN->SL3.fc[c] = OPN->fn_table[fn*2]>>(7-blk); - OPN->SL3.block_fnum[c] = fn; - (OPN->P_CH)[2].SLOT[SLOT1].Incr=-1; - } + + case 0x80: /* SL, RR */ + set_sl_rr(SLOT,v); break; - case 3: /* 0xac-0xae : 3CH FNUM2,BLK */ - if(r < 0x100) - OPN->SL3.fn_h = v&0x3f; + + case 0x90: /* SSG-EG */ + if (!config.ssg_enabled) v = 0; + SLOT->ssg = v&0x0f; + SLOT->ssgn = (v&0x04)>>1; /* bit 1 in ssgn = attack */ + + /* SSG-EG envelope shapes : + + E AtAlH + 1 0 0 0 \\\\ + + 1 0 0 1 \___ + + 1 0 1 0 \/\/ + ___ + 1 0 1 1 \ + + 1 1 0 0 //// + ___ + 1 1 0 1 / + + 1 1 1 0 /\/\ + + 1 1 1 1 /___ + + + E = SSG-EG enable + + + The shapes are generated using Attack, Decay and Sustain phases. + + Each single character in the diagrams above represents this whole + sequence: + + - when KEY-ON = 1, normal Attack phase is generated (*without* any + difference when compared to normal mode), + + - later, when envelope level reaches minimum level (max volume), + the EG switches to Decay phase (which works with bigger steps + when compared to normal mode - see below), + + - later when envelope level passes the SL level, + the EG swithes to Sustain phase (which works with bigger steps + when compared to normal mode - see below), + + - finally when envelope level reaches maximum level (min volume), + the EG switches to Attack phase again (depends on actual waveform). + + Important is that when switch to Attack phase occurs, the phase counter + of that operator will be zeroed-out (as in normal KEY-ON) but not always. + (I havent found the rule for that - perhaps only when the output level is low) + + The difference (when compared to normal Envelope Generator mode) is + that the resolution in Decay and Sustain phases is 4 times lower; + this results in only 256 steps instead of normal 1024. + In other words: + when SSG-EG is disabled, the step inside of the EG is one, + when SSG-EG is enabled, the step is four (in Decay and Sustain phases). + + Times between the level changes are the same in both modes. + + + Important: + Decay 1 Level (so called SL) is compared to actual SSG-EG output, so + it is the same in both SSG and no-SSG modes, with this exception: + + when the SSG-EG is enabled and is generating raising levels + (when the EG output is inverted) the SL will be found at wrong level !!! + For example, when SL=02: + 0 -6 = -6dB in non-inverted EG output + 96-6 = -90dB in inverted EG output + Which means that EG compares its level to SL as usual, and that the + output is simply inverted afterall. + + + The Yamaha's manuals say that AR should be set to 0x1f (max speed). + That is not necessary, but then EG will be generating Attack phase. + + */ + + break; - } - break; - case 0xb0: - switch( OPN_SLOT(r) ){ - case 0: /* 0xb0-0xb2 : FB,ALGO */ - { - int feedback = (v>>3)&7; - CH->ALGO = v&7; - CH->FB = feedback ? feedback+6 : 0; - setup_connection( CH, c ); - } - break; - case 1: /* 0xb4-0xb6 : L , R , AMS , PMS (YM2612/YM2610B/YM2610/YM2608) */ - if( OPN->type & TYPE_LFOPAN) - { - /* b0-2 PMS */ - CH->pms = (v & 7) * 32; /* CH->pms = PM depth * 32 (index in lfo_pm_table) */ - - /* b4-5 AMS */ - CH->ams = lfo_ams_depth_shift[(v>>4) & 0x03]; - - /* PAN : b7 = L, b6 = R */ - OPN->pan[ c*2 ] = (v & 0x80) ? ~0 : 0; - OPN->pan[ c*2+1 ] = (v & 0x40) ? ~0 : 0; - - } - break; - } - break; - } -} - -#endif /* BUILD_OPN */ - -#if BUILD_OPN_PRESCALER -/* - prescaler circuit (best guess to verified chip behaviour) - - +--------------+ +-sel2-+ - | +--|in20 | - +---+ | +-sel1-+ | | -M-CLK -+-|1/2|-+--|in10 | +---+ | out|--INT_CLOCK - | +---+ | out|-|1/3|-|in21 | - +----------|in11 | +---+ +------+ - +------+ - -reg.2d : sel2 = in21 (select sel2) -reg.2e : sel1 = in11 (select sel1) -reg.2f : sel1 = in10 , sel2 = in20 (clear selector) -reset : sel1 = in11 , sel2 = in21 (clear both) - -*/ -void OPNPrescaler_w(FM_OPN *OPN , int addr, int pre_divider) -{ - static const int opn_pres[4] = { 2*12 , 2*12 , 6*12 , 3*12 }; - static const int ssg_pres[4] = { 1 , 1 , 4 , 2 }; - int sel; - - switch(addr) - { - case 0: /* when reset */ - OPN->ST.prescaler_sel = 2; - break; - case 1: /* when postload */ - break; - case 0x2d: /* divider sel : select 1/1 for 1/3line */ - OPN->ST.prescaler_sel |= 0x02; - break; - case 0x2e: /* divider sel , select 1/3line for output */ - OPN->ST.prescaler_sel |= 0x01; - break; - case 0x2f: /* divider sel , clear both selector to 1/2,1/2 */ - OPN->ST.prescaler_sel = 0; - break; - } - sel = OPN->ST.prescaler_sel & 3; - /* update prescaler */ - OPNSetPres( OPN, opn_pres[sel]*pre_divider, - opn_pres[sel]*pre_divider, - ssg_pres[sel]*pre_divider ); -} -#endif /* BUILD_OPN_PRESCALER */ - -#if BUILD_YM2203 -/*****************************************************************************/ -/* YM2203 local section */ -/*****************************************************************************/ - -/* here's the virtual YM2203(OPN) */ -typedef struct -{ - UINT8 REGS[256]; /* registers */ - FM_OPN OPN; /* OPN state */ - FM_CH CH[3]; /* channel state */ -} YM2203; - -/* Generate samples for one of the YM2203s */ -void YM2203UpdateOne(void *chip, FMSAMPLE *buffer, int length) -{ - YM2203 *F2203 = chip; - FM_OPN *OPN = &F2203->OPN; - int i; - FMSAMPLE *buf = buffer; - FM_CH *cch[3]; - - cch[0] = &F2203->CH[0]; - cch[1] = &F2203->CH[1]; - cch[2] = &F2203->CH[2]; - - - /* refresh PG and EG */ - refresh_fc_eg_chan( cch[0] ); - refresh_fc_eg_chan( cch[1] ); - if( (F2203->OPN.ST.mode & 0xc0) ) - { - /* 3SLOT MODE */ - if( cch[2]->SLOT[SLOT1].Incr==-1) - { - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT1] , OPN->SL3.fc[1] , OPN->SL3.kcode[1] ); - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT2] , OPN->SL3.fc[2] , OPN->SL3.kcode[2] ); - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT3] , OPN->SL3.fc[0] , OPN->SL3.kcode[0] ); - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT4] , cch[2]->fc , cch[2]->kcode ); - } - }else refresh_fc_eg_chan( cch[2] ); - - - /* YM2203 doesn't have LFO so we must keep these globals at 0 level */ - LFO_AM = 0; - LFO_PM = 0; - - /* buffering */ - for (i=0; i < length ; i++) - { - /* clear outputs */ - out_fm[0] = 0; - out_fm[1] = 0; - out_fm[2] = 0; - - /* advance envelope generator */ - OPN->eg_timer += OPN->eg_timer_add; - while (OPN->eg_timer >= OPN->eg_timer_overflow) - { - OPN->eg_timer -= OPN->eg_timer_overflow; - OPN->eg_cnt++; - - advance_eg_channel(OPN, &cch[0]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[1]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[2]->SLOT[SLOT1]); - } - - /* calculate FM */ - chan_calc(OPN, cch[0] ); - chan_calc(OPN, cch[1] ); - chan_calc(OPN, cch[2] ); - - /* buffering */ - { - int lt; - - lt = out_fm[0] + out_fm[1] + out_fm[2]; - - lt >>= FINAL_SH; - - Limit( lt , MAXOUT, MINOUT ); - - #ifdef SAVE_SAMPLE - SAVE_ALL_CHANNELS - #endif - - /* buffering */ - buf[i] = lt; - } - - /* timer A control */ - INTERNAL_TIMER_A( &F2203->OPN.ST , cch[2] ) - } - INTERNAL_TIMER_B(&F2203->OPN.ST,length) -} - -/* ---------- reset one of chip ---------- */ -void YM2203ResetChip(void *chip) -{ - int i; - YM2203 *F2203 = chip; - FM_OPN *OPN = &F2203->OPN; - - /* Reset Prescaler */ - OPNPrescaler_w(OPN, 0 , 1 ); - /* reset SSG section */ - (*OPN->ST.SSG->reset)(OPN->ST.param); - /* status clear */ - FM_IRQMASK_SET(&OPN->ST,0x03); - FM_BUSY_CLEAR(&OPN->ST); - OPNWriteMode(OPN,0x27,0x30); /* mode 0 , timer reset */ - - OPN->eg_timer = 0; - OPN->eg_cnt = 0; - - FM_STATUS_RESET(&OPN->ST, 0xff); - - reset_channels( &OPN->ST , F2203->CH , 3 ); - /* reset OPerator paramater */ - for(i = 0xb2 ; i >= 0x30 ; i-- ) OPNWriteReg(OPN,i,0); - for(i = 0x26 ; i >= 0x20 ; i-- ) OPNWriteReg(OPN,i,0); -} - -#ifdef __STATE_H__ -void YM2203Postload(void *chip) -{ - if (chip) - { - YM2203 *F2203 = (YM2203 *)chip; - int r; - - /* prescaler */ - OPNPrescaler_w(&F2203->OPN,1,1); - - /* SSG registers */ - for(r=0;r<16;r++) - { - (*F2203->OPN.ST.SSG->write)(F2203->OPN.ST.param,0,r); - (*F2203->OPN.ST.SSG->write)(F2203->OPN.ST.param,1,F2203->REGS[r]); - } - - /* OPN registers */ - /* DT / MULTI , TL , KS / AR , AMON / DR , SR , SL / RR , SSG-EG */ - for(r=0x30;r<0x9e;r++) - if((r&3) != 3) - OPNWriteReg(&F2203->OPN,r,F2203->REGS[r]); - /* FB / CONNECT , L / R / AMS / PMS */ - for(r=0xb0;r<0xb6;r++) - if((r&3) != 3) - OPNWriteReg(&F2203->OPN,r,F2203->REGS[r]); - - /* channels */ - /*FM_channel_postload(F2203->CH,3);*/ - } -} - -static void YM2203_save_state(YM2203 *F2203, int index) -{ - static const char statename[] = "YM2203"; - - state_save_register_item_array(statename, index, F2203->REGS); - FMsave_state_st(statename,index,&F2203->OPN.ST); - FMsave_state_channel(statename,index,F2203->CH,3); - /* 3slots */ - state_save_register_item_array (statename, index, F2203->OPN.SL3.fc); - state_save_register_item (statename, index, F2203->OPN.SL3.fn_h); - state_save_register_item_array (statename, index, F2203->OPN.SL3.kcode); -} -#endif /* _STATE_H */ - -/* ---------- Initialize YM2203 emulator(s) ---------- - 'num' is the number of virtual YM2203s to allocate - 'clock' is the chip clock in Hz - 'rate' is sampling rate -*/ -void * YM2203Init(void *param, int index, int clock, int rate, - FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const struct ssg_callbacks *ssg) -{ - YM2203 *F2203; - - /* allocate ym2203 state space */ - if( (F2203 = (YM2203 *)malloc(sizeof(YM2203)))==NULL) - return NULL; - /* clear */ - memset(F2203,0,sizeof(YM2203)); - - if( !init_tables() ) - { - free( F2203 ); - return NULL; - } - - F2203->OPN.ST.param = param; - F2203->OPN.type = TYPE_YM2203; - F2203->OPN.P_CH = F2203->CH; - F2203->OPN.ST.clock = clock; - F2203->OPN.ST.rate = rate; - - F2203->OPN.ST.Timer_Handler = TimerHandler; - F2203->OPN.ST.IRQ_Handler = IRQHandler; - F2203->OPN.ST.SSG = ssg; - YM2203ResetChip(F2203); - -#ifdef __STATE_H__ - YM2203_save_state(F2203, index); -#endif - return F2203; -} - -/* shut down emulator */ -void YM2203Shutdown(void *chip) -{ - YM2203 *FM2203 = chip; - - FMCloseTable(); - free(FM2203); -} - -/* YM2203 I/O interface */ -int YM2203Write(void *chip,int a,UINT8 v) -{ - YM2203 *F2203 = chip; - FM_OPN *OPN = &F2203->OPN; - - if( !(a&1) ) - { /* address port */ - OPN->ST.address = (v &= 0xff); - - /* Write register to SSG emulator */ - if( v < 16 ) (*OPN->ST.SSG->write)(OPN->ST.param,0,v); - - /* prescaler select : 2d,2e,2f */ - if( v >= 0x2d && v <= 0x2f ) - OPNPrescaler_w(OPN , v , 1); - } - else - { /* data port */ - int addr = OPN->ST.address; - F2203->REGS[addr] = v; - switch( addr & 0xf0 ) - { - case 0x00: /* 0x00-0x0f : SSG section */ - /* Write data to SSG emulator */ - (*OPN->ST.SSG->write)(OPN->ST.param,a,v); - break; - case 0x20: /* 0x20-0x2f : Mode section */ - YM2203UpdateReq(OPN->ST.param); - /* write register */ - OPNWriteMode(OPN,addr,v); - break; - default: /* 0x30-0xff : OPN section */ - YM2203UpdateReq(OPN->ST.param); - /* write register */ - OPNWriteReg(OPN,addr,v); - } - FM_BUSY_SET(&OPN->ST,1); - } - return OPN->ST.irq; -} - -UINT8 YM2203Read(void *chip,int a) -{ - YM2203 *F2203 = chip; - int addr = F2203->OPN.ST.address; - UINT8 ret = 0; - - if( !(a&1) ) - { /* status port */ - ret = FM_STATUS_FLAG(&F2203->OPN.ST); - } - else - { /* data port (only SSG) */ - if( addr < 16 ) ret = (*F2203->OPN.ST.SSG->read)(F2203->OPN.ST.param); - } - return ret; -} - -int YM2203TimerOver(void *chip,int c) -{ - YM2203 *F2203 = chip; - - if( c ) - { /* Timer B */ - TimerBOver( &(F2203->OPN.ST) ); - } - else - { /* Timer A */ - YM2203UpdateReq(F2203->OPN.ST.param); - /* timer update */ - TimerAOver( &(F2203->OPN.ST) ); - /* CSM mode key,TL control */ - if( F2203->OPN.ST.mode & 0x80 ) - { /* CSM mode auto key on */ - CSMKeyControll( &(F2203->CH[2]) ); - } - } - return F2203->OPN.ST.irq; -} -#endif /* BUILD_YM2203 */ - - - -#if (BUILD_YM2608||BUILD_YM2610||BUILD_YM2610B) - -/* ADPCM type A channel struct */ -typedef struct -{ - UINT8 flag; /* port state */ - UINT8 flagMask; /* arrived flag mask */ - UINT8 now_data; /* current ROM data */ - UINT32 now_addr; /* current ROM address */ - UINT32 now_step; - UINT32 step; - UINT32 start; /* sample data start address*/ - UINT32 end; /* sample data end address */ - UINT8 IL; /* Instrument Level */ - INT32 adpcm_acc; /* accumulator */ - INT32 adpcm_step; /* step */ - INT32 adpcm_out; /* (speedup) hiro-shi!! */ - INT8 vol_mul; /* volume in "0.75dB" steps */ - UINT8 vol_shift; /* volume in "-6dB" steps */ - INT32 *pan; /* &out_adpcm[OPN_xxxx] */ -} ADPCM_CH; - -/* here's the virtual YM2610 */ -typedef struct -{ - UINT8 REGS[512]; /* registers */ - FM_OPN OPN; /* OPN state */ - FM_CH CH[6]; /* channel state */ - UINT8 addr_A1; /* address line A1 */ - - /* ADPCM-A unit */ - UINT8 *pcmbuf; /* pcm rom buffer */ - UINT32 pcm_size; /* size of pcm rom */ - UINT8 adpcmTL; /* adpcmA total level */ - ADPCM_CH adpcm[6]; /* adpcm channels */ - UINT32 adpcmreg[0x30]; /* registers */ - UINT8 adpcm_arrivedEndAddress; - YM_DELTAT deltaT; /* Delta-T ADPCM unit */ - - UINT8 flagmask; /* YM2608 only */ - UINT8 irqmask; /* YM2608 only */ -} YM2610; - -/* here is the virtual YM2608 */ -typedef YM2610 YM2608; - - -/**** YM2610 ADPCM defines ****/ -#define ADPCM_SHIFT (16) /* frequency step rate */ -#define ADPCMA_ADDRESS_SHIFT 8 /* adpcm A address shift */ - -static UINT8 *pcmbufA; -static UINT32 pcmsizeA; - - -/* Algorithm and tables verified on real YM2608 and YM2610 */ - -/* usual ADPCM table (16 * 1.1^N) */ -static int steps[49] = -{ - 16, 17, 19, 21, 23, 25, 28, - 31, 34, 37, 41, 45, 50, 55, - 60, 66, 73, 80, 88, 97, 107, - 118, 130, 143, 157, 173, 190, 209, - 230, 253, 279, 307, 337, 371, 408, - 449, 494, 544, 598, 658, 724, 796, - 876, 963, 1060, 1166, 1282, 1411, 1552 -}; - -/* different from the usual ADPCM table */ -static int step_inc[8] = { -1*16, -1*16, -1*16, -1*16, 2*16, 5*16, 7*16, 9*16 }; - -/* speedup purposes only */ -static int jedi_table[ 49*16 ]; - - -static void Init_ADPCMATable(void){ - - int step, nib; - - for (step = 0; step < 49; step++) - { - /* loop over all nibbles and compute the difference */ - for (nib = 0; nib < 16; nib++) - { - int value = (2*(nib & 0x07) + 1) * steps[step] / 8; - jedi_table[step*16 + nib] = (nib&0x08) ? -value : value; - } - } -} - -/* ADPCM A (Non control type) : calculate one channel output */ -INLINE void ADPCMA_calc_chan( YM2610 *F2610, ADPCM_CH *ch ) -{ - UINT32 step; - UINT8 data; - - - ch->now_step += ch->step; - if ( ch->now_step >= (1<now_step >> ADPCM_SHIFT; - ch->now_step &= (1< instead of == */ - /* YM2610 checks lower 20 bits only, the 4 MSB bits are sample bank */ - /* Here we use 1<<21 to compensate for nibble calculations */ - - if ( (ch->now_addr & ((1<<21)-1)) == ((ch->end<<1) & ((1<<21)-1)) ) - { - ch->flag = 0; - F2610->adpcm_arrivedEndAddress |= ch->flagMask; - return; - } -#if 0 - if ( ch->now_addr > (pcmsizeA<<1) ) { - LOG(LOG_WAR,("YM2610: Attempting to play past adpcm rom size!\n" )); - return; - } -#endif - if ( ch->now_addr&1 ) - data = ch->now_data & 0x0f; - else - { - ch->now_data = *(pcmbufA+(ch->now_addr>>1)); - data = (ch->now_data >> 4) & 0x0f; - } - - ch->now_addr++; - - ch->adpcm_acc += jedi_table[ch->adpcm_step + data]; - - /* extend 12-bit signed int */ - if (ch->adpcm_acc & 0x800) - ch->adpcm_acc |= ~0xfff; - else - ch->adpcm_acc &= 0xfff; - - ch->adpcm_step += step_inc[data & 7]; - Limit( ch->adpcm_step, 48*16, 0*16 ); - - }while(--step); - - /* calc pcm * volume data */ - ch->adpcm_out = ((ch->adpcm_acc * ch->vol_mul) >> ch->vol_shift) & ~3; /* multiply, shift and mask out 2 LSB bits */ - } - - /* output for work of output channels (out_adpcm[OPNxxxx])*/ - *(ch->pan) += ch->adpcm_out; -} - -/* ADPCM type A Write */ -static void FM_ADPCMAWrite(YM2610 *F2610,int r,int v) -{ - ADPCM_CH *adpcm = F2610->adpcm; - UINT8 c = r&0x07; - - F2610->adpcmreg[r] = v&0xff; /* stock data */ - switch( r ){ - case 0x00: /* DM,--,C5,C4,C3,C2,C1,C0 */ - if( !(v&0x80) ) - { - /* KEY ON */ - for( c = 0; c < 6; c++ ) - { - if( (v>>c)&1 ) + case 0xa0: + switch( OPN_SLOT(r) ){ + case 0: /* 0xa0-0xa2 : FNUM1 */ { - /**** start adpcm ****/ - adpcm[c].step = (UINT32)((float)(1<OPN.ST.freqbase)/3.0); - adpcm[c].now_addr = adpcm[c].start<<1; - adpcm[c].now_step = 0; - adpcm[c].adpcm_acc = 0; - adpcm[c].adpcm_step= 0; - adpcm[c].adpcm_out = 0; - adpcm[c].flag = 1; + UINT32 fn = (((UINT32)((ym2612.OPN.ST.fn_h)&7))<<8) + v; + UINT8 blk = ym2612.OPN.ST.fn_h>>3; + /* keyscale code */ + CH->kcode = (blk<<2) | opn_fktable[fn >> 7]; + /* phase increment counter */ + CH->fc = ym2612.OPN.fn_table[fn*2]>>(7-blk); - if(F2610->pcmbuf==NULL){ /* Check ROM Mapped */ - logerror("YM2608-YM2610: ADPCM-A rom not mapped\n"); - adpcm[c].flag = 0; - } else{ - if(adpcm[c].end >= F2610->pcm_size){ /* Check End in Range */ - logerror("YM2610: ADPCM-A end out of range: $%08x\n",adpcm[c].end); - /*adpcm[c].end = F2610->pcm_size-1;*/ /* JB: DO NOT uncomment this, otherwise you will break the comparison in the ADPCM_CALC_CHA() */ - } - if(adpcm[c].start >= F2610->pcm_size) /* Check Start in Range */ - { - logerror("YM2608-YM2610: ADPCM-A start out of range: $%08x\n",adpcm[c].start); - adpcm[c].flag = 0; - } + /* store fnum in clear form for LFO PM calculations */ + CH->block_fnum = (blk<<11) | fn; + + CH->SLOT[SLOT1].Incr=-1; + } + break; + case 1: /* 0xa4-0xa6 : FNUM2,BLK */ + ym2612.OPN.ST.fn_h = v&0x3f; + break; + case 2: /* 0xa8-0xaa : 3CH FNUM1 */ + if(r < 0x100) + { + UINT32 fn = (((UINT32)(ym2612.OPN.SL3.fn_h&7))<<8) + v; + UINT8 blk = ym2612.OPN.SL3.fn_h>>3; + /* keyscale code */ + ym2612.OPN.SL3.kcode[c]= (blk<<2) | opn_fktable[fn >> 7]; + /* phase increment counter */ + ym2612.OPN.SL3.fc[c] = ym2612.OPN.fn_table[fn*2]>>(7-blk); + ym2612.OPN.SL3.block_fnum[c] = (blk<<11) | fn; //fn; + ym2612.CH[2].SLOT[SLOT1].Incr=-1; } - } - } - } - else - { - /* KEY OFF */ - for( c = 0; c < 6; c++ ) - if( (v>>c)&1 ) - adpcm[c].flag = 0; - } - break; - case 0x01: /* B0-5 = TL */ - F2610->adpcmTL = (v & 0x3f) ^ 0x3f; - for( c = 0; c < 6; c++ ) - { - int volume = F2610->adpcmTL + adpcm[c].IL; - - if ( volume >= 63 ) /* This is correct, 63 = quiet */ - { - adpcm[c].vol_mul = 0; - adpcm[c].vol_shift = 0; - } - else - { - adpcm[c].vol_mul = 15 - (volume & 7); /* so called 0.75 dB */ - adpcm[c].vol_shift = 1 + (volume >> 3); /* Yamaha engineers used the approximation: each -6 dB is close to divide by two (shift right) */ - } - - /* calc pcm * volume data */ - adpcm[c].adpcm_out = ((adpcm[c].adpcm_acc * adpcm[c].vol_mul) >> adpcm[c].vol_shift) & ~3; /* multiply, shift and mask out low 2 bits */ - } - break; - default: - c = r&0x07; - if( c >= 0x06 ) return; - switch( r&0x38 ){ - case 0x08: /* B7=L,B6=R, B4-0=IL */ - { - int volume; - - adpcm[c].IL = (v & 0x1f) ^ 0x1f; - - volume = F2610->adpcmTL + adpcm[c].IL; - - if ( volume >= 63 ) /* This is correct, 63 = quiet */ - { - adpcm[c].vol_mul = 0; - adpcm[c].vol_shift = 0; - } - else - { - adpcm[c].vol_mul = 15 - (volume & 7); /* so called 0.75 dB */ - adpcm[c].vol_shift = 1 + (volume >> 3); /* Yamaha engineers used the approximation: each -6 dB is close to divide by two (shift right) */ - } - - adpcm[c].pan = &out_adpcm[(v>>6)&0x03]; - - /* calc pcm * volume data */ - adpcm[c].adpcm_out = ((adpcm[c].adpcm_acc * adpcm[c].vol_mul) >> adpcm[c].vol_shift) & ~3; /* multiply, shift and mask out low 2 bits */ - } - break; - case 0x10: - case 0x18: - adpcm[c].start = ( (F2610->adpcmreg[0x18 + c]*0x0100 | F2610->adpcmreg[0x10 + c]) << ADPCMA_ADDRESS_SHIFT); - break; - case 0x20: - case 0x28: - adpcm[c].end = ( (F2610->adpcmreg[0x28 + c]*0x0100 | F2610->adpcmreg[0x20 + c]) << ADPCMA_ADDRESS_SHIFT); - adpcm[c].end += (1<flag); - state_save_register_item(state_name, num, adpcm->now_data); - state_save_register_item(state_name, num, adpcm->now_addr); - state_save_register_item(state_name, num, adpcm->now_step); - state_save_register_item(state_name, num, adpcm->adpcm_acc); - state_save_register_item(state_name, num, adpcm->adpcm_step); - state_save_register_item(state_name, num, adpcm->adpcm_out); - } -} -#endif /* _STATE_H */ - -#endif /* (BUILD_YM2608||BUILD_YM2610||BUILD_YM2610B) */ - - -#if BUILD_YM2608 -/*****************************************************************************/ -/* YM2608 local section */ -/*****************************************************************************/ - - - -static unsigned int YM2608_ADPCM_ROM_addr[2*6] = { -0x0000, 0x01bf, /* bass drum */ -0x01c0, 0x043f, /* snare drum */ -0x0440, 0x1b7f, /* top cymbal */ -0x1b80, 0x1cff, /* high hat */ -0x1d00, 0x1f7f, /* tom tom */ -0x1f80, 0x1fff /* rim shot */ -}; - - -/* - This data is derived from the chip's output - internal ROM can't be read. - It was verified, using real YM2608, that this ADPCM stream produces 100% correct output signal. -*/ - -static unsigned char YM2608_ADPCM_ROM[0x2000] = { - -/* Source: 01BD.ROM */ -/* Length: 448 / 0x000001C0 */ - -0x88,0x08,0x08,0x08,0x00,0x88,0x16,0x76,0x99,0xB8,0x22,0x3A,0x84,0x3C,0xB1,0x54, -0x10,0xA9,0x98,0x32,0x80,0x33,0x9A,0xA7,0x4A,0xB4,0x58,0xBC,0x15,0x29,0x8A,0x97, -0x9B,0x44,0xAC,0x80,0x12,0xDE,0x13,0x1B,0xC0,0x58,0xC8,0x11,0x0A,0xA2,0x1A,0xA0, -0x00,0x98,0x0B,0x93,0x9E,0x92,0x0A,0x88,0xBE,0x14,0x1B,0x98,0x08,0xA1,0x4A,0xC1, -0x30,0xD9,0x33,0x98,0x10,0x89,0x17,0x1A,0x82,0x29,0x37,0x0C,0x83,0x50,0x9A,0x24, -0x1A,0x83,0x10,0x23,0x19,0xB3,0x72,0x8A,0x16,0x10,0x0A,0x93,0x70,0x99,0x23,0x99, -0x02,0x20,0x91,0x18,0x02,0x41,0xAB,0x24,0x18,0x81,0x99,0x4A,0xE8,0x28,0x9A,0x99, -0xA1,0x2F,0xA8,0x9D,0x90,0x08,0xCC,0xA3,0x1D,0xCA,0x82,0x0B,0xD8,0x08,0xB9,0x09, -0xBC,0xB8,0x00,0xBE,0x90,0x1B,0xCA,0x00,0x9B,0x8A,0xA8,0x91,0x0F,0xB3,0x3D,0xB8, -0x31,0x0B,0xA5,0x0A,0x11,0xA1,0x48,0x92,0x10,0x50,0x91,0x30,0x23,0x09,0x37,0x39, -0xA2,0x72,0x89,0x92,0x30,0x83,0x1C,0x96,0x28,0xB9,0x24,0x8C,0xA1,0x31,0xAD,0xA9, -0x13,0x9C,0xBA,0xA8,0x0B,0xBF,0xB8,0x9B,0xCA,0x88,0xDB,0xB8,0x19,0xFC,0x92,0x0A, -0xBA,0x89,0xAB,0xB8,0xAB,0xD8,0x08,0xAD,0xBA,0x33,0x9D,0xAA,0x83,0x3A,0xC0,0x40, -0xB9,0x15,0x39,0xA2,0x52,0x89,0x02,0x63,0x88,0x13,0x23,0x03,0x52,0x02,0x54,0x00, -0x11,0x23,0x23,0x35,0x20,0x01,0x44,0x41,0x80,0x24,0x40,0xA9,0x45,0x19,0x81,0x12, -0x81,0x02,0x11,0x21,0x19,0x02,0x61,0x8A,0x13,0x3A,0x10,0x12,0x23,0x8B,0x37,0x18, -0x91,0x24,0x10,0x81,0x34,0x20,0x05,0x32,0x82,0x53,0x20,0x14,0x33,0x31,0x34,0x52, -0x00,0x43,0x32,0x13,0x52,0x22,0x13,0x52,0x11,0x43,0x11,0x32,0x32,0x32,0x22,0x02, -0x13,0x12,0x89,0x22,0x19,0x81,0x81,0x08,0xA8,0x08,0x8B,0x90,0x1B,0xBA,0x8A,0x9B, -0xB9,0x89,0xCA,0xB9,0xAB,0xCA,0x9B,0xCA,0xB9,0xAB,0xDA,0x99,0xAC,0xBB,0x9B,0xAC, -0xAA,0xBA,0xAC,0xAB,0x9A,0xAA,0xAA,0xBA,0xB8,0xA9,0xBA,0x99,0xA9,0x9A,0xA0,0x8A, -0xA9,0x08,0x8A,0xA9,0x00,0x99,0x89,0x88,0x98,0x08,0x99,0x00,0x89,0x80,0x08,0x98, -0x00,0x88,0x88,0x80,0x90,0x80,0x90,0x80,0x81,0x99,0x08,0x88,0x99,0x09,0x00,0x1A, -0xA8,0x10,0x9A,0x88,0x08,0x0A,0x8A,0x89,0x99,0xA8,0x98,0xA9,0x99,0x99,0xA9,0x99, -0xAA,0x8A,0xAA,0x9B,0x8A,0x9A,0xA9,0x9A,0xBA,0x99,0x9A,0xAA,0x99,0x89,0xA9,0x99, -0x98,0x9A,0x98,0x88,0x09,0x89,0x09,0x08,0x08,0x09,0x18,0x18,0x00,0x12,0x00,0x11, -0x11,0x11,0x12,0x12,0x21,0x21,0x22,0x22,0x22,0x22,0x22,0x22,0x32,0x31,0x32,0x31, -0x32,0x32,0x21,0x31,0x21,0x32,0x21,0x12,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - -/* Source: 02SD.ROM */ -/* Length: 640 / 0x00000280 */ - -0x0A,0xDC,0x14,0x0B,0xBA,0xBC,0x01,0x0F,0xF5,0x2F,0x87,0x19,0xC9,0x24,0x1B,0xA1, -0x31,0x99,0x90,0x32,0x32,0xFE,0x83,0x48,0xA8,0xA9,0x23,0x19,0xBC,0x91,0x02,0x41, -0xDE,0x81,0x28,0xA8,0x0A,0xB1,0x72,0xDA,0x23,0xBC,0x04,0x19,0xB8,0x21,0x8A,0x03, -0x29,0xBA,0x14,0x21,0x0B,0xC0,0x43,0x08,0x91,0x50,0x93,0x0F,0x86,0x1A,0x91,0x18, -0x21,0xCB,0x27,0x0A,0xA1,0x42,0x8C,0xA9,0x21,0x10,0x08,0xAB,0x94,0x2A,0xDA,0x02, -0x8B,0x91,0x09,0x98,0xAE,0x80,0xA9,0x02,0x0A,0xE9,0x21,0xBB,0x15,0x20,0xBE,0x92, -0x42,0x09,0xA9,0x11,0x34,0x08,0x12,0x0A,0x27,0x29,0xA1,0x52,0x12,0x8E,0x92,0x28, -0x92,0x2B,0xD1,0x23,0xBF,0x81,0x10,0x99,0xA8,0x0A,0xC4,0x3B,0xB9,0xB0,0x00,0x62, -0xCF,0x92,0x29,0x92,0x2B,0xB1,0x1C,0xB2,0x72,0xAA,0x88,0x11,0x18,0x80,0x13,0x9E, -0x03,0x18,0xB0,0x60,0xA1,0x28,0x88,0x08,0x04,0x10,0x8F,0x96,0x19,0x90,0x01,0x09, -0xC8,0x50,0x91,0x8A,0x01,0xAB,0x03,0x50,0xBA,0x9D,0x93,0x68,0xBA,0x80,0x22,0xCB, -0x41,0xBC,0x92,0x60,0xB9,0x1A,0x95,0x4A,0xC8,0x20,0x88,0x33,0xAC,0x92,0x38,0x83, -0x09,0x80,0x16,0x09,0x29,0xD0,0x54,0x8C,0xA2,0x28,0x91,0x89,0x93,0x60,0xCD,0x85, -0x1B,0xA1,0x49,0x90,0x8A,0x80,0x34,0x0C,0xC9,0x14,0x19,0x98,0xA0,0x40,0xA9,0x21, -0xD9,0x34,0x0A,0xA9,0x10,0x23,0xCB,0x25,0xAA,0x25,0x9B,0x13,0xCD,0x16,0x09,0xA0, -0x80,0x01,0x19,0x90,0x88,0x21,0xAC,0x33,0x8B,0xD8,0x27,0x3B,0xB8,0x81,0x31,0x80, -0xAF,0x97,0x0A,0x82,0x0A,0xA0,0x21,0x89,0x8A,0xA2,0x32,0x8D,0xBB,0x87,0x19,0x21, -0xC9,0xBC,0x45,0x09,0x90,0x09,0xA1,0x24,0x1A,0xD0,0x10,0x08,0x11,0xA9,0x21,0xE8, -0x60,0xA9,0x14,0x0C,0xD1,0x32,0xAB,0x04,0x0C,0x81,0x90,0x29,0x83,0x9B,0x01,0x8F, -0x97,0x0B,0x82,0x18,0x88,0xBA,0x06,0x39,0xC8,0x23,0xBC,0x04,0x09,0x92,0x08,0x1A, -0xBB,0x74,0x8C,0x81,0x18,0x81,0x9D,0x83,0x41,0xCD,0x81,0x40,0x9A,0x90,0x10,0x12, -0x9C,0xA1,0x68,0xD8,0x33,0x9C,0x91,0x01,0x12,0xBE,0x02,0x09,0x12,0x99,0x9A,0x36, -0x0A,0xB0,0x30,0x88,0xA3,0x2D,0x12,0xBC,0x03,0x3A,0x11,0xBD,0x08,0xC8,0x62,0x80, -0x8B,0xD8,0x23,0x38,0xF9,0x12,0x08,0x99,0x91,0x21,0x99,0x85,0x2F,0xB2,0x30,0x90, -0x88,0xD9,0x53,0xAC,0x82,0x19,0x91,0x20,0xCC,0x96,0x29,0xC9,0x24,0x89,0x80,0x99, -0x12,0x08,0x18,0x88,0x99,0x23,0xAB,0x73,0xCB,0x33,0x9F,0x04,0x2B,0xB1,0x08,0x03, -0x1B,0xC9,0x21,0x32,0xFA,0x33,0xDB,0x02,0x33,0xAE,0xB9,0x54,0x8B,0xA1,0x20,0x89, -0x90,0x11,0x88,0x09,0x98,0x23,0xBE,0x37,0x8D,0x81,0x20,0xAA,0x34,0xBB,0x13,0x18, -0xB9,0x40,0xB1,0x18,0x83,0x8E,0xB2,0x72,0xBC,0x82,0x30,0xA9,0x9A,0x24,0x8B,0x27, -0x0E,0x91,0x20,0x90,0x08,0xB0,0x32,0xB9,0x21,0xB0,0xAC,0x45,0x9A,0xA1,0x50,0xA9, -0x80,0x0A,0x26,0x9B,0x11,0xBB,0x23,0x71,0xCB,0x12,0x10,0xB8,0x40,0xA9,0xA5,0x39, -0xC0,0x30,0xB2,0x20,0xAA,0xBA,0x76,0x1C,0xC1,0x48,0x98,0x80,0x18,0x81,0xAA,0x23, -0x9C,0xA2,0x32,0xAC,0x9A,0x43,0x9C,0x12,0xAD,0x82,0x72,0xBC,0x00,0x82,0x39,0xD1, -0x3A,0xB8,0x35,0x9B,0x10,0x40,0xF9,0x22,0x0A,0xC0,0x51,0xB9,0x82,0x18,0x98,0xA3, -0x79,0xD0,0x20,0x88,0x09,0x01,0x99,0x82,0x11,0x38,0xFC,0x33,0x09,0xC8,0x40,0xA9, -0x11,0x29,0xAA,0x94,0x3A,0xC2,0x4A,0xC0,0x89,0x52,0xBC,0x11,0x08,0x09,0xB8,0x71, -0xA9,0x08,0xA8,0x62,0x8D,0x92,0x10,0x00,0x9E,0x94,0x38,0xBA,0x13,0x88,0x90,0x4A, -0xE2,0x30,0xBA,0x02,0x00,0x19,0xD9,0x62,0xBB,0x04,0x0B,0xA3,0x68,0xB9,0x21,0x88, -0x9D,0x04,0x10,0x8C,0xC8,0x62,0x99,0xAA,0x24,0x1A,0x80,0x9A,0x14,0x9B,0x26,0x8C, -0x92,0x30,0xB9,0x09,0xA3,0x71,0xBB,0x10,0x19,0x82,0x39,0xDB,0x02,0x44,0x9F,0x10, - -/* Source: 04TOP.ROM */ -/* Length: 5952 / 0x00001740 */ - -0x07,0xFF,0x7C,0x3C,0x31,0xC6,0xC4,0xBB,0x7F,0x7F,0x7B,0x82,0x8A,0x4D,0x5F,0x7C, -0x3E,0x44,0xD2,0xB3,0xA0,0x19,0x1B,0x6C,0x81,0x28,0xC4,0xA1,0x1C,0x4B,0x18,0x00, -0x2A,0xA2,0x0A,0x7C,0x2A,0x00,0x01,0x89,0x98,0x48,0x8A,0x3C,0x28,0x2A,0x5B,0x3E, -0x3A,0x1A,0x3B,0x3D,0x4B,0x3B,0x4A,0x08,0x2A,0x1A,0x2C,0x4A,0x3B,0x82,0x99,0x3C, -0x5D,0x29,0x2B,0x39,0x0B,0x23,0xAB,0x1A,0x4C,0x79,0xA3,0x01,0xC1,0x2A,0x0A,0x38, -0xA7,0xB9,0x12,0x1F,0x29,0x08,0x82,0xA1,0x08,0xA9,0x42,0xAA,0x95,0xB3,0x90,0x81, -0x09,0xD4,0x1A,0x80,0x1B,0x07,0xB8,0x12,0x8E,0x49,0x81,0x92,0xD3,0x90,0xA1,0x2A, -0x02,0xE1,0xA3,0x99,0x02,0xB3,0x94,0xB3,0xB0,0xF4,0x98,0x93,0x90,0x13,0xE1,0x81, -0x99,0x38,0x91,0xA6,0xD3,0x99,0x94,0xC1,0x83,0xB1,0x92,0x98,0x49,0xC4,0xB2,0xA4, -0xA3,0xD0,0x1A,0x30,0xBA,0x59,0x02,0xD4,0xA0,0xA4,0xA2,0x8A,0x01,0x00,0xB7,0xA8, -0x18,0x2A,0x2B,0x1E,0x23,0xC8,0x1A,0x00,0x39,0xA0,0x18,0x92,0x4F,0x2D,0x5A,0x10, -0x89,0x81,0x2A,0x8B,0x6A,0x02,0x09,0xB3,0x8D,0x48,0x1B,0x80,0x19,0x34,0xF8,0x29, -0x0A,0x7B,0x2A,0x28,0x81,0x0C,0x02,0x1E,0x29,0x09,0x12,0xC2,0x94,0xE1,0x18,0x98, -0x02,0xC4,0x89,0x91,0x1A,0x20,0xA9,0x02,0x1B,0x48,0x8E,0x20,0x88,0x2D,0x08,0x59, -0x1B,0x02,0xA3,0xB1,0x8A,0x1E,0x58,0x80,0xC2,0xB6,0x88,0x91,0x88,0x11,0xA1,0xA3, -0xE2,0x01,0xB0,0x19,0x11,0x09,0xF4,0x88,0x09,0x88,0x19,0x89,0x12,0xF1,0x2A,0x28, -0x8C,0x25,0x99,0xA4,0x98,0x39,0xA1,0x00,0xD0,0x58,0xAA,0x59,0x01,0x0C,0x00,0x2B, -0x00,0x08,0x89,0x6B,0x69,0x90,0x01,0x90,0x98,0x12,0xB3,0xF3,0xA0,0x89,0x02,0x3B, -0x0C,0x50,0xA9,0x4E,0x6B,0x19,0x28,0x09,0xA2,0x08,0x2F,0x20,0x88,0x92,0x8A,0x11, -0xC4,0x93,0xF1,0x18,0x88,0x11,0xF2,0x80,0x92,0xA8,0x02,0xA8,0xB7,0xB3,0xA3,0xA0, -0x88,0x1A,0x40,0xE2,0x91,0x19,0x88,0x18,0x91,0x83,0xC1,0xB5,0x92,0xA9,0xC6,0x90, -0x01,0xC2,0x81,0x98,0x03,0xF0,0x00,0x2C,0x2A,0x92,0x2C,0x83,0x1F,0x3A,0x29,0x00, -0xB8,0x70,0xAB,0x69,0x18,0x89,0x10,0x0D,0x12,0x0B,0x88,0x4A,0x3A,0x9B,0x70,0xA8, -0x28,0x2F,0x2A,0x3A,0x1B,0x85,0x88,0x8B,0x6A,0x29,0x00,0x91,0x91,0x1B,0x7C,0x29, -0x01,0x88,0x90,0x19,0x2B,0x2B,0x00,0x39,0xA8,0x5E,0x21,0x89,0x91,0x09,0x3A,0x6F, -0x2A,0x18,0x18,0x8B,0x50,0x89,0x2B,0x19,0x49,0x88,0x29,0xF5,0x89,0x08,0x09,0x12, -0xAA,0x15,0xB0,0x82,0xAC,0x38,0x00,0x3F,0x81,0x10,0xB0,0x49,0xA2,0x81,0x3A,0xC8, -0x87,0x90,0xC4,0xA3,0x99,0x19,0x83,0xE1,0x84,0xE2,0xA2,0x90,0x80,0x93,0xB5,0xC4, -0xB3,0xA1,0x0A,0x18,0x92,0xC4,0xA0,0x93,0x0C,0x3A,0x18,0x01,0x1E,0x20,0xB1,0x82, -0x8C,0x03,0xB5,0x2E,0x82,0x19,0xB2,0x1B,0x1B,0x6B,0x4C,0x19,0x12,0x8B,0x5A,0x11, -0x0C,0x3A,0x2C,0x18,0x3D,0x08,0x2A,0x5C,0x18,0x00,0x88,0x3D,0x29,0x80,0x2A,0x09, -0x00,0x7A,0x0A,0x10,0x0B,0x69,0x98,0x10,0x81,0x3F,0x00,0x18,0x19,0x91,0xB7,0x9A, -0x28,0x8A,0x48,0x92,0xF3,0xA2,0x88,0x98,0x87,0xA1,0x88,0x80,0x81,0x95,0xD1,0xA3, -0x1B,0x1C,0x39,0x10,0xA1,0x2A,0x0B,0x7A,0x4B,0x80,0x13,0xC1,0xD1,0x2B,0x2A,0x85, -0xB2,0xA2,0x93,0xB2,0xD3,0x80,0xD1,0x18,0x08,0x08,0xB7,0x98,0x81,0x3F,0x01,0x88, -0x01,0xE2,0x00,0x9A,0x59,0x08,0x10,0xC3,0x99,0x84,0xA9,0xA5,0x91,0x91,0x91,0x80, -0xB5,0x94,0xC0,0x01,0x98,0x09,0x84,0xB0,0x80,0x7A,0x08,0x18,0x90,0xA8,0x6A,0x1C, -0x39,0x2A,0xB7,0x98,0x19,0x10,0x2A,0xA1,0x10,0xBD,0x39,0x18,0x2D,0x39,0x3F,0x10, -0x3F,0x01,0x09,0x19,0x0A,0x38,0x8C,0x40,0xB3,0xB4,0x93,0xAD,0x20,0x2B,0xD4,0x81, -0xC3,0xB0,0x39,0xA0,0x23,0xD8,0x04,0xB1,0x9B,0xA7,0x1A,0x92,0x08,0xA5,0x88,0x81, -0xE2,0x01,0xB8,0x01,0x81,0xC1,0xC7,0x90,0x92,0x80,0xA1,0x97,0xA0,0xA2,0x82,0xB8, -0x18,0x00,0x9C,0x78,0x98,0x83,0x0B,0x0B,0x32,0x7D,0x19,0x10,0xA1,0x19,0x09,0x0A, -0x78,0xA8,0x10,0x1B,0x29,0x29,0x1A,0x14,0x2F,0x88,0x4A,0x1B,0x10,0x10,0xAB,0x79, -0x0D,0x49,0x18,0xA0,0x02,0x1F,0x19,0x3A,0x2B,0x11,0x8A,0x88,0x79,0x8A,0x20,0x49, -0x9B,0x58,0x0B,0x28,0x18,0xA9,0x3A,0x7D,0x00,0x29,0x88,0x82,0x3D,0x1A,0x38,0xBA, -0x15,0x09,0xAA,0x51,0x8B,0x83,0x3C,0x8A,0x58,0x1B,0xB5,0x01,0xBB,0x50,0x19,0x99, -0x24,0xCA,0x21,0x1B,0xA2,0x87,0xA8,0xB1,0x68,0xA1,0xA6,0xA2,0xA8,0x29,0x8B,0x24, -0xB4,0xE2,0x92,0x8A,0x00,0x19,0x93,0xB5,0xB4,0xB1,0x81,0xB1,0x03,0x9A,0x82,0xA7, -0x90,0xD6,0xA0,0x80,0x1B,0x29,0x01,0xA4,0xE1,0x18,0x0A,0x2A,0x29,0x92,0xC7,0xA8, -0x81,0x19,0x89,0x30,0x10,0xE0,0x30,0xB8,0x10,0x0C,0x1A,0x79,0x1B,0xA7,0x80,0xA0, -0x00,0x0B,0x28,0x18,0xB1,0x85,0x1E,0x00,0x20,0xA9,0x18,0x18,0x1C,0x13,0xBC,0x15, -0x99,0x2E,0x12,0x00,0xE1,0x00,0x0B,0x3B,0x21,0x90,0x06,0xC9,0x2A,0x49,0x0A,0x18, -0x20,0xD1,0x3C,0x08,0x00,0x83,0xC9,0x41,0x8E,0x18,0x08,0x02,0xA0,0x09,0xA4,0x7B, -0x90,0x19,0x2A,0x10,0x2A,0xA8,0x71,0xBA,0x10,0x4A,0x0E,0x22,0xB2,0xB2,0x1B,0x8C, -0x78,0x1A,0xB5,0x93,0xA9,0x1B,0x49,0x19,0x29,0xA3,0xC6,0x88,0xAA,0x32,0x0D,0x1B, -0x22,0x08,0xC2,0x18,0xB9,0x79,0x3F,0x01,0x10,0xA9,0x84,0x1C,0x09,0x21,0xB0,0xA7, -0x0A,0x99,0x50,0x0C,0x81,0x28,0x8B,0x48,0x2E,0x00,0x08,0x99,0x38,0x5B,0x88,0x14, -0xA9,0x08,0x11,0xAA,0x72,0xC1,0xB3,0x09,0x8A,0x05,0x91,0xF2,0x81,0xA1,0x09,0x02, -0xF2,0x92,0x99,0x1A,0x49,0x80,0xC5,0x90,0x90,0x18,0x09,0x12,0xA1,0xF2,0x81,0x98, -0xC6,0x91,0xA0,0x11,0xA0,0x94,0xB4,0xF2,0x81,0x8B,0x03,0x80,0xD2,0x93,0xA8,0x88, -0x69,0xA0,0x03,0xB8,0x88,0x32,0xBC,0x97,0x80,0xB1,0x3B,0x1A,0xA6,0x00,0xD1,0x01, -0x0B,0x3B,0x30,0x9B,0x31,0x3E,0x92,0x19,0x8A,0xD3,0x5C,0x1B,0x41,0xA0,0x93,0xA2, -0xAF,0x39,0x4C,0x01,0x92,0xA8,0x81,0x3C,0x0D,0x78,0x98,0x00,0x19,0x0A,0x20,0x2D, -0x29,0x3C,0x1B,0x48,0x88,0x99,0x7A,0x2D,0x29,0x2A,0x82,0x80,0xA8,0x49,0x3E,0x19, -0x11,0x98,0x82,0x9A,0x3B,0x28,0x2F,0x20,0x4C,0x90,0x29,0x19,0x9A,0x7A,0x29,0x28, -0x98,0x88,0x33,0xCD,0x11,0x3A,0xC1,0xA4,0xA0,0xC4,0x82,0xC8,0x50,0x98,0xB2,0x21, -0xC0,0xB6,0x98,0x82,0x80,0x9C,0x23,0x00,0xF8,0x30,0xA8,0x1A,0x68,0xA8,0x86,0x9A, -0x01,0x2A,0x0A,0x97,0x91,0xC1,0x18,0x89,0x02,0x83,0xE0,0x01,0x8B,0x29,0x30,0xE2, -0x91,0x0B,0x18,0x3B,0x1C,0x11,0x28,0xAC,0x78,0x80,0x93,0x91,0xA9,0x49,0x8B,0x87, -0x90,0x99,0x3D,0x5A,0x81,0x08,0xA1,0x11,0x2F,0x1A,0x21,0x9B,0x15,0xA2,0xB0,0x11, -0xC0,0x91,0x5B,0x98,0x24,0xA2,0xF2,0x92,0x8B,0x6A,0x18,0x81,0xB5,0xB1,0x88,0x4C, -0x00,0x00,0xA4,0xC1,0x2B,0x1A,0x59,0x0A,0x02,0x80,0x1E,0x02,0x08,0xB3,0x80,0x9A, -0x23,0xB8,0xF2,0x84,0xAB,0x01,0x48,0x90,0xA7,0x90,0x0A,0x29,0x09,0x95,0x99,0xA0, -0x59,0x2B,0x00,0x97,0xB0,0x29,0x89,0x2A,0x03,0xD0,0xB7,0x1B,0x81,0x00,0xA6,0xB1, -0x90,0x09,0x48,0xC0,0x11,0x00,0x8A,0x00,0x5B,0x83,0x9A,0x18,0x2F,0x3C,0x18,0x11, -0xA9,0x04,0x1A,0x4F,0x01,0x98,0x81,0x09,0x09,0x4A,0x18,0xB4,0xA2,0x0B,0x59,0x90, -0x3B,0x49,0xBC,0x40,0x6A,0x88,0x3A,0x08,0x3E,0x3A,0x80,0x93,0xB0,0xE1,0x5A,0x00, -0xA4,0xB3,0xE3,0x90,0x0D,0x38,0x09,0x82,0xC4,0xA1,0xB1,0x4C,0x18,0x10,0x91,0xB2, -0x13,0xEA,0x34,0x99,0x88,0xA6,0x89,0x92,0x91,0xC1,0x20,0xB2,0xC2,0x86,0xD2,0xB3, -0x80,0xB2,0x08,0x09,0x87,0x91,0xC0,0x11,0x89,0x90,0x28,0xB9,0x79,0x19,0xA4,0x82, -0xD0,0x03,0x0C,0xA3,0xA5,0xB2,0xB2,0x1B,0x29,0x13,0xF1,0xB4,0x81,0x9D,0x38,0x00, -0xC4,0xA1,0x89,0x59,0x1A,0x81,0xA4,0xA9,0x1C,0x6A,0x19,0x02,0xB1,0x1A,0x4A,0x0B, -0x78,0x89,0x81,0x1C,0x2A,0x29,0x4A,0xA3,0x3E,0x1C,0x49,0x1A,0x08,0x21,0xAE,0x28, -0x4B,0x19,0x20,0x8C,0x10,0x3A,0xAB,0x26,0x8B,0x18,0x59,0x99,0x13,0xA2,0xAB,0x79, -0x2F,0x18,0x10,0xB2,0x80,0x1B,0x4D,0x5A,0x80,0x82,0x98,0x81,0x80,0x09,0xA5,0x90, -0x91,0x03,0xC2,0xE2,0x81,0xA8,0x82,0x09,0xC6,0xA3,0xB1,0x08,0x5B,0x08,0x05,0xD1, -0xA2,0x89,0x2A,0x28,0x91,0xA6,0x88,0xB0,0x49,0x80,0x09,0x08,0x88,0x07,0xB8,0x05, -0x99,0x81,0x88,0x18,0xE2,0x00,0xC3,0x18,0x0D,0x10,0x30,0xD0,0x93,0x8A,0x09,0x10, -0x2F,0x11,0x90,0xA1,0x20,0x9B,0xB1,0x73,0xC8,0x94,0x98,0x3B,0x01,0x0C,0x30,0x19, -0xF8,0x12,0x90,0xBA,0x78,0x0A,0x11,0x98,0xA0,0x79,0x8A,0x30,0x2B,0xC2,0x11,0x0D, -0x09,0x7A,0x00,0x82,0xB9,0x01,0x7A,0x89,0x21,0x09,0xA1,0x0A,0x7C,0x10,0x88,0xB5, -0x88,0x0A,0x2B,0x69,0x1A,0x10,0xA0,0x5B,0x19,0x1A,0x10,0x19,0x1A,0x6C,0x20,0x90, -0xA5,0x98,0x1B,0x0A,0x69,0x82,0xD1,0x18,0x09,0x19,0x2A,0x93,0xD4,0x9A,0x01,0x49, -0xA2,0xA2,0x82,0xD8,0x22,0xAA,0x97,0xA9,0x2D,0x38,0x2A,0xB6,0x80,0x90,0x0A,0x3C, -0x82,0x94,0xB8,0x21,0x0E,0x2A,0x22,0xB8,0x00,0x4F,0x2B,0x3A,0x81,0xA1,0x29,0x2C, -0x6A,0x13,0xD1,0xA2,0x98,0x28,0x0C,0x01,0xD5,0x08,0xA9,0x31,0xB3,0xB0,0xA7,0xB0, -0x29,0x1B,0x87,0xA2,0xA1,0xB2,0x4A,0x89,0x11,0xC3,0xF3,0x98,0x08,0x03,0xA0,0xA3, -0xC5,0x90,0xB3,0xB5,0xB4,0xB8,0x02,0x91,0x91,0xD3,0xA4,0xC1,0x1B,0x82,0x28,0xA4, -0xD1,0x94,0x8A,0x28,0x08,0x03,0xE0,0x80,0xD4,0x90,0x91,0xA1,0x3B,0x3D,0x02,0xE4, -0xA1,0x92,0x89,0x1A,0x4B,0x95,0xB3,0x90,0x99,0x6A,0x0A,0x30,0xA1,0x93,0xA6,0xA9, -0x85,0x8B,0x82,0x10,0xB1,0xA3,0x94,0xF8,0x38,0x9A,0x30,0x1A,0x8B,0xA7,0x89,0x01, -0x5B,0x19,0x18,0x11,0xF0,0x18,0x1C,0x39,0x19,0x0C,0x12,0x1C,0x2A,0x7B,0x3A,0x88, -0x2B,0x18,0x2B,0x5C,0x20,0x92,0x8D,0x38,0x8A,0x3A,0x5B,0x2E,0x3A,0x2B,0x10,0x12, -0xBB,0x6A,0x4D,0x18,0x10,0xB1,0x81,0x2A,0x8B,0x79,0x80,0x01,0x0A,0x09,0x5B,0x2D, -0x84,0x8A,0x08,0x02,0xA2,0x91,0x82,0xE8,0x50,0x9B,0x85,0xA3,0xB0,0xA3,0x1B,0x02, -0x18,0xF3,0xA2,0x88,0xAB,0x53,0xD1,0xB4,0xA3,0x09,0x09,0x18,0xD4,0x08,0xB0,0x09, -0x58,0xD1,0x82,0x89,0x81,0x1A,0x18,0x05,0xB9,0xC3,0x30,0xC0,0x95,0x80,0xC3,0x89, -0x89,0x13,0x88,0xF2,0x93,0x0E,0x18,0x01,0x92,0xA5,0xB8,0x2A,0x39,0xAA,0x33,0x9A, -0xB1,0x11,0xF5,0xA1,0xA1,0x0A,0x50,0xB8,0x03,0xC4,0xA0,0x4E,0x29,0x10,0x88,0xC2, -0x1A,0x39,0x1D,0x28,0x98,0x94,0x0E,0x10,0x2A,0x3C,0x02,0x2D,0x1B,0x4B,0x3B,0x49, -0x19,0xA9,0x48,0x2F,0x29,0x10,0x89,0x02,0x0C,0x10,0x09,0xB9,0x70,0x1B,0x8A,0x50, -0xA8,0x2B,0x49,0x89,0x69,0x88,0x95,0x89,0x90,0x92,0x4C,0x19,0x82,0xC1,0x01,0x80, -0xA0,0x2B,0x7A,0x81,0x10,0xC2,0xB7,0x98,0x88,0x19,0x2C,0x03,0xB1,0xA4,0xA1,0x0C, -0x3B,0x78,0x88,0x85,0xB1,0xA0,0x1B,0x3A,0x4A,0x08,0x94,0x81,0xF1,0x80,0x00,0x0C, -0x59,0x09,0x18,0x90,0xA6,0x92,0x8C,0x1A,0x79,0x92,0xA8,0x00,0x81,0x2E,0x2A,0x13, -0xA2,0xB0,0xA5,0x88,0x88,0x89,0x11,0x19,0xA0,0xF3,0x82,0xB0,0x83,0x5F,0x2A,0x01, -0xA1,0x94,0xB0,0x09,0x78,0x98,0xA3,0xA6,0xA0,0x91,0x80,0x93,0x98,0xC1,0x12,0x18, -0xC9,0x17,0xA0,0xA0,0x1A,0x21,0x80,0x99,0xD4,0x30,0x9D,0x00,0x10,0x2F,0x08,0x1C, -0x21,0x08,0xB4,0xC3,0x2B,0xA9,0x52,0xD2,0xA3,0xD1,0x09,0x10,0x8B,0x24,0x92,0xD1, -0x80,0x19,0xA0,0x2C,0x12,0x49,0xAA,0xB6,0x95,0xB8,0x08,0x3A,0x2B,0x01,0xF3,0xB3, -0x0B,0x09,0x79,0x18,0xA2,0xA4,0xA0,0x18,0x0C,0x20,0x08,0xA9,0x16,0x0C,0x00,0x1B, -0x08,0x2B,0x7B,0x01,0x01,0xB9,0x59,0x19,0x8B,0x45,0xA8,0x80,0x0C,0x1A,0x41,0x1E, -0x00,0x28,0xA8,0x5A,0x00,0xC1,0x49,0x99,0x21,0x1D,0x08,0x85,0x99,0x95,0x89,0x90, -0x11,0x90,0xD1,0x28,0xB2,0xA7,0x99,0x81,0x02,0xAC,0x13,0x81,0xB2,0xA6,0xA9,0x28, -0x1C,0xB1,0x33,0xD1,0xC1,0x58,0xA8,0x14,0xB0,0xB7,0x91,0xA0,0x82,0x89,0xC2,0x28, -0xA1,0xB2,0x49,0xD2,0x94,0xC8,0x12,0x80,0x99,0x85,0x08,0xD3,0x09,0xA2,0xB3,0x1E, -0x08,0x21,0xB9,0x23,0xB4,0xAB,0x41,0xAC,0x87,0x09,0xA2,0xC5,0x0B,0x2A,0x5A,0x91, -0x20,0x9A,0x89,0x78,0x9B,0x31,0x89,0x80,0x29,0x0A,0xB7,0x3C,0x98,0x48,0x1D,0x00, -0x01,0xB0,0x20,0x2F,0x29,0x4A,0x89,0x94,0x1C,0x88,0x28,0x2B,0x10,0x88,0x9A,0x71, -0x9A,0x08,0x4A,0x2F,0x18,0x2B,0x18,0x02,0xA8,0x4B,0x7A,0x99,0x48,0x80,0xA8,0x20, -0x1D,0x40,0xA8,0x10,0x08,0xA8,0xC5,0x88,0xC2,0x18,0x88,0x2A,0x12,0xF3,0x82,0xD8, -0x20,0x0A,0x09,0xA6,0x98,0x04,0xB9,0x11,0x18,0xC3,0xE1,0x29,0xA1,0x11,0xC1,0x03, -0xE2,0x9A,0x33,0xA9,0xB5,0x98,0x92,0xA1,0x02,0xF8,0x21,0xA8,0x10,0x02,0xC1,0xB7, -0x1B,0x90,0x5B,0x3C,0x83,0x93,0xE0,0x19,0x1A,0x11,0x11,0xF1,0x92,0x89,0x19,0x2C, -0x2C,0x41,0x99,0x92,0x90,0x3F,0x18,0x4B,0x00,0x08,0xD2,0x01,0xB2,0xAA,0x78,0x09, -0x01,0x91,0xA2,0x98,0x2F,0x3A,0x2C,0x01,0x00,0x93,0xE0,0x28,0x2C,0x2B,0x01,0x12, -0xE1,0x80,0xB3,0x3D,0x3A,0x0A,0x50,0x98,0xC2,0xA0,0x11,0xAA,0x30,0x87,0x90,0xC2, -0x29,0x88,0x38,0xC8,0xB5,0x90,0xBA,0x70,0x1A,0x02,0x94,0xD0,0x80,0x1A,0x82,0xA6, -0xB0,0x91,0x18,0xB3,0x00,0x13,0xF1,0xA2,0xC1,0x82,0xB0,0x00,0x15,0x0B,0xD3,0x02, -0xA8,0x91,0x2B,0x1F,0x49,0x88,0xA6,0x80,0x88,0x08,0x1B,0xA5,0x80,0xB9,0x06,0x0B, -0x90,0x21,0x9D,0x48,0x18,0xA0,0x15,0xC9,0x82,0x2B,0x1A,0x42,0x9A,0xC4,0x39,0xBC, -0x69,0x00,0xA0,0x29,0x8C,0x39,0x59,0x08,0x09,0x49,0xA9,0x6B,0x81,0x00,0x98,0xB0, -0x68,0x3D,0x81,0x88,0x18,0x19,0x1D,0x12,0x80,0xB2,0x3A,0x3F,0x85,0x92,0xD0,0x00, -0x0A,0x19,0x12,0xF1,0x02,0x9B,0x19,0x40,0xB9,0x11,0x02,0xF2,0x1A,0x08,0x94,0x0A, -0xC2,0x83,0x0B,0xB4,0xA4,0xC0,0x32,0xD8,0x86,0x98,0x90,0x95,0x89,0xA3,0x83,0xC2, -0x92,0xE1,0x92,0x82,0xD9,0x03,0x08,0xA9,0x85,0x92,0xA2,0x80,0xE0,0x30,0x8B,0xB3, -0x87,0x89,0x90,0x83,0xA0,0x08,0x92,0x93,0x3E,0xAB,0x43,0x89,0xE3,0x80,0x83,0x2F, -0x00,0xA3,0x80,0xC9,0x22,0x3F,0x08,0x81,0x0B,0x33,0x9A,0xA3,0x7B,0x0C,0x29,0x4A, -0x1B,0x21,0xAA,0x70,0x1B,0x0D,0x48,0x1A,0x81,0x88,0xB1,0x39,0x3F,0x08,0x58,0xA0, -0x81,0x1A,0x1A,0x2B,0x6D,0x11,0x0A,0x91,0x01,0x1A,0x98,0x5A,0x0C,0x03,0xB1,0x84, -0xA3,0xAD,0x58,0x2A,0xA1,0x84,0xB1,0xA0,0x5C,0x2B,0x13,0xA8,0x95,0x83,0xE8,0x10, -0x81,0xB0,0x00,0xC2,0x96,0xA0,0x91,0x00,0x2C,0x90,0x30,0xF2,0x80,0xA8,0x39,0x21, -0xC1,0x03,0xAC,0x39,0x7C,0x29,0x91,0x1A,0x00,0x19,0x2C,0x3A,0x93,0xB0,0x29,0x8F, -0x28,0x02,0x93,0xF3,0xA9,0x01,0x03,0xE0,0x08,0x09,0x1D,0x58,0xA1,0x83,0xA9,0x6B, -0x2A,0x3C,0x21,0x89,0xC2,0x2C,0x4B,0x8A,0x50,0x81,0x98,0xA8,0x32,0x0C,0x8E,0x24, -0x0B,0x1A,0x81,0x92,0xA1,0x4F,0x18,0x3A,0x0A,0xB4,0x18,0x2E,0x39,0x82,0x19,0xD3, -0xD0,0x28,0x1B,0x11,0x98,0x07,0xAA,0x28,0x00,0x88,0xB4,0x89,0x1B,0x1F,0x22,0x00, -0xB3,0xC9,0x33,0xAB,0x2B,0xB5,0x48,0x98,0x98,0xA7,0x10,0xD2,0xC1,0x23,0xCA,0x93, -0xC6,0x80,0xA1,0x88,0x02,0x89,0xE2,0x09,0x38,0xBA,0x40,0x89,0x21,0xD8,0x49,0x10, -0x8D,0x02,0x90,0xC3,0x9A,0x24,0x89,0x08,0x84,0xA5,0x9C,0x10,0x11,0x9C,0x88,0x30, -0x3C,0xA1,0x94,0x58,0x8C,0x0B,0x69,0x29,0x9A,0x81,0x12,0x2B,0x8B,0x79,0x94,0xB0, -0xC1,0x84,0xC2,0x99,0x25,0x99,0x11,0xA2,0x93,0xE4,0x99,0x80,0x0A,0x00,0x10,0xB7, -0xB0,0x31,0xBA,0x3C,0x21,0xB3,0xF1,0x18,0xA0,0x2A,0x20,0xA3,0x06,0xE8,0x28,0xA1, -0xB4,0x08,0x0B,0x11,0x4B,0xB7,0x90,0xA5,0x98,0x3D,0x19,0x02,0xA1,0xC4,0xB2,0x19, -0x28,0xC0,0xA5,0x92,0xB1,0xA3,0x0A,0x0A,0x08,0x2B,0x70,0xC4,0xB3,0x00,0xBC,0x4B, -0x39,0x12,0xE3,0xA0,0x00,0x3F,0x18,0x29,0x94,0xD1,0x19,0x09,0x00,0xA1,0x83,0x99, -0x9B,0x35,0x80,0xC4,0xB1,0x6A,0x1A,0x1C,0x29,0x38,0x0E,0x19,0x5A,0x1A,0x82,0x8A, -0x59,0x2A,0x2E,0x20,0x88,0xA8,0x3A,0x38,0x3D,0x00,0xB3,0x29,0xAD,0x49,0x10,0x0C, -0x01,0x01,0xA3,0x8F,0x85,0x09,0x1B,0x88,0x10,0xA3,0xD2,0x90,0x3C,0x5C,0x39,0x03, -0xD1,0xA0,0x00,0x2A,0x0B,0x04,0xA7,0x90,0xA0,0x11,0x90,0x99,0x83,0xB4,0xB1,0xF1, -0x84,0x88,0x90,0x18,0x18,0xD3,0xD2,0xB3,0xA0,0x1A,0x21,0xA7,0xB2,0xB3,0x92,0x9A, -0x22,0xB9,0x28,0x38,0xBD,0x87,0x2A,0xB1,0x13,0x0D,0x0A,0x38,0xC9,0x24,0xC0,0x19, -0x23,0x0F,0x01,0x88,0xC0,0x2A,0x82,0x18,0x28,0xF0,0x18,0x2A,0x29,0x4B,0x35,0xB8, -0xA3,0x9D,0x18,0x1B,0x40,0x00,0x9A,0x5C,0x3A,0x09,0x2F,0x38,0x8A,0x3B,0x3B,0x11, -0x5C,0x19,0x2B,0x4A,0x08,0x0A,0x3D,0x20,0x4F,0x3A,0x19,0x2A,0x18,0x4D,0x1B,0x3A, -0x11,0x0D,0x3A,0x3C,0x4B,0x93,0x81,0xAA,0x6B,0x4A,0x18,0x00,0xC3,0xC3,0x9A,0x59, -0x2A,0x1B,0xA7,0xA1,0x81,0x88,0x88,0x58,0xB2,0xB1,0x2B,0x83,0xD4,0x81,0x08,0x0F, -0x00,0x20,0xC2,0xE2,0x80,0x08,0x1C,0x29,0x04,0xB1,0xA2,0x01,0x1C,0x91,0x00,0x0C, -0x49,0xB0,0x43,0xF2,0x99,0x39,0x3F,0x00,0x81,0x94,0xC1,0x09,0x1A,0x69,0x90,0x80, -0x94,0xAA,0x20,0x2A,0x91,0xB1,0x39,0x7A,0x38,0xD1,0x10,0x8A,0x8C,0x5A,0x01,0xB5, -0x98,0x80,0x2A,0x0B,0x32,0x92,0xF1,0x81,0x9A,0x23,0x8A,0xA3,0xB7,0x09,0x03,0x08, -0xD0,0x94,0x9A,0x09,0x01,0x93,0xB7,0xC2,0x8C,0x3A,0x83,0x99,0x05,0xA0,0x0B,0x29, -0x93,0xE5,0x80,0x89,0x38,0x90,0x8A,0xD7,0xA1,0x19,0x1B,0x48,0x98,0x92,0xC3,0xA1, -0x09,0x3F,0x02,0x0C,0x22,0xC3,0xB2,0xA1,0x01,0x9F,0x4A,0x01,0xA3,0xD3,0xB0,0x28, -0x3F,0x29,0x20,0xA2,0xC2,0xB1,0x08,0x5A,0x98,0x13,0xD2,0xC1,0x01,0xB2,0x80,0x3D, -0x03,0xC1,0x89,0x96,0x90,0x90,0x3A,0x1A,0x9A,0x32,0xB6,0xA2,0x8E,0x4A,0x28,0x8A, -0x84,0xA2,0x8A,0x2D,0x49,0x09,0x88,0x18,0x30,0x9D,0x2C,0x23,0xB1,0x0C,0x92,0x2D, -0x39,0x82,0xC4,0x2E,0x10,0x1A,0x10,0xB9,0x48,0x19,0x39,0xBA,0x34,0xDA,0x2D,0x48, -0x1A,0xA6,0x98,0x83,0x9A,0x1D,0x38,0x04,0xD0,0x18,0x90,0x2C,0x11,0x93,0xD3,0x9A, -0x11,0x08,0x82,0xF1,0x01,0xA0,0x2A,0x93,0xD3,0xB4,0xB8,0x82,0x2F,0x11,0xA3,0xB3, -0xA8,0x3B,0x09,0x23,0x96,0xC8,0x3B,0x3F,0x93,0x82,0xA1,0x90,0x3F,0x28,0x81,0xD1, -0x93,0x08,0x2D,0x18,0x91,0xB3,0xB5,0x98,0x2A,0x2B,0x84,0xB1,0x5B,0x8A,0x31,0x18, -0x80,0x8B,0x7E,0x39,0x2B,0x02,0xC1,0x8B,0x6C,0x49,0x09,0x10,0xA1,0x08,0x01,0x0C, -0x20,0xA1,0x09,0x4F,0x18,0x00,0x01,0xA0,0x5C,0x1B,0x5B,0x10,0x92,0x90,0x2B,0x5A, -0x3D,0x18,0x91,0x19,0x98,0x2D,0x39,0x89,0x2D,0x3A,0x48,0x2C,0x11,0xB5,0x9A,0x19, -0x5B,0x28,0x90,0x95,0x98,0x89,0x2B,0x40,0x08,0x90,0xF3,0x0A,0x08,0xA6,0x80,0x91, -0xB2,0xA0,0x02,0xF2,0xA1,0xB7,0x89,0x81,0x82,0x91,0xB1,0x21,0xAB,0x32,0xE9,0x04, -0xA2,0x8D,0x12,0x91,0xA3,0xA3,0xD2,0x8B,0x39,0xD1,0x84,0xE2,0x90,0x00,0x2B,0x29, -0xA3,0xD4,0xA1,0x91,0x1D,0x5A,0x08,0x19,0x11,0x99,0x08,0x18,0x49,0x0F,0x18,0x10, -0x82,0xF1,0x00,0x89,0x2F,0x3A,0x01,0xB3,0xC2,0x81,0x3F,0x29,0x08,0x10,0xA1,0xA1, -0x3B,0x5D,0x19,0x28,0x0B,0x38,0x82,0x91,0x19,0xBD,0x3B,0x7A,0x80,0x12,0xB3,0xE0, -0x0B,0x6A,0x01,0x88,0xA4,0x08,0x0B,0x08,0x59,0x80,0x80,0x1D,0x49,0x89,0x00,0x84, -0x99,0x1A,0x2B,0x32,0xE3,0xB4,0xA9,0x3A,0x99,0x31,0xE3,0xAA,0x58,0x3B,0x88,0x95, -0xC0,0x18,0x4A,0x09,0x30,0xF2,0xA3,0x1C,0x1B,0x49,0x00,0xD3,0xB2,0xA0,0x18,0x11, -0x92,0xD3,0xB2,0x91,0x80,0xE7,0xA1,0x91,0x98,0x19,0x22,0xC2,0xD2,0x18,0x8D,0x3B, -0x10,0xA5,0x91,0x98,0x02,0x3E,0x80,0x01,0x90,0xAA,0x13,0xF1,0x02,0xD1,0x08,0x19, -0x49,0xB4,0x91,0xB4,0x99,0x2A,0x0C,0x32,0xC0,0x05,0x88,0x0B,0x80,0x2C,0x81,0x10, -0x0B,0x51,0xA9,0x19,0x05,0xBF,0x28,0x20,0xE1,0x90,0x80,0x28,0x19,0x08,0x26,0xB1, -0xA1,0x18,0x88,0x2A,0xF0,0x12,0x8A,0xB3,0x14,0x1B,0xD4,0xD8,0x10,0x08,0x8A,0x17, -0xA0,0x98,0x2B,0x3A,0x29,0x48,0xA4,0x99,0x0E,0x4A,0x12,0x8B,0x31,0x8B,0x4E,0x1A, -0x11,0xB5,0x89,0x91,0x29,0x89,0xC2,0x97,0x90,0x0A,0x19,0x11,0x91,0xC1,0xD5,0x08, -0x89,0x20,0x91,0xB1,0x1A,0x2D,0x18,0x29,0xD2,0x3B,0x3E,0x3A,0x2A,0x90,0x82,0x1C, -0x49,0x3B,0x93,0xB6,0xC8,0x4C,0x02,0x91,0x93,0xF2,0x88,0x2D,0x28,0x81,0x82,0xC1, -0x89,0x2D,0x6B,0x19,0x82,0x80,0x18,0x8B,0x39,0x39,0xC8,0x3A,0x6A,0x0A,0x22,0xD2, -0x09,0x2C,0x1A,0x68,0x92,0xE2,0x89,0x2A,0x2A,0x30,0xC2,0xA3,0xB4,0x1D,0x2A,0x09, -0x93,0x18,0xF2,0x89,0x28,0xB3,0x01,0x8F,0x18,0x11,0xA1,0x93,0x90,0xD1,0x7A,0x20, -0xC3,0xA2,0xA8,0x88,0x1D,0x28,0xA5,0xA2,0xA2,0x0B,0x29,0x2B,0x87,0xC1,0x80,0x0A, -0x19,0x01,0x12,0xF1,0x10,0x80,0x0A,0x18,0x08,0x2F,0x4A,0x02,0x89,0x1B,0x29,0x5D, -0x4C,0x08,0x82,0xA1,0x0A,0x3A,0x4B,0x29,0xC6,0xC3,0x09,0x09,0x88,0x39,0x98,0x82, -0xA5,0x1A,0x30,0x11,0xBD,0x3F,0x12,0x8B,0x28,0xC3,0x88,0x3F,0x2B,0x3B,0x48,0xA1, -0x80,0x8A,0x4D,0x39,0x01,0x93,0xA2,0xF1,0x19,0x19,0x0A,0x02,0xB2,0x8B,0x24,0xD2, -0x4B,0x12,0xC8,0x2E,0x10,0xB5,0x89,0x01,0x09,0x1C,0x2A,0x03,0xD4,0x91,0x98,0x99, -0x11,0x2B,0xE4,0x00,0x00,0x01,0xE0,0xA5,0x89,0x99,0x31,0x18,0xD0,0xB7,0x98,0x18, -0x0A,0x10,0x94,0xC2,0x90,0x18,0x00,0x99,0x87,0xA0,0x90,0x2A,0x3C,0x02,0xB8,0xC1, -0x79,0x1A,0x20,0x08,0xA1,0xD2,0x1C,0x29,0x03,0xD1,0x29,0x99,0x2C,0x50,0xB3,0xD1, -0x08,0x09,0x3C,0x10,0x04,0xB2,0x0D,0x2B,0x59,0x80,0x90,0x01,0x0F,0x3A,0x18,0x01, -0xA2,0x9B,0x5B,0x3D,0x81,0x03,0xD2,0x98,0x59,0x90,0x81,0x92,0xB4,0x8B,0x1B,0x40, -0xB2,0xB5,0x08,0x4B,0x01,0x09,0xD1,0x91,0x8B,0x7A,0x10,0xB3,0xC3,0x99,0x49,0x1A, -0x29,0xB5,0xA2,0xAB,0x40,0x81,0x19,0xB7,0xB0,0x20,0x2B,0xD4,0x88,0xA1,0x91,0x3C, -0x82,0x37,0xD3,0xB1,0x8A,0x1B,0x30,0xB3,0xF4,0xA1,0x91,0x09,0x10,0x03,0xD0,0x83, -0xA9,0x8F,0x10,0x01,0x90,0x18,0x80,0x20,0x2B,0xF1,0x28,0x99,0x2A,0x41,0xF0,0x12, -0xAA,0x83,0x82,0xD1,0xC1,0x08,0x89,0x59,0x09,0x83,0x87,0xB0,0x2A,0x4D,0x18,0x09, -0x19,0xB3,0x4B,0x3F,0x39,0x19,0x09,0x01,0x89,0x03,0x1F,0x00,0x1A,0x0B,0x10,0x68, -0xA0,0x18,0x8C,0x6A,0x09,0x08,0x97,0xA1,0x81,0x1B,0x2B,0x4C,0x03,0xB4,0xA8,0x92, -0x4B,0x3C,0xA1,0x81,0x95,0xA8,0x81,0x12,0xBB,0x92,0x45,0xB9,0x93,0xF4,0x88,0x0A, -0x2D,0x28,0x00,0xA3,0xA3,0x8A,0x3F,0x48,0xB1,0x92,0xB4,0xA8,0x30,0x80,0xD3,0x80, -0xD1,0x19,0x3B,0xC4,0x81,0xC1,0x29,0x0D,0x20,0x13,0xC8,0xB4,0x4C,0x09,0x00,0x82, -0xC2,0x3B,0x0D,0x30,0x0B,0x12,0xF0,0x1B,0x20,0x0A,0xA6,0x80,0x0A,0x4A,0x4A,0x80, -0x94,0xB1,0x2E,0x3B,0x1A,0x10,0x93,0x10,0x4C,0x3D,0x08,0x82,0xC9,0x19,0x6A,0x2B, -0x38,0xD1,0x08,0x19,0x2A,0x5A,0x82,0xB1,0x8D,0x29,0x78,0x09,0x82,0x0A,0x2C,0x1B, -0x19,0x41,0xB8,0x8C,0x79,0x2B,0x11,0x88,0x82,0x91,0xDC,0x28,0x11,0xB0,0x11,0x18, -0xC9,0x62,0xA1,0x91,0x98,0x3B,0x3A,0xB0,0xF4,0x01,0xC0,0x29,0x39,0xF8,0x95,0x91, -0x88,0x88,0x91,0x03,0xA1,0xE2,0x18,0x82,0xD1,0xA2,0xD1,0x80,0x19,0x20,0x83,0xB1, -0xE3,0x80,0x91,0x4D,0x1A,0x03,0xB2,0x09,0x18,0xD1,0x19,0x09,0x92,0xA6,0xA0,0xB6, -0xB2,0x8B,0x38,0x10,0x42,0xD3,0xD0,0xA8,0x20,0x2C,0x10,0x01,0xB1,0xB4,0xAB,0x5B, -0x79,0x80,0x10,0x1A,0xA8,0x3D,0x18,0x20,0xB3,0x8F,0x18,0x01,0x00,0x09,0xF3,0x89, -0x69,0x88,0x81,0x91,0x08,0xE1,0x1A,0x08,0x11,0x81,0x1E,0x29,0xA0,0x01,0x00,0x90, -0x3E,0x7B,0x18,0x82,0xC3,0xA1,0x2A,0x2C,0x5B,0x81,0xA5,0x90,0x81,0x00,0x0B,0x1A, -0x1C,0x2C,0x32,0xC0,0xF3,0x80,0x2D,0x2A,0x10,0x02,0xE4,0xC1,0x89,0x4A,0x09,0x01, -0x03,0xD2,0x98,0x2A,0x39,0x8A,0x89,0x26,0xB1,0xB2,0x12,0xC0,0x0A,0x5A,0x18,0x98, -0xF3,0x92,0x99,0x99,0x79,0x01,0xB5,0xA1,0x80,0x80,0x90,0x83,0xA0,0xE2,0x81,0x29, -0x93,0x8A,0x0A,0x6A,0x1F,0x18,0x02,0xC8,0x01,0x19,0x3B,0x4A,0x98,0x17,0xA8,0x0D, -0x38,0xA1,0x91,0x10,0xA2,0x2B,0x4C,0xA6,0x81,0xBA,0x21,0x4C,0x80,0x21,0xD1,0x92, -0x2C,0x08,0x30,0x9F,0x93,0x2A,0x89,0x03,0x8B,0x87,0x0A,0x0D,0x12,0x98,0xA4,0x93, -0xBB,0x59,0x18,0xA1,0x32,0xE9,0x84,0x08,0x8A,0x02,0xA1,0x91,0x4B,0xB4,0x20,0x88, -0xF0,0x3A,0x1A,0x88,0x87,0xB1,0x92,0x0A,0x08,0x6B,0x83,0xC3,0x91,0xC0,0x2B,0x79, -0x08,0x8A,0x84,0xA0,0x89,0x40,0x1B,0xA1,0x39,0x98,0x17,0xC2,0xA2,0x12,0xCD,0x20, -0x89,0x92,0x25,0xB0,0x2D,0x3A,0x8B,0x58,0x2A,0xA0,0x4C,0x08,0x30,0xAE,0x82,0x59, -0x89,0x1A,0x10,0xC2,0x18,0x2C,0x40,0x1E,0x01,0xA3,0x8A,0x81,0x2C,0x29,0x29,0xA9, -0x13,0x51,0xAD,0x12,0x89,0x8F,0x18,0x2C,0x39,0x00,0xC1,0x10,0x3C,0x2A,0x41,0xC8, -0xA2,0x91,0x0A,0x6C,0x10,0x12,0x88,0xE8,0x30,0x91,0x81,0xD8,0x01,0x1B,0x0D,0x07, -0x00,0xA8,0x92,0x0A,0x28,0xD2,0xC3,0x02,0xAA,0x94,0x81,0xB4,0xB3,0x1A,0x0B,0x13, -0xF9,0x16,0xA1,0x8A,0x59,0x19,0x02,0xC1,0x91,0x8B,0x3D,0x18,0x3B,0xA4,0x94,0x80, -0x99,0x88,0x1C,0x79,0x0A,0x02,0x03,0xF8,0x90,0x39,0x5B,0x19,0x02,0xC3,0x90,0xBB, -0x58,0x6A,0x09,0x02,0x89,0x91,0x88,0x1A,0x69,0x8A,0x19,0x15,0xA0,0xA2,0x00,0x9A, -0x6B,0x49,0x88,0xA3,0x92,0xBB,0x6B,0x3D,0x38,0x01,0x98,0x91,0x3F,0x09,0x18,0x20, -0x90,0x80,0xAC,0x70,0x91,0x9B,0x51,0x09,0x88,0x99,0x14,0x8B,0x98,0x83,0x79,0xA0, -0x99,0x13,0x01,0x19,0xE0,0x83,0x0B,0xB0,0x0C,0x31,0x95,0xB5,0xC2,0x8A,0x39,0x20, -0x80,0x39,0xF3,0xB1,0x10,0x88,0x5E,0x18,0x94,0xA1,0x88,0xA1,0x98,0x15,0xAA,0x39, -0xD4,0x84,0xC0,0xA2,0xA2,0x0C,0x81,0x86,0xB5,0xA1,0xB1,0x14,0x1B,0xB1,0x02,0x92, -0xC3,0xE0,0x88,0x11,0xAA,0x69,0x18,0x81,0xA3,0xB0,0x01,0xBF,0x2A,0x31,0x93,0xF1, -0x00,0x89,0x18,0x19,0x11,0xD3,0xE0,0x10,0x18,0xB1,0x18,0x24,0x9A,0x2B,0xA4,0xC0, -0xB0,0x31,0x6C,0x19,0xB4,0x12,0xA8,0xEA,0x58,0x10,0x8B,0x93,0x82,0x88,0x9A,0x41, -0x10,0xC3,0xEA,0x41,0xA9,0x9C,0x34,0xA1,0x2A,0x79,0xA2,0x01,0xA8,0xB3,0x28,0xCC, -0x41,0x9A,0xB3,0x4B,0xB3,0x27,0x8B,0x83,0x2B,0x2F,0x08,0x28,0xB2,0x80,0x2C,0x30, -0x5E,0x09,0x12,0x9B,0x09,0x22,0x5B,0x19,0x8A,0x11,0x59,0x99,0xA4,0x32,0xCD,0x18, -0x08,0x10,0x85,0xB3,0xB4,0x1E,0x88,0x28,0x8A,0x11,0x09,0xC0,0x79,0x80,0x91,0x3B, -0x80,0x10,0x0F,0x01,0x80,0x91,0x19,0x3D,0x92,0x28,0xA8,0x37,0x9A,0x0A,0x3A,0x8A, -0x45,0xA9,0xA4,0x00,0xAA,0x09,0x3D,0x59,0x20,0xE1,0x08,0x98,0x90,0x59,0x10,0x09, -0xA3,0xC3,0x93,0x99,0x2B,0x69,0x11,0xD1,0xB1,0xA4,0x91,0x3C,0x89,0x83,0xF0,0x10, -0x91,0xA1,0x89,0x59,0x05,0x99,0x93,0x94,0xC8,0x08,0x0A,0x09,0x17,0xB1,0x83,0xC1, -0x91,0x40,0xA2,0xC2,0x98,0xC3,0xBA,0x28,0x23,0x0F,0x80,0x50,0xB8,0x19,0x10,0x96, -0x98,0x8C,0x05,0x98,0x19,0x29,0x2B,0x3B,0x0A,0xE2,0x01,0x0F,0x3C,0x38,0x08,0x09, -0x81,0x4A,0x6C,0x08,0x00,0x88,0x98,0x38,0x2C,0x5A,0x1B,0x20,0x1A,0x39,0xB0,0x09, -0xCB,0x5B,0x49,0x09,0x71,0x00,0xC1,0x0E,0x08,0x38,0x0C,0x02,0x10,0x0E,0x10,0x8A, -0x48,0x19,0x90,0x92,0x0D,0xA3,0x98,0x3B,0x79,0x19,0x01,0x10,0xE1,0x80,0x19,0x2B, -0x10,0xF2,0x02,0xAB,0x84,0x9A,0x29,0xB4,0x80,0x92,0x03,0x88,0x95,0xD0,0x03,0x90, -0xA0,0xC7,0xA1,0xB0,0xA2,0x02,0x18,0xB5,0xD4,0x01,0xC0,0x08,0xA2,0x93,0xA8,0xA0, -0xC3,0x20,0xF3,0x90,0x00,0xD5,0x08,0x89,0xA5,0x80,0xA0,0x81,0x82,0xC2,0x09,0xD1, -0x13,0xCB,0x03,0x84,0x91,0xE1,0x1B,0x12,0x08,0xAB,0x87,0x18,0xAB,0x58,0x89,0x28, -0x81,0xC9,0x33,0xA9,0x80,0x2E,0x20,0x83,0xB9,0x20,0x3B,0x9E,0x7A,0x08,0x81,0x18, -0x0B,0x88,0x79,0x80,0x8B,0x00,0x12,0x0E,0x89,0x51,0x1B,0x81,0xA0,0x3A,0x01,0xAF, -0x11,0x28,0xBA,0x35,0x98,0x88,0x52,0xC0,0x83,0x2F,0xA9,0x11,0x0A,0x19,0x25,0xD0, -0x30,0x9C,0x08,0x21,0x98,0x81,0x2A,0xF3,0x2A,0x80,0xB6,0x2B,0x08,0x93,0xE9,0x02, -0x81,0x8C,0x21,0x00,0xA6,0xA9,0x94,0x01,0x8F,0x80,0x94,0x98,0x93,0xB4,0x00,0x08, -0xC0,0x14,0x98,0xB3,0xB4,0xC1,0x09,0x18,0xA7,0x00,0xA3,0xC8,0x0A,0x3C,0x19,0x96, -0x83,0xC1,0x99,0x19,0x4A,0x85,0x80,0xC1,0x91,0x99,0x90,0x2A,0x17,0x95,0x99,0x88, -0x12,0xAE,0x39,0x08,0x92,0x84,0xB0,0xA8,0x79,0x09,0x19,0x01,0xB2,0xA3,0x8F,0x28, -0x2B,0xA2,0x40,0x82,0xA0,0x4C,0xA9,0x39,0x8D,0x81,0x70,0x88,0xA0,0x1A,0x49,0x2D, -0x1A,0x26,0xA8,0x98,0x08,0x29,0x0B,0x12,0x96,0xB1,0xB2,0x3A,0x13,0x9B,0x60,0xA0, -0x88,0xB2,0x34,0xEA,0x1A,0x2A,0x79,0x98,0x10,0x04,0x8C,0x1C,0x81,0x04,0x8C,0x83, -0x19,0x2F,0x81,0x93,0x98,0x10,0x08,0x30,0x2A,0xFA,0x05,0x08,0x2A,0x89,0x91,0xA3, -0xFA,0x11,0x11,0x00,0x8C,0x04,0x8A,0x2A,0xB5,0x10,0xA9,0xC2,0x3D,0x1B,0x32,0x04, -0x0A,0x1A,0x09,0x40,0x1F,0x92,0x1D,0x2A,0x91,0x10,0x30,0x2F,0x0B,0x68,0x99,0xA2, -0x92,0x88,0x78,0xA9,0x20,0x28,0xE2,0x92,0x1A,0x99,0x4B,0x19,0x22,0xA1,0xE2,0x21, -0x2F,0x98,0x29,0x18,0x91,0x08,0xB0,0x79,0x1A,0x82,0x3B,0xB1,0xA7,0x8A,0xB3,0x98, -0x5B,0x23,0xCA,0x42,0x83,0xF0,0x90,0x18,0x98,0x08,0xB4,0x20,0xA3,0xC0,0x43,0xD8, -0x80,0x81,0xA3,0x99,0xD9,0xA7,0x19,0x90,0x10,0x05,0xB1,0x8B,0x02,0xA4,0xBD,0x23, -0x93,0x8A,0x99,0x4B,0x03,0xC1,0xF8,0x38,0x09,0x2B,0x14,0xD0,0x03,0x8A,0x2A,0x39, -0xB9,0x97,0x90,0xAA,0x50,0x01,0x99,0x51,0xD1,0x09,0x1A,0xB5,0x00,0x8B,0x93,0x08, -0x98,0x11,0xF9,0x85,0x2B,0x08,0x96,0x89,0x90,0x2A,0x12,0x4A,0xD8,0x85,0x2B,0x0E, -0x10,0x00,0x01,0xB1,0x9B,0x69,0x1A,0x90,0x40,0xB8,0x01,0x08,0x0A,0x2C,0x09,0x14, -0x4B,0xE2,0x82,0x88,0xB1,0x78,0x0A,0x01,0xC2,0x93,0x19,0xCE,0x20,0x3C,0x82,0xB4, -0x1B,0x20,0x8C,0x3B,0x29,0xAB,0x86,0x23,0xD8,0x81,0x9A,0x5A,0x49,0xB0,0x16,0xA0, -0xB0,0x28,0x1B,0x13,0x93,0xE4,0xA2,0xA9,0x08,0x5A,0xB3,0x12,0xC1,0xE1,0x10,0x88, -0x01,0x0C,0x92,0x08,0x89,0xB7,0x88,0x81,0x10,0x9A,0x17,0xA0,0xB0,0x13,0x99,0xE0, -0x39,0x31,0xD2,0xB2,0x80,0x0B,0x2D,0x49,0x80,0x01,0xB0,0x06,0x09,0x0C,0x3A,0x69, -0xA0,0x08,0xB2,0xA1,0x69,0x2B,0x5A,0x81,0x92,0xBA,0x21,0xB1,0x7D,0x10,0x80,0x08, -0x88,0x82,0x32,0x0D,0xB0,0x1A,0x1C,0x21,0x94,0xA9,0x58,0xB9,0x5A,0x4A,0xA0,0x13, -0xA9,0x80,0x7C,0x00,0x20,0x8A,0x04,0x0C,0x00,0x82,0x2A,0xB2,0xAC,0x4B,0x69,0xA0, -0xA6,0x81,0x9B,0x19,0x38,0x8B,0x17,0xB2,0x81,0x2A,0xBB,0x94,0x29,0xA2,0x15,0xBA, -0x97,0xA3,0xB9,0x79,0x01,0xB2,0x02,0xF1,0x90,0x0A,0x29,0x11,0x88,0xE5,0xA0,0x81, -0x19,0x91,0x90,0x28,0xB3,0x14,0xD0,0xB5,0x91,0x9A,0x29,0x0B,0x07,0xA2,0xB3,0x01, -0x9D,0x28,0x41,0xD0,0x91,0x90,0x82,0x1A,0xA8,0x44,0x9A,0xA9,0x21,0xE3,0xA9,0x4B, -0x19,0x78,0x89,0x83,0xA3,0xB9,0x5A,0x3D,0x80,0x82,0xA2,0xA0,0x6C,0x10,0x20,0x8B, -0x93,0x8B,0x0E,0x33,0xA9,0xB1,0x68,0x8A,0x31,0xAC,0x94,0xB4,0x8B,0x32,0x0B,0xB4, -0x81,0x91,0x1D,0x33,0xD9,0x31,0xE1,0x8B,0x3B,0x30,0x12,0x49,0xD2,0x8E,0x29,0x18, -0x8A,0x92,0x02,0xAA,0x59,0x1C,0x32,0x88,0x01,0x23,0xFB,0x83,0x29,0xDA,0x59,0x01, -0x81,0x92,0xE1,0x18,0x8A,0x1D,0x30,0x93,0xF1,0x00,0x01,0x0B,0x39,0x92,0x89,0xA0, -0x11,0x5B,0xE0,0x82,0x09,0x13,0xAA,0xB4,0x16,0xD8,0x91,0x2A,0x29,0x84,0x1B,0xC5, -0x98,0x98,0x31,0x98,0x99,0x17,0xA9,0x20,0x92,0xC3,0x18,0x9D,0x20,0x3D,0x89,0x94, -0xA2,0x1C,0x5C,0x29,0x39,0xA0,0xB3,0x00,0x0C,0x4C,0x48,0x92,0x0A,0x91,0x85,0x9A, -0x01,0x82,0x1F,0x10,0x99,0x15,0xC1,0xA0,0x39,0x1A,0x1D,0x85,0xB4,0x90,0x1A,0x2A, -0x4B,0x01,0xB2,0x93,0xBE,0x12,0x83,0xC9,0x18,0x09,0x20,0x78,0xF1,0x08,0x19,0x88, -0x3A,0x83,0xB3,0xA9,0x93,0x7A,0x0A,0x96,0x98,0x00,0xA8,0x3A,0x30,0x92,0xF2,0x9B, -0x3D,0x38,0x92,0x92,0xC3,0xB8,0x6B,0x29,0x01,0x01,0xB2,0x2F,0x09,0x19,0x18,0x01, -0x3B,0x7B,0x10,0xA1,0x90,0x39,0x0F,0x38,0x0A,0xB5,0xA4,0x89,0x8B,0x6A,0x2B,0x12, -0xC8,0x90,0x40,0x2A,0x9E,0x22,0x88,0x18,0x09,0x3A,0xC3,0xE8,0x09,0x59,0x08,0x12, -0x94,0xD0,0x1A,0x2C,0x38,0x00,0xA1,0x83,0xE8,0x08,0x3A,0x08,0x10,0x9E,0x83,0x1D, -0x92,0x19,0x2C,0x39,0x3B,0x59,0x04,0xE1,0x80,0x08,0x8D,0x21,0x81,0xB2,0xB2,0x02, -0x99,0x91,0xA4,0xD6,0x98,0x99,0x03,0x80,0x98,0xA7,0x91,0x09,0xA1,0xB2,0xB3,0xE1, -0x12,0x92,0xB1,0x81,0x06,0x99,0x0A,0x23,0xC4,0xB1,0xF2,0x89,0x19,0x3A,0x94,0x82, -0xE0,0x89,0x38,0x0B,0xA4,0xA5,0x80,0x80,0x8C,0x34,0xB9,0xA9,0x23,0x13,0xB9,0xC1, -0xC7,0x1B,0x89,0x10,0x20,0x11,0xE3,0xA8,0x4B,0x0B,0x40,0x91,0x90,0x1B,0x5F,0x2A, -0x18,0x82,0x91,0x0B,0x4A,0x28,0xCA,0x40,0x80,0x5B,0x2C,0x13,0xB0,0x8A,0xA9,0x5A, -0x58,0x89,0x82,0x88,0x2E,0x3B,0x31,0xA1,0x9B,0x01,0x7A,0x2C,0x01,0x91,0x93,0x3F, -0x88,0x39,0x10,0xF1,0x91,0x8B,0x48,0x0A,0x12,0xE3,0xA8,0x18,0x28,0x92,0x97,0x98, -0x99,0x19,0xA1,0x11,0xB6,0x88,0x3B,0x10,0xD3,0xC3,0xA1,0x2A,0x8A,0x49,0x04,0xF1, -0x91,0x02,0x8A,0x89,0x04,0xF1,0x98,0x80,0x18,0x12,0xE3,0x81,0x98,0x80,0x01,0xB3, -0xF2,0x99,0x12,0x2A,0xB5,0xB3,0x92,0xAA,0x19,0x50,0xB2,0xC3,0x92,0xD0,0x2B,0x68, -0x93,0x99,0xC0,0x2C,0x3E,0x80,0x20,0x08,0x93,0x0D,0x2A,0x31,0x8D,0x02,0x2B,0x91, -0x08,0x0A,0x03,0x2C,0x3C,0x52,0xB9,0xA0,0x12,0xBF,0x3A,0x29,0x01,0x88,0xC0,0x6A, -0x3C,0x0A,0x49,0x18,0x0B,0x39,0x2B,0x69,0x0A,0x84,0x2A,0x2A,0x1C,0x2A,0xC3,0x8C, -0x19,0x50,0x09,0x91,0xA7,0x8D,0x18,0x1A,0x28,0x00,0xA0,0x94,0x10,0x1F,0x20,0x90, -0x8A,0x12,0xD0,0x1A,0x5A,0x81,0x04,0xBC,0x23,0x10,0xE0,0x90,0x90,0x18,0x1A,0xA6, -0x12,0xB1,0xD0,0x4A,0x08,0x82,0x92,0xB6,0x9A,0x0A,0x12,0x88,0xC3,0xC5,0x8A,0x89, -0x20,0xB5,0x93,0x0B,0x18,0x00,0x09,0xF2,0x88,0x2A,0x4A,0x08,0x05,0xB2,0xA9,0x3B, -0x5D,0x28,0xA4,0xB1,0x00,0x19,0x19,0x7A,0xA3,0xB3,0x0A,0x90,0xA1,0xC4,0x80,0xBA, -0x50,0x13,0xC1,0xC2,0x9A,0x2A,0x7B,0x28,0x84,0xC1,0x09,0x3B,0x4E,0x20,0x91,0xA1, -0x18,0xAB,0x79,0x10,0xB4,0x08,0x9A,0x11,0x2B,0xF0,0x93,0xAA,0x01,0x6A,0x01,0x93, -0x80,0xB8,0x2A,0x5B,0x10,0x80,0x89,0x4A,0x5B,0x92,0x15,0xB2,0xA0,0x2F,0x19,0x93, -0xB8,0x95,0x80,0x1C,0x21,0xA9,0x02,0x0B,0xA0,0x5A,0x18,0x98,0x39,0x1B,0x68,0x00, -0x91,0x91,0x9C,0x39,0x3E,0x18,0x84,0xB3,0x9B,0x7A,0x08,0x18,0x0A,0xB5,0x91,0x0B, -0x28,0x39,0x19,0x90,0x0A,0x50,0xAC,0x11,0x01,0xAB,0x88,0x52,0x1B,0x83,0xC4,0xA2, -0x9A,0xAB,0x03,0x90,0x19,0x93,0x81,0x08,0x92,0x9A,0x68,0x98,0x19,0x39,0xC1,0x92, -0x8A,0x38,0x4E,0x02,0xB1,0x90,0xC3,0x18,0x2B,0x04,0xC3,0xD2,0x91,0x90,0x81,0x89, -0x13,0xF1,0x88,0x93,0xA2,0x00,0x91,0xC0,0x5B,0x21,0x99,0x93,0x06,0x9A,0x1B,0x48, -0x99,0xB7,0x90,0x89,0x18,0x1B,0x11,0xA4,0xB2,0x81,0x9A,0x08,0x97,0x98,0x91,0x10, -0xB8,0x06,0xA2,0xA0,0x29,0x2B,0x21,0xC2,0xD1,0x10,0x1A,0x4A,0x29,0xF1,0x98,0x29, -0x1B,0x31,0x10,0xA0,0xA1,0x1D,0x5A,0x29,0xB2,0x82,0xA8,0x0F,0x28,0x21,0x09,0x91, -0x82,0x4D,0x10,0xA3,0xB0,0x89,0x4C,0x39,0xA0,0xA4,0xA1,0x89,0x1E,0x28,0x29,0xA3, -0xC3,0x2D,0x19,0x01,0x49,0x01,0x9B,0x0C,0x21,0xC2,0xA2,0x93,0x7C,0x2A,0x10,0x90, - -/* Source: 08HH.ROM */ -/* Length: 384 / 0x00000180 */ - -0x75,0xF2,0xAB,0x7D,0x7E,0x5C,0x3B,0x4B,0x3C,0x4D,0x4A,0x02,0xB3,0xC5,0xE7,0xE3, -0x92,0xB3,0xC4,0xB3,0xC3,0x8A,0x3B,0x5D,0x5C,0x3A,0x84,0xC2,0x91,0xA4,0xE7,0xF7, -0xF7,0xF4,0xA1,0x1B,0x49,0xA5,0xB1,0x1E,0x7F,0x5A,0x00,0x89,0x39,0xB7,0xA8,0x3D, -0x4A,0x84,0xE7,0xF7,0xE2,0x2D,0x4C,0x3A,0x4E,0x7D,0x04,0xB0,0x2D,0x4B,0x10,0x80, -0xA3,0x99,0x10,0x0E,0x59,0x93,0xC4,0xB1,0x81,0xC4,0xA2,0xB2,0x88,0x08,0x3F,0x3B, -0x28,0xA6,0xC3,0xA2,0xA2,0xC5,0xC1,0x3F,0x7E,0x39,0x81,0x93,0xC2,0xA3,0xE5,0xD2, -0x80,0x93,0xB8,0x6D,0x49,0x82,0xD4,0xA1,0x90,0x01,0xA0,0x09,0x04,0xE3,0xB2,0x91, -0xB7,0xB3,0xA8,0x2A,0x03,0xF3,0xA1,0x92,0xC5,0xC3,0xB2,0x0B,0x30,0xB3,0x8E,0x6D, -0x4A,0x01,0xB4,0xB4,0xC4,0xC3,0x99,0x3B,0x12,0xE3,0xA1,0x88,0x82,0xB4,0x9A,0x5C, -0x3A,0x18,0x93,0xC3,0xB3,0xB4,0xA8,0x19,0x04,0xF3,0xA8,0x3B,0x10,0xA2,0x88,0xA5, -0xB2,0x0B,0x6D,0x4B,0x10,0x91,0x89,0x3C,0x18,0x18,0xA6,0xC4,0xC3,0x98,0x19,0x2B, -0x20,0x91,0xA0,0x4E,0x28,0x93,0xB3,0xC2,0x92,0xA9,0x5A,0x96,0xC4,0xC2,0x09,0x01, -0xC4,0xA1,0x92,0xC4,0xA1,0x89,0x10,0xA3,0xA1,0x90,0x1C,0x5A,0x01,0xC5,0xA1,0x92, -0xD4,0xB3,0xC4,0xC4,0xC3,0xA1,0x88,0x1A,0x28,0x89,0x3C,0x3A,0x3D,0x29,0x00,0x93, -0xB0,0x3D,0x28,0x80,0x91,0x82,0xE3,0x99,0x2A,0x11,0xD6,0xC3,0x99,0x29,0x82,0xC4, -0xC3,0xA1,0x0A,0x3B,0x3D,0x3A,0x02,0xC3,0xA2,0x99,0x3B,0x2C,0x7C,0x28,0x81,0xA3, -0xB2,0xA3,0xB1,0x08,0x1A,0x3C,0x18,0x2E,0x4C,0x39,0xA5,0xB3,0xB4,0xC2,0x88,0x08, -0x19,0x0A,0x49,0xB7,0xB3,0xA2,0xA1,0x92,0xA1,0x93,0xB1,0x0C,0x7D,0x39,0x93,0xB3, -0xB1,0x1A,0x19,0x5D,0x28,0xA6,0xC4,0xB2,0x90,0x09,0x2A,0x18,0x1B,0x5B,0x28,0x88, -0x2C,0x29,0x82,0xA0,0x18,0x91,0x2D,0x29,0x2B,0x5C,0x4C,0x3B,0x4C,0x28,0x80,0x92, -0x90,0x09,0x2B,0x28,0x1D,0x6B,0x11,0xC5,0xB2,0x0B,0x39,0x09,0x4D,0x28,0x88,0x00, -0x1B,0x28,0x94,0xE3,0xA0,0x1A,0x28,0xB5,0xB4,0xB3,0xB2,0x93,0xE2,0x91,0x92,0xD4, -0xA0,0x1B,0x4A,0x01,0xA1,0x88,0x2D,0x5C,0x3B,0x28,0x08,0x93,0xD4,0xB2,0x91,0xB4, -0xA0,0x3E,0x3B,0x4B,0x3B,0x29,0x08,0x93,0x9B,0x7B,0x3A,0x19,0x00,0x80,0x80,0xA0, - -/* Source: 10TOM.ROM */ -/* Length: 640 / 0x00000280 */ - -0x77,0x27,0x87,0x01,0x2D,0x4F,0xC3,0xC1,0x92,0x91,0x89,0x59,0x83,0x1A,0x32,0xC2, -0x95,0xB1,0x81,0x88,0x81,0x4A,0x3D,0x11,0x9E,0x0B,0x88,0x0C,0x18,0x3B,0x11,0x11, -0x91,0x00,0xA0,0xE2,0x0A,0x48,0x13,0x24,0x81,0x48,0x1B,0x39,0x1C,0x83,0x84,0xA1, -0xD1,0x8E,0x8A,0x0B,0xC0,0x98,0x92,0xB8,0x39,0x90,0x10,0x92,0xF0,0xB5,0x88,0x32, -0x49,0x51,0x21,0x03,0x82,0x10,0x8A,0x7A,0x09,0x00,0xA2,0xCA,0x1B,0xCC,0x1C,0xB9, -0x8E,0x89,0x89,0xA1,0x89,0x92,0x29,0x11,0x60,0x40,0x14,0x22,0x32,0x78,0x40,0x01, -0x02,0x90,0x81,0xAB,0x0B,0x00,0xAF,0x99,0xCC,0xAB,0xDA,0xA9,0x99,0x1B,0x30,0x14, -0x92,0x22,0x19,0x68,0x32,0x14,0x26,0x13,0x23,0x23,0x20,0x12,0x9A,0xA8,0xB9,0xFA, -0xAA,0xCA,0xCC,0x0C,0xA8,0xAE,0x88,0xB9,0x88,0xA0,0x02,0x21,0x50,0x43,0x03,0x81, -0x2A,0x11,0x34,0x63,0x24,0x33,0x22,0x38,0x8B,0xEA,0xAE,0x99,0xA0,0x90,0x82,0x00, -0x89,0xBF,0x8A,0xE8,0xA9,0x90,0x01,0x12,0x13,0x12,0x08,0xA9,0xAA,0xC9,0x22,0x63, -0x63,0x12,0x44,0x00,0x10,0x88,0x9C,0x98,0xA1,0x85,0x03,0x32,0x36,0x80,0x89,0xDB, -0xDB,0xBB,0xB9,0xBA,0x01,0x81,0x28,0x19,0xCB,0xFA,0xBC,0x09,0x13,0x37,0x34,0x34, -0x23,0x31,0x20,0x10,0x00,0x00,0x28,0x38,0x10,0x88,0xEC,0x8D,0xCB,0xBC,0xCC,0xBB, -0xBB,0xC9,0x99,0x00,0x00,0x33,0x11,0x22,0x81,0x07,0x41,0x54,0x34,0x34,0x22,0x31, -0x00,0x88,0x9A,0x9B,0x98,0xAB,0x8E,0x9B,0xBD,0x9C,0xBC,0xBB,0xDA,0xAA,0xA9,0x99, -0x18,0x38,0x60,0x20,0x31,0x13,0x13,0x51,0x14,0x31,0x53,0x33,0x35,0x22,0x01,0x8A, -0x9C,0xA9,0xCA,0xC9,0xA8,0x00,0x10,0x81,0x9C,0x9E,0xAB,0xCC,0xAB,0xBA,0x98,0x30, -0x52,0x03,0x81,0x08,0x9C,0xAC,0xAC,0x18,0x11,0x03,0x51,0x61,0x41,0x31,0x31,0x02, -0x01,0x20,0x24,0x43,0x44,0x40,0x30,0x10,0xBC,0xBE,0xCB,0xDB,0xAB,0xBA,0x99,0x98, -0x99,0xAA,0xBD,0xAA,0xC8,0x90,0x11,0x53,0x37,0x23,0x43,0x34,0x33,0x33,0x33,0x11, -0x28,0x00,0x19,0xA9,0x9A,0xCB,0xCE,0xBB,0xEB,0xBC,0xBB,0xCA,0xBA,0xA8,0x88,0x11, -0x12,0x21,0x20,0x22,0x26,0x26,0x23,0x23,0x43,0x24,0x22,0x32,0x20,0x31,0x81,0x9A, -0xBC,0xBC,0xCB,0xBD,0x9A,0xA9,0x90,0x98,0xBA,0xCC,0xCB,0xBC,0x8B,0x88,0x22,0x35, -0x23,0x12,0x99,0x8B,0xAA,0xAA,0x89,0x82,0x93,0x31,0x42,0x23,0x23,0x21,0x32,0x11, -0x20,0x13,0x13,0x24,0x24,0x24,0x22,0x11,0x8A,0x9E,0xAC,0xAC,0xAA,0xBA,0xAA,0xAB, -0xBD,0xBC,0xCB,0xCB,0xA9,0xA8,0x91,0x12,0x44,0x43,0x44,0x34,0x34,0x42,0x33,0x42, -0x21,0x11,0x11,0x88,0x80,0xAA,0x0B,0xAC,0xCB,0xEC,0xAC,0xBA,0xCA,0xAB,0x9A,0x99, -0x80,0x91,0x09,0x08,0x10,0x22,0x44,0x43,0x44,0x33,0x43,0x22,0x13,0x21,0x22,0x20, -0x09,0x88,0xB9,0xC8,0xBB,0xAB,0xAB,0xA9,0xA9,0x9B,0x9B,0x99,0x90,0x90,0x00,0x81, -0x00,0x08,0x09,0x8A,0x9A,0xAA,0xA9,0xA9,0x99,0x90,0x80,0x01,0x80,0x00,0x09,0x31, -0x32,0x44,0x33,0x43,0x34,0x33,0x24,0x22,0x23,0x12,0x10,0x09,0x9B,0xAB,0xCA,0xCC, -0xBB,0xCB,0xDA,0xCA,0xAB,0xCA,0xAB,0xA9,0xA8,0x92,0x12,0x43,0x53,0x35,0x23,0x33, -0x43,0x43,0x52,0x22,0x22,0x21,0x01,0x09,0x89,0xA9,0xBB,0xBD,0xBC,0xCB,0xDA,0xAB, -0xAB,0xAB,0xAA,0xA9,0x99,0xA8,0x09,0x01,0x11,0x34,0x25,0x23,0x33,0x51,0x22,0x31, -0x12,0x20,0x21,0x12,0x10,0x80,0x99,0x9A,0x99,0x99,0x88,0x08,0x00,0x88,0xA9,0x99, -0x99,0x80,0x80,0x10,0x01,0x00,0x9A,0xAA,0xBB,0xBA,0xBA,0xA9,0x99,0x99,0x89,0x99, -0x99,0x00,0x01,0x33,0x35,0x24,0x23,0x34,0x23,0x33,0x34,0x33,0x43,0x32,0x21,0x88, -0xAB,0xBD,0xBB,0xDB,0xAB,0xBA,0xBB,0xDA,0xBB,0xCB,0xBB,0xBC,0xA8,0x90,0x01,0x12, -0x23,0x43,0x53,0x34,0x34,0x39,0x80,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00, - -/* Source: 20RIM.ROM */ -/* Length: 128 / 0x00000080 */ - -0x0F,0xFF,0x73,0x8E,0x71,0xCD,0x00,0x49,0x10,0x90,0x21,0x49,0xA0,0xDB,0x02,0x3A, -0xE3,0x0A,0x50,0x98,0xC0,0x59,0xA2,0x99,0x09,0x22,0xA2,0x80,0x10,0xA8,0x5B,0xD2, -0x88,0x21,0x09,0x96,0xA8,0x10,0x0A,0xE0,0x08,0x48,0x19,0xAB,0x52,0xA8,0x92,0x0C, -0x03,0x19,0xE2,0x0A,0x12,0xC2,0x81,0x1E,0x01,0xD0,0x48,0x88,0x98,0x01,0x49,0x91, -0xAA,0x2C,0x25,0x89,0x88,0xB5,0x81,0xA2,0x9A,0x12,0x9E,0x38,0x3B,0x81,0x9B,0x59, -0x01,0x93,0xCA,0x4A,0x21,0xA0,0x3D,0x0A,0x39,0x3D,0x12,0xA8,0x3F,0x18,0x01,0x92, -0x1C,0x00,0xB2,0x48,0xB9,0x94,0xA3,0x19,0x4F,0x19,0xB2,0x32,0x90,0xBA,0x01,0xE6, -0x91,0x80,0xC1,0xA4,0x2A,0x08,0xA1,0xB1,0x25,0xD2,0x88,0x99,0x21,0x80,0x88,0x80, -}; - - - -/* flag enable control 0x110 */ -INLINE void YM2608IRQFlagWrite(FM_OPN *OPN, YM2608 *F2608, int v) -{ - if( v & 0x80 ) - { /* Reset IRQ flag */ - FM_STATUS_RESET(&OPN->ST, 0xf7); /* don't touch BUFRDY flag otherwise we'd have to call ymdeltat module to set the flag back */ - } - else - { /* Set status flag mask */ - F2608->flagmask = (~(v&0x1f)); - FM_IRQMASK_SET(&OPN->ST, (F2608->irqmask & F2608->flagmask) ); - } -} - -/* compatible mode & IRQ enable control 0x29 */ -INLINE void YM2608IRQMaskWrite(FM_OPN *OPN, YM2608 *F2608, int v) -{ - /* SCH,xx,xxx,EN_ZERO,EN_BRDY,EN_EOS,EN_TB,EN_TA */ - - /* extend 3ch. enable/disable */ - if(v&0x80) - OPN->type |= TYPE_6CH; /* OPNA mode - 6 FM channels */ - else - OPN->type &= ~TYPE_6CH; /* OPN mode - 3 FM channels */ - - /* IRQ MASK store and set */ - F2608->irqmask = v&0x1f; - FM_IRQMASK_SET(&OPN->ST, (F2608->irqmask & F2608->flagmask) ); -} - -/* Generate samples for one of the YM2608s */ -void YM2608UpdateOne(void *chip, FMSAMPLE **buffer, int length) -{ - YM2608 *F2608 = chip; - FM_OPN *OPN = &F2608->OPN; - YM_DELTAT *DELTAT = &F2608->deltaT; - int i,j; - FMSAMPLE *bufL,*bufR; - FM_CH *cch[6]; - - /* set bufer */ - bufL = buffer[0]; - bufR = buffer[1]; - - cch[0] = &F2608->CH[0]; - cch[1] = &F2608->CH[1]; - cch[2] = &F2608->CH[2]; - cch[3] = &F2608->CH[3]; - cch[4] = &F2608->CH[4]; - cch[5] = &F2608->CH[5]; - /* setup adpcm rom address */ - pcmbufA = F2608->pcmbuf; - pcmsizeA = F2608->pcm_size; - - /* refresh PG and EG */ - refresh_fc_eg_chan( cch[0] ); - refresh_fc_eg_chan( cch[1] ); - if( (OPN->ST.mode & 0xc0) ) - { - /* 3SLOT MODE */ - if( cch[2]->SLOT[SLOT1].Incr==-1) - { - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT1] , OPN->SL3.fc[1] , OPN->SL3.kcode[1] ); - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT2] , OPN->SL3.fc[2] , OPN->SL3.kcode[2] ); - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT3] , OPN->SL3.fc[0] , OPN->SL3.kcode[0] ); - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT4] , cch[2]->fc , cch[2]->kcode ); - } - }else refresh_fc_eg_chan( cch[2] ); - refresh_fc_eg_chan( cch[3] ); - refresh_fc_eg_chan( cch[4] ); - refresh_fc_eg_chan( cch[5] ); - - - /* buffering */ - for(i=0; i < length ; i++) - { - - advance_lfo(OPN); - - /* clear output acc. */ - out_adpcm[OUTD_LEFT] = out_adpcm[OUTD_RIGHT]= out_adpcm[OUTD_CENTER] = 0; - out_delta[OUTD_LEFT] = out_delta[OUTD_RIGHT]= out_delta[OUTD_CENTER] = 0; - /* clear outputs */ - out_fm[0] = 0; - out_fm[1] = 0; - out_fm[2] = 0; - out_fm[3] = 0; - out_fm[4] = 0; - out_fm[5] = 0; - - /* advance envelope generator */ - OPN->eg_timer += OPN->eg_timer_add; - while (OPN->eg_timer >= OPN->eg_timer_overflow) - { - OPN->eg_timer -= OPN->eg_timer_overflow; - OPN->eg_cnt++; - - advance_eg_channel(OPN, &cch[0]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[1]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[2]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[3]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[4]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[5]->SLOT[SLOT1]); - } - - /* calculate FM */ - chan_calc(OPN, cch[0] ); - chan_calc(OPN, cch[1] ); - chan_calc(OPN, cch[2] ); - chan_calc(OPN, cch[3] ); - chan_calc(OPN, cch[4] ); - chan_calc(OPN, cch[5] ); - - /* deltaT ADPCM */ - if( DELTAT->portstate&0x80 ) - YM_DELTAT_ADPCM_CALC(DELTAT); - - /* ADPCMA */ - for( j = 0; j < 6; j++ ) - { - if( F2608->adpcm[j].flag ) - ADPCMA_calc_chan( F2608, &F2608->adpcm[j]); - } - - /* buffering */ - { - int lt,rt; - - lt = out_adpcm[OUTD_LEFT] + out_adpcm[OUTD_CENTER]; - rt = out_adpcm[OUTD_RIGHT] + out_adpcm[OUTD_CENTER]; - lt += (out_delta[OUTD_LEFT] + out_delta[OUTD_CENTER])>>9; - rt += (out_delta[OUTD_RIGHT] + out_delta[OUTD_CENTER])>>9; - lt += ((out_fm[0]>>1) & OPN->pan[0]); /* shift right verified on real YM2608 */ - rt += ((out_fm[0]>>1) & OPN->pan[1]); - lt += ((out_fm[1]>>1) & OPN->pan[2]); - rt += ((out_fm[1]>>1) & OPN->pan[3]); - lt += ((out_fm[2]>>1) & OPN->pan[4]); - rt += ((out_fm[2]>>1) & OPN->pan[5]); - lt += ((out_fm[3]>>1) & OPN->pan[6]); - rt += ((out_fm[3]>>1) & OPN->pan[7]); - lt += ((out_fm[4]>>1) & OPN->pan[8]); - rt += ((out_fm[4]>>1) & OPN->pan[9]); - lt += ((out_fm[5]>>1) & OPN->pan[10]); - rt += ((out_fm[5]>>1) & OPN->pan[11]); - - lt >>= FINAL_SH; - rt >>= FINAL_SH; - - Limit( lt, MAXOUT, MINOUT ); - Limit( rt, MAXOUT, MINOUT ); - /* buffering */ - bufL[i] = lt; - bufR[i] = rt; - - #ifdef SAVE_SAMPLE - SAVE_ALL_CHANNELS - #endif - - } - - /* timer A control */ - INTERNAL_TIMER_A( &OPN->ST , cch[2] ) - } - INTERNAL_TIMER_B(&OPN->ST,length) - - - /* check IRQ for DELTA-T EOS */ - FM_STATUS_SET(&OPN->ST, 0); - -} -#ifdef __STATE_H__ -void YM2608Postload(void *chip) -{ - if (chip) - { - YM2608 *F2608 = (YM2608 *)chip; - int r; - - /* prescaler */ - OPNPrescaler_w(&F2608->OPN,1,2); - F2608->deltaT.freqbase = F2608->OPN.ST.freqbase; - /* IRQ mask / mode */ - YM2608IRQMaskWrite(&F2608->OPN, F2608, F2608->REGS[0x29]); - /* SSG registers */ - for(r=0;r<16;r++) - { - (*F2608->OPN.ST.SSG->write)(F2608->OPN.ST.param,0,r); - (*F2608->OPN.ST.SSG->write)(F2608->OPN.ST.param,1,F2608->REGS[r]); - } - - /* OPN registers */ - /* DT / MULTI , TL , KS / AR , AMON / DR , SR , SL / RR , SSG-EG */ - for(r=0x30;r<0x9e;r++) - if((r&3) != 3) - { - OPNWriteReg(&F2608->OPN,r,F2608->REGS[r]); - OPNWriteReg(&F2608->OPN,r|0x100,F2608->REGS[r|0x100]); - } - /* FB / CONNECT , L / R / AMS / PMS */ - for(r=0xb0;r<0xb6;r++) - if((r&3) != 3) - { - OPNWriteReg(&F2608->OPN,r,F2608->REGS[r]); - OPNWriteReg(&F2608->OPN,r|0x100,F2608->REGS[r|0x100]); - } - /* FM channels */ - /*FM_channel_postload(F2608->CH,6);*/ - /* rhythm(ADPCMA) */ - FM_ADPCMAWrite(F2608,1,F2608->REGS[0x111]); - for( r=0x08 ; r<0x0c ; r++) - FM_ADPCMAWrite(F2608,r,F2608->REGS[r+0x110]); - /* Delta-T ADPCM unit */ - YM_DELTAT_postload(&F2608->deltaT , &F2608->REGS[0x100] ); - } -} - -static void YM2608_save_state(YM2608 *F2608, int index) -{ - static const char statename[] = "YM2608"; - - state_save_register_item_array(statename, index, F2608->REGS); - FMsave_state_st(statename,index,&F2608->OPN.ST); - FMsave_state_channel(statename,index,F2608->CH,6); - /* 3slots */ - state_save_register_item_array(statename, index, F2608->OPN.SL3.fc); - state_save_register_item(statename, index, F2608->OPN.SL3.fn_h); - state_save_register_item_array(statename, index, F2608->OPN.SL3.kcode); - /* address register1 */ - state_save_register_item(statename, index, F2608->addr_A1); - /* rythm(ADPCMA) */ - FMsave_state_adpcma(statename,index,F2608->adpcm); - /* Delta-T ADPCM unit */ - YM_DELTAT_savestate(statename,index,&F2608->deltaT); -} -#endif /* _STATE_H */ - -static void YM2608_deltat_status_set(void *chip, UINT8 changebits) -{ - YM2608 *F2608 = chip; - FM_STATUS_SET(&(F2608->OPN.ST), changebits); -} -static void YM2608_deltat_status_reset(void *chip, UINT8 changebits) -{ - YM2608 *F2608 = chip; - FM_STATUS_RESET(&(F2608->OPN.ST), changebits); -} -/* YM2608(OPNA) */ -void * YM2608Init(void *param, int index, int clock, int rate, - void *pcmrom,int pcmsize, - FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const struct ssg_callbacks *ssg) -{ - YM2608 *F2608; - - /* allocate extend state space */ - if( (F2608 = (YM2608 *)malloc(sizeof(YM2608)))==NULL) - return NULL; - /* clear */ - memset(F2608,0,sizeof(YM2608)); - /* allocate total level table (128kb space) */ - if( !init_tables() ) - { - free( F2608 ); - return NULL; - } - - F2608->OPN.ST.param = param; - F2608->OPN.type = TYPE_YM2608; - F2608->OPN.P_CH = F2608->CH; - F2608->OPN.ST.clock = clock; - F2608->OPN.ST.rate = rate; - - /* External handlers */ - F2608->OPN.ST.Timer_Handler = TimerHandler; - F2608->OPN.ST.IRQ_Handler = IRQHandler; - F2608->OPN.ST.SSG = ssg; - - /* DELTA-T */ - F2608->deltaT.memory = (UINT8 *)pcmrom; - F2608->deltaT.memory_size = pcmsize; - - /*F2608->deltaT.write_time = 20.0 / clock;*/ /* a single byte write takes 20 cycles of main clock */ - /*F2608->deltaT.read_time = 18.0 / clock;*/ /* a single byte read takes 18 cycles of main clock */ - - F2608->deltaT.status_set_handler = YM2608_deltat_status_set; - F2608->deltaT.status_reset_handler = YM2608_deltat_status_reset; - F2608->deltaT.status_change_which_chip = F2608; - F2608->deltaT.status_change_EOS_bit = 0x04; /* status flag: set bit2 on End Of Sample */ - F2608->deltaT.status_change_BRDY_bit = 0x08; /* status flag: set bit3 on BRDY */ - F2608->deltaT.status_change_ZERO_bit = 0x10; /* status flag: set bit4 if silence continues for more than 290 miliseconds while recording the ADPCM */ - - /* ADPCM Rhythm */ - F2608->pcmbuf = YM2608_ADPCM_ROM; - F2608->pcm_size = 0x2000; - - YM2608ResetChip(F2608); - - Init_ADPCMATable(); - -#ifdef __STATE_H__ - YM2608_save_state(F2608, index); -#endif - return F2608; -} - -/* shut down emulator */ -void YM2608Shutdown(void *chip) -{ - YM2608 *F2608 = chip; - - FMCloseTable(); - free(F2608); -} - -/* reset one of chips */ -void YM2608ResetChip(void *chip) -{ - int i; - YM2608 *F2608 = chip; - FM_OPN *OPN = &F2608->OPN; - YM_DELTAT *DELTAT = &F2608->deltaT; - - /* Reset Prescaler */ - OPNPrescaler_w(OPN , 0 , 2); - F2608->deltaT.freqbase = OPN->ST.freqbase; - /* reset SSG section */ - (*OPN->ST.SSG->reset)(OPN->ST.param); - - /* status clear */ - FM_BUSY_CLEAR(&OPN->ST); - - /* register 0x29 - default value after reset is: - enable only 3 FM channels and enable all the status flags */ - YM2608IRQMaskWrite(OPN, F2608, 0x1f ); /* default value for D4-D0 is 1 */ - - /* register 0x10, A1=1 - default value is 1 for D4, D3, D2, 0 for the rest */ - YM2608IRQFlagWrite(OPN, F2608, 0x1c ); /* default: enable timer A and B, disable EOS, BRDY and ZERO */ - - OPNWriteMode(OPN,0x27,0x30); /* mode 0 , timer reset */ - - OPN->eg_timer = 0; - OPN->eg_cnt = 0; - - FM_STATUS_RESET(&OPN->ST, 0xff); - - reset_channels( &OPN->ST , F2608->CH , 6 ); - /* reset OPerator paramater */ - for(i = 0xb6 ; i >= 0xb4 ; i-- ) - { - OPNWriteReg(OPN,i ,0xc0); - OPNWriteReg(OPN,i|0x100,0xc0); - } - for(i = 0xb2 ; i >= 0x30 ; i-- ) - { - OPNWriteReg(OPN,i ,0); - OPNWriteReg(OPN,i|0x100,0); - } - for(i = 0x26 ; i >= 0x20 ; i-- ) OPNWriteReg(OPN,i,0); - - /* ADPCM - percussion sounds */ - for( i = 0; i < 6; i++ ) - { - if (i<=3) /* channels 0,1,2,3 */ - F2608->adpcm[i].step = (UINT32)((float)(1<OPN.ST.freqbase)/3.0); - else /* channels 4 and 5 work with slower clock */ - F2608->adpcm[i].step = (UINT32)((float)(1<OPN.ST.freqbase)/6.0); - - F2608->adpcm[i].start = YM2608_ADPCM_ROM_addr[i*2]; - F2608->adpcm[i].end = YM2608_ADPCM_ROM_addr[i*2+1]; - - F2608->adpcm[i].now_addr = 0; - F2608->adpcm[i].now_step = 0; - /* F2608->adpcm[i].delta = 21866; */ - F2608->adpcm[i].vol_mul = 0; - F2608->adpcm[i].pan = &out_adpcm[OUTD_CENTER]; /* default center */ - F2608->adpcm[i].flagMask = 0; - F2608->adpcm[i].flag = 0; - F2608->adpcm[i].adpcm_acc = 0; - F2608->adpcm[i].adpcm_step= 0; - F2608->adpcm[i].adpcm_out = 0; - } - F2608->adpcmTL = 0x3f; - - F2608->adpcm_arrivedEndAddress = 0; /* not used */ - - /* DELTA-T unit */ - DELTAT->freqbase = OPN->ST.freqbase; - DELTAT->output_pointer = out_delta; - DELTAT->portshift = 5; /* always 5bits shift */ /* ASG */ - DELTAT->output_range = 1<<23; - YM_DELTAT_ADPCM_Reset(DELTAT,OUTD_CENTER,YM_DELTAT_EMULATION_MODE_NORMAL); -} - -/* YM2608 write */ -/* n = number */ -/* a = address */ -/* v = value */ -int YM2608Write(void *chip, int a,UINT8 v) -{ - YM2608 *F2608 = chip; - FM_OPN *OPN = &F2608->OPN; - int addr; - - v &= 0xff; /*adjust to 8 bit bus */ - - - switch(a&3) - { - case 0: /* address port 0 */ - OPN->ST.address = v; - F2608->addr_A1 = 0; - - /* Write register to SSG emulator */ - if( v < 16 ) (*OPN->ST.SSG->write)(OPN->ST.param,0,v); - /* prescaler selecter : 2d,2e,2f */ - if( v >= 0x2d && v <= 0x2f ) - { - OPNPrescaler_w(OPN , v , 2); - F2608->deltaT.freqbase = OPN->ST.freqbase; - } - break; - - case 1: /* data port 0 */ - if (F2608->addr_A1 != 0) - break; /* verified on real YM2608 */ - - addr = OPN->ST.address; - F2608->REGS[addr] = v; - switch(addr & 0xf0) - { - case 0x00: /* SSG section */ - /* Write data to SSG emulator */ - (*OPN->ST.SSG->write)(OPN->ST.param,a,v); - break; - case 0x10: /* 0x10-0x1f : Rhythm section */ - YM2608UpdateReq(OPN->ST.param); - FM_ADPCMAWrite(F2608,addr-0x10,v); - break; - case 0x20: /* Mode Register */ - switch(addr) - { - case 0x29: /* SCH,xx,xxx,EN_ZERO,EN_BRDY,EN_EOS,EN_TB,EN_TA */ - YM2608IRQMaskWrite(OPN, F2608, v); - break; - default: - YM2608UpdateReq(OPN->ST.param); - OPNWriteMode(OPN,addr,v); + break; + case 3: /* 0xac-0xae : 3CH FNUM2,BLK */ + if(r < 0x100) + ym2612.OPN.SL3.fn_h = v&0x3f; + break; } break; - default: /* OPN section */ - YM2608UpdateReq(OPN->ST.param); - OPNWriteReg(OPN,addr,v); - } - break; - case 2: /* address port 1 */ - OPN->ST.address = v; - F2608->addr_A1 = 1; - break; - - case 3: /* data port 1 */ - if (F2608->addr_A1 != 1) - break; /* verified on real YM2608 */ - - addr = OPN->ST.address; - F2608->REGS[addr | 0x100] = v; - YM2608UpdateReq(OPN->ST.param); - switch( addr & 0xf0 ) - { - case 0x00: /* DELTAT PORT */ - switch( addr ) - { - case 0x0e: /* DAC data */ - logerror("YM2608: write to DAC data (unimplemented) value=%02x\n",v); - break; - default: - /* 0x00-0x0d */ - YM_DELTAT_ADPCM_Write(&F2608->deltaT,addr,v); - } - break; - case 0x10: /* IRQ Flag control */ - if( addr == 0x10 ) - { - YM2608IRQFlagWrite(OPN, F2608, v); - } - break; - default: - OPNWriteReg(OPN,addr | 0x100,v); - } - } - return OPN->ST.irq; -} - -UINT8 YM2608Read(void *chip,int a) -{ - YM2608 *F2608 = chip; - int addr = F2608->OPN.ST.address; - UINT8 ret = 0; - - switch( a&3 ){ - case 0: /* status 0 : YM2203 compatible */ - /* BUSY:x:x:x:x:x:FLAGB:FLAGA */ - ret = FM_STATUS_FLAG(&F2608->OPN.ST) & 0x83; - break; - - case 1: /* status 0, ID */ - if( addr < 16 ) ret = (*F2608->OPN.ST.SSG->read)(F2608->OPN.ST.param); - else if(addr == 0xff) ret = 0x01; /* ID code */ - break; - - case 2: /* status 1 : status 0 + ADPCM status */ - /* BUSY : x : PCMBUSY : ZERO : BRDY : EOS : FLAGB : FLAGA */ - ret = (FM_STATUS_FLAG(&F2608->OPN.ST) & (F2608->flagmask|0x80)) | ((F2608->deltaT.PCM_BSY & 1)<<5) ; - break; - - case 3: - if(addr == 0x08) - { - ret = YM_DELTAT_ADPCM_Read(&F2608->deltaT); - } - else - { - if(addr == 0x0f) - { - logerror("YM2608 A/D convertion is accessed but not implemented !\n"); - ret = 0x80; /* 2's complement PCM data - result from A/D convertion */ - } - } - break; - } - return ret; -} - -int YM2608TimerOver(void *chip,int c) -{ - YM2608 *F2608 = chip; - - switch(c) - { -#if 0 - case 2: - { /* BUFRDY flag */ - YM_DELTAT_BRDY_callback( &F2608->deltaT ); - } - break; -#endif - case 1: - { /* Timer B */ - TimerBOver( &(F2608->OPN.ST) ); - } - break; - case 0: - { /* Timer A */ - YM2608UpdateReq(F2608->OPN.ST.param); - /* timer update */ - TimerAOver( &(F2608->OPN.ST) ); - /* CSM mode key,TL controll */ - if( F2608->OPN.ST.mode & 0x80 ) - { /* CSM mode total level latch and auto key on */ - CSMKeyControll( &(F2608->CH[2]) ); - } - } - break; - default: - break; - } - - return F2608->OPN.ST.irq; -} - -#endif /* BUILD_YM2608 */ - - - -#if (BUILD_YM2610||BUILD_YM2610B) -/* YM2610(OPNB) */ - -/* Generate samples for one of the YM2610s */ -void YM2610UpdateOne(void *chip, FMSAMPLE **buffer, int length) -{ - YM2610 *F2610 = chip; - FM_OPN *OPN = &F2610->OPN; - YM_DELTAT *DELTAT = &F2610->deltaT; - int i,j; - FMSAMPLE *bufL,*bufR; - FM_CH *cch[4]; - - /* buffer setup */ - bufL = buffer[0]; - bufR = buffer[1]; - - cch[0] = &F2610->CH[1]; - cch[1] = &F2610->CH[2]; - cch[2] = &F2610->CH[4]; - cch[3] = &F2610->CH[5]; - /* setup adpcm rom address */ - pcmbufA = F2610->pcmbuf; - pcmsizeA = F2610->pcm_size; - -#ifdef YM2610B_WARNING -#define FM_KEY_IS(SLOT) ((SLOT)->key) -#define FM_MSG_YM2610B "YM2610-%p.CH%d is playing,Check whether the type of the chip is YM2610B\n" - /* Check YM2610B warning message */ - if( FM_KEY_IS(&F2610->CH[0].SLOT[3]) ) - LOG(LOG_WAR,(FM_MSG_YM2610B,F2610->OPN.ST.param,0)); - if( FM_KEY_IS(&F2610->CH[3].SLOT[3]) ) - LOG(LOG_WAR,(FM_MSG_YM2610B,F2610->OPN.ST.param,3)); -#endif - - /* refresh PG and EG */ - refresh_fc_eg_chan( cch[0] ); - if( (OPN->ST.mode & 0xc0) ) - { - /* 3SLOT MODE */ - if( cch[1]->SLOT[SLOT1].Incr==-1) - { - refresh_fc_eg_slot(&cch[1]->SLOT[SLOT1] , OPN->SL3.fc[1] , OPN->SL3.kcode[1] ); - refresh_fc_eg_slot(&cch[1]->SLOT[SLOT2] , OPN->SL3.fc[2] , OPN->SL3.kcode[2] ); - refresh_fc_eg_slot(&cch[1]->SLOT[SLOT3] , OPN->SL3.fc[0] , OPN->SL3.kcode[0] ); - refresh_fc_eg_slot(&cch[1]->SLOT[SLOT4] , cch[1]->fc , cch[1]->kcode ); - } - }else refresh_fc_eg_chan( cch[1] ); - refresh_fc_eg_chan( cch[2] ); - refresh_fc_eg_chan( cch[3] ); - - /* buffering */ - for(i=0; i < length ; i++) - { - - advance_lfo(OPN); - - /* clear output acc. */ - out_adpcm[OUTD_LEFT] = out_adpcm[OUTD_RIGHT]= out_adpcm[OUTD_CENTER] = 0; - out_delta[OUTD_LEFT] = out_delta[OUTD_RIGHT]= out_delta[OUTD_CENTER] = 0; - /* clear outputs */ - out_fm[1] = 0; - out_fm[2] = 0; - out_fm[4] = 0; - out_fm[5] = 0; - - /* advance envelope generator */ - OPN->eg_timer += OPN->eg_timer_add; - while (OPN->eg_timer >= OPN->eg_timer_overflow) - { - OPN->eg_timer -= OPN->eg_timer_overflow; - OPN->eg_cnt++; - - advance_eg_channel(OPN, &cch[0]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[1]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[2]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[3]->SLOT[SLOT1]); - } - - /* calculate FM */ - chan_calc(OPN, cch[0] ); /*remapped to 1*/ - chan_calc(OPN, cch[1] ); /*remapped to 2*/ - chan_calc(OPN, cch[2] ); /*remapped to 4*/ - chan_calc(OPN, cch[3] ); /*remapped to 5*/ - - /* deltaT ADPCM */ - if( DELTAT->portstate&0x80 ) - YM_DELTAT_ADPCM_CALC(DELTAT); - - /* ADPCMA */ - for( j = 0; j < 6; j++ ) - { - if( F2610->adpcm[j].flag ) - ADPCMA_calc_chan( F2610, &F2610->adpcm[j]); - } - - /* buffering */ - { - int lt,rt; - - lt = out_adpcm[OUTD_LEFT] + out_adpcm[OUTD_CENTER]; - rt = out_adpcm[OUTD_RIGHT] + out_adpcm[OUTD_CENTER]; - lt += (out_delta[OUTD_LEFT] + out_delta[OUTD_CENTER])>>9; - rt += (out_delta[OUTD_RIGHT] + out_delta[OUTD_CENTER])>>9; - - - lt += ((out_fm[1]>>1) & OPN->pan[2]); /* the shift right was verified on real chip */ - rt += ((out_fm[1]>>1) & OPN->pan[3]); - lt += ((out_fm[2]>>1) & OPN->pan[4]); - rt += ((out_fm[2]>>1) & OPN->pan[5]); - - lt += ((out_fm[4]>>1) & OPN->pan[8]); - rt += ((out_fm[4]>>1) & OPN->pan[9]); - lt += ((out_fm[5]>>1) & OPN->pan[10]); - rt += ((out_fm[5]>>1) & OPN->pan[11]); - - - lt >>= FINAL_SH; - rt >>= FINAL_SH; - - Limit( lt, MAXOUT, MINOUT ); - Limit( rt, MAXOUT, MINOUT ); - - #ifdef SAVE_SAMPLE - SAVE_ALL_CHANNELS - #endif - - /* buffering */ - bufL[i] = lt; - bufR[i] = rt; - } - - /* timer A control */ - INTERNAL_TIMER_A( &OPN->ST , cch[1] ) - } - INTERNAL_TIMER_B(&OPN->ST,length) - -} - -#if BUILD_YM2610B -/* Generate samples for one of the YM2610Bs */ -void YM2610BUpdateOne(void *chip, FMSAMPLE **buffer, int length) -{ - YM2610 *F2610 = chip; - FM_OPN *OPN = &F2610->OPN; - YM_DELTAT *DELTAT = &F2610->deltaT; - int i,j; - FMSAMPLE *bufL,*bufR; - FM_CH *cch[6]; - - /* buffer setup */ - bufL = buffer[0]; - bufR = buffer[1]; - - cch[0] = &F2610->CH[0]; - cch[1] = &F2610->CH[1]; - cch[2] = &F2610->CH[2]; - cch[3] = &F2610->CH[3]; - cch[4] = &F2610->CH[4]; - cch[5] = &F2610->CH[5]; - /* setup adpcm rom address */ - pcmbufA = F2610->pcmbuf; - pcmsizeA = F2610->pcm_size; - - /* refresh PG and EG */ - refresh_fc_eg_chan( cch[0] ); - refresh_fc_eg_chan( cch[1] ); - if( (OPN->ST.mode & 0xc0) ) - { - /* 3SLOT MODE */ - if( cch[2]->SLOT[SLOT1].Incr==-1) - { - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT1] , OPN->SL3.fc[1] , OPN->SL3.kcode[1] ); - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT2] , OPN->SL3.fc[2] , OPN->SL3.kcode[2] ); - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT3] , OPN->SL3.fc[0] , OPN->SL3.kcode[0] ); - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT4] , cch[2]->fc , cch[2]->kcode ); - } - }else refresh_fc_eg_chan( cch[2] ); - refresh_fc_eg_chan( cch[3] ); - refresh_fc_eg_chan( cch[4] ); - refresh_fc_eg_chan( cch[5] ); - - /* buffering */ - for(i=0; i < length ; i++) - { - - advance_lfo(OPN); - - /* clear output acc. */ - out_adpcm[OUTD_LEFT] = out_adpcm[OUTD_RIGHT]= out_adpcm[OUTD_CENTER] = 0; - out_delta[OUTD_LEFT] = out_delta[OUTD_RIGHT]= out_delta[OUTD_CENTER] = 0; - /* clear outputs */ - out_fm[0] = 0; - out_fm[1] = 0; - out_fm[2] = 0; - out_fm[3] = 0; - out_fm[4] = 0; - out_fm[5] = 0; - - /* advance envelope generator */ - OPN->eg_timer += OPN->eg_timer_add; - while (OPN->eg_timer >= OPN->eg_timer_overflow) - { - OPN->eg_timer -= OPN->eg_timer_overflow; - OPN->eg_cnt++; - - advance_eg_channel(OPN, &cch[0]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[1]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[2]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[3]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[4]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[5]->SLOT[SLOT1]); - } - - /* calculate FM */ - chan_calc(OPN, cch[0] ); - chan_calc(OPN, cch[1] ); - chan_calc(OPN, cch[2] ); - chan_calc(OPN, cch[3] ); - chan_calc(OPN, cch[4] ); - chan_calc(OPN, cch[5] ); - - /* deltaT ADPCM */ - if( DELTAT->portstate&0x80 ) - YM_DELTAT_ADPCM_CALC(DELTAT); - - /* ADPCMA */ - for( j = 0; j < 6; j++ ) - { - if( F2610->adpcm[j].flag ) - ADPCMA_calc_chan( F2610, &F2610->adpcm[j]); - } - - /* buffering */ - { - int lt,rt; - - lt = out_adpcm[OUTD_LEFT] + out_adpcm[OUTD_CENTER]; - rt = out_adpcm[OUTD_RIGHT] + out_adpcm[OUTD_CENTER]; - lt += (out_delta[OUTD_LEFT] + out_delta[OUTD_CENTER])>>9; - rt += (out_delta[OUTD_RIGHT] + out_delta[OUTD_CENTER])>>9; - - lt += ((out_fm[0]>>1) & OPN->pan[0]); /* the shift right is verified on YM2610 */ - rt += ((out_fm[0]>>1) & OPN->pan[1]); - lt += ((out_fm[1]>>1) & OPN->pan[2]); - rt += ((out_fm[1]>>1) & OPN->pan[3]); - lt += ((out_fm[2]>>1) & OPN->pan[4]); - rt += ((out_fm[2]>>1) & OPN->pan[5]); - lt += ((out_fm[3]>>1) & OPN->pan[6]); - rt += ((out_fm[3]>>1) & OPN->pan[7]); - lt += ((out_fm[4]>>1) & OPN->pan[8]); - rt += ((out_fm[4]>>1) & OPN->pan[9]); - lt += ((out_fm[5]>>1) & OPN->pan[10]); - rt += ((out_fm[5]>>1) & OPN->pan[11]); - - - lt >>= FINAL_SH; - rt >>= FINAL_SH; - - Limit( lt, MAXOUT, MINOUT ); - Limit( rt, MAXOUT, MINOUT ); - - #ifdef SAVE_SAMPLE - SAVE_ALL_CHANNELS - #endif - - /* buffering */ - bufL[i] = lt; - bufR[i] = rt; - } - - /* timer A control */ - INTERNAL_TIMER_A( &OPN->ST , cch[2] ) - } - INTERNAL_TIMER_B(&OPN->ST,length) - -} -#endif /* BUILD_YM2610B */ - - -#ifdef __STATE_H__ -void YM2610Postload(void *chip) -{ - if (chip) - { - YM2610 *F2610 = (YM2610 *)chip; - int r; - - /* SSG registers */ - for(r=0;r<16;r++) - { - (*F2610->OPN.ST.SSG->write)(F2610->OPN.ST.param,0,r); - (*F2610->OPN.ST.SSG->write)(F2610->OPN.ST.param,1,F2610->REGS[r]); - } - - /* OPN registers */ - /* DT / MULTI , TL , KS / AR , AMON / DR , SR , SL / RR , SSG-EG */ - for(r=0x30;r<0x9e;r++) - if((r&3) != 3) - { - OPNWriteReg(&F2610->OPN,r,F2610->REGS[r]); - OPNWriteReg(&F2610->OPN,r|0x100,F2610->REGS[r|0x100]); - } - /* FB / CONNECT , L / R / AMS / PMS */ - for(r=0xb0;r<0xb6;r++) - if((r&3) != 3) - { - OPNWriteReg(&F2610->OPN,r,F2610->REGS[r]); - OPNWriteReg(&F2610->OPN,r|0x100,F2610->REGS[r|0x100]); - } - /* FM channels */ - /*FM_channel_postload(F2610->CH,6);*/ - - /* rhythm(ADPCMA) */ - FM_ADPCMAWrite(F2610,1,F2610->REGS[0x101]); - for( r=0 ; r<6 ; r++) - { - FM_ADPCMAWrite(F2610,r+0x08,F2610->REGS[r+0x108]); - FM_ADPCMAWrite(F2610,r+0x10,F2610->REGS[r+0x110]); - FM_ADPCMAWrite(F2610,r+0x18,F2610->REGS[r+0x118]); - FM_ADPCMAWrite(F2610,r+0x20,F2610->REGS[r+0x120]); - FM_ADPCMAWrite(F2610,r+0x28,F2610->REGS[r+0x128]); - } - /* Delta-T ADPCM unit */ - YM_DELTAT_postload(&F2610->deltaT , &F2610->REGS[0x010] ); - } -} - -static void YM2610_save_state(YM2610 *F2610, int index) -{ - static const char statename[] = "YM2610"; - - state_save_register_item_array(statename, index, F2610->REGS); - FMsave_state_st(statename,index,&F2610->OPN.ST); - FMsave_state_channel(statename,index,F2610->CH,6); - /* 3slots */ - state_save_register_item_array(statename, index, F2610->OPN.SL3.fc); - state_save_register_item(statename, index, F2610->OPN.SL3.fn_h); - state_save_register_item_array(statename, index, F2610->OPN.SL3.kcode); - /* address register1 */ - state_save_register_item(statename, index, F2610->addr_A1); - - state_save_register_item(statename, index, F2610->adpcm_arrivedEndAddress); - /* rythm(ADPCMA) */ - FMsave_state_adpcma(statename,index,F2610->adpcm); - /* Delta-T ADPCM unit */ - YM_DELTAT_savestate(statename,index,&F2610->deltaT); -} -#endif /* _STATE_H */ - -static void YM2610_deltat_status_set(void *chip, UINT8 changebits) -{ - YM2610 *F2610 = chip; - F2610->adpcm_arrivedEndAddress |= changebits; -} -static void YM2610_deltat_status_reset(void *chip, UINT8 changebits) -{ - YM2610 *F2610 = chip; - F2610->adpcm_arrivedEndAddress &= (~changebits); -} - -void *YM2610Init(void *param, int index, int clock, int rate, - void *pcmroma,int pcmsizea,void *pcmromb,int pcmsizeb, - FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const struct ssg_callbacks *ssg) - -{ - YM2610 *F2610; - - /* allocate extend state space */ - if( (F2610 = (YM2610 *)malloc(sizeof(YM2610)))==NULL) - return NULL; - /* clear */ - memset(F2610,0,sizeof(YM2610)); - /* allocate total level table (128kb space) */ - if( !init_tables() ) - { - free( F2610 ); - return NULL; - } - - /* FM */ - F2610->OPN.ST.param = param; - F2610->OPN.type = TYPE_YM2610; - F2610->OPN.P_CH = F2610->CH; - F2610->OPN.ST.clock = clock; - F2610->OPN.ST.rate = rate; - /* Extend handler */ - F2610->OPN.ST.Timer_Handler = TimerHandler; - F2610->OPN.ST.IRQ_Handler = IRQHandler; - F2610->OPN.ST.SSG = ssg; - /* ADPCM */ - F2610->pcmbuf = (UINT8 *)pcmroma; - F2610->pcm_size = pcmsizea; - /* DELTA-T */ - F2610->deltaT.memory = (UINT8 *)pcmromb; - F2610->deltaT.memory_size = pcmsizeb; - - F2610->deltaT.status_set_handler = YM2610_deltat_status_set; - F2610->deltaT.status_reset_handler = YM2610_deltat_status_reset; - F2610->deltaT.status_change_which_chip = F2610; - F2610->deltaT.status_change_EOS_bit = 0x80; /* status flag: set bit7 on End Of Sample */ - - YM2610ResetChip(F2610); - - Init_ADPCMATable(); -#ifdef __STATE_H__ - YM2610_save_state(F2610, index); -#endif - return F2610; -} - -/* shut down emulator */ -void YM2610Shutdown(void *chip) -{ - YM2610 *F2610 = chip; - - FMCloseTable(); - free(F2610); -} - -/* reset one of chip */ -void YM2610ResetChip(void *chip) -{ - int i; - YM2610 *F2610 = chip; - FM_OPN *OPN = &F2610->OPN; - YM_DELTAT *DELTAT = &F2610->deltaT; - - /* Reset Prescaler */ - OPNSetPres( OPN, 6*24, 6*24, 4*2); /* OPN 1/6 , SSG 1/4 */ - /* reset SSG section */ - (*OPN->ST.SSG->reset)(OPN->ST.param); - /* status clear */ - FM_IRQMASK_SET(&OPN->ST,0x03); - FM_BUSY_CLEAR(&OPN->ST); - OPNWriteMode(OPN,0x27,0x30); /* mode 0 , timer reset */ - - OPN->eg_timer = 0; - OPN->eg_cnt = 0; - - FM_STATUS_RESET(&OPN->ST, 0xff); - - reset_channels( &OPN->ST , F2610->CH , 6 ); - /* reset OPerator paramater */ - for(i = 0xb6 ; i >= 0xb4 ; i-- ) - { - OPNWriteReg(OPN,i ,0xc0); - OPNWriteReg(OPN,i|0x100,0xc0); - } - for(i = 0xb2 ; i >= 0x30 ; i-- ) - { - OPNWriteReg(OPN,i ,0); - OPNWriteReg(OPN,i|0x100,0); - } - for(i = 0x26 ; i >= 0x20 ; i-- ) OPNWriteReg(OPN,i,0); - /**** ADPCM work initial ****/ - for( i = 0; i < 6 ; i++ ){ - F2610->adpcm[i].step = (UINT32)((float)(1<OPN.ST.freqbase)/3.0); - F2610->adpcm[i].now_addr = 0; - F2610->adpcm[i].now_step = 0; - F2610->adpcm[i].start = 0; - F2610->adpcm[i].end = 0; - /* F2610->adpcm[i].delta = 21866; */ - F2610->adpcm[i].vol_mul = 0; - F2610->adpcm[i].pan = &out_adpcm[OUTD_CENTER]; /* default center */ - F2610->adpcm[i].flagMask = 1<adpcm[i].flag = 0; - F2610->adpcm[i].adpcm_acc = 0; - F2610->adpcm[i].adpcm_step= 0; - F2610->adpcm[i].adpcm_out = 0; - } - F2610->adpcmTL = 0x3f; - - F2610->adpcm_arrivedEndAddress = 0; - - /* DELTA-T unit */ - DELTAT->freqbase = OPN->ST.freqbase; - DELTAT->output_pointer = out_delta; - DELTAT->portshift = 8; /* allways 8bits shift */ - DELTAT->output_range = 1<<23; - YM_DELTAT_ADPCM_Reset(DELTAT,OUTD_CENTER,YM_DELTAT_EMULATION_MODE_YM2610); -} - -/* YM2610 write */ -/* n = number */ -/* a = address */ -/* v = value */ -int YM2610Write(void *chip, int a, UINT8 v) -{ - YM2610 *F2610 = chip; - FM_OPN *OPN = &F2610->OPN; - int addr; - int ch; - - v &= 0xff; /* adjust to 8 bit bus */ - - switch( a&3 ){ - case 0: /* address port 0 */ - OPN->ST.address = v; - F2610->addr_A1 = 0; - - /* Write register to SSG emulator */ - if( v < 16 ) (*OPN->ST.SSG->write)(OPN->ST.param,0,v); - break; - - case 1: /* data port 0 */ - if (F2610->addr_A1 != 0) - break; /* verified on real YM2608 */ - - addr = OPN->ST.address; - F2610->REGS[addr] = v; - switch(addr & 0xf0) - { - case 0x00: /* SSG section */ - /* Write data to SSG emulator */ - (*OPN->ST.SSG->write)(OPN->ST.param,a,v); - break; - case 0x10: /* DeltaT ADPCM */ - YM2610UpdateReq(OPN->ST.param); - - switch(addr) - { - case 0x10: /* control 1 */ - case 0x11: /* control 2 */ - case 0x12: /* start address L */ - case 0x13: /* start address H */ - case 0x14: /* stop address L */ - case 0x15: /* stop address H */ - - case 0x19: /* delta-n L */ - case 0x1a: /* delta-n H */ - case 0x1b: /* volume */ + case 0xb0: + switch( OPN_SLOT(r) ){ + case 0: /* 0xb0-0xb2 : FB,ALGO */ { - YM_DELTAT_ADPCM_Write(&F2610->deltaT,addr-0x10,v); + int feedback = (v>>3)&7; + CH->ALGO = v&7; + CH->FB = feedback ? feedback+6 : 0; + setup_connection( CH, c ); } - break; + break; + case 1: /* 0xb4-0xb6 : L , R , AMS , PMS (ym2612/YM2610B/YM2610/YM2608) */ + /* b0-2 PMS */ + CH->pms = (v & 7) * 32; /* CH->pms = PM depth * 32 (index in lfo_pm_table) */ - case 0x1c: /* FLAG CONTROL : Extend Status Clear/Mask */ - { - UINT8 statusmask = ~v; - /* set arrived flag mask */ - for(ch=0;ch<6;ch++) - F2610->adpcm[ch].flagMask = statusmask&(1<ams = lfo_ams_depth_shift[(v>>4) & 0x03]; - F2610->deltaT.status_change_EOS_bit = statusmask & 0x80; /* status flag: set bit7 on End Of Sample */ + /* PAN : b7 = L, b6 = R */ + ym2612.OPN.pan[ c*2 ] = (v & 0x80) ? ~0 : 0; + ym2612.OPN.pan[ c*2+1 ] = (v & 0x40) ? ~0 : 0; - /* clear arrived flag */ - F2610->adpcm_arrivedEndAddress &= statusmask; - } - break; - - default: - logerror("YM2610: write to unknown deltat register %02x val=%02x\n",addr,v); - break; + break; } - break; - case 0x20: /* Mode Register */ - YM2610UpdateReq(OPN->ST.param); - OPNWriteMode(OPN,addr,v); - break; - default: /* OPN section */ - YM2610UpdateReq(OPN->ST.param); - /* write register */ - OPNWriteReg(OPN,addr,v); - } - break; - - case 2: /* address port 1 */ - OPN->ST.address = v; - F2610->addr_A1 = 1; - break; - - case 3: /* data port 1 */ - if (F2610->addr_A1 != 1) - break; /* verified on real YM2608 */ - - YM2610UpdateReq(OPN->ST.param); - addr = OPN->ST.address; - F2610->REGS[addr | 0x100] = v; - if( addr < 0x30 ) - /* 100-12f : ADPCM A section */ - FM_ADPCMAWrite(F2610,addr,v); - else - OPNWriteReg(OPN,addr | 0x100,v); } - return OPN->ST.irq; } -UINT8 YM2610Read(void *chip,int a) +/* Generate 32bits samples for ym2612 */ +static long dac; +int int_cnt; // Interpolation calculation + +void YM2612UpdateOne(int **buffer, int length) { - YM2610 *F2610 = chip; - int addr = F2610->OPN.ST.address; - UINT8 ret = 0; - - switch( a&3){ - case 0: /* status 0 : YM2203 compatible */ - ret = FM_STATUS_FLAG(&F2610->OPN.ST) & 0x83; - break; - case 1: /* data 0 */ - if( addr < 16 ) ret = (*F2610->OPN.ST.SSG->read)(F2610->OPN.ST.param); - if( addr == 0xff ) ret = 0x01; - break; - case 2: /* status 1 : ADPCM status */ - /* ADPCM STATUS (arrived End Address) */ - /* B,--,A5,A4,A3,A2,A1,A0 */ - /* B = ADPCM-B(DELTA-T) arrived end address */ - /* A0-A5 = ADPCM-A arrived end address */ - ret = F2610->adpcm_arrivedEndAddress; - break; - case 3: - ret = 0; - break; - } - return ret; -} - -int YM2610TimerOver(void *chip,int c) -{ - YM2610 *F2610 = chip; - - if( c ) - { /* Timer B */ - TimerBOver( &(F2610->OPN.ST) ); - } - else - { /* Timer A */ - YM2610UpdateReq(F2610->OPN.ST.param); - /* timer update */ - TimerAOver( &(F2610->OPN.ST) ); - /* CSM mode key,TL controll */ - if( F2610->OPN.ST.mode & 0x80 ) - { /* CSM mode total level latch and auto key on */ - CSMKeyControll( &(F2610->CH[2]) ); - } - } - return F2610->OPN.ST.irq; -} - -#endif /* (BUILD_YM2610||BUILD_YM2610B) */ - - - -#if BUILD_YM2612 -/*******************************************************************************/ -/* YM2612 local section */ -/*******************************************************************************/ -/* here's the virtual YM2612 */ -typedef struct -{ - UINT8 REGS[512]; /* registers */ - FM_OPN OPN; /* OPN state */ - FM_CH CH[6]; /* channel state */ - UINT8 addr_A1; /* address line A1 */ - - /* dac output (YM2612) */ - int dacen; - INT32 dacout; -} YM2612; - -static int dacen; -static long dac_highpass; -/* Generate samples for one of the YM2612s */ -void YM2612UpdateOne(void *chip, FMSAMPLE **buffer, int length) -{ - YM2612 *F2612 = chip; - FM_OPN *OPN = &F2612->OPN; int i; - FMSAMPLE *bufL,*bufR; - INT32 dacout = F2612->dacout; - FM_CH *cch[6]; + int *bufL,*bufR; + int lt,rt; /* set buffer */ bufL = buffer[0]; bufR = buffer[1]; - cch[0] = &F2612->CH[0]; - cch[1] = &F2612->CH[1]; - cch[2] = &F2612->CH[2]; - cch[3] = &F2612->CH[3]; - cch[4] = &F2612->CH[4]; - cch[5] = &F2612->CH[5]; - /* DAC mode */ - dacen = F2612->dacen; - /* refresh PG and EG */ - refresh_fc_eg_chan( cch[0] ); - refresh_fc_eg_chan( cch[1] ); - if( (OPN->ST.mode & 0xc0) ) + refresh_fc_eg_chan(&ym2612.CH[0]); + refresh_fc_eg_chan(&ym2612.CH[1]); + + if (ym2612.OPN.ST.mode & 0xC0) { - /* 3SLOT MODE */ - if( cch[2]->SLOT[SLOT1].Incr==-1) + /* 3SLOT MODE (operator order is 0,1,3,2) */ + if(ym2612.CH[2].SLOT[SLOT1].Incr==-1) { - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT1] , OPN->SL3.fc[1] , OPN->SL3.kcode[1] ); - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT2] , OPN->SL3.fc[2] , OPN->SL3.kcode[2] ); - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT3] , OPN->SL3.fc[0] , OPN->SL3.kcode[0] ); - refresh_fc_eg_slot(&cch[2]->SLOT[SLOT4] , cch[2]->fc , cch[2]->kcode ); + refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT1] , ym2612.OPN.SL3.fc[1] , ym2612.OPN.SL3.kcode[1] ); + refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT2] , ym2612.OPN.SL3.fc[2] , ym2612.OPN.SL3.kcode[2] ); + refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT3] , ym2612.OPN.SL3.fc[0] , ym2612.OPN.SL3.kcode[0] ); + refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT4] , ym2612.CH[2].fc , ym2612.CH[2].kcode ); } - }else refresh_fc_eg_chan( cch[2] ); - refresh_fc_eg_chan( cch[3] ); - refresh_fc_eg_chan( cch[4] ); - refresh_fc_eg_chan( cch[5] ); + } + else refresh_fc_eg_chan(&ym2612.CH[2]); + + refresh_fc_eg_chan(&ym2612.CH[3]); + refresh_fc_eg_chan(&ym2612.CH[4]); + refresh_fc_eg_chan(&ym2612.CH[5]); + + int_cnt = ym2612.OPN.ST.Inter_Cnt; /* buffering */ for(i=0; i < length ; i++) { - - advance_lfo(OPN); + advance_lfo(); /* clear outputs */ out_fm[0] = 0; @@ -4442,304 +1788,234 @@ void YM2612UpdateOne(void *chip, FMSAMPLE **buffer, int length) out_fm[5] = 0; /* advance envelope generator */ - OPN->eg_timer += OPN->eg_timer_add; - while (OPN->eg_timer >= OPN->eg_timer_overflow) + ym2612.OPN.eg_timer += ym2612.OPN.eg_timer_add; + while (ym2612.OPN.eg_timer >= ym2612.OPN.eg_timer_overflow) { - OPN->eg_timer -= OPN->eg_timer_overflow; - OPN->eg_cnt++; + ym2612.OPN.eg_timer -= ym2612.OPN.eg_timer_overflow; + ym2612.OPN.eg_cnt++; - advance_eg_channel(OPN, &cch[0]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[1]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[2]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[3]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[4]->SLOT[SLOT1]); - advance_eg_channel(OPN, &cch[5]->SLOT[SLOT1]); + advance_eg_channel(&ym2612.CH[0].SLOT[SLOT1]); + advance_eg_channel(&ym2612.CH[1].SLOT[SLOT1]); + advance_eg_channel(&ym2612.CH[2].SLOT[SLOT1]); + advance_eg_channel(&ym2612.CH[3].SLOT[SLOT1]); + advance_eg_channel(&ym2612.CH[4].SLOT[SLOT1]); + advance_eg_channel(&ym2612.CH[5].SLOT[SLOT1]); } /* calculate FM */ - chan_calc(OPN, cch[0] ); - chan_calc(OPN, cch[1] ); - chan_calc(OPN, cch[2] ); - chan_calc(OPN, cch[3] ); - chan_calc(OPN, cch[4] ); - if (dacen) + chan_calc(&ym2612.CH[0]); + chan_calc(&ym2612.CH[1]); + chan_calc(&ym2612.CH[2]); + chan_calc(&ym2612.CH[3]); + chan_calc(&ym2612.CH[4]); + + /* DAC Mode */ + if (ym2612.dacen) { - long dac = (dacout << 15) - dac_highpass; + /* High Pass Filter */ + dac = (ym2612.dacout << 15) - dac_highpass; dac_highpass += dac >> 9; dac >>= 15; - *cch[5]->connect4 += dac; + *(ym2612.CH[5].connect4) += (int)dac;/**/ } - else chan_calc(OPN, cch[5] ); + else chan_calc(&ym2612.CH[5]); + if (config.hq_fm) { - int lt,rt; + if ((int_cnt += ym2612.OPN.ST.Inter_Step) & 0x04000) + { + int_cnt &= 0x3FFF; + old_out_fm[0] = (((int_cnt ^ 0x3FFF) * out_fm[0]) + (int_cnt * old_out_fm[0])) >> 14; + old_out_fm[1] = (((int_cnt ^ 0x3FFF) * out_fm[1]) + (int_cnt * old_out_fm[1])) >> 14; + old_out_fm[2] = (((int_cnt ^ 0x3FFF) * out_fm[2]) + (int_cnt * old_out_fm[2])) >> 14; + old_out_fm[3] = (((int_cnt ^ 0x3FFF) * out_fm[3]) + (int_cnt * old_out_fm[3])) >> 14; + old_out_fm[4] = (((int_cnt ^ 0x3FFF) * out_fm[4]) + (int_cnt * old_out_fm[4])) >> 14; + old_out_fm[5] = (((int_cnt ^ 0x3FFF) * out_fm[5]) + (int_cnt * old_out_fm[5])) >> 14; - lt = ((out_fm[0]>>0) & OPN->pan[0]); - rt = ((out_fm[0]>>0) & OPN->pan[1]); - lt += ((out_fm[1]>>0) & OPN->pan[2]); - rt += ((out_fm[1]>>0) & OPN->pan[3]); - lt += ((out_fm[2]>>0) & OPN->pan[4]); - rt += ((out_fm[2]>>0) & OPN->pan[5]); - lt += ((out_fm[3]>>0) & OPN->pan[6]); - rt += ((out_fm[3]>>0) & OPN->pan[7]); - lt += ((out_fm[4]>>0) & OPN->pan[8]); - rt += ((out_fm[4]>>0) & OPN->pan[9]); - lt += ((out_fm[5]>>0) & OPN->pan[10]); - rt += ((out_fm[5]>>0) & OPN->pan[11]); + lt = ((old_out_fm[0]>>0) & ym2612.OPN.pan[0]); + rt = ((old_out_fm[0]>>0) & ym2612.OPN.pan[1]); + lt += ((old_out_fm[1]>>0) & ym2612.OPN.pan[2]); + rt += ((old_out_fm[1]>>0) & ym2612.OPN.pan[3]); + lt += ((old_out_fm[2]>>0) & ym2612.OPN.pan[4]); + rt += ((old_out_fm[2]>>0) & ym2612.OPN.pan[5]); + lt += ((old_out_fm[3]>>0) & ym2612.OPN.pan[6]); + rt += ((old_out_fm[3]>>0) & ym2612.OPN.pan[7]); + lt += ((old_out_fm[4]>>0) & ym2612.OPN.pan[8]); + rt += ((old_out_fm[4]>>0) & ym2612.OPN.pan[9]); + lt += ((old_out_fm[5]>>0) & ym2612.OPN.pan[10]); + rt += ((old_out_fm[5]>>0) & ym2612.OPN.pan[11]); + /* limiter */ + Limit(lt,MAXOUT,MINOUT); + Limit(rt,MAXOUT,MINOUT); - lt >>= FINAL_SH; - rt >>= FINAL_SH; + /* buffering */ + bufL[i] = lt; + bufR[i] = rt; - Limit( lt, MAXOUT, MINOUT ); - Limit( rt, MAXOUT, MINOUT ); + /* timer A control */ + INTERNAL_TIMER_A(); + } + else i--; - #ifdef SAVE_SAMPLE - SAVE_ALL_CHANNELS - #endif - - /* buffering */ - bufL[i] = lt; - bufR[i] = rt; + old_out_fm[0] = out_fm[0]; + old_out_fm[1] = out_fm[1]; + old_out_fm[2] = out_fm[2]; + old_out_fm[3] = out_fm[3]; + old_out_fm[4] = out_fm[4]; + old_out_fm[5] = out_fm[5]; } + else + { + lt = ((out_fm[0]>>0) & ym2612.OPN.pan[0]); + rt = ((out_fm[0]>>0) & ym2612.OPN.pan[1]); + lt += ((out_fm[1]>>0) & ym2612.OPN.pan[2]); + rt += ((out_fm[1]>>0) & ym2612.OPN.pan[3]); + lt += ((out_fm[2]>>0) & ym2612.OPN.pan[4]); + rt += ((out_fm[2]>>0) & ym2612.OPN.pan[5]); + lt += ((out_fm[3]>>0) & ym2612.OPN.pan[6]); + rt += ((out_fm[3]>>0) & ym2612.OPN.pan[7]); + lt += ((out_fm[4]>>0) & ym2612.OPN.pan[8]); + rt += ((out_fm[4]>>0) & ym2612.OPN.pan[9]); + lt += ((out_fm[5]>>0) & ym2612.OPN.pan[10]); + rt += ((out_fm[5]>>0) & ym2612.OPN.pan[11]); - /* timer A control */ - INTERNAL_TIMER_A( &OPN->ST , cch[2] ) - } - INTERNAL_TIMER_B(&OPN->ST,length) + /* limiter */ + Limit(lt,MAXOUT,MINOUT); + Limit(rt,MAXOUT,MINOUT); + + /* buffering */ + bufL[i] = lt; + bufR[i] = rt; + + /* timer A control */ + INTERNAL_TIMER_A(); + } + } + + INTERNAL_TIMER_B(length); + + ym2612.OPN.ST.Inter_Cnt = int_cnt; } -#ifdef __STATE_H__ -void YM2612Postload(void *chip) +/* initialize ym2612 emulator(s) */ +int YM2612Init(int clock, int rate) { - if (chip) - { - YM2612 *F2612 = (YM2612 *)chip; - int r; - - /* DAC data & port */ - F2612->dacout = ((int)F2612->REGS[0x2a] - 0x80) << 0; /* level unknown */ - F2612->dacen = F2612->REGS[0x2d] & 0x80; - /* OPN registers */ - /* DT / MULTI , TL , KS / AR , AMON / DR , SR , SL / RR , SSG-EG */ - for(r=0x30;r<0x9e;r++) - if((r&3) != 3) - { - OPNWriteReg(&F2612->OPN,r,F2612->REGS[r]); - OPNWriteReg(&F2612->OPN,r|0x100,F2612->REGS[r|0x100]); - } - /* FB / CONNECT , L / R / AMS / PMS */ - for(r=0xb0;r<0xb6;r++) - if((r&3) != 3) - { - OPNWriteReg(&F2612->OPN,r,F2612->REGS[r]); - OPNWriteReg(&F2612->OPN,r|0x100,F2612->REGS[r|0x100]); - } - /* channels */ - /*FM_channel_postload(F2612->CH,6);*/ - } -} - -static void YM2612_save_state(YM2612 *F2612, int index) -{ - static const char statename[] = "YM2612"; - - state_save_register_item_array(statename, index, F2612->REGS); - FMsave_state_st(statename,index,&F2612->OPN.ST); - FMsave_state_channel(statename,index,F2612->CH,6); - /* 3slots */ - state_save_register_item_array(statename, index, F2612->OPN.SL3.fc); - state_save_register_item(statename, index, F2612->OPN.SL3.fn_h); - state_save_register_item_array(statename, index, F2612->OPN.SL3.kcode); - /* address register1 */ - state_save_register_item(statename, index, F2612->addr_A1); -} -#endif /* _STATE_H */ - -/* initialize YM2612 emulator(s) */ -void * YM2612Init(void *param, int index, int clock, int rate, - FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler) -{ - YM2612 *F2612; - - /* allocate extend state space */ - if( (F2612 = (YM2612 *)malloc(sizeof(YM2612)))==NULL) - return NULL; - /* clear */ - memset(F2612,0,sizeof(YM2612)); - /* allocate total level table (128kb space) */ - if( !init_tables() ) - { - free( F2612 ); - return NULL; - } - - F2612->OPN.ST.param = param; - F2612->OPN.type = TYPE_YM2612; - F2612->OPN.P_CH = F2612->CH; - F2612->OPN.ST.clock = clock; - F2612->OPN.ST.rate = rate; - /* F2612->OPN.ST.irq = 0; */ - /* F2612->OPN.ST.status = 0; */ - /* Extend handler */ - F2612->OPN.ST.Timer_Handler = TimerHandler; - F2612->OPN.ST.IRQ_Handler = IRQHandler; - YM2612ResetChip(F2612); - -#ifdef __STATE_H__ - YM2612_save_state(F2612, index); -#endif - return F2612; -} - -/* shut down emulator */ -void YM2612Shutdown(void *chip) -{ - YM2612 *F2612 = chip; - - FMCloseTable(); - free(F2612); -} - -/* reset one of chip */ -void YM2612ResetChip(void *chip) -{ - int i; - YM2612 *F2612 = chip; - FM_OPN *OPN = &F2612->OPN; - - OPNSetPres( OPN, 6*24, 6*24, 0); - /* status clear */ - FM_IRQMASK_SET(&OPN->ST,0x03); - FM_BUSY_CLEAR(&OPN->ST); - OPNWriteMode(OPN,0x27,0x30); /* mode 0 , timer reset */ - - OPN->eg_timer = 0; - OPN->eg_cnt = 0; - - FM_STATUS_RESET(&OPN->ST, 0xff); - - reset_channels( &OPN->ST , &F2612->CH[0] , 6 ); - for(i = 0xb6 ; i >= 0xb4 ; i-- ) - { - OPNWriteReg(OPN,i ,0xc0); - OPNWriteReg(OPN,i|0x100,0xc0); - } - for(i = 0xb2 ; i >= 0x30 ; i-- ) - { - OPNWriteReg(OPN,i ,0); - OPNWriteReg(OPN,i|0x100,0); - } - for(i = 0x26 ; i >= 0x20 ; i-- ) OPNWriteReg(OPN,i,0); - /* DAC mode clear */ - F2612->dacen = 0; - dac_highpass = 0; -} - -/* YM2612 write */ -/* n = number */ -/* a = address */ -/* v = value */ -int YM2612Write(void *chip, int a, UINT8 v) -{ - YM2612 *F2612 = chip; - int addr; - - v &= 0xff; /* adjust to 8 bit bus */ - - switch( a&3){ - case 0: /* address port 0 */ - F2612->OPN.ST.address = v; - F2612->addr_A1 = 0; - break; - - case 1: /* data port 0 */ - addr = F2612->OPN.ST.address; - F2612->REGS[addr] = v; - switch( addr & 0xf0 ) - { - case 0x20: /* 0x20-0x2f Mode */ - switch( addr ) - { - case 0x2a: /* DAC data (YM2612) */ - YM2612UpdateReq(F2612->OPN.ST.param); - F2612->dacout = ((int)v - 0x80) << 6; /* level unknown */ - break; - case 0x2b: /* DAC Sel (YM2612) */ - /* b7 = dac enable */ - F2612->dacen = v & 0x80; - break; - default: /* OPN section */ - YM2612UpdateReq(F2612->OPN.ST.param); - /* write register */ - OPNWriteMode(&(F2612->OPN),addr,v); - } - break; - default: /* 0x30-0xff OPN section */ - YM2612UpdateReq(F2612->OPN.ST.param); - /* write register */ - OPNWriteReg(&(F2612->OPN),addr,v); - } - break; - - case 2: /* address port 1 */ - F2612->OPN.ST.address = v; - F2612->addr_A1 = 1; - break; - - case 3: /* data port 1 */ - addr = F2612->OPN.ST.address; - F2612->REGS[addr | 0x100] = v; - YM2612UpdateReq(F2612->OPN.ST.param); - OPNWriteReg(&(F2612->OPN),addr | 0x100,v); - break; - } - return F2612->OPN.ST.irq; -} - -UINT8 YM2612Read(void *chip,int a) -{ - YM2612 *F2612 = chip; - - switch( a&3){ - case 0: /* status 0 */ - return FM_STATUS_FLAG(&F2612->OPN.ST); - case 1: - case 2: - case 3: -#if 0 - LOG(LOG_WAR,("YM2612 #%p:A=%d read unmapped area\n",F2612->OPN.ST.param,a)); -#endif - return FM_STATUS_FLAG(&F2612->OPN.ST); - } + memset(&ym2612,0,sizeof(YM2612)); + init_tables(); + ym2612.OPN.ST.clock = clock; + ym2612.OPN.ST.rate = rate; + YM2612ResetChip(); return 0; } -int YM2612TimerOver(void *chip,int c) +/* reset */ +int YM2612ResetChip(void) { - YM2612 *F2612 = chip; + int i; - if( c ) - { /* Timer B */ - TimerBOver( &(F2612->OPN.ST) ); + OPNSetPres(6*24); + OPNWriteMode(0x27,0x30); /* mode 0 , timer reset */ + + ym2612.OPN.eg_timer = 0; + ym2612.OPN.eg_cnt = 0; + ym2612.OPN.ST.status = 0; + ym2612.OPN.ST.mode = 0; + ym2612.OPN.ST.TA = 0; + ym2612.OPN.ST.TAL = 0; + ym2612.OPN.ST.TAC = 0; + ym2612.OPN.ST.TB = 0; + ym2612.OPN.ST.TBL = 0; + ym2612.OPN.ST.TBC = 0; + + + reset_channels(&ym2612.CH[0] , 6 ); + for(i = 0xb6 ; i >= 0xb4 ; i-- ) + { + OPNWriteReg(i ,0xc0); + OPNWriteReg(i|0x100,0xc0); } - else - { /* Timer A */ - YM2612UpdateReq(F2612->OPN.ST.param); - /* timer update */ - TimerAOver( &(F2612->OPN.ST) ); - /* CSM mode key,TL controll */ - if( F2612->OPN.ST.mode & 0x80 ) - { /* CSM mode total level latch and auto key on */ - CSMKeyControll( &(F2612->CH[2]) ); - } + for(i = 0xb2 ; i >= 0x30 ; i-- ) + { + OPNWriteReg(i ,0); + OPNWriteReg(i|0x100,0); } - return F2612->OPN.ST.irq; + for(i = 0x26 ; i >= 0x20 ; i-- ) OPNWriteReg(i,0); + + /* DAC mode clear */ + ym2612.dacen = 0; + ym2612.dacout = 0; + dac_highpass = 0; + + /* clear outputs */ + old_out_fm[0] = 0; + old_out_fm[1] = 0; + old_out_fm[2] = 0; + old_out_fm[3] = 0; + old_out_fm[4] = 0; + old_out_fm[5] = 0; + + return 0; } -void YM2612UpdateRequest(void *param) +/* ym2612 write */ +/* n = number */ +/* a = address */ +/* v = value */ +int YM2612Write(unsigned char a, unsigned char v) { + int addr; + + //v &= 0xff; /* adjust to 8 bit bus */ + + switch( a&3 ) + { + case 0: /* address port 0 */ + ym2612.OPN.ST.address[0] = v; + break; + + case 1: /* data port 0 */ + addr = ym2612.OPN.ST.address[0]; + fm_reg[0][addr] = v; + switch( addr & 0xf0 ) + { + case 0x20: /* 0x20-0x2f Mode */ + switch( addr ) + { + case 0x2a: /* DAC data (ym2612) */ + ym2612.dacout = ((int)v - 0x80) << 6; /* level unknown (5 is too low, 8 is too loud) */ + break; + case 0x2b: /* DAC Sel (ym2612) */ + /* b7 = dac enable */ + ym2612.dacen = v & 0x80; + break; + default: /* OPN section */ + /* write register */ + OPNWriteMode(addr,v); + } + break; + default: /* 0x30-0xff OPN section */ + /* write register */ + OPNWriteReg(addr,v); + } + break; + + case 2: /* address port 1 */ + ym2612.OPN.ST.address[1] = v; + break; + + case 3: /* data port 1 */ + addr = ym2612.OPN.ST.address[1]; + fm_reg[1][addr] = v; + OPNWriteReg(addr | 0x100,v); + break; + } + + return 0; } -#endif /* BUILD_YM2612 */ +int YM2612Read(void) +{ + return ym2612.OPN.ST.status; +} diff --git a/source/sound/fm.h b/source/sound/fm.h index 16ab0ec..9cfddd0 100644 --- a/source/sound/fm.h +++ b/source/sound/fm.h @@ -1,205 +1,29 @@ /* - File: fm.h -- header file for software emulation for FM sound generator - +** +** File: fm_ym2612.h -- header for ym2612.c +** software implementation of Yamaha FM sound generator +** +** Copyright (C) 2001, 2002, 2003 Jarek Burczynski (bujar at mame dot net) +** Copyright (C) 1998 Tatsuyuki Satoh , MultiArcadeMachineEmulator development +** +** Version 1.4 (final beta) +** */ + #ifndef _H_FM_FM_ #define _H_FM_FM_ -#define HAS_YM2612 1 -#include "shared.h" -/* --- select emulation chips --- */ -#define BUILD_YM2203 (HAS_YM2203) /* build YM2203(OPN) emulator */ -#define BUILD_YM2608 (HAS_YM2608) /* build YM2608(OPNA) emulator */ -#define BUILD_YM2610 (HAS_YM2610) /* build YM2610(OPNB) emulator */ -#define BUILD_YM2610B (HAS_YM2610B) /* build YM2610B(OPNB?)emulator */ -#define BUILD_YM2612 (HAS_YM2612 || HAS_YM3438) /* build YM2612(OPN2) emulator */ - -/* select bit size of output : 8 or 16 */ -#define FM_SAMPLE_BITS 16 - -/* select timer system internal or external */ -#define FM_INTERNAL_TIMER 0 - -/* --- speedup optimize --- */ -/* busy flag enulation , The definition of FM_GET_TIME_NOW() is necessary. */ -#define FM_BUSY_FLAG_SUPPORT 0 - -/* --- external SSG(YM2149/AY-3-8910)emulator interface port */ -/* used by YM2203,YM2608,and YM2610 */ -struct ssg_callbacks -{ - void (*set_clock)(void *param, int clock); - void (*write)(void *param, int address, int data); - int (*read)(void *param); - void (*reset)(void *param); -}; - -/* --- external callback funstions for realtime update --- */ - -/* for busy flag emulation , function FM_GET_TIME_NOW() should */ -/* return present time in seconds with "double" precision */ -/* in timer.c */ -#define FM_GET_TIME_NOW() timer_get_time() - -#if BUILD_YM2203 - /* in 2203intf.c */ - void YM2203UpdateRequest(void *param); - #define YM2203UpdateReq(chip) YM2203UpdateRequest(chip) -#endif -#if BUILD_YM2608 - /* in 2608intf.c */ - void YM2608UpdateRequest(void *param); - #define YM2608UpdateReq(chip) YM2608UpdateRequest(chip); -#endif -#if BUILD_YM2610 - /* in 2610intf.c */ - void YM2610UpdateRequest(void *param); - #define YM2610UpdateReq(chip) YM2610UpdateRequest(chip); -#endif -#if BUILD_YM2612 - /* in 2612intf.c */ - void YM2612UpdateRequest(void *param); - #define YM2612UpdateReq(chip) YM2612UpdateRequest(chip); -#endif /* compiler dependence */ -#if 0 -#ifndef OSD_CPU_H -#define OSD_CPU_H -typedef unsigned char UINT8; /* unsigned 8bit */ -typedef unsigned short UINT16; /* unsigned 16bit */ -typedef unsigned int UINT32; /* unsigned 32bit */ -typedef signed char INT8; /* signed 8bit */ -typedef signed short INT16; /* signed 16bit */ -typedef signed int INT32; /* signed 32bit */ -#endif -#endif - #ifndef INLINE #define INLINE static __inline__ #endif -typedef INT16 FMSAMPLE; -/* -#if (FM_SAMPLE_BITS==16) -typedef INT16 FMSAMPLE; -#endif -#if (FM_SAMPLE_BITS==8) -typedef unsigned char FMSAMPLE; -#endif -*/ - -typedef void (*FM_TIMERHANDLER)(void *param,int c,int cnt,double stepTime); -typedef void (*FM_IRQHANDLER)(void *param,int irq); -/* FM_TIMERHANDLER : Stop or Start timer */ -/* int n = chip number */ -/* int c = Channel 0=TimerA,1=TimerB */ -/* int count = timer count (0=stop) */ -/* doube stepTime = step time of one count (sec.)*/ - -/* FM_IRQHHANDLER : IRQ level changing sense */ -/* int n = chip number */ -/* int irq = IRQ level 0=OFF,1=ON */ - -#if BUILD_YM2203 -/* -------------------- YM2203(OPN) Interface -------------------- */ - -/* -** Initialize YM2203 emulator(s). -** -** 'num' is the number of virtual YM2203's to allocate -** 'baseclock' -** 'rate' is sampling rate -** 'TimerHandler' timer callback handler when timer start and clear -** 'IRQHandler' IRQ callback handler when changed IRQ level -** return 0 = success -*/ -void * YM2203Init(void *param, int index, int baseclock, int rate, - FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const struct ssg_callbacks *ssg); - -/* -** shutdown the YM2203 emulators -*/ -void YM2203Shutdown(void *chip); - -/* -** reset all chip registers for YM2203 number 'num' -*/ -void YM2203ResetChip(void *chip); - -/* -** update one of chip -*/ -void YM2203UpdateOne(void *chip, FMSAMPLE *buffer, int length); - -/* -** Write -** return : InterruptLevel -*/ -int YM2203Write(void *chip,int a,unsigned char v); - -/* -** Read -** return : InterruptLevel -*/ -unsigned char YM2203Read(void *chip,int a); - -/* -** Timer OverFlow -*/ -int YM2203TimerOver(void *chip, int c); - -/* -** State Save -*/ -void YM2203Postload(void *chip); -#endif /* BUILD_YM2203 */ - -#if BUILD_YM2608 -/* -------------------- YM2608(OPNA) Interface -------------------- */ -void * YM2608Init(void *param, int index, int baseclock, int rate, - void *pcmroma,int pcmsizea, - FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const struct ssg_callbacks *ssg); -void YM2608Shutdown(void *chip); -void YM2608ResetChip(void *chip); -void YM2608UpdateOne(void *chip, FMSAMPLE **buffer, int length); - -int YM2608Write(void *chip, int a,unsigned char v); -unsigned char YM2608Read(void *chip,int a); -int YM2608TimerOver(void *chip, int c ); -void YM2608Postload(void *chip); -#endif /* BUILD_YM2608 */ - -#if (BUILD_YM2610||BUILD_YM2610B) -/* -------------------- YM2610(OPNB) Interface -------------------- */ -void * YM2610Init(void *param, int index, int baseclock, int rate, - void *pcmroma,int pcmasize,void *pcmromb,int pcmbsize, - FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const struct ssg_callbacks *ssg); -void YM2610Shutdown(void *chip); -void YM2610ResetChip(void *chip); -void YM2610UpdateOne(void *chip, FMSAMPLE **buffer, int length); -#if BUILD_YM2610B -void YM2610BUpdateOne(void *chip, FMSAMPLE **buffer, int length); -#endif - -int YM2610Write(void *chip, int a,unsigned char v); -unsigned char YM2610Read(void *chip,int a); -int YM2610TimerOver(void *chip, int c ); -void YM2610Postload(void *chip); -#endif /* BUILD_YM2610 */ - -#if BUILD_YM2612 -void * YM2612Init(void *param, int index, int baseclock, int rate, - FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler); -void YM2612Shutdown(void *chip); -void YM2612ResetChip(void *chip); -void YM2612UpdateOne(void *chip, FMSAMPLE **buffer, int length); - -int YM2612Write(void *chip, int a,unsigned char v); -unsigned char YM2612Read(void *chip,int a); -int YM2612TimerOver(void *chip, int c ); -void YM2612Postload(void *chip); -#endif /* BUILD_YM2612 */ +extern int YM2612Init(int baseclock, int rate); +extern int YM2612ResetChip(void); +extern void YM2612UpdateOne(int **buffer, int length); +extern int YM2612Write(unsigned char a, unsigned char v); +extern int YM2612Read(void); #endif /* _H_FM_FM_ */ diff --git a/source/sound/sn76489.c b/source/sound/sn76489.c index 4ea0850..9ddf1b1 100644 --- a/source/sound/sn76489.c +++ b/source/sound/sn76489.c @@ -1,290 +1,291 @@ -/* - SN76489 emulation - by Maxim in 2001 and 2002 - converted from my original Delphi implementation - - I'm a C newbie so I'm sure there are loads of stupid things - in here which I'll come back to some day and redo - - Includes: - - Super-high quality tone channel "oversampling" by calculating fractional positions on transitions - - Noise output pattern reverse engineered from actual SMS output - - Volume levels taken from actual SMS output - - 07/08/04 Charles MacDonald - Modified for use with SMS Plus: - - Added support for multiple PSG chips. - - Added reset/config/update routines. - - Added context management routines. - - Removed SN76489_GetValues(). - - Removed some unused variables. - - 25/04/07 Eke-Eke - Modified for use with GenesisPlus Gamecube's port: - - made SN76489_Update outputs 16bits mono samples - - replaced volume table with VGM plugin's one -*/ - -#include "sn76489.h" -#include // for FLT_MIN -#include // for memcpy - -#define NoiseInitialState 0x8000 /* Initial state of shift register */ -#define PSG_CUTOFF 0x6 /* Value below which PSG does not output */ - -static const int PSGVolumeValues[2][16] = { - /* These values are taken from a real SMS2's output */ - {892,892,892,760,623,497,404,323,257,198,159,123,96,75,60,0}, /* I can't remember why 892... :P some scaling I did at some point */ - /* these values are true volumes for 2dB drops at each step (multiply previous by 10^-0.1), normalised at 760 */ - {1516,1205,957,760,603,479,381,303,240,191,152,120,96,76,60,0} -}; - -static SN76489_Context SN76489[MAX_SN76489]; - -void SN76489_Init(int which, int PSGClockValue, int SamplingRate) -{ - SN76489_Context *p = &SN76489[which]; - p->dClock=(float)PSGClockValue/16/SamplingRate; - SN76489_Config(which, MUTE_ALLON, VOL_FULL, FB_SEGAVDP, SRW_SEGAVDP, 1); - SN76489_Reset(which); -} - -void SN76489_Reset(int which) -{ - SN76489_Context *p = &SN76489[which]; - int i; - - p->PSGStereo = 0xFF; - - for(i = 0; i <= 3; i++) - { - /* Initialise PSG state */ - p->Registers[2*i] = 1; /* tone freq=1 */ - p->Registers[2*i+1] = 0xf; /* vol=off */ - p->NoiseFreq = 0x10; - - /* Set counters to 0 */ - p->ToneFreqVals[i] = 0; - - /* Set flip-flops to 1 */ - p->ToneFreqPos[i] = 1; - - /* Set intermediate positions to do-not-use value */ - p->IntermediatePos[i] = FLT_MIN; - - /* Set panning to centre */ - p->panning[0]=127; - } - - p->LatchedRegister=0; - - /* Initialise noise generator */ - p->NoiseShiftRegister=NoiseInitialState; - - /* Zero clock */ - p->Clock=0; - -} - -void SN76489_Shutdown(void) -{ -} - -void SN76489_Config(int which, int mute, int volume, int feedback, int sr_width, int boost_noise) -{ - SN76489_Context *p = &SN76489[which]; - - p->Mute = mute; - p->VolumeArray = volume; - p->WhiteNoiseFeedback = feedback; - p->SRWidth = sr_width; - p->BoostNoise = boost_noise; -} - -void SN76489_SetContext(int which, uint8 *data) -{ - memcpy(&SN76489[which], data, sizeof(SN76489_Context)); -} - -void SN76489_GetContext(int which, uint8 *data) -{ - memcpy(data, &SN76489[which], sizeof(SN76489_Context)); -} - -uint8 *SN76489_GetContextPtr(int which) -{ - return (uint8 *)&SN76489[which]; -} - -int SN76489_GetContextSize(void) -{ - return sizeof(SN76489_Context); -} - -void SN76489_Write(int which, int data) -{ - SN76489_Context *p = &SN76489[which]; - - if (data&0x80) { - /* Latch/data byte %1 cc t dddd */ - p->LatchedRegister=((data>>4)&0x07); - p->Registers[p->LatchedRegister]= - (p->Registers[p->LatchedRegister] & 0x3f0) /* zero low 4 bits */ - | (data&0xf); /* and replace with data */ - } else { - /* Data byte %0 - dddddd */ - if (!(p->LatchedRegister%2)&&(p->LatchedRegister<5)) - /* Tone register */ - p->Registers[p->LatchedRegister]= - (p->Registers[p->LatchedRegister] & 0x00f) /* zero high 6 bits */ - | ((data&0x3f)<<4); /* and replace with data */ - else - /* Other register */ - p->Registers[p->LatchedRegister]=data&0x0f; /* Replace with data */ - } - switch (p->LatchedRegister) { - case 0: - case 2: - case 4: /* Tone channels */ - if (p->Registers[p->LatchedRegister]==0) p->Registers[p->LatchedRegister]=1; /* Zero frequency changed to 1 to avoid div/0 */ - break; - case 6: /* Noise */ - p->NoiseShiftRegister=NoiseInitialState; /* reset shift register */ - p->NoiseFreq=0x10<<(p->Registers[6]&0x3); /* set noise signal generator frequency */ - break; - } -} - -void SN76489_GGStereoWrite(int which, int data) -{ - SN76489_Context *p = &SN76489[which]; - p->PSGStereo=data; -} - -void SN76489_Update(int which, INT16 *buffer, int length) -{ - SN76489_Context *p = &SN76489[which]; - int i, j; - - for(j = 0; j < length; j++) - { - for (i=0;i<=2;++i) - if (p->IntermediatePos[i]!=FLT_MIN) - p->Channels[i]=(short)((p->Mute >> i & 0x1)*PSGVolumeValues[p->VolumeArray][p->Registers[2*i+1]]*p->IntermediatePos[i]); - else - p->Channels[i]=(p->Mute >> i & 0x1)*PSGVolumeValues[p->VolumeArray][p->Registers[2*i+1]]*p->ToneFreqPos[i]; - - p->Channels[3]=(short)((p->Mute >> 3 & 0x1)*PSGVolumeValues[p->VolumeArray][p->Registers[7]]*(p->NoiseShiftRegister & 0x1)); - - if (p->BoostNoise) p->Channels[3]<<=1; /* double noise volume */ - - buffer[j] =0; - for (i=0;i<=3;++i) buffer[j] += p->Channels[i]; - - p->Clock+=p->dClock; - p->NumClocksForSample=(int)p->Clock; /* truncates */ - p->Clock-=p->NumClocksForSample; /* remove integer part */ - /* Looks nicer in Delphi... */ - /* Clock:=Clock+p->dClock; */ - /* NumClocksForSample:=Trunc(Clock); */ - /* Clock:=Frac(Clock); */ - - /* Decrement tone channel counters */ - for (i=0;i<=2;++i) - p->ToneFreqVals[i]-=p->NumClocksForSample; - - /* Noise channel: match to tone2 or decrement its counter */ - if (p->NoiseFreq==0x80) p->ToneFreqVals[3]=p->ToneFreqVals[2]; - else p->ToneFreqVals[3]-=p->NumClocksForSample; - - /* Tone channels: */ - for (i=0;i<=2;++i) { - if (p->ToneFreqVals[i]<=0) { /* If it gets below 0... */ - if (p->Registers[i*2]>PSG_CUTOFF) { - /* Calculate how much of the sample is + and how much is - */ - /* Go to floating point and include the clock fraction for extreme accuracy :D */ - /* Store as long int, maybe it's faster? I'm not very good at this */ - p->IntermediatePos[i]=(p->NumClocksForSample-p->Clock+2*p->ToneFreqVals[i])*p->ToneFreqPos[i]/(p->NumClocksForSample+p->Clock); - p->ToneFreqPos[i]=-p->ToneFreqPos[i]; /* Flip the flip-flop */ - } else { - p->ToneFreqPos[i]=1; /* stuck value */ - p->IntermediatePos[i]=FLT_MIN; - } - p->ToneFreqVals[i]+=p->Registers[i*2]*(p->NumClocksForSample/p->Registers[i*2]+1); - } else p->IntermediatePos[i]=FLT_MIN; - } - - /* Noise channel */ - if (p->ToneFreqVals[3]<=0) { /* If it gets below 0... */ - p->ToneFreqPos[3]=-p->ToneFreqPos[3]; /* Flip the flip-flop */ - if (p->NoiseFreq!=0x80) /* If not matching tone2, decrement counter */ - p->ToneFreqVals[3]+=p->NoiseFreq*(p->NumClocksForSample/p->NoiseFreq+1); - if (p->ToneFreqPos[3]==1) { /* Only once per cycle... */ - int Feedback; - if (p->Registers[6]&0x4) { /* White noise */ - /* Calculate parity of fed-back bits for feedback */ - switch (p->WhiteNoiseFeedback) { - /* Do some optimised calculations for common (known) feedback values */ - case 0x0003: /* SC-3000, BBC %00000011 */ - case 0x0009: /* SMS, GG, MD %00001001 */ - /* If two bits fed back, I can do Feedback=(nsr & fb) && (nsr & fb ^ fb) */ - /* since that's (one or more bits set) && (not all bits set) */ - Feedback=((p->NoiseShiftRegister&p->WhiteNoiseFeedback) && ((p->NoiseShiftRegister&p->WhiteNoiseFeedback)^p->WhiteNoiseFeedback)); - break; - default: /* Default handler for all other feedback values */ - Feedback=p->NoiseShiftRegister&p->WhiteNoiseFeedback; - Feedback^=Feedback>>8; - Feedback^=Feedback>>4; - Feedback^=Feedback>>2; - Feedback^=Feedback>>1; - Feedback&=1; - break; - } - } else /* Periodic noise */ - Feedback=p->NoiseShiftRegister&1; - - p->NoiseShiftRegister=(p->NoiseShiftRegister>>1) | (Feedback << (p->SRWidth-1)); - - /* Original code: */ - /* p->NoiseShiftRegister=(p->NoiseShiftRegister>>1) | ((p->Registers[6]&0x4?((p->NoiseShiftRegister&0x9) && (p->NoiseShiftRegister&0x9^0x9)):p->NoiseShiftRegister&1)<<15); */ - } - } - } -} - -/*void SN76489_UpdateOne(int which, int *l, int *r) -{ - INT16 tl,tr; - INT16 *buff[2]={&tl,&tr}; - SN76489_Update(which,buff,1); - *l=tl; - *r=tr; -}*/ - -int SN76489_GetMute(int which) -{ - return SN76489[which].Mute; -} - -void SN76489_SetMute(int which, int val) -{ - SN76489[which].Mute=val; -} - -int SN76489_GetVolType(int which) -{ - return SN76489[which].VolumeArray; -} - -void SN76489_SetVolType(int which, int val) -{ - SN76489[which].VolumeArray=val; -} - -void SN76489_SetPanning(int which, int ch0, int ch1, int ch2, int ch3) -{ - SN76489[which].panning[0]=ch0; - SN76489[which].panning[1]=ch1; - SN76489[which].panning[2]=ch2; - SN76489[which].panning[3]=ch3; -} +/* + SN76489 emulation + by Maxim in 2001 and 2002 + converted from my original Delphi implementation + + I'm a C newbie so I'm sure there are loads of stupid things + in here which I'll come back to some day and redo + + Includes: + - Super-high quality tone channel "oversampling" by calculating fractional positions on transitions + - Noise output pattern reverse engineered from actual SMS output + - Volume levels taken from actual SMS output + + 07/08/04 Charles MacDonald + Modified for use with SMS Plus: + - Added support for multiple PSG chips. + - Added reset/config/update routines. + - Added context management routines. + - Removed SN76489_GetValues(). + - Removed some unused variables. + + 25/04/07 Eke-Eke + Modified for use with GenesisPlus Gamecube's port: + - made SN76489_Update outputs 16bits mono samples + - replaced volume table with VGM plugin's one +*/ + +#include "shared.h" + +#include // for FLT_MIN +#include // for memcpy + +#define NoiseInitialState 0x8000 /* Initial state of shift register */ +#define PSG_CUTOFF 0x6 /* Value below which PSG does not output */ + +static const int PSGVolumeValues[2][16] = { + /* These values are taken from a real SMS2's output */ + {892,892,892,760,623,497,404,323,257,198,159,123,96,75,60,0}, /* I can't remember why 892... :P some scaling I did at some point */ + /* these values are true volumes for 2dB drops at each step (multiply previous by 10^-0.1), normalised at 760 */ + {1516,1205,957,760,603,479,381,303,240,191,152,120,96,76,60,0} +}; + +static SN76489_Context SN76489[MAX_SN76489]; + +void SN76489_Init(int which, int PSGClockValue, int SamplingRate) +{ + SN76489_Context *p = &SN76489[which]; + p->dClock=(float)PSGClockValue/16/SamplingRate; + SN76489_Config(which, MUTE_ALLON, VOL_FULL, FB_SEGAVDP, SRW_SEGAVDP, 1); + SN76489_Reset(which); +} + +void SN76489_Reset(int which) +{ + SN76489_Context *p = &SN76489[which]; + int i; + + p->PSGStereo = 0xFF; + + for(i = 0; i <= 3; i++) + { + /* Initialise PSG state */ + p->Registers[2*i] = 1; /* tone freq=1 */ + p->Registers[2*i+1] = 0xf; /* vol=off */ + p->NoiseFreq = 0x10; + + /* Set counters to 0 */ + p->ToneFreqVals[i] = 0; + + /* Set flip-flops to 1 */ + p->ToneFreqPos[i] = 1; + + /* Set intermediate positions to do-not-use value */ + p->IntermediatePos[i] = FLT_MIN; + + /* Set panning to centre */ + p->panning[0]=127; + } + + p->LatchedRegister=0; + + /* Initialise noise generator */ + p->NoiseShiftRegister=NoiseInitialState; + + /* Zero clock */ + p->Clock=0; + +} + +void SN76489_Shutdown(void) +{ +} + +void SN76489_Config(int which, int mute, int volume, int feedback, int sr_width, int boost_noise) +{ + SN76489_Context *p = &SN76489[which]; + + p->Mute = mute; + p->VolumeArray = volume; + p->WhiteNoiseFeedback = feedback; + p->SRWidth = sr_width; + p->BoostNoise = boost_noise; +} + +void SN76489_SetContext(int which, uint8 *data) +{ + memcpy(&SN76489[which], data, sizeof(SN76489_Context)); +} + +void SN76489_GetContext(int which, uint8 *data) +{ + memcpy(data, &SN76489[which], sizeof(SN76489_Context)); +} + +uint8 *SN76489_GetContextPtr(int which) +{ + return (uint8 *)&SN76489[which]; +} + +int SN76489_GetContextSize(void) +{ + return sizeof(SN76489_Context); +} + +void SN76489_Write(int which, int data) +{ + SN76489_Context *p = &SN76489[which]; + + if (data&0x80) { + /* Latch/data byte %1 cc t dddd */ + p->LatchedRegister=((data>>4)&0x07); + p->Registers[p->LatchedRegister]= + (p->Registers[p->LatchedRegister] & 0x3f0) /* zero low 4 bits */ + | (data&0xf); /* and replace with data */ + } else { + /* Data byte %0 - dddddd */ + if (!(p->LatchedRegister%2)&&(p->LatchedRegister<5)) + /* Tone register */ + p->Registers[p->LatchedRegister]= + (p->Registers[p->LatchedRegister] & 0x00f) /* zero high 6 bits */ + | ((data&0x3f)<<4); /* and replace with data */ + else + /* Other register */ + p->Registers[p->LatchedRegister]=data&0x0f; /* Replace with data */ + } + switch (p->LatchedRegister) { + case 0: + case 2: + case 4: /* Tone channels */ + if (p->Registers[p->LatchedRegister]==0) p->Registers[p->LatchedRegister]=1; /* Zero frequency changed to 1 to avoid div/0 */ + break; + case 6: /* Noise */ + p->NoiseShiftRegister=NoiseInitialState; /* reset shift register */ + p->NoiseFreq=0x10<<(p->Registers[6]&0x3); /* set noise signal generator frequency */ + break; + } +} + +void SN76489_GGStereoWrite(int which, int data) +{ + SN76489_Context *p = &SN76489[which]; + p->PSGStereo=data; +} + +void SN76489_Update(int which, INT16 *buffer, int length) +{ + SN76489_Context *p = &SN76489[which]; + int i, j; + + for(j = 0; j < length; j++) + { + for (i=0;i<=2;++i) + if (p->IntermediatePos[i]!=FLT_MIN) + p->Channels[i]=(short)((p->Mute >> i & 0x1)*PSGVolumeValues[p->VolumeArray][p->Registers[2*i+1]]*p->IntermediatePos[i]); + else + p->Channels[i]=(p->Mute >> i & 0x1)*PSGVolumeValues[p->VolumeArray][p->Registers[2*i+1]]*p->ToneFreqPos[i]; + + p->Channels[3]=(short)((p->Mute >> 3 & 0x1)*PSGVolumeValues[p->VolumeArray][p->Registers[7]]*(p->NoiseShiftRegister & 0x1)); + + if (p->BoostNoise) p->Channels[3]<<=1; /* double noise volume */ + + buffer[j] =0; + for (i=0;i<=3;++i) buffer[j] += p->Channels[i]; + + p->Clock+=p->dClock; + p->NumClocksForSample=(int)p->Clock; /* truncates */ + p->Clock-=p->NumClocksForSample; /* remove integer part */ + /* Looks nicer in Delphi... */ + /* Clock:=Clock+p->dClock; */ + /* NumClocksForSample:=Trunc(Clock); */ + /* Clock:=Frac(Clock); */ + + /* Decrement tone channel counters */ + for (i=0;i<=2;++i) + p->ToneFreqVals[i]-=p->NumClocksForSample; + + /* Noise channel: match to tone2 or decrement its counter */ + if (p->NoiseFreq==0x80) p->ToneFreqVals[3]=p->ToneFreqVals[2]; + else p->ToneFreqVals[3]-=p->NumClocksForSample; + + /* Tone channels: */ + for (i=0;i<=2;++i) { + if (p->ToneFreqVals[i]<=0) { /* If it gets below 0... */ + if (p->Registers[i*2]>PSG_CUTOFF) { + /* Calculate how much of the sample is + and how much is - */ + /* Go to floating point and include the clock fraction for extreme accuracy :D */ + /* Store as long int, maybe it's faster? I'm not very good at this */ + p->IntermediatePos[i]=(p->NumClocksForSample-p->Clock+2*p->ToneFreqVals[i])*p->ToneFreqPos[i]/(p->NumClocksForSample+p->Clock); + p->ToneFreqPos[i]=-p->ToneFreqPos[i]; /* Flip the flip-flop */ + } else { + p->ToneFreqPos[i]=1; /* stuck value */ + p->IntermediatePos[i]=FLT_MIN; + } + p->ToneFreqVals[i]+=p->Registers[i*2]*(p->NumClocksForSample/p->Registers[i*2]+1); + } else p->IntermediatePos[i]=FLT_MIN; + } + + /* Noise channel */ + if (p->ToneFreqVals[3]<=0) { /* If it gets below 0... */ + p->ToneFreqPos[3]=-p->ToneFreqPos[3]; /* Flip the flip-flop */ + if (p->NoiseFreq!=0x80) /* If not matching tone2, decrement counter */ + p->ToneFreqVals[3]+=p->NoiseFreq*(p->NumClocksForSample/p->NoiseFreq+1); + if (p->ToneFreqPos[3]==1) { /* Only once per cycle... */ + int Feedback; + if (p->Registers[6]&0x4) { /* White noise */ + /* Calculate parity of fed-back bits for feedback */ + switch (p->WhiteNoiseFeedback) { + /* Do some optimised calculations for common (known) feedback values */ + case 0x0003: /* SC-3000, BBC %00000011 */ + case 0x0009: /* SMS, GG, MD %00001001 */ + /* If two bits fed back, I can do Feedback=(nsr & fb) && (nsr & fb ^ fb) */ + /* since that's (one or more bits set) && (not all bits set) */ + Feedback=((p->NoiseShiftRegister&p->WhiteNoiseFeedback) && ((p->NoiseShiftRegister&p->WhiteNoiseFeedback)^p->WhiteNoiseFeedback)); + break; + default: /* Default handler for all other feedback values */ + Feedback=p->NoiseShiftRegister&p->WhiteNoiseFeedback; + Feedback^=Feedback>>8; + Feedback^=Feedback>>4; + Feedback^=Feedback>>2; + Feedback^=Feedback>>1; + Feedback&=1; + break; + } + } else /* Periodic noise */ + Feedback=p->NoiseShiftRegister&1; + + p->NoiseShiftRegister=(p->NoiseShiftRegister>>1) | (Feedback << (p->SRWidth-1)); + + /* Original code: */ + /* p->NoiseShiftRegister=(p->NoiseShiftRegister>>1) | ((p->Registers[6]&0x4?((p->NoiseShiftRegister&0x9) && (p->NoiseShiftRegister&0x9^0x9)):p->NoiseShiftRegister&1)<<15); */ + } + } + } +} + +/*void SN76489_UpdateOne(int which, int *l, int *r) +{ + INT16 tl,tr; + INT16 *buff[2]={&tl,&tr}; + SN76489_Update(which,buff,1); + *l=tl; + *r=tr; +}*/ + +int SN76489_GetMute(int which) +{ + return SN76489[which].Mute; +} + +void SN76489_SetMute(int which, int val) +{ + SN76489[which].Mute=val; +} + +int SN76489_GetVolType(int which) +{ + return SN76489[which].VolumeArray; +} + +void SN76489_SetVolType(int which, int val) +{ + SN76489[which].VolumeArray=val; +} + +void SN76489_SetPanning(int which, int ch0, int ch1, int ch2, int ch3) +{ + SN76489[which].panning[0]=ch0; + SN76489[which].panning[1]=ch1; + SN76489[which].panning[2]=ch2; + SN76489[which].panning[3]=ch3; +} diff --git a/source/sound/sn76489.h b/source/sound/sn76489.h index 517b800..3bf334c 100644 --- a/source/sound/sn76489.h +++ b/source/sound/sn76489.h @@ -1,91 +1,104 @@ - -#ifndef _SN76489_H_ -#define _SN76489_H_ - -#define MAX_SN76489 4 -#include "shared.h" -/* - More testing is needed to find and confirm feedback patterns for - SN76489 variants and compatible chips. -*/ -enum feedback_patterns { - FB_BBCMICRO = 0x8005, /* Texas Instruments TMS SN76489N (original) from BBC Micro computer */ - FB_SC3000 = 0x0006, /* Texas Instruments TMS SN76489AN (rev. A) from SC-3000H computer */ - FB_SEGAVDP = 0x0009, /* SN76489 clone in Sega's VDP chips (315-5124, 315-5246, 315-5313, Game Gear) */ -}; - -enum sr_widths { - SRW_SC3000BBCMICRO = 15, - SRW_SEGAVDP = 16 -}; - -enum volume_modes { - VOL_TRUNC = 0, /* Volume levels 13-15 are identical */ - VOL_FULL = 1, /* Volume levels 13-15 are unique */ -}; - -enum mute_values { - MUTE_ALLOFF = 0, /* All channels muted */ - MUTE_TONE1 = 1, /* Tone 1 mute control */ - MUTE_TONE2 = 2, /* Tone 2 mute control */ - MUTE_TONE3 = 4, /* Tone 3 mute control */ - MUTE_NOISE = 8, /* Noise mute control */ - MUTE_ALLON = 15, /* All channels enabled */ -}; - -typedef struct -{ - int Mute; // per-channel muting - int VolumeArray; - int BoostNoise; // double noise volume when non-zero - - /* Variables */ - float Clock; - float dClock; - int PSGStereo; - int NumClocksForSample; - int WhiteNoiseFeedback; - int SRWidth; - - /* PSG registers: */ - int Registers[8]; /* Tone, vol x4 */ - int LatchedRegister; - int NoiseShiftRegister; - int NoiseFreq; /* Noise channel signal generator frequency */ - - /* Output calculation variables */ - int ToneFreqVals[4]; /* Frequency register values (counters) */ - int ToneFreqPos[4]; /* Frequency channel flip-flops */ - int Channels[4]; /* Value of each channel, before stereo is applied */ - float IntermediatePos[4]; /* intermediate values used at boundaries between + and - (does not need double accuracy)*/ - - int panning[4]; /* fake stereo - 0..127..254 */ - -} SN76489_Context; - -/* Function prototypes */ -void SN76489_Init(int which, int PSGClockValue, int SamplingRate); -void SN76489_Reset(int which); -void SN76489_Shutdown(void); -void SN76489_Config(int which, int mute, int volume, int feedback, int sw_width, int boost_noise); -void SN76489_SetContext(int which, uint8 *data); -void SN76489_GetContext(int which, uint8 *data); -uint8 *SN76489_GetContextPtr(int which); -int SN76489_GetContextSize(void); -void SN76489_Write(int which, int data); -/*void SN76489_GGStereoWrite(int which, int data);*/ -void SN76489_Update(int which, INT16 *buffer, int length); - -/* Non-standard getters and setters */ -int SN76489_GetMute(int which); -void SN76489_SetMute(int which, int val); -int SN76489_GetVolType(int which); -void SN76489_SetVolType(int which, int val); - -void SN76489_SetPanning(int which, int ch0, int ch1, int ch2, int ch3); - -/* and a non-standard data getter */ -/*void SN76489_UpdateOne(int which, int *l, int *r);*/ - -#endif /* _SN76489_H_ */ - +/* + SN76489 emulation + by Maxim in 2001 and 2002 + converted from my original Delphi implementation + + I'm a C newbie so I'm sure there are loads of stupid things + in here which I'll come back to some day and redo + + Includes: + - Super-high quality tone channel "oversampling" by calculating fractional positions on transitions + - Noise output pattern reverse engineered from actual SMS output + - Volume levels taken from actual SMS output + + 07/08/04 Charles MacDonald + Modified for use with SMS Plus: + - Added support for multiple PSG chips. + - Added reset/config/update routines. + - Added context management routines. + - Removed SN76489_GetValues(). + - Removed some unused variables. + + 25/04/07 Eke-Eke + Modified for use with GenesisPlus Gamecube's port: + - made SN76489_Update outputs 16bits mono samples + - replaced volume table with VGM plugin's one +*/ + +#ifndef _SN76489_H_ +#define _SN76489_H_ + +#define MAX_SN76489 4 + +/* + More testing is needed to find and confirm feedback patterns for + SN76489 variants and compatible chips. +*/ +enum feedback_patterns { + FB_BBCMICRO = 0x8005, /* Texas Instruments TMS SN76489N (original) from BBC Micro computer */ + FB_SC3000 = 0x0006, /* Texas Instruments TMS SN76489AN (rev. A) from SC-3000H computer */ + FB_SEGAVDP = 0x0009, /* SN76489 clone in Sega's VDP chips (315-5124, 315-5246, 315-5313, Game Gear) */ +}; + +enum sr_widths { + SRW_SC3000BBCMICRO = 15, + SRW_SEGAVDP = 16 +}; + +enum volume_modes { + VOL_TRUNC = 0, /* Volume levels 13-15 are identical */ + VOL_FULL = 1, /* Volume levels 13-15 are unique */ +}; + +enum mute_values { + MUTE_ALLOFF = 0, /* All channels muted */ + MUTE_TONE1 = 1, /* Tone 1 mute control */ + MUTE_TONE2 = 2, /* Tone 2 mute control */ + MUTE_TONE3 = 4, /* Tone 3 mute control */ + MUTE_NOISE = 8, /* Noise mute control */ + MUTE_ALLON = 15, /* All channels enabled */ +}; + +typedef struct +{ + int Mute; // per-channel muting + int VolumeArray; + int BoostNoise; // double noise volume when non-zero + + /* Variables */ + float Clock; + float dClock; + int PSGStereo; + int NumClocksForSample; + int WhiteNoiseFeedback; + int SRWidth; + + /* PSG registers: */ + int Registers[8]; /* Tone, vol x4 */ + int LatchedRegister; + int NoiseShiftRegister; + int NoiseFreq; /* Noise channel signal generator frequency */ + + /* Output calculation variables */ + int ToneFreqVals[4]; /* Frequency register values (counters) */ + int ToneFreqPos[4]; /* Frequency channel flip-flops */ + int Channels[4]; /* Value of each channel, before stereo is applied */ + float IntermediatePos[4]; /* intermediate values used at boundaries between + and - (does not need double accuracy)*/ + + int panning[4]; /* fake stereo - 0..127..254 */ + +} SN76489_Context; + +/* Function prototypes */ +extern void SN76489_Init(int which, int PSGClockValue, int SamplingRate); +extern void SN76489_Reset(int which); +extern void SN76489_Config(int which, int mute, int volume, int feedback, int sw_width, int boost_noise); +extern void SN76489_SetContext(int which, uint8 *data); +extern void SN76489_GetContext(int which, uint8 *data); +extern uint8 *SN76489_GetContextPtr(int which); +extern int SN76489_GetContextSize(void); +extern void SN76489_Write(int which, int data); +extern void SN76489_Update(int which, INT16 *buffer, int length); + +#endif /* _SN76489_H_ */ + diff --git a/source/sound/sn76496.c b/source/sound/sn76496.c deleted file mode 100644 index 2dc3a16..0000000 --- a/source/sound/sn76496.c +++ /dev/null @@ -1,311 +0,0 @@ - -#include "shared.h" - -#define MAX_OUTPUT 0x7fff -#define STEP 0x10000 -#define FB_WNOISE 0x14002 -#define FB_PNOISE 0x08000 -#define NG_PRESET 0x0F35 - - - -struct SN76496 sn[MAX_76496]; - -void SN76496Write (int chip, int data) -{ - struct SN76496 *R = &sn[chip]; - int n; - - if (data & 0x80) - { - int r = (data & 0x70) >> 4; - int c = r / 2; - - R->LastRegister = r; - R->Register[r] = (R->Register[r] & 0x3f0) | (data & 0x0f); - switch (r) - { - case 0: /* tone 0 : frequency */ - case 2: /* tone 1 : frequency */ - case 4: /* tone 2 : frequency */ - R->Period[c] = R->UpdateStep * R->Register[r]; - if (R->Period[c] == 0) - R->Period[c] = R->UpdateStep; - if (r == 4) - { - /* update noise shift frequency */ - if ((R->Register[6] & 0x03) == 0x03) - R->Period[3] = 2 * R->Period[2]; - } - break; - case 1: /* tone 0 : volume */ - case 3: /* tone 1 : volume */ - case 5: /* tone 2 : volume */ - case 7: /* noise : volume */ - R->Volume[c] = R->VolTable[data & 0x0f]; - break; - case 6: /* noise : frequency, mode */ - { - n = R->Register[6]; - R->NoiseFB = (n & 4) ? FB_WNOISE : FB_PNOISE; - n &= 3; - /* N/512,N/1024,N/2048,Tone #3 output */ - - /* - * Amended from Mame 1.04s - * - * R->Period[3] = (n == 3) ? 2 * R->Period[2] : (R->UpdateStep << (5+n)); - */ - R->Period[3] = - ((n & 3) == - 3) ? 2 * R->Period[2] : (R->UpdateStep << (5 + (n & 3))); - - /* reset noise shifter */ - R->RNG = NG_PRESET; - R->Output[3] = R->RNG & 1; - } - break; - } - } - else - { - int r = R->LastRegister; - int c = r / 2; - - switch (r) - { - case 0: /* tone 0 : frequency */ - case 2: /* tone 1 : frequency */ - case 4: /* tone 2 : frequency */ - R->Register[r] = (R->Register[r] & 0x0f) | ((data & 0x3f) << 4); - R->Period[c] = R->UpdateStep * R->Register[r]; - if (R->Period[c] == 0) - R->Period[c] = R->UpdateStep; - if (r == 4) - { - /* update noise shift frequency */ - if ((R->Register[6] & 0x03) == 0x03) - R->Period[3] = 2 * R->Period[2]; - } - break; - - /* - * Additions from Mame 1.04 - * Start Here - */ - - case 1: /* tone 0 : volume */ - case 3: /* tone 1 : volume */ - case 5: /* tone 2 : volume */ - case 7: /* noise : volume */ - R->Volume[c] = R->VolTable[data & 0x0f]; - R->Register[r] = (R->Register[r] & 0x3f0) | (data & 0x0f); - break; - case 6: /* noise : frequency, mode */ - { - R->Register[r] = (R->Register[r] & 0x3f0) | (data & 0x0f); - n = R->Register[6]; - R->NoiseFB = (n & 4) ? FB_WNOISE : FB_PNOISE; - n &= 3; - /* N/512,N/1024,N/2048,Tone #3 output */ - R->Period[3] = - ((n & 3) == - 3) ? 2 * R->Period[2] : (R->UpdateStep << (5 + (n & 3))); - /* reset noise shifter */ - R->RNG = NG_PRESET; - R->Output[3] = R->RNG & 1; - } - break; - } - } -} - - -void SN76496Update (int chip, signed short int *buffer, int length) -{ - int i; - struct SN76496 *R = &sn[chip]; - - - /* If the volume is 0, increase the counter */ - for (i = 0; i < 4; i++) - { - if (R->Volume[i] == 0) - { - /* note that I do count += length, NOT count = length + 1. You might think */ - /* it's the same since the volume is 0, but doing the latter could cause */ - /* interferencies when the program is rapidly modulating the volume. */ - if (R->Count[i] <= length * STEP) - R->Count[i] += length * STEP; - } - } - - while (length > 0) - { - int vol[4]; - unsigned int out; - int left; - - - /* vol[] keeps track of how long each square wave stays */ - /* in the 1 position during the sample period. */ - vol[0] = vol[1] = vol[2] = vol[3] = 0; - - for (i = 0; i < 3; i++) - { - if (R->Output[i]) - vol[i] += R->Count[i]; - R->Count[i] -= STEP; - /* Period[i] is the half period of the square wave. Here, in each */ - /* loop I add Period[i] twice, so that at the end of the loop the */ - /* square wave is in the same status (0 or 1) it was at the start. */ - /* vol[i] is also incremented by Period[i], since the wave has been 1 */ - /* exactly half of the time, regardless of the initial position. */ - /* If we exit the loop in the middle, Output[i] has to be inverted */ - /* and vol[i] incremented only if the exit status of the square */ - /* wave is 1. */ - while (R->Count[i] <= 0) - { - R->Count[i] += R->Period[i]; - if (R->Count[i] > 0) - { - R->Output[i] ^= 1; - if (R->Output[i]) - vol[i] += R->Period[i]; - break; - } - R->Count[i] += R->Period[i]; - vol[i] += R->Period[i]; - } - if (R->Output[i]) - vol[i] -= R->Count[i]; - } - - left = STEP; - do - { - int nextevent; - - - if (R->Count[3] < left) - nextevent = R->Count[3]; - else - nextevent = left; - - if (R->Output[3]) - vol[3] += R->Count[3]; - R->Count[3] -= nextevent; - if (R->Count[3] <= 0) - { - if (R->RNG & 1) - R->RNG ^= R->NoiseFB; - R->RNG >>= 1; - R->Output[3] = R->RNG & 1; - R->Count[3] += R->Period[3]; - if (R->Output[3]) - vol[3] += R->Period[3]; - } - if (R->Output[3]) - vol[3] -= R->Count[3]; - - left -= nextevent; - } - while (left > 0); - - out = vol[0] * R->Volume[0] + vol[1] * R->Volume[1] + - vol[2] * R->Volume[2] + vol[3] * R->Volume[3]; - - if (out > MAX_OUTPUT * STEP) - out = MAX_OUTPUT * STEP; - - *(buffer++) = out / STEP; - - length--; - } -} - - - -void SN76496_set_clock (int chip, int clock) -{ - struct SN76496 *R = &sn[chip]; - - - /* the base clock for the tone generators is the chip clock divided by 16; */ - /* for the noise generator, it is clock / 256. */ - /* Here we calculate the number of steps which happen during one sample */ - /* at the given sample rate. No. of events = sample rate / (clock/16). */ - /* STEP is a multiplier used to turn the fraction into a fixed point */ - /* number. */ - R->UpdateStep = ((double) STEP * R->SampleRate * 16) / clock; -} - - - -void SN76496_set_gain (int chip, int gain) -{ - struct SN76496 *R = &sn[chip]; - int i; - double out; - - - gain &= 0xff; - - /* increase max output basing on gain (0.2 dB per step) */ - out = MAX_OUTPUT / 3; - while (gain-- > 0) - out *= 1.023292992; /* = (10 ^ (0.2/20)) */ - - /* build volume table (2dB per step) */ - for (i = 0; i < 15; i++) - { - /* limit volume to avoid clipping */ - if (out > MAX_OUTPUT / 3) - R->VolTable[i] = MAX_OUTPUT / 3; - else - R->VolTable[i] = out; - - out /= 1.258925412; /* = 10 ^ (2/20) = 2dB */ - } - R->VolTable[15] = 0; -} - - - -int SN76496_init (int chip, int clock, int volume, int sample_rate) -{ - int i; - struct SN76496 *R = &sn[chip]; - - R->SampleRate = sample_rate; - SN76496_set_clock (chip, clock); - - for (i = 0; i < 4; i++) - R->Volume[i] = 0; - - R->LastRegister = 0; - for (i = 0; i < 8; i += 2) - { - R->Register[i] = 0; - R->Register[i + 1] = 0x0f; /* volume = 0 */ - } - - for (i = 0; i < 4; i++) - { - R->Output[i] = 0; - R->Period[i] = R->Count[i] = R->UpdateStep; - } - R->RNG = NG_PRESET; - R->Output[3] = R->RNG & 1; - - return 0; -} - - - -int SN76496_sh_start (int clock, int volume, int rate) -{ - SN76496_init (0, clock, volume & 0xff, rate); - SN76496_set_gain (0, (volume >> 8) & 0xff); - return 0; -} diff --git a/source/sound/sn76496.h b/source/sound/sn76496.h deleted file mode 100644 index 66dde58..0000000 --- a/source/sound/sn76496.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef SN76496_H -#define SN76496_H - -#define MAX_76496 1 - -struct SN76496interface -{ - int num; - int baseclock[MAX_76496]; - int volume[MAX_76496]; -}; - -struct SN76496 -{ - int SampleRate; - unsigned int UpdateStep; - int VolTable[16]; - int Register[8]; - int LastRegister; - int Volume[4]; - unsigned int RNG; - int NoiseFB; - int Period[4]; - int Count[4]; - int Output[4]; -}; - -extern struct SN76496 sn[MAX_76496]; - -/* Function prototypes */ -void SN76496Write (int chip, int data); -void SN76496Update (int chip, signed short int *buffer, int length); -void SN76496_set_clock (int chip, int clock); -void SN76496_set_gain (int chip, int gain); -int SN76496_init (int chip, int clock, int volume, int sample_rate); -int SN76496_sh_start (int clock, int volume, int rate); - -#endif diff --git a/source/sound/sound.c b/source/sound/sound.c index 4fe8a1c..a70a680 100644 --- a/source/sound/sound.c +++ b/source/sound/sound.c @@ -1,232 +1,170 @@ -/* - sound.c - YM2612 and SN76489 emulation -*/ +/*************************************************************************************** + * Genesis Plus 1.2a + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Sound Hardware + ****************************************************************************************/ #include "shared.h" +/* generic functions */ +int (*_YM2612_Write)(unsigned char adr, unsigned char data); +int (*_YM2612_Read)(void); +void (*_YM2612_Update)(int **buf, int length); +int (*_YM2612_Reset)(void); + +static double m68cycles_per_sample; +static double z80cycles_per_sample; + /* YM2612 data */ -int fm_timera_tab[0x400]; /* Precalculated timer A values */ -int fm_timerb_tab[0x100]; /* Precalculated timer B values */ -uint8 fm_reg[2][0x100]; /* Register arrays (2x256) */ -uint8 fm_latch[2]; /* Register latches */ -uint8 fm_status; /* Read-only status flags */ -t_timer timer[2]; /* Timers A and B */ -extern void *myFM; +int fm_reg[2][0x100]; /* Register arrays (2x256) */ +double fm_timera_tab[0x400]; /* Precalculated timer A values (in usecs) */ +double fm_timerb_tab[0x100]; /* Precalculated timer B values (in usecs) */ -/* Initialize the YM2612 and SN76489 emulation */ -void sound_init(void) +/* return the number of samples that should have been rendered so far */ +static inline uint32 sound_sample_cnt(uint8 is_z80) { - /* Timers run at half the YM2612 input clock */ - float clock = ((Master_Clock / 1000000.0) / 7.0) / 2.0; - int i; + if (is_z80) return (uint32) ((double)(count_z80 + current_z80 - z80_ICount) / z80cycles_per_sample); + else return (uint32) ((double) count_m68k / m68cycles_per_sample); +} - /* Make Timer A table */ - for(i = 0; i < 1024; i += 1) +/* update FM samples */ +static inline void fm_update() +{ + if(snd.fm.curStage - snd.fm.lastStage > 1) { - /* Formula is "time(us) = 72 * (1024 - A) / clock" */ - fm_timera_tab[i] = (int)((double)(72 * (1024 - i)) / clock); - } - - /* Make Timer B table */ - for(i = 0; i < 256; i += 1) - { - /* Formula is "time(us) = 1152 * (256 - B) / clock" */ - fm_timerb_tab[i] = (int)((double)(1152 * (256 - i)) / clock); + //error("%d(%d): FM update (%d) %d from %d samples (%08x)\n", v_counter, count_z80 + current_z80 - z80_ICount, cpu, snd.fm.curStage , snd.fm.lastStage, m68k_get_reg (NULL, M68K_REG_PC)); + int *tempBuffer[2]; + tempBuffer[0] = snd.fm.buffer[0] + snd.fm.lastStage; + tempBuffer[1] = snd.fm.buffer[1] + snd.fm.lastStage; + _YM2612_Update(tempBuffer, snd.fm.curStage - snd.fm.lastStage); + snd.fm.lastStage = snd.fm.curStage; } } +/* update PSG samples */ +static inline void psg_update() +{ + if(snd.psg.curStage - snd.psg.lastStage > 1) + { + int16 *tempBuffer = snd.psg.buffer + snd.psg.lastStage; + SN76489_Update (0, tempBuffer, snd.psg.curStage - snd.psg.lastStage); + snd.psg.lastStage = snd.psg.curStage; + } +} + +void sound_init(int rate) +{ + int i; + double vclk = Master_Clock / 7.0; /* 68000 and YM2612 clock */ + double zclk = Master_Clock / 15.0; /* Z80 and SN76489 clock */ + + /* Make Timer A table */ + /* Formula is "time(us) = (1024 - A) * 144 * 1000000 / clock" */ + for(i = 0; i < 1024; i += 1) fm_timera_tab[i] = ((double)((1024 - i) * 144) * 1000000.0 / vclk); + + /* Make Timer B table */ + /* Formula is "time(us) = 16 * (256 - B) * 144 * 1000000 / clock" */ + for(i = 0; i < 256; i += 1) fm_timerb_tab[i] = ((double)((256 - i) * 16 * 144) * 1000000.0 / vclk); + + /* Cycle-Accurate sample generation */ + m68cycles_per_sample = ((double)m68cycles_per_line * (double)lines_per_frame) / (double) (rate / vdp_rate); + z80cycles_per_sample = ((double)z80cycles_per_line * (double)lines_per_frame) / (double) (rate / vdp_rate); + + /* initialize sound chips */ + SN76489_Init(0, (int)zclk, rate); + SN76489_Config(0, MUTE_ALLON, VOL_FULL, FB_SEGAVDP, SRW_SEGAVDP, 0); + + if (config.fm_core) + { + _YM2612_Write = YM2612_Write; + _YM2612_Read = YM2612_Read; + _YM2612_Update = YM2612_Update; + _YM2612_Reset = YM2612_Reset; + YM2612_Init((int)vclk, rate, config.hq_fm); + } + else + { + _YM2612_Write = YM2612Write; + _YM2612_Read = YM2612Read; + _YM2612_Update = YM2612UpdateOne; + _YM2612_Reset = YM2612ResetChip; + YM2612Init ((int)vclk, rate); + } +} + +void sound_update(void) +{ + /* finalize sound buffers */ + snd.fm.curStage = snd.buffer_size; + snd.psg.curStage = snd.buffer_size; + + /* update last samples (if needed) */ + fm_update(); + psg_update(); + + /* reset samples count */ + snd.fm.curStage = 0; + snd.fm.lastStage = 0; + snd.psg.curStage = 0; + snd.psg.lastStage = 0; +} + +/* YM2612 control */ +/* restore FM registers */ void fm_restore(void) { int i; - if (FM_GENS) YM2612_Reset(); - else YM2612ResetChip(myFM); + _YM2612_Reset(); /* feed all the registers and update internal state */ for(i = 0; i < 0x100; i++) { - if (FM_GENS) - { - YM2612_Write(0, i); - YM2612_Write(1, fm_reg[0][i]); - YM2612_Write(2, i); - YM2612_Write(3, fm_reg[1][i]); - } - else - { - YM2612Write(myFM, 0, i); - YM2612Write(myFM, 1, fm_reg[0][i]); - YM2612Write(myFM, 2, i); - YM2612Write(myFM, 3, fm_reg[1][i]); - } - } -} - -void fm_reset(void) -{ - if (FM_GENS) YM2612_Reset(); - else YM2612ResetChip(myFM); - - /* reset timers status */ - timer[0].running = 0; - timer[1].running = 0; - timer[0].enable = 0; - timer[1].enable = 0; - timer[0].count = 0; - timer[1].count = 0; - timer[0].base = 0; - timer[1].base = 0; - timer[0].index = 0; - timer[1].index = 0; - - /* reset FM status */ - fm_status = 0; -} - -void fm_write(uint8 cpu, int address, int data) -{ - int a0 = (address & 1); - int a1 = (address >> 1) & 1; - - if(a0) - { - /* Register data */ - fm_reg[a1][fm_latch[a1]] = data; - - /* Timer control only in set A */ - if(a1 == 0) - switch(fm_latch[a1]) - { - case 0x24: /* Timer A (LSB) */ - timer[0].index = ((timer[0].index & 0x0003) | (data << 2)) & 0x03FF; - if (timer[0].base != fm_timera_tab[timer[0].index]) - { - timer[0].base = fm_timera_tab[timer[0].index]; - timer[0].count = 0; - } - break; - case 0x25: /* Timer A (MSB) */ - timer[0].index = ((timer[0].index & 0x03FC) | (data & 3)) & 0x03FF; - if (timer[0].base != fm_timera_tab[timer[0].index]) - { - timer[0].base = fm_timera_tab[timer[0].index]; - timer[0].count = 0; - } - break; - case 0x26: /* Timer B */ - timer[1].index = data; - if (timer[1].base != fm_timerb_tab[timer[1].index]) - { - timer[1].base = fm_timerb_tab[timer[1].index]; - timer[1].count = 0; - } - break; - case 0x27: /* Timer Control */ - /* LOAD */ - timer[0].running = (data & 1); - timer[1].running = (data & 2); - /* ENABLE */ - timer[0].enable = (data >> 2) & 1; - timer[1].enable = (data >> 3) & 1; - /* RESET */ - if(data & 0x10) fm_status &= ~1; - if(data & 0x20) fm_status &= ~2; - break; - } - } - else - { - /* Register latch */ - fm_latch[a1] = data; - } - - if (snd.enabled) - { - - if (cpu) snd.fm.curStage = (count_z80 + current_z80 - z80_ICount) / z80cyc_per_sample; /* write from Z80 */ - else snd.fm.curStage = (count_m68k + m68k_cycles_run()) / m68cyc_per_sample; /* write from 68000 */ - - if(snd.fm.curStage - snd.fm.lastStage > 0) - { - if (FM_GENS) - { - int *tempBuffer[2]; - tempBuffer[0] = snd.fm.gens_buffer[0] + snd.fm.lastStage; - tempBuffer[1] = snd.fm.gens_buffer[1] + snd.fm.lastStage; - YM2612_Update(tempBuffer, snd.fm.curStage - snd.fm.lastStage); - } - else - { - int16 *tempBuffer[2]; - tempBuffer[0] = snd.fm.buffer[0] + snd.fm.lastStage; - tempBuffer[1] = snd.fm.buffer[1] + snd.fm.lastStage; - YM2612UpdateOne(myFM, tempBuffer, snd.fm.curStage - snd.fm.lastStage); - } - - snd.fm.lastStage = snd.fm.curStage; - } - - if (FM_GENS) YM2612_Write(address & 3, data); - else YM2612Write(myFM, address & 3, data); + _YM2612_Write(0, i); + _YM2612_Write(1, fm_reg[0][i]); + _YM2612_Write(2, i); + _YM2612_Write(3, fm_reg[1][i]); } } -int fm_read(int address) +/* write FM chip */ +void fm_write(unsigned int cpu, unsigned int address, unsigned int data) { - return (fm_status); + snd.fm.curStage = sound_sample_cnt(cpu); + fm_update(); + _YM2612_Write(address & 3, data); } -void fm_update_timers(int inc) +/* read FM status */ +unsigned int fm_read(unsigned int cpu, unsigned int address) { - int i; - - /* Process YM2612 timers */ - for(i = 0; i < 2; i += 1) - { - /* Is the timer running? */ - if(timer[i].running) - { - /* Each scanline takes up roughly 64 microseconds */ - timer[i].count += inc; - - /* Check if the counter overflowed */ - if(timer[i].count >= timer[i].base) - { - /* Reload counter */ - timer[i].count -= timer[i].base; - - /* Set overflow flag (if flag setting is enabled) */ - if(timer[i].enable) fm_status |= (1 << i); - - /* Notice FM core (some CH operation on TimerA) */ - if(i==0) - { - if (FM_GENS) YM2612TimerAOver(); - else YM2612TimerOver(myFM,0); - } - } - } - } + snd.fm.curStage = sound_sample_cnt(cpu); + fm_update(); + return (_YM2612_Read() & 0xff); } -void psg_write(uint8 cpu, int data) -{ - if(snd.enabled) - { - if (cpu) snd.psg.curStage = (count_z80 + current_z80 - z80_ICount) / z80cyc_per_sample; /* write from Z80 */ - else snd.psg.curStage = (count_m68k + m68k_cycles_run()) / m68cyc_per_sample; /* write from 68000 */ - - if(snd.psg.curStage - snd.psg.lastStage > 0) - { - int16 *tempBuffer; - tempBuffer = snd.psg.buffer + snd.psg.lastStage; - if (PSG_MAME) SN76496Update (0, tempBuffer, snd.psg.curStage - snd.psg.lastStage); - else SN76489_Update(0, tempBuffer, snd.psg.curStage - snd.psg.lastStage); - snd.psg.lastStage = snd.psg.curStage; - } - if (PSG_MAME) SN76496Write(0, data); - else SN76489_Write(0, data); - } +/* PSG write */ +void psg_write(unsigned int cpu, unsigned int data) +{ + snd.psg.curStage = sound_sample_cnt(cpu); + psg_update(); + SN76489_Write(0, data); } diff --git a/source/sound/sound.h b/source/sound/sound.h index eb93387..818d79d 100644 --- a/source/sound/sound.h +++ b/source/sound/sound.h @@ -1,29 +1,41 @@ - -#ifndef _SOUND_H_ -#define _SOUND_H_ - -typedef struct -{ - int running; - int enable; - int count; - int base; - int index; -} t_timer; - -/* Global variables */ -extern uint8 fm_reg[2][0x100]; -extern uint8 fm_latch[2]; -extern uint8 fm_status; -extern t_timer timer[2]; - -/* Function prototypes */ -void sound_init (void); -void fm_reset (void); -void fm_restore(void); -void fm_write (uint8 cpu, int address, int data); -int fm_read (int address); -void fm_update_timers (int inc); -void psg_write (uint8 cpu, int data); - -#endif /* _SOUND_H_ */ +/*************************************************************************************** + * Genesis Plus 1.2a + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Sound Hardware + ****************************************************************************************/ + +#ifndef _SOUND_H_ +#define _SOUND_H_ + +/* Global variables */ +extern int fm_reg[2][0x100]; +extern double fm_timera_tab[0x400]; +extern double fm_timerb_tab[0x100]; + +/* Function prototypes */ +extern void sound_init(int rate); +extern void sound_update(void); +extern void fm_restore(void); +extern void fm_write(unsigned int cpu, unsigned int address, unsigned int data); +extern unsigned int fm_read(unsigned int cpu, unsigned int address); +extern void psg_write(unsigned int cpu, unsigned int data); +extern int (*_YM2612_Reset)(void); + +#endif /* _SOUND_H_ */ diff --git a/source/sound/ym2612.c b/source/sound/ym2612.c index 620bb5a..d203d5d 100644 --- a/source/sound/ym2612.c +++ b/source/sound/ym2612.c @@ -94,11 +94,57 @@ #define S3 3 +void YM2612_Timers_Update(int length); +void YM2612_Special_Update (); + +// used for foward... +void Update_Chan_Algo0(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo1(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo2(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo3(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo4(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo5(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo6(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo7(channel_ *CH, int **buf, int lenght); + +void Update_Chan_Algo0_LFO(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo1_LFO(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo2_LFO(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo3_LFO(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo4_LFO(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo5_LFO(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo6_LFO(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo7_LFO(channel_ *CH, int **buf, int lenght); + +void Update_Chan_Algo0_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo1_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo2_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo3_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo4_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo5_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo6_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo7_Int(channel_ *CH, int **buf, int lenght); + +void Update_Chan_Algo0_LFO_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo1_LFO_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo2_LFO_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo3_LFO_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo4_LFO_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo5_LFO_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo6_LFO_Int(channel_ *CH, int **buf, int lenght); +void Update_Chan_Algo7_LFO_Int(channel_ *CH, int **buf, int lenght); + +// used for foward... +void Env_Attack_Next(slot_ *SL); +void Env_Decay_Next(slot_ *SL); +void Env_Substain_Next(slot_ *SL); +void Env_Release_Next(slot_ *SL); +void Env_NULL_Next(slot_ *SL); + /******************************************** * Partie variables * ********************************************/ - struct ym2612__ YM2612; int *SIN_TAB[SIN_LENGHT]; // SINUS TABLE (pointer on TL TABLE) @@ -128,7 +174,7 @@ int LFO_INC_TAB[8]; // LFO step table int in0, in1, in2, in3; // current phase calculation int en0, en1, en2, en3; // current enveloppe calculation -const void (*UPDATE_CHAN[8 * 8])(channel_ *CH, int **buf, int lenght) = // Update Channel functions pointer table +static void (*UPDATE_CHAN[8 * 8])(channel_ *CH, int **buf, int lenght) = // Update Channel functions pointer table { (void *)Update_Chan_Algo0, (void *)Update_Chan_Algo1, @@ -164,7 +210,7 @@ const void (*UPDATE_CHAN[8 * 8])(channel_ *CH, int **buf, int lenght) = // Upda (void *)Update_Chan_Algo7_LFO_Int }; -const void (*ENV_NEXT_EVENT[8])(slot_ *SL) = // Next Enveloppe phase functions pointer table +static void (*ENV_NEXT_EVENT[8])(slot_ *SL) = // Next Enveloppe phase functions pointer table { (void *)Env_Attack_Next, (void *)Env_Decay_Next, @@ -223,7 +269,6 @@ int int_cnt; // Interpolation calculation FILE *debug_file = NULL; #endif - /*********************************************** * fonctions calcul param * ***********************************************/ @@ -235,7 +280,15 @@ INLINE void CALC_FINC_SL(slot_ *SL, int finc, int kc) SL->Finc = (finc + SL->DT[kc]) * SL->MUL; - ksr = kc >> SL->KSR_S; // keycode atténuation + /* YM2612 Detune Bug (discovered by Nemesis) */ + if (SL->Finc < 0) + { + /* Phase overflow (best result with BLOCK = 5) */ + finc = (int)((double)FINC_TAB[0x7FF] / YM2612.Frequence) >> 2; + SL->Finc = (finc + SL->DT[kc]) * SL->MUL; + } + + ksr = kc >> SL->KSR_S; // keycode atténuation #if YM_DEBUG_LEVEL > 1 fprintf(debug_file, "FINC = %d SL->Finc = %d\n", finc, SL->Finc); @@ -332,6 +385,12 @@ INLINE void CSM_Key_Control() KEY_ON(&YM2612.CHANNEL[2], 1); KEY_ON(&YM2612.CHANNEL[2], 2); KEY_ON(&YM2612.CHANNEL[2], 3); + + /* found by Nemesis */ + KEY_OFF(&YM2612.CHANNEL[2], 0); + KEY_OFF(&YM2612.CHANNEL[2], 1); + KEY_OFF(&YM2612.CHANNEL[2], 2); + KEY_OFF(&YM2612.CHANNEL[2], 3); } @@ -355,7 +414,7 @@ int SLOT_SET(int Adr, unsigned char data) if ((SL->MUL = (data & 0x0F))) SL->MUL <<= 1; else SL->MUL = 1; - SL->DT = DT_TAB[(data >> 4) & 7]; + SL->DT = (int *)DT_TAB[(data >> 4) & 7]; CH->SLOT[0].Finc = -1; @@ -386,8 +445,8 @@ int SLOT_SET(int Adr, unsigned char data) CH->SLOT[0].Finc = -1; - if (data &= 0x1F) SL->AR = &AR_TAB[data << 1]; - else SL->AR = &NULL_RATE[0]; + if (data &= 0x1F) SL->AR = (int *)&AR_TAB[data << 1]; + else SL->AR = (int *)&NULL_RATE[0]; SL->EincA = SL->AR[SL->KSR]; if (SL->Ecurp == ATTACK) SL->Einc = SL->EincA; @@ -401,8 +460,8 @@ int SLOT_SET(int Adr, unsigned char data) if ((SL->AMSon = (data & 0x80))) SL->AMS = CH->AMS; else SL->AMS = 31; - if (data &= 0x1F) SL->DR = &DR_TAB[data << 1]; - else SL->DR = &NULL_RATE[0]; + if (data &= 0x1F) SL->DR = (int *)&DR_TAB[data << 1]; + else SL->DR = (int *)&NULL_RATE[0]; SL->EincD = SL->DR[SL->KSR]; if (SL->Ecurp == DECAY) SL->Einc = SL->EincD; @@ -413,8 +472,8 @@ int SLOT_SET(int Adr, unsigned char data) break; case 0x70: - if (data &= 0x1F) SL->SR = &DR_TAB[data << 1]; - else SL->SR = &NULL_RATE[0]; + if (data &= 0x1F) SL->SR = (int *)&DR_TAB[data << 1]; + else SL->SR = (int *)&NULL_RATE[0]; SL->EincS = SL->SR[SL->KSR]; if ((SL->Ecurp == SUBSTAIN) && (SL->Ecnt < ENV_END)) SL->Einc = SL->EincS; @@ -427,7 +486,7 @@ int SLOT_SET(int Adr, unsigned char data) case 0x80: SL->SLL = SL_TAB[data >> 4]; - SL->RR = &DR_TAB[((data & 0xF) << 2) + 2]; + SL->RR = (int *)&DR_TAB[((data & 0xF) << 2) + 2]; SL->EincR = SL->RR[SL->KSR]; if ((SL->Ecurp == RELEASE) && (SL->Ecnt < ENV_END)) SL->Einc = SL->EincR; @@ -439,7 +498,8 @@ int SLOT_SET(int Adr, unsigned char data) break; case 0x90: -/* // SSG-EG envelope shapes : +/* + // SSG-EG envelope shapes : // // E At Al H // @@ -464,12 +524,15 @@ int SLOT_SET(int Adr, unsigned char data) // Al = Altern // H = Hold */ - if (data & 0x08) SL->SEG = data & 0x0F; - else SL->SEG = 0; + if (config.ssg_enabled) + { + if (data & 0x08) SL->SEG = data & 0x0F; + else SL->SEG = 0; #if YM_DEBUG_LEVEL > 1 fprintf(debug_file, "CHANNEL[%d], SLOT[%d] SSG-EG = %.2X\n", nch, nsl, data); #endif + } break; } @@ -512,7 +575,7 @@ int CHANNEL_SET(int Adr, unsigned char data) CH->FOCT[0] = (data & 0x38) >> 3; CH->KC[0] = (CH->FOCT[0] << 2) | FKEY_TAB[CH->FNUM[0] >> 7]; - CH->SLOT[0].Finc = -1; + //CH->SLOT[0].Finc = -1; #if YM_DEBUG_LEVEL > 1 fprintf(debug_file, "CHANNEL[%d] part2 FNUM = %d FOCT = %d KC = %d\n", num, CH->FNUM[0], CH->FOCT[0], CH->KC[0]); @@ -548,7 +611,7 @@ int CHANNEL_SET(int Adr, unsigned char data) YM2612.CHANNEL[2].FOCT[num] = (data & 0x38) >> 3; YM2612.CHANNEL[2].KC[num] = (YM2612.CHANNEL[2].FOCT[num] << 2) | FKEY_TAB[YM2612.CHANNEL[2].FNUM[num] >> 7]; - YM2612.CHANNEL[2].SLOT[0].Finc = -1; + //YM2612.CHANNEL[2].SLOT[0].Finc = -1; #if YM_DEBUG_LEVEL > 1 fprintf(debug_file, "CHANNEL[2] part2 FNUM[%d] = %d FOCT[%d] = %d KC[%d] = %d\n", num, YM2612.CHANNEL[2].FNUM[num], num, YM2612.CHANNEL[2].FOCT[num], num, YM2612.CHANNEL[2].KC[num]); @@ -648,41 +711,29 @@ int YM_SET(int Adr, unsigned char data) case 0x24: YM2612.TimerA = (YM2612.TimerA & 0x003) | (((int) data) << 2); - - if (YM2612.TimerAL != (1024 - YM2612.TimerA) << 12) - { - YM2612.TimerAcnt = YM2612.TimerAL = (1024 - YM2612.TimerA) << 12; + YM2612.TimerAL = (1024 - YM2612.TimerA) << 12; #if YM_DEBUG_LEVEL > 1 - fprintf(debug_file, "Timer A Set = %.8X\n", YM2612.TimerAcnt); + fprintf(debug_file, "Timer A Set = %.8X\n", YM2612.TimerAL); #endif - } break; case 0x25: YM2612.TimerA = (YM2612.TimerA & 0x3fc) | (data & 3); - - if (YM2612.TimerAL != (1024 - YM2612.TimerA) << 12) - { - YM2612.TimerAcnt = YM2612.TimerAL = (1024 - YM2612.TimerA) << 12; + YM2612.TimerAL = (1024 - YM2612.TimerA) << 12; #if YM_DEBUG_LEVEL > 1 - fprintf(debug_file, "Timer A Set = %.8X\n", YM2612.TimerAcnt); + fprintf(debug_file, "Timer A Set = %.8X\n", YM2612.TimerAL); #endif - } break; case 0x26: YM2612.TimerB = data; - - if (YM2612.TimerBL != (256 - YM2612.TimerB) << (4 + 12)) - { - YM2612.TimerBcnt = YM2612.TimerBL = (256 - YM2612.TimerB) << (4 + 12); + YM2612.TimerBL = (256 - YM2612.TimerB) << (4 + 12); #if YM_DEBUG_LEVEL > 1 - fprintf(debug_file, "Timer B Set = %.8X\n", YM2612.TimerBcnt); + fprintf(debug_file, "Timer B Set = %.8X\n", YM2612.TimerBL); #endif - } break; case 0x27: @@ -696,7 +747,7 @@ int YM_SET(int Adr, unsigned char data) // b1 = load b // b0 = load a - if ((data ^ YM2612.Mode) & 0x40) + if ((data ^ YM2612.Mode) & 0xC0) { // We changed the channel 2 mode, so recalculate phase step // This fix the punch sound in Street of Rage 2 @@ -706,11 +757,10 @@ int YM_SET(int Adr, unsigned char data) YM2612.CHANNEL[2].SLOT[0].Finc = -1; // recalculate phase step } -// if ((data & 2) && (YM2612.Status & 2)) YM2612.TimerBcnt = YM2612.TimerBL; -// if ((data & 1) && (YM2612.Status & 1)) YM2612.TimerAcnt = YM2612.TimerAL; + if ((data & 2) && !(YM2612.Mode & 2)) YM2612.TimerBcnt = YM2612.TimerBL; + if ((data & 1) && !(YM2612.Mode & 1)) YM2612.TimerAcnt = YM2612.TimerAL; -// YM2612.Status &= (~data >> 4); // Reset du Status au cas ou c'est demandé - YM2612.Status &= (~data >> 4) & (data >> 2); // Reset Status + YM2612.Status &= (~data >> 4)/* & (data >> 2)*/; // Reset Status YM2612.Mode = data; @@ -791,6 +841,8 @@ void Env_Decay_Next(slot_ *SL) void Env_Substain_Next(slot_ *SL) { + if (config.ssg_enabled) + { if (SL->SEG & 8) // SSG envelope type { if (SL->SEG & 1) @@ -802,10 +854,8 @@ void Env_Substain_Next(slot_ *SL) else { // re KEY ON - // SL->Fcnt = 0; // SL->ChgEnM = 0xFFFFFFFF; - SL->Ecnt = 0; SL->Einc = SL->EincA; SL->Ecmp = ENV_DECAY; @@ -820,6 +870,13 @@ void Env_Substain_Next(slot_ *SL) SL->Einc = 0; SL->Ecmp = ENV_END + 1; } + } + else + { + SL->Ecnt = ENV_END; + SL->Einc = 0; + SL->Ecmp = ENV_END + 1; + } } @@ -2067,27 +2124,10 @@ int YM2612_Init(int Clock, int Rate, int Interpolation) return 0; } - -int YM2612_End(void) -{ - -#if YM_DEBUG_LEVEL > 0 - if (debug_file) fclose(debug_file); - debug_file = NULL; -#endif - - return 0; -} - - int YM2612_Reset(void) { int i, j; -#if YM_DEBUG_LEVEL > 0 - fprintf(debug_file, "\n\nStarting reseting YM2612 ...\n\n"); -#endif - YM2612.LFOcnt = 0; YM2612.TimerA = 0; YM2612.TimerAL = 0; @@ -2181,14 +2221,13 @@ int YM2612_Read(void) return YM2612.Status; } -extern uint8 dacshift; int YM2612_Write(unsigned char adr, unsigned char data) { int d; - data &= 0xFF; - adr &= 0x3; + //data &= 0xFF; + adr &= 0x03; switch(adr) { @@ -2198,10 +2237,10 @@ int YM2612_Write(unsigned char adr, unsigned char data) case 1: // Trivial optimisation - if (YM2612.OPNAadr == 0x2A) { YM2612.DACdata = ((int) data - 0x80) << 7; + YM2612.REG[0][0x2A] = data; return 0; } @@ -2271,7 +2310,15 @@ void YM2612_Update(int **buf, int length) if (YM2612.CHANNEL[1].SLOT[0].Finc == -1) CALC_FINC_CH(&YM2612.CHANNEL[1]); if (YM2612.CHANNEL[2].SLOT[0].Finc == -1) { - if (YM2612.Mode & 0x40) + /*---------------------- + |Mode| Behaviour | + |----|---------------| + | 00 | Normal | + | 01 | Special | + | 10 | Special + CSM | + | 11 | Special | + ---------------------- */ + if (YM2612.Mode & 0xC0) { CALC_FINC_SL(&(YM2612.CHANNEL[2].SLOT[S0]), FINC_TAB[YM2612.CHANNEL[2].FNUM[2]] >> (7 - YM2612.CHANNEL[2].FOCT[2]), YM2612.CHANNEL[2].KC[2]); CALC_FINC_SL(&(YM2612.CHANNEL[2].SLOT[S1]), FINC_TAB[YM2612.CHANNEL[2].FNUM[3]] >> (7 - YM2612.CHANNEL[2].FOCT[3]), YM2612.CHANNEL[2].KC[3]); @@ -2348,18 +2395,48 @@ void YM2612_Update(int **buf, int length) YM2612.Inter_Cnt = int_cnt; + /* update timers here */ + YM2612_Timers_Update(length); + #if YM_DEBUG_LEVEL > 1 fprintf(debug_file, "\n\nFinishing generating sound...\n\n"); #endif } -void YM2612_Special_Update(void) -{} - -void YM2612TimerAOver() +void YM2612_Timers_Update(int length) { - if (YM2612.Mode & 0x80) CSM_Key_Control(); + int i; + + i = YM2612.TimerBase * length; + + if (YM2612.Mode & 1) // Timer A ON ? + { + if ((YM2612.TimerAcnt -= i) <= 0) + { + YM2612.Status |= (YM2612.Mode & 0x04) >> 2; + YM2612.TimerAcnt += YM2612.TimerAL; + /*---------------------- + |Mode| Behaviour | + |----|---------------| + | 00 | Normal | + | 01 | Special | + | 10 | Special + CSM | + | 11 | Special | + ---------------------- */ + if ((YM2612.Mode & 0xC0) == 0x80) CSM_Key_Control(); // found by Nemesis + } + } + + if (YM2612.Mode & 2) // Timer B ON ? + { + if ((YM2612.TimerBcnt -= i) <= 0) + { + YM2612.Status |= (YM2612.Mode & 0x08) >> 2; + YM2612.TimerBcnt += YM2612.TimerBL; + } + } } - +void YM2612_Special_Update () +{} diff --git a/source/sound/ym2612.h b/source/sound/ym2612.h index ecf9d8d..1b8f940 100644 --- a/source/sound/ym2612.h +++ b/source/sound/ym2612.h @@ -1,10 +1,18 @@ +/*********************************************************** + * * + * YM2612.C : YM2612 emulator * + * * + * Almost constantes are taken from the MAME core * + * * + * This source is a part of Gens project * + * Written by Stéphane Dallongeville (gens@consolemul.com) * + * Copyright (c) 2002 by Stéphane Dallongeville * + * * + ***********************************************************/ + #ifndef _YM2612_H_ #define _YM2612_H_ -#ifdef __cplusplus -extern "C" { -#endif - // Change it if you need to do long update #define MAX_UPDATE_LENGHT 2000 @@ -95,77 +103,11 @@ typedef struct ym2612__ { // cela nous rend le débuggage plus facile } ym2612_; -/* Gens */ -extern int YM2612_Enable; -extern int YM2612_Improv; -extern int DAC_Enable; -extern int *YM_Buf[2]; -extern int YM_Len; - -/* end */ - -int YM2612_Init(int clock, int rate, int interpolation); -int YM2612_End(void); -int YM2612_Reset(void); -int YM2612_Read(void); -int YM2612_Write(unsigned char adr, unsigned char data); -void YM2612_Update(int **buf, int length); -int YM2612_Save(unsigned char SAVE[0x200]); -int YM2612_Restore(unsigned char SAVE[0x200]); - - -void YM2612_Special_Update(void); -void YM2612TimerAOver(void); - -/* end */ - -// used for foward... -void Update_Chan_Algo0(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo1(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo2(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo3(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo4(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo5(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo6(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo7(channel_ *CH, int **buf, int lenght); - -void Update_Chan_Algo0_LFO(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo1_LFO(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo2_LFO(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo3_LFO(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo4_LFO(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo5_LFO(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo6_LFO(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo7_LFO(channel_ *CH, int **buf, int lenght); - -void Update_Chan_Algo0_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo1_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo2_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo3_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo4_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo5_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo6_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo7_Int(channel_ *CH, int **buf, int lenght); - -void Update_Chan_Algo0_LFO_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo1_LFO_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo2_LFO_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo3_LFO_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo4_LFO_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo5_LFO_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo6_LFO_Int(channel_ *CH, int **buf, int lenght); -void Update_Chan_Algo7_LFO_Int(channel_ *CH, int **buf, int lenght); - -// used for foward... -void Env_Attack_Next(slot_ *SL); -void Env_Decay_Next(slot_ *SL); -void Env_Substain_Next(slot_ *SL); -void Env_Release_Next(slot_ *SL); -void Env_NULL_Next(slot_ *SL); - -#ifdef __cplusplus -}; -#endif +extern int YM2612_Init(int clock, int rate, int interpolation); +extern int YM2612_Reset(void); +extern int YM2612_Read(void); +extern int YM2612_Write(unsigned char adr, unsigned char data); +extern void YM2612_Update(int **buf, int length); #endif diff --git a/source/sram.c b/source/sram.c deleted file mode 100644 index 0dfdfd2..0000000 --- a/source/sram.c +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** - * Genesis Plus 1.2a - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * SRAM MANAGER - ***************************************************************************/ - -#include "shared.h" - -T_SRAM sram; - -/**************************************************************************** - * A quick guide to SRAM on the Genesis - * - * This is based on observations only - it may be completely wrong! - * - * The SRAM definition is held at offset 0x1b0 of the ROM header. - * From looking at several ROMS, an ID appears: - * - * 0x1b0 : 0x52 0x41 0xF8 0x20 0x00200001 0x0020ffff - * - * Assuming 64k SRAM / Battery RAM throughout - ****************************************************************************/ -void SRAM_Init () -{ - memset (&sram, 0, sizeof (T_SRAM)); - memset (&sram.sram[0], 0xFF, 0x10000); - sram.crc = crc32 (0, &sram.sram[0], 0x10000); - - if ((cart_rom[0x1b0] == 0x52) && (cart_rom[0x1b1] == 0x41)) - { - sram.on = 1; - sram.write = 1; - sram.detected = 1; - sram.start = READ_WORD_LONG(cart_rom, 0x1b4); - sram.end = READ_WORD_LONG(cart_rom, 0x1b8); - - /* some games have incorrect header informations */ - if ((sram.start > sram.end) || ((sram.end - sram.start) >= 0x10000)) - sram.end = sram.start + 0xffff; - sram.start &= 0xfffffffe; - sram.end |= 1; - - /* game using serial EEPROM as external RAM */ - if (sram.end - sram.start < 2) EEPROM_Init(); - } - else - { - /* set SRAM memory region by default */ - sram.start = 0x200000; - sram.end = 0x20ffff; - - /* set SRAM ON by default if game is smaller than 2M */ - if (genromsize <= 0x200000) - { - sram.on = 1; - sram.write = 1; - } - - /* some games using EEPROM don't have the correct header */ - EEPROM_Init(); - } -} diff --git a/source/ssf2tnc.c b/source/ssf2tnc.c deleted file mode 100644 index 896815d..0000000 --- a/source/ssf2tnc.c +++ /dev/null @@ -1,98 +0,0 @@ -/**************************************************************************** - * Super Street Fighter 2 - The New Challengers - * - * This is the ROM mapper for this game. - * Called from mem68k.c - ***************************************************************************/ -#include "shared.h" - -#ifdef NGC -char *shadow_rom = (char *) 0x8000; -#else -char shadow_rom[0x500000]; -#endif - -int SSF2TNC = 0; -static int oldaddr = 0; -static uint8 olddata = 0; - -void ssf2bankrom (int address, unsigned char data) -{ - /* Banking performed on odd addresses only */ - if (!(address & 1)) return; - - /* - * Whilst debugging the ARAM stuff, I noticed that this ROM - * requested the same address/data on subsequent calls. - * This is just a little speedup, which seems to make the - * sound etc in the intro much less choppy. - * - * Happy dance anyone? - */ - if ((oldaddr == address) && (olddata == data)) return; - - if ((address > 0xa130f2) && (address < 0xa13100)) - { - switch (address & 0xf) - { - case 0x3: /* 080000-0FFFFF */ -#ifdef NGC - ARAMFetch (cart_rom + 0x080000, shadow_rom + (data * 0x80000), 0x80000); -#else - memcpy (cart_rom + 0x080000, shadow_rom + (data * 0x80000), 0x80000); -#endif - break; - - case 0x5: /* 100000 - 17FFFF */ -#ifdef NGC - ARAMFetch (cart_rom + 0x100000, shadow_rom + (data * 0x80000), 0x80000); -#else - memcpy (cart_rom + 0x100000, shadow_rom + (data * 0x80000), 0x80000); -#endif - break; - - case 0x7: /* 180000 - 1FFFFF */ -#ifdef NGC - ARAMFetch (cart_rom + 0x180000, shadow_rom + ( data * 0x80000), 0x80000); -#else - memcpy (cart_rom + 0x180000, shadow_rom + ( data * 0x80000), 0x80000); -#endif - break; - - case 0x9: /* 200000 - 27FFFF */ -#ifdef NGC - ARAMFetch (cart_rom + 0x200000, shadow_rom + ( data * 0x80000), 0x80000); -#else - memcpy (cart_rom + 0x200000, shadow_rom + ( data * 0x80000), 0x80000); -#endif - break; - - case 0xb: /* 280000 - 2FFFFF */ -#ifdef NGC - ARAMFetch (cart_rom + 0x280000, shadow_rom + ( data * 0x80000), 0x80000); -#else - memcpy (cart_rom + 0x280000, shadow_rom + ( data * 0x80000), 0x80000); -#endif - break; - - case 0xd: /* 300000 - 37FFFF */ -#ifdef NGC - ARAMFetch (cart_rom + 0x300000, shadow_rom + ( data * 0x80000), 0x80000); -#else - memcpy (cart_rom + 0x300000, shadow_rom + ( data * 0x80000), 0x80000); -#endif - break; - - case 0xf: /* 380000 - 3FFFFF */ -#ifdef NGC - ARAMFetch (cart_rom + 0x380000, shadow_rom + ( data * 0x80000), 0x80000); -#else - memcpy (cart_rom + 0x380000, shadow_rom + ( data * 0x80000), 0x80000); -#endif - break; - } - } - - oldaddr = address; - olddata = data; -} diff --git a/source/ssf2tnc.h b/source/ssf2tnc.h deleted file mode 100644 index 22a756b..0000000 --- a/source/ssf2tnc.h +++ /dev/null @@ -1,17 +0,0 @@ -/**************************************************************************** - * Super Street Fighter 2 - The New Challengers - * - * This is the ROM mapper for this game. - * Called from mem68k.c - ***************************************************************************/ - -/* Function prototypes */ -extern void ssf2bankrom (int address, unsigned char data); - -/* global variables */ -extern int SSF2TNC; -#ifdef NGC -extern char *shadow_rom; -#else -extern char shadow_rom[0x500000]; -#endif diff --git a/source/state.c b/source/state.c index b3f4310..3b5e44a 100644 --- a/source/state.c +++ b/source/state.c @@ -1,7 +1,8 @@ -/**************************************************************************** +/*************************************************************************************** * Genesis Plus 1.2a + * FreezeState support * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald + * coded by Eke-Eke, GC/Wii port * * 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 @@ -17,14 +18,12 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * - * Freeze State support (added by EkeEke for Gamecube's port - Feb,2007) - * - ***************************************************************************/ + ****************************************************************************************/ + #include "shared.h" -unsigned char state[0x23000]; -unsigned int bufferptr; +static unsigned char state[0x24000]; +static unsigned int bufferptr; void load_param(void *param, unsigned int size) { @@ -42,114 +41,63 @@ void state_load(unsigned char *buffer) { uint32 tmp32; uint16 tmp16; - int i; - int height, width; - unsigned long inbytes, outbytes; + uint8 temp_reg[0x20]; + unsigned long inbytes, outbytes; /* get compressed state size & uncompress state file */ - memcpy(&inbytes,&buffer[0],sizeof(inbytes)); + memcpy(&inbytes, buffer, 4); + bufferptr = 0; #ifdef NGC - outbytes = 0x23000; - uncompress ((char *) &state[0], &outbytes, (char *) &buffer[sizeof(inbytes)], inbytes); + outbytes = 0x24000; + uncompress ((Bytef *)state, &outbytes, (Bytef *)(buffer + 4), inbytes); #else outbytes = inbytes; - memcpy(&state[0], &buffer[sizeof(inbytes)], outbytes); + memcpy(state, buffer + 4, outbytes); #endif - /* load state */ + /* SYSTEM RESET */ system_reset(); - bufferptr = 0; - - // gen.c stuff + rom_readmap[0] = &cart_rom[0]; + rom_size = genromsize; + + // GENESIS load_param(work_ram, sizeof(work_ram)); load_param(zram, sizeof(zram)); load_param(&zbusreq, sizeof(zbusreq)); load_param(&zreset, sizeof(zreset)); - load_param(&zbusack, sizeof(zbusack)); - load_param(&zirq, sizeof(zirq)); load_param(&zbank, sizeof(zbank)); - load_param(&lastbusreqcnt, sizeof(lastbusreqcnt)); - load_param(&lastbusack, sizeof(lastbusack)); + zbusack = 1 ^(zbusreq & zreset); - // io.c stuff + // IO load_param(io_reg, sizeof(io_reg)); - // render.c stuff - load_param(&object_index_count,sizeof(object_index_count)); - - // vdp.c stuff + // VDP load_param(sat, sizeof(sat)); load_param(vram, sizeof(vram)); load_param(cram, sizeof(cram)); load_param(vsram, sizeof(vsram)); - load_param(reg, sizeof(reg)); + load_param(temp_reg, sizeof(temp_reg)); load_param(&addr, sizeof(addr)); load_param(&addr_latch, sizeof(addr_latch)); load_param(&code, sizeof(code)); load_param(&pending, sizeof(pending)); load_param(&status, sizeof(status)); - load_param(&ntab, sizeof(ntab)); - load_param(&ntbb, sizeof(ntbb)); - load_param(&ntwb, sizeof(ntwb)); - load_param(&satb, sizeof(satb)); - load_param(&hscb, sizeof(hscb)); - load_param(&sat_base_mask, sizeof(sat_base_mask)); - load_param(&sat_addr_mask, sizeof(sat_addr_mask)); - load_param(&border, sizeof(border)); - load_param(&playfield_shift, sizeof(playfield_shift)); - load_param(&playfield_col_mask, sizeof(playfield_col_mask)); - load_param(&playfield_row_mask, sizeof(playfield_row_mask)); - load_param(&y_mask, sizeof(y_mask)); + load_param(&dmafill, sizeof(dmafill)); load_param(&hint_pending, sizeof(hint_pending)); load_param(&vint_pending, sizeof(vint_pending)); - load_param(&h_counter, sizeof(h_counter)); - load_param(&hc_latch, sizeof(hc_latch)); - load_param(&v_counter, sizeof(v_counter)); - load_param(&dmafill, sizeof(dmafill)); - load_param(&im2_flag, sizeof(im2_flag)); - load_param(&frame_end, sizeof(frame_end)); - load_param(&dma_endCycles, sizeof(dma_endCycles)); - - // system.c stuff - load_param(&aim_m68k,sizeof(aim_m68k)); - load_param(&count_m68k,sizeof(count_m68k)); - load_param(&dma_m68k,sizeof(dma_m68k)); - load_param(&aim_z80,sizeof(aim_z80)); - load_param(&count_z80,sizeof(count_z80)); + load_param(&vint_triggered, sizeof(vint_triggered)); + load_param(&hvint_updated, sizeof(hvint_updated)); + vdp_restore(temp_reg); - // FM stuff + // FM load_param(fm_reg,sizeof(fm_reg)); - load_param(&fm_status,sizeof(fm_status)); - load_param(timer,sizeof(timer)); fm_restore(); - // psg stuff - load_param(&PSG_MAME,1); - if (PSG_MAME) - { - struct SN76496 *R = &sn[0]; - load_param(R->Register,27*4); - } - else load_param(SN76489_GetContextPtr (0),SN76489_GetContextSize ()); - - // Window size - load_param(&height, sizeof(int)); - load_param(&width, sizeof(int)); - if (height != bitmap.viewport.h) - { - bitmap.viewport.oh = bitmap.viewport.h; - bitmap.viewport.h = height; - bitmap.viewport.changed = 1; - } - if (width != bitmap.viewport.w) - { - bitmap.viewport.ow = bitmap.viewport.w; - bitmap.viewport.w = width; - bitmap.viewport.changed = 1; - } + // PSG + load_param(SN76489_GetContextPtr (0),SN76489_GetContextSize ()); - // 68000 CPU + // 68000 load_param(&tmp32, 4); m68k_set_reg(M68K_REG_D0, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_D1, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_D2, tmp32); @@ -170,71 +118,30 @@ void state_load(unsigned char *buffer) load_param(&tmp16, 2); m68k_set_reg(M68K_REG_SR, tmp16); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_USP,tmp32); - // MAME Z80 CPU - load_param(&tmp32, 4); z80_set_reg(Z80_PC, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_SP, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_AF, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_BC, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_DE, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_HL, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_IX, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_IY, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_R, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_I, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_AF2, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_BC2, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_DE2, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_HL2, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_IM, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_IFF1,tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_IFF2,tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_HALT,tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_NMI_STATE,tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_IRQ_STATE,tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_DC0, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_DC1, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_DC2, tmp32); - load_param(&tmp32, 4); z80_set_reg(Z80_DC3, tmp32); - - // Remake cache - for (i=0;i<0x800;i++) - { - bg_name_list[i]=i; - bg_name_dirty[i]=0xFF; - } - bg_list_index=0x800; - color_update = color_update_16; - for(i = 0; i < 0x40; i += 1) color_update(i, *(uint16 *)&cram[i << 1]); - color_update(0x00, *(uint16 *)&cram[border << 1]); + // Z80 + load_param(&Z80, sizeof(Z80_Regs)); } int state_save(unsigned char *buffer) { - uint32 tmp32; - uint16 tmp16; - unsigned long inbytes, outbytes; + uint32 tmp32; + uint16 tmp16; + unsigned long inbytes, outbytes; /* save state */ bufferptr = 0; - - // gen.c stuff + + // GENESIS save_param(work_ram, sizeof(work_ram)); save_param(zram, sizeof(zram)); save_param(&zbusreq, sizeof(zbusreq)); save_param(&zreset, sizeof(zreset)); - save_param(&zbusack, sizeof(zbusack)); - save_param(&zirq, sizeof(zirq)); save_param(&zbank, sizeof(zbank)); - save_param(&lastbusreqcnt, sizeof(lastbusreqcnt)); - save_param(&lastbusack, sizeof(lastbusack)); - // io.c stuff + // IO save_param(io_reg, sizeof(io_reg)); - // render.c stuff - save_param(&object_index_count,sizeof(object_index_count)); - - // vdp.c stuff + // VDP save_param(sat, sizeof(sat)); save_param(vram, sizeof(vram)); save_param(cram, sizeof(cram)); @@ -245,55 +152,20 @@ int state_save(unsigned char *buffer) save_param(&code, sizeof(code)); save_param(&pending, sizeof(pending)); save_param(&status, sizeof(status)); - save_param(&ntab, sizeof(ntab)); - save_param(&ntbb, sizeof(ntbb)); - save_param(&ntwb, sizeof(ntwb)); - save_param(&satb, sizeof(satb)); - save_param(&hscb, sizeof(hscb)); - save_param(&sat_base_mask, sizeof(sat_base_mask)); - save_param(&sat_addr_mask, sizeof(sat_addr_mask)); - save_param(&border, sizeof(border)); - save_param(&playfield_shift, sizeof(playfield_shift)); - save_param(&playfield_col_mask, sizeof(playfield_col_mask)); - save_param(&playfield_row_mask, sizeof(playfield_row_mask)); - save_param(&y_mask, sizeof(y_mask)); + save_param(&dmafill, sizeof(dmafill)); save_param(&hint_pending, sizeof(hint_pending)); save_param(&vint_pending, sizeof(vint_pending)); - save_param(&h_counter, sizeof(h_counter)); - save_param(&hc_latch, sizeof(hc_latch)); - save_param(&v_counter, sizeof(v_counter)); - save_param(&dmafill, sizeof(dmafill)); - save_param(&im2_flag, sizeof(im2_flag)); - save_param(&frame_end, sizeof(frame_end)); - save_param(&dma_endCycles, sizeof(dma_endCycles)); - - // system.c stuff - save_param(&aim_m68k,sizeof(aim_m68k)); - save_param(&count_m68k,sizeof(count_m68k)); - save_param(&dma_m68k,sizeof(dma_m68k)); - save_param(&aim_z80,sizeof(aim_z80)); - save_param(&count_z80,sizeof(count_z80)); + save_param(&vint_triggered, sizeof(vint_triggered)); + save_param(&hvint_updated, sizeof(hvint_updated)); - // FM stuff + // FM save_param(fm_reg,sizeof(fm_reg)); - save_param(&fm_status,sizeof(fm_status)); - save_param(timer,sizeof(timer)); - - // PSG stuff - save_param(&PSG_MAME,1); - if (PSG_MAME) - { - struct SN76496 *R = &sn[0]; - save_param(R->Register,27*4); - } - else save_param(SN76489_GetContextPtr (0),SN76489_GetContextSize ()); - - // Window size - save_param(&bitmap.viewport.h, sizeof(int)); - save_param(&bitmap.viewport.w, sizeof(int)); - - // 68000 CPU - tmp32 = m68k_get_reg(NULL, M68K_REG_D0); save_param(&tmp32, 4); + + // PSG + save_param(SN76489_GetContextPtr (0),SN76489_GetContextSize ()); + + // 68000 + tmp32 = m68k_get_reg(NULL, M68K_REG_D0); save_param(&tmp32, 4); tmp32 = m68k_get_reg(NULL, M68K_REG_D1); save_param(&tmp32, 4); tmp32 = m68k_get_reg(NULL, M68K_REG_D2); save_param(&tmp32, 4); tmp32 = m68k_get_reg(NULL, M68K_REG_D3); save_param(&tmp32, 4); @@ -313,46 +185,23 @@ int state_save(unsigned char *buffer) tmp16 = m68k_get_reg(NULL, M68K_REG_SR); save_param(&tmp16, 2); tmp32 = m68k_get_reg(NULL, M68K_REG_USP); save_param(&tmp32, 4); - // Z80 CPU - tmp32 = z80_get_reg(Z80_PC); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_SP); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_AF); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_BC); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_DE); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_HL); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_IX); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_IY); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_R); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_I); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_AF2); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_BC2); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_DE2); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_HL2); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_IM); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_IFF1); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_IFF2); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_HALT); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_NMI_STATE); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_IRQ_STATE); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_DC0); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_DC1); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_DC2); save_param(&tmp32, 4); - tmp32 = z80_get_reg(Z80_DC3); save_param(&tmp32, 4); + // Z80 + save_param(&Z80, sizeof(Z80_Regs)); inbytes = bufferptr; - + #ifdef NGC /* compress state file */ - outbytes = 0x24000; - compress2 ((char *) &buffer[sizeof(outbytes)], &outbytes, (char *) &state[0], inbytes, 9); + outbytes = 0x26000; + compress2 ((Bytef *)(buffer + 4), &outbytes, (Bytef *)state, inbytes, 9); #else outbytes = inbytes; - memcpy(&buffer[sizeof(outbytes)], &state[0], outbytes); + memcpy(buffer + 4, state, outbytes); #endif /* write compressed size in the first 32 bits for decompression */ - memcpy(&buffer[0], &outbytes, sizeof(outbytes)); + memcpy(buffer, &outbytes, 4); /* return total size */ - return (sizeof(outbytes) + outbytes); + return (outbytes + 4); } diff --git a/source/state.h b/source/state.h index 0cd0482..b0c8482 100644 --- a/source/state.h +++ b/source/state.h @@ -1,7 +1,8 @@ -/**************************************************************************** +/*************************************************************************************** * Genesis Plus 1.2a + * FreezeState support * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald + * coded by Eke-Eke, GC/Wii port * * 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 @@ -17,15 +18,13 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * - * Freeze State support (added by EkeEke for the Gamecube's port - Feb,2007) - * - ***************************************************************************/ + ****************************************************************************************/ + #ifndef _STATE_H_ #define _STATE_H_ /* Function prototypes */ -void state_load(unsigned char *buffer); -int state_save(unsigned char *buffer); +extern void state_load(unsigned char *buffer); +extern int state_save(unsigned char *buffer); #endif diff --git a/source/system.c b/source/system.c index 093e892..0e5cf41 100644 --- a/source/system.c +++ b/source/system.c @@ -1,20 +1,25 @@ -/* - Copyright (C) 1999, 2000, 2001, 2002, 2003 Charles MacDonald - - 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ +/*************************************************************************************** + * Genesis Plus 1.2a + * Main Emulation + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ #include "shared.h" @@ -22,179 +27,131 @@ #define CLOCK_PAL 53203424 #define SND_SIZE (snd.buffer_size * sizeof(int16)) +/* Global variables */ t_bitmap bitmap; t_snd snd; -uint32 aim_m68k = 0; -uint32 count_m68k = 0; -uint32 dma_m68k = 0; -uint32 aim_z80 = 0; -uint32 count_z80 = 0; -int32 current_z80 = 0; -uint16 misc68Kcycles = 488; -uint16 miscZ80cycles = 228; -uint16 lines_per_frame = 262; -uint16 m68cyc_per_sample = 160; -uint16 z80cyc_per_sample = 75; -double Master_Clock = (double)CLOCK_NTSC; -void *myFM = NULL; -uint8 alttiming = 0; +uint8 vdp_rate; +uint16 lines_per_frame; +double Master_Clock; +uint32 m68cycles_per_line; +uint32 z80cycles_per_line; +uint32 aim_m68k; +uint32 count_m68k; +uint32 line_m68k; +uint32 aim_z80; +uint32 count_z80; +uint32 line_z80; +int32 current_z80; +uint8 odd_frame; +uint8 interlaced; +uint32 frame_cnt; +uint8 system_hw; -void m68k_run (int cyc) +/* Function prototypes */ +static void audio_update (void); + +/**************************************************************** + * CPU execution managment + ****************************************************************/ + +/* Interrupt Manager + this is called before each new executed instruction + only if interrupts have been updated + */ +static inline void update_interrupts(void) { - /* cycles remaining to run for the line */ - int cyc_do = cyc - count_m68k; + uint8 latency = hvint_updated; + hvint_updated = -1; - /* 68k is not frozen */ - if (cyc_do > 0) + if (vint_pending && (reg[1] & 0x20)) { - /* interrupt handling */ - if (vint_pending && (reg[1] & 0x20)) m68k_set_irq(6); - else if (hint_pending && (reg[0] & 0x10)) m68k_set_irq(4); - else m68k_set_irq(0); - if (cyc_do > 0) m68k_execute(cyc_do); - count_m68k += cyc_do; - vint_pending = 0; + vint_triggered = 1; + if (latency) count_m68k += m68k_execute(latency); + m68k_set_irq(6); + } + else if (hint_pending && (reg[0] & 0x10)) + { + m68k_set_irq(4); + } + else + { + m68k_set_irq(0); + } +} + +static inline void m68k_run (int cyc) +{ + while (count_m68k < cyc) + { + /* check interrupts */ + if (hvint_updated >= 0) update_interrupts(); + + /* execute a single instruction */ + count_m68k += m68k_execute(1); } } void z80_run (int cyc) { - current_z80 = cyc - count_z80; + current_z80 = cyc - count_z80; if (current_z80 > 0) count_z80 += z80_execute(current_z80); } -void m68k_freeze(int cycles) -{ - extern int m68ki_remaining_cycles; - int extra_cycles = cycles - m68k_cycles_remaining(); - - if (extra_cycles > 0) - { - /* end of 68k execution */ - m68ki_remaining_cycles = 0; - - /* extra cycles to be burned at next execution */ - count_m68k += extra_cycles; - } - else m68ki_remaining_cycles -= cycles; /* we burn some 68k cycles */ -} - -int audio_init (int rate) -{ - double sample_cyc; - int vclk = (int)(Master_Clock / 7.0); /* 68000 and YM2612 clock */ - int zclk = (int)(Master_Clock / 15.0); /* Z80 and SN76489 clock */ - extern uint8 hq_fm; - - /* Clear the sound data context */ - memset (&snd, 0, sizeof (snd)); - - /* Make sure the requested sample rate is valid */ - if (!rate || ((rate < 8000) | (rate > 48000))) return (0); - - /* Calculate the sound buffer size */ - snd.buffer_size = (rate / vdp_rate); - snd.sample_rate = rate; - - /* Allocate sound buffers */ - if (FM_GENS) - { - snd.fm.gens_buffer[0] = realloc (snd.fm.gens_buffer[0], snd.buffer_size * sizeof (int)); - snd.fm.gens_buffer[1] = realloc (snd.fm.gens_buffer[1], snd.buffer_size * sizeof (int)); - if (!snd.fm.gens_buffer[0] || !snd.fm.gens_buffer[1]) return (-1); - memset (snd.fm.gens_buffer[0], 0, SND_SIZE*2); - memset (snd.fm.gens_buffer[1], 0, SND_SIZE*2); - } - else - { - snd.fm.buffer[0] = realloc (snd.fm.buffer[0], snd.buffer_size * sizeof (int16)); - snd.fm.buffer[1] = realloc (snd.fm.buffer[1], snd.buffer_size * sizeof (int16)); - if (!snd.fm.buffer[0] || !snd.fm.buffer[1]) return (-1); - memset (snd.fm.buffer[0], 0, SND_SIZE); - memset (snd.fm.buffer[1], 0, SND_SIZE); - } - - snd.psg.buffer = realloc (snd.psg.buffer, snd.buffer_size * sizeof (int16)); - if (!snd.psg.buffer) return (-1); - memset (snd.psg.buffer, 0, SND_SIZE); - - /* Set audio enable flag */ - snd.enabled = 1; - - /* Initialize sound chip emulation */ - if (PSG_MAME) SN76496_sh_start(zclk, 0, rate); - else - { - SN76489_Init(0, zclk, rate); - SN76489_Config(0, MUTE_ALLON, VOL_FULL, FB_SEGAVDP, SRW_SEGAVDP, 0); - } - - if (FM_GENS) YM2612_Init(vclk, rate, hq_fm); - else if (!myFM) myFM = YM2612Init (0, 0, vclk, rate, 0, 0); - - /* - CYCLE-ACCURATE SAMPLES GENERATION: - - We calculate number of cpu cycles between each new sound sample generation. - Since both 68000 and Z80 can write to the sound chips, we need the cycles step for both CPU: - At 48kHz, one sample is produced each 160 (NTSC) or 158 (PAL) 68k cycles - which is equivalent to 75 (NTSC) or 74 (PAL) Z80 cycles - */ - sample_cyc = Master_Clock / 7.0 / ((double) rate); - m68cyc_per_sample = (sample_cyc - (double)(int)sample_cyc) > 0.5 ? (int)(sample_cyc + 1) : (int)(sample_cyc); - sample_cyc = Master_Clock / 15.0 / ((double) rate); - z80cyc_per_sample = (sample_cyc - (double)(int)sample_cyc) > 0.5 ? (int)(sample_cyc + 1) : (int)(sample_cyc); - - return (0); -} - +/**************************************************************** + * Virtual Genesis initialization + ****************************************************************/ void system_init (void) { - /* PAL or NTSC timings */ - vdp_rate = (vdp_pal) ? 50 : 60; - lines_per_frame = (vdp_pal) ? 313 : 262; - Master_Clock = (vdp_pal) ? (double)CLOCK_PAL : (double)CLOCK_NTSC; - miscZ80cycles = (vdp_pal) ? 227 : 228; /* Master_Clock / 13 / vdp_rate / lines_per_frame */ - misc68Kcycles = (vdp_pal) ? 486 : 488; /* Master_Clock / 7 / vdp_rate / lines_per_frame */ + /* PAL/NTSC timings */ + vdp_rate = vdp_pal ? 50 : 60; + lines_per_frame = vdp_pal ? 313 : 262; + Master_Clock = vdp_pal ? (double)CLOCK_PAL : (double)CLOCK_NTSC; + + /* CPU cycles increments */ + z80cycles_per_line = 228; + m68cycles_per_line = 488; gen_init (); vdp_init (); render_init (); - sound_init(); + cart_hw_init(); } +/**************************************************************** + * Virtual Genesis Restart + ****************************************************************/ void system_reset (void) { - aim_m68k = 0; - count_m68k = 0; - dma_m68k = 0; - aim_z80 = 0; - count_z80 = 0; - - gen_reset (); - io_reset(); + aim_m68k = 0; + count_m68k = 0; + line_m68k = 0; + aim_z80 = 0; + count_z80 = 0; + line_z80 = 0; + current_z80 = 0; + odd_frame = 0; + interlaced = 0; + frame_cnt = 0; + + /* Cart Hardware reset */ + cart_hw_reset(); + + /* Hard reset */ + gen_reset (1); vdp_reset (); render_reset (); + io_reset(); + SN76489_Reset(0); - if (snd.enabled) - { - fm_reset(); - if (FM_GENS) - { - memset (snd.fm.gens_buffer[0], 0, SND_SIZE*2); - memset (snd.fm.gens_buffer[1], 0, SND_SIZE*2); - } - else - { - memset (snd.fm.buffer[0], 0, SND_SIZE); - memset (snd.fm.buffer[1], 0, SND_SIZE); - } - - if (!PSG_MAME) SN76489_Reset(0); - memset (snd.psg.buffer, 0, SND_SIZE); - } + /* Sound buffers reset */ + memset (snd.psg.buffer, 0, SND_SIZE); + memset (snd.fm.buffer[0], 0, SND_SIZE*2); + memset (snd.fm.buffer[1], 0, SND_SIZE*2); } +/**************************************************************** + * Virtual Genesis shutdown + ****************************************************************/ void system_shutdown (void) { gen_shutdown (); @@ -202,180 +159,208 @@ void system_shutdown (void) render_shutdown (); } +/**************************************************************** + * Virtual Genesis Frame emulation + ****************************************************************/ int system_frame (int do_skip) { - /* update total cycles count */ - dma_m68k += count_m68k; - - /* reset line cycles counts */ - aim_m68k = 0; + int line; + + /* reset cycles counts */ count_m68k = 0; - aim_z80 = 0; + aim_m68k = 0; + aim_z80 = 0; count_z80 = 0; - lastbusreqcnt = -1000; + fifo_write_cnt = 0; + fifo_lastwrite = 0; + + /* increment frame counter */ + frame_cnt ++; if (!gen_running) return 0; - /* Clear V-Blank flag */ - status &= 0xFFF7; + /* Clear VBLANK & DMA BUSY flags */ + status &= 0xFFF5; - /* Toggle even/odd flag (IM2 only) */ - if (im2_flag) status ^= 0x0010; + /* Look for interlace mode change */ + uint8 old_interlaced = interlaced; + interlaced = (reg[12] & 2) >> 1; + if (old_interlaced != interlaced) + { + bitmap.viewport.changed = 2; + im2_flag = ((reg[12] & 6) == 6) ? 1 : 0; + odd_frame = 1; + } + + /* Toggle even/odd field flag (interlaced modes only) */ + odd_frame ^= 1; + if (odd_frame && interlaced) status |= 0x0010; + else status &= 0xFFEF; /* Reset HCounter */ h_counter = reg[10]; - /* Point to start of sound buffer */ - snd.fm.lastStage = snd.fm.curStage = 0; - snd.psg.lastStage = snd.psg.curStage = 0; - /* Parse sprites for line 0 (done on line 261 or 312) */ parse_satb (0x80); /* Line processing */ - for (v_counter = 0; v_counter < lines_per_frame; v_counter ++) + for (line = 0; line < lines_per_frame; line ++) { - /* update cpu cycles goal for the line */ - aim_z80 += miscZ80cycles; - aim_m68k += misc68Kcycles; + /* Update VCounter */ + v_counter = line; - /* 6-Buttons or Menacer update */ - input_update(); + /* 6-Buttons or Menacer update */ + input_update(); - /* If a Z80 interrupt is still pending after a scanline, cancel it */ - if (zirq) - { - zirq = 0; - z80_set_irq_line(0, CLEAR_LINE); - } + /* Update CPU cycle counters */ + line_m68k = aim_m68k; + line_z80 = aim_z80; + aim_z80 += z80cycles_per_line; + aim_m68k += m68cycles_per_line; - /* H Int */ - if (v_counter <= frame_end) + /* Check "soft reset" */ + if (line == resetline) gen_reset(0); + + /* Horizontal Interrupt */ + if (line <= bitmap.viewport.h) { if(--h_counter < 0) { h_counter = reg[10]; hint_pending = 1; - } + hvint_updated = 0; + + /* previous scanline was shortened (see below), we execute extra cycles on this line */ + if (line != 0) aim_m68k += 36; + } + + /* HINT will be triggered on next line, approx. 36 cycles before VDP starts line rendering */ + /* during this period, any VRAM/CRAM/VSRAM writes should NOT be taken in account before next line */ + /* as a result, current line is shortened */ + /* fix Lotus 1, Lotus 2 RECS, Striker, Zero the Kamikaze Squirell */ + if ((line < bitmap.viewport.h)&&(h_counter == 0)) aim_m68k -= 36; } - /* hack for Lotus 2 Recs */ - if (alttiming && !do_skip) + /* Check if there is any DMA in progess */ + if (dma_length) dma_update(); + + /* Render Line */ + if (!do_skip) + { + render_line(line,odd_frame); + if (line < (bitmap.viewport.h-1)) parse_satb(0x81 + line); + } + + /* Vertical Retrace */ + if (line == bitmap.viewport.h) { - if (v_counter < frame_end) render_line(v_counter); - if (v_counter < (frame_end-1)) parse_satb(0x81 + v_counter); + /* update inputs */ + update_input(); + + /* set VBLANK flag */ + status |= 0x08; + + /* Z80 interrupt is 16ms period (one frame) and 64us length (one scanline) */ + zirq = 1; + z80_set_irq_line(0, ASSERT_LINE); + + /* delay between HINT, VBLANK and VINT (approx. 14.7 us) */ + m68k_run(line_m68k + 84); /* need to take upcoming latency in account (Hurricanes, Outrunners) */ + if (zreset && !zbusreq) z80_run(line_z80 + 40); + else count_z80 = line_z80 + 40; + + /* Vertical Interrupt */ + status |= 0x80; + vint_pending = 1; + hvint_updated = 30; /* Tyrants, Mega-Lo-Mania & Ex Mutant need some cycles to read VINT flag */ } + else if (zirq) + { + /* clear any pending Z80 interrupt */ + zirq = 0; + z80_set_irq_line(0, CLEAR_LINE); + } - /* H retrace */ - status |= 0x0004; // HBlank = 1 - m68k_run(aim_m68k - 404); - - if (!alttiming && !do_skip) - { - if (v_counter < frame_end) render_line(v_counter); - if (v_counter < (frame_end-1)) parse_satb(0x81 + v_counter); - } - - if (v_counter == frame_end) - { - /* V Retrace */ - status |= 0x0008; // VBlank = 1 - m68k_run(aim_m68k - 360); - if (zreset == 1 && zbusreq == 0) z80_run(aim_z80 - 168); - else count_z80 = aim_z80 - 168; - - /* V Int */ - vint_pending = 1; - status |= 0x0080; - - /* Z Int */ - if (zreset == 1 && zbusreq == 0) - { - zirq = 1; - z80_set_irq_line(0, ASSERT_LINE); - } - } - - status &= 0xFFFB; // HBlank = 0 - - /* Process end of line */ + /* Process line */ m68k_run(aim_m68k); if (zreset == 1 && zbusreq == 0) z80_run(aim_z80); else count_z80 = aim_z80; - - /* Update FM timers (one raster takes approx. 63.7 us) */ - fm_update_timers (64); + + /* SVP chip */ + if (svp) ssp1601_run(SVP_cycles); } - if (snd.enabled) audio_update (); + audio_update (); + return gen_running; } -#ifdef NGC -/**************************************************************************** - * softdev - 09 Mar 2006 - * - * - * Nintendo Gamecube Specific Mixer from here on in ... - ****************************************************************************/ -extern unsigned char soundbuffer[16][3840]; -extern int mixbuffer; -extern double psg_preamp; -extern double fm_preamp; -extern u8 boost; +/**************************************************************** + * Audio System + ****************************************************************/ +int audio_init (int rate) +{ + /* Clear the sound data context */ + memset (&snd, 0, sizeof (snd)); + + /* Make sure the requested sample rate is valid */ + if (!rate || ((rate < 8000) | (rate > 48000))) return (0); + snd.sample_rate = rate; + + /* Calculate the sound buffer size (for one frame) */ + snd.buffer_size = (rate / vdp_rate); + + /* (re)allocate sound buffers */ + snd.fm.buffer[0] = realloc (snd.fm.buffer[0], snd.buffer_size * sizeof (int)); + snd.fm.buffer[1] = realloc (snd.fm.buffer[1], snd.buffer_size * sizeof (int)); + if (!snd.fm.buffer[0] || !snd.fm.buffer[1]) return (-1); + memset (snd.fm.buffer[0], 0, SND_SIZE*2); + memset (snd.fm.buffer[1], 0, SND_SIZE*2); + snd.psg.buffer = realloc (snd.psg.buffer, SND_SIZE); + if (!snd.psg.buffer) return (-1); + memset (snd.psg.buffer, 0, SND_SIZE); + + /* Set audio enable flag */ + snd.enabled = 1; + + /* Initialize Sound Chips emulation */ + sound_init(rate); + + return (0); +} + static int ll, rr; -void audio_update (void) +static void audio_update (void) { int i; - int l, r; - int16 *tempBuffer[2]; + int l, r; + double psg_preamp = config.psg_preamp; + double fm_preamp = config.fm_preamp; + uint8 boost = config.boost; + +#ifdef NGC int16 *sb = (int16 *) soundbuffer[mixbuffer]; +#endif /* get remaining samples */ - /* YM2612 */ - if (FM_GENS) - { - int *fmBuffer[2]; - fmBuffer[0] = snd.fm.gens_buffer[0] + snd.fm.lastStage; - fmBuffer[1] = snd.fm.gens_buffer[1] + snd.fm.lastStage; - YM2612_Update(fmBuffer, snd.buffer_size - snd.fm.lastStage); - } - else - { - tempBuffer[0] = snd.fm.buffer[0] + snd.fm.lastStage; - tempBuffer[1] = snd.fm.buffer[1] + snd.fm.lastStage; - YM2612UpdateOne (myFM, tempBuffer, snd.buffer_size - snd.fm.lastStage); - } - - /* PSG */ - tempBuffer[0] = snd.psg.buffer + snd.psg.lastStage; - if (PSG_MAME) SN76496Update (0, tempBuffer[0], snd.buffer_size - snd.psg.lastStage); - else SN76489_Update(0, tempBuffer[0], snd.buffer_size - snd.psg.lastStage); + sound_update(); /* mix samples */ for (i = 0; i < snd.buffer_size; i ++) { - /* PSG */ l = r = (int) ((double)snd.psg.buffer[i] * psg_preamp); - - if (FM_GENS) - { - l += (int) ((double)snd.fm.gens_buffer[0][i] * fm_preamp); - r += (int) ((double)snd.fm.gens_buffer[1][i] * fm_preamp); - snd.fm.gens_buffer[0][i] = 0; - snd.fm.gens_buffer[1][i] = 0; - } - else - { - l += (int) ((double)snd.fm.buffer[0][i] * fm_preamp); - r += (int) ((double)snd.fm.buffer[1][i] * fm_preamp); - } + l += (int) ((double)snd.fm.buffer[0][i] * fm_preamp); + r += (int) ((double)snd.fm.buffer[1][i] * fm_preamp); + snd.fm.buffer[0][i] = 0; + snd.fm.buffer[1][i] = 0; + snd.psg.buffer[i] = 0; - /* single-pole low-pass filter (6 dB/octave) */ + /* single-pole low-pass filter (6 dB/octave) */ ll = (ll + l) >> 1; rr = (rr + r) >> 1; + /* boost volume if asked*/ l = ll * boost; r = rr * boost; @@ -385,59 +370,18 @@ void audio_update (void) if (r > 32767) r = 32767; else if (r < -32768) r = -32768; + /* update sound buffer */ +#ifdef NGC + *sb++ = r; // RIGHT channel comes first *sb++ = l; - *sb++ = r; - } - - mixbuffer++; - mixbuffer &= 0xf; -} #else -void audio_update (void) -{ - int i; - int16 acc; - int16 *tempBuffer[2]; - - if (FM_GENS) - { - int *fmBuffer[2]; - fmBuffer[0] = snd.fm.gens_buffer[0] + snd.fm.lastStage; - fmBuffer[1] = snd.fm.gens_buffer[1] + snd.fm.lastStage; - YM2612_Update(fmBuffer, snd.buffer_size - snd.fm.lastStage); - } - else - { - tempBuffer[0] = snd.fm.buffer[0] + snd.fm.lastStage; - tempBuffer[1] = snd.fm.buffer[1] + snd.fm.lastStage; - YM2612UpdateOne (myFM, tempBuffer, snd.buffer_size - snd.fm.lastStage); - } - - tempBuffer[0] = snd.psg.buffer + snd.psg.lastStage; - if (PSG_MAME) SN76496Update (0, tempBuffer[0], snd.buffer_size - snd.psg.lastStage); - else SN76489_Update(0, tempBuffer[0], snd.buffer_size - snd.psg.lastStage); - - for (i = 0; i < snd.buffer_size; i += 1) - { - int16 psg = snd.psg.buffer[i] / 2; - - acc = 0; - acc += FM_GENS ? snd.fm.gens_buffer[0][i] : snd.fm.buffer[0][i]; - acc += psg; - snd.buffer[0][i] = acc; - - acc = 0; - acc += FM_GENS ? snd.fm.gens_buffer[1][i] : snd.fm.buffer[1][i]; - acc += psg; - snd.buffer[1][i] = acc; - - if (FM_GENS) - { - snd.fm.gens_buffer[0][i] = 0; - snd.fm.gens_buffer[1][i] = 0; - } - - } -} + snd.buffer[0][i] = l; + snd.buffer[1][i] = r; #endif + } +#ifdef NGC + mixbuffer++; + mixbuffer &= 0xf; +#endif +} diff --git a/source/system.h b/source/system.h index b250dd3..d1ceedb 100644 --- a/source/system.h +++ b/source/system.h @@ -1,77 +1,102 @@ - -#ifndef _SYSTEM_H_ -#define _SYSTEM_H_ - -typedef struct -{ - uint8 *data; /* Bitmap data */ - int width; /* Bitmap width (32+512+32) */ - int height; /* Bitmap height (256) */ - int depth; /* Color depth (8 bits) */ - int pitch; /* Width of bitmap in bytes */ - int granularity; /* Size of each pixel in bytes */ - int remap; /* 1= Translate pixel data */ - struct - { - int x; /* X offset of viewport within bitmap */ - int y; /* Y offset of viewport within bitmap */ - int w; /* Width of viewport */ - int h; /* Height of viewport */ - int ow; /* Previous width of viewport */ - int oh; /* Previous height of viewport */ - int changed; /* 1= Viewport width or height have changed */ - } viewport; -} t_bitmap; - - -typedef struct -{ - int sample_rate; /* Sample rate (8000-44100) */ - int enabled; /* 1= sound emulation is enabled */ - int buffer_size; /* Size of sound buffer (in bytes) */ - int16 *buffer[2]; /* Signed 16-bit stereo sound data */ - struct - { - int curStage; - int lastStage; - int *gens_buffer[2]; - int16 *buffer[2]; - } fm; - struct - { - int curStage; - int lastStage; - int16 *buffer; - } psg; -} t_snd; - -/* Global variables */ -extern t_bitmap bitmap; -extern t_snd snd; -extern uint8 initialized; -extern uint32 aim_m68k; -extern uint32 count_m68k; -extern uint32 dma_m68k; -extern uint32 aim_z80; -extern uint32 count_z80; -extern int32 current_z80; -extern uint16 misc68Kcycles; -extern uint16 miscZ80cycles; -extern uint16 lines_per_frame; -extern uint16 m68cyc_per_sample; -extern uint16 z80cyc_per_sample; -extern double Master_Clock; - -/* Function prototypes */ -void system_init (void); -void system_reset (void); -void system_shutdown (void); -int system_frame(int skip); -void m68k_run (int cyc); -void z80_run (int cyc); -void m68k_freeze(int cycles); -int audio_init (int rate); -void audio_update (void); - -#endif /* _SYSTEM_H_ */ - +/*************************************************************************************** + * Genesis Plus 1.2a + * Main Emulation + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#ifndef _SYSTEM_H_ +#define _SYSTEM_H_ + +#define SYSTEM_GENESIS 0 +#define SYSTEM_MEGADRIVE 1 +#define SYSTEM_PICO 2 + +typedef struct +{ + uint8 *data; /* Bitmap data */ + int width; /* Bitmap width (32+512+32) */ + int height; /* Bitmap height (256) */ + int depth; /* Color depth (8 bits) */ + int pitch; /* Width of bitmap in bytes */ + int granularity; /* Size of each pixel in bytes */ + int remap; /* 1= Translate pixel data */ + struct + { + int x; /* X offset of viewport within bitmap */ + int y; /* Y offset of viewport within bitmap */ + int w; /* Width of viewport */ + int h; /* Height of viewport */ + int ow; /* Previous width of viewport */ + int oh; /* Previous height of viewport */ + int changed; /* 1= Viewport width or height have changed */ + } viewport; +} t_bitmap; + + +typedef struct +{ + int sample_rate; /* Sample rate (8000-48000) */ + int enabled; /* 1= sound emulation is enabled */ + int buffer_size; /* Size of sound buffer (in bytes) */ + int16 *buffer[2]; /* Signed 16-bit stereo sound data */ + struct + { + int curStage; + int lastStage; + int *buffer[2]; + } fm; + struct + { + int curStage; + int lastStage; + int16 *buffer; + } psg; +} t_snd; + +/* Global variables */ +extern t_bitmap bitmap; +extern t_snd snd; +extern uint16 lines_per_frame; +extern double Master_Clock; +extern uint8 vdp_rate; +extern uint32 m68cycles_per_line; +extern uint32 z80cycles_per_line; +extern uint32 aim_m68k; +extern uint32 count_m68k; +extern uint32 line_m68k; +extern uint32 aim_z80; +extern uint32 count_z80; +extern uint32 line_z80; +extern int32 current_z80; +extern uint8 interlaced; +extern uint8 odd_frame; +extern uint32 frame_cnt; +extern uint8 system_hw; + +/* Function prototypes */ +extern void system_init (void); +extern void system_reset (void); +extern void system_shutdown (void); +extern int system_frame(int skip); +extern void z80_run (int cyc); +extern int audio_init (int rate); + +#endif /* _SYSTEM_H_ */ + diff --git a/source/types.h b/source/types.h index 8436c5e..ee6a713 100644 --- a/source/types.h +++ b/source/types.h @@ -1,13 +1,33 @@ - -#ifndef _TYPES_H_ -#define _TYPES_H_ - -typedef unsigned char uint8; -typedef unsigned short int uint16; -typedef unsigned long int uint32; - -typedef signed char int8; -typedef signed short int int16; -typedef signed long int int32; - -#endif /* _TYPES_H_ */ +/* + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _TYPES_H_ +#define _TYPES_H_ + +#undef uint8 +#undef uint16 +#undef uint32 + +#define uint8 unsigned char +#define uint16 unsigned short +#define uint32 unsigned int +#define int8 signed char +#define int16 signed short +#define int32 signed long int + +#endif /* _TYPES_H_ */ diff --git a/source/unused/dos/SEALINTF.C b/source/unused/dos/SEALINTF.C index 3be0dbc..fa28dcc 100644 --- a/source/unused/dos/SEALINTF.C +++ b/source/unused/dos/SEALINTF.C @@ -1,288 +1,288 @@ - -#include "osd.h" - -int seal_sample_rate = 44100; -int seal_sound_card = -1; - -HAC hVoice[NUMVOICES]; -LPAUDIOWAVE lpWave[NUMVOICES]; -AUDIOINFO info; -AUDIOCAPS caps; -int c[MAX_STREAM_CHANNELS]; -int nominal_sample_rate; -static int attenuation = 0; -static int master_volume = 256; - - -void osd_update_audio(void) -{ - if (seal_sample_rate == 0) return; - AUpdateAudio(); -} - - -/* attenuation in dB */ -void osd_set_mastervolume(int _attenuation) -{ - float volume; - - attenuation = _attenuation; - - volume = 256.0; /* range is 0-256 */ - while (_attenuation++ < 0) - volume /= 1.122018454; /* = (10 ^ (1/20)) = 1dB */ - - master_volume = volume; - - ASetAudioMixerValue(AUDIO_MIXER_MASTER_VOLUME,master_volume); -} - - -int msdos_init_sound(int *rate, int card) -{ - int i; - - seal_sample_rate = *rate; - seal_sound_card = card; - - if (AInitialize() != AUDIO_ERROR_NONE) - return 1; - - /* Ask the user if no sound card was chosen */ - if (seal_sound_card == -1) - { - unsigned int k; - - printf("\n SELECT YOUR AUDIO DEVICE :\n\n" - " AWE32/64 playback requires onboard DRAM,\n" - " Sound Blaster playback is the most compatible & better for emulation\n\n"); - - for (k = 0;k < AGetAudioNumDevs();k++) - { - if (AGetAudioDevCaps(k,&caps) == AUDIO_ERROR_NONE) - printf(" %2d. %s\n",k,caps.szProductName); - } - printf("\n"); - - if (k < 10) - { - i = getch(); - seal_sound_card = i - '0'; - } - else - scanf("%d",&seal_sound_card); - } - - /* initialize SEAL audio library */ - if (seal_sound_card == 0) /* silence */ - { - /* update the Machine structure to show that sound is disabled */ - seal_sample_rate = 0; - exit(0); - return 0; - } - - /* open audio device */ - /* info.nDeviceId = AUDIO_DEVICE_MAPPER;*/ - info.nDeviceId = seal_sound_card; - /* always use 16 bit mixing if possible - better quality and same speed of 8 bit */ - info.wFormat = AUDIO_FORMAT_16BITS | AUDIO_FORMAT_STEREO | AUDIO_FORMAT_RAW_SAMPLE; - - info.nSampleRate = seal_sample_rate; - if (AOpenAudio(&info) != AUDIO_ERROR_NONE) - { - return (1); - } - - AGetAudioDevCaps(info.nDeviceId,&caps); - printf("Using `%s' at %d-bit %s %u Hz\n", - caps.szProductName, - info.wFormat & AUDIO_FORMAT_16BITS ? 16 : 8, - info.wFormat & AUDIO_FORMAT_STEREO ? "stereo" : "mono", - info.nSampleRate); - - /* open and allocate voices, allocate waveforms */ - if (AOpenVoices(NUMVOICES) != AUDIO_ERROR_NONE) - { - printf("voices initialization failed\n"); - return 1; - } - - for (i = 0; i < NUMVOICES; i++) - { - if (ACreateAudioVoice(&hVoice[i]) != AUDIO_ERROR_NONE) - { - printf("voice #%d creation failed\n",i); - return 1; - } - - ASetVoicePanning(hVoice[i],128); - - lpWave[i] = 0; - } - - /* update the Machine structure to reflect the actual sample rate */ - *rate = seal_sample_rate = info.nSampleRate; - - { - uclock_t a,b; - LONG start,end; - - - if ((lpWave[0] = (LPAUDIOWAVE)malloc(sizeof(AUDIOWAVE))) == 0) - return 1; - - lpWave[0]->wFormat = AUDIO_FORMAT_8BITS | AUDIO_FORMAT_MONO; - lpWave[0]->nSampleRate = seal_sample_rate; - lpWave[0]->dwLength = 3*seal_sample_rate; - lpWave[0]->dwLoopStart = 0; - lpWave[0]->dwLoopEnd = 3*seal_sample_rate; - if (ACreateAudioData(lpWave[0]) != AUDIO_ERROR_NONE) - { - free(lpWave[0]); - lpWave[0] = 0; - - return 1; - } - - memset(lpWave[0]->lpData,0,3*seal_sample_rate); - /* upload the data to the audio DRAM local memory */ - AWriteAudioData(lpWave[0],0,3*seal_sample_rate); - APrimeVoice(hVoice[0],lpWave[0]); - ASetVoiceFrequency(hVoice[0],seal_sample_rate); - ASetVoiceVolume(hVoice[0],0); - AStartVoice(hVoice[0]); - - a = uclock(); - /* wait some time to let everything stabilize */ - do - { - osd_update_audio(); - b = uclock(); - } while (b-a < UCLOCKS_PER_SEC/10); - - a = uclock(); - AGetVoicePosition(hVoice[0],&start); - do - { - osd_update_audio(); - b = uclock(); - } while (b-a < UCLOCKS_PER_SEC); - AGetVoicePosition(hVoice[0],&end); - - nominal_sample_rate = seal_sample_rate; - seal_sample_rate = end - start; - - AStopVoice(hVoice[0]); - ADestroyAudioData(lpWave[0]); - free(lpWave[0]); - lpWave[0] = 0; - } - - osd_set_mastervolume(0); /* start at maximum volume */ - - return 0; -} - - -void msdos_shutdown_sound(void) -{ - if (seal_sample_rate != 0) - { - int n; - - /* stop and release voices */ - for (n = 0; n < NUMVOICES; n++) - { - AStopVoice(hVoice[n]); - ADestroyAudioVoice(hVoice[n]); - if (lpWave[n]) - { - ADestroyAudioData(lpWave[n]); - free(lpWave[n]); - lpWave[n] = 0; - } - } - ACloseVoices(); - ACloseAudio(); - } -} - - -void playstreamedsample(int channel,signed char *data,int len,int freq,int volume,int pan,int bits) -{ - static int playing[NUMVOICES]; - static int c[NUMVOICES]; - - /* backwards compatibility with old 0-255 volume range */ - if (volume > 100) volume = volume * 25 / 255; - - if (seal_sample_rate == 0 || channel >= NUMVOICES) return; - - if (!playing[channel]) - { - if (lpWave[channel]) - { - AStopVoice(hVoice[channel]); - ADestroyAudioData(lpWave[channel]); - free(lpWave[channel]); - lpWave[channel] = 0; - } - - if ((lpWave[channel] = (LPAUDIOWAVE)malloc(sizeof(AUDIOWAVE))) == 0) - return; - - lpWave[channel]->wFormat = (bits == 8 ? AUDIO_FORMAT_8BITS : AUDIO_FORMAT_16BITS) - | AUDIO_FORMAT_MONO | AUDIO_FORMAT_LOOP; - lpWave[channel]->nSampleRate = nominal_sample_rate; - lpWave[channel]->dwLength = 3*len; - lpWave[channel]->dwLoopStart = 0; - lpWave[channel]->dwLoopEnd = 3*len; - if (ACreateAudioData(lpWave[channel]) != AUDIO_ERROR_NONE) - { - free(lpWave[channel]); - lpWave[channel] = 0; - - return; - } - - memset(lpWave[channel]->lpData,0,3*len); - memcpy(lpWave[channel]->lpData,data,len); - /* upload the data to the audio DRAM local memory */ - AWriteAudioData(lpWave[channel],0,3*len); - APrimeVoice(hVoice[channel],lpWave[channel]); - /* need to cast to double because freq*nominal_sample_rate can exceed the size of an int */ - ASetVoiceFrequency(hVoice[channel],(double)freq*nominal_sample_rate/seal_sample_rate); - AStartVoice(hVoice[channel]); - playing[channel] = 1; - c[channel] = 1; - } - else - { - LONG pos; - - for(;;) - { - AGetVoicePosition(hVoice[channel],&pos); - if (c[channel] == 0 && pos >= len) break; - if (c[channel] == 1 && (pos < len || pos >= 2*len)) break; - if (c[channel] == 2 && pos < 2*len) break; - osd_update_audio(); - } - - memcpy(&lpWave[channel]->lpData[len * c[channel]],data,len); - AWriteAudioData(lpWave[channel],len*c[channel],len); - c[channel]++; - if (c[channel] == 3) c[channel] = 0; - } - - - ASetVoiceVolume(hVoice[channel],volume * 64 / 100); - ASetVoicePanning(hVoice[channel],(pan + 100) * 255 / 200); -} - -void osd_play_streamed_sample_16(int channel,signed short *data,int len,int freq,int volume,int pan) -{ - playstreamedsample(channel,(signed char *)data,len,freq,volume,pan,16); -} - + +#include "osd.h" + +int seal_sample_rate = 44100; +int seal_sound_card = -1; + +HAC hVoice[NUMVOICES]; +LPAUDIOWAVE lpWave[NUMVOICES]; +AUDIOINFO info; +AUDIOCAPS caps; +int c[MAX_STREAM_CHANNELS]; +int nominal_sample_rate; +static int attenuation = 0; +static int master_volume = 256; + + +void osd_update_audio(void) +{ + if (seal_sample_rate == 0) return; + AUpdateAudio(); +} + + +/* attenuation in dB */ +void osd_set_mastervolume(int _attenuation) +{ + float volume; + + attenuation = _attenuation; + + volume = 256.0; /* range is 0-256 */ + while (_attenuation++ < 0) + volume /= 1.122018454; /* = (10 ^ (1/20)) = 1dB */ + + master_volume = volume; + + ASetAudioMixerValue(AUDIO_MIXER_MASTER_VOLUME,master_volume); +} + + +int msdos_init_sound(int *rate, int card) +{ + int i; + + seal_sample_rate = *rate; + seal_sound_card = card; + + if (AInitialize() != AUDIO_ERROR_NONE) + return 1; + + /* Ask the user if no sound card was chosen */ + if (seal_sound_card == -1) + { + unsigned int k; + + printf("\n SELECT YOUR AUDIO DEVICE :\n\n" + " AWE32/64 playback requires onboard DRAM,\n" + " Sound Blaster playback is the most compatible & better for emulation\n\n"); + + for (k = 0;k < AGetAudioNumDevs();k++) + { + if (AGetAudioDevCaps(k,&caps) == AUDIO_ERROR_NONE) + printf(" %2d. %s\n",k,caps.szProductName); + } + printf("\n"); + + if (k < 10) + { + i = getch(); + seal_sound_card = i - '0'; + } + else + scanf("%d",&seal_sound_card); + } + + /* initialize SEAL audio library */ + if (seal_sound_card == 0) /* silence */ + { + /* update the Machine structure to show that sound is disabled */ + seal_sample_rate = 0; + exit(0); + return 0; + } + + /* open audio device */ + /* info.nDeviceId = AUDIO_DEVICE_MAPPER;*/ + info.nDeviceId = seal_sound_card; + /* always use 16 bit mixing if possible - better quality and same speed of 8 bit */ + info.wFormat = AUDIO_FORMAT_16BITS | AUDIO_FORMAT_STEREO | AUDIO_FORMAT_RAW_SAMPLE; + + info.nSampleRate = seal_sample_rate; + if (AOpenAudio(&info) != AUDIO_ERROR_NONE) + { + return (1); + } + + AGetAudioDevCaps(info.nDeviceId,&caps); + printf("Using `%s' at %d-bit %s %u Hz\n", + caps.szProductName, + info.wFormat & AUDIO_FORMAT_16BITS ? 16 : 8, + info.wFormat & AUDIO_FORMAT_STEREO ? "stereo" : "mono", + info.nSampleRate); + + /* open and allocate voices, allocate waveforms */ + if (AOpenVoices(NUMVOICES) != AUDIO_ERROR_NONE) + { + printf("voices initialization failed\n"); + return 1; + } + + for (i = 0; i < NUMVOICES; i++) + { + if (ACreateAudioVoice(&hVoice[i]) != AUDIO_ERROR_NONE) + { + printf("voice #%d creation failed\n",i); + return 1; + } + + ASetVoicePanning(hVoice[i],128); + + lpWave[i] = 0; + } + + /* update the Machine structure to reflect the actual sample rate */ + *rate = seal_sample_rate = info.nSampleRate; + + { + uclock_t a,b; + LONG start,end; + + + if ((lpWave[0] = (LPAUDIOWAVE)malloc(sizeof(AUDIOWAVE))) == 0) + return 1; + + lpWave[0]->wFormat = AUDIO_FORMAT_8BITS | AUDIO_FORMAT_MONO; + lpWave[0]->nSampleRate = seal_sample_rate; + lpWave[0]->dwLength = 3*seal_sample_rate; + lpWave[0]->dwLoopStart = 0; + lpWave[0]->dwLoopEnd = 3*seal_sample_rate; + if (ACreateAudioData(lpWave[0]) != AUDIO_ERROR_NONE) + { + free(lpWave[0]); + lpWave[0] = 0; + + return 1; + } + + memset(lpWave[0]->lpData,0,3*seal_sample_rate); + /* upload the data to the audio DRAM local memory */ + AWriteAudioData(lpWave[0],0,3*seal_sample_rate); + APrimeVoice(hVoice[0],lpWave[0]); + ASetVoiceFrequency(hVoice[0],seal_sample_rate); + ASetVoiceVolume(hVoice[0],0); + AStartVoice(hVoice[0]); + + a = uclock(); + /* wait some time to let everything stabilize */ + do + { + osd_update_audio(); + b = uclock(); + } while (b-a < UCLOCKS_PER_SEC/10); + + a = uclock(); + AGetVoicePosition(hVoice[0],&start); + do + { + osd_update_audio(); + b = uclock(); + } while (b-a < UCLOCKS_PER_SEC); + AGetVoicePosition(hVoice[0],&end); + + nominal_sample_rate = seal_sample_rate; + seal_sample_rate = end - start; + + AStopVoice(hVoice[0]); + ADestroyAudioData(lpWave[0]); + free(lpWave[0]); + lpWave[0] = 0; + } + + osd_set_mastervolume(0); /* start at maximum volume */ + + return 0; +} + + +void msdos_shutdown_sound(void) +{ + if (seal_sample_rate != 0) + { + int n; + + /* stop and release voices */ + for (n = 0; n < NUMVOICES; n++) + { + AStopVoice(hVoice[n]); + ADestroyAudioVoice(hVoice[n]); + if (lpWave[n]) + { + ADestroyAudioData(lpWave[n]); + free(lpWave[n]); + lpWave[n] = 0; + } + } + ACloseVoices(); + ACloseAudio(); + } +} + + +void playstreamedsample(int channel,signed char *data,int len,int freq,int volume,int pan,int bits) +{ + static int playing[NUMVOICES]; + static int c[NUMVOICES]; + + /* backwards compatibility with old 0-255 volume range */ + if (volume > 100) volume = volume * 25 / 255; + + if (seal_sample_rate == 0 || channel >= NUMVOICES) return; + + if (!playing[channel]) + { + if (lpWave[channel]) + { + AStopVoice(hVoice[channel]); + ADestroyAudioData(lpWave[channel]); + free(lpWave[channel]); + lpWave[channel] = 0; + } + + if ((lpWave[channel] = (LPAUDIOWAVE)malloc(sizeof(AUDIOWAVE))) == 0) + return; + + lpWave[channel]->wFormat = (bits == 8 ? AUDIO_FORMAT_8BITS : AUDIO_FORMAT_16BITS) + | AUDIO_FORMAT_MONO | AUDIO_FORMAT_LOOP; + lpWave[channel]->nSampleRate = nominal_sample_rate; + lpWave[channel]->dwLength = 3*len; + lpWave[channel]->dwLoopStart = 0; + lpWave[channel]->dwLoopEnd = 3*len; + if (ACreateAudioData(lpWave[channel]) != AUDIO_ERROR_NONE) + { + free(lpWave[channel]); + lpWave[channel] = 0; + + return; + } + + memset(lpWave[channel]->lpData,0,3*len); + memcpy(lpWave[channel]->lpData,data,len); + /* upload the data to the audio DRAM local memory */ + AWriteAudioData(lpWave[channel],0,3*len); + APrimeVoice(hVoice[channel],lpWave[channel]); + /* need to cast to double because freq*nominal_sample_rate can exceed the size of an int */ + ASetVoiceFrequency(hVoice[channel],(double)freq*nominal_sample_rate/seal_sample_rate); + AStartVoice(hVoice[channel]); + playing[channel] = 1; + c[channel] = 1; + } + else + { + LONG pos; + + for(;;) + { + AGetVoicePosition(hVoice[channel],&pos); + if (c[channel] == 0 && pos >= len) break; + if (c[channel] == 1 && (pos < len || pos >= 2*len)) break; + if (c[channel] == 2 && pos < 2*len) break; + osd_update_audio(); + } + + memcpy(&lpWave[channel]->lpData[len * c[channel]],data,len); + AWriteAudioData(lpWave[channel],len*c[channel],len); + c[channel]++; + if (c[channel] == 3) c[channel] = 0; + } + + + ASetVoiceVolume(hVoice[channel],volume * 64 / 100); + ASetVoicePanning(hVoice[channel],(pan + 100) * 255 / 200); +} + +void osd_play_streamed_sample_16(int channel,signed short *data,int len,int freq,int volume,int pan) +{ + playstreamedsample(channel,(signed char *)data,len,freq,volume,pan,16); +} + diff --git a/source/unused/dos/SEALINTF.H b/source/unused/dos/SEALINTF.H index 368ab71..d3c1d4d 100644 --- a/source/unused/dos/SEALINTF.H +++ b/source/unused/dos/SEALINTF.H @@ -1,17 +1,17 @@ - -#ifndef _SEALINTF_H_ -#define _SEALINTF_H_ - -#define MAX_SOUND 4 -#define NUMVOICES 16 -#define MAX_STREAM_CHANNELS 6 - -/* Function prototypes */ -void osd_update_audio(void); -void osd_set_mastervolume(int _attenuation); -int msdos_init_sound(int *rate, int card); -void msdos_shutdown_sound(void); -void playstreamedsample(int channel,signed char *data,int len,int freq,int volume,int pan,int bits); -void osd_play_streamed_sample_16(int channel,signed short *data,int len,int freq,int volume,int pan); - -#endif /* _SEALINTF_H_ */ + +#ifndef _SEALINTF_H_ +#define _SEALINTF_H_ + +#define MAX_SOUND 4 +#define NUMVOICES 16 +#define MAX_STREAM_CHANNELS 6 + +/* Function prototypes */ +void osd_update_audio(void); +void osd_set_mastervolume(int _attenuation); +int msdos_init_sound(int *rate, int card); +void msdos_shutdown_sound(void); +void playstreamedsample(int channel,signed char *data,int len,int freq,int volume,int pan,int bits); +void osd_play_streamed_sample_16(int channel,signed short *data,int len,int freq,int volume,int pan); + +#endif /* _SEALINTF_H_ */ diff --git a/source/unused/dos/config.c b/source/unused/dos/config.c index 06c1fb7..2d38cc3 100644 --- a/source/unused/dos/config.c +++ b/source/unused/dos/config.c @@ -1,256 +1,289 @@ - -#include "osd.h" - -t_option option; - -void do_config(char *file) -{ - extern int __crt0_argc; - extern char **__crt0_argv; - - /* Our token list */ - int i, argc; - char *argv[TOKEN_LIST_SIZE]; - - set_option_defaults(); - for(i = 0; i < TOKEN_LIST_SIZE; i += 1) argv[i] = NULL; - - /* Check configuration file */ - if(file) parse_file(file, &argc, argv); - - /* Check extracted tokens */ - parse_args(argc, argv); - - /* Free token list */ - for(i = 0; i < argc; i += 1) if(argv[argc]) free (argv[argc]); - - /* Check command line */ - parse_args(__crt0_argc, __crt0_argv); -} - - -/* Parse configuration file */ -int parse_file(char *filename, int *argc, char **argv) -{ - char token[0x100]; - FILE *handle = NULL; - - *argc = 0; - handle = fopen(filename, "r"); - if(!handle) return (0); - - fscanf(handle, "%s", &token[0]); - while(!(feof(handle))) - { - int size = strlen(token) + 1; - argv[*argc] = malloc(size); - if(!argv[*argc]) return (0); - strcpy(argv[*argc], token); - *argc += 1; - fscanf(handle, "%s", &token[0]); - } - - if(handle) fclose(handle); - return (1); -} - - -int check_bool(char *token) -{ - int result = 1; - if(stricmp("off", token) == 0) - result = 0; - if(stricmp("no", token) == 0) - result = 0; - return (result); -} - - -void set_option_defaults(void) -{ - option.video_driver = GFX_AUTODETECT; - option.video_width = 320; - option.video_height = 240; - option.video_depth = 8; - - option.remap = 0; - option.scanlines = 0; - option.scale = 0; - - option.vsync = 0; - option.throttle = 0; - option.skip = 1; - - option.sound = 0; - option.sndcard = -1; - option.sndrate = 44100; - option.swap = 0; - - option.joy_driver = JOY_TYPE_AUTODETECT; -} - - -void print_options(void) -{ - printf(" -vdriver \t Select video driver (auto)\n"); - printf(" -res \t Specify display resolution (320x240)\n"); - printf(" -depth \t Specify display depth (8)\n"); - printf(" -remap \t Enable raster-based palette effects (8-bit color only)\n"); - printf(" -scanlines \t Enable scanlines effect\n"); - printf(" -scale \t Scale display to width of screen\n"); - printf(" -vsync \t Enable vsync polling\n"); - printf(" -throttle \t Enable speed throttling\n"); - printf(" -skip \t Specify frame skip level (1=no frames skipped)\n"); - printf(" -sound \t Enable sound output\n"); - printf(" -sndcard \t Select sound card\n"); - printf(" -sndrate \t Specify sound sample rate (8000-44100)\n"); - printf(" -swap \t Swap left and right channels\n"); - printf(" -joy \t Select joystick driver (auto)\n"); -} - - -void parse_args(int argc, char **argv) -{ - int i, j; - - for(i = 0; i < argc; i += 1) - { - if(stricmp("-vdriver", argv[i]) == 0) - { - for(j = 0; video_driver_table[j].token != NULL; j += 1) - { - if(stricmp(argv[i+1], video_driver_table[j].token) == 0) - { - option.video_driver = video_driver_table[j].value; - } - } - } - - if(stricmp("-res", argv[i]) == 0) - { - option.video_width = atoi(argv[i+1]); - option.video_height = atoi(argv[i+2]); - } - - if(stricmp("-depth", argv[i]) == 0) - { - option.video_depth = atoi(argv[i+1]); - } - - if(stricmp("-remap", argv[i]) == 0) - { - option.remap = check_bool(argv[i+1]); - } - - if(stricmp("-scanlines", argv[i]) == 0) - { - option.scanlines = check_bool(argv[i+1]); - } - - if(stricmp("-scale", argv[i]) == 0) - { - option.scale = check_bool(argv[i+1]); - } - - if(stricmp("-vsync", argv[i]) == 0) - { - option.vsync = check_bool(argv[i+1]); - } - - if(stricmp("-throttle", argv[i]) == 0) - { - option.throttle = check_bool(argv[i+1]); - } - - if(stricmp("-skip", argv[i]) == 0) - { - option.skip = atoi(argv[i+1]); - if(!option.skip) option.skip = 1; - } - - if(stricmp("-sound", argv[i]) == 0) - { - option.sound = check_bool(argv[i+1]); - } - - if(stricmp("-sndcard", argv[i]) == 0) - { - option.sndcard = atoi(argv[i+1]); - } - - if(stricmp("-sndrate", argv[i]) == 0) - { - option.sndrate = atoi(argv[i+1]); - } - - if(stricmp("-swap", argv[i]) == 0) - { - option.swap = check_bool(argv[i+1]); - } - - if(stricmp("-joy", argv[i]) == 0) - { - for(j = 0; joy_driver_table[j].token != NULL; j += 1) - { - if(stricmp(argv[i+1], joy_driver_table[j].token) == 0) - { - option.joy_driver = joy_driver_table[j].value; - } - } - } - } - - if(option.remap) option.video_depth = 8; -} - - -t_strint video_driver_table[] = -{ - { "auto", GFX_AUTODETECT }, - { "safe", GFX_SAFE }, - { "vga", GFX_VGA }, - { "modex", GFX_MODEX }, - { "vesa2l", GFX_VESA2L }, - { "vesa3", GFX_VESA3 }, - { "vbeaf", GFX_VBEAF }, - { NULL, 0 } -}; - - -t_strint joy_driver_table[] = -{ - { "auto", JOY_TYPE_AUTODETECT }, - { "none", JOY_TYPE_NONE }, - { "standard", JOY_TYPE_STANDARD }, - { "2pads", JOY_TYPE_2PADS }, - { "4button", JOY_TYPE_4BUTTON }, - { "6button", JOY_TYPE_6BUTTON }, - { "8button", JOY_TYPE_8BUTTON }, - { "fspro", JOY_TYPE_FSPRO }, - { "wingex", JOY_TYPE_WINGEX }, - { "sidewinder", JOY_TYPE_SIDEWINDER }, - { "gamepadpro", JOY_TYPE_GAMEPAD_PRO }, - { "grip", JOY_TYPE_GRIP }, - { "grip4", JOY_TYPE_GRIP4 }, - { "sneslpt1", JOY_TYPE_SNESPAD_LPT1 }, - { "sneslpt2", JOY_TYPE_SNESPAD_LPT2 }, - { "sneslpt3", JOY_TYPE_SNESPAD_LPT3 }, - { "psxlpt1", JOY_TYPE_PSXPAD_LPT1 }, - { "psxlpt2", JOY_TYPE_PSXPAD_LPT2 }, - { "psxlpt3", JOY_TYPE_PSXPAD_LPT3 }, - { "n64lpt1", JOY_TYPE_N64PAD_LPT1 }, - { "n64lpt2", JOY_TYPE_N64PAD_LPT2 }, - { "n64lpt3", JOY_TYPE_N64PAD_LPT3 }, - { "db9lpt1", JOY_TYPE_DB9_LPT1 }, - { "db9lpt2", JOY_TYPE_DB9_LPT2 }, - { "db9lpt3", JOY_TYPE_DB9_LPT3 }, - { "tglpt1", JOY_TYPE_TURBOGRAFX_LPT1 }, - { "tglpt2", JOY_TYPE_TURBOGRAFX_LPT2 }, - { "tglpt3", JOY_TYPE_TURBOGRAFX_LPT3 }, - { "wingwar", JOY_TYPE_WINGWARRIOR }, - { "segaisa", JOY_TYPE_IFSEGA_ISA}, - { "segapci", JOY_TYPE_IFSEGA_PCI}, - { "segapci2", JOY_TYPE_IFSEGA_PCI_FAST}, - { NULL, 0 } -}; - + +#include "osd.h" + +t_option option; +t_config config; + +void do_config(char *file) +{ + extern int __crt0_argc; + extern char **__crt0_argv; + + /* Our token list */ + int i, argc; + char *argv[TOKEN_LIST_SIZE]; + + set_option_defaults(); + for(i = 0; i < TOKEN_LIST_SIZE; i += 1) argv[i] = NULL; + + /* Check configuration file */ + if(file) parse_file(file, &argc, argv); + + /* Check extracted tokens */ + parse_args(argc, argv); + + /* Free token list */ + for(i = 0; i < argc; i += 1) if(argv[argc]) free (argv[argc]); + + /* Check command line */ + parse_args(__crt0_argc, __crt0_argv); +} + + +/* Parse configuration file */ +int parse_file(char *filename, int *argc, char **argv) +{ + char token[0x100]; + FILE *handle = NULL; + + *argc = 0; + handle = fopen(filename, "r"); + if(!handle) return (0); + + fscanf(handle, "%s", &token[0]); + while(!(feof(handle))) + { + int size = strlen(token) + 1; + argv[*argc] = malloc(size); + if(!argv[*argc]) return (0); + strcpy(argv[*argc], token); + *argc += 1; + fscanf(handle, "%s", &token[0]); + } + + if(handle) fclose(handle); + return (1); +} + + +int check_bool(char *token) +{ + int result = 1; + if(stricmp("off", token) == 0) + result = 0; + if(stricmp("no", token) == 0) + result = 0; + return (result); +} + + +void set_option_defaults(void) +{ + option.video_driver = GFX_AUTODETECT; + option.video_width = 320; + option.video_height = 240; + option.video_depth = 8; + + option.remap = 1; + option.scanlines = 0; + option.scale = 0; + + option.vsync = 0; + option.throttle = 0; + option.skip = 1; + + option.sound = 0; + option.sndcard = -1; + option.sndrate = 48000; + option.swap = 0; + + option.joy_driver = JOY_TYPE_NONE; +} + +/* additional options */ +void set_config_default() +{ + /* sound options */ + config.psg_preamp = 1.5; + config.fm_preamp = 1.0; + config.boost = 1; + config.hq_fm = 1; + config.fm_core = 0; + config.ssg_enabled = 0; + + /* system options */ + config.freeze_auto = -1; + config.sram_auto = -1; + config.region_detect = 0; + config.force_dtack = 0; + config.bios_enabled = 0; + + /* display options */ + config.xshift = 0; + config.yshift = 0; + config.xscale = 320; + config.yscale = 240; + config.aspect = 1; + config.overscan = 1; + config.render = 0; + + /* controllers options */ + config.sys_type[0] = 0; + config.sys_type[1] = 0; + config.crosshair = 1; +} + +void print_options(void) +{ + printf(" -vdriver \t Select video driver (auto)\n"); + printf(" -res \t Specify display resolution (320x240)\n"); + printf(" -depth \t Specify display depth (8)\n"); + printf(" -remap \t Enable raster-based palette effects (8-bit color only)\n"); + printf(" -scanlines \t Enable scanlines effect\n"); + printf(" -scale \t Scale display to width of screen\n"); + printf(" -vsync \t Enable vsync polling\n"); + printf(" -throttle \t Enable speed throttling\n"); + printf(" -skip \t Specify frame skip level (1=no frames skipped)\n"); + printf(" -sound \t Enable sound output\n"); + printf(" -sndcard \t Select sound card\n"); + printf(" -sndrate \t Specify sound sample rate (8000-44100)\n"); + printf(" -swap \t Swap left and right channels\n"); + printf(" -joy \t Select joystick driver (auto)\n"); +} + + +void parse_args(int argc, char **argv) +{ + int i, j; + + for(i = 0; i < argc; i += 1) + { + if(stricmp("-vdriver", argv[i]) == 0) + { + for(j = 0; video_driver_table[j].token != NULL; j += 1) + { + if(stricmp(argv[i+1], video_driver_table[j].token) == 0) + { + option.video_driver = video_driver_table[j].value; + } + } + } + + if(stricmp("-res", argv[i]) == 0) + { + option.video_width = atoi(argv[i+1]); + option.video_height = atoi(argv[i+2]); + } + + if(stricmp("-depth", argv[i]) == 0) + { + option.video_depth = atoi(argv[i+1]); + } + + if(stricmp("-remap", argv[i]) == 0) + { + option.remap = check_bool(argv[i+1]); + } + + if(stricmp("-scanlines", argv[i]) == 0) + { + option.scanlines = check_bool(argv[i+1]); + } + + if(stricmp("-scale", argv[i]) == 0) + { + option.scale = check_bool(argv[i+1]); + } + + if(stricmp("-vsync", argv[i]) == 0) + { + option.vsync = check_bool(argv[i+1]); + } + + if(stricmp("-throttle", argv[i]) == 0) + { + option.throttle = check_bool(argv[i+1]); + } + + if(stricmp("-skip", argv[i]) == 0) + { + option.skip = atoi(argv[i+1]); + if(!option.skip) option.skip = 1; + } + + if(stricmp("-sound", argv[i]) == 0) + { + option.sound = check_bool(argv[i+1]); + } + + if(stricmp("-sndcard", argv[i]) == 0) + { + option.sndcard = atoi(argv[i+1]); + } + + if(stricmp("-sndrate", argv[i]) == 0) + { + option.sndrate = atoi(argv[i+1]); + } + + if(stricmp("-swap", argv[i]) == 0) + { + option.swap = check_bool(argv[i+1]); + } + + if(stricmp("-joy", argv[i]) == 0) + { + for(j = 0; joy_driver_table[j].token != NULL; j += 1) + { + if(stricmp(argv[i+1], joy_driver_table[j].token) == 0) + { + option.joy_driver = joy_driver_table[j].value; + } + } + } + } + + //if(option.remap) option.video_depth = 8; +} + + +t_strint video_driver_table[] = +{ + { "auto", GFX_AUTODETECT }, + { "safe", GFX_SAFE }, + { "vga", GFX_VGA }, + { "modex", GFX_MODEX }, + { "vesa2l", GFX_VESA2L }, + { "vesa3", GFX_VESA3 }, + { "vbeaf", GFX_VBEAF }, + { NULL, 0 } +}; + + +t_strint joy_driver_table[] = +{ + { "auto", JOY_TYPE_AUTODETECT }, + { "none", JOY_TYPE_NONE }, + { "standard", JOY_TYPE_STANDARD }, + { "2pads", JOY_TYPE_2PADS }, + { "4button", JOY_TYPE_4BUTTON }, + { "6button", JOY_TYPE_6BUTTON }, + { "8button", JOY_TYPE_8BUTTON }, + { "fspro", JOY_TYPE_FSPRO }, + { "wingex", JOY_TYPE_WINGEX }, + { "sidewinder", JOY_TYPE_SIDEWINDER }, + { "gamepadpro", JOY_TYPE_GAMEPAD_PRO }, + { "grip", JOY_TYPE_GRIP }, + { "grip4", JOY_TYPE_GRIP4 }, + { "sneslpt1", JOY_TYPE_SNESPAD_LPT1 }, + { "sneslpt2", JOY_TYPE_SNESPAD_LPT2 }, + { "sneslpt3", JOY_TYPE_SNESPAD_LPT3 }, + { "psxlpt1", JOY_TYPE_PSXPAD_LPT1 }, + { "psxlpt2", JOY_TYPE_PSXPAD_LPT2 }, + { "psxlpt3", JOY_TYPE_PSXPAD_LPT3 }, + { "n64lpt1", JOY_TYPE_N64PAD_LPT1 }, + { "n64lpt2", JOY_TYPE_N64PAD_LPT2 }, + { "n64lpt3", JOY_TYPE_N64PAD_LPT3 }, + { "db9lpt1", JOY_TYPE_DB9_LPT1 }, + { "db9lpt2", JOY_TYPE_DB9_LPT2 }, + { "db9lpt3", JOY_TYPE_DB9_LPT3 }, + { "tglpt1", JOY_TYPE_TURBOGRAFX_LPT1 }, + { "tglpt2", JOY_TYPE_TURBOGRAFX_LPT2 }, + { "tglpt3", JOY_TYPE_TURBOGRAFX_LPT3 }, + { "wingwar", JOY_TYPE_WINGWARRIOR }, + { "segaisa", JOY_TYPE_IFSEGA_ISA}, + { "segapci", JOY_TYPE_IFSEGA_PCI}, + { "segapci2", JOY_TYPE_IFSEGA_PCI_FAST}, + { NULL, 0 } +}; + diff --git a/source/unused/dos/config.h b/source/unused/dos/config.h index a8d4118..d4a8041 100644 --- a/source/unused/dos/config.h +++ b/source/unused/dos/config.h @@ -1,65 +1,92 @@ - -#ifndef _CONFIG_H_ -#define _CONFIG_H_ - -#define PATH_SIZE (0x100) -#define TOKEN_LIST_SIZE (0x20) - -typedef struct -{ - char *token; - int value; -}t_strint; - -typedef struct -{ - int video_width; - int video_height; - int video_depth; - int video_driver; - - int autores; - int autores_w; - int autores_h; - - int remap; - int blur; - int scanlines; - int scale; - - int vsync; - int throttle; - int fps; - int skip; - - int sound; - int sndcard; - int sndrate; - int swap; - - int wave; - char wavpath[PATH_SIZE]; - - int joy_driver; - - int split; /* 1= Split image at 2 megabit boundary */ - int flip; /* 1= Bit-flip image */ - int usa; /* 1= Set D6 of $1000 to indicate US machine */ - int softres; /* 1= Allow RUN+SELECT */ -} t_option; - -/* Global variables */ -extern t_option option; -extern t_strint video_driver_table[]; -extern t_strint joy_driver_table[]; - -/* Function prototypes */ -void do_config(char *file); -int parse_file(char *filename, int *argc, char **argv); -void parse_args(int argc, char **argv); -void print_options(void); -int check_bool(char *token); -void set_option_defaults(void); - -#endif /* _CONFIG_H_ */ - + +#ifndef _CONFIG_H_ +#define _CONFIG_H_ + +#define PATH_SIZE (0x100) +#define TOKEN_LIST_SIZE (0x20) + +typedef struct +{ + char *token; + int value; +}t_strint; + +typedef struct +{ + int video_width; + int video_height; + int video_depth; + int video_driver; + + int autores; + int autores_w; + int autores_h; + + int remap; + int blur; + int scanlines; + int scale; + + int vsync; + int throttle; + int fps; + int skip; + + int sound; + int sndcard; + int sndrate; + int swap; + + int wave; + char wavpath[PATH_SIZE]; + + int joy_driver; + + int split; /* 1= Split image at 2 megabit boundary */ + int flip; /* 1= Bit-flip image */ + int usa; /* 1= Set D6 of $1000 to indicate US machine */ + int softres; /* 1= Allow RUN+SELECT */ +} t_option; + +typedef struct +{ + double psg_preamp; + double fm_preamp; + uint8 boost; + uint8 hq_fm; + uint8 fm_core; + uint8 ssg_enabled; + int8 sram_auto; + int8 freeze_auto; + uint8 region_detect; + uint8 force_dtack; + uint8 bios_enabled; + int16 xshift; + int16 yshift; + int16 xscale; + int16 yscale; + uint8 tv_mode; + uint8 aspect; + uint8 overscan; + uint8 render; + uint8 sys_type[2]; + uint8 crosshair; +} t_config; + +/* Global variables */ +extern t_option option; +extern t_config config; +extern t_strint video_driver_table[]; +extern t_strint joy_driver_table[]; + +/* Function prototypes */ +void do_config(char *file); +int parse_file(char *filename, int *argc, char **argv); +void parse_args(int argc, char **argv); +void print_options(void); +int check_bool(char *token); +void set_option_defaults(void); +void set_config_default(void); + +#endif /* _CONFIG_H_ */ + diff --git a/source/unused/dos/dos.c b/source/unused/dos/dos.c index d85c087..6906868 100644 --- a/source/unused/dos/dos.c +++ b/source/unused/dos/dos.c @@ -1,466 +1,655 @@ -/* - dos.c -- - DOS interface code for the emulator -*/ - -#include "osd.h" - -#define FRAMES_PER_SECOND 60 - -RGB vdp_palette[3][0x200]; -PALETTE gen_pal; -BITMAP *gen_bmp; - -volatile int frame_skip = 1; -volatile int frame_count = 0; -volatile int frames_rendered = 0; -volatile int frame_rate = 0; -volatile int tick_count = 0; -volatile int old_tick_count = 0; -volatile int skip = 0; - -int quit = 0; - -int main (int argc, char *argv[]) -{ - if(argc < 2) { - printf("Genesis Plus - Sega Mega Drive emulator (v1.0)\n"); - printf("(C) 1999, 2000, 2001, 2002, 2003 Charles MacDonald\n"); - printf("Usage %s file.[bin|smd|zip] [-options]\n", argv[0]); - printf("Type `%s -help' for a list of options.\n", argv[0]); - exit(1); - }; - - if(stricmp(argv[1], "-help") == 0) - { - print_options(); - return (0); - } - - if(!load_rom(argv[1])) - { - printf("File `%s' not found.\n", argv[1]); - return (0); - } - - init_machine(); - - error_init(); - system_init(); - - if(option.sound) - { - audio_init(option.sndrate); - } - - system_reset(); - - - for(;;) - { - frame_count += 1; - if(quit) break; - dos_update_input(); - if(frame_count % frame_skip == 0) - { - system_frame(0); - dos_update_video(); - } - else - { - system_frame(1); - } - if(option.sound) dos_update_audio(); - } - - trash_machine(); - system_shutdown(); - error_shutdown(); - return (0); -} - -/* Timer handler */ -void tick_handler(void) -{ - tick_count += 1; - if(tick_count % FRAMES_PER_SECOND == 0) - { - frame_rate = frames_rendered; - frames_rendered = 0; - } -} -END_OF_FUNCTION(tick_handler); - - -int load_file(char *filename, char *buf, int size) -{ - FILE *fd = fopen(filename, "rb"); - if(!fd) return (0); - fread(buf, size, 1, fd); - fclose(fd); - return (1); -} - -int save_file(char *filename, char *buf, int size) -{ - FILE *fd = NULL; - if(!(fd = fopen(filename, "wb"))) return (0); - fwrite(buf, size, 1, fd); - fclose(fd); - return (1); -} - - -void dos_update_input(void) -{ - if(key[KEY_ESC] || key[KEY_END]) - { - quit = 1; - } - - input.pad[0] = 0; - - /* Is the joystick being used ? */ - if(option.joy_driver != JOY_TYPE_NONE) - { - poll_joystick(); - - /* Check player 1 joystick */ - if(joy[0].stick[0].axis[1].d1) input.pad[0] |= INPUT_UP; - else - if(joy[0].stick[0].axis[1].d2) input.pad[0] |= INPUT_DOWN; - - if(joy[0].stick[0].axis[0].d1) input.pad[0] |= INPUT_LEFT; - else - if(joy[0].stick[0].axis[0].d2) input.pad[0] |= INPUT_RIGHT; - - if(joy[0].button[0].b) input.pad[0] |= INPUT_A; - if(joy[0].button[1].b) input.pad[0] |= INPUT_B; - if(joy[0].button[2].b) input.pad[0] |= INPUT_C; - if(joy[0].button[3].b) input.pad[0] |= INPUT_START; - if(joy[0].button[4].b) input.pad[0] |= INPUT_X; - if(joy[0].button[5].b) input.pad[0] |= INPUT_Y; - if(joy[0].button[6].b) input.pad[0] |= INPUT_Z; - if(joy[0].button[7].b) input.pad[0] |= INPUT_MODE; - - /* More than one joystick supported ? */ - if(num_joysticks > 2) - { - /* Check player 2 joystick */ - if(joy[1].stick[0].axis[1].d1) input.pad[1] |= INPUT_UP; - else - if(joy[1].stick[0].axis[1].d2) input.pad[1] |= INPUT_DOWN; - - if(joy[1].stick[0].axis[0].d1) input.pad[1] |= INPUT_LEFT; - else - if(joy[1].stick[0].axis[0].d1) input.pad[1] |= INPUT_RIGHT; - - if(joy[1].button[0].b) input.pad[1] |= INPUT_A; - if(joy[1].button[1].b) input.pad[1] |= INPUT_B; - if(joy[1].button[2].b) input.pad[1] |= INPUT_C; - if(joy[1].button[3].b) input.pad[1] |= INPUT_START; - if(joy[1].button[4].b) input.pad[1] |= INPUT_X; - if(joy[1].button[5].b) input.pad[1] |= INPUT_Y; - if(joy[1].button[6].b) input.pad[1] |= INPUT_Z; - if(joy[1].button[7].b) input.pad[1] |= INPUT_MODE; - } - } - - if(key[KEY_UP]) input.pad[0] |= INPUT_UP; - else - if(key[KEY_DOWN]) input.pad[0] |= INPUT_DOWN; - if(key[KEY_LEFT]) input.pad[0] |= INPUT_LEFT; - else - if(key[KEY_RIGHT]) input.pad[0] |= INPUT_RIGHT; - - if(key[KEY_A]) input.pad[0] |= INPUT_A; - if(key[KEY_S]) input.pad[0] |= INPUT_B; - if(key[KEY_D]) input.pad[0] |= INPUT_C; - if(key[KEY_F]) input.pad[0] |= INPUT_START; - if(key[KEY_Z]) input.pad[0] |= INPUT_X; - if(key[KEY_X]) input.pad[0] |= INPUT_Y; - if(key[KEY_C]) input.pad[0] |= INPUT_Z; - if(key[KEY_V]) input.pad[0] |= INPUT_MODE; - - if(check_key(KEY_TAB)) - system_reset(); - - if(check_key(KEY_F1)) frame_skip = 1; - if(check_key(KEY_F2)) frame_skip = 2; - if(check_key(KEY_F3)) frame_skip = 3; - if(check_key(KEY_F4)) frame_skip = 4; -} - -void dos_update_audio(void) -{ - osd_play_streamed_sample_16(option.swap ^ 0, snd.buffer[0], snd.buffer_size * 2, option.sndrate, FRAMES_PER_SECOND, -100); - osd_play_streamed_sample_16(option.swap ^ 1, snd.buffer[1], snd.buffer_size * 2, option.sndrate, FRAMES_PER_SECOND, 100); -} - -void dos_update_palette(void) -{ - if(is_border_dirty) - { - uint16 data = *(uint16 *)&cram[(border << 1)]; - RGB *color; - - is_border_dirty = 0; - - if(reg[12] & 8) - { - int j; - for(j = 0; j < 3; j += 1) - { - color = &vdp_palette[j][data]; - set_color((j << 6), color); - } - } - else - { - color = &vdp_palette[1][data]; - set_color(0x00, color); - set_color(0x40, color); - set_color(0x80, color); - } - } - - if(is_color_dirty) - { - int i; - uint16 *p = (uint16 *)&cram[0]; - is_color_dirty = 0; - - for(i = 0; i < 64; i += 1) - { - if((color_dirty[i]) && ((i & 0x0F) != 0x00)) - { - RGB *color; - color_dirty[i] = 0; - if(reg[12] & 8) - { - int j; - for(j = 0; j < 3; j += 1) - { - color = &vdp_palette[j][p[i]]; - set_color((j << 6) | i, color); - } - } - else - { - color = &vdp_palette[1][p[i]]; - set_color(0x00 | i, color); - set_color(0x40 | i, color); - set_color(0x80 | i, color); - } - } - } - } -} - -void dos_update_video(void) -{ - int width = (reg[12] & 1) ? 320 : 256; - int height = (reg[1] & 8) ? 240 : 224; - int center_x = (SCREEN_W - width) / 2; - int center_y = (SCREEN_H / (option.scanlines ? 4 : 2)) - (height / 2); - - /* Wait for VSync */ - if(option.vsync) vsync(); - - if(bitmap.viewport.changed) - { - bitmap.viewport.changed = 0; - if(bitmap.remap) - { - clear(screen); - } - else - { - clear_to_color(screen, 0xFF); - } - } - - if(bitmap.remap == 0) - { - dos_update_palette(); - } - - - if(option.scanlines) - { - int y; - for(y = 0; y < height; y += 1) - { - blit(gen_bmp, screen, 0x20, y, center_x, (center_y + y) << 1, width, 1); - } - } - else - { - - blit(gen_bmp, screen, 0x20, 0, center_x, center_y, width, height); - } -} - -void init_machine(void) -{ - do_config("gen.cfg"); - - if(option.sound) - { - msdos_init_sound(&option.sndrate, option.sndcard); - } - - allegro_init(); - install_keyboard(); - install_joystick(option.joy_driver); - - install_timer(); - LOCK_FUNCTION(tick_handler); - LOCK_VARIABLE(tick_count); - LOCK_VARIABLE(frame_rate); - install_int_ex(tick_handler, BPS_TO_TIMER(FRAMES_PER_SECOND)); - - set_color_depth(option.video_depth); - gen_bmp = create_bitmap(512, 512); - clear(gen_bmp); - - memset(&bitmap, 0, sizeof(bitmap)); - bitmap.data = (uint8 *)&gen_bmp->line[0][0]; - bitmap.width = gen_bmp->w; - bitmap.height = gen_bmp->h; - bitmap.depth = option.video_depth; - switch(option.video_depth) - { - case 8: - bitmap.granularity = 1; - break; - case 15: - bitmap.granularity = 2; - break; - case 16: - bitmap.granularity = 2; - break; - case 32: - bitmap.granularity = 4; - break; - } - bitmap.pitch = (bitmap.width * bitmap.granularity); - bitmap.viewport.w = 256; - bitmap.viewport.h = 224; - bitmap.viewport.x = 0x20; - bitmap.viewport.y = 0x00; - bitmap.remap = 0; - if(option.remap) bitmap.remap = 1; - else - if(bitmap.depth > 8) bitmap.remap = 1; - - make_vdp_palette(); - - memcpy(gen_pal, black_palette, sizeof(PALETTE)); - gen_pal[0xFE].r = \ - gen_pal[0xFE].g = \ - gen_pal[0xFE].b = 0x3F; - - dos_change_mode(); -} - -void trash_machine(void) -{ - if(option.sound) - { - msdos_shutdown_sound(); - } - clear(screen); - destroy_bitmap(gen_bmp); - set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); -} - -void make_vdp_palette(void) -{ - uint8 lut[3][8] = - { - {0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C}, - {0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38}, - {0x20, 0x24, 0x28, 0x2C, 0x30, 0x34, 0x38, 0x3C}, - }; - - int j; - for(j = 0; j < 0x600; j += 1) - { - - int r = (j >> 6) & 7; - int g = (j >> 3) & 7; - int b = (j >> 0) & 7; - int i = (j >> 9) & 3; - - vdp_palette[i][j & 0x1FF].r = lut[i][r]; - vdp_palette[i][j & 0x1FF].g = lut[i][g]; - vdp_palette[i][j & 0x1FF].b = lut[i][b]; - } -} - -void dos_change_mode(void) -{ - int ret; - int width = option.video_width; - int height = option.video_height; - - if(option.scanlines) height *= 2; - ret = set_gfx_mode(option.video_driver, width, height, 0, 0); - if(ret != 0) - { - set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); - printf("Error setting graphics mode (%dx%d %dbpp).\nAllegro says: `%s'\n", width, height, option.video_depth, allegro_error); - exit(1); - } - - if(bitmap.depth == 8) - { - if(bitmap.remap) - { - int i; - for(i = 0; i < 0x100; i += 1) - { - gen_pal[i].r = ((i >> 5) & 7) << 3; - gen_pal[i].g = ((i >> 2) & 7) << 3; - gen_pal[i].b = ((i >> 0) & 3) << 4; - } - set_palette(gen_pal); - } - else - { - clear_to_color(screen, 0xFF); - gen_pal[0xfe].r = 0xff; - gen_pal[0xfe].g = 0xff; - gen_pal[0xfe].b = 0xff; - set_palette(gen_pal); - inp(0x3DA); - outp(0x3C0, 0x31); - outp(0x3C0, 0xFF); - } - } - else - { - clear(screen); - } -} - - - -/* Check if a key is pressed */ -int check_key(int code) -{ - static char lastbuf[0x100] = {0}; - - if((!key[code]) && (lastbuf[code] == 1)) - lastbuf[code] = 0; - - if((key[code]) && (lastbuf[code] == 0)) - { - lastbuf[code] = 1; - return (1); - } - - return (0); -} - +/* + dos.c -- + DOS interface code for the emulator +*/ + +#include "shared.h" +#include "osd.h" + +#define FRAMES_PER_SECOND 60 +#define MSG_LEN 1024 + +RGB vdp_palette[3][0x200]; +PALETTE gen_pal; +BITMAP *gen_bmp; + +volatile int frame_skip = 1; +int frame_count = 0; +volatile int frames_rendered = 0; +volatile int frame_rate = 0; +volatile int tick_count = 0; +volatile int old_tick_count = 0; +volatile int skip = 0; + +int quit = 0; +unsigned char buf[0x26000]; + +uint8 log_error = 1; +uint8 debug_on = 0; + +void msg_print(int x, int y, char *fmt, ...) +{ + int i = bitmap.viewport.x; + int j = bitmap.viewport.y; + va_list ap; + char token[MSG_LEN]; + char str[MSG_LEN]; + + strcpy(str, "\0"); + va_start(ap, fmt); + vsprintf(token, fmt, ap); + strcat(str, token); + va_end(ap); + + textprintf_ex(gen_bmp, font, i+x+1, j+y , 0x00, -1, "%s", str); + textprintf_ex(gen_bmp, font, i+x-1, j+y , 0x00, -1, "%s", str); + textprintf_ex(gen_bmp, font, i+x , j+y+1, 0x00, -1, "%s", str); + textprintf_ex(gen_bmp, font, i+x , j+y-1, 0x00, -1, "%s", str); + textprintf_ex(gen_bmp, font, i+x , j+y , 0xffff, -1, "%s", str); +} + +int main (int argc, char *argv[]) +{ + if(argc < 2) { + printf("Genesis Plus - Sega Mega Drive emulator (v1.0)\n"); + printf("(C) 1999, 2000, 2001, 2002, 2003 Charles MacDonald\n"); + printf("Usage %s file.[bin|smd|zip] [-options]\n", argv[0]); + printf("Type `%s -help' for a list of options.\n", argv[0]); + exit(1); + }; + + if(stricmp(argv[1], "-help") == 0) + { + print_options(); + return (0); + } + error_init(); + + cart_rom = malloc(0xA00000); + memset(cart_rom, 0, 0xA00000); + + set_config_default(); + + if(!load_rom(argv[1])) + { + printf("File `%s' not found.\n", argv[1]); + return (0); + } + + + memset(bios_rom, 0, sizeof(bios_rom)); + FILE *f = fopen("./BIOS.bin", "rb"); + if (f!=NULL) + { + fread(&bios_rom, 0x800,1,f); + fclose(f); + int i; + for(i = 0; i < 0x800; i += 2) + { + uint8 temp = bios_rom[i]; + bios_rom[i] = bios_rom[i+1]; + bios_rom[i+1] = temp; + } + config.bios_enabled = 3; + } + else config.bios_enabled = 0; + + init_machine(); + set_config_default(); + input.system[0] = SYSTEM_GAMEPAD; + input.system[1] = SYSTEM_GAMEPAD; + + system_init(); + + int buf_len = (option.sndrate * 4) / vdp_rate; + snd.buffer[0] = malloc (buf_len/2); + snd.buffer[1] = malloc (buf_len/2); + memset (snd.buffer[0], 0, buf_len/2); + memset (snd.buffer[1], 0, buf_len/2); + audio_init(option.sndrate); + + f = fopen("./game.srm", "rb"); + if (f!=NULL) + { + fread(&sram.sram,0x10000,1, f); + fclose(f); + } + + + system_reset(); + + for(;;) + { + frame_count += 1; + if(quit) break; + if(frame_count % frame_skip == 0) + { + system_frame(0); + frames_rendered++; + dos_update_video(); + } + else + { + system_frame(1); + } + if(option.sound) dos_update_audio(); + + //error("%d\n", frame_rate); + } + + f = fopen("./game.srm", "wb"); + if (f!=NULL) + { + fwrite(&sram.sram, 0x10000,1,f); + fclose(f); + + } + + + trash_machine(); + system_shutdown(); + error_shutdown(); + return (0); +} + +/* Timer handler */ +void tick_handler(void) +{ + tick_count += 1; + if(tick_count % FRAMES_PER_SECOND == 0) + { + frame_rate = frames_rendered; + frames_rendered = 0; + } +} +END_OF_FUNCTION(tick_handler); + + +int load_file(char *filename, char *buf, int size) +{ + FILE *fd = fopen(filename, "rb"); + if(!fd) return (0); + fread(buf, size, 1, fd); + fclose(fd); + return (1); +} + +int save_file(char *filename, char *buf, int size) +{ + FILE *fd = NULL; + if(!(fd = fopen(filename, "wb"))) return (0); + fwrite(buf, size, 1, fd); + fclose(fd); + return (1); +} + +static int joynum = 0; +uint8 delay = 36; +void dos_update_input(void) +{ + FILE *f; + + if(key[KEY_ESC] || key[KEY_END]) + { + quit = 1; + } + + while (input.dev[joynum] == NO_DEVICE) + { + joynum ++; + if (joynum > MAX_DEVICES - 1) joynum = 0; + } + + input.pad[joynum] = 0; + + /* Is the joystick being used ? */ + if(option.joy_driver != JOY_TYPE_NONE) + { + poll_joystick(); + + /* Check player 1 joystick */ + if(joy[0].stick[0].axis[1].d1) input.pad[0] |= INPUT_UP; + else + if(joy[0].stick[0].axis[1].d2) input.pad[0] |= INPUT_DOWN; + + if(joy[0].stick[0].axis[0].d1) input.pad[0] |= INPUT_LEFT; + else + if(joy[0].stick[0].axis[0].d2) input.pad[0] |= INPUT_RIGHT; + + if(joy[0].button[0].b) input.pad[0] |= INPUT_A; + if(joy[0].button[1].b) input.pad[0] |= INPUT_B; + if(joy[0].button[2].b) input.pad[0] |= INPUT_C; + if(joy[0].button[3].b) input.pad[0] |= INPUT_START; + if(joy[0].button[4].b) input.pad[0] |= INPUT_X; + if(joy[0].button[5].b) input.pad[0] |= INPUT_Y; + if(joy[0].button[6].b) input.pad[0] |= INPUT_Z; + if(joy[0].button[7].b) input.pad[0] |= INPUT_MODE; + + /* More than one joystick supported ? */ + if(num_joysticks > 2) + { + /* Check player 2 joystick */ + if(joy[1].stick[0].axis[1].d1) input.pad[1] |= INPUT_UP; + else + if(joy[1].stick[0].axis[1].d2) input.pad[1] |= INPUT_DOWN; + + if(joy[1].stick[0].axis[0].d1) input.pad[1] |= INPUT_LEFT; + else + if(joy[1].stick[0].axis[0].d1) input.pad[1] |= INPUT_RIGHT; + + if(joy[1].button[0].b) input.pad[1] |= INPUT_A; + if(joy[1].button[1].b) input.pad[1] |= INPUT_B; + if(joy[1].button[2].b) input.pad[1] |= INPUT_C; + if(joy[1].button[3].b) input.pad[1] |= INPUT_START; + if(joy[1].button[4].b) input.pad[1] |= INPUT_X; + if(joy[1].button[5].b) input.pad[1] |= INPUT_Y; + if(joy[1].button[6].b) input.pad[1] |= INPUT_Z; + if(joy[1].button[7].b) input.pad[1] |= INPUT_MODE; + } + } + /* keyboard */ + if(key[KEY_UP]) input.pad[joynum] |= INPUT_UP; + else + if(key[KEY_DOWN]) input.pad[joynum] |= INPUT_DOWN; + + if(key[KEY_LEFT]) input.pad[joynum] |= INPUT_LEFT; + else + if(key[KEY_RIGHT]) input.pad[joynum] |= INPUT_RIGHT; + + if(key[KEY_A]) input.pad[joynum] |= INPUT_A; + if(key[KEY_S]) input.pad[joynum] |= INPUT_B; + if(key[KEY_D]) input.pad[joynum] |= INPUT_C; + if(key[KEY_Z]) input.pad[joynum] |= INPUT_X; + if(key[KEY_X]) input.pad[joynum] |= INPUT_Y; + if(key[KEY_C]) input.pad[joynum] |= INPUT_Z; + if(key[KEY_V]) input.pad[joynum] |= INPUT_MODE; + + if(key[KEY_F]) + { + input.pad[joynum] |= INPUT_START; + error("start pressed\n"); + } + + if (input.dev[joynum] == DEVICE_LIGHTGUN) + { + /* Poll mouse if necessary */ + if(mouse_needs_poll() == TRUE) + poll_mouse(); + + /* Calculate X Y axis values */ + input.analog[joynum - 4][0] = (mouse_x * bitmap.viewport.w) / SCREEN_W; + input.analog[joynum - 4][1] = (mouse_y * bitmap.viewport.h) / SCREEN_H; + + /* Map mouse buttons to player #1 inputs */ + if(mouse_b & 4) input.pad[joynum] |= INPUT_B; + if(mouse_b & 2) input.pad[joynum] |= INPUT_C; + if(mouse_b & 1) input.pad[joynum] |= INPUT_A; + } + + else if (system_hw == SYSTEM_PICO) + { + /* Poll mouse if necessary */ + if(mouse_needs_poll() == TRUE) + poll_mouse(); + + /* Calculate X Y axis values */ + input.analog[0][0] = 0x3c + (mouse_x * (0x17c-0x03c+1)) / SCREEN_W; + input.analog[0][1] = 0x1fc + (mouse_y * (0x2f7-0x1fc+1)) / SCREEN_H; + + /* Map mouse buttons to player #1 inputs */ + if(mouse_b & 4) input.pad[joynum] |= INPUT_START; + if(mouse_b & 2) input.pad[joynum] |= INPUT_A; + if(mouse_b & 1) input.pad[joynum] |= INPUT_B; + } + + if(check_key(KEY_F1)) frame_skip = 1; + if(check_key(KEY_F2)) frame_skip = 2; + if(check_key(KEY_F3)) frame_skip = 3; + if(check_key(KEY_F4)) frame_skip = 4; + + if(check_key(KEY_F5)) log_error ^= 1; + if(check_key(KEY_F6)) debug_on ^= 1; + + if(check_key(KEY_F7)) + { + f = fopen("game.gpz","r+b"); + if (f) + { + int len = 0; + fread(&len, 4, 1, f); + fclose(f); + fopen("game.gpz","r+b"); + fread(&buf, len+4, 1, f); + state_load(buf); + fclose(f); + } + } + + if(check_key(KEY_F8)) + { + f = fopen("game.gpz","w+b"); + if (f) + { + int size = state_save(buf); + fwrite(&buf, size, 1, f); + fclose(f); + } + } + + if(check_key(KEY_F9)) + { + vdp_pal ^= 1; + system_init(); + audio_init(option.sndrate); + fm_restore(); + vctab = (vdp_pal) ? ((reg[1] & 8) ? vc_pal_240 : vc_pal_224) : vc_ntsc_224; + hctab = (reg[12] & 1) ? cycle2hc40 : cycle2hc32; + + /* reinitialize overscan area */ + bitmap.viewport.x = config.overscan ? ((reg[12] & 1) ? 16 : 12) : 0; + bitmap.viewport.y = config.overscan ? (((reg[1] & 8) ? 0 : 8) + (vdp_pal ? 24 : 0)) : 0; + bitmap.viewport.changed = 1; + } + + if(check_key(KEY_F10)) + system_reset(); + + if(check_key(KEY_F11)) + { + joynum ++; + if (joynum > MAX_DEVICES - 1) joynum = 0; + while (input.dev[joynum] == NO_DEVICE) + { + joynum ++; + if (joynum > MAX_DEVICES - 1) joynum = 0; + } + } + + if(check_key(KEY_F12)) + { + input.x_offset ++; + if (input.x_offset > 0xff) input.x_offset = 0; + } + + if(check_key(KEY_TAB)) + resetline = (int) ((double) (lines_per_frame - 1) * rand() / (RAND_MAX + 1.0)); +} + +void dos_update_audio(void) +{ + osd_play_streamed_sample_16(option.swap ^ 0, snd.buffer[0], snd.buffer_size * 2, option.sndrate, FRAMES_PER_SECOND, -100); + osd_play_streamed_sample_16(option.swap ^ 1, snd.buffer[1], snd.buffer_size * 2, option.sndrate, FRAMES_PER_SECOND, 100); +} + +/*void dos_update_palette(void) +{ + if(is_border_dirty) + { + uint16 data = *(uint16 *)&cram[(border << 1)]; + RGB *color; + + is_border_dirty = 0; + + if(reg[12] & 8) + { + int j; + for(j = 0; j < 3; j += 1) + { + color = &vdp_palette[j][data]; + set_color((j << 6), color); + } + } + else + { + color = &vdp_palette[1][data]; + set_color(0x00, color); + set_color(0x40, color); + set_color(0x80, color); + } + } + + if(is_color_dirty) + { + int i; + uint16 *p = (uint16 *)&cram[0]; + is_color_dirty = 0; + + for(i = 0; i < 64; i += 1) + { + if((color_dirty[i]) && ((i & 0x0F) != 0x00)) + { + RGB *color; + color_dirty[i] = 0; + if(reg[12] & 8) + { + int j; + for(j = 0; j < 3; j += 1) + { + color = &vdp_palette[j][p[i]]; + set_color((j << 6) | i, color); + } + } + else + { + color = &vdp_palette[1][p[i]]; + set_color(0x00 | i, color); + set_color(0x40 | i, color); + set_color(0x80 | i, color); + } + } + } + } +}*/ + +void dos_update_video(void) +{ + int width = (bitmap.viewport.w + 2 * bitmap.viewport.x); + int height = (bitmap.viewport.h + 2 * bitmap.viewport.y) << (interlaced ? 1:0); + int center_x = (SCREEN_W - width) / 2; + int center_y = (SCREEN_H / (option.scanlines ? 4 : 2)) - (height / 2); + + /* Wait for VSync */ + if(option.vsync) vsync(); + + if(bitmap.viewport.changed) + { + bitmap.viewport.changed = 0; + if(bitmap.remap) + { + clear(screen); + } + else + { + clear_to_color(screen, 0xFF); + } + } + + /*if(bitmap.remap == 0) + { + dos_update_palette(); + }*/ + + + msg_print(2, 2, "%d fps", frame_rate); + + if(option.scanlines) + { + int y; + for(y = 0; y < height; y += 1) + { + blit(gen_bmp, screen, 0x0, y, center_x, (center_y + y) << 1, width, 1); + } + } + else + { + + //blit(gen_bmp, screen, 0x0, 0, center_x, center_y, width, height); + stretch_blit(gen_bmp, screen, 0, 0, width, height, (SCREEN_W-352)/2, (SCREEN_H-240)/2, 352,240); + + } +} + +void init_machine(void) +{ + do_config("gen.cfg"); + + if(option.sound) + { + msdos_init_sound(&option.sndrate, option.sndcard); + } + + allegro_init(); + install_mouse(); + install_keyboard(); + install_joystick(option.joy_driver); + + install_timer(); + LOCK_FUNCTION(tick_handler); + LOCK_VARIABLE(tick_count); + LOCK_VARIABLE(frame_rate); + install_int_ex(tick_handler, BPS_TO_TIMER(FRAMES_PER_SECOND)); + + set_color_depth(option.video_depth); + gen_bmp = create_bitmap(360, 576); + clear(gen_bmp); + + memset(&bitmap, 0, sizeof(bitmap)); + bitmap.data = (uint8 *)&gen_bmp->line[0][0]; + bitmap.width = gen_bmp->w; + bitmap.height = gen_bmp->h; + bitmap.depth = option.video_depth; + switch(option.video_depth) + { + case 8: + bitmap.granularity = 1; + break; + case 15: + bitmap.granularity = 2; + break; + case 16: + bitmap.granularity = 2; + break; + case 32: + bitmap.granularity = 4; + break; + } + bitmap.pitch = (bitmap.width * bitmap.granularity); + bitmap.viewport.w = 256; + bitmap.viewport.h = 224; + bitmap.viewport.x = 0x00; + bitmap.viewport.y = 0x00; + bitmap.remap = 0; + if(option.remap) bitmap.remap = 1; + else + if(bitmap.depth > 8) bitmap.remap = 1; + + make_vdp_palette(); + + memcpy(gen_pal, black_palette, sizeof(PALETTE)); + gen_pal[0xFE].r = \ + gen_pal[0xFE].g = \ + gen_pal[0xFE].b = 0x3F; + + dos_change_mode(); +} + +void trash_machine(void) +{ + if(option.sound) + { + msdos_shutdown_sound(); + } + clear(screen); + destroy_bitmap(gen_bmp); + set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); +} + +void make_vdp_palette(void) +{ + uint8 lut[3][8] = + { + {0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C}, + {0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38}, + {0x20, 0x24, 0x28, 0x2C, 0x30, 0x34, 0x38, 0x3C}, + }; + + int j; + for(j = 0; j < 0x600; j += 1) + { + + int r = (j >> 6) & 7; + int g = (j >> 3) & 7; + int b = (j >> 0) & 7; + int i = (j >> 9) & 3; + + vdp_palette[i][j & 0x1FF].r = lut[i][r]; + vdp_palette[i][j & 0x1FF].g = lut[i][g]; + vdp_palette[i][j & 0x1FF].b = lut[i][b]; + } +} + +void dos_change_mode(void) +{ + int ret; + int width = option.video_width; + int height = option.video_height; + + if(option.scanlines) height *= 2; + ret = set_gfx_mode(option.video_driver, width, height, 0, 0); + if(ret != 0) + { + set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); + printf("Error setting graphics mode (%dx%d %dbpp).\nAllegro says: `%s'\n", width, height, option.video_depth, allegro_error); + exit(1); + } + + if(bitmap.depth == 8) + { + if(bitmap.remap) + { + int i; + for(i = 0; i < 0x100; i += 1) + { + gen_pal[i].r = ((i >> 5) & 7) << 3; + gen_pal[i].g = ((i >> 2) & 7) << 3; + gen_pal[i].b = ((i >> 0) & 3) << 4; + } + set_palette(gen_pal); + } + else + { + clear_to_color(screen, 0xFF); + gen_pal[0xfe].r = 0xff; + gen_pal[0xfe].g = 0xff; + gen_pal[0xfe].b = 0xff; + set_palette(gen_pal); + inp(0x3DA); + outp(0x3C0, 0x31); + outp(0x3C0, 0xFF); + } + } + else + { + clear(screen); + } +} + + + +/* Check if a key is pressed */ +int check_key(int code) +{ + static char lastbuf[0x100] = {0}; + + if((!key[code]) && (lastbuf[code] == 1)) + lastbuf[code] = 0; + + if((key[code]) && (lastbuf[code] == 0)) + { + lastbuf[code] = 1; + return (1); + } + + return (0); +} + diff --git a/source/unused/dos/dos.h b/source/unused/dos/dos.h index e32d62c..a94fc72 100644 --- a/source/unused/dos/dos.h +++ b/source/unused/dos/dos.h @@ -1,19 +1,24 @@ - -#ifndef _DOS_H_ -#define _DOS_H_ - -/* Function prototypes */ -int load_file(char *filename, char *buf, int size); -int save_file(char *filename, char *buf, int size); -void dos_update_input(void); -void dos_update_audio(void); -void dos_update_palette(void); -void dos_update_video(void); -void init_machine(void); -void trash_machine(void); -void make_vdp_palette(void); -void dos_change_mode(void); -int check_key(int code); - -#endif /* _DOS_H_ */ - + +#ifndef _DOS_H_ +#define _DOS_H_ + +#define LOGERROR 1 + +/* Function prototypes */ +int load_file(char *filename, char *buf, int size); +int save_file(char *filename, char *buf, int size); +void dos_update_input(void); +void dos_update_audio(void); +void dos_update_palette(void); +void dos_update_video(void); +void init_machine(void); +void trash_machine(void); +void make_vdp_palette(void); +void dos_change_mode(void); +int check_key(int code); + +extern uint8 debug_on; +extern uint8 log_error; +extern int frame_count; +#endif /* _DOS_H_ */ + diff --git a/source/unused/dos/error.c b/source/unused/dos/error.c index 7032ae9..4913848 100644 --- a/source/unused/dos/error.c +++ b/source/unused/dos/error.c @@ -1,29 +1,30 @@ - -#include "osd.h" - -FILE *error_log; - -struct { - int enabled; - int verbose; - FILE *log; -} t_error; - -void error_init(void) -{ - error_log = fopen("error.log","w"); -} - -void error_shutdown(void) -{ - if(error_log) fclose(error_log); -} - -void error(char *format, ...) -{ - va_list ap; - va_start(ap, format); - if(error_log) vfprintf(error_log, format, ap); - va_end(ap); -} - + +#include "osd.h" + +FILE *error_log; + +struct { + int enabled; + int verbose; + FILE *log; +} t_error; + +void error_init(void) +{ + error_log = fopen("error.log","w"); +} + +void error_shutdown(void) +{ + if(error_log) fclose(error_log); +} + +void error(char *format, ...) +{ + if (!log_error) return; + va_list ap; + va_start(ap, format); + if(error_log) vfprintf(error_log, format, ap); + va_end(ap); +} + diff --git a/source/unused/dos/error.h b/source/unused/dos/error.h index 14dc8e6..1d5b270 100644 --- a/source/unused/dos/error.h +++ b/source/unused/dos/error.h @@ -1,13 +1,13 @@ - -#ifndef _ERROR_H_ -#define _ERROR_H_ - -/* Global variables */ -FILE *error_log; - -/* Function prototypes */ -void error_init(void); -void error_shutdown(void); -void error(char *format, ...); - -#endif /* _ERROR_H_ */ + +#ifndef _ERROR_H_ +#define _ERROR_H_ + +/* Global variables */ +FILE *error_log; + +/* Function prototypes */ +void error_init(void); +void error_shutdown(void); +void error(char *format, ...); + +#endif /* _ERROR_H_ */ diff --git a/source/unused/dos/osd.h b/source/unused/dos/osd.h index 2b1c6d0..3b76d8c 100644 --- a/source/unused/dos/osd.h +++ b/source/unused/dos/osd.h @@ -1,18 +1,22 @@ - -#ifndef _OSD_H_ -#define _OSD_H_ - -#include -#include -#include -#include -#include -#include - -#include "shared.h" -#include "dos.h" -#include "config.h" -#include "sealintf.h" -#include "error.h" - -#endif /* _OSD_H_ */ + +#ifndef _OSD_H_ +#define _OSD_H_ + +#include +#include +#include +#include +#include +#include + +#include "shared.h" +#include "dos.h" +#include "config.h" +#include "sealintf.h" +#include "error.h" +#include "unzip.h" +#include "fileio.h" + +#define update_input() dos_update_input() + +#endif /* _OSD_H_ */ diff --git a/source/unused/fileio.c b/source/unused/fileio.c index b7f57b8..6c4b169 100644 --- a/source/unused/fileio.c +++ b/source/unused/fileio.c @@ -1,153 +1,151 @@ - -#include "shared.h" - - -/* - Load a normal file, or ZIP/GZ archive. - Returns NULL if an error occured. -*/ -uint8 *load_archive(char *filename, int *file_size) -{ - int size = 0; - uint8 *buf = NULL; - - if(check_zip(filename)) - { - unzFile *fd = NULL; - unz_file_info info; - int ret = 0; - - /* Attempt to open the archive */ - fd = unzOpen(filename); - if(!fd) return (NULL); - - /* Go to first file in archive */ - ret = unzGoToFirstFile(fd); - if(ret != UNZ_OK) - { - unzClose(fd); - return (NULL); - } - - ret = unzGetCurrentFileInfo(fd, &info, NULL, 0, NULL, 0, NULL, 0); - if(ret != UNZ_OK) - { - unzClose(fd); - return (NULL); - } - - /* Open the file for reading */ - ret = unzOpenCurrentFile(fd); - if(ret != UNZ_OK) - { - unzClose(fd); - return (NULL); - } - - /* Allocate file data buffer */ - size = info.uncompressed_size; - buf = malloc(size); - if(!buf) - { - unzClose(fd); - return (NULL); - } - - /* Read (decompress) the file */ - ret = unzReadCurrentFile(fd, buf, info.uncompressed_size); - if(ret != info.uncompressed_size) - { - free(buf); - unzCloseCurrentFile(fd); - unzClose(fd); - return (NULL); - } - - /* Close the current file */ - ret = unzCloseCurrentFile(fd); - if(ret != UNZ_OK) - { - free(buf); - unzClose(fd); - return (NULL); - } - - /* Close the archive */ - ret = unzClose(fd); - if(ret != UNZ_OK) - { - free(buf); - return (NULL); - } - - /* Update file size and return pointer to file data */ - *file_size = size; - return (buf); - } - else - { - gzFile *gd = NULL; - - /* Open file */ - gd = gzopen(filename, "rb"); - if(!gd) return (0); - - /* Get file size */ - size = gzsize(gd); - - /* Allocate file data buffer */ - buf = malloc(size); - if(!buf) - { - gzclose(gd); - return (0); - } - - /* Read file data */ - gzread(gd, buf, size); - - /* Close file */ - gzclose(gd); - - /* Update file size and return pointer to file data */ - *file_size = size; - return (buf); - } -} - - -/* - Verifies if a file is a ZIP archive or not. - Returns: 1= ZIP archive, 0= not a ZIP archive -*/ -int check_zip(char *filename) -{ - uint8 buf[2]; - FILE *fd = NULL; - fd = fopen(filename, "rb"); - if(!fd) return (0); - fread(buf, 2, 1, fd); - fclose(fd); - if(memcmp(buf, "PK", 2) == 0) return (1); - return (0); -} - - -/* - Returns the size of a GZ compressed file. -*/ -int gzsize(gzFile *gd) -{ - #define CHUNKSIZE (0x10000) - int size = 0, length = 0; - unsigned char buffer[CHUNKSIZE]; - gzrewind(gd); - do { - size = gzread(gd, buffer, CHUNKSIZE); - if(size <= 0) break; - length += size; - } while (!gzeof(gd)); - gzrewind(gd); - return (length); - #undef CHUNKSIZE -} +#include "shared.h" + +/* + Load a normal file, or ZIP/GZ archive. + Returns NULL if an error occured. +*/ +uint8 *load_archive(char *filename, int *file_size) +{ + int size = 0; + uint8 *buf = NULL; + + if(check_zip(filename)) + { + unzFile *fd = NULL; + unz_file_info info; + int ret = 0; + + /* Attempt to open the archive */ + fd = unzOpen(filename); + if(!fd) return (NULL); + + /* Go to first file in archive */ + ret = unzGoToFirstFile(fd); + if(ret != UNZ_OK) + { + unzClose(fd); + return (NULL); + } + + ret = unzGetCurrentFileInfo(fd, &info, NULL, 0, NULL, 0, NULL, 0); + if(ret != UNZ_OK) + { + unzClose(fd); + return (NULL); + } + + /* Open the file for reading */ + ret = unzOpenCurrentFile(fd); + if(ret != UNZ_OK) + { + unzClose(fd); + return (NULL); + } + + /* Allocate file data buffer */ + size = info.uncompressed_size; + buf = malloc(size); + if(!buf) + { + unzClose(fd); + return (NULL); + } + + /* Read (decompress) the file */ + ret = unzReadCurrentFile(fd, buf, info.uncompressed_size); + if(ret != info.uncompressed_size) + { + free(buf); + unzCloseCurrentFile(fd); + unzClose(fd); + return (NULL); + } + + /* Close the current file */ + ret = unzCloseCurrentFile(fd); + if(ret != UNZ_OK) + { + free(buf); + unzClose(fd); + return (NULL); + } + + /* Close the archive */ + ret = unzClose(fd); + if(ret != UNZ_OK) + { + free(buf); + return (NULL); + } + + /* Update file size and return pointer to file data */ + *file_size = size; + return (buf); + } + else + { + gzFile *gd = NULL; + + /* Open file */ + gd = gzopen(filename, "rb"); + if(!gd) return (0); + + /* Get file size */ + size = gzsize(gd); + + /* Allocate file data buffer */ + buf = malloc(size); + if(!buf) + { + gzclose(gd); + return (0); + } + + /* Read file data */ + gzread(gd, buf, size); + + /* Close file */ + gzclose(gd); + + /* Update file size and return pointer to file data */ + *file_size = size; + return (buf); + } +} + + +/* + Verifies if a file is a ZIP archive or not. + Returns: 1= ZIP archive, 0= not a ZIP archive +*/ +int check_zip(char *filename) +{ + uint8 buf[2]; + FILE *fd = NULL; + fd = fopen(filename, "rb"); + if(!fd) return (0); + fread(buf, 2, 1, fd); + fclose(fd); + if(memcmp(buf, "PK", 2) == 0) return (1); + return (0); +} + + +/* + Returns the size of a GZ compressed file. +*/ +int gzsize(gzFile *gd) +{ + #define CHUNKSIZE (0x10000) + int size = 0, length = 0; + unsigned char buffer[CHUNKSIZE]; + gzrewind(gd); + do { + size = gzread(gd, buffer, CHUNKSIZE); + if(size <= 0) break; + length += size; + } while (!gzeof(gd)); + gzrewind(gd); + return (length); + #undef CHUNKSIZE +} diff --git a/source/unused/fileio.h b/source/unused/fileio.h index 09b0ab7..b99bfc2 100644 --- a/source/unused/fileio.h +++ b/source/unused/fileio.h @@ -1,15 +1,14 @@ - -#ifndef _FILEIO_H_ -#define _FILEIO_H_ - -/* Global variables */ -extern int cart_size; -extern char cart_name[0x100]; - -/* Function prototypes */ -uint8 *load_archive(char *filename, int *file_size); -int load_cart(char *filename); -int check_zip(char *filename); -int gzsize(gzFile *gd); - -#endif /* _FILEIO_H_ */ +#ifndef _FILEIO_H_ +#define _FILEIO_H_ + +/* Global variables */ +extern int cart_size; +extern char cart_name[0x100]; + +/* Function prototypes */ +uint8 *load_archive(char *filename, int *file_size); +int load_cart(char *filename); +int check_zip(char *filename); +int gzsize(gzFile *gd); + +#endif /* _FILEIO_H_ */ diff --git a/source/unused/loadrom.c b/source/unused/loadrom.c deleted file mode 100644 index e0a4381..0000000 --- a/source/unused/loadrom.c +++ /dev/null @@ -1,52 +0,0 @@ - -#include "shared.h" - -static uint8 block[0x4000]; - -void deinterleave_block(uint8 *src) -{ - int i; - memcpy(block, src, 0x4000); - for(i = 0; i < 0x2000; i += 1) - { - src[i*2+0] = block[0x2000 + (i)]; - src[i*2+1] = block[0x0000 + (i)]; - } -} - -int load_rom(char *filename) -{ - int size, offset = 0; - uint8 header[0x200]; - uint8 *ptr; - - ptr = load_archive(filename, &size); - if(!ptr) return (0); - - if((size / 512) & 1) - { - int i; - - size -= 512; - offset += 512; - - memcpy(header, ptr, 512); - - for(i = 0; i < (size / 0x4000); i += 1) - { - deinterleave_block(ptr + offset + (i * 0x4000)); - } - } - - memset(cart_rom, 0, 0x400000); - if(size > 0x400000) size = 0x400000; - memcpy(cart_rom, ptr + offset, size); - - /* Free allocated file data */ - free(ptr); - - return (1); -} - - - diff --git a/source/unused/loadrom.h b/source/unused/loadrom.h deleted file mode 100644 index 5c654d2..0000000 --- a/source/unused/loadrom.h +++ /dev/null @@ -1,10 +0,0 @@ - -#ifndef _LOADROM_H_ -#define _LOADROM_H_ - -/* Function prototypes */ -void deinterleave_block(uint8 *src); -int load_rom(char *filename); - -#endif /* _LOADROM_H_ */ - diff --git a/source/unused/make.bat b/source/unused/make.bat new file mode 100644 index 0000000..62b0373 --- /dev/null +++ b/source/unused/make.bat @@ -0,0 +1 @@ +@make.exe -f makefile.mgw %1 diff --git a/source/unused/makefile.dj2 b/source/unused/makefile.dj2 new file mode 100644 index 0000000..8c822c9 --- /dev/null +++ b/source/unused/makefile.dj2 @@ -0,0 +1,111 @@ +# MekaDrive - Sega Mega Drive emulator +# (c) 1999, 2000, 2001, 2002, 2003 Charles MacDonald + +# -DLSB_FIRST - Leave undefined for big-endian processors. +# -DDOS - Enable DOS/x86 specific code. +# -DDEBUG - Enable debugging code +# -DX86_ASM - Enable inline x86 assembly code in Z80 emulator + +CC = gcc +AS = nasm -f coff +LDFLAGS = +FLAGS = -I. -Icpu -Im68k -Idos -Isound -Icart_hw -Icart_hw\svp \ + -Werror -Wall \ + -O6 -mcpu=pentium -fomit-frame-pointer \ + -DLSB_FIRST -DX86_ASM -DDOS + +LIBS = -lalleg -laudio -lz obj/m68k.oa + +OBJ = obj/z80.oa \ + obj/genesis.o \ + obj/vdp.o \ + obj/render.o \ + obj/system.o \ + obj/io.o \ + obj/input.o \ + obj/mem68k.o \ + obj/memz80.o \ + obj/membnk.o \ + obj/memvdp.o \ + obj/state.o + +OBJ += obj/sound.o \ + obj/fm.o \ + obj/sn76489.o \ + obj/ym2612.o + +OBJ += obj/sram.o \ + obj/eeprom.o \ + obj/svp.o \ + obj/ssp16.o \ + obj/cart_hw.o + +OBJ += obj/dos.o \ + obj/sealintf.o \ + obj/config.o \ + obj/error.o \ + obj/unzip.o \ + obj/fileio.o \ + obj/loadrom.o + +EXE = gen.exe + +all : $(EXE) + +$(EXE) : $(OBJ) + $(CC) -o $(EXE) $(OBJ) $(LIBS) $(LDFLAGS) + +obj/%.oa : cpu/%.c cpu/%.h + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : %.c %.h + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : asm/%.s + $(AS) $< -o $@ + +obj/%.o : sound/%.c sound/%.h + $(CC) -c $< -o $@ $(FLAGS) +obj/%.o : sound/%.c + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : cart_hw/%.c cart_hw/%.h + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : cart_hw/svp/%.c + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : cart_hw/svp/%.c cart_hw/svp/%.h + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : cpu/%.c cpu/%.h + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : dos/%.c dos/%.h + $(CC) -c $< -o $@ $(FLAGS) + +pack : + strip $(EXE) + upx -1 $(EXE) + +clean : + rm -f obj/*.o + rm -f *.bak + rm -f *.exe + rm -f *.log + rm -f *.wav + rm -f *.zip +cleancpu : + rm -f obj/z80.oa + +makedir : + mkdir obj + +archive: + pk -dir -add -max \ + -excl=rom -excl=test \ + mdsrc.zip *.* + +# +# end of makefile +# diff --git a/source/unused/makefile.mgw b/source/unused/makefile.mgw new file mode 100644 index 0000000..b2782f2 --- /dev/null +++ b/source/unused/makefile.mgw @@ -0,0 +1,107 @@ +# Genesis Plus - Sega Mega Drive emulator +# (c) 1999, 2000, 2001, 2002, 2003 Charles MacDonald + +# -DLSB_FIRST - Leave undefined for big-endian processors. +# -DDEBUG - Enable debugging code +# -DX86_ASM - Enable inline x86 assembly code in Z80 emulator + +CC = gcc +AS = nasm -f coff +LDFLAGS = +FLAGS = -I. -Icpu -Im68k -Iwin -Isound -Icart_hw -Icart_hw\svp \ + -Ic:/SDL/include/SDL \ + -Werror -Wall \ + -DLSB_FIRST -DX86_ASM \ + -O6 -march=pentium -fomit-frame-pointer + +LIBS = -lz -lm -lmingw32 -Ld:/sdl/lib -lSDLmain -lSDL obj/m68k.oa + +OBJ = obj/z80.oa \ + obj/genesis.o \ + obj/vdp.o \ + obj/render.o \ + obj/system.o \ + obj/io.o \ + obj/input.o \ + obj/mem68k.o \ + obj/memz80.o \ + obj/membnk.o \ + obj/memvdp.o \ + obj/state.o + +OBJ += obj/sound.o \ + obj/fm.o \ + obj/sn76489.o \ + obj/ym2612.o + +OBJ += obj/sram.o \ + obj/eeprom.o \ + obj/svp.o \ + obj/ssp16.o \ + obj/cart_hw.o + +OBJ += obj/main.o \ + obj/error.o \ + obj/fileio.o \ + obj/unzip.o \ + obj/loadrom.o + +EXE = gen.exe + +all : $(EXE) + +$(EXE) : $(OBJ) shared.h + $(CC) -o $(EXE) $(OBJ) $(LIBS) $(LDFLAGS) + +obj/%.oa : cpu/%.c cpu/%.h + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : %.c %.h + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : win/%.s + $(AS) $< -o $@ + +obj/%.o : sound/%.c sound/%.h + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : cpu/%.c cpu/%.h + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : win/%.c win/%.h + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : cart_hw/%.c cart_hw/%.h + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : cart_hw/svp/%.c + $(CC) -c $< -o $@ $(FLAGS) + +obj/%.o : cart_hw/svp/%.c cart_hw/svp/%.h + $(CC) -c $< -o $@ $(FLAGS) + + +pack : + strip $(EXE) + upx -1 $(EXE) + +clean : + rm -f obj/*.o + rm -f *.bak + rm -f *.exe + rm -f *.log + rm -f *.wav + rm -f *.zip +cleancpu : + rm -f obj/z80.oa + +makedir : + mkdir obj + +archive: + pk -add -max -excl=bak -excl=out \ + -excl=test -excl=obj mdsrc.zip -dir=current + +# +# end of makefile +# diff --git a/source/unused/unzip.c b/source/unused/unzip.c index e56c55f..6d740a1 100644 --- a/source/unused/unzip.c +++ b/source/unused/unzip.c @@ -1,1301 +1,1301 @@ -/* unzip.c -- IO on .zip files using zlib - Version 0.15 beta, Mar 19th, 1998, - - Read unzip.h for more info -*/ - - -#include -#include -#include -#include "zlib.h" -#include "unzip.h" - -#ifdef STDC -# include -# include -# include -#endif -#ifdef NO_ERRNO_H - extern int errno; -#else -# include -#endif - - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - - - -#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 - -const char unz_copyright[] = - " unzip 0.15 Copyright 1998 Gilles Vollant "; - -/* 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; - - -/* =========================================================================== - 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(fin,pi) - 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 (fin,pX) - 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 (fin,pX) - 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 (fileName1,fileName2) - const char* fileName1; - const char* fileName2; -{ - for (;;) - { - char c1=*(fileName1++); - char c2=*(fileName2++); - if ((c1>='a') && (c1<='z')) - c1 -= 0x20; - if ((c2>='a') && (c2<='z')) - c2 -= 0x20; - if (c1=='\0') - return ((c2=='\0') ? 0 : -1); - if (c2=='\0') - return 1; - if (c1c2) - return 1; - } -} - - -#ifdef CASESENSITIVITYDEFAULT_NO -#define CASESENSITIVITYDEFAULTVALUE 2 -#else -#define CASESENSITIVITYDEFAULTVALUE 1 -#endif - -#ifndef STRCMPCASENOSENTIVEFUNCTION -#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal -#endif - -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) - -*/ -extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) - const char* fileName1; - const char* fileName2; - int iCaseSensitivity; -{ - if (iCaseSensitivity==0) - iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; - - if (iCaseSensitivity==1) - return strcmp(fileName1,fileName2); - - return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); -} - -#define BUFREADCOMMENT (0x400) - -/* - Locate the Central directory of a zipfile (at the end, just before - the global comment) -*/ -local uLong unzlocal_SearchCentralDir(fin) - 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 (uBackReaduMaxBack) - 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=(int)uReadSize-3; (i--)>0;) - if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && - ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) - { - uPosFound = uReadPos+i; - break; - } - - if (uPosFound!=0) - break; - } - TRYFREE(buf); - return uPosFound; -} - -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows NT computer "c:\\test\\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 (path) - 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_pospfile_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 (file,pglobal_info) - unzFile file; - unz_global_info *pglobal_info; -{ - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - *pglobal_info=s->gi; - return UNZ_OK; -} - - -/* - Translate date/time from Dos format to tm_unz (readable more easilty) -*/ -local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) - uLong ulDosDate; - tm_unz* ptm; -{ - uLong uDate; - uDate = (uLong)(ulDosDate>>16); - ptm->tm_mday = (uInt)(uDate&0x1f) ; - ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; - ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; - - ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); - ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; - ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; -} - -/* - Get Info about the current file in the zipfile, with internal only info -*/ -local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, - unz_file_info *pfile_info, - unz_file_info_internal - *pfile_info_internal, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); - -local int unzlocal_GetCurrentFileInfoInternal (file, - pfile_info, - pfile_info_internal, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - unz_file_info_internal *pfile_info_internal; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - unz_s* s; - unz_file_info file_info; - unz_file_info_internal file_info_internal; - int err=UNZ_OK; - uLong uMagic; - long lSeek=0; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (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_filename0) && (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_extrafile,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_commentfile,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 (file, - pfile_info, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, - szFileName,fileNameBufferSize, - extraField,extraFieldBufferSize, - szComment,commentBufferSize); -} - -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ -extern int ZEXPORT unzGoToFirstFile (file) - unzFile file; -{ - int err=UNZ_OK; - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - s->pos_in_central_dir=s->offset_central_dir; - s->num_file=0; - err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - - -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ -extern int ZEXPORT unzGoToNextFile (file) - unzFile file; -{ - unz_s* s; - int err; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - if (s->num_file+1==s->gi.number_entry) - return UNZ_END_OF_LIST_OF_FILE; - - s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + - s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; - s->num_file++; - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - - -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzipStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ -extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) - unzFile file; - const char *szFileName; - int iCaseSensitivity; -{ - unz_s* s; - int err; - - - 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 (s,piSizeVar, - poffset_local_extrafield, - psize_local_extrafield) - unz_s* s; - uInt* piSizeVar; - uLong *poffset_local_extrafield; - uInt *psize_local_extrafield; -{ - uLong uMagic,uData,uFlags; - uLong size_filename; - uLong size_extra_field; - int err=UNZ_OK; - - *piSizeVar = 0; - *poffset_local_extrafield = 0; - *psize_local_extrafield = 0; - - if (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!=0) && - (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 (file) - unzFile file; -{ - int err=UNZ_OK; - int Store; - 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!=0) && - (s->cur_file_info.compression_method!=Z_DEFLATED)) - err=UNZ_BADZIPFILE; - Store = s->cur_file_info.compression_method==0; - - 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; - - if (!Store) - { - 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 - */ - } - 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) -*/ -extern int ZEXPORT unzReadCurrentFile (file, buf, len) - unzFile file; - voidp buf; - unsigned len; -{ - int err=UNZ_OK; - uInt iRead = 0; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - - if ((pfile_in_zip_read_info->read_buffer == NULL)) - return UNZ_END_OF_LIST_OF_FILE; - if (len==0) - return 0; - - pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; - - pfile_in_zip_read_info->stream.avail_out = (uInt)len; - - if (len>pfile_in_zip_read_info->rest_read_uncompressed) - pfile_in_zip_read_info->stream.avail_out = - (uInt)pfile_in_zip_read_info->rest_read_uncompressed; - - while (pfile_in_zip_read_info->stream.avail_out>0) - { - if ((pfile_in_zip_read_info->stream.avail_in==0) && - (pfile_in_zip_read_info->rest_read_compressed>0)) - { - uInt uReadThis = UNZ_BUFSIZE; - if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; - if (uReadThis == 0) - return UNZ_EOF; - if (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; - } - - if (pfile_in_zip_read_info->compression_method==0) - { - 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;istream.next_out+i) = - *(pfile_in_zip_read_info->stream.next_in+i); - - pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, - pfile_in_zip_read_info->stream.next_out, - uDoCopy); - pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; - pfile_in_zip_read_info->stream.avail_in -= uDoCopy; - pfile_in_zip_read_info->stream.avail_out -= uDoCopy; - pfile_in_zip_read_info->stream.next_out += uDoCopy; - pfile_in_zip_read_info->stream.next_in += uDoCopy; - pfile_in_zip_read_info->stream.total_out += uDoCopy; - iRead += uDoCopy; - } - else - { - uLong uTotalOutBefore,uTotalOutAfter; - const Bytef *bufBefore; - uLong uOutThis; - int flush=Z_SYNC_FLUSH; - - uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; - bufBefore = pfile_in_zip_read_info->stream.next_out; - - /* - if ((pfile_in_zip_read_info->rest_read_uncompressed == - pfile_in_zip_read_info->stream.avail_out) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - flush = Z_FINISH; - */ - err=inflate(&pfile_in_zip_read_info->stream,flush); - - uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; - uOutThis = uTotalOutAfter-uTotalOutBefore; - - pfile_in_zip_read_info->crc32 = - crc32(pfile_in_zip_read_info->crc32,bufBefore, - (uInt)(uOutThis)); - - pfile_in_zip_read_info->rest_read_uncompressed -= - uOutThis; - - iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); - - if (err==Z_STREAM_END) - return (iRead==0) ? UNZ_EOF : iRead; - if (err!=Z_OK) - break; - } - } - - if (err==Z_OK) - return iRead; - return err; -} - - -/* - Give the current position in uncompressed data -*/ -extern z_off_t ZEXPORT unztell (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - return (z_off_t)pfile_in_zip_read_info->stream.total_out; -} - - -/* - return 1 if the end of file was reached, 0 elsewhere -*/ -extern int ZEXPORT unzeof (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - if (pfile_in_zip_read_info->rest_read_uncompressed == 0) - return 1; - else - return 0; -} - - - -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field that can be read - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ -extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) - unzFile file; - voidp buf; - unsigned len; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uInt read_now; - uLong size_to_read; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - size_to_read = (pfile_in_zip_read_info->size_local_extrafield - - pfile_in_zip_read_info->pos_local_extrafield); - - if (buf==NULL) - return (int)size_to_read; - - if (len>size_to_read) - read_now = (uInt)size_to_read; - else - read_now = (uInt)len ; - - if (read_now==0) - return 0; - - if (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 (file) - unzFile file; -{ - int err=UNZ_OK; - - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - - if (pfile_in_zip_read_info->rest_read_uncompressed == 0) - { - if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) - err=UNZ_CRCERROR; - } - - - TRYFREE(pfile_in_zip_read_info->read_buffer); - pfile_in_zip_read_info->read_buffer = NULL; - if (pfile_in_zip_read_info->stream_initialised) - inflateEnd(&pfile_in_zip_read_info->stream); - - pfile_in_zip_read_info->stream_initialised = 0; - TRYFREE(pfile_in_zip_read_info); - - s->pfile_in_zip_read=NULL; - - return err; -} - - -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ -extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) - unzFile file; - char *szComment; - uLong uSizeBuf; -{ -/* int err=UNZ_OK; */ - 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; -} +/* unzip.c -- IO on .zip files using zlib + Version 0.15 beta, Mar 19th, 1998, + + Read unzip.h for more info +*/ + + +#include +#include +#include +#include "zlib.h" +#include "unzip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + + +#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 + +const char unz_copyright[] = + " unzip 0.15 Copyright 1998 Gilles Vollant "; + +/* 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; + + +/* =========================================================================== + 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(fin,pi) + 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 (fin,pX) + 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 (fin,pX) + 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 (fileName1,fileName2) + const char* fileName1; + const char* fileName2; +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) + const char* fileName1; + const char* fileName2; + int iCaseSensitivity; +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#define BUFREADCOMMENT (0x400) + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local uLong unzlocal_SearchCentralDir(fin) + 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 (uBackReaduMaxBack) + 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=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\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 (path) + 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_pospfile_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 (file,pglobal_info) + unzFile file; + unz_global_info *pglobal_info; +{ + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + + +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) + uLong ulDosDate; + tm_unz* ptm; +{ + uLong uDate; + uDate = (uLong)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info *pfile_info, + unz_file_info_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unzlocal_GetCurrentFileInfoInternal (file, + pfile_info, + pfile_info_internal, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + unz_file_info_internal *pfile_info_internal; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + unz_s* s; + unz_file_info file_info; + unz_file_info_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (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_filename0) && (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_extrafile,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_commentfile,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 (file, + pfile_info, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (file) + unzFile file; +{ + int err=UNZ_OK; + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (file) + unzFile file; +{ + unz_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzipStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) + unzFile file; + const char *szFileName; + int iCaseSensitivity; +{ + unz_s* s; + int err; + + + 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 (s,piSizeVar, + poffset_local_extrafield, + psize_local_extrafield) + unz_s* s; + uInt* piSizeVar; + uLong *poffset_local_extrafield; + uInt *psize_local_extrafield; +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (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!=0) && + (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 (file) + unzFile file; +{ + int err=UNZ_OK; + int Store; + 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!=0) && + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + Store = s->cur_file_info.compression_method==0; + + 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; + + if (!Store) + { + 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 + */ + } + 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) +*/ +extern int ZEXPORT unzReadCurrentFile (file, buf, len) + unzFile file; + voidp buf; + unsigned len; +{ + int err=UNZ_OK; + uInt iRead = 0; + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->read_buffer == NULL)) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if (len>pfile_in_zip_read_info->rest_read_uncompressed) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_uncompressed; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (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; + } + + if (pfile_in_zip_read_info->compression_method==0) + { + 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;istream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else + { + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) + unzFile file; + voidp buf; + unsigned len; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + uInt read_now; + uLong size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (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 (file) + unzFile file; +{ + int err=UNZ_OK; + + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised) + inflateEnd(&pfile_in_zip_read_info->stream); + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) + unzFile file; + char *szComment; + uLong uSizeBuf; +{ +/* int err=UNZ_OK; */ + 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/source/unused/unzip.h b/source/unused/unzip.h index b8b02c0..c7ba82a 100644 --- a/source/unused/unzip.h +++ b/source/unused/unzip.h @@ -1,274 +1,274 @@ -/* 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) - -/* 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 */ +/* 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) + +/* 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/source/unused/win/error.c b/source/unused/win/error.c index 9bfa15d..298d4e1 100644 --- a/source/unused/win/error.c +++ b/source/unused/win/error.c @@ -1,39 +1,39 @@ -/* - error.c -- - Error logging -*/ - -#include "shared.h" - -FILE *error_log; - -struct { - int enabled; - int verbose; - FILE *log; -} t_error; - -void error_init(void) -{ -#ifdef DEBUG - error_log = fopen("error.log","w"); -#endif -} - -void error_shutdown(void) -{ -#ifdef DEBUG - if(error_log) fclose(error_log); -#endif -} - -void error(char *format, ...) -{ -#ifdef DEBUG - va_list ap; - va_start(ap, format); - if(error_log) vfprintf(error_log, format, ap); - va_end(ap); -#endif -} - +/* + error.c -- + Error logging +*/ + +#include "shared.h" + +FILE *error_log; + +struct { + int enabled; + int verbose; + FILE *log; +} t_error; + +void error_init(void) +{ +#ifdef DEBUG + error_log = fopen("error.log","w"); +#endif +} + +void error_shutdown(void) +{ +#ifdef DEBUG + if(error_log) fclose(error_log); +#endif +} + +void error(char *format, ...) +{ +#ifdef DEBUG + va_list ap; + va_start(ap, format); + if(error_log) vfprintf(error_log, format, ap); + va_end(ap); +#endif +} + diff --git a/source/unused/win/error.h b/source/unused/win/error.h index 14dc8e6..1d5b270 100644 --- a/source/unused/win/error.h +++ b/source/unused/win/error.h @@ -1,13 +1,13 @@ - -#ifndef _ERROR_H_ -#define _ERROR_H_ - -/* Global variables */ -FILE *error_log; - -/* Function prototypes */ -void error_init(void); -void error_shutdown(void); -void error(char *format, ...); - -#endif /* _ERROR_H_ */ + +#ifndef _ERROR_H_ +#define _ERROR_H_ + +/* Global variables */ +FILE *error_log; + +/* Function prototypes */ +void error_init(void); +void error_shutdown(void); +void error(char *format, ...); + +#endif /* _ERROR_H_ */ diff --git a/source/unused/win/main.c b/source/unused/win/main.c index 7ba316b..e24a726 100644 --- a/source/unused/win/main.c +++ b/source/unused/win/main.c @@ -1,203 +1,221 @@ - -#include -#include -#include "shared.h" - -int timer_count = 0; -int old_timer_count = 0; -int paused = 0; -int frame_count = 0; - -int update_input(void); -unsigned char *keystate; - - -Uint32 fps_callback(Uint32 interval) -{ - if(paused) return 1000/60; - timer_count++; - if(timer_count % 60 == 0) - { - int fps = frame_count; - char caption[32]; - sprintf(caption, "Genesis Plus/SDL FPS=%d", fps); - SDL_WM_SetCaption(caption, NULL); - frame_count = 0; - } - return 1000/60; -} - - -int main (int argc, char **argv) -{ - int running = 1; - - SDL_Rect viewport, src; - SDL_Surface *bmp, *screen; - SDL_Event event; - - error_init(); - - /* Print help if no game specified */ - if(argc < 2) - { - char caption[256]; - sprintf(caption, "Genesis Plus\nby Charles MacDonald\nWWW: http://cgfm2.emuviews.com\nusage: %s gamename\n", argv[0]); - MessageBox(NULL, caption, "Information", 0); - exit(1); - } - - /* Load game */ - if(!load_rom(argv[1])) - { - char caption[256]; - sprintf(caption, "Error loading file `%s'.", argv[1]); - MessageBox(NULL, caption, "Error", 0); - exit(1); - } - - viewport.x = 0; - viewport.y = 0; - viewport.w = 256; - viewport.h = 224; - - src.x = 32; - src.y = 0; - src.w = viewport.w; - src.h = viewport.h; - - if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) - { - exit(1); - } - SDL_WM_SetCaption("Genesis Plus/SDL", NULL); - - screen = SDL_SetVideoMode(viewport.w, viewport.h, 16, SDL_SWSURFACE); - viewport.x = 0; - viewport.y = 0; - - bmp = SDL_CreateRGBSurface(SDL_SWSURFACE, 1024, 512, 16, 0xF800, 0x07E0, 0x001F, 0x0000); - - - - memset(&bitmap, 0, sizeof(t_bitmap)); - bitmap.width = 1024; - bitmap.height = 512; - bitmap.depth = 16; - bitmap.granularity = 2; - bitmap.pitch = (bitmap.width * bitmap.granularity); - bitmap.data = (unsigned char *)bmp->pixels; - bitmap.viewport.w = 256; - bitmap.viewport.h = 224; - bitmap.viewport.x = 0x20; - bitmap.viewport.y = 0x00; - bitmap.remap = 1; - - system_init(); - system_reset(); - - SDL_SetTimer(1000/60, fps_callback); - - while(running) - { - running = update_input(); - - while (SDL_PollEvent(&event)) - { - switch(event.type) - { - case SDL_QUIT: /* Windows was closed */ - running = 0; - break; - - case SDL_ACTIVEEVENT: /* Window focus changed or was minimized */ - if(event.active.state & (SDL_APPINPUTFOCUS | SDL_APPACTIVE)) - { - paused = !event.active.gain; - } - break; - - default: - break; - } - } - - if(!paused) - { - frame_count++; - - update_input(); - - if(!system_frame(0)) - system_reset(); - - if(bitmap.viewport.changed) - { - bitmap.viewport.changed = 0; - src.w = bitmap.viewport.w; - src.h = bitmap.viewport.h; - viewport.w = bitmap.viewport.w; - viewport.h = bitmap.viewport.h; - screen = SDL_SetVideoMode(bitmap.viewport.w, bitmap.viewport.h, 16, SDL_SWSURFACE); - } - - SDL_BlitSurface(bmp, &src, screen, &viewport); - SDL_UpdateRect(screen, viewport.x, viewport.y, viewport.w, viewport.h); - } - } - - system_shutdown(); - SDL_Quit(); - error_shutdown(); - - return 0; -} - - -/* Check if a key is pressed */ -int check_key(int code) -{ - static char lastbuf[0x100] = {0}; - - if((!keystate[code]) && (lastbuf[code] == 1)) - lastbuf[code] = 0; - - if((keystate[code]) && (lastbuf[code] == 0)) - { - lastbuf[code] = 1; - return (1); - } - - return (0); -} - -int update_input(void) -{ - int running = 1; - - keystate = SDL_GetKeyState(NULL); - - memset(&input, 0, sizeof(t_input)); - if(keystate[SDLK_UP]) input.pad[0] |= INPUT_UP; - else - if(keystate[SDLK_DOWN]) input.pad[0] |= INPUT_DOWN; - if(keystate[SDLK_LEFT]) input.pad[0] |= INPUT_LEFT; - else - if(keystate[SDLK_RIGHT]) input.pad[0] |= INPUT_RIGHT; - - if(keystate[SDLK_a]) input.pad[0] |= INPUT_A; - if(keystate[SDLK_s]) input.pad[0] |= INPUT_B; - if(keystate[SDLK_d]) input.pad[0] |= INPUT_C; - if(keystate[SDLK_f]) input.pad[0] |= INPUT_START; - if(keystate[SDLK_z]) input.pad[0] |= INPUT_X; - if(keystate[SDLK_x]) input.pad[0] |= INPUT_Y; - if(keystate[SDLK_c]) input.pad[0] |= INPUT_Z; - if(keystate[SDLK_v]) input.pad[0] |= INPUT_MODE; - - if(keystate[SDLK_TAB]) system_reset(); - - if(keystate[SDLK_ESCAPE]) running = 0; - return (running); -} - - + +#include +#include +#include "shared.h" + +int timer_count = 0; +int old_timer_count = 0; +int paused = 0; +int frame_count = 0; + +int update_input(void); +unsigned char *keystate; + +/* Options default */ +uint8 overscan = 1; +uint8 use_480i = 1; +uint8 FM_GENS = 1; +uint8 hq_fm = 1; +uint8 ssg_enabled = 0; +double psg_preamp = 0.5; +double fm_preamp = 1.0; +uint8 boost = 1; +uint8 region_detect = 0; +uint8 sys_type[2] = {0,0}; +uint8 force_dtack = 0; +uint8 dmatiming = 1; +uint8 vdptiming = 1; + +uint8 log_error = 1; +uint8 debug_on = 0; + + +Uint32 fps_callback(Uint32 interval) +{ + if(paused) return 1000/60; + timer_count++; + if(timer_count % 60 == 0) + { + int fps = frame_count; + char caption[32]; + sprintf(caption, "Genesis Plus/SDL FPS=%d", fps); + SDL_WM_SetCaption(caption, NULL); + frame_count = 0; + } + return 1000/60; +} + + +int main (int argc, char **argv) +{ + int running = 1; + + SDL_Rect viewport, src; + SDL_Surface *bmp, *screen; + SDL_Event event; + + error_init(); + + /* Print help if no game specified */ + if(argc < 2) + { + char caption[256]; + sprintf(caption, "Genesis Plus\nby Charles MacDonald\nWWW: http://cgfm2.emuviews.com\nusage: %s gamename\n", argv[0]); + MessageBox(NULL, caption, "Information", 0); + exit(1); + } + + /* Load game */ + if(!load_rom(argv[1])) + { + char caption[256]; + sprintf(caption, "Error loading file `%s'.", argv[1]); + MessageBox(NULL, caption, "Error", 0); + exit(1); + } + + viewport.x = 0; + viewport.y = 0; + viewport.w = 256; + viewport.h = 224; + + src.x = 32; + src.y = 0; + src.w = viewport.w; + src.h = viewport.h; + + if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) + { + exit(1); + } + SDL_WM_SetCaption("Genesis Plus/SDL", NULL); + + screen = SDL_SetVideoMode(viewport.w, viewport.h, 16, SDL_SWSURFACE); + viewport.x = 0; + viewport.y = 0; + + bmp = SDL_CreateRGBSurface(SDL_SWSURFACE, 1024, 512, 16, 0xF800, 0x07E0, 0x001F, 0x0000); + + + + memset(&bitmap, 0, sizeof(t_bitmap)); + bitmap.width = 1024; + bitmap.height = 512; + bitmap.depth = 16; + bitmap.granularity = 2; + bitmap.pitch = (bitmap.width * bitmap.granularity); + bitmap.data = (unsigned char *)bmp->pixels; + bitmap.viewport.w = 256; + bitmap.viewport.h = 224; + bitmap.viewport.x = 0x20; + bitmap.viewport.y = 0x00; + bitmap.remap = 1; + + system_init(); + system_reset(); + + SDL_SetTimer(1000/60, fps_callback); + + while(running) + { + running = update_input(); + + while (SDL_PollEvent(&event)) + { + switch(event.type) + { + case SDL_QUIT: /* Windows was closed */ + running = 0; + break; + + case SDL_ACTIVEEVENT: /* Window focus changed or was minimized */ + if(event.active.state & (SDL_APPINPUTFOCUS | SDL_APPACTIVE)) + { + paused = !event.active.gain; + } + break; + + default: + break; + } + } + + if(!paused) + { + frame_count++; + + update_input(); + + if(!system_frame(0)) + system_reset(); + + if(bitmap.viewport.changed) + { + bitmap.viewport.changed = 0; + src.w = bitmap.viewport.w; + src.h = bitmap.viewport.h; + viewport.w = bitmap.viewport.w; + viewport.h = bitmap.viewport.h; + screen = SDL_SetVideoMode(bitmap.viewport.w, bitmap.viewport.h, 16, SDL_SWSURFACE); + } + + SDL_BlitSurface(bmp, &src, screen, &viewport); + SDL_UpdateRect(screen, viewport.x, viewport.y, viewport.w, viewport.h); + } + } + + system_shutdown(); + SDL_Quit(); + error_shutdown(); + + return 0; +} + + +/* Check if a key is pressed */ +int check_key(int code) +{ + static char lastbuf[0x100] = {0}; + + if((!keystate[code]) && (lastbuf[code] == 1)) + lastbuf[code] = 0; + + if((keystate[code]) && (lastbuf[code] == 0)) + { + lastbuf[code] = 1; + return (1); + } + + return (0); +} + +int update_input(void) +{ + int running = 1; + + keystate = SDL_GetKeyState(NULL); + + memset(&input, 0, sizeof(t_input)); + if(keystate[SDLK_UP]) input.pad[0] |= INPUT_UP; + else + if(keystate[SDLK_DOWN]) input.pad[0] |= INPUT_DOWN; + if(keystate[SDLK_LEFT]) input.pad[0] |= INPUT_LEFT; + else + if(keystate[SDLK_RIGHT]) input.pad[0] |= INPUT_RIGHT; + + if(keystate[SDLK_a]) input.pad[0] |= INPUT_A; + if(keystate[SDLK_s]) input.pad[0] |= INPUT_B; + if(keystate[SDLK_d]) input.pad[0] |= INPUT_C; + if(keystate[SDLK_f]) input.pad[0] |= INPUT_START; + if(keystate[SDLK_z]) input.pad[0] |= INPUT_X; + if(keystate[SDLK_x]) input.pad[0] |= INPUT_Y; + if(keystate[SDLK_c]) input.pad[0] |= INPUT_Z; + if(keystate[SDLK_v]) input.pad[0] |= INPUT_MODE; + + if(keystate[SDLK_TAB]) system_reset(); + + if(keystate[SDLK_ESCAPE]) running = 0; + return (running); +} + + diff --git a/source/unused/win/main.h b/source/unused/win/main.h index b369df6..2ce1741 100644 --- a/source/unused/win/main.h +++ b/source/unused/win/main.h @@ -1,7 +1,24 @@ - -#ifndef _MAIN_H_ -#define _MAIN_H_ - - - -#endif /* _MAIN_H_ */ + +#ifndef _MAIN_H_ +#define _MAIN_H_ + +/* options */ +extern uint8 overscan; +extern uint8 use_480i; +extern uint8 FM_GENS; +extern uint8 hq_fm; +extern uint8 ssg_enabled; +extern double psg_preamp; +extern double fm_preamp; +extern uint8 boost; +extern uint8 region_detect; +extern uint8 sys_type[2]; +extern uint8 force_dtack; +extern uint8 dmatiming; +extern uint8 vdptiming; + +extern uint8 debug_on; +extern uint8 log_error; + + +#endif /* _MAIN_H_ */ diff --git a/source/unused/win/osd.h b/source/unused/win/osd.h index 46f6e7e..233d135 100644 --- a/source/unused/win/osd.h +++ b/source/unused/win/osd.h @@ -1,18 +1,20 @@ - -#ifndef _OSD_H_ -#define _OSD_H_ - -#include -#include -#include -#include -#include - -#include "SDL.h" -#include - -#include "error.h" -#include "shared.h" -#include "main.h" - -#endif /* _OSD_H_ */ + +#ifndef _OSD_H_ +#define _OSD_H_ + +#include +#include +#include +#include +#include + +#include "SDL.h" +#include + +#include "error.h" +#include "shared.h" +#include "main.h" +#include "unzip.h" +#include "fileio.h" + +#endif /* _OSD_H_ */ diff --git a/source/vdp.c b/source/vdp.c index a19b7e6..ab37639 100644 --- a/source/vdp.c +++ b/source/vdp.c @@ -1,3 +1,25 @@ +/*************************************************************************************** + * Genesis Plus 1.2a + * Video Display Processor (memory handlers) + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ #include "shared.h" #include "hvc.h" @@ -14,14 +36,69 @@ bg_name_dirty[name] |= (1 << ((addr >> 2) & 0x07)); \ } +/* VDP context */ +uint8 sat[0x400]; /* Internal copy of sprite attribute table */ +uint8 vram[0x10000]; /* Video RAM (64Kx8) */ +uint8 cram[0x80]; /* On-chip color RAM (64x9) */ +uint8 vsram[0x80]; /* On-chip vertical scroll RAM (40x11) */ +uint8 reg[0x20]; /* Internal VDP registers (23x8) */ +uint16 addr; /* Address register */ +uint16 addr_latch; /* Latched A15, A14 of address */ +uint8 code; /* Code register */ +uint8 pending; /* Pending write flag */ +uint16 status; /* VDP status flags */ +uint8 dmafill; /* next VDP Write is DMA Fill */ +uint8 hint_pending; /* 0= Line interrupt is pending */ +uint8 vint_pending; /* 1= Frame interrupt is pending */ +uint8 vint_triggered; /* 1= Frame interrupt has been triggered */ +int8 hvint_updated; /* >= 0: Interrupt lines updated */ + +/* Global variables */ +uint16 ntab; /* Name table A base address */ +uint16 ntbb; /* Name table B base address */ +uint16 ntwb; /* Name table W base address */ +uint16 satb; /* Sprite attribute table base address */ +uint16 hscb; /* Horizontal scroll table base address */ +uint8 border; /* Border color index */ +uint8 bg_name_dirty[0x800]; /* 1= This pattern is dirty */ +uint16 bg_name_list[0x800]; /* List of modified pattern indices */ +uint16 bg_list_index; /* # of modified patterns in list */ +uint8 bg_pattern_cache[0x80000]; /* Cached and flipped patterns */ +uint8 playfield_shift; /* Width of planes A, B (in bits) */ +uint8 playfield_col_mask; /* Vertical scroll mask */ +uint16 playfield_row_mask; /* Horizontal scroll mask */ +uint32 y_mask; /* Name table Y-index bits mask */ +int16 h_counter; /* Raster counter */ +int16 hc_latch; /* latched HCounter (INT2) */ +uint16 v_counter; /* VDP scanline counter */ +uint8 im2_flag; /* 1= Interlace mode 2 is being used */ +uint32 dma_length; /* Current DMA remaining bytes */ +int32 fifo_write_cnt; /* VDP writes fifo count */ +uint32 fifo_lastwrite; /* last VDP write cycle */ +uint8 fifo_latency; /* VDP write cycles latency */ +uint8 vdp_pal = 0; /* 1: PAL , 0: NTSC (default) */ + +double vdp_timings[4][4]; + /* Tables that define the playfield layout */ -uint8 shift_table[] = { 6, 7, 0, 8 }; -uint8 col_mask_table[] = { 0x0F, 0x1F, 0x0F, 0x3F }; -uint16 row_mask_table[] = { 0x0FF, 0x1FF, 0x2FF, 0x3FF }; -uint32 y_mask_table[] = { 0x1FC0, 0x1F80, 0x1FC0, 0x1F00 }; +static const uint8 shift_table[] = { 6, 7, 0, 8 }; +static const uint8 col_mask_table[] = { 0x0F, 0x1F, 0x0F, 0x3F }; +static const uint16 row_mask_table[] = { 0x0FF, 0x1FF, 0x2FF, 0x3FF }; +static const uint32 y_mask_table[] = { 0x1FC0, 0x1F80, 0x1FC0, 0x1F00 }; -/* DMA Timings Table +static uint16 sat_base_mask; /* Base bits of SAT */ +static uint16 sat_addr_mask; /* Index bits of SAT */ +static uint32 dma_endCycles; /* 68k cycles to DMA end */ +static uint8 dma_type; /* Type of DMA */ +/* TODO: set as default */ +static uint8 dmatiming = 1; +static uint8 vdptiming = 1; + +/* DMA Timings + + According to the manual, here's a table that describes the transfer + rates of each of the three DMA types: DMA Mode Width Display Transfer Count ----------------------------------------------------- @@ -38,208 +115,285 @@ uint32 y_mask_table[] = { 0x1FC0, 0x1F80, 0x1FC0, 0x1F00 }; 40-cell Active 9 Blanking 102 -*/ + 'Active' is the active display period, 'Blanking' is either the vertical + blanking period or when the display is forcibly blanked via register #1. -uint8 dmarate_table[16] = { - 83 , 102, 8, 9, // M68k to VRAM - 167, 205, 16, 18, // M68k to VSRAM or CRAM - 166, 204, 15, 17, // DMA fill - 83 , 102, 8, 9 // DMA Copy + The above transfer counts are all in bytes, unless the destination is + CRAM or VSRAM for a 68K > VDP transfer, in which case it is in words. + +*/ +static const uint8 dma_rates[16] = { + 8, 9, 83 , 102, /* 68K to VRAM */ + 16, 18, 167, 205, /* 68K to CRAM or VSRAM */ + 15, 17, 166, 204, /* DMA fill */ + 8, 9, 83 , 102, /* DMA Copy */ }; -uint8 sat[0x400]; /* Internal copy of sprite attribute table */ -uint8 vram[0x10000]; /* Video RAM (64Kx8) */ -uint8 cram[0x80]; /* On-chip color RAM (64x9) */ -uint8 vsram[0x80]; /* On-chip vertical scroll RAM (40x11) */ -uint8 reg[0x20]; /* Internal VDP registers (23x8) */ -uint16 addr; /* Address register */ -uint16 addr_latch; /* Latched A15, A14 of address */ -uint8 code; /* Code register */ -uint8 pending; /* Pending write flag */ -uint16 status; /* VDP status flags */ -uint16 ntab; /* Name table A base address */ -uint16 ntbb; /* Name table B base address */ -uint16 ntwb; /* Name table W base address */ -uint16 satb; /* Sprite attribute table base address */ -uint16 hscb; /* Horizontal scroll table base address */ -uint16 sat_base_mask; /* Base bits of SAT */ -uint16 sat_addr_mask; /* Index bits of SAT */ -uint8 border; /* Border color index */ -uint8 bg_name_dirty[0x800]; /* 1= This pattern is dirty */ -uint16 bg_name_list[0x800]; /* List of modified pattern indices */ -uint16 bg_list_index; /* # of modified patterns in list */ -uint8 bg_pattern_cache[0x80000]; /* Cached and flipped patterns */ -uint8 playfield_shift; /* Width of planes A, B (in bits) */ -uint8 playfield_col_mask; /* Vertical scroll mask */ -uint16 playfield_row_mask; /* Horizontal scroll mask */ -uint32 y_mask; /* Name table Y-index bits mask */ -uint8 hint_pending; /* 0= Line interrupt is pending */ -uint8 vint_pending; /* 1= Frame interrupt is pending */ -int16 h_counter; /* Raster counter */ -int16 hc_latch; /* latched HCounter (INT2) */ -uint16 v_counter; /* VDP scan line counter */ -uint8 im2_flag; /* 1= Interlace mode 2 is being used */ -uint16 frame_end; /* End-of-frame (IRQ line) */ -uint8 dmafill; /* 1= DMA fill has been requested */ -uint32 dma_endCycles; /* DMA ending cycles count */ -uint8 vdp_pal = 0 ; /* CPU mode (NTSC by default) */ -uint8 vdp_rate = 60; /* CPU speed (60Hz by default)*/ -void (*color_update) (int index, uint16 data); - -uint8 dmatiming = 1; -uint8 vdptiming = 0; +/* Function prototypes */ +static inline void data_write(unsigned int data); /*--------------------------------------------------------------------------*/ /* Init, reset, shutdown functions */ /*--------------------------------------------------------------------------*/ -void vdp_init (void) -{} - -void vdp_reset (void) +void vdp_init(void) { - memset ((char *) sat, 0, sizeof (sat)); - memset ((char *) vram, 0, sizeof (vram)); - memset ((char *) cram, 0, sizeof (cram)); - memset ((char *) vsram, 0, sizeof (vsram)); - memset ((char *) reg, 0, sizeof (reg)); + int i; + + /* reinitialize DMA timings table */ + for (i=0; i<4; i++) + { + vdp_timings[0][i] = ((double)m68cycles_per_line) / ((double) dma_rates[i]); + vdp_timings[1][i] = ((double)m68cycles_per_line) / ((double) dma_rates[i + 4]); + vdp_timings[2][i] = ((double)m68cycles_per_line) / ((double) dma_rates[i + 8]); + vdp_timings[3][i] = ((double)m68cycles_per_line) / ((double) dma_rates[i + 12]); + } +} + +void vdp_reset(void) +{ + memset ((char *) sat, 0, sizeof (sat)); + memset ((char *) vram, 0, sizeof (vram)); + memset ((char *) cram, 0, sizeof (cram)); + memset ((char *) vsram, 0, sizeof (vsram)); + memset ((char *) reg, 0, sizeof (reg)); + + addr = 0; + addr_latch = 0; + code = 0; + pending = 0; + + status = 0x200; /* fifo empty */ + + ntab = 0; + ntbb = 0; + ntwb = 0; + satb = 0; + hscb = 0; - addr = addr_latch = code = pending = 0; - ntab = ntbb = ntwb = satb = hscb = 0; sat_base_mask = 0xFE00; sat_addr_mask = 0x01FF; - /* Mark all colors as dirty to force a palette update */ border = 0x00; - memset ((char *) bg_name_dirty, 0, sizeof (bg_name_dirty)); - memset ((char *) bg_name_list, 0, sizeof (bg_name_list)); + memset ((char *) bg_name_dirty, 0, sizeof (bg_name_dirty)); + memset ((char *) bg_name_list, 0, sizeof (bg_name_list)); bg_list_index = 0; - memset ((char *) bg_pattern_cache, 0, sizeof (bg_pattern_cache)); + memset ((char *) bg_pattern_cache, 0, sizeof (bg_pattern_cache)); playfield_shift = 6; - playfield_col_mask = 0x0F; + playfield_col_mask = 0x0F; playfield_row_mask = 0x0FF; y_mask = 0x1FC0; - hint_pending = vint_pending = 0; - h_counter = 0; - hc_latch = -1; - v_counter = 0; - dmafill = 0; - im2_flag = 0; - frame_end = 0xE0; - dma_endCycles = 0; - - status = 0x3600; /* fifo empty */ + hint_pending = 0; + vint_pending = 0; + vint_triggered = 0; + hvint_updated = -1; - /* Initialize viewport */ - bitmap.viewport.x = 0x20; - bitmap.viewport.y = 0x20; - bitmap.viewport.w = 256; - bitmap.viewport.h = 224; - bitmap.viewport.oh = 256; - bitmap.viewport.ow = 224; - bitmap.viewport.changed = 1; + h_counter = 0; + hc_latch = -1; + v_counter = 0; + + dmafill = 0; + dma_length = 0; + dma_endCycles = 0; + + im2_flag = 0; + interlaced = 0; + + fifo_write_cnt = 0; + + /* reset HVC tables */ + vctab = (vdp_pal) ? vc_pal_224 : vc_ntsc_224; + hctab = cycle2hc32; + + /* reset display area */ + bitmap.viewport.w = 256; + bitmap.viewport.h = 224; + bitmap.viewport.oh = 256; + bitmap.viewport.ow = 224; + + /* reset border area */ + bitmap.viewport.x = config.overscan ? 12 : 0; + bitmap.viewport.y = config.overscan ? (vdp_pal ? 32 : 8) : 0; + bitmap.viewport.changed = 1; + + /* initialize some registers (normally set by BIOS) */ + if (config.bios_enabled != 3) + { + vdp_reg_w(1 , 0x04); /* Mode 5 enabled */ + vdp_reg_w(10, 0xff); /* HINT disabled */ + vdp_reg_w(12, 0x81); /* H40 mode */ + vdp_reg_w(15, 0x02); /* auto increment */ + } + + /* default latency */ + fifo_latency = 27; } -void vdp_shutdown (void) +void vdp_shutdown(void) {} +void vdp_restore(uint8 *vdp_regs) +{ + int i; + + for (i=0;i<0x20;i++) + { + vdp_reg_w(i, vdp_regs[i]); + } + + /* reinitialize HVC tables */ + vctab = (vdp_pal) ? ((reg[1] & 8) ? vc_pal_240 : vc_pal_224) : vc_ntsc_224; + hctab = (reg[12] & 1) ? cycle2hc40 : cycle2hc32; + + /* reinitialize overscan area */ + bitmap.viewport.x = config.overscan ? ((reg[12] & 1) ? 16 : 12) : 0; + bitmap.viewport.y = config.overscan ? (((reg[1] & 8) ? 0 : 8) + (vdp_pal ? 24 : 0)) : 0; + bitmap.viewport.changed = 1; + + /* restore VDP FIFO timings */ + if (vdptiming) + { + /* VDP timings: + ------------ + HDISP is 256*10/7 = approx. 366 cycles (same for both modes) + this gives: + H32: 16 accesses --> 366/16 = 23 cycles per access + H40: 20 accesses --> 366/20 = 18 cycles per access + + VRAM access are byte wide --> VRAM writes takes 2x CPU cycles + */ + fifo_latency = (reg[12] & 1) ? 27 : 30; + if ((code & 0x0F) == 0x01) fifo_latency = fifo_latency * 2; + } + + /* remake cache */ + for (i=0;i<0x800;i++) + { + bg_name_list[i]=i; + bg_name_dirty[i]=0xFF; + } + bg_list_index=0x800; + + /* reinitialize palette */ + for(i = 0; i < 0x40; i += 1) color_update(i, *(uint16 *)&cram[i << 1]); + color_update(0x00, *(uint16 *)&cram[border << 1]); +} + /*--------------------------------------------------------------------------*/ /* DMA Operations */ /*--------------------------------------------------------------------------*/ -/* DMA Timings */ -/* timing type = 0 (Copy to VRAM), 1 (Copy to VSRAM or CRAM), 2 (VRAM Fill), 3 (VRAM Copy) */ -void dma_update(int type, int length) +/* Update DMA timings (this is call on start of DMA and then at the start of each scanline) */ +void dma_update() { - uint32 dma_cycles; - uint8 index = 4 * type; /* DMA timing type */ + int32 left_cycles; + uint32 dma_cycles, dma_bytes; + uint8 index = 0; if (!dmatiming) return; - + /* get the appropriate tranfer rate (bytes/line) for this DMA operation */ - if (!(status&8) && (reg[1]&0x40)) index += 2; /* not in VBLANK and Display ON */ - index += (reg[12] & 1); /* 32 or 40 Horizontal Cells */ - - /* determinate associated 68kcycles number */ - dma_cycles = (misc68Kcycles * length ) / dmarate_table[index]; - - if (type < 2) + if ((status&8) || !(reg[1] & 0x40)) index = 2; /* VBLANK or Display OFF */ + index += (reg[12] & 1); /* 32 or 40 Horizontal Cells */ + + /* calculate transfer quantity for the remaining 68k cycles */ + left_cycles = aim_m68k - count_m68k; + if (left_cycles < 0) left_cycles = 0; + dma_bytes = (uint32)(((double)left_cycles / vdp_timings[dma_type][index]) + 0.5); + + /* determinate DMA length in CPU cycles */ + if (dma_length < dma_bytes) + { + /* DMA will be finished during this line */ + dma_cycles = (uint32)(((double)dma_length * vdp_timings[dma_type][index]) + 0.5); + dma_length = 0; + } + else + { + /* DMA can not be finished until next scanline */ + dma_cycles = left_cycles; + dma_length -= dma_bytes; + } + + if (dma_type < 2) { /* 68K COPY to V-RAM */ /* 68K is frozen during DMA operation */ - m68k_freeze(dma_cycles); - } + count_m68k += dma_cycles; + } else { /* VRAM Fill or VRAM Copy */ - /* we keep the number of cycles executed so far */ - /* used for DMA Busy flag update on status read */ - dma_endCycles = count_m68k + m68k_cycles_run() + dma_cycles; - dma_m68k = 0; + /* set DMA end cyles count */ + dma_endCycles = count_m68k + dma_cycles; /* set DMA Busy flag */ - status |= 0x0002; + status |= 0x0002; } } -/* VRAM to VRAM copy +/* DMA Copy Read byte from VRAM (source), write to VRAM (addr), bump source and add r15 to addr. - see how source addr is affected - (can it make high source byte inc?) */ -void dma_copy (void) + (can it make high source byte inc?) +*/ +static inline void dma_copy(void) { int length = (reg[20] << 8 | reg[19]) & 0xFFFF; int source = (reg[22] << 8 | reg[21]) & 0xFFFF; if (!length) length = 0x10000; - dma_update(3,length); + dma_type = 3; + dma_length = length; + dma_update(); - do - { - vram[addr] = vram[source]; - MARK_BG_DIRTY (addr); - source = (source + 1) & 0xFFFF; - addr += reg[15]; - } - while (--length); + /* proceed DMA */ + do + { + vram[addr] = vram[source]; + MARK_BG_DIRTY(addr); + source = (source + 1) & 0xFFFF; + addr += reg[15]; + } while (--length); - reg[19] = length & 0xFF; + /* update length & source address registers */ + reg[19] = length & 0xFF; reg[20] = (length >> 8) & 0xFF; - reg[21] = source & 0xFF; /* not sure */ - reg[22] = (source >> 8) & 0xFF; + reg[21] = source & 0xFF; /* not sure */ + reg[22] = (source >> 8) & 0xFF; } /* 68K Copy to VRAM, VSRAM or CRAM */ -void dma_vbus (void) +static inline void dma_vbus (void) { - uint32 base, source = ((reg[23] & 0x7F) << 17 | reg[22] << 9 | reg[21] << 1) & 0xFFFFFE; - uint32 length = (reg[20] << 8 | reg[19]) & 0xFFFF; - uint8 old_vdptiming = vdptiming; - - if (!length) length = 0x10000; - base = source; - - /* DMA timings */ - if ((code & 0x0F) == 0x01) dma_update(0,length); /* VRAM */ - else dma_update(1,length); /* CRAM & VSRAM */ - vdptiming = 0; + uint32 base, source = ((reg[23] & 0x7F) << 17 | reg[22] << 9 | reg[21] << 1) & 0xFFFFFE; + uint32 length = (reg[20] << 8 | reg[19]) & 0xFFFF; - do - { - uint16 temp = vdp_dma_r (source); - source += 2; - source = ((base & 0xFE0000) | (source & 0x1FFFF)); - vdp_data_w (temp); - } - while (--length); + if (!length) length = 0x10000; + base = source; - vdptiming = old_vdptiming; - reg[19] = length & 0xFF; + /* DMA timings */ + dma_type = (code & 0x06) ? 1 : 0; + dma_length = length; + dma_update(); + + /* proceed DMA */ + do + { + unsigned int temp = vdp_dma_r(source); + source += 2; + source = ((base & 0xFE0000) | (source & 0x1FFFF)); + data_write (temp); + } + while (--length); + + /* update length & source address registers */ + reg[19] = length & 0xFF; reg[20] = (length >> 8) & 0xFF; reg[21] = (source >> 1) & 0xFF; reg[22] = (source >> 9) & 0xFF; @@ -247,85 +401,197 @@ void dma_vbus (void) } /* VRAM FILL */ -void dma_fill(uint16 data) +static inline void dma_fill(unsigned int data) { int length = (reg[20] << 8 | reg[19]) & 0xFFFF; - if (!length) length = 0x10000; - dma_update(2, length); - WRITE_BYTE(vram, addr, data & 0xFF); + /* DMA timings */ + dma_type = 2; + dma_length = length; + dma_update(); - do + /* proceed DMA */ + data_write(data); + + /* write MSB */ + data = (data >> 8) & 0xff; + + /* detect internal SAT modification */ + if ((addr & sat_base_mask) == satb) { - WRITE_BYTE(vram, addr^1, (data >> 8) & 0xFF); - MARK_BG_DIRTY (addr); - addr += reg[15]; - } - while (--length); + do + { + /* update internal SAT (fix Battletech) */ + WRITE_BYTE(sat, (addr & sat_addr_mask)^1, data); - reg[19] = length & 0xFF; - reg[20] = (length >> 8) & 0xFF; - dmafill = 0; + WRITE_BYTE(vram, addr^1, data); + MARK_BG_DIRTY (addr); + addr += reg[15]; + } + while (--length); + } + else + { + do + { + WRITE_BYTE(vram, addr^1, data); + MARK_BG_DIRTY (addr); + addr += reg[15]; + } + while (--length); + } + + /* update length register */ + reg[19] = length & 0xFF; + reg[20] = (length >> 8) & 0xFF; + dmafill = 0; } +/*--------------------------------------------------------------------------*/ +/* FIFO emulation */ +/*--------------------------------------------------------------------------*/ +static inline void fifo_update() +{ + if (fifo_write_cnt > 0) + { + /* update FIFO reads */ + uint32 fifo_read = ((count_m68k - fifo_lastwrite) / fifo_latency); + if (fifo_read > 0) + { + fifo_write_cnt -= fifo_read; + if (fifo_write_cnt < 0) fifo_write_cnt = 0; + + /* update cycle count */ + fifo_lastwrite += fifo_read*fifo_latency; + } + } +} /*--------------------------------------------------------------------------*/ /* Memory access functions */ /*--------------------------------------------------------------------------*/ - -void vdp_ctrl_w (uint16 data) +static inline void data_write (unsigned int data) { - if (pending == 0) - { - if ((data & 0xC000) == 0x8000) - { - uint8 r = (data >> 8) & 0x1F; - uint8 d = data & 0xFF; - vdp_reg_w (r, d); - } - else pending = 1; + switch (code & 0x0F) + { + case 0x01: /* VRAM */ + + /* Byte-swap data if A0 is set */ + if (addr & 1) data = (data >> 8) | (data << 8); - addr = ((addr_latch & 0xC000) | (data & 0x3FFF)) & 0xFFFF; - code = ((code & 0x3C) | ((data >> 14) & 0x03)) & 0x3F; - } - else - { - /* Clear pending flag */ - pending = 0; + /* Copy SAT data to the internal SAT */ + if ((addr & sat_base_mask) == satb) + { + *(uint16 *) &sat[addr & sat_addr_mask & 0xFFFE] = data; + } - /* Update address and code registers */ - addr = ((addr & 0x3FFF) | ((data & 3) << 14)) & 0xFFFF; - code = ((code & 0x03) | ((data >> 2) & 0x3C)) & 0x3F; + /* Only write unique data to VRAM */ + if (data != *(uint16 *) &vram[addr & 0xFFFE]) + { + /* Write data to VRAM */ + *(uint16 *) &vram[addr & 0xFFFE] = data; - /* Save address bits A15 and A14 */ - addr_latch = (addr & 0xC000); + /* Update the pattern cache */ + MARK_BG_DIRTY (addr); + } + break; - if ((code & 0x20) && (reg[1] & 0x10)) - { - switch (reg[23] & 0xC0) - { - case 0x00: /* V bus to VDP DMA */ - case 0x40: /* V bus to VDP DMA */ - dma_vbus (); - break; + case 0x03: /* CRAM */ + { + uint16 *p = (uint16 *) &cram[(addr & 0x7E)]; + data = PACK_CRAM (data & 0x0EEE); + if (data != *p) + { + int index = (addr >> 1) & 0x3F; + *p = data; + color_update (index, *p); + color_update (0x00, *(uint16 *)&cram[border << 1]); + } + break; + } - case 0x80: /* VRAM fill */ - dmafill = 1; - break; + case 0x05: /* VSRAM */ + *(uint16 *) &vsram[(addr & 0x7E)] = data; + break; + } - case 0xC0: /* VRAM copy */ - dma_copy (); - break; - } - } - } + /* Increment address register */ + addr += reg[15]; } -uint16 vdp_ctrl_r (void) + +void vdp_ctrl_w(unsigned int data) { - /** - * Return vdp status + if (pending == 0) + { + if ((data & 0xC000) == 0x8000) + { + /* VDP register write */ + uint8 r = (data >> 8) & 0x1F; + uint8 d = data & 0xFF; + vdp_reg_w (r, d); + } + else pending = 1; + + addr = ((addr_latch & 0xC000) | (data & 0x3FFF)) & 0xFFFF; + code = ((code & 0x3C) | ((data >> 14) & 0x03)) & 0x3F; + } + else + { + /* Clear pending flag */ + pending = 0; + + /* Update address and code registers */ + addr = ((addr & 0x3FFF) | ((data & 3) << 14)) & 0xFFFF; + code = ((code & 0x03) | ((data >> 2) & 0x3C)) & 0x3F; + + /* Save address bits A15 and A14 */ + addr_latch = (addr & 0xC000); + + /* DMA operation */ + if ((code & 0x20) && (reg[1] & 0x10)) + { + switch (reg[23] & 0xC0) + { + case 0x00: /* V bus to VDP DMA */ + case 0x40: /* V bus to VDP DMA */ + dma_vbus(); + break; + + case 0x80: /* VRAM fill */ + dmafill = 1; + break; + + case 0xC0: /* VRAM copy */ + dma_copy(); + break; + } + } + } + + /* FIFO emulation */ + if (vdptiming) + { + /* VDP timings: + ------------ + HDISP is 256*10/7 = approx. 366 cycles (same for both modes) + this gives: + H32: 16 accesses --> 366/16 = 23 cycles per access + H40: 20 accesses --> 366/20 = 18 cycles per access + + VRAM access are byte wide --> VRAM writes takes 2x CPU cycles + */ + fifo_latency = (reg[12] & 1) ? 27 : 30; + if ((code & 0x0F) == 0x01) fifo_latency = fifo_latency * 2; + } +} + + +unsigned int vdp_ctrl_r(void) +{ + /* + * Return vdp status * * Bits are * 0 0:1 ntsc:pal @@ -341,122 +607,103 @@ uint16 vdp_ctrl_r (void) * 10 - 15 Next word on bus */ - uint16 temp; - int dma_lastCycles = dma_endCycles - (dma_m68k + count_m68k + m68k_cycles_run()); - - /* reset DMA status flag if needed */ - if ((status & 0x0002) && (dma_lastCycles <= 0)) status &= 0xFFFD; - - temp = status | vdp_pal; - pending = 0; - - /* reset status */ - status ^= 0x0300; /* toggle FIFO status */ - status &= 0xFF9F; /* clear sprite overflow & sprite collision */ - if (!(status & 8)) status &= ~0x0080; /* not in VBLANK: clear vint flag */ - - if (!(reg[1] & 0x40)) temp |= 0x8; /* no display => in VBLANK*/ - - return (temp); -} - - -void vdp_data_w (uint16 data) -{ - /* Clear pending flag */ - pending = 0; - - if (dmafill) - { - dma_fill(data); - return; - } - - /* delays VDP RAM access */ - /* hack for Chaos Engine / Soldiers of Fortune */ - if (vdptiming && !(status&8) && (reg[1]&0x40)) - { - if (reg[12] & 1) m68k_freeze(30); // 40 cell - else m68k_freeze(27); // 32 cell - } - - switch (code & 0x0F) - { - case 0x01: /* VRAM */ - - /* Byte-swap data if A0 is set */ - if (addr & 1) data = (data >> 8) | (data << 8); - - /* Copy SAT data to the internal SAT */ - if ((addr & sat_base_mask) == satb) - { - *(uint16 *) & sat[addr & sat_addr_mask] = data; - } - - /* Only write unique data to VRAM */ - if (data != *(uint16 *) & vram[addr & 0xFFFE]) - { - /* Write data to VRAM */ - *(uint16 *) & vram[addr & 0xFFFE] = data; - - /* Update the pattern cache */ - MARK_BG_DIRTY (addr); - } - break; - - case 0x03: /* CRAM */ + /* update FIFO flags */ + if (vdptiming) { - uint16 *p = (uint16 *) & cram[(addr & 0x7E)]; - data = PACK_CRAM (data & 0x0EEE); - if (data != *p) - { - int index = (addr >> 1) & 0x3F; - *p = data; - color_update (index, *p); - color_update (0x00, *(uint16 *)&cram[border << 1]); - } + fifo_update(); + if (fifo_write_cnt < 4) + { + status &= 0xFEFF; + if (fifo_write_cnt == 0) status |= 0x200; + } } - break; + else status ^= 0x200; - case 0x05: /* VSRAM */ - *(uint16 *) & vsram[(addr & 0x7E)] = data; - break; - } + /* update DMA Busy flag */ + if ((status & 2) && !dma_length && (count_m68k >= dma_endCycles)) + status &= 0xFFFD; - /* Bump address register */ - addr += reg[15]; - + unsigned int temp = status | vdp_pal; + + /* display OFF: VBLANK flag is set */ + if (!(reg[1] & 0x40)) temp |= 0x8; + + /* HBLANK flag (Sonic 3 and Sonic 2 "VS Modes", Lemmings 2) */ + if (count_m68k <= line_m68k + 84) temp |= 0x4; + + /* clear pending flag */ + pending = 0; + + /* clear SPR/SCOL flags */ + status &= 0xFF9F; + + return (temp); } - -uint16 vdp_data_r (void) +void vdp_data_w(unsigned int data) { - uint16 temp = 0; + /* Clear pending flag */ + pending = 0; - /* Clear pending flag */ - pending = 0; + if (dmafill) + { + dma_fill(data); + return; + } + + /* VDP latency (Chaos Engine, Soldiers of Fortune) */ + if (vdptiming && !(status&8) && (reg[1]&0x40)) + { + fifo_update(); + if (fifo_write_cnt == 0) + { + fifo_lastwrite = count_m68k; /* reset cycle counter */ + status &= 0xFDFF; /* FIFO is not empty anymore */ + } - switch (code & 0x0F) - { - case 0x00: /* VRAM */ - temp = *(uint16 *) & vram[(addr & 0xFFFE)]; - break; - - case 0x08: /* CRAM */ - temp = *(uint16 *) & cram[(addr & 0x7E)]; - temp = UNPACK_CRAM (temp); - break; - - case 0x04: /* VSRAM */ - temp = *(uint16 *) & vsram[(addr & 0x7E)]; - break; + /* increase write counter */ + fifo_write_cnt ++; + + /* is FIFO full ? */ + if (fifo_write_cnt >= 4) + { + status |= 0x100; + if (fifo_write_cnt > 4) count_m68k = fifo_lastwrite + fifo_latency; } + } - /* Bump address register */ + /* write data */ + data_write(data); +} + +unsigned int vdp_data_r(void) +{ + uint16 temp = 0; + + /* Clear pending flag */ + pending = 0; + + switch (code & 0x0F) + { + case 0x00: /* VRAM */ + temp = *(uint16 *) & vram[(addr & 0xFFFE)]; + break; + + case 0x08: /* CRAM */ + temp = *(uint16 *) & cram[(addr & 0x7E)]; + temp = UNPACK_CRAM (temp); + break; + + case 0x04: /* VSRAM */ + temp = *(uint16 *) & vsram[(addr & 0x7E)]; + break; + } + + /* Increment address register */ addr += reg[15]; - /* return data */ - return (temp); + /* return data */ + return (temp); } @@ -464,138 +711,170 @@ uint16 vdp_data_r (void) The reg[] array is updated at the *end* of this function, so the new register data can be compared with the previous data. */ -void vdp_reg_w (uint8 r, uint8 d) +void vdp_reg_w(unsigned int r, unsigned int d) { - switch (r) - { - case 0x00: /* CTRL #1 */ - /* update IRQ level */ - if (!vint_pending && !(d & 0x10)) m68k_set_irq(0); - - /* latch HVC */ - if (!(d & 0x02)) hc_latch = -1; - break; + /* Check if Mode 4 (SMS mode) has been activated + According to official doc, VDP registers #11 to #23 can not be written unless bit2 in register #1 is set + Fix Captain Planet & Avengers (Alt version), Bass Master Classic Pro Edition (they incidentally activate Mode 4) + */ + if (!(reg[1] & 4) && (r > 10)) return; - case 0x01: /* CTRL #2 */ - /* update IRQ level */ - if (!hint_pending && !(d & 0x20)) m68k_set_irq(0); - - /* Change the frame timing */ - frame_end = (d & 8) ? 0xF0 : 0xE0; + switch(r) + { + case 0x00: /* CTRL #1 */ + if ((d&0x10) != (reg[0]&0x10)) hvint_updated = 0; + break; + + case 0x01: /* CTRL #2 */ + /* Sesame Street Counting Cafe need to execute one instruction */ + if ((d&0x20) != (reg[1]&0x20)) hvint_updated = 1; /* Check if the viewport height has actually been changed */ - if ((reg[1] & 8) != (d & 8)) - { - /* Update the height of the viewport */ - bitmap.viewport.oh = bitmap.viewport.h; - bitmap.viewport.h = (d & 8) ? 240 : 224; - bitmap.viewport.changed = 1; - } - break; + if((reg[1] & 8) != (d & 8)) + { + /* Update the height of the viewport */ + bitmap.viewport.oh = bitmap.viewport.h; + bitmap.viewport.h = (d & 8) ? 240 : 224; + if (config.overscan) bitmap.viewport.y = ((vdp_pal ? 288 : 240) - bitmap.viewport.h) / 2; + bitmap.viewport.changed = 1; - case 0x02: /* NTAB */ + /* update VC table */ + if (vdp_pal) vctab = (d & 8) ? vc_pal_240 : vc_pal_224; + } + + /* DISPLAY switched ON/OFF during HBLANK */ + if ((v_counter < bitmap.viewport.h) && ((d&0x40) != (reg[1]&0x40))) + { + if (count_m68k <= (line_m68k + 128)) + { + /* Redraw the current line : + - Legend of Galahad, Lemmings 2, Nigel Mansell's World Championship Racing (set display OFF) + - Deadly Moves aka Power Athlete (set display ON) + */ + reg[1] = d; + render_line(v_counter,odd_frame); + } + } + break; + + case 0x02: /* NTAB */ ntab = (d << 10) & 0xE000; break; - case 0x03: /* NTWB */ - ntwb = (d << 10) & ((reg[12] & 1) ? 0xF000 : 0xF800); + case 0x03: /* NTWB */ + ntwb = (d << 10) & 0xF800; + if(reg[12] & 1) ntwb &= 0xF000; break; - case 0x04: /* NTBB */ + case 0x04: /* NTBB */ ntbb = (d << 13) & 0xE000; break; - case 0x05: /* SATB */ + case 0x05: /* SATB */ sat_base_mask = (reg[12] & 1) ? 0xFC00 : 0xFE00; sat_addr_mask = (reg[12] & 1) ? 0x03FF : 0x01FF; satb = (d << 9) & sat_base_mask; break; - case 0x07: - d &= 0x3F; - + case 0x07: /* Border Color index */ /* Check if the border color has actually changed */ - if (border != d) - { - /* Mark the border color as modified */ - border = d; - color_update (0x00, *(uint16 *) & cram[(border << 1)]); - } + d &= 0x3F; + if(border != d) + { + /* Mark the border color as modified */ + border = d; + color_update(0x00, *(uint16 *)&cram[(border << 1)]); + + /* background color modified during HBLANK */ + if ((v_counter < bitmap.viewport.h) && (count_m68k <= (line_m68k + 84))) + { + /* remap current line (see Road Rash I,II,III) */ + reg[7] = d; + remap_buffer(v_counter,bitmap.viewport.w + 2*bitmap.viewport.x); + } + } break; - case 0x0C: - /* Check if the viewport width has actually been changed */ - if ((reg[0x0C] & 1) != (d & 1)) - { - /* Update the width of the viewport */ - bitmap.viewport.ow = bitmap.viewport.w; - bitmap.viewport.w = (d & 1) ? 320 : 256; - bitmap.viewport.changed = 1; - } + case 0x0C: + /* Check if the viewport width has actually been changed */ + if((reg[0x0C] & 1) != (d & 1)) + { + /* Update the width of the viewport */ + bitmap.viewport.ow = bitmap.viewport.w; + bitmap.viewport.w = (d & 1) ? 320 : 256; + if (config.overscan) bitmap.viewport.x = (d & 1) ? 16 : 12; + bitmap.viewport.changed = 1; + + /* update HC table */ + hctab = (d & 1) ? cycle2hc40 : cycle2hc32; + } - /* See if the S/TE mode bit has changed */ - if ((reg[0x0C] & 8) != (d & 8)) - { - int i; - reg[0x0C] = d; + /* See if the S/TE mode bit has changed */ + if((reg[0x0C] & 8) != (d & 8)) + { + int i; + + /* The following color update check this value */ + reg[0x0C] = d; - /* Update colors */ - for (i = 0; i < 0x40; i += 1) color_update (i, *(uint16 *) & cram[i << 1]); - color_update (0x00, *(uint16 *) & cram[border << 1]); - } + /* Update colors */ + for (i = 0; i < 0x40; i += 1) color_update (i, *(uint16 *) & cram[i << 1]); + color_update (0x00, *(uint16 *) & cram[border << 1]); + } - /* Check interlace mode 2 setting */ - im2_flag = ((d & 0x06) == 0x06) ? 1 : 0; + /* The following register updates check this value */ + reg[0x0C] = d; - /* The following register updates check this value */ - reg[0x0C] = d; + /* Update display-dependant registers */ + vdp_reg_w(0x03, reg[0x03]); + vdp_reg_w(0x05, reg[0x05]); + break; - /* Update display-dependant registers */ - vdp_reg_w (0x03, reg[0x03]); - vdp_reg_w (0x05, reg[0x05]); - break; + case 0x0D: /* HSCB */ + hscb = (d << 10) & 0xFC00; + break; - case 0x0D: /* HSCB */ - hscb = (d << 10) & 0xFC00; - break; + case 0x10: /* Playfield size */ + playfield_shift = shift_table[(d & 3)]; + playfield_col_mask = col_mask_table[(d & 3)]; + playfield_row_mask = row_mask_table[(d >> 4) & 3]; + y_mask = y_mask_table[(d & 3)]; + break; + } - case 0x10: /* Playfield size */ - playfield_shift = shift_table[(d & 3)]; - playfield_col_mask = col_mask_table[(d & 3)]; - playfield_row_mask = row_mask_table[(d >> 4) & 3]; - y_mask = y_mask_table[(d & 3)]; - break; - } - - /* Write new register value */ - reg[r] = d; + /* Write new register value */ + reg[r] = d; } -uint16 vdp_hvc_r (void) +unsigned int vdp_hvc_r(void) { - int cycles = (count_m68k + m68k_cycles_run ()) % misc68Kcycles; - uint8 *hctab = (reg[12] & 1) ? cycle2hc40 : cycle2hc32; - uint16 *vctab = (vdp_pal) ? vc_pal_224 : vc_ntsc_224; - if ((reg[1] & 8) && vdp_pal) vctab = vc_pal_240; - - uint8 hc = (hc_latch == -1) ? hctab[cycles] : (hc_latch&0xFF); + uint8 hc = (hc_latch == -1) ? hctab[count_m68k%488] : (hc_latch & 0xFF); + uint8 vc = vctab[v_counter]; - uint16 vc = vctab[v_counter]; - - /* interlace mode 2 */ - if (im2_flag) vc = (vc & 0xFE) | ((vc >> 8) & 0x01); + /* interlace mode 2 */ + if (im2_flag) vc = (vc << 1) | ((vc >> 7) & 1); - return (((vc << 8)&0xFF00) | hc); + return ((vc << 8) | hc); } -void vdp_test_w (uint16 value) -{} - -int vdp_int_ack_callback (int int_level) +void vdp_test_w(unsigned int value) { - if (vint_pending) vint_pending = 0; +#ifdef LOGERROR + error("Unused VDP Write 0x%x (%08x)", value, m68k_get_reg (NULL, M68K_REG_PC)); +#endif +} + +int vdp_int_ack_callback(int int_level) +{ + if (vint_triggered) + { + vint_pending = 0; + vint_triggered = 0; + status &= ~0x0080; /* clear VINT flag */ + } else hint_pending = 0; - return M68K_INT_ACK_AUTOVECTOR; + hvint_updated = 0; + return M68K_INT_ACK_AUTOVECTOR; } diff --git a/source/vdp.h b/source/vdp.h index 7bf6c64..c7c9722 100644 --- a/source/vdp.h +++ b/source/vdp.h @@ -1,62 +1,93 @@ - -#ifndef _VDP_H_ -#define _VDP_H_ - -/* Global variables */ -extern uint8 sat[0x400]; -extern uint8 vram[0x10000]; -extern uint8 cram[0x80]; -extern uint8 vsram[0x80]; -extern uint8 reg[0x20]; -extern uint16 addr; -extern uint16 addr_latch; -extern uint8 code; -extern uint8 pending; -extern uint16 status; -extern uint16 ntab; -extern uint16 ntbb; -extern uint16 ntwb; -extern uint16 satb; -extern uint16 hscb; -extern uint16 sat_base_mask; -extern uint16 sat_addr_mask; -extern uint8 border; -extern uint8 bg_name_dirty[0x800]; -extern uint16 bg_name_list[0x800]; -extern uint16 bg_list_index; -extern uint8 bg_pattern_cache[0x80000]; -extern uint8 playfield_shift; -extern uint8 playfield_col_mask; -extern uint16 playfield_row_mask; -extern uint32 y_mask; -extern uint8 hint_pending; -extern uint8 vint_pending; -extern int16 h_counter; -extern int16 hc_latch; -extern uint16 v_counter; -extern uint8 im2_flag; -extern uint16 frame_end; -extern uint8 dmafill; -extern uint8 vdp_pal; -extern uint8 vdp_rate; -extern uint32 dma_endCycles; -extern void (*color_update)(int index, uint16 data); - - -/* Function prototypes */ -void vdp_init(void); -void vdp_reset(void); -void vdp_shutdown(void); -void vdp_ctrl_w(uint16 data); -uint16 vdp_ctrl_r(void); -void vdp_data_w(uint16 data); -uint16 vdp_data_r(void); -void vdp_reg_w(uint8 r, uint8 d); -uint16 vdp_hvc_r(void); -void dma_copy(void); -void dma_vbus(void); -void dma_update(int type, int length); -void dma_fill(uint16 data); -void vdp_test_w(uint16 value); - -#endif /* _VDP_H_ */ +/*************************************************************************************** + * Genesis Plus 1.2a + * Video Display Processor (memory handlers) + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) + * modified by Eke-Eke (compatibility fixes & additional code), GC/Wii port + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +#ifndef _VDP_H_ +#define _VDP_H_ + +/* VDP context */ +extern uint8 sat[0x400]; +extern uint8 vram[0x10000]; +extern uint8 cram[0x80]; +extern uint8 vsram[0x80]; +extern uint8 reg[0x20]; +extern uint16 addr; +extern uint16 addr_latch; +extern uint8 code; +extern uint8 pending; +extern uint16 status; +extern uint8 dmafill; +extern uint8 hint_pending; +extern uint8 vint_pending; +extern uint8 vint_triggered; +extern int8 hvint_updated; + +/* Global variables */ +extern uint16 ntab; +extern uint16 ntbb; +extern uint16 ntwb; +extern uint16 satb; +extern uint16 hscb; +extern uint8 border; +extern uint8 bg_name_dirty[0x800]; +extern uint16 bg_name_list[0x800]; +extern uint16 bg_list_index; +extern uint8 bg_pattern_cache[0x80000]; +extern uint8 playfield_shift; +extern uint8 playfield_col_mask; +extern uint16 playfield_row_mask; +extern uint32 y_mask; +extern int16 h_counter; +extern int16 hc_latch; +extern uint16 v_counter; +extern uint8 im2_flag; +extern uint32 dma_length; +extern int32 fifo_write_cnt; +extern uint32 fifo_lastwrite; +extern uint8 fifo_latency; +extern uint8 vdp_pal; +extern double vdp_timings[4][4]; + +extern uint8 *vctab; +extern uint8 *hctab; +extern uint8 vc_ntsc_224[262]; +extern uint8 vc_pal_224[313]; +extern uint8 vc_pal_240[313]; +extern uint8 cycle2hc32[488]; +extern uint8 cycle2hc40[488]; + +/* Function prototypes */ +extern void vdp_init(void); +extern void vdp_reset(void); +extern void vdp_shutdown(void); +extern void vdp_restore(uint8 *vdp_regs); +extern void vdp_ctrl_w(unsigned int data); +extern unsigned int vdp_ctrl_r(void); +extern void vdp_data_w(unsigned int data); +extern unsigned int vdp_data_r(void); +extern unsigned int vdp_hvc_r(void); +extern void vdp_reg_w(unsigned int r, unsigned int d); +extern void dma_update(); +extern void vdp_test_w(unsigned int value); + + +#endif /* _VDP_H_ */