From 86e8d3d21598a05ef5a3d1aa320cee35be3dc2ef Mon Sep 17 00:00:00 2001 From: Paul XPS Date: Fri, 9 Nov 2018 21:52:33 -0600 Subject: [PATCH] Big old first major commit since publicly releasing.. I made a commit earlier this week but messed things up by not pulling from the master and things weren't updated... Here's the notes from that commit: Author: Paul XPS Date: Tue Nov 6 22:45:52 2018 -0600 Large commit biggest feature add is NES MMC3 support including Save RAM (aka WRAM/PRGRAM) support including dumping and writing save files. The MMC3 script & method of dumping/flashing is the most forward thinking script/firmware so far. Finally starting to form a clear vision of how I want to handle flashing/dumping variations with mappers. Biggest thing is having the host handle the mapper init & banking control. In the view of the firmware, it's only responsible for knowing how to flash a bank. And dumping is even more generic with the host just telling what address range to read. Things will get more complex with support of mappers with bus conflicts. But ready to start converting these old hacked methods to be more like the MMC3 means. Have some early support for dumping gameboy using the snes script as the pinouts are nearly identical. Along with testing of toggling between 3v GBA and 5v DMG. Have some early support for INLretro NES only version which uses a smaller mcu because it doesn't need to support large 16bit carts. Still have to get this completed. Added support for CNROM, but I'm not sure if it's actually working. Going to restart with NROM and start updating the currently supported mappers to be more like MMC3. But this also includes some new updates from the second half of the week: Started updating existing NES scripts to use new MMC3 methodology. Got NROM, CNROM, BNROM, & Color Dreams working. On the host side only needed to add nes.c functions for specific flash algos. Able to delete significant amounts of mapper specific code from flash.c Got some basic SNES script support with new methodology for Catskull elect 5v PLCC SNES LoROM board. And INL SNES HI/LO-ROM 3v board as well. These don't yet use buffer writes, just single byte writes. Also having issues with Mirroring test/sensing again. Driving me crazy, but don't really care about it at the moment and not sure what's wrong.. So just committing that broken for now. Looking to remove this functionality from the firmware side as the host should be controlling most of this. Looking to add SNES RAM & buffered writes. Also need to test some of the HIROM code as I just added it in there while I did the LOROM stuff.. --- firmware/Make_stm_nes | 107 ++ firmware/Makefile | 2 + firmware/build_avr/avr_kazzo.elf | Bin 28636 -> 30440 bytes firmware/build_avr/avr_kazzo.hex | 1470 ++++++++-------- firmware/build_stm/inlretro_stm.bin | Bin 19628 -> 20444 bytes firmware/build_stm/inlretro_stm.elf | Bin 200084 -> 203936 bytes firmware/build_stm/inlretro_stm.hex | 2455 ++++++++++++++------------- firmware/build_stm/inlretro_stm.map | 1320 +++++++------- firmware/source/dump.c | 131 +- firmware/source/flash.c | 321 ++-- firmware/source/flash.h | 1 + firmware/source/io.c | 156 +- firmware/source/io.h | 3 + firmware/source/nes.c | 298 +++- firmware/source/nes.h | 12 +- firmware/source/pinport.h | 12 +- firmware/source/pinport_al.h | 195 ++- firmware/source/snes.c | 72 + firmware/source/snes.h | 2 + firmware/source/types.h | 8 +- host/scripts/app/ciccom.lua | 6 + host/scripts/app/dump.lua | 31 +- host/scripts/app/flash.lua | 14 +- host/scripts/inlretro.lua | 81 +- host/scripts/nes/bnrom.lua | 176 +- host/scripts/nes/cdream.lua | 501 +++++- host/scripts/nes/cnrom.lua | 504 ++++++ host/scripts/nes/mmc1.lua | 8 +- host/scripts/nes/mmc3.lua | 705 ++++++++ host/scripts/nes/nrom.lua | 329 +++- host/scripts/snes/lorom_5volt.lua | 347 ++++ host/scripts/snes/v2proto.lua | 357 ++++ host/scripts/snes/v3.lua | 11 +- shared/shared_dict_buffer.h | 20 + shared/shared_dict_io.h | 9 +- shared/shared_dict_nes.h | 27 +- shared/shared_dict_snes.h | 3 + shared/shared_errors.h | 1 + 38 files changed, 6734 insertions(+), 2961 deletions(-) create mode 100644 firmware/Make_stm_nes create mode 100644 host/scripts/nes/cnrom.lua create mode 100644 host/scripts/nes/mmc3.lua create mode 100644 host/scripts/snes/lorom_5volt.lua create mode 100644 host/scripts/snes/v2proto.lua diff --git a/firmware/Make_stm_nes b/firmware/Make_stm_nes new file mode 100644 index 0000000..c99794d --- /dev/null +++ b/firmware/Make_stm_nes @@ -0,0 +1,107 @@ + +#Build directory +BUILD = build_stm + +#project name +#doesn't need to be associated with any file names +PROJ = inlretro_stm + + +# Selecting Core +CORTEX_M=0 + +# Use newlib-nano. To disable it, specify USE_NANO= +#USE_NANO=--specs=nano.specs +USE_NANO= + +# Use seimhosting or not +USE_SEMIHOST=--specs=rdimon.specs +USE_NOHOST=--specs=nosys.specs + +CORE=CM$(CORTEX_M) +BASE=. + +# Compiler & Linker +CC=arm-none-eabi-gcc +CXX=arm-none-eabi-g++ +OBJCOPY=arm-none-eabi-objcopy +SIZE=arm-none-eabi-size + +# Options for specific architecture +ARCH_FLAGS=-mthumb -mcpu=cortex-m$(CORTEX_M) + +# Startup code +STARTUP=$(BASE)/include_stm/startup_ARM$(CORE).S + +# -Os -flto -ffunction-sections -fdata-sections to compile for code size +CFLAGS=$(ARCH_FLAGS) $(STARTUP_DEFS) -Os -flto -ffunction-sections -fdata-sections -g +CXXFLAGS=$(CFLAGS) + +# Link for code size +GC=-Wl,--gc-sections + +# Create map file +MAP=-Wl,-Map=$(BUILD)/$(PROJ).map + +STARTUP_DEFS=-D__STARTUP_CLEAR_BSS -D__START=main -D__NO_SYSTEM_INIT + +LDSCRIPTS=-L. -L$(BASE)/include_stm -T nokeep.ld +LFLAGS=$(USE_NANO) $(USE_NOHOST) $(LDSCRIPTS) $(GC) $(MAP) + +DEFINE+=\ + -DSTM32F070x6 \ + -DF_CPU=8000000 \ + -DSTM_CORE \ + -DSTM_NES #stm32 with NES connector only v2.0N (070C6T6) +# -DSTM_ADAPTER #stm32 to kazzo adapter board +# -DSTM_INL6 #inlretro 6connector +# -DSTM32F072x8 \ #64KB version of all packages (LQFP-48,64,100) +# -DSTM32F070xB \ #128KB version of both packages (LQFP-48,64) +# -DSTM32F070x6 \ #32KB version of both packages (TSSOP-20,LQFP-48) +# -DF_CPU=8000000 +INCLUDE=-I ./include_stm +CFLAGS+= $(DEFINE) $(INCLUDE) + +#SOURCES=$(wildcard source/**/*.c source/*.c) +SOURCES=$(wildcard source/*.c source_stm_only/*.c) +OBJECTS=$(patsubst %.c,%.o,$(SOURCES)) + +ASM_SRC=$(wildcard source/asm_stm/*.s) + +#all: dir shared $(BUILD)/$(PROJ).axf $(BUILD)/$(PROJ).elf $(BUILD)/$(PROJ).hex $(BUILD)/$(PROJ).bin size +all: dir shared $(BUILD)/$(PROJ).elf $(BUILD)/$(PROJ).hex $(BUILD)/$(PROJ).bin size + +#build axf file output (basically elf with DWARF debug info) +# $@ is shortcut for the target, $^ is shortcut for prereqs +# TARGET: PREREQS +$(BUILD)/$(PROJ).axf: $(STARTUP) $(OBJECTS) + $(CC) $^ $(ASM_SRC) $(CFLAGS) $(LFLAGS) -o $@ + +$(BUILD)/$(PROJ).elf: $(STARTUP) $(OBJECTS) + $(CC) $^ $(ASM_SRC) $(CFLAGS) $(LFLAGS) -o $@ + +$(BUILD)/$(PROJ).hex: $(BUILD)/$(PROJ).elf + $(OBJCOPY) -O ihex $^ $@ + +$(BUILD)/$(PROJ).bin: $(BUILD)/$(PROJ).elf + $(OBJCOPY) -O binary $^ $@ + +dir: + mkdir -p $(BUILD) + +#copy shared .h files which are used in host and firmware +shared: + cp -r ../shared/* source/ + +size: $(BUILD)/$(PROJ).elf + $(SIZE) -t $^ + +program: all + ST-LINK_CLI.exe -c -P $(BUILD)\$(PROJ).hex 0x08000000 -Rst + +disassm: all + arm-none-eabi-objdump $(BUILD)\$(PROJ).elf -d -g + +clean: + rm -rf $(BUILD) + rm -f $(OBJECTS) diff --git a/firmware/Makefile b/firmware/Makefile index d3133a1..26ef1ef 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -15,3 +15,5 @@ stm6p: make -f Make_stm_inl6p clean program stmad: make -f Make_stm_adapter clean program +stmn: + make -f Make_stm_nes clean program diff --git a/firmware/build_avr/avr_kazzo.elf b/firmware/build_avr/avr_kazzo.elf index df2677d815c6b2394c5a13eb5f2ea9c6a3b5980c..52cbc366b15f893f5eaa72f61606c5103a9d7785 100644 GIT binary patch delta 9713 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 Kx#%{c*Z%@wcv*h{ delta 8026 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 E0Jd6l$^ZZW diff --git a/firmware/build_stm/inlretro_stm.elf b/firmware/build_stm/inlretro_stm.elf index 0666535ac86fa499b88c685625d0616c90a8f53a..cba581de66a49d07bee0357ad252b36241c52e51 100644 GIT binary patch literal 203936 zcmeFZ3w%>W`aeA9Owy(;(6j~Yy(c*>v<jNtnO|CvKFdqRV2Ias#$NXZE61BIZ0d4-}U{xpZEQ} zpLc@iJTuSCJoC(VW}bOw=G5(T%gllxkfEPQ(g};bL5OBDXn7nZL?r6TL?RSvC&jfv?F$!D*p{gap$S!e1N# zjsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W z;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd5 z0geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;1 z5#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC4 z90861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$ zz!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A z0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1 zBft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8 zI0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDi zfFtn#ECR7adV>(nMfT(n&3{%o%QKX&c{}L4hq6sSvw}e|;(8uWIUeeEw>cDKbe2>TOU#2|DD zzTXVQG`whuH#+4Qlh6|56k6jOoN|H?V|>mccm&_g18t?xl||T}D-jAJY;yf}T@ty+ z^sCb23r0IWX%L){@3c)QFvd8ZwoD-796O5z5AnS@=$DU{{lO(Wj#_PwM4PzZQ7=pz zlP;VUd>{0yd=m#E$wl>aO=Q^N@G}t|5gWqBhu<9jaJV__>absgT_4s~|9r#U`ndGe zPN)79QTZYV;z=r*CrlK-7Vo83s7|ZCR`si>Izl~GouoFX3)C~zCUuE=g}PSVq&}*C zUHyUhnb;=pwk)TMY9dTaDv4h2AimncaR%Wm@%`#zEOE+Rko;-?cp{T*@|5~2GKX9Z zx`Nb@I^sm=DfK<1g*-uA8>n&FaE)E6K#dOtQ?40KSuO-p z_IOqD)uoqf;tb}t4Cn4r2Xfa1Q|6AOh=G*V!IW9UDa%P9Wtox^WuIOm7^7?+dw{zj zn19M}{;r@#vx6z=BPqdFOb(`G45us)>NU|T$jLuxMUq!5OF!Yo05^vF6(yo^1bGd{ zI$1%C_eB!Y7eb_F%!3jeF+L31i}+)pKY|Y6nS{APw4%}P|JsjVKO;m%N)UdXMg4;c zSBW9?H5o-p0;A~Ofmn>7H~PjC9hpS-s;(r(WIkv)sU{mpJwkg`JITG|0C}7oCohxV zl0T6~xl0{q_W-##+c~>vJcn`e+=WJ2&~>Tf?R!k|;O;Ro?vvoEe#UJDSNk(=Be=$& zad&~sYWwwNwQUV@U6*k;UQp?dTQApORWRqV%W_r(xldfiy*kK!^fK<8Aot*9+^d4z z=F7O*LGIqmxN?wt?`7QB3xaOvPqZC#L95&K6P_wq`j*Q||M>Yh13CNLXRP-={c$`= zArr}QnnSK6vp`G8B2rE&5jsxS!V+vHJIUST0dkNW!Tfj1r_@o(ypKU2z5jWmUQjp@ zCKi7Wan&X9-y*KPB>pPm#!KQaARds&<~5V>^e~6bXU2K#bCq0TiNY*nvDV>qHiH>w z{|E;&mvMFvbJ&b!9Ovh3mPFX&VV#J6%WyiIp)B1o!U^iJW|+ffB+GN%=Yl+8SdU+P zu9Y)~V+${nU;6nydX0g&=R(FQ^&E^rtsBb-y>e&RRJ(JSGosPvVcw}>E!X!8`YSHcX=T4kKlYONil5cBq@T$5=&K$6o(26* zIo#4E20SjcMN=AMXP%PB9%2pn2>zbJezvxT%yd#gr?ZxX zpcnXorSp>VKlGipyl)-yU;I5^_5Io6xum`eeeYV{yCnZ#`+jd>o}|C$Y@btpYgp=Q zmfr?*F?$zfe-kZW7SrGJcHgfpCxSJwzU{QXQYx6v+M?_)V?~Ox#oK>V8g7hN@*eN& z)jKCXJ-=D3sW~NRjkClGak_E0T5H-pT4QR|*(2LOKCu}hk}|tIILM!pI^7D z9q{XN#cd(iR{%q8)XMuR1HG(*SJPA(;A-Ti%6*ki8LO|d zYB}ZVk}h#}&GqvmOxKp0DkJO$V}$KJ`wDBK={?&h`y}Hi#AJBlPI*pE0+mhWWv0qB z`!B2plWZe$b!A8D+?w;^B-5PAQTAmel1XDbERD4rsbtdHN@{*lCK*dA7uEb5+P0{2 zakm;eySmA#Yd#4@=wIDVyq%vsD9`N{d|P^nJR9_;Ue?R;_UUDr@Z_BOLzQv%#WY+A zt8}MGOI5s`#YBBeWvqQnzKF0k$)|IjI0(54uZY_S3>ePG1NODZQ>VjOGD25a>0cxOSqO~1@VGK4PTTX`|YINnoR zACejAscnb~7c=Awae&Snk5k9u!CkN&*o6p#FmMq2Z7=DB-TuKC@_4|(>gAe`n*RLxaf*5}P@Kfwl z{XY`IeDK5Y$3rYcddMsCaX}eWpr=|#u2y3NNr?sCH1XGmFsoPgo?j^pv zhxIT@Kh>iN$g{i}-OzXyF-99JpSf_#C1&c}M5dX27A6{X&a^J| z8pi>Q?+pSQ`yJ-0lEj*L`zWJ`5ggd*`1EAbRi1e4dKhP%=_6Zw&Hd*18rA*|yw!L! z8lq4Z3Jr!j%t??GD5W)a+N#ZZ5>Y(XqiUTFs`aQ_#r%lkQJx4Aa)9Q?6^D9452!$? zN1dNkOgx@^i?zj(b)mifU-fMb;aTPG@tx`{t2+$#r`S!hrn$we*=|+VT=(I$$=#t@ z3)}^#HF$?*{eTmY>cMPfuGe>mb&kq1y9-ZCS(DwmtiO4tT4SA3_Z_eU2a$F==>F~< zSs!}X$|L$l_ukjN3%sW8JF`xCMDQ}L2@OXa3E`hP)UXv1gK3V83xe;nizMwwui*Qm zzYp*0F81KP)Bl~9=mlSu-{(!T#yYiqS2iCfV?H+E5#ae&IoKZZ z&G{MFv7WVO7|&vEh-oLufvT3uLzO4y+bdbW5!ZoAl1|RGRI%95KkROF?bcK3lO&;L zUzMOs2;WzE#BnF~_SFu-mwfTC!x;?c`+Jqp)7FIgFTHK(splJx=~Xx}8tl>gsjsh( zPKZy|6Tj}!;7au9zq=A08eWM8dqVuNMDQ5~dcBO^H}IW8YX*E?K_5%1pn+-Nu;cGu zS3Sv0!fa);^tdcLuKS#E#wwg1cbojZl4Fz-|JwbW{G}3CDRHmcC4a7H{#3yc2a!Ma zw%31C|6D^9dcL(g6eDaMMpz_9*sbmzX=<+y{9WC8yc@csv%bf;&`Q;g-Q7Z32H9xY zcy)CB4EsLgfvO6-R@!5#unE4UgBiqboo-L4S4})%j3E0e7ui)0VE)FLSfp5#nuVgFvd_Ad(pjH)9=VV~iY=x~$_;5eaIw%b!yaA#fbmde1?Ks+wtFrJ z@|BiqM|AzP(kA0nORFo|P9)Jc@yCluAwWRzu)?) zUv*>rmd9>fzU8wUL*z4F<$MV19Gh!wjts41Lvu|O^4X1ZySHbOvpc&TnJZ4&GN-yLGmY-WnSVjKga*Cih(pXz2(NN{=E&>z z%X>?gTqERbGy6SvSneu4?Pzk`VR_fVsG#5LaF)L7*z3T_4Q7h$i0gL26FFNOU)SSh zp=EU~b>AqVvvu*CFv}V$Hhtk`Ifa61$MX%FET>l-acr_C+WbBDVAm1g-)K#+ch!Fb zdl_iOIkX~v8(Ogqt=Lv|wze{#HFP zjB#T$HZ~j7o`3s

?>S@g*=t2Q^*;g?n271mf=qx_a*V}aN-_mfabYozJpI;rn? z?|3mb+G2HPK7abI%;>X@{8O&b%x629F5lF*)Vdntolkn_0P%MDPOr)Oh1Y2PoAly$oFUIf$tgD(PF8y$~;#Pijr#Q z3pu34LG;t+pL2W}S5ezi8}B>^^eTYcIUrWC=~|n?x-7QZycd0N+O@Oz$J0!cRbC7)vcNrdC&kljusUao{I3#GB04c%#``VH8^TyW*X5 zt>^ArtPVZn)R`<%*!Q2itJuo!KEm33C!*_(nO}Kkq3tB|3(ri8wqd5F!xd$pzjcBA zoa>sn^RC9?*iOsV9kG_$t1L0~3Gt}ifx8q>bHTd~<}qi$V=nlK$NaW8*U}OjT`v^m zFYWR&of1M`IU}?hpmU7TsgD+8l-rkd*eWMv`FrN~jfHe#IO=xlB200mXpbD@c+|_r zYbVaup1y!xjr}c0gq`S?)ppf4f_LME8?l1ja3R|2YDlmzvxhre4a@A&;TFtjF~6d= z^1?yjx)A5!_ucFFJDq;Ni16$1w{vp|3Bh@J86GL05Oy{mf;83_tWTIv&d$#x@ALcF z`MIy%Xx-bU*%wzo%Nn*np{HOr79-s+lF698Ax#BJyvZe!(55_a4w~^s4kD}e#}lDhN)Pdfht$nU zv(?2j-L(0oN)33C9)^2z$j&naz$u!p( zL=QZbypyigX7Y$I{gmsq%Gat$rq}aCRnLj2^wT3XRQ}QXMAdmO({o72A)T1sJ?*2( zc;cT(MCvNrDl}zo{mk`Pv3P1-E$#|WNMx;jn$fdDXcZ>Mnw+k-d5^o`g=U0$BCT3W zb8)P@u{g{VOG3M8Mu;ce8c`YnZiGie9P?Be1D+6T2;ypYNNHp7cW$+%q4Ohux0)=>wktXTl*RI+IBX&HHK@k>&PpkhByoB4)fS7H>Dq&s5}mWIv^1>GAgT5so^*Nd?E5#$t`NDtr;W9CB zr>N}HE;%bv_HWp?HR@lqM$&mJZ4_b|B=k7aLw!?Jp zu5dR~>%r28uxdJW4_d-Pa89B> zd*3M%j&epXfv;KC_r{9lJy?=ou=hsJ(1Ey0M*`CJI#*&luZ`F&b{tT7JKO>P; zCm)=B-gURNtKN^bi>B@ghE%D$t-G&IbWF3I%8X{VE=}F7BN)pU1zDK#rR#~}p3?*+ zrlIZ`_Hz!mT;M3E{|45a=*1ZYj;*ky=Nwb&-C2U0_|6S%UXY756RRp>rw3|b-TghS z7m1u}6B^!jsEDbyW9uJX+G%64*Cf7<0nyjlzld~_JYkA3nY^a@_x_E;*9bF}`>F12 zzm+4El8+A%K`_Z%AFDs(C#T9x#nI=^8qOu&|S^FHzrj17EZIcy>M^iAE7V#zH*I z-yk+(RN-O1#*pv9?(NAZq?^D$DMy&uQRXAEHG{1kL;hnf>@4#cYcBfH)~CN)AH34iID@|u&bT%*QRUMb`Y&8Oh~eSIo$FMj~1h3phW&>g6( zs%8B_+~d7Y34I|lY55tihYNzT%=y zPT62e5EESLrh=`srKy;l_I2M}`z^*&glCqN4r{75S0#`EaTPUs3P3+f>6f z+LanT{oii8cv*?+OG>1oL^4KMKwd$E+SD4>JXp5NLUTi|ql z+F|z3BJArm<&0wJeBxp@(L8}?G@fhm;FO&l+k?}>U4%fUo{d}L%eZ(<*A2bmq2I@# zKS0Aji7n&Y-oxN5fnE$9<2$qSwI5LjHa4W#lbNf||j85uTweBqb&QoVs zwRBzkZdp@tq-R^=$1d8cw+jWW7;!4O#iX}=iWBh9Y@&Rm>dgxyl0O|7k^JF+O4cKn z%yLy8ztABGipFpE9n-xC4d3YN2qN=p-%?#0I4^+{$n$*PVcoOf90y0G^!~9vb*qeh zqR>=l7nb;`xQp~qsP#rp~OEW#|N=Kbx&?22MB0E@h!4U$xamS(!_*SCA`qW65SV!d%FH{1k)4OW z@bu>>Gw+Z6DVTTZ#*rB}`qZXc%x;PJUhgM54O;X{Kjt;!zwR#$V!+zj)<1;6)BOPi z{@fox;NAX9$Ih7l5`j0pBM7{TwQ}hh%uU>&F+XwX1B8s8Of>ft5KSqbH}WxeF~5(6 zWA3U6P_pG((E1LSzh~T!KYo6xHJ%GT>_0G31Eb;~Mk3-N!xoz%>F?=mJtIQ&rBs^y)!9oJxA^XUD4CYTT zzk>N3L>37wVy23nGPs>`tjRI2%d{xD%N1_?)=S73Yow*TGSV6*#^Odc-d0hgkxsdy zOpW?wmFzCNv1;G&T}UHtuH)@$<=)OQ555qy&Fr2A^)ugpv{lfT<93gI@7GdwV7Oez z@J-54NL4~=aMKdr;cBUL%p0=tj&>CpO-7d-)A@Uz_b=5&l=yp&`w#0hpilcV&=`Nu zFa7NO2fvyyn}Kf={JUUh94Cg>fJ6EyOj>KFKuJc1_KBm(H{(;6vf&NH`}*%}Toi z9#v`V0qnKZ%6Fl;CzLby;JwxeW=;jOQ~0Wg01ZV3>KH;Q#OlpYBWN$ft~J=+hx|@uP4V~aS6cq|aLYS_EgzYyqpf2w9>!cU9)?DP6Qe+#g1}G&6u(-SDdL)W_Wd}V^xU{VoaH?VNdZFof?@szx1**WA+{IVLV0~F&5*QgGa<; z#>4gz?2PkuoLRE(eg`pUd)ftAOv|`h*gw6V>{FYXj4It>X~KdmRjVt*ly7J2;79!` zBBU32X4HpC2XT&ApL@iWZ_gn9T=)b^S`O0k?FWq+vElxn&n{k) z>U&X18}C_Xj)nC)b5T!b)MtafmE=)6;@Wtt~UPBP7??||O<_9LzgfIxgVDQTHM(Rr=HP4Nhd&bu$uV1<$v z#dO}{@7bp4%rqt~V@+ZDPh4TDC}2f=CCGOens%6nbS1KrIC1YlJj}|$pMrKNaEFr)@cor4u5*#O2nv|1D`z(R_hu6H0$d7du%=y%_Md?)Ec}>p8y)D}>^E`R~9A(F+`gz6V%3F5q`uYD;bm z+L8@HTT&CWC94!$vS-+q>>9EqOh!B*0U7ZNL|tx!sOa21a7=dv^ege_HV8UF;r(S` zsV)Y*nc#`KK)&||4(mpPH`zbhn%fXpZ^Wqv&W8p9>s*FX?}FiaOM~^YHVo;{?rkq^ zLu9ZG5y3Wu2HQXtS?R;FrlUq&||tK(C|z6nu|gI-k&N;x~ma7 z-!Eg&@edcl?(XU0v8UFVol-)5qpq%&&4)ACRS{)oxDjG|Nq^6~@GaSi{A_EnCC;vq z!cBf1^ESebhjn4>BoJTX{nX#^rv^NZsil*Q;W#A~T1iWysm}hm>%a=O_CE@lKmW&4 zUhWS?@Bj2)ot?C_uGm>T-u=^*fG_b#|4TUg|9P4)*!oH_Jw>GTwd|yx=p>;2eE%_BN=e(irONxT zE)ij&HOUf3nw7D01pYeP4U(pHc7okt8}rd%ng7@?HZpp$UsU#j>u`qsuuAySDx683R5w)7X$@7CIF-sXMuATx z9noI>?;%)NBjl%sPr9ZIU%*Z_3b|uV9j>y<=HkDd9r|vYPH(C7U1G<4?XgOoV^C+V z$yVu{&?x;tI@G1EJ1g;>;5k8edzF8}NZoAYjY8d5p{B6#jB6@UQyyxHLQR#Z>0hXc zedo-+Y!tBXy}Yg~P}dl=FeM|c)2Yid{k*0Bvzh|mqN5I1n0U@RWZRvruYx~c`#iJr zg^)x|A{nJk7tV~INV-)MNhpbQn*EYsyvClEm}EL=`hmvm3O{o>ruREzc0S+~y9KQ1 zxAzKHg}*;7k@#-u?Jx&YSnkc_Q}47yVH)u{dIMY)ax?uj*GmmyVlUn=u{=L1fb zveYd|;)J%ji``+m@q3bu10Gh#)sWC(egF?0F2zc0CalcY-x8;hbVP=jrX`A~ZyIt# zJCrMcZeN^<*>%5@Ntx8kw9ZY$H(Bxl;}~NCPRwU(uA5!@Up$*Nn$t#&U#Bsa7;zey ztLh#jiQQom=_Zo%)tAh;_ndZ7S;eWng3$MuljWL@SjRlvRfoiwe#Dsewg1Ar!2DP9 zTyuB(?dF|r`^_XH&23F?HIs=#({giv?1z!(W3A?u+Rw>#acpHj=NDR?<|D-s?sTHb zEt%u*@%Y_yv45MkaBkSCHHqiF3+JlO{<2tfS3}B2UNRw<(6+)?8_fsIkC~rlI;G>Q zgLJhUzCOO#aLf}+2E1ZPAD&+CCq|5^MG zfN#ip9`&n|!(~YiQ(|5_pw&49NBhgyTcUp6Lovy)O|@F7r0;7|@Sm znPpw)C+R*n@jWsan%?grQpS4tum1ETc4p#h|C1TBsr@Z`ep$2mi8(uKLdaO6$}{TK zM-P~Z@18;2&Oe*6K9{JP{5@tryUz(FVUtPDIQP@*w7PXGt!AA`Xu=810|g`>b$84o z=>?u?YMk3Ag_OynQbt`F;)l41` zn)31YEUX1giq_-P-}2OAoP7{q>7XVj1nprXjQYcHHG9Gvnj^TwCY}WPtVLV>YDoSy z*1Smre!p=&uxWpHU0++oO163%^{PCIbbJRVFE19GLb}CcI>K)Lz-lp8owC`%8Ps6Ec0?hb+=OaIDR=1J=mMq*^kOcdV z*d;cSIwFhiCrywi6P!wX=x4GVSo2P=dty$^O12}2I~tW_)Dxc_H+##AW1GfykJ7~+ z6_5FQK8F7ld$bKb9qkEejXfqlrO6eVn&+vAIz8MS2E@`^#iM~<2}7@Z>JCedMUN~R zlyC;YMwjD62i93%`(I(B=9+(DZZcDScY894A$!}XQD}O1{b-VylwjA~AKFB+S9=n~ z(58^5ud9o%6Iw-l{dGgPVMABwy!VNG)a){gO_~B~q)lmd{8^Rf%1@S3sA;r4p>m) z{$;mj@>ZoRzN*2U*WPZ`UT1LsteAG##vEu@_B0KK&bi#?vXW;UDN9*ES5q}+@(W3b$uN!SQFGZ-p0cu9`l zT`n&&o92WZd)b_pL?)>2SMN(9`>=|trc5A@%^i!?CFCK0&&?ODW&tzNXx@|<(ETg- zFU;yz)xj3?uZw?!nuPATX4OHaA?*BMNNal4x~gZYLZqeMNQJj~a7<8(hoHqoOC+?| z4=v_Gd#3F}(7M?CNEMM!SE&kOs^z35)vSg2T{vZEO7pUo*alF?q^)P~-RByRC zpD=0bAT8M&N|+9Fp+(VPdX<olh!444oU?nhf?-bhel0<}z1+WwaZkiG9R%M7d z?IfPv-J)b_8?w;U(Bm1a8aFBxS8-ayzdAK~YL71_Zg02rbS!B`zi0jU{JJj*Hg%K2 z+~>&`@riN8bMRNr3snUNi~Br!;$p4$#r{a7(_Z*61~VPIDjbNf*bz8(Ta_V_&#XmA4l<#9K;XtO}$#VE8#A$*6{IJt$uOwKJ$S& zA9|Zi)E4j=*7v%+syyi^tMeMvnc!t*@9;Ev}{d0$#yMD{|rWO<`vf)gfhP)UDShs2^C4 zG$JEa$2_s~{Y=Iqij0pu6kY}~wRIE|T=e;R8q{^s?1Z-Fncx zYL5DWHt)_E)HvGkCDu3fv!apJ9ME$uv^e7R%NBEj5Jz^HqGpHVPKt(#XYl_A5!hd2 z1@fS({~dY?U)3NjNc`gIxq|n(h5v`datz({FJPwU@PiZ}&T> z@4oJn=~!=J_x(NJ4Ekh|;x7P=#Y)Zf3fBvtfOxighmeF#bk})Bte;FL5p@ywI&Y*` z{WNK6H4pV9`-Ypzd}ok`tUa?mt*ubqnr=L7JZQGfQ8!K_p_6eggtTwpzg@qd+;6^f zx_`PB>FUD6;$W0#xNjRCKb)#B~@_yUvm=ub3sC>lQa6K=eT%2d(r`2nU~qPIgS zy+diqxXW5H1}#x3c@HUhL%hc>n9PUuiAG^^G}W8VDmAPcG?`(GO{ZMi{8(c&6>>$> z7Z=3T!LlcePd6H6&WZT{ID%(&SrgR3Bd3wZ&SCv!+3{;`91@)(kq=2i8%4 zPvzj7>rZcKC7J?vY=B36YMcyc+cCfVjD|?Wx2ada`v~|xoYO{T=A4Zn)YKX}*)yJu zB9v%nP6-pHWC?TQCfZYMYwXwCerbQi=Cx}le{9nh94h|S6DdDz(oWqKw>vJzNDc94 zlT(QNf(G9LkUy7yjTPz$Rw$bKq^TfDZ#)_MWh}whS44hq#XqkR3Yw7SJE0~&c;gAP z0}kjgilk)dJAVz2_^onc80+4HD~fnK$&7RhnGxiyaqNHrFJ0omGiY86PV-QV*bEQ;cL;J(z+9*Pqm4T&PMjrgwU zH6;?a;{@}F`rQT_J2RLZO7J}_@d>@!6XkkA60FAJc$;G$y!_lLQhM#G^{XoD zR%J-bQ6y(out?U_tg70|8>;P6?W)Z+bu}Arkn$%NTv>3{wPYPM5lI1i3;kn869GR& z@CY?GRIk5j<*MuJHftvlyM<+`< zy%MAm5`B7mVNMP$%FdxF*`fg9ABD5(K11Q3Radw1rrK(yw(B?Euzm{(#7Xt^6_vFc zR;;P6&H~N4VdD*}vKWY2Q?Jj@Vhz7>vO@Cm^QLCqTysM~KFdFnZ$+>fD>hVC+iPxE z^?#qhx-E4iJLfW#ZmO#STG`bM9fT1O331fi;MiEZDG;gI7@#+-stW|_ZmwYkkgsl- zx2AH#s;Z4!0_-(amBI8?Yl5L0rcMs9sy1%iw0>jd%0O)Grph%z{!Ob_uc{4%H#%0; zR&GL{2cp-nT(!FLruCby-?YU69qfb>f-YWJbHgS?REplL4R+Rsp*&2xO&bdGSLa@t zTR#6K z^m))fBL7Rbig|+O75aOGUk2}Yps#?w4f;Ch8=xJa9iVT3z7F~}=qsSV1AQ5?eh>N^ z#NPpZ3G{u?XFxvyeG2p(=#!uyfgSa1N3#o-voUP<=z540se16Uj=o8 zwjupA=(C`I0X+tK7W9`${}A+X(2qeMMfp!b9|k=SdJy^kej5YsL2&*7&I9256ZC#i zA7~@!zd-K;{RZ@2NcsVE58^$byHTzev;q7dLGJ?HwH?EhSZD)iFX&#-??LYc{f3m& zeV|{1-VgduQb->H{X6IZP%rX5ygfTd6GOYnCi>|1Li#aTO&xLV9I6wHDGTt7%!GE`^2{(#-Sp7w^!FMp|A-)640yLOQXWRus|+tLgGWnkLcZ zQqdxs^bB2DNE6HHszRDjPFEMw_;R|Ykj7=x8wzQ(CYo+6q*0n|>L{dI%{%nwLK>!# zXnmn(4&73yG0_)pMXkzzzlZWu3RNnM`$AX(5A1`A9^Wp}R$)`VJw;cf!;?q-M7r+t zwU6X|K>u)SBaMEBZp@|^M2zFxvh(S2+yBf`t5`qx`A<@0Hzh2ALT2CL6c(JlO7 z?IZciplSYsM8?j+zdV|pO;Zc$3W@3q>2=a9`{p8DZn8dS&itgDUj>3R8aPRGrBo~@ z6%`fbpf&87^1%ukQ%L`Hi$w3E5}+RnSyPksa*{29hGnnG$w6NBpYrJB8mpCVw9shD zYAvF_y+u-~0VbNoY^s_*j~02zUw~aUP2NPS&@<1l{+ZF3L+2FIcS(6p5q)txEAS~W zQDewut3v2F7Q7*Q)~w?BG^}tIeqv56?Sff<0(KsBr#?AHC+ERMNXeZ5U39t$2H7C% z5>x2`(FMc)I`T?3h9Qz`SY(v<5e1ZgN14f zsRQdnHuTvgNUAXU6=u~iGo0345{tMrmXV_x#Wdf_ivA6?gebk4@GxDKO~>v?O{9g{ z`%-dp9!SWy7Nz8*+?3OTmKE&;>qVMU$SA#Yd!s&Ce^{52IzyL|ha%yUYP1>hIw5Z~ zW}8F}JLuAE8e2~7+18m6mOC-Gl)bkxg&TMoSh<$(dP{!+xq!v_$g^1o$9e z6m5ingw=E+2E9ot+5-OHf%zCr-|UKAbi9P|{0wVwP6oXq8&gb?0lmT{T9Qp?JOkxY z@X%ig*`-rcbox}fMVhErMbh_flOX0*#srCK zS>`3oksECps-lx*8yC?lELUgIy2307c?8`x2F3)F7~bBhY&J-C(HLnrirEWkcs9Ke zO&*(_3@cp-Yc0WgOUaXyCj&WM%50NNBMUKtbTkU1L1OPsk}^)%OHTcTk?uvAzX*kE zP}$%u*)+SHUR$W62~Y`Yenl*plpj&}4-XVwi8(@V7sPY{ZbmkZDlCGlQTX6Yx=(nR zHgB=eK~k7czf>2}SGQ*~Sp66U0=-?$rni49{1B~$Mr9XWp9}6^RBVJaZhHse?^Ubm zC<`6kxZY|-Ydu>FD^hecUV`phmRZGgIJk+S%)!0)KX!0~el7E=1Agx1F694icb5cR zOf+xx`pP;xTuKD1hP+LL75^4=LuCzfI1yqEt+}Bl=>HCT$Z#pEH`LYCT@TM5{vy24 z>W#IluCLyZ8;D)%wnECvn>IKC@&aBmSU>Y*;k=G`vhYxcyjSF9zGz7Td{M6`$Vrks zf!-|9Fe&g(V;<>)xiry&#U-81*0>#XjYQ)lYHlp5pyRV=<>cqiq+y#93d-2*(qc`5 z<(DSrV){->%fBg&KDa%5CLLcc#$pVhu1$%kYp*EiX}Beq#+5TWy#Z^Nl#V$;S2pI@ zF|A;lCr_pI*>seYmY;^fDCN>|tHm)8p%NivR1(pQlcvzEg%gq&r_#;YD-w+&Txvl@ zk!nOL{Rb7s<q3 z;&&ie4hNQOLZCRCo+t1=VZ7dfLBSLQ^DTr-g}SVXG?STY*e57aph%dVlR`%!I&rox zWpYl67{VH;g7Rf4sB^k7-kh3)46p|UH(~Ki$)=T(Jy}QdBzm>5Y|TwK?c0YLNh3C` zg;6e=_3Q?_n7~A+A>yzE5#t3I_m2rUSgkBdSjt1>;qA=oe@di>Qf#BpUS|=nJ5c*$e1Zh1j9w&4K&Pj7oMY7NCQ)5CxvS z4Hl%F$%Bs)ldTG;xrNxAG*bz|zhTu?!n9?(1)ZXsQJT68-Bg~6-aMO`xv277x+Qzk zl;kpu-l!T9TZboClk^2`*i^wFsGyZ_7?yc$J)!nZM%t1x0BIY3X{+GJ3ORGOX@*w0!2~ z*;vIeY;)*uwymZoRfY6zv=r@vOL0h@N(s2@9m(AW- zP9|FDZZ+~2uqjYPFJKM0IUDmofhL#JJ3^#6326xh32B%?2e*|&2L!G3g33aVp{`mB z%_@h674$__c`@rR`p0dBL%EKsEEDKg$ac3%nm{|ZWly8Bk{f7uikKuiG-UTJnwQsE zt=2o&)ac6Au7UGbv}Wd-HCDD;T~>yF^DCN=P%}wCLzk1J)8|@g-))5`@TjirI{J=K zc-`jZ!v$w8Tei#!UqWFq=Qdftthk6ipemfXd}c*)1szpbv4Ek_b<2>J3z*f}AWg?| znQASgwsJeftqYc&Sw!!pn#Mb4Zk}0zXF2>Fn2Q2P(BzaY)Xm7*nX(KW^{1^CG-;PI zf*)2!3kxtgkgK^r2T3QXfJ0h#G8HQ^2mU5$jdht76EZc?IK_%X zt67mZ(<*7<$PzSwV&j#wPskv-kg-b?1QU`79olA~G4z@Zr4qlQc7=R6W9wxD#)Vp%~4#cX*fhMtd0R5l!&C0(*e zhp^ww5??}V^I`6`mP6PwYvNQzS*35Jz^zQqljXd~9Q_EiBp-4b zRT!rekS{f%D3uLDI2{;QsWQ4zS<_i3Ok+9!4yUDPR$$PU$@677SDQQ11r01q2NlLE zS&VErU=@L+G@TeaqY-G$(}zGK7ZlnU6-%S zBmVi_Qz7G&Aixz^o}ZYL$94*|mTgeQLiI~oG6?XB`$U7z5nm;lj$d!<>Pp!zX z!u;ji^)O&bvYdqTqLFDH7}!zS%TmXrjuc+c3ja3vqKEGTB;Yemqc|BfJK zp&S;{&4ipJ0{T9UVFj=d)WQ8_?{H~CYH%PilBUa-C+c!0vK+FEjCrgWJaAnaGGjah zeiL=F9@!`2fGHJ{vXN=R3f+WMojy;Widt|Afs9kICu1dYbW~PGt3C~N4~>u@O@k<% zUe=>9s$^wHqm0tzyObv5MN|qP9k>A-#B<3-P|nY8%S_W(EUjBrTerf2yO$MnYBxHn zHrB7GUA3up68#Pf3u-s2j6Qh{ z!Z51%MgM_?Rq7?sC;D9$4k02F6#d@yETIRvG%+d-iYYQ<)FU!uLIN^-@NIQWC<}{f z3*^LTSeUAdpkGYbi2RuFpnN7YCgOP}|4|4Y8#Dg*O#ba?N=z)vLqcj+l9+^m$UK%? z3W)4Rz8F2rtx~6;i7{!6uTkHRcT749hp8vAYBO0lT)m2gC$VsZdLa{^&BCM9$647t z79OoW%4AMv;W6sH@ONXbV&O=26KmE?7S^imEYEBfjv}EdMn$H1OmPg};*F4|y_#K< zQdMX<>ywbF&9*-6e+coUKTC2)S^&pT}stO*1FcZmRi=e zuC3O#R$bSn)>?FFtJYfUTKK-+GtZo7a-_Ta{qFAXpI-x?^SRDvW2ifr=D@AmhghQSpn$;AK7sN&KcW3Noh=^3uWQXX7~QtGr7dywIe}nu^)r z3q;4VKCB+INOVTlze~PYbUf<|YW537XJ$qO^fov-dtFFG&lqoNx{56pT`ewsw*XR*&d7`#+;LDtWR!r;q9 z7iMM2ewpZ^tYPxGT=bx<*JS@;(ZyLGm3>lC8j^Kfu~~TldPJ7uJh)l(s31c@8N5nS z;u_ZFTl_k%WAzydY^++YU*-dWXhOeFzL()TcAd3Zp0c^l+6;MG9(Eue+Pxtt9I6Xs zSSf7ba6{e)A4=uAaHvf2tjl`%`6*@W8N?$Zi^$ms&qL%l82$vcD0oeI#KsW^leXYB zc^`2P9|f-&=_D#y@R~w2qB)gd*k?&qaLklX!6^8(3@FqORH)mjP{9o2xI5)|hO42~ zm_k`{*h3^On5EoIy$fb5X)t^Nf}z9YIQBPkqoK<3BQ#Qlqz0;?!xa7zU#BEP&2SV9 zZ>9zVPdAB=xx|(?i9=F}2cDivJn(dz^Od;IHzQK)EUIsEw!BFkl1iLEA(c3Pf=&D_ zvdbP}a=ywXw!BFkl1iLy#!FM|>=8;l>?%I8PgOEvDbK^VQ>VNk#@qeQo8^tSkd(K) zA*rI|4Y5VpM~YmV_)VAC@+NUeDsgUliOV2O5G-#JholncM2U04#GQx} zHnDV#}MvA*sXzqQnEj#GgW(Rbm46OPAR4CUHnA zaaKtxU|A(5U?YD<$W78x`kHB&OyhQ#>@!Vf!_@aOP3eZIM_Mu%ehwYZ(y@;yailZ( zTGfcikLNuY{yo|~UTAXunoDeXlQ<-mI9`}4bi6RtXW}KM&kTQ-y*HaH;BpQsU5AIPI=m18D^T{=Cp~*D$67~{XvyzfTjPL zo|=)c^aY}GjGv%%KIO^$c&v1u@ZZKtX@?;5#n|X^IL$mK7AyW0*GlF`Y%#uTib07( zK``=rT$iSVFQPjAh^H$4F4<>(+9rHY3Ga;r!N^}yP?K;dcfr$r)tJXrg!^s6_0qPI zN#+AFh3@n>J^D(IzRIJo_UP*)IymEUJeW)$`=4}MJe;~@on;IBhHmONUFUTniO%G!&~TnhGTG?#)UgRwW$AldD)c_cigJ;=UN&V$nB zR4;p1tn?8a=kJP*Z3YjlinU@j?luett_nupPpg4&NqIO9tbA zfxCkFvDky8JhMG0sIm2!@I1vW{7UR8#6#D2LCSwnyo*2-Y_WkjWgvktx4bQ;YYv`E z1w!TEk4J`sr_e1zxw6=5vnaiUEMgbN&U&3>v4uSH2@;D+Aa_4LBnT#I!psI6Gan%5 z)Bh-|wQ&{WY+YW{F;|gdH^f(BKdBJeG$}O_T!C`09306wQ_625>q0qM!m>kf`{2r6 zgg7GNRfrLk_?&-&uvd4vh9l<5i6TOf(H^70Cw&glt(Z-^2I5f>ABXq{LO5w1#Kb}5 zAoH>>!A%~9=b&6e;@12iF`*DQ>%LroZ5^T}w3B8)TrXlF#K7SY7k*c)(^sWFf}L&f-k7Hzhl5@$854BRmb6~axkbG!bi2nhDH+9qRTvcvQXK0 zWH*qYsuH4VwmvS@$5MT);$!kYnOzU{CCth`1#zE@oQ`nc~>8bI~2g=-dY|_<<>0ZES9E?z6BjSvH>g zb}Tse9R$Di1;d60i4#_kk$5jSuN;0_tX4F6YG}Izi8^)m8I#EKyf$lq_u$-{p=%J5 zAXYvtR+lv}lUra=c{}pTgM3gUO^fzX_m!%9-;=8QZbV~GgSZJ|ridFMJ}Kg(5YIqN zf0QH>$o21(;5ZF5?sO{bq*XZ-tZIlpPUnLx-@(4}xIVI}Vr4NOLAmC0!=N@R?`t#p zoRmaVgR4o4Ay$ZJgy<158)7>|P_9Yj1k&wNy6a~u-58W#k<~zmZ;2QV@wA8-#IH;` z&0MFE?ts$W(5rO6M08wMPeBYTg?IsCvWUYFH4s7h)liE__qfu1;%=qWl=j22x*4KJ z#BC7UMSK$CD-c1smJ5ufiK9w)Q&lm_BZwZ9)e{g;i})!-)@X?DK%43BFMjBE6FNH$YbSEb)E9Fv3ml3uDpKv z+dO}oGy_rI84wF07Ko^Y_$b6=S(SYl?r-7B)`a>B-C$P^4-yl}qhMtbPNq1v>>hNJ z#sU%8f>@1uKMx;rPHX=w6hoGRu<}zuV$)#Gi?a!e*qFfG7%H&Qx7uBS9kzX$2 z7{qlVjzHWBFogP0)V+YoahrZ}sz$3oSV zv83Zt3nsN7Stc7Nsp>>hb*((g*?)JDPF6ZrT?k>mq3|X9U#ac%+Cy zY(#w0S@6503Fc}NQcz+uiye-ityy*z{31E}RQypnnvCoK=9A8Ycn)H+v}GTGdk3zp z9isG1h(3tL5cAH5m{-RKedt2nE6uF_Ih>j2M<;@k*Xhg!V>MIBiqmeT^WTY4flTw* zCw?b_feeK~E?`oe8Z3AZ+wkeffV zik}rfEJ1@vvtZ1MS4l8bwJfj}+a$P1NrqZM(EtQ@$mx)GO|}f_r2{hWr0DaXB*giH zt=$CKosTrX*xHSi;6t)7&k$)U2|g}QMb=`71TUyYW|5l}XYp1#pAH)27g!56^Oes3 z2}!a;L8b)fk|f)NCM%vmaQ^pctk|L0Rb-YGpM+%LgA^q8aBMr0MpJXvn57G|@f3R` z_V2{ZO7D>L8%oX3`A*y`_=!w2)lTv3@NNO`DjlW)V-2JA1ja4`I?6 ze4oN*#`?WnsHM~Cua?2hyj;ltz{`b#=;cEG2VO1|*q00DL4DycJ?}OT>I=<-C-b1b z(0fo{SgIPvv$T3I93yM{puW(1P+#ahs4w&$)E7=tTKk~B(0fo{SRr}7c~D+9s zH;m#TUCDyEU(-EoSNV3fP0?Lek zHC-sC2mJ$O5(-Rt94&{?@;LAqWrJ2|2I`?U^jJ{A>b~wE@-^IK^I|F+ z!`o~u`9&3GxV#iiGzko8YC1g1e0Y@k@F??FmXD=R3}(k$2q>!ZxCk21eL%KT$4^UYDsZ?HB0x+-$OWd3X_bHm%rEom}85M^#j zllg%t^8-=l2cpamy3GGJ%KUzldERrX`HS{y8c4?-Xgt1{A(zFbeP1%lV%w_?9So_Y z$g#CCZ6TgSm83(@!530FUdw%BsMe+-zfJrN5&w1gVb{samB#)F@jKPWIt>3i z@p-aeXZX`5z_-c%D#JI4Zxr8cI`3xqV8|aO$ct&W@hlSOSg1DOF z>#!xJ`)8>gj)>(FFfVs=CNjL3o@n0ho-&gxM#XA#dOvn`P;ygC_Gli?=H@Uk{+qdu zwaHmNV!O3m8>%cr%@iD+*4ejCyc*y}_~3L+En{o7?fHmF^)phHaNxFGCeO>H^n1B% zU|~D+bH*ThKoE>R0xSQc--1xfj?Q53v3f@^W+ompr)w{AqiOgvMk5&Tn^-vsi#zZ& z;B-R=W9@x&+~d-p6&rUWy6iczae5Fp;KJDWZy}F!3igvq_%_OTx#?VIj*z0l&{=WZ zmKJwQQfazmFkug-xp%4jvAkbN@vNzD>;QfWcu3BfIVpp)^iVPPE3tn>K9PrtxnD8j zaeA~F+Z8)|2F1@Breg0c4HBQ><{jI8cnI_MIictprtMh^C!Y)ZJ{DRIWHn5dNx|qK zfpZ?nlxZPd1Y0jQnN09h&#~oapbIK4;Bz(>+;oBgUyfBiiGvH_F%1UX7MpTxA_U8b zOR?)fzDwDD{x+y6QRMAsn|9oZ=De&x=`o+c$*x4AJG@l&G>tWyG7`o z#vu`3gLp~AmmuDRn5uNuKZVOIqX@ywPV%4mIek3N$E=t5xCf_PHSxS)^Qc%|Y;G{? z7}9@ANsl1S+z`wu8D*Y(%}h|7SygV@M&JDq=`G}9FQp#V(2A0`N5D%fc zku?v{W?h4HTqF%<9Ys*>1SjSMvpUBHi6x;RRlHL+BeezIYm0ViSTtg+d%!E`cPPgD zGcE_sU`Z2{QT?eBR{sv}GPvp!5c%hjMmMcdbGogL1}ph>~)8 zq2|o9zrn|hFNi`kgQZchLPR^nR*0!`QT+hiop9CKpL|%v6A&*$%o=-UkQkHKKi)R1 zvnHWB VzY9hKnm{o;XlVeli{re?OGzGI}B3|pnq4iz@jreLS&gdn-W$-sUv#@=Y zUqvvh1=WF+>WCtFQ{&E9Seg#Bhdf8U@K1aELHK`5rQS^H*j(%Qlt)n6=1Fr(s5Lpc zolt9io^eKeVLrjjAUN+3oEiBLB^AW>42aofe9X|}gxQE@{DFikL>zv83~>x%*0U628%=48a!4hl)-NI5K@tiRsNc_=BL(jCxK*YsVGb%>rO)GcCf?3>@6JxDHfzJqLjYm@LOHL_6 zLPD!2e40W&NBG`Q_-4f?@W&)`|Em*6A=!fX9Vd>u<1L626f#wZ zS+^r8@g=9+g(Rh?j+&K^7*9G@h8gwodwE1X`z%T|yNZt)r|~g{^3Bjrpt&Lv5N!}s zm7sbK+%~xC3nBK2Xn=SOV%B(^-fFXs=k4F_n!XJ2eNNo;35j)qRU>}fiLG^_G?=v% z@xMB;xu7y~b_BClBL00pu?Dy+kPf8$CWfK$8^NrHsPP%0I2=2fm&|$`@p)FvwQGt; z|9J-K;*>O)^#c5dJpN_)c8@>pES`E>-XEAJApTM)wj*igO)Kbzr&OX)`J#f*23m=2 zqVN;c1}oxE7ZHB#Q=a{OeSC?J8Taw=0%4u;HHdd1rpmbbr*Oqp5I={QE#luG)^# zh(F~Dc-+_+&3Tvmu+|X8#kMMan?I&VsKDjAIi*P3qo0OZVZ0Dd`dH{kzgq zv`M3_Go`9G&KiO_SD;W<*Pk@2ZD@I+XPR0K?vl-V8pSNKjo&v&5oh1x2s?N|3%9VjnMQv|2nfzReehnx#2 zh<_nt&LhmhwaVOLQk&)*oy(+FvU!Iw6d@-}PMI5OmGd^zX)sw|dWb}$0}d@|y%&sL zgD)-Yg85^Zi6*AU7j%Pj`Z)RWBzL^bU>nM`r<%JM3ia1Tzc5cVvp?`ub3pV|Gy4Ni zH3yidnr7#2_N7w`Fyf*yok#VQDXb4F>2%Q^rOe2wMUh+pV`B32mdv*r+sJ7$vlp$=Ikg zHz`fdD5a?puj65J!Li-*Q|W4y?x6BAt97%__Qy(>JA$HQOpfV{SdB?EoHooenN2p& zCSJ!Z&*V1QEKT#OdCa2iT;+zH1e^aVsa4B6$gn^wnf==f?8GkrH=#;vC8KKkgjC$& z^WOvf^^sNPWG-r?TA-0g14Cg!C=2-@_it3GK{1_fvz0oQ zs?;D;sX3I|R%(!`#Y$JHA%?v{m6}LuRqAS+Q#`k+$yKT{RNd@U`zN|eO%GM~I8~U6 zO3e>d|7cZSr52%4rT#gk2@2~&S*lVqs8sy3v6aX>OiP_XhcqpPRPDRdRSI4m;hXS5 z(dqb&uQCFi&YO!Yw)^r_(p4tuvzVF(Iq?=_`3EJGVns27k>``D6OXZBRaqah*=AF^RS_ z?%S|7ny~7bvJGpaiKE6v6V}TNdlqbd?m3i=%=ErZVfA`vai}VHs;GCCgsO|2D(anM zLY4Lx_7Cd>Gz#9eDNRsV8OmJniuV$T%qL=cS+28{51Wb&UWha+Q>P~B0rb0~e`n~9 z*)5qmK6$^9#u>o#wCWEvGpV472fU*A5%C&=Lj5NAL0==M*nrqo==X>>V`{?K4?7S3 zR_Sw$el7fv3&l^3?IYKrecmQIq{7gUW7hR#Q^&M7v>Y{x2yHE5U_x(wwu ztBjTRQ{}HgbrU7I-KsOMk1@3$+KW_ABKzBJ32mQnwt;MKMymZO)|Tyyq179q)lDr} z4Z90zKW{TzGC{-z^ayTh>ACVW3q^nNMUMDNG) zvSK={3Eoeny#sc*iQVz~3PSe+nS7e|vY}HL!qD*qA+gUX(nB|pq}m=vs`Sv6pi=0x zpA2>8O|1&Y1f;(;5?$J13*=Xawpr9qw%2DWD78o_M@}#MsY>RKJ#RGETn2{J{1gKHYE+!R2qmnXVjdI#s|Jkb?Z15o$nuDiW$mb5QLL?SEla znjID16`GSC-ZnnPZ8OEq(4k&CHdpY}FD$M(2J)k*xaMi}Tkt{A4th(x$i4@ubT#cr zB`q>Z2hVhOgJNS@1s~+*E9q-79s0F7YEPui@ilYVU4)qp&}-%<(ynAh*QlU}j6jEh zZERmkB|T)4ZcpX-sIlB0lXL}`$J1et=M9g}LO+@_(XN%jZ%$3pWyYaW{$&5t{!vG-s5_FAdFqZOu*ZHxF_1$D>iq zV?;r{fm>c-c_<6{AopIy?5X%7N*youQ}hHY1jmWE~M zwmJFnxI9#S)~WWFxXP~yRr{POs%U4Zdeo{IPL)Xa>|Qjg)Uzo~P`D|SsZxX_$o(G5 z`1ZJtcW*Ww;W&+IJHmETsq0de+HPubo2%4k4f}{HwU^Xt_&KB{_gH0+&+{qMG|P>s zU%THQTC4lWx+2JbIJDM7P18%Fc7Hsy{&M8|>CpNCXPt`1$d^Lv{8vMp=dFzwmSboX zmS3kdLE$^0%!Q>yo8{u2@qtyYt!+p;O-O!}3Q4Dl!CNjQR~dHjY(i2(N_EZUtSwB9 zqJBRnRP{MkRN0B4YKK#$YL;Ias`guzSD|TWRG~*wnxJrgD03AGzQN5dGq?z|wDlZ& zAI;y?;Y{qWhs^xIdM+zk&t-mKJ(p$Ib2^ZiU3`VoXLj*vPOEA!Shns1c7sRupzV;E znLGF#u$K>`Gp{>?gxThjJ*<(rNX`uu)}F5la@$*iY`e`Rr-C~|w%z8Eqd80V7+GiL z=saq+-R6?BQ*P}xmmHl(&9>WIa&#Uw+ir8o(flOaZga``8>O||TyofFA7tBYE;*lO z0+?;Lx#WCab+g-Ca@u4wPdBAO)I`{vN6ntU7cyMR_Fuo|O{ZP>Qd8N+o*}u}mx4fr zH~TU|rP-Gf(q>1 zw0;Z!h3qnZY>KPLc131|`eT*WZaXllB5k6vR)fqTAuE+jD=lshGJYy2LE+aaXw1Yc zrYGQL6NTlC!;sWIhS)sy7PEsRB=sgcHqRtGW(?G)%=VGkJUuHY*8B6=0wpWvL4aAN z57tUNcD~6xGjllwA958%$oT8nFnWQl&tDsD-cS{-#K!POlxB}kC@^i~Xj6`o3>C!e z(Lt_~m_0hsDvH^o6B}jj^X$=yood_;HHA6N#&(zraEKV`s~|R0u-NWLsNis&O&QOy zFVxDriby@#+4kKm+>yb;kkTN z%t1S<8%-g3oN6B)oT~ZI{$SKb#N(Z~=@Sz3;9%5N#Iu}u|8^rT4MyF8xY3D&&Bn=& zVAS1+ujnUcML6mKq*_0j97E$bf>F6snT=X8gI6$WEc{nIemT50^^#2b(;kEm>0p>T z;)fu*%Hq1Kya8szmarFF9>G63S)u z!7yF&Hxd$ky9V(hB%>JDhEGSlnpzImCeObTQ44WE#D^h%2r)vB<$nt?dJV+Kf?*n! zen+ni__B!(P;B>Fxzf4%k@Fya3vs>(y~JN5LR(_DLX6PZ`!$Hs+D7}aV9Z7=E~Qi* zxN0-5hJPB-QHjQd!!zOGhu>%T8CkKhau_#SWXq2^hu#9p;7a_}YSEU#ji!C0k9P&rQ zpMzaNSR(AW3k;2&Ia2DPEMq=MyiHJCMhPiHmIS4ylvL7+lyr#nXO65IX>~l8aYbfZ zR#mDx^rz5KUgT&*=*U!Rq;<4-uye&M&Bcswa12g?4THe|6_v{7duo`ksm^I(N|-q# zXVODYj|7Y=Wuf0v!Z12yvc!yWUR_PkkRU42*ifHm^JEW+Eg<&?m(ps^49jXtGr^@g zGmOz$WwALUT~O&e*>gvHalQ#ZQ%o1x40_Gkr^YG<*T}^R4ua{{kMuMA%y{gWi(_Rq%k#(;GF#PPMdDc_Wt&{8q_Fc;Dm5O{ zW!Depj8sopFy3_18ZTH#&yQGZw$KSWX+kTy08!Y7Nv?MnCn7PyncDW` zb(iz%hJcA-B}}`V9aTXIJ{jv@=1ICP!cl-hYO;5kz?OLzk-5IlahG+uE+D-htMF2A zVO4r5V5d~EH=9AgyF`s2GaN7&n2`m8a}7c5rg`Nd{drzOGe}MM{hLw2jaoBp^cfFq zlS}Ew0xPL7H>tU{BQORyDWgCXQw`M%+_ywFM5uX(!Rck_G~3B|0yyHE<9f}6MRJ1t)~5QN@~ zQ=LDnvmjLr_I{@1+@}4G$QTjc?XonW54E|fFvBd#aNur-G8obS8Xt)fHyvGfC4MQr ztpBe@U^f%WiUw5kFgkgoev(yz=>QLCNmb)nN-3o=c@6PGwg zc5uPPJ=zc~8JHUND}lM>PB!)ZpbS%1X<9Pqk3}SZhnU2&Tu%L2{iorrK8V?GdT<7M zgpd&&rD#^~&M>$`18$SQ+iLGN&$~VHZtMHrQoC#1`F+v&ePpupJBb(Yry*McUIKQT z3fw*c_iEj}jdrh=-MeD<7S+8ObuT;JyFvF#(7gn7@2=b%8}}Nb*PCi5 zfLDfe3z*k2Mg=klTyD7o@Kz0!S z6DKJ5WMuHrD?j4X?XrS_7tw+;TLOgaa!8(2IJOIt@6vPZjgagWaqMo$eGz*Q@{x#r z5|YP3&iGZx?0AYD0?9dDr!9k=94@bVZi4f|&iD<;_al}YRH7INJu|%OX_jLbLe@v@ z3dpvI<=fs8n<91_wVxNFK9!qgUPN`3CLj)TLL*DVmY3im>#iw zjYgs+V%s3Ei`dPOJ0o@%WJV&DQ8r{j#1=!AMC@sh<0Ez=WM#xwL(YxZ8ptIPTMO9| zv2Bpu5xW6$Q^an8+#a!fi%{a0h~*%C;?9WO2YE1JAAo!&VxNT^l9Q?+2eT5T5jz%g zQpA=+PK#L1i6v?xb`fNK#4d%rJYrWtZiv{8kXs{`BSVQD5xWy|cf{_6+!wKTLp~6( z4?!M|*vBDXiP)o%9RpJp?1tpkr0Y4iL%tBPM<6p9*23P-)3L;uh@A$xGGf<2Y77jG z{UMO^Qi)j5Af!<B3bAasqD3T*`9LC>N+ zB6L$xdu;~q0LWWNHy4R@XE|=gLb|iyP>5rrG8QVfQX#(GOj04;XRsA2wNfG7ZjcI1 zvQnXHD;1hLVTkg1`R^G zU12M<)k=kQ*Fq|^!%Bs2wNjzmtyE~Al?vT$r9ux_snA1KDs;$7g$`S(&=XcF^rV#v zJ!_>xMcgMSuaItnluW3^N`=N+snB>U71AvcTOkh2%Y%^aj7WuMTdB|@D-~K|r9!$- zVk@-FN`-X0L@Kn#N`*SCRH(~Jg>)~)R%nxz3T?AeA-?+$g9ahpS+Nzm#Y%;AgGDNI zhm{K5ZKXm7tW@YBD;0XgN`)S`QlTfUROlHi6?)c6g>ugV5tvD#Z6PNGkM#l?uIXr9y0zP|1Yew^AX#ZBA05 zqCDe4h+Th@3XQc=A$E95DpX~qLOjxvRH(*Eg%(<=&{8WET4tpyL8~k&vNxnZSXr*EW|gAnJk5e0MtvU zG!zSuw_>64P%KgB1&D{wT2~k55{$kmivR9|3dlRwWVA zd{SafCi%5-iG?(;lvtBW4j4-;v@#THa@i5m!kYn1{7I%}mdrgb?7z+y>#eiJdh2Yl z-a1>Xx6T&pt+T~?>uj;!I$Nx_&KB#fv&DMrY_Z-tTdcRv7VE9E#d_;(vEDjcthde< z>#eiJYL5Ff5C%t++i;yNt!B01I$Nx!u*E=VJPLAV#A+H^AF(SS+ak6ba#O@^gVek+ zbagwVCW#@dd7@^7A*)HDrgR~jV2%^6vsJ2k*l?XKR`a-Uoh?=qxNw~V zws4&-R&%w3K$wvxY0pHg=3%cytR`UZM670B;W}HcH027{*Zy>uj;!I$Nx!LE$=EtmZ!@K$y{KkmDm(GoH$bt%jT%u{DrOB36@| zmWb8-r8{CbKyHdyZ=J1TcYErN@Vz)u=h*)o(ty1a!zc142#{WRX>W+Un zVjqWmC1Q_4YP<|<bQKoPAC2XmH9$n5P$%lZD)fXW*N35KD0|>R{ML}W;5VCEM zcSkJewG(`?tkb>$$#=avR^L{u!koyz4@0CE~=oh3OkocOFImB$w>DfhQoaxdtsmb?q}bxYn2y3dmLgZ|!-; zR~CL$ddX+G-WsK%6I+jVkzMOWqDrU6FpU znsre%>!NDbMb)f}s#zCRvo5M;T~y7wsG4g@{RkKdjoNfwRCo~t} z8jVLatBYz@7uBpTy=LL{qibwLPO7l@Em zFdmFDdI(ZoAk@0}gsh8E$htU%tcz91Dqadw$htU%tcz91x_E`Gi&-`4|Ff>;Y_G$1 zi^;Dim^LmoPF%rDxCe%Q@OqN`b|4ni3GD|o$|EV&nS zpCw%>)eH`U+OSO=Em*hKO~!@CabEegHd~m@H^f3uHxG;QX#&VsOvk^(}yg{p9WYY z3B3*|mT!Q6Z^iF|{$$BO*#H>x)oF=AmUIP?tHZ{yPAGI0k6hJ7uIeIJb&;#obtqR# zABMoW2wCUG1t=_4$U1jU8x~LBF|Qh?Rn!$;vC;eC^!PYA-ZZ^QH%GkWd@7xpn&Zpsc;Ypl3d75)i>^t|wzVk&mUV0MePM+r66Z_6RvG4pk-nSnH z(qk_9K_GN~Kje2J_EAWsO3PY_WW_wpS$I=2&!tM>xfJUX;Lhh!_eGuEzzqKF*@SsJn9Ayt61Xt?|- zy2~3<`5prxg;WGx>@I)A$~zNxkji(sC6(tGODeyKmK0Lfa&eM+E0QknFtA>|rFHp+ zTCd*Hdi56T)myArZ?P`_Cn(S1;c5@N73N83eJj4>-6jpke=wchLK3C>kGGga`Mp)a z2Cg7VXZa{U%lrAgN?GYQ(=yo@5>U=eQ||am@uCx!=X(fC_lV|)X;Svf*m$x5U^Elj z2;jSajEr7 z4cfw!!9FP`yBYp%fGKVivD9o=+Ediyq$D^zAX-*eb9KW7kbE$ zO)rC#pCTvxx)Ik49Ro~jDXaIaTsQe<#&XMOZ)m?E_Zu z;{n$nv;*q!N%GTAMZ9nl`7~N)CE(I;guc<^U3r}y?cz+lRfx2+0mX?QXGqiobaYv6 zv83}e6IPb7ph~`GU|F+)&Txh=bL7u zD>9}HLP{mmlO(mpOsa-QL62EdNdDv?^4oB7zo|h| z*$gvftrgOK*ZwUngHgtyPH2K5n}j9;vaQ=AN-61euEJ5W`Y72_KUuw(EY(LtwLxgU_<9zPUlOuX9M2-OWzM&4`c+Frmh-& z&GUmsR=!90QGlo)20dp<=TKiBeCOHHE`11e)RIoS5#ud@I*agjASdY2H@_rKl601^wed8%IM z&8D7BLfe5X3Nfc-kI0(=^DJ-W=slusM4F9Y)_~P4`eiu1@Ky#_f3t<_M5QM5d10vw`ew={5wHmh8DBEDf7~ zm$~lr9@fi{n=QoYLJU*QC&MxfDN;4)LQAHnAX*<3UFJlkBpMH>?+VX0PU`1_R0eO< zRnVRrZz?(B%+%%ZLweLJ{VxX@&L1bkCZUCftQG3DQlV?CROn_a720K`LJwQ1&><@o z;`gNFSLjYajhgdUC3{q$xn~*GogjUYC00VE6Kzi*)<1!?7je@wsZyt6lY#eaAS<{! zph-mz1oAXn%*Z`)q6DD?(*QMs>eB=aFa{`9l~4KteWmq50PB@cfL{W1X;W@}2QcCl zs>k(!bwY1ZMV?m7(QaukdX4@Aqxs(rxJUuGEm}TGK*Y%g)5{>2|8Hvk~p| zW5Uv^;+{S=Q+E1TaG6s>y40OfI9EEEYZle`3wvCUEq4+dYV6r~^>==#v@`JPA8DH+ zZK|_5Ewx(d)S_MfcTsC~9jYSrCA2=|GLSliSHZ~8beDxj+qg7kn2O_sP^37zT%IF` zV}P!G`Bf(qovyci!&&t2Db5E{V&mC(k#aVK#~FB$inL9UHWjIt!ZLEfmFO}h(ie^sGok&4Y!s5Kc+eXyVfP|X2)yu)2(ML&>#jhrzME1I)Y?46C@4r9VxkTrVxRMniGf;qKU#uq7aI5ezuIqK_#!?9W_jfq~lrPb)E zdH0+W-DzFAZDBfoq~mM-mj^OfY7FXxoI$h@l;p56s1V%v@KsQ-ZUy=GXOS;jD zABstw253Q2HF}T8amJ!fs4CKkRN1_1Oi_8lh-!s&619JrW$?H$s1tGqQJ7`$BA_A* z9|b6~(Cdb5d>53!G13CiFiQ%R8nSUBsM1P>=3A-0d9~3>g)EthqOv^#D2nBKM7?i0 zq9{t=u&N>npJ}~RgD$nC3*8T~di3^*t9pe+o&6QLDn)gwu{|jw6#L_0{t6G2A?zrbwWEs zgStJU?ly|l#TD7s%hoxIE)AvG1!M(N`B9Km)pRiV34oRq()r~6g^ckTZy~oj{T*z?&Qtz?SwGDP64*)e7k}cmI53P;U(C zgq%T?&jzGhj6tf2WwgtPYK3$(yuVW!++qysgq%U-^fyS~GX^QAG8zKV3PL(h-ruPV z_?{RH>V%v@_$oth$oUMo3-b&vbYXdj2YsyZ@ zm8JU|58nt7D14dQ2zqxm?d4~Nc*}GH3+%n4XK8@AL&DY26N$;0Lt|;NXA|}i{*EAB@$X` z$R;6u1w;Q*%XW-0s1tGqQK@Ax(-_qA9h-@zmUN|-w$X?hgk18d)Rjo90hL;K5kR?? zfMo2ITI>cZ5;|_Ai}v<1lKnUNx6<7x_X4W1@IioTJ^)fWug243gci6E zSOVyaDfHC|_X6($IxE0V* zhy#GmKs*NM@WTthOTce{w}8xS`Z%Cd5cPnLKe%%b-OxJl;7&T+46P#$?reh&H5>vC z13KK`PBk2b)^P@Rj)4)_9AI!K7u=BromE%_=`c2DR=;Q7&rtx z2Iv^04i`KN=v09_PB0c)=Lp;Z0(Wv?5i%VaaAyT{NT3bq0CZTuof6mvt>XdiT)e&7J`5O4^10(csD5pYM&UWLvbh<~62CPmO=wL%7;7&B?d_sKz)Ip780W#ARyb>JBA2JjZ}4xqj3rN!h0Xg|0%@oH=00YKXmwJ&kh5Ml|8 z0knaz3@8Wq(W`_u)y)Rx0yTj4!CeB>0*$~jU=y$fcw#7h19)^8?FYO9Xorw?25INd zQucT(1Kf6>P0%+2+JLeX*ah4Q>;>)s_5u5Ww*YN!$z~&lHhRnkYJe5MDxeMM1bP9p ziGw{5Zr6>wx#^30{xTl_Wjy}Nc>I^~cqL=;$;RWOjLEM9`hu^&jK}}=@mQPZ(#P9< zjJNv%H~-a_;QVF&%RQ3$?qBA=f0_UO|84&3=3yFlZv=EUH+?>=v%3GAsgsNT@6OZx^2y&)U>R^ZuoC$1_;=;pil6_N zb%aZA%E%fb6L9MaojcW8LASox!J5LIFLmiEkyQaYYNx}RPVQ{=C6;RdojP;t2^|%4 zb~?YgAMn>LI@sj&qWyJ@lTSeIuVwBB*)on8lT ze7WlKAfQt%Zk;3_E}c$cq_3BB3Ph(d{wLN=>Gx+HlGp^?2`rgK@RyC+j@K9U?gRD%2Y`dX z>wwd1W34vAZUx*<*IS`?19t-2<`!fMGy-{@O6B{i^BZ&~8ST{;e}u+XLEo>B^~Hl1}foNNOjV%KrrL zB;YnlIy-Hz)5f*2z%;<^TyuK2J;tqt$n6bsb~=dA%dU5U_M8i}<6EFz)&hNLvp`?kEKpw%Xa|k+BU*c3w4X&= zRs`B%BG9G~f%b6-v|U4>-4%irA!u8JK${Z;+La*Cmoy8G1A0}j7tI2_suk$nsX#AH z^|~{tw4is80=;S!=;fe5FYg3;-zFGXWkGMXTz&N3=P2+x@D}hkp!YydFWaZ5TF`3< zfgbD&^yFKhhuqHo>cyQct=9x=o7c6jT7PY_y|cYHsBNmPsSkR3yW2b0RwP?mdsYX% zE$fr3ntNJuXgbtQXSdwR>dn!9_;DuYWKKU8~ueUMD{wRiSTOZEm`tFCBGu3o=xU2|tk zz^{QNS6$oN8t9jSlvi+dcYAMZa!p_7>aO1I;NnYbNW8kaqocJYxvFo?nh)d?w69M} zZ}XcH^!2Q&Z@sFI5|CGS>s85?_U>Rqb4PniQvQ?cdRB$?t+e%RUDwyqOqQzL>aMK=3VQ%du_f~FKzDVYYoCs(t6Fk&A}DD&1+2?*?3f#0wY+nK1nP0t?mt!OS$>1 zFrSs?b4t+BOvu_>t_k`&DbJOmzwYL%O@T?>+}qa^^sei%y+hUSZtbCp-L0$FZ)okl z)|7W`Z(DF_L+$zJ)2(cqPpPCKR;>#grSaOX)}XVx%2q+qG=-ztlk1whY?Qi9O%#Im zE_zmH-@33NdRjYMXckjo5_UCT+p)g6B~T$!?Gos>olFD*tWAtvh?4UbIg++lv@WP! zd}&fes%c$gJ0_W}?x1;Ejc1cJ&DCSuoepb*6DIFzqcKYRI(ypJcDA;Z(wxD%)^*8V z)zMvM>YFZC+w|r#GUArj4ehI2Z8x-yAN4BJkR8pPt$|9K)X(On+BWFkP*Hu7u4vo5 zynl~e-`DGf@R~KyusG?HkIbOtbyNc1c}uJ*{h-ZS=zH%EnU{duQv_^bcKN z3&S3MnXc8Kr+s6qsj~ZZFWa`d+S*d_BJ?hF^OgiOH7##lH*>LUp!=J#K)p(lx7WHE zDojIpnKrcc_H~7qaCtOjsf0aU&8x3$?G2h5<|h}|*Dd0@>>wN050W%zS}5!Qqzf|D zimTh2yKP?xyS%#|)O*@jbGh02rNm2YJ?TP#3?zxJxvD6w%2J`LgCRML%YueY^ zsHOU$b7rsCifXRcw)H)|Bs3##>e8}TDl&WVXn;2%Rjm~MEBe+k_H*}OELS5Ede`Qr zgLO5pWti>P2H_R$^~m#V7c|vXk5e~l?dh?dzq_w9sZL>rA!SK;G`_1$xVm{#rwXO(_Yc z-nPlD-QAt*ODC_f1J>k?t=;R7Kpa>pPN+Qg#q>UCG4X^-~6e zi+k4AGFo-FGE}G}X6VwjU`EWS8<=5o_4<}pbAw@QHn-um+%P&@uj#d;jJep9yJkch zfL*T*M}gJNotk9W>pL|Dhy9Srk_r({ThznNWoIWf=9X%%A?_*6dHT3P*!hjQ6xMh6 z>5?sd%^kYC`zGtwt*!|Ax(KYB9`vM&nOv>=w4I>^ExPthR;rGfQiSt~o@g**-qqIJ zNfAxJnf`f&X`VWT8+L1_CUeR5?yJmLWjeVgMy_m(BV5BwXS&vNJ$T7`dwSM)nak3o zX=&|fzBagI>EZ>+^NmY}W2SCoX@YD^zNWpqr`L^uff^+>)cCH=l|@gPQr>?MaNS`I zVQ#Z^*WA_Q&ve4HG>xX2lo>a#Uf;VWP(YJcGs)rx)JZj(+qs8bYp1r|4DC$TOxfuN zK?|2TQ(Bzc$!+&qS&&#MvS#idZQV+kO3~BR!YG#1 zbdMXDtpNp{@&UuuCd2gP48;BFK%V_Cr0ANPaxOQ?*47qNNEHfOb03(p!7Gj~q;5q^ zv81CLYt4N-pUT;&8 z%dqe1?do3NRW_wEYQTOSR9UFpzR*ioS?TvPIZf5nPmv1Ne=78SbLUm|w#(@5WNu}V z(0Asio8p(r+&8_7i}#JI`5jNzcPIGcR~WA=7?>Z7a_hYqOH6(ObzZ@cty!PQyfOaC zjL*g97fd^ueK~2g44=gB^rYF(Ek!52mgl>`^9o8gCvF(9B|GvOI2$e9tNx6Q@|7Pg z>$Ou)9-VogOv(Ih{F5 zLb?S71GmOMp;S?xdL%Iy-ucm^iCTC+4_7`tvRH)9#0e*QY_SY}L4l2v^P$HW>1ADPqQ>rqc{x*p!?%_E@yK(9wb zZ70#|CfwEDQnorsTB@|Yr?hi@Z)y8FR^sbgd0x>{%BrgL>h_L~(&mn0VEx^Fp?#DU4>An@Vu~kV_ODbZ9{w&_Ip0KNd49Bx zzi9&;&+prMfAL^|$0@zZHYH=*b&3`d5BQa9?=K!O$asHo)B7SpJkVDyMSt;tA9?ov z;ygF^|KdTB&ywGuFalPb8N7LdAE!&zhaaUh<7kxan;JTRh(Q&yMVke~*{`PPT%|oAdXy$IJeGkC*++Y}1sr?4>VYo1|gG z^1SQuM$h&}U%xdk;-%L%MqgiB81d5U^{KCat~lbQFCQH7D&NCtd=0OmTzc6@uc&PN zcBbj?_IUX_;_*taS6a@W^!2l;vhmV(K3^ZCUj5kexa*mpL=P5W zC_WP$gO|Um@OqbCyuPUn#GmDtr1ARZGNTUl`Z_Y7-o8*_={N-e!BaC))Q6~3*wk84%ZhM*em}ftS6ja z{9x*q`ibc0!K?nx-&RjAd#yv9y~?+U zb%*0k`8;0w8eT*CdaXwsFMUU8#4G(?kC%P|uYH}p^z|Mu{dK(V_4Utry!1zTmFnyD zI@j^i@0%F$@~^Ke@bxe7irDeezvA&qpUL{h>8BCDa{42P=-TT=ywzKNu4VX)dX7Y{ zKWKerO=7`998HGTddsz!)>}@m{I_|$%BS_0uYcO(rPq4Q*AHPW<#_3}CUd;}FY|cm zS9-kk4|=@xTAP9Rv;8-db(Q0#*ILc-O5f=5(rdlu>vwv*^jg39`lB8%z1DHQewtoI zo4>HXd%W_0(&J6~G+t{umtOXFd%Wzmp7Zs~^jh2e+5EJY^Lef1eBQhU5AEgujWoU1 zaL!)(a*tR3TFd$RUXPbvYdc?mzsF0jwVtn^HYMVv*ILilZ}oWTwchjf?|Z!TTJ!n( zMQQw8T`cDB%&>QMh=8qblk@UJLnO4TL0o};Y=w)}2ArWMi+Y4-QPYaMO>-aK&-eu86JKRf`h zdzbxt^Tgl7M^St8#CPFOI5qa)hv$Fz_vVQoL=3VwPy7fzT4lX?;#v4;75C5{e$qO90d#AF?v1okpB1Z z--TBna`rEJ{?z}EdVB$W`8D|6p8Yk`qj<}HtH+PR{uA&^L;Fhje}UIC9p%>~fAH!9 z;@89f8eY{De*^rR@S0DF|10>(GwgFr@rq9{Gs<7Qd%mF*Do>`TzmxQ*&SJ|Ja-}~A z-|q2Be+(YPpS`}{@c2V25BwVx(B=Q)-2V1QJpO0cyFb@n9Sb7+Uz|jLpeEA4f&M=D zN}Ra-uDi(Td7?w$eu>`I=M?xq!K(t!{^?Zz$q1%I7h7sRv22m^7Yk;bMBnD=7oS9b z%+o90iAI@|VH=JE9>Nx#C=EB>23-t;GrUvZN3pYilczsuuWPh!8@)60IJ$9J5> z{%%jt+BWs)+Vg;?|Kv&Zhdn*NIGp-(>7VoT_nbt3%+o6#Z+QIBtdu*`o~jRjrREdK zY3ON;(h2yD!AmdR=`D8LnA3Yz)3}&S9m!$E@G`=T|zcGzh{#t+89Bu#5`pf6F z{&M_o($~?S%Mlc3#Dc$t&*6I3`a}Fv@a}nJ5zp^9CK7xW|GLK%Q{$K6^*mw-{Gg1i z;3zzQrTQo$9)E!U2=)`;Wq$(xPlQP0&lvb(9&zed&*FM^`ai(?ACf8kX79!maM ziwEnd-^4J#neg{`_5BF^cZt`wP~Qu$=OeECo8e>Vr-k|*@L9CK@|XWT@a>d$i+JLH z7yLZh<164lLH`1o^38zo`|Abp?s_XCo=xyKP~NVvydCgPAH=64bNkHU8}^4|vEufFi# zrM~X^{{nmre|py;`@e(#5bdEks{H>w{F|Qr58-`(KZn=zA=jR-!T*|gkldvIZJPaw zG@c*X4es;ee>VI#!}oP6&s2CnzeQ>MhB|gBa=W7f<>P@OmER`s2so zKf-!-QK;Vq@B9Bdcs(C;_J`oVkOzC(Td_&ksO^IT76yd?iO;iLYT861cI zDSGv1m9LOjG*`3!bl2l>c)vXSbZ)TH>yLcRfR}$(Fg?xw!ZiMJ_v^N=55I-Kiux`L^N%x8y_n}AOI-co z{ra8`|8>vbf;4?&8ow4k#`_uVCs6xuqCNcn%@5`V&BRypch&!6@O9yPPVu|pr+M+c z1KuysL3sWWhxjPM|5f0xl-l?A%I`aA_WzW|{|x@8-u3!(_*1!FYw)A|--7r1(|hnA zAzrS%hU8No`m3`)3trF5OG&TsaXS3Bu&4UQ--qDe^sc{&jJN*%B8mR*z4%@Ye;@I2 z_t#ItucN$ep}()gFJ?S*`9A`$=fm#$_($m(FSxCl{9l4+L0!rx@yZIGW+ccb-Y)%X z(g$JsAT#(qyq+gJe<$Gcsjn-~5C$T@J;tW-Rq#{E-;KYGY5LXhdYmggV6q5eI1-iMaz zooEs3`2oCQ_3Jkh{+nKY74Wywo@P9uznu&JC9a>jp}z(2d+87E{@4uf`|F0khxBH= zA^kP*dVk`|zctPN7WiM!weuC-kM4ngp8Q<&EN8#(d{%`_b?}J?V zMpBW!aNmsLRR;ex+Iv};ej)tx-gvbFUhjWO(W}3&fnV(O)F*8p?Yyq88g_=QSi-r5 zjunk;GhVTJ^}J~t8_r!^wmul!5;XK`A6o+(!-GYwZ0k4F*j}?&vF#)qy-$ANqGSD9 zwq8YBfYZ++^xNji)>3oSBis?}w(4r9d|B0b)l;;+EVcF7-*|5izl1x<`<;ZbOn6Mh z>_zXuSCCEx0JSWZp%=qVv&nE~h?dxNPyo$@&_L zFAMoa4axb78?6lb;s#PQBx}xJGVepd5=XSL)j4T*6PiyG{#9(DW#2rzSi?Q0No_J_ zPo>*&+uj>)u1pj)!w&4^`Za6V=srdJ zFh99QdmXilldaW3^D66#12L<+uASV|+qX(l=cG(? zM~di%BARx~k@fTW~%S1cFNdK)YJ9>QJ)d5o_-EZe9qd{tJTz# zX_wZ?t<9_2Cs!vcCu{rtRaFL6R8~|^CahB`&so*pc}`i`ImAQBlsrmyj@h?=jw#JK z8>%O-J7+Z~vM3FEqWZd9DXAsww%ufM4Lh8Z&E4J2*P6cFPhhW%q}kiv&!(%p)ohIR z(|H1yuD_X+y2e>(I)ZKZu*t(-P~Y6%(|Z0jt6RIw!L(#jqw;(Lo7%Uft>fANZg%_{ z$H}DK%$4j88W&$&kzBCAKU0(1vftRyPyWH}!P*2H?lhiPvj9JrUR>*YYPhziv7Kw* zZ6~&UH7s~T^M=;s(uK7_E!TI$(v;C97cWlH>{`Eub89Br+5oO|A&V=?$vXm+Og5_v zxT|?}7bjvEfJkaOtBWAryS{ZTXD%Ad5SC0jMLqk-*R>|scPHyxd)vC#UmcjE6w#3^ zdmJFCQvzl*@J0f2?WNTxS(DT`oApTsoz?(lgnuE<|65jwXHJD4E%)Z%>1U z+Xu0?eQinmI>ze%)7aJPHW38j&A|f%L4ia85hciSoW!Xp9A6R)F|izzq+4Rk5Jdiz zA4CvE!~^gKNR$*5REQ3xp+q!*kmxAj5mHd_eY3lFvu6h}(%o%#XJ_|jXJ^Oj{Tyq% zdwXtqpmk}*%)oa8Ez;|orBAc2T+rYpU0Nwv4UW}lrODR0bHxKI}>(Nk3il`VHWc> z|9!Y!e6Z@Lvtl#5+G$kmgl>eePR<*Ly20$J=u*!AX`K-b9i)oMuQZ#hsmH<*JW!v7 zHP!CudadQuE~jZ@F%k~}SW(0L&#@XATJBUJM%t{wp{%cMZS^-M?Ub$BsGAv-d1!y> zR>BCTz+&x39#R}3g9;d`H@^BdPr(AI7(gV{OI5!gy(kTXX71{OB~mnXKWWFObge-n z#oA`{yG0WMSk(xB;i@0F2%-O^-#hSNN&yeBj|F>D^C^rSbYWA0{D>9kndyy2ff+dI zB0Zm`UhU=BkLazbiL#B}tbp6hfH-Q-3?e_M^D@0gWK&pU_jc`LVABu=E-lwH^J;f8 zUm<|S3IT?LU=u>2WbCynq6Ky+_D7(X8f{%vO<@(0Xu*3a?cz9>>ap8bNTSoABjdEp zLDW!&*$#$`Wut=_t=->nF@VK#*L&1~&$B+3A)YRW*$qYbtgNK-+KMs2@d)_$L1PO5 zogDx;wzSjl5zEdGk0za+)753#3zAhEe!)$J7odxVTqq8X7D0be%b7o_JAafLwVx*U zckwF-|AWP`PB(7-689Xxq&5!;R-6}`ISlhUw@_QUsnsD-uv?~4laO?2 zJen>;*Ch`-(s(XTJv-CBZSS^hr#;UIOg9zQ5g1s|FLcW>3I>w*y$IkGIAlQO20$L& z^)SGf8>MJ5hM$u-hu#+GU4$6Ml=coc5k=s+zw4gsAtk|D32@mG%$F=K$zLrfiHH(B zFDt?*5HM|S9y*q_ef+{j7k&|ijC%0N4Hfw5%5FRa#NMYlaYK5o+XVnO`wKwU2dwQY zZTCVlEiY|MG&G*L)-qqy)@K_u@2jAerbo+yWO4wr8C O=;9gkO-kG?@cjiaq1d_r literal 200084 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 diff --git a/firmware/build_stm/inlretro_stm.hex b/firmware/build_stm/inlretro_stm.hex index a27e02d..8cd50c2 100644 --- a/firmware/build_stm/inlretro_stm.hex +++ b/firmware/build_stm/inlretro_stm.hex @@ -1,5 +1,5 @@ :020000040800F2 -:1000000000180020C1000008FD000008592F00085A +:1000000000180020C1000008FD000008FD2F0008B6 :1000100000000000000000000000000000000000E0 :10002000000000000000000000000000FD000008CB :100030000000000000000000FD000008FD000008B6 @@ -13,1205 +13,1205 @@ :1000B000FD000008FD000008FD0000080101000827 :1000C00009490A4A0A4B9B1A03DD043BC858D05021 :1000D000FBDC0849084A0020521A02DD043A885025 -:1000E000FCDC01F051FF00007C480008000000200B -:1000F000300400203004002030070020FEE7C04616 -:10010000F0B5C74A89B0138801921BB2002B01DBFE -:1001100001F02EFC1388C34A1A4080231343019A2E -:100120001380019B1A8880231B011340BE4A01D112 -:1001300001F0ECFBBD49BE4C0B68BE4801330B60BF -:1001400023787F211D008D43BB49BC4E0D70E18893 -:10015000018000203080602633401370B84A2600AA -:10016000157083424DD0FF23B64CCAB22370B64BF4 -:1001700060701C600292707801380E2801D901F07D -:1001800073FB04F091FA0F003F06E00788081C0A91 -:10019000710B5C0B0409AD09F4091A0AB308E708EE -:1001A000EF08F708B078B3888C22192824D8802269 -:1001B000D20004F079FA1A0056007E015E023D0377 -:1001C000C6035904150531053D0545054D05560580 -:1001D0005F056D0575057D0585058A059E05B405D8 -:1001E000D505EA05010625033103B023974A5B03D1 -:1001F00051690B435361002222706A46944B128965 -:100200001A803378602259B2002901DB01F04FFBDC -:10021000134016D17278062A0FD17288110A02296A -:1002200001D101F023FB032901D101F025FB894A0B -:10023000012901D101F01BFB03936A46844B92898B -:100240001A80019B1A88844B1343844A1A40C023A6 -:100250009B015340019A9BB2138002F01FFE01F0F4 -:1002600047FB152B01D900F0BEFD18008023DB00F1 -:1002700004F01AFA160023002E00B90539004400D4 -:100280004F00B9055C00690073008000B905B9052D -:100290008D009A00A500B200BF00CC000A01140135 -:1002A0009022D20513686E490B4013608023D168F9 -:1002B0005B030B43D36000229EE790210123C90515 -:1002C0000A689A430A60CA681343CB60002293E726 -:1002D00090210423C9050A689A430A60CA68134337 -:1002E000CB60002288E790211023C9050A689A4351 -:1002F0000A60CA681343CB6000227DE79021402347 -:10030000C9050A689A430A60CA681343CB60002291 -:1003100072E79022D205136852490B401360802384 -:10032000D168DB040B43D360002265E79022D2053D -:1003300013684D490B4013608023D1685B010B4368 -:10034000D360002258E7042348490A689A430A60A8 -:10035000CA681343CB6000224EE79022D20513688F -:1003600043490B4013608023D168DB050B43D36006 -:10037000002241E79022D20513683E490B401360EA -:100380008023D168DB020B43D360002234E7902244 -:10039000D205136838490B4013608023D1685B0095 -:1003A0000B43D360002227E79022D205116833481F -:1003B00001401160D1680B43D36000221CE79022FA -:1003C000D20513682E490B4013608023D168DB01EE -:1003D0000B43D36000220FE79022D2051368214916 -:1003E0000B4013608023D168DB040B43D3600022F1 -:1003F00002E79022D205136822490B401360802344 -:10040000D1685B050B43D3600022F5E60123174951 -:100410000A689A430A60CA681343CB600022EBE67D -:10042000005C00408F0F0000F206002090040020C6 -:100430004860004096040020F00600209A04002046 -:10044000F1060020F40600202407002000100240DE -:1004500098040020D64600088081FFFF8FBFFFFF71 -:10046000FFFFEFFFFFFFFFFBFFEFFFFF0004004870 -:10047000FFFFFFBFFFFFFBFFFFFEFFFFFFFBFFFFD5 -:10048000FFBFFFFFFFFFFFEF1023D2490A689A4327 -:100490000A60CA681343CB600022ADE69021C9050B -:1004A0000A68CD4802400A60CA681343CB60002244 -:1004B000A2E6152B01D900F099FC180004F0F4F81D -:1004C000160021002C009604370042004D009604CF -:1004D000580063006D0078009604960483008E0037 -:1004E0009900A400AF00BA00C400CE009023DB0541 -:1004F0001968BA4801401960DA680240DA600022DF -:100500007AE690230121DB051A688A431A60DA68CB -:100510008A43DA6000226FE690230421DB051A6823 -:100520008A431A60DA688A43DA60002264E690231C -:100530001021DB051A688A431A60DA688A43DA6098 -:10054000002259E690234021DB051A688A431A608D -:10055000DA688A43DA6000224EE69023DB051968E8 -:100560009F4801401960DA680240DA60002243E6E1 -:100570009023DB0519689B4801401960DA68024046 -:10058000DA60002238E60421974B1A688A431A6021 -:10059000DA688A43DA6000222EE69023DB051968C8 -:1005A000924801401960DA680240DA60002223E6CE -:1005B0009023DB0519688E4801401960DA68024013 -:1005C000DA60002218E69023DB05196889480140AB -:1005D0001960DA680240DA6000220DE69023DB053C -:1005E00019687D4801401960DA680240DA6000222B -:1005F00002E69023DB0519687F4801401960DA683C -:100600000240DA600022F7E59023DB0519687448A0 -:1006100001401960DA680240DA600022ECE59023BC -:10062000DB051968754801401960DA680240DA6034 -:100630000022E1E501216C4B1A688A431A60DA68EE -:100640008A43DA600022D7E51021624B1A688A4398 -:100650001A60DA688A43DA600022CDE59023DB0570 -:1006600019685D4801401960DA680240DA600022CA -:10067000C2E5152B00D9BCE3180004F015F81600EC -:100680001F002700BA032F0037003F00BA034800BD -:10069000510058006100BA03BA036A0073007A007F -:1006A00083008C0095009C00A30090228023D2053B -:1006B00011685B030B43136000229DE59022012328 -:1006C000D20511680B431360002295E590220423A4 -:1006D000D20511680B43136000228DE59022102390 -:1006E000D20511680B431360002285E59022402358 -:1006F000D20511680B43136000227DE59022802310 -:10070000D2051168DB040B431360002274E59022CC -:100710008023D20511685B010B43136000226BE557 -:100720000423314A11680B431360002264E59022D0 -:100730008023D2051168DB050B43136000225BE5C3 -:1007400090228023D2051168DB020B431360002244 -:1007500052E590228023D20511685B000B431360A1 -:10076000002249E59021C9050B681A430A6000225E -:1007700042E590228023D2051168DB010B43136010 -:10078000002239E590228023D2051168DB040B4357 -:100790001360002230E590228023D20511685B05AA -:1007A0000B431360002227E501230F4A11680B4316 -:1007B0001360002220E51023064A11680B431360E2 -:1007C000002219E59021C9050B681A430A6000222E -:1007D00012E5C046000C0048FFFBFFFFFFFFEFFFE4 -:1007E000FFFFFFFBFFEFFFFF00040048FFFFFFBF1D -:1007F000FFFFFBFFFFFEFFFFFFBFFFFFFFFFFFEF5E -:100800008D22082B00D0F7E49022D20551683833AE -:100810000B4353600022EFE48D22082B00D0EBE461 -:1008200090224021D20553688B4353600022E3E4B9 -:10083000152B00D9E0E2180003F036FF16001B006C -:100840002100DE0227002D003300DE023A004000C6 -:1008500045004C00DE02DE02530059005F006500D7 -:100860006C00730078007D009023DB059A62002203 -:10087000C2E490230122DB059A620022BCE49023AB -:100880000222DB059A620022B6E490230422DB05F3 -:100890009A620022B0E490230822DB059A620022CB -:1008A000AAE4802290239201DB059A620022A3E44D -:1008B00090234022DB059A6200229DE40222D14B64 -:1008C0009A62002298E4802290231202DB059A6249 -:1008D000002291E4802290239200DB059A6200229C -:1008E0008AE490231022DB059A62002284E490239C -:1008F0002022DB059A6200227EE490238022DB0521 -:100900009A62002278E4802290239201DB059A62A9 -:10091000002271E480229023D201DB059A6200223A -:100920006AE40122B74B9A62002265E40422B64BC6 -:100930009A62002260E490232022DB059A62002262 -:100940005AE4152B00D95AE2180003F0ADFE160048 -:100950001B002100580227002D00330058023A00E6 -:10096000400045004D005802580255005C006300ED -:100970006A0072007A00800086009023DB059A618D -:10098000002239E490230122DB059A61002233E43E -:1009900090230222DB059A6100222DE49023042299 -:1009A000DB059A61002227E490230822DB059A6187 -:1009B000002221E4802290239201DB059A6100222B -:1009C0001AE490234022DB059A61002214E40222FB -:1009D0008C4B9A6100220FE4802290231202DB05E7 -:1009E0009A610022FFF708FC802290239200DB0529 -:1009F0009A610022FFF700FC90231022DB059A6128 -:100A00000022FFF7F9FB90232022DB059A610022E8 -:100A1000FFF7F2FB90238022DB059A610022FFF7AB -:100A2000EBFB802290239201DB059A610022FFF705 -:100A3000E3FB80229023D201DB059A610022FFF7BD -:100A4000DBFB01226F4B9A610022FFF7D5FB0422EA -:100A50006D4B9A610022FFF7CFFB90232022DB052C -:100A60009A610022FFF7C8FB02226270152B00D9A1 -:100A7000B1E0180003F004FE0B151EAF273039AFAC -:100A8000434C545DAFAF677079828C969EA69023DD -:100A90008022DB051B69D200134063800022FFF730 -:100AA000ABFB90230122DB051B691340638000220E -:100AB000FFF7A2FB90230222DB051B691340638032 -:100AC0000022FFF799FB90230422DB051B691340EA -:100AD00063800022FFF790FB90230822DB051B694F -:100AE000134063800022FFF787FB90238022DB0501 -:100AF0001B699201134063800022FFF77DFB902366 -:100B00004022DB051B69134063800022FFF774FB62 -:100B100002223C4B1B69134063800022FFF76CFBF1 -:100B20009023DB051B690022DB0BDB036380FFF7EF -:100B300063FB90238022DB051B69920013406380D6 -:100B40000022FFF759FB90231022DB051B6913409D -:100B500063800022FFF750FB90232022DB051B69F6 -:100B6000134063800022FFF747FB90238022DB05C0 -:100B70001B69134063800022FFF73EFB9023802215 -:100B8000DB051B699201134063800022FFF734FBF1 -:100B900090238022DB051B69D20113406380002271 -:100BA000FFF72AFB0122174B1B69134063800022C9 -:100BB000FFF722FB0422144B1B69134063800022C1 -:100BC000FFF71AFB90232022DB051B69134063808B -:100BD0000022FFF711FB00238D226370FFF70CFB4F -:100BE00080230A4ADB0251690B435361054A0849D5 -:100BF00013680B401360D168064B0B43D36000228F -:100C0000FFF7FAFA00040048000C00480010024008 -:100C1000FFFFAAAA00005555D34AD44913680B40D8 -:100C20001360D168D24B0B43D3600022FFF7E4FA84 -:100C3000CD4ACE4913680B4013600022FFF7DCFA5F -:100C4000C94ACB4B11680B4313600022FFF7D4FA5B -:100C5000C5491B024A69D2B213434B610022FFF718 -:100C6000CBFAC14B00221B691B0AA37001236370DE -:100C7000FFF7C2FA8023BF4A1B0351690B4353613C -:100C8000BD4ABE4B11680B4313600022FFF7B4FA54 -:100C9000B94ABA4BD1680B43D3600022FFF7ACFAD4 -:100CA000B54AB74913680B4013600022FFF7A4FA56 -:100CB000B14AB24B11680B4313600022FFF79CFA54 -:100CC000AD4A53610022FFF797FA8023A94A1B031C -:100CD00051690B435361A44AAA4B11680B4313603B -:100CE0009022D2051168A84B0B4313600022FFF736 -:100CF00083FA9D4AA34BD1680B43D3609023DB0555 -:100D0000D868A1490143D9601168A0480140116029 -:100D10001A689F490A401A600022FFF76DFAF8220C -:100D20008027914D98026969D20110403F025A0212 -:100D30003A4089051043890D0843902168611020CD -:100D40005D08C90528404A69924DDB012A400243EB -:100D50008020C001034013434B610022FFF74CFA8F -:100D6000C023844ADB0251690B4353617E4A8A4B9C -:100D700011680B4313609022A023D20511685B0316 -:100D80000B4313600022FFF737FA774A824BD16892 -:100D90000B43D3609023A021DB05D86849030143AE -:100DA000D96011687D48014011601A687C490A4089 -:100DB0001A600022FFF720FAFF216B489D0042696C -:100DC0002940784DDB002A400A4342619022C0202E -:100DD000D205C00051690340734801400B43536181 -:100DE0000022FFF709FA8D22FFF706FA8D22FFF79E -:100DF00003FA8D22FFF700FA8D22FFF7FDF98D220D -:100E0000FFF7FAF9B578B388022D00D1D2E005D802 -:100E1000002D5FD0012D63D096255DE0042D00D11B -:100E20005DE100D219E1802DF6D190230127402108 -:100E30008025DB05677099621A686D012A431A6084 -:100E4000C0465A481C691A680C4002401A60DA68A9 -:100E50000240DA60F022002C39D11A6802401A6090 -:100E6000DA681543DD601A6994461A690492C0462F -:100E70001A690592C046C0461A690692C046C04625 -:100E8000C0461A690792C046C046C046C0461D69A2 -:100E90001A6802401A60DA681040D860634622007F -:100EA0000B4214D1049B3A000B4210D1059B023235 -:100EB0000B420CD1069B03320B4208D10B00079961 -:100EC0000432194203D105321D4200D1D132384BD0 -:100ED0009A7002E100F0B4FF354B1D70FFF78DF9F9 -:100EE00000F0AEFF9023DB051A68204C2A431A60FD -:100EF00080229D61196852030A431A6080220421EE -:100F0000D2009A621A6800250A431A6002229A6186 -:100F100018680E3202431A604022996119680A4328 -:100F20001A6008229A6180231249DB024A6913433E -:100F30004B610D4B1A6822401A60D8680C4A104366 -:100F4000D860186820401860D8680243DA608023AF -:100F50004A691B0313434B61074B084A19680A434C -:100F60001A605D61B8E7C04600040048FFFFAAAA06 -:100F700000005555001002400008004855555555D1 -:100F8000AAAAAAAA0000505500010010FFFFAFAAAC -:100F9000FFFEFFEFEFBF000050550000AFAAFFFFBC -:100FA000FFFFEBFF03FF0000FFF90000FFEFFFFF73 -:100FB000F406002000F044FF90230121DB051A68AD -:100FC000CE4D0A431A601022996119680A431A60CB -:100FD000042240219A611A680A431A6008229A6121 -:100FE00080229961196852010A431A608022C4491B -:100FF000D202486902434A61C24A10682840106020 -:10100000D468C1480443D46014682C401460D46888 -:101010002043D06080204C69000320434861BB48D6 -:10102000BB4C05682C43002504604561C0204C6919 -:10103000C002204348611068B64901431160A021F5 -:101040001868490301431960B3485169014051616F -:101050005A69B2490A405A613EE7DBB2022B1ED000 -:101060000025032B00D137E7012B6AD18022A44948 -:101070001203486902434A61A44A11689943116006 -:10108000D1681943D1605168194351609361116867 -:101090000B431360A24B1D70A24B1A601CE7B023D8 -:1010A000974A5B03516940200B4353619023DB0552 -:1010B0001A689D490A401A608022D968520111437A -:1010C000D960596801435960986119680A43082139 -:1010D0001A60934A1170934A13600025FCE6DBB254 -:1010E0009825012B00D0F7E6902106220A208F4B8D -:1010F000C90519608E4B1A70824B8E4A13608E4A56 -:1011000010708E4A013013608D4A10708D4A013084 -:1011100013608D4A10708020794A0003546920437F -:1011200050611C688948204318600868884B034355 -:101130000B60B02351695B030B43536100F0A4FDC6 -:10114000CBE79725C8E6B578F178B088062D2BD087 -:101150000FD8022D2FD005D8002D20D0012D27D05B -:10116000A0251EE0042D29D0052DF9D102F014F898 -:101170001CE0822D52D009D8802D23D0812DEFD1B3 -:101180000123637001F01AFEA0700FE0832D4AD096 -:10119000842DE5D10123637002F026F8F4E701F015 -:1011A00051FE2570FFF729F801F028FE0025F8E729 -:1011B00002F036F8FAE701F0CBFDF7E7002201F084 -:1011C000CFFFF3E7012290236270DB051968564DCB -:1011D00029401960D9682940D96080210225C900B9 -:1011E00099629A619D61494D6861C046C04600B2EE -:1011F0009961002800DA9A62C046C046C046C046DF -:10120000C046C046902280213E4BD205C9001B69D2 -:10121000916201211B0A9161A370C7E701236370EA -:1012200002F026F8B0E70123637080239027374946 -:101230001B014B61FF053B6980229BB218009200A5 -:101240001040844680204D69C000EDB228434861BB -:10125000396989B208000B4310401021134218D09D -:101260000200531E9A416346591E8B41D2B2DBB233 -:10127000002A02D01121002B0BD16146002902D196 -:101280001231002A05D1002802D11321002B00D1F0 -:10129000FF21A1708AE7B378B088012B21D0002B01 -:1012A00003D0022B18D0AA2313E0FF22154D87008C -:1012B00069693A40184FC00039400A436A61902179 -:1012C000C025C905ED004A690540144802402A437B -:1012D0004A612370FEF791FFF17801F0FBFE0023D5 -:1012E000F7E7637001F01CFFA070F8E7B278002AFE -:1012F00048D00023012AECD0AF23EAE7FFFFAAAAD7 -:101300000010024000040048000055550008004845 -:10131000555555555055000003FF0000FFF90000DA -:1013200000070020FC060020FFEFFFFF140700204D -:10133000180700200C070020100700201C070020C1 -:101340002007002004070020080700200000505557 -:1013500000010010B278002A14D00023012AB8D06E -:10136000B023B6E7B278002A0CD00023012AB0D00F -:10137000B123AEE7B278002A04D00023012AA8D016 -:10138000B223A6E701236370A933A370A7E7B5785A -:10139000F278B188112D00D19BE007D8012D6BD0D8 -:1013A000002D0FD0022D7DD08225FAE6212D00D10F -:1013B00085E0222D00D188E0122DF5D102231020E6 -:1013C000637089E001252900BE4ABF4F12783B684F -:1013D000914099625A6810208A435A6001F06EFE6B -:1013E0002900B84B3A681B78042799400B0091619B -:1013F000516804950B435360FA20400001F05EFEF3 -:10140000B04A04991278FA209140AF4D40002B6801 -:10141000013F99625A68BFB28A435A6001F04EFE9A -:10142000A84B04991B782A6899400B009161516878 -:101430000B435360002FDFD10425FA2001F03EFE5C -:101440000121A04AA04F12783B68914099625A68E6 -:10145000FA208A435A6001F031FE0121994B3A6823 -:101460001B78013D99400B0091615168ADB20B436F -:101470005360002DE1D194E62900924A924F1278F0 -:101480003B68914099625A6810208A435A6001F083 -:1014900015FE8C4A3B68127895409D615A68154349 -:1014A0005D6083E60123874A637012788749934021 -:1014B000854A9BB21268002001F0FAFF64E601231E -:1014C0000020637001F04AFD5EE601231020637086 -:1014D000F8E702230020637001F09AFD608065E662 -:1014E000B378B288042B1AD006D8022B1CD021D88E -:1014F000012B0FD08723ECE6072B24D003D8052B34 -:10150000F8D1734B14E0082B22D0802BF2D100F0DD -:10151000BBFBE4E66F4A1278A2706370DFE66E4BA5 -:101520001B78A3700123F8E76A4B1A7083226A4B79 -:101530001A70D4E6674B684D1A7083232B7000F045 -:1015400013FC2B78EDE7654B1A70120A5A70C6E649 -:10155000624B1A78A2705A78E2709A782271DA781F -:1015600062711A79A2715B79E3710623D5E7B378CA -:10157000B288022B15D0032B16D0012B1BD10248A9 -:1015800085460248001C004778120020C5CAFF1F8C -:10159000060005000800070019C9FF1FEFBEADDEF9 -:1015A0009DE64F4B1A609AE64D4B186800041043B5 -:1015B00001F076FF93E68A238BE6882389E6B278EA -:1015C0001300303B2F2B19D8F078032800D9EEE018 -:1015D00003F056F814021012424B512A00D197E042 -:1015E00024D8312A54D00BD8002A34D0302A4AD0FB -:1015F000B42346E03C4BF0E73C4BEEE73C4BECE7DA -:10160000332A4FD049D3502AF2D100222270063219 -:1016100062701A7AA270DA78E2705A7A22719A7A33 -:1016200062719A78A2715B7CE37146E07F2A00D9EF -:10163000A3E0702A00D37BE0602A36D0612A5FD015 -:10164000522AD5D100221B882270A37002321B0AB5 -:101650006270E37031E0FF23264953540132102AAF -:10166000FBD1204A2249D3709370204ACB70D370AB -:10167000937001228B701C49CB708B701E4B1A70BB -:101680000023237019E0B288110AD9721A73F7E7A0 -:10169000B288110A59739A73F2E7B288110AD973A2 -:1016A0001A74EDE7B2885A74EAE700232370013315 -:1016B0006370B3880F4AD35CA370104B1C60FEF7B5 -:1016C0009CFDC04600070020FC060020040002002C -:1016D000DD040020BC040020DE040020BD04002046 -:1016E00030040020480400205C0400207004002026 -:1016F00034040020DF0400209C0400202407002084 -:101700000023237001336370B84B1B68DB78D3E789 -:101710000022227006326270DA7AA2701A7BE270BE -:101720005A7B22719A7B6271DA7BA2711B7C7BE708 -:10173000AF4BAE495C6833787F2B00D936E1684601 -:10174000AC4B007A18700868C378002B0ED00020CC -:101750000290982B05D131E100200290D02B00D1CE -:101760002CE1A54B10301870FF2304E0A34B186048 -:101770009023C3706F33029320E1072010400328A9 -:1017800015D802F07DFF160218129D4B802A94D3C3 -:10179000872A12D97032D2B2072A8ED8002222703C -:1017A000F2789A72B2881A8087E7964BEEE7B523F3 -:1017B00067E78F4BEAE7944BE8E7B188F0780A0ACD -:1017C000C9B245189446BE22102D2DDC04320028E3 -:1017D0002AD0DD78033AFF2D26D19D780132FF2DE6 -:1017E00022D10022D5B2A84220D862464501013D4F -:1017F0001D724D012F009A700022844DDA70ED1990 -:101800005A729A721A80DA721A735A739A73DA7366 -:101810001A745A745D607E4B591863468B540132BA -:10182000D3B29842F9D80022227046E701328D18CF -:10183000774F013D7D5DFF2DD4D0C122F4E7B27812 -:10184000002A04D0402A07D0D222227036E7227024 -:10185000B188694A117031E700222270013262704A -:10186000654A1278A27029E7802332E5694A6A4BFB -:101870001A601223FEF7E0FCD2B2012A11D0002A2E -:1018800009D0022A01D0FEF7D7FC634B634A1A60E5 -:10189000634BFEF7D1FC604B624A1A600423FEF7EB -:1018A000CBFC5D4B604A1A60604BFEF7C5FC1342EF -:1018B00008D17378052B05D173885D4A13705D4A92 -:1018C000DBB21380019B5C4A1B88019913405B4A81 -:1018D00013439BB20B800021594B1980019B1B883D -:1018E0001A43584B1A40584B5A40019B92B21A80E7 -:1018F000564BDA8F520507D58021554A11800022B8 -:10190000DA87544B019A138009B0F0BD1278402A4F -:10191000EED1514A1278002AEAD1504A1088374A4B -:10192000C0B211684D7A4E68DAB25419E4B29042EE -:1019300018D84A7A82184A722E4A13781B1ADBB2D8 -:101940001370002B01D19833CB70019B1A883B4B4D -:101950001343434A1A40C0239B015340019A9BB250 -:101960001380C5E73F4A9A18127801333255DBE7F6 -:10197000019B1B881B06BBD5019B3B4A1B88134060 -:10198000802212021343019A1380384B1B78802B5C -:1019900001D1FEF762FC264A1378002BA8D08021E3 -:1019A0000B432B490B8000231370A1E70868C37811 -:1019B000D82B00D0D0E680234468C3700B68002188 -:1019C0005972DB78902B00D077E6712A00D074E64C -:1019D0000A4BB2881B6859680A70B2885968120AA3 -:1019E0004A705A7A02325A7267E6C046840400206E -:1019F000340400208C0400209C0400208804002073 -:101A000048040020700400205C040020F004002042 -:101A1000DF040020C44600082407002040470008D7 -:101A20001E030000E8460008EC4600082A030000F8 -:101A300094040020506000408F8EFFFF8080FFFFE5 -:101A400002600040BFBFFFFF30300000065C004076 -:101A50004C5C004020320000F1060020066000408F -:101A60008FBFFFFF486000400F8FFFFFF006002090 -:101A7000F0B5404B8BB0089119783F4B09921B7819 -:101A8000019002933D4B019D1C683D4B3D481A78E7 -:101A900001231E0096403C4AA662102D5ED11278AA -:101AA00000689340836201200200364B05901F6856 -:101AB000354B1B789A4003920200344B1B68069307 -:101AC000334B1B789A4093B202000793314B1B684B -:101AD0009C46314B1B789A40002304921A000198CF -:101AE000202806D1029D05981D4105423ED003984D -:101AF000B861089820280FD1002B01D11E488354CB -:101B0000069805690798054206D01B48855C05982C -:101B1000984005431848855409980139C9B20028EE -:101B200002D0002900D1A6616046049D0133DBB2DA -:101B300085618562082B05D101320F4BD2B29B5CC7 -:101B4000029300230029CAD10E4B1A680E4B197854 -:101B500001238B409362A6620BB0F0BD019D112D55 -:101B6000A1D112780068934083619CE70398B86222 -:101B7000BFE7C046DD040020BD0400201C07002094 -:101B8000200700200C070020100700201407002069 -:101B9000180700200407002008070020F7B51F4B96 -:101BA0001F491A781F4B10282ED101241E780D686A -:101BB000B440AC62012635000C6831001B780196F8 -:101BC0009D40194B1B680093184B1B7899400023CC -:101BD0008C46190020280DD1154E019F765C1E41C0 -:101BE0003E4219D0A5610133DBB2082B02D100239C -:101BF0000131C9B26646009F013AD2B2BE61BE62EF -:101C0000002AE7D1A562F7BD1128D3D101241E789F -:101C10000D68B440AC61CDE7A562E4E7DD040020C7 -:101C20001C070020200700200407002008070020D0 -:101C3000BD040020022907D10F4B104A984218D04A -:101C4000904209D1180007E0032906D10A4B0B493D -:101C50000B4A98420BD1080070470429FCD1064B6F -:101C6000064A984205D006499042F4D0054A884277 -:101C7000E6D11000F0E7C0463404002048040020FC -:101C80005C04002070040020F0B52C4B85B019686E -:101C90002B4B2C481B7800780193012302901E00E7 -:101CA00018001F00019A029C9640A040264D274A2A -:101CB0002D781268AF408E628446906224489D4021 -:101CC00000688762046803941C00AC402500039CF4 -:101CD000254305604568019CBD4345609C401D004F -:101CE000A54008681C00284308604868B043486065 -:101CF0001068029999408C402100014360461160B0 -:101D000051688143134851600078134A98408340DA -:101D100012681248116899431160D1680B43D3606F -:101D200080220F4B1A70002319000E4A13701A18E4 -:101D300001331170202BFAD105B0F0BD1C07002033 -:101D40002007002010070020080700200C070020B3 -:101D5000040700201807002014070020BD040020FD -:101D6000DE040020DD04002010B5334B1B78082B67 -:101D70005DD016D8314C032B44D007D8012B2DD081 -:101D8000022B31D0EE222D4B1A7023E0062B44D0CB -:101D900049D8042BF6D18123012223702021112060 -:101DA00027E00F2B34D008D8244C0D2B25D00E2B38 -:101DB000E8D181230022237027E0802B08D01F4C1C -:101DC000FF2B08D0102BDDD181230022237027E0C8 -:101DD000FFF75AFF10BDF0232370FBE7812320207B -:101DE0002370FFF7DBFE06E0812301220021237030 -:101DF0002020FFF73DFE8223EEE78123002223709F -:101E00001100F5E781230122237020211020F0E743 -:101E100081230A4C00222370C0E781230122237012 -:101E200020210800E5E7812310202370D9E78123D2 -:101E3000024C11202370D4E7BC040020DE040020F3 -:101E4000BC22444BD203996A70B50A439A629A6ADB -:101E50004149424C0A409A628022596912030A435E -:101E60005A613F4A3F4910683F4E0843106010686E -:101E7000204080241060D068E4020143D1605A6998 -:101E800022435A61394A116831401160D568384996 -:101E90000D43D560106830401060D0680143D160B8 -:101EA000B02158694903014359619023DB05196842 -:101EB0003048014019608021D8684903014301205E -:101EC000D960196881431960D9680143D960042138 -:101ED0001D688D431D60DD680D43DD6010251E68A3 -:101EE000AE431E60DE683543DD6040251E68AE43AC -:101EF0001E60DE683543DD601D681F4E35401D6085 -:101F00008025DE68ED043543DD601D681B4E3540DD -:101F10001D608025DE68ED053543DD601D68184EC7 -:101F200035401D60DD682C43DC601468154D84432A -:101F30001460D4682043D0601C682C401C60D868B2 -:101F40002840D86013688B431360D3681943D1606D -:101F500070BDC04600100240FFFFA1FFAAAAAAAAB6 -:101F60000008004855555555FFFFAAAA000400482F -:101F700000005555FFFFEFFFFFFFFFFBFFFFFFBF17 -:101F8000FFFFFBFFFFEFFFFF9022DA4B1203196800 -:101F9000F0B50A431A60802289B092021968114292 -:101FA000FCD0012259680A435A60802259685202C3 -:101FB0000A435A608022596852030A435A608022B9 -:101FC000196852040A431A60802292041968114267 -:101FD000FCD011210220C84A11605A680E398A4388 -:101FE00002435A601A6B7D310A431A638022DC690E -:101FF00012042243DA6162B6C04B4025DA8FC04C2E -:102000008243DA87DA8F01388243DA870022BD48BB -:10201000C2872280BC4C2580BC4C08352580802599 -:10202000BB4C6D012580BB4C2180C287BA49BB4A9D -:1020300011808021BA4A090611608022D98FD2000E -:102040000A43DA87B74AB84B1A80FFF7F9FEF02245 -:10205000B64B1A70B64E2023327811009943D2291C -:102060002ED1B449B448C978C3780224FF2904D1D9 -:10207000FF3B1C00631E9C41E4B2B04BDB78FF2B9E -:1020800000D00324AE4BDB78FF2B00D00424AD4BF3 -:10209000AD4F1C703860D22A12D10023012505E013 -:1020A0002100FFF7C7FD01230135EDB2A542F7D3AB -:1020B000002B00D0386080223B68DA70D023337068 -:1020C0003378F22B05D10022023B33709E4B1B6804 -:1020D000DA703578D02D01D000F0E3FD9A4E3068EB -:1020E000C378802B01D000F0DCFD964B1978FFF708 -:1020F000A1FD002330600400C57006884372C07AD9 -:10210000F5B21038042801D900F0C9FD02F0CCFA6C -:1021100005006E0028012C01E700E27B012A0DD1A9 -:1021200080201021000201F01BF80F21E020B609E9 -:10213000F6B231400022000201F012F8E37B032BDB -:102140000FD120883D3380099D43804BC1B2C0B27E -:10215000C01880B200F0FCFD8021237AA2782943C8 -:1021600034E01E2B07D1C0202188223389099D43EA -:10217000C9B20002EEE7222B01D00B2B07D1208839 -:10218000C009C1B2C0B26C3880B200F0E1FDE37B9F -:102190001C2B11D1A0208121C001268800F0D8FD80 -:1021A0008020F609F6B23100000200F0D1FDA02037 -:1021B0000021C00100F0CCFD8023E27B5B421F2A9E -:1021C00008D01D43EDB22900237AA278606801F09F -:1021D000FDF883E07022A0202188954309091D4362 -:1021E000C9B2C001EDB200F0B3FDECE7E37B002B18 -:1021F00006D1237AA2782900606801F01DF9607287 -:10220000E37B0B2B0FD12188514849090901C9B241 -:1022100000F09EFD1F231D40A278237A29006068EC -:1022200001F00AF96072E37BFE2B3ED12188494818 -:102230004909C9B200F0F4FF1F231D40237AA17899 -:102240000293454B28025A696768D2B202435A6129 -:1022500080209022C000D20590610120FF2690626C -:10226000033090625A69360232400A435A61C046CE -:102270003A4800228446C046604600690131000A9F -:10228000B8545869C9B230400843586101320298C5 -:10229000D2B29042EFD290230421DB0599618021D4 -:1022A000C9009962012199616272E27B012A16D10B -:1022B000802010210002268800F052FF1F21A0205C -:1022C0003609F6B231400022000200F049FF0F212A -:1022D000237AA2782940606801F0AEF860721A4B48 -:1022E0001B6819889A7A52181A80D822DA7000F07E -:1022F000D8FCC0460010024000200240025C0040B2 -:10230000505C0040065C00400060004004600040FB -:10231000066000404C5C004020320000005C004041 -:1023200000E100E00080FFFF585C0040DE04002078 -:102330009C04002048040020340400205C04002099 -:1023400070040020280700208404002069FDFFFF9E -:10235000FFFF0000FF3F00000008004800040048A5 -:10236000237AA2786021FAE6E37B002B4BD18033FD -:10237000F6091D43F3B20393FF27DE48039B42692E -:10238000DD499B000A403B4013434361039B902679 -:10239000D900C023F605DB0072690B40D7490A401B -:1023A000134373616368A2789C46237A0293D44BEB -:1023B00059690F402902394359610421B162033937 -:1023C000B162FF265969360231401143596100213B -:1023D000C046C046C046C0466746056901322D0A60 -:1023E0007D545D69D2B2354015435D610131029D76 -:1023F000C9B28D42ECD290230422DB059A61033AE4 -:102400009A6161726BE7012BB6D14021B604B60E1A -:1024100031430391B0E7E37B002B09D18020029B7D -:10242000B84A1843B84BB9490093230000F03CFF69 -:10243000E27B012A1BD18020238810219B051B0FE2 -:102440000002049300F08CFEE020002204990002B8 -:1024500000F086FE8023029A657A13431B021BB2AA -:10246000AFB20793237ABB4200D3EBE06572E37B04 -:10247000032B0ED1029A3C331A401300802220888D -:10248000134302938009C0B29F4B2200029900F0CF -:102490003FFFE37BFD2B0ED1029ABE3B1A40130097 -:1024A00080222088134302938009C0B2984B2200F7 -:1024B000029900F02DFFE37B1E2B15D1029A2133E8 -:1024C0001A40130080221343029323889B09DBB236 -:1024D0000693029B657A1B021BB2AFB20793237A65 -:1024E000BB4200D322E16572E37B222B01D00B2B90 -:1024F00011D12088C009C1B2C0B26C3880B200F0DE -:1025000027FC8020029B7F4A18437F4B7F49009322 -:10251000230000F0C9FEE37B0C2B1AD1029A13337F -:102520001A401300C0208022258813436D09A5217D -:10253000C001EDB2029300F00BFC2900754800F0D9 -:1025400007FC754B754A009375492300029800F00B -:10255000ABFEE37B1C2B3AD1A02023888121DB0931 -:10256000DBB2C001049300F0F3FB80200499000269 -:1025700000F0EEFBA0205421C00100F0E9FBAA21ED -:102580006848677A00F0E4FB5521674800F0E0FBFB -:102590002021644800F0DCFB8023029ABEB2134382 -:1025A0001B021BB20793237AB34200D30CE18020B5 -:1025B00090210002677200F0CBFB80200021000216 -:1025C00000F0C6FB8020F021000200F0C1FBE37B9D -:1025D0001F2B30D1A0202188C0010909C9B200F009 -:1025E000B7FBAA214F48657A00F0B2FB55214E484F -:1025F00000F0AEFB20214B4800F0AAFB7023029AAA -:10260000AFB29A43F03B13435BB21B020493237AAD -:10261000BB4200D31EE1802090210002657200F0D1 -:1026200097FB80200021000200F092FB8020F02127 -:10263000000200F08DFBF4232288E370A37A9B183C -:10264000238050E3802000221021000200F088FD4A -:10265000AA21334800F07CFB5521304800F078FB7C -:10266000A0212F4800F074FB079E63682E43B6B28A -:10267000595D300000F06CFB802001221021000227 -:1026800000F06EFDE02000220499000200F068FDD9 -:10269000C046300000F092FB0690300000F08EFB48 -:1026A000069B8342F4D16368069A5B5D114E9342A8 -:1026B0000DD10423326801359A433260F268013744 -:1026C0001343F3600223EDB2BFB2B362CAE68020C7 -:1026D00001221021000200F043FDE02000220499B5 -:1026E000000200F03DFD04233268134333600223EF -:1026F000B361B7E60004004803FF0000FFF90000E3 -:1027000000080048AA2A0000452E00085555000080 -:10271000FD2D0008FFFF0000512D0008AAAA0000AF -:1027200055D50000AA8A000055850000C02001216F -:10273000000200F00DFBAA21E04800F009FBC020D8 -:102740000021000200F004FB5521DD4800F000FBF1 -:10275000C0200121000200F0FBFAA021D74800F0C0 -:10276000F7FAC0200699000200F0F2FA079E6368AB -:102770002E43B6B2595D300000F0EAFAC046300090 -:1027800000F01CFB0490300000F018FB049B834217 -:10279000F4D1636804995A5DCA4B8A420DD1042270 -:1027A0001968013591431960D96801370A43DA6025 -:1027B0000222EDB2BFB29A6291E6042219680A437E -:1027C0001A6002229A618AE6A0205421C00100F01A -:1027D000BFFA079DA0213D43ADB2280000F0B8FA32 -:1027E00063682800D95D00F0B3FAC046280000F005 -:1027F000E5FA0690280000F0E1FA069B8342F4D146 -:102800006368069ADB5DAF4D93420DD104232A68BD -:1028100001379A432A60EA6801361343EB600223CA -:10282000FFB2B6B2AB62BEE6A0208121C00100F0CB -:102830008FFA80200499000200F08AFAA020542127 -:10284000C00100F085FA04232A6813432B60022399 -:10285000AB61A8E6049EA0212E43B6B2300000F082 -:1028600077FA63683000595D00F072FAC0463000B4 -:1028700000F0A4FA0290300000F0A0FA029B83421C -:10288000F4D1636802995A5D8E4B8A420DD10421BE -:102890001A6801358A431A60DA6801370A43DA6038 -:1028A0000222EDB2BFB29A62B1E604211A680A436D -:1028B0001A6002229A61AAE6E37B002B09D1029BEF -:1028C000657A1B021BB2AFB20693237ABB4243D296 -:1028D0006572E37B0B2B10D1029A14331A402388C4 -:1028E00002925B091B01657ADBB206931302AFB259 -:1028F0000793237ABB4269D26572E37BFE2B00D03B -:1029000099E6218870484909C9B200F089FCAA21DA -:102910006E48657A00F040FC55216D4800F03CFCA3 -:1029200020216A4800F038FC1F23029AAFB21A40F7 -:1029300013020493237ABB4200D395E06572902181 -:10294000002000F029FC0021080000F025FCF02107 -:10295000002000F021FC6EE6AA215E4800F060FC39 -:1029600055215A4800F05CFCA0215A4800F058FC60 -:10297000069E63682E43B6B2595D300000F050FCED -:10298000C046300000F074FC0490300000F070FC91 -:10299000049B8342F4D1636804995A5D494B8A428F -:1029A0000DD104221968013591431960D9680137A6 -:1029B0000A43DA600222EDB2BFB29A6285E70422CE -:1029C00019680A431A6002229A617EE7802020215A -:1029D000000200F0BDF9AA213E4800F021FC802051 -:1029E0001021000200F0B4F95521384800F018FC1D -:1029F00080202021000200F0ABF9A021354800F032 -:102A00000FFC80200699000200F0A2F9079E63687F -:102A10002E43B6B2595D300000F002FCC0463000D3 -:102A200000F026FC0490300000F022FC049B83425E -:102A3000F4D1636804995A5D224B8A420DD1042275 -:102A40001968013591431960D96801370A43DA6082 -:102A50000222EDB2BFB29A624BE7042219680A4320 -:102A60001A6002229A6144E7049EA0212E4330009E -:102A700000F092FB63683000595D00F08DFBC046AA -:102A8000300000F0B1FB0290300000F0ADFB029B83 -:102A90008342F4D1636802995A5D0A4B8A421BD182 -:102AA00004211A6801358A431A60DA6801370A433B -:102AB000DA600222EDB2BFB29A623BE755950000A0 -:102AC000AAAA000000040048FF3F0000AA0A000074 -:102AD000550500005515000004211A680A431A60C4 -:102AE00002229A6126E7E27B002A50D1D9B28032D5 -:102AF000DB091143DBB202910593824DFF266A691F -:102B00008149C0200A409021059BC9059B003340A4 -:102B100013436B61059BC000DB004A6903407B489F -:102B2000024013434B61677AC046C046C046C04668 -:102B3000C046C046C046C046C046AA21744800F000 -:102B4000C9FA5521734800F0C5FA2021704800F0F9 -:102B5000C1FA029B06961B021BB20793FBB20293BB -:102B6000237ABB421BD26B4680201B7A9021637272 -:102B7000000200F0AFFA80200021000200F0AAFA63 -:102B80008020F021000200F0A5FAC04653E5012A9A -:102B9000B3D19B049B0E3F321A430592ADE72A68DE -:102BA0005D4B082113432B60069A6B691340A022EA -:102BB000120213436B6190230122DB0599629A6232 -:102BC000C046C046C046C04699619A612B68534AC8 -:102BD000069E13402B60079B3E40029A1E4363688B -:102BE000B6B2995C300000F075FAC046C046C046E7 -:102BF000C046C046C046C046C046C046C04630007B -:102C000000F08EFA0490C046C046C046C046C0469A -:102C1000C046C046C046C0466368029A9B5C834279 -:102C200017D0C046C046C046C046C046C046C04693 -:102C3000C046C046300000F073FA049B98420BD1A6 -:102C4000C046C046C046C046C046C046C046C04654 -:102C5000C0460137BFB281E7C046C046C046C04645 -:102C6000C046C046C046C046C046C046C046C04634 -:102C7000C046C046C046C046C046C046C046C04624 -:102C8000C046C046C046C046C046C046C046C04614 -:102C9000C046C046300000F043FA0490CAE7C323A0 -:102CA000E3701F4B1D78F02D1DD11E4E3468E37864 -:102CB000982B18D11C4B20001978FEF7BBFF00237E -:102CC0003060C3702388E570DAB20292E07A10387F -:102CD000042806D801F0DEFC9FFBF0FDAFFC07FFE7 -:102CE000AFFCC323E370114B1B78F02B01D1FFF72E -:102CF000B1F9832B01D0FFF7ADF9FFF735F8FFF7F6 -:102D0000A9F9C0460004004803FF0000FFF90000D5 -:102D1000AA8A00005585000000005555FFFFAAAAA9 -:102D20009C0400208404002028070020DE040020EA -:102D3000002302000002002A04D1002B01D08023CE -:102D400018437047DB43511EDBB20A40F3E7000033 -:102D50009023DB0530B51C68134D09022C401C6024 -:102D6000DA68124C2A40DA60114A506102229A62F3 -:102D7000104A00B215682C4314605469E4B2214330 -:102D800051618021C9009961002801DA012098620F -:102D9000C046C0469962012199614918996113683A -:102DA00005490B40136030BDFFEFFFFF0000555594 -:102DB0000008004800040048FFFFAAAA0D4B80222B -:102DC00058619023D200DB0500B29A61002801DA35 -:102DD00001229A62C046C046C046C046064B8022C9 -:102DE00018699023D200DB059A620122000AC0B262 -:102DF0009A61704700080048000400480D4B0E4AD5 -:102E000058610E4B0902186802431A605A69D2B21F -:102E10001143902259618021D20510684901014374 -:102E200011604021916291611A6805490A401A6057 -:102E30007047C0460008004800005555000400488F -:102E4000FFFFAAAA104B114A10B558611068104B29 -:102E500009020343136053690E4CDBB219439023FC -:102E600051618021DB051868490108431860402042 -:102E70009862186820401860D8680143D9601368C8 -:102E800005490B40136010BD0008004800040048CD -:102E900000005555FFEFFFFFFFFFAAAA224B10B518 -:102EA0001968224B224C1A8852085200505A214A63 -:102EB00010801A88023292B21A8052085200505A78 -:102EC0001D4A10801A88023292B21A8052085200AB -:102ED000505A1A4A10801A881948023292B21A803F -:102EE00052085200515A174A11801A88218802321A -:102EF00092B21A808A4210D908318A1A92B202809C -:102F000022881A801049114B0A881343104A1A402C -:102F1000302353409BB20B8010BD0E4C21888A4257 -:102F2000EAD808230380EDE7240700209A04002054 -:102F3000980400204060004042600040446000402F -:102F40000260004046600040005C00408080FFFF5F -:102F5000BF8FFFFF96040020FEE70000F7B50123B6 -:102F60000225294F01923A780091054393400421AC -:102F7000A020264E2D049BB229433268C00100F0E8 -:102F800097FA040001283DD13B7809209C40054375 -:102F90007830A3B232682900FF3000F089FA0400CB -:102FA00001282FD13B7832689C402900A3B2002031 -:102FB00000F07EFA0400012824D1009B180AFFF7D4 -:102FC000B7FE3B7832689C402900A3B200F070FA4B -:102FD0000400012816D16B461878FFF7A9FE2200DD -:102FE0003B7829009A4093B2326800F061FA019868 -:102FF000FFF79EFE3B7832689C402900A3B200F0A8 -:1030000057FA0400E0B2FEBD00070020FC060020D5 -:10301000F7B501230225274F00903A780191054327 -:1030200093400421C020244E2D049BB229433268D2 -:10303000800100F03DFA0400012838D109231D4326 -:103040003B78C0209C403268A3B22900400000F0C9 -:103050002FFA040001282AD13B7832689C402900CD -:10306000A3B2002000F024FA040001281FD1019B24 -:10307000180AFFF75DFE3B7832689C402900A3B236 -:1030800000F016FA0400012811D16B461879FFF7F9 -:103090004FFE22003B789A4093B2009A14430922D3 -:1030A000E1B209041143326800F002FA0400A0B250 -:1030B000FEBDC04600070020FC0600200023800063 -:1030C00080B2834200D17047C046C04601339BB2F4 -:1030D000F7E700000E4B0F4A58610F4B09021868C2 -:1030E00002431A605A690820D2B2114390225961F2 -:1030F0000121D20590629162C046C046C046C046DA -:10310000906191611A6805490A401A607047C0468B -:10311000000800480000555500040048FFFFAAAA17 -:103120000D4B0122586190230421DB059A629962BC -:10313000C046C046C046C046C046C046C046C0465F -:10314000C046C046C046C046C046044800699961B2 -:10315000000AC0B29A6170470008004800040048A5 -:1031600070B506000D00002A08D080200002FFF78D -:1031700025FE802080210002FFF7EAFD05243000B3 -:10318000013CFFF71BFEE4B229003000FFF7E0FD31 -:103190006D08002CF3D170BD0F4B30B590225861F3 -:1031A00080230124D205DB0093620C4B94621D68DE -:1031B0000B480902284318605869C0B2014359619D -:1031C000C04608219162C0469161196805480140D6 -:1031D0001960946130BDC0460008004800040048F2 -:1031E00000005555FFFFAAAA0B4B10B5802158616E -:1031F000902301220424DB05C90099619A629C6234 -:10320000C046C046C046054800699C61000A9962F4 -:10321000C0B29A6110BDC0460008004800040048D2 -:103220000E4B984202D880231B0218430C4B0D4AC8 -:1032300058610D4B0902186802431A605A69D2B2EC -:1032400011435961C04690220821D2059162C046BF -:1032500091611A6805490A401A607047FF1F000013 -:10326000000800480000555500040048FFFFAAAAC6 -:103270000A4B984202D880231B021843084B0422B1 -:1032800058619023DB059A62C046C046C046C046DE -:10329000044908699A61000AC0B27047FF1F000024 -:1032A0000008004800040048F0B585B00191039281 -:1032B00000025E7A1D0003B202932B7AF7B2B3428A -:1032C00003D200206F7205B0F0BDFF24AA2101983F -:1032D0000A9B9847552103980A9B9847A02101987B -:1032E0000A9B9847029B34401C436B68A4B2D95D8B -:1032F00020000A9B9847C0462000FFF75FFD0700AB -:103300002000FFF75BFD8742F5D10136B6B2D4E766 -:10331000F0B5150085B00190547A09021E000BB279 -:10332000A7B203932B7ABB4203D200206C7205B084 -:10333000F0BD00212048FFF70BFDAA211F48B04730 -:1033400055211F48B047A0211C48B047019B1D4A8A -:103350001900981880B2FFF7FBFC039B23439BB234 -:1033600000936B680098195DB047C0460098FFF75E -:1033700025FD02900098FFF721FD029B8342F4D1C6 -:103380006B6802991A5D104B8A420DD104221968AC -:10339000013491431960D96801370A43DA60022287 -:1033A000E4B2BFB29A62BDE7042219680A431A6008 -:1033B00002229A61B6E7C04669FD0000555500003B -:1033C000AA2A000069FDFFFF00040048F0B5184C70 -:1033D000050060690E02C0B2304360618026902013 -:1033E000F600C00549B28661002901DA0121816237 -:1033F000FF2661693602314011436161C0460020F9 -:103400000C4FC04639690132090A29546169D2B2A8 -:10341000314001301143C0B261619842F1D990232B -:103420008022DB05D2009A6201229A61F0BDC0467B -:103430000008004800040048F0B5174C05000E00D5 -:1034400060691F2925D8802131430902C0B2014398 -:10345000616190210420FF26C905886261693602F6 -:10346000314011436161C04600200C4FC0463969AC -:103470000132090A29546169D2B231400130114345 -:10348000C0B261619842F1D990230422DB059A61B0 -:10349000F0BDC0B20902DAE70008004800040048A5 -:1034A0008047C0460000000000000000000000004F -:1034B000F0B5474680B4061C081C000C102801D546 -:1034C000162700E004270007000F8046FF20014078 -:1034D0005468251C1D439C43F60313850AD5C0463A -:1034E000C046C046C046C046C046C046948013830E -:1034F000958002E0012000F081F801390AD4381CDF -:1035000000F07CF8C046948013839580C046C04686 -:103510007600E2E7381C013800F070F894801383DD -:103520009580042000F06AF8108A184001D0FF202E -:1035300061E0C046C046C046C046C046C046948012 -:103540009580108A184055D001200226B04552D0EF -:103550000921168A1E40FCD1012000F04FF894800A -:10356000C0469580C04603E0C046C046C046C0463F -:10357000948095807600108A1840EFF30080400018 -:10358000C00F0643381C023800F038F8948095804C -:10359000022000F033F80139EAD513859480012028 -:1035A00000F02CF813839580301C80210223994071 -:1035B0000E401BD1002341085E4149085E41490885 -:1035C0005E4149085E4149085E4149085E4149083B -:1035D0005E4149085E4149085E41760808D34008CB -:1035E000FF21084048400002013004E00E2002E0C4 -:1035F000092000E0002080BCB846F0BD0138FDD1B4 -:103600007047C04603685A0003D45B005B08C018CB -:103610007047802212061343F9E7C046F0B55746BB -:103620004E46DE464546E0B5814683B092460029C7 -:1036300025D04B1E9B46002701935B46FB18DC0FF1 -:10364000E4184B466410E5005E193000FFF7DAFF1E -:10365000019B8046A3420BD0280008304844FFF766 -:10366000D1FFD04506D80138504509D2671CE4E7A0 -:10367000504505D9A74202D0631E9B46DDE70026D0 -:10368000300003B03CBC90469946A246AB46F0BD24 -:10369000012809D0022805D0002801D00020704759 -:1036A0000248FCE70248FAE70248F8E7B13D0008A3 -:1036B000C93D0008BD3D000830B5234B83B005006F -:1036C0008C1E002B2AD001A9200000E000BF00289A -:1036D00020D001992200FFF7A1FF041E1AD0FFF7A6 -:1036E00091FF6368A864012B10D0201D002B1BDB09 -:1036F000FFF788FF0023E8642B650368002B17DBC6 -:10370000FFF780FF2861002003B030BD00230520B3 -:103710002B61F9E7002309202B61F5E70B480C49E1 -:10372000091AC9100191D5E70123E8642B65E4E784 -:103730001801000FFFF7ACFF2861002801D1093004 -:10374000E2E70020E0E7C04600000000AC470008C8 -:103750007C480008036810B50400DA0705D49B070D -:103760000FD5483000F084FC23685A070FD51A079C -:1037700014D5DB0604D42000D130FF3000F084FCE7 -:1037800010BD483000F070FC23685A07EFD42000C9 -:10379000D03000F071FC23681A07EAD420005130C1 -:1037A000FF3000F06DFC2368E3E7C0460368002BA0 -:1037B00000D01B1818007047092070477047C0469A -:1037C00070B504000D0008E02B6C2A006361210035 -:1037D000012023699847082807D1296C2000FFF7AA -:1037E0006BFF0028F0D000F09FFE0728FBD10020DF -:1037F000296CFFF7E3FF281D00F020FCF0B5CE4652 -:10380000474680B5C368324C9846A5448369060094 -:1038100014000431402205A8994600F08DFE0023D3 -:1038200004AD296C30000493FFF746FF631E9C41F2 -:1038300007000934002F15D0AB6B10216B644B4689 -:1038400021430193C9B20095330032000120C047E3 -:10385000002833D13800F5239B009D440CBC9046D2 -:103860009946F0BDF0222B6C5200736129007CA8B0 -:1038700000F062FE7CAA31003369200098478A9BE1 -:1038800007006B6403934B460095019332003300AD -:1038900021000120C047002810D1F0227CA952004D -:1038A000280000F049FE082F06D1296C3000FFF7F0 -:1038B00003FF09240700BDE7072F01D00927C9E747 -:1038C0000020296CFFF77AFF05A800F0B7FBC0467F -:1038D0002CFCFFFF406C704770B5CB6BFAB00B64EB -:1038E00004000E004022043103A800F025FE01234D -:1038F0005B42029306E002AA210023699847050073 -:1039000008280AD1129B200019000193FFF7D4FE6A -:103910000028F0D009207AB070BD02A8FFF71AFF86 -:10392000062DF7D131002000FFF74AFF10B5826164 -:10393000DA6BC1601A6419000022FFF75FFF10BD47 -:10394000436970B50B64C36804000D00002B04D0FC -:103950000122FFF753FF00F0E7FD0A002369010091 -:1039600002209847072807D0082803D12900200003 -:10397000FFF726FF00F0D8FD0020296CFFF71EFF9F -:10398000281D00F05BFBC046C36810B5002B05D0B6 -:10399000CB6B00220B64FFF731FF10BDFFF79CFFDC -:1039A000FBE7C0467047C046836810B5002B02D0C5 -:1039B00001000120984710BD10B5012907D000294A -:1039C00007D003390224012901D9200010BD0124A8 -:1039D000FBE70224002BF8D10F2AF6D892008218B8 -:1039E0005268029B00241A60EFE7C04600B585B01C -:1039F00003AB0A00009300210023FFF7DDFF0398CB -:103A000005B000BD10B5012907D0002907D0033942 -:103A10000224012901D9200010BD0124FBE7022462 -:103A2000002BF8D10F2AF6D8029B92001B6882184F -:103A300053600024EFE7C04600B585B003AB0392A6 -:103A400000930A0000230021FFF7DCFF05B000BD52 -:103A500070B51A4CD36BA544136406000D0019A869 -:103A6000111D402200F068FD01235B42189314E011 -:103A70000C2118A802AAFFF7DFFF290018A8B047F9 -:103A8000002812D1069B18AA02A908300193984772 -:103A9000040005280AD0092807D0289B02A819008D -:103AA0000193FFF709FE0028E2D0092418A8FFF7C8 -:103AB00051FE200090239B009D4470BDC0FDFFFF80 -:103AC000F0B5DE464E464546574693460322E0B5DE -:103AD0001E0013008BB003400193CB6C0D001C1D26 -:103AE0001B6808940793002E66D11B02079306AB50 -:103AF0005E731A73019B022B00D16EE02B6DDB0706 -:103B000047D40023A846B2460293083303400393E8 -:103B10002568002D00D137E15346022B49D0258876 -:103B2000668804340123370099469F4343469B6CC3 -:103B30000F219C4658466744FFF758FF00228742F2 -:103B400006D82A004B469A43D719B84280414242D0 -:103B500002230121760033400D402B43012B3ED040 -:103B6000002B5AD0022B1CD1236801995F007F08DB -:103B7000002965D1002A06D0039A002A00D188E0E6 -:103B8000002F00D1AAE0002B65DB0137BF00E4194C -:103B9000BEE700230293022E47DDFFF70DFE00284B -:103BA00049D009200BB03CBC90469946A246AB4692 -:103BB000F0BD66680834B5E7022E9BDC1A0C1B04C6 -:103BC0000793022306A90B73FD3313409B00E418EF -:103BD000019B4A73022B00D090E7AC6B8EE7019BF0 -:103BE000002B3AD1002A16D02368DD0F63689A1C97 -:103BF000D7D0424658320692013300D1C6E0201D8C -:103C0000FFF7D4FD06AB01002A00404600E000BFEC -:103C1000002800D0A7E008347AE7019B002B02D0EF -:103C2000002A00D08BE0043472E707A9584600F060 -:103C3000D1FA0028B5D1029B002B5DD10820B1E755 -:103C400043460D2158461D6AFFF7D0FE854263D0DA -:103C50002368002B99DA043497E743460D21584630 -:103C60001D6AFFF7C3FE8542D5D143469B6A9C423D -:103C7000D1D145462000FFF7C5FC0F210200584670 -:103C8000FFF7DAFE58462A000021FFF7D5FE07208D -:103C900088E7002F22D058235146434406AABA464B -:103CA000251D0026049405911F00914603E004356C -:103CB0002600A24514D028000697FFF777FD4B4653 -:103CC000010000224046741C00E000BF0028EED036 -:103CD0005746059B049C9A46B742B9D1454601E038 -:103CE0004546049C0D215846FFF780FE069B28623E -:103CF0006B62AC62062055E70F215846FFF776FE4F -:103D00000E2102005846FFF797FE5846274A0F211A -:103D1000FFF792FE072045E743469B6A9C4297D1F6 -:103D2000434642469F620023D36204331363231D3C -:103D300053632368002B32DB0123029325E7200025 -:103D4000FFF760FC454604340600AC63404600E0E3 -:103D500000BF002800D124E7584632000F21FFF7AA -:103D60006BFE07201EE707000D2158464546FFF76A -:103D70003DFE2862022F0FD1069BEB6243462C3397 -:103D80006B62AC6206200DE7564604E70D215846EB -:103D90004546FFF72BFE2862069B6B62F1E7380071 -:103DA000013080004546201865E7C046000000004D -:103DB00010B50023FFF784FE10BDC04610B50123E7 -:103DC000FFF77EFE10BDC04610B50223FFF778FE58 -:103DD00010BDC046F0B5CE46474680B50600C3B01C -:103DE00014001D0001294ED0002933D003290AD028 -:103DF000042902D1002B00D189E0022043B00CBC81 -:103E000090469946F0BD032BF7D11404150C240CF1 -:103E10002B19102BF1D8082203681A4200D0E7E0D2 -:103E200020AB1800984600F02DF9B36BED001A0096 -:103E3000002C09D0E400EA1A1C1942441968D15038 -:103E400004339C42FAD12200B263404600F018F9D4 -:103E50000020D3E70220002BD0D10023012710043B -:103E6000B56B000C321D39009940084202D0296818 -:103E70000435116001330432102BF4D10020A30467 -:103E8000BCD4B563BAE71404170C240C012B5FD023 -:103E9000052BB2D13B19202BAFD80F2F7DD9A146CE -:103EA000002C65D1002223009146B16B002B00DC71 -:103EB00088E020A88046FA00DB00521ACB18424462 -:103EC0000868505004318B42FAD119004B46002B40 -:103ED00010D04B4658003A00102F00D21022002379 -:103EE000103AD2006A448000CC58D4500433834244 -:103EF000FAD1C918012D5ED0B1630F2F74D94B468A -:103F0000002BA5D0684600F0B7F8002076E7102A0D -:103F100000D972E7102203681A4245D120AB18007D -:103F2000984600F0B3F800230120B16B02009A40DC -:103F3000144204D045460F689A00AF500431013353 -:103F4000042BF3D14046B16300F09EF8002055E702 -:103F50003B19102B00D950E70F2F00D94DE7002354 -:103F60009946012233681A4230D14B46002B5AD071 -:103F7000042233681A4242D1012D47D00F2F06D8B0 -:103F800020AB180000F076F84B46002B8AD068462C -:103F900000F074F81023DB1B87E7102BDFD9102209 -:103FA000524291469944DCE793430360D130FF309D -:103FB00000F06CF8B2E7043120A8B16300F054F8C7 -:103FC00000201BE74B46002B84D193E71900914357 -:103FD0000A003160052D1ED0032230009343336068 -:103FE000483000F043F8C0E720A800F041F886E729 -:103FF000934303605130FF3000F044F810E7300085 -:1040000093433360D03000F039F8B5E720AB1800A7 -:1040100000F02CF8BEE7022330001A43326048302B -:1040200000F028F8A1E7012D03D00F2F00D939E7C0 -:10403000A6E720AB180000F019F833E7011C343173 -:1040400038C9043B9C461D60A646011C20313CC972 -:1040500090469946A246AB46011C0831FCC941680E -:104060000068E54600BDC0467047C0467047C04680 -:104070007047C0467047C0467047C0467047C0464C -:104080007047C0467047C0467047C0467047C0463C -:1040900001B401A801B585B0FFB408A841464A465D -:1040A00053465C4665463EC001A83EC80F98009046 -:1040B00000230CB401A9FFF70FFC109B12B01847A6 -:1040C00001B401A801B585B0FFB408A841464A462D -:1040D00053465C4665463EC001A83EC80F98009016 -:1040E00000230CB401A9FFF72BFC109B12B018475A -:1040F00001B401A801B585B0FFB408A841464A46FD -:1041000053465C4665463EC001A83EC80F980090E5 -:1041100000230CB401A9FFF737FC109B12B018471D -:1041200001B401A801B585B0FFB408A841464A46CC -:1041300053465C4665463EC001A83EC80F980090B5 -:1041400000230CB401ABFFF7F1FB109B12B0184732 -:1041500001B401A801B585B0FFB408A841464A469C -:1041600053465C4665463EC001A83EC80F98009085 -:1041700000230CB401AAFFF76BFC109B12B0184788 -:10418000027A0300002A04D1427AB020002A07D123 -:104190007047013A02720268100E12021A60F7E7C5 -:1041A000013A5A725A68111D596003211268197236 -:1041B000F2E7C04600B585B003AB00930C220023A4 -:1041C0000021FFF7F9FB039805B000BD10B5FFF71C -:1041D000F1FF10BDF0B557464E464546DE4600237A -:1041E000E0B587B003930F339846083B9946802388 -:1041F0001B0306000F009A463800FFF7C1FF0400BA -:10420000B02821D0030632D4FF2583001D4005AB22 -:104210009B4600930D220023002130000435FFF758 -:10422000CBFB63064CD5059B5D1B05955B46009358 -:1042300000230D2200213000FFF7E4FB3800FFF7D8 -:104240009FFF0400B028DDD1039B0024002B2FD159 -:1042500005AD00950E2200213000FFF7ADFB009563 -:1042600000230F2200213000FFF7CCFB20E00300E9 -:1042700042469343DBB2802B63D0902B25D0A02BFA -:1042800032D0B02B45D0C02B00D173E003004A469A -:104290009343DBB2D02B0AD15346024001321A437A -:1042A000052301213000FFF795FD0028A4D0092443 -:1042B000200007B03CBC90469946A246AB46F0BDF4 -:1042C000059B9C4665440595B0E7833B03400D2B59 -:1042D000EDD0424605AD024000950023002130009C -:1042E000FFF76AFB0095A3E7FF234A461B0119006D -:1042F000824311410A001A40030702D58023DB01E3 -:104300001A43002300213000FFF764FD0028CED1BE -:1043100072E7B1284AD0B2285ED0B32800D18BE032 -:10432000FC230340B42BC2D04A465346024001321C -:104330001A43012101233000FFF74CFD0028B6D1BC -:104340005AE704023800FFF71BFF802520432D02A7 -:10435000A842ACD004010005020C0023002130006B -:10436000FFF738FD0028A2D12C4200D144E70123F9 -:10437000039341E7C6286AD0C7287CD003004A4689 -:104380009343DBB2C02B00D18BE0C82800D18FE073 -:10439000C92800D08BE73800FFF7F2FEF0230203B4 -:1043A0001B03134042460240013278E73800FFF712 -:1043B000E7FE002800D17AE7030042469343DBB2D0 -:1043C000002B00D073E7020000213000FFF702FD50 -:1043D000002800D06BE70FE705AB00939B460D224A -:1043E000002300213000FFF7E7FA3800FFF7C8FE8E -:1043F00003066AD57F25B03C059B2840A0409C461B -:104400006044059038000734FFF7BAFE0306F3D482 -:10441000812292009446863AFF3A1040A040059BC4 -:10442000723A634418185B460590009300210023FC -:104430003000FFF7E7FADFE63800FFF7A1FEF023D0 -:1044400002031B03134042460240013270E738006A -:10445000FFF796FEF02302031B031340424602407F -:1044600001321A43032303213000FFF7B3FC002875 -:1044700000D01CE7C0E63800FFF782FE002800D11C -:1044800015E7030042469343DBB2002B00D00EE752 -:10449000020004213000FFF79DFC002800D006E751 -:1044A000AAE64346A0221C40013412032243D9E766 -:1044B0003800FFF765FE434602009A43D2B210323D -:1044C0001840120301300243EAE60224A0E7C04686 -:1044D000030000B5DB6C85B05A6808001202019237 -:1044E0001A0001A908324A6003220A72DB794B7272 -:1044F000FFF770FE05B000BD10B5FFF767FE806CDA -:1045000010BDC04610B5FFF761FEC26CD3799B00A9 -:104510000833D01810BDC04610B500F005F8C046ED -:1045200010B5FFF7F9FFC04610B5062000F074F88B -:10453000012000F0A3F8C046F0B505000F2A2FD9DE -:104540000B0003439B0734D116000C000300103E00 -:10455000350901352D01451927681F6067685F60BF -:10456000A7689F60E7681034DF6010339D42F3D185 -:104570000F239E431036851989191340032B1AD92E -:104580001E1F0023B4080134A400CF58EF50043399 -:10459000A342FAD10324A643331D2240C918ED18C3 -:1045A000002A05D00023CC5CEC5401339342FAD1AD -:1045B000F0BD0500F6E71A00F2E7C04670B5050049 -:1045C0000C001F2922D8B7239B00C358002B14D0FE -:1045D0008A009B181A68002A0FD0012A0BD0511CA0 -:1045E00005D00021200019609047002070BD1623DF -:1045F00003600120FAE70020F8E7280000F02AF81D -:1046000022000100280000F011F8EFE716230360F4 -:1046100001204042EAE7C04610B5034B010018688C -:10462000FFF7CCFF10BDC04600000020002370B58E -:10463000074C050008001100236000F017F8431C28 -:1046400000D070BD2368002BFBD02B60F9E7C0467B -:104650002C07002010B500F001F810BD58220120F1 -:10466000014B40421A6070472C070020582201205D -:10467000014B40421A6070472C070020FEE7C046FD -:1046800002B4714649084900095C49008E4402BCE5 -:104690007047C04603B47146490840004900095EAE -:1046A00049008E4403BC704703B47146490840007A -:1046B0004900095A49008E4403BC7047F8B5C0460A -:1046C000F8B5C04609021200010100803209040059 -:1046D00000000000000012010002FF000008C016E8 -:1046E000DC05010201020001040309042A03490058 -:1046F0006E00660069006E006900740065004E007F -:10470000650073004C0069007600650073002E00A0 -:1047100063006F006D00000000000000000000005A -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740001E0349004E004C0020005200650074001A -:1047500072006F002D00500072006F0067000000B3 -:104760000000000000000000000000000000000049 -:0C4770000000000000000000000000003D -:10477C0074B20181B0AB308000000000800A01816E -:10478C00B0B0ABF0000000003F020181B0AB308054 -:10479C000000000080060181B0B0ABF0000000000A -:1047AC00F4ECFF7FB0B0B08050EEFF7F0100000052 -:1047BC00FCEEFF7FB0A9028090EFFF7FB0B0A88025 -:1047CC00E0EFFF7F01000000ECEFFF7FB0B0AA80AC -:1047DC0020F0FF7F9CFFFF7FF0F0FF7F01000000C7 -:1047EC00ECF0FF7FAA3F398038F1FF7FB0B0A88092 -:1047FC0044F1FF7FB0B0AA8084F1FF7FB0B0A880F5 -:10480C0098F1FF7F0100000094F1FF7FB0B0A88009 -:10481C009CF1FF7F010000002CF2FF7FAA0FB280F9 -:10482C0094F2FF7F58FFFF7F7CF5FF7FB0B0A8802C -:10483C0098F5FF7F54FFFF7FF8F7FF7F0100000022 -:10484C0068F9FF7F0084048078F9FF7FB0B0A880FE -:10485C0078F9FF7F40FFFF7F6CFCFF7F00840480B2 -:10486C008CFCFF7FB0B0A880A4FCFF7F010000008F -:10487C00080000200000000000000000F4020020EE -:10488C005C030020C40300200000000000000000B6 -:10489C00000000000000000000000000000000000C -:1048AC0000000000000000000000000000000000FC -:1048BC0000000000000000000000000000000000EC -:1048CC0000000000000000000000000000000000DC -:1048DC0000000000000000000000000000000000CC -:1048EC0000000000000000000000000000000000BC -:1048FC0000000000000000000000000000000000AC -:10490C00000000000000000000000000000000009B -:10491C00000000000000000000000000000000008B -:10492C0001000000000000000E33CDAB34126DE628 -:10493C00ECDE05000B000000000000000000000091 -:10494C00000000000000000000000000000000005B -:10495C00000000000000000000000000000000004B -:10496C00000000000000000000000000000000003B -:10497C00000000000000000000000000000000002B -:10498C00000000000000000000000000000000001B -:10499C00000000000000000000000000000000000B -:1049AC0000000000000000000000000000000000FB -:1049BC0000000000000000000000000000000000EB -:1049CC0000000000000000000000000000000000DB -:1049DC0000000000000000000000000000000000CB -:1049EC0000000000000000000000000000000000BB -:1049FC0000000000000000000000000000000000AB -:104A0C00000000000000000000000000000000009A -:104A1C00000000000000000000000000000000008A -:104A2C00000000000000000000000000000000007A -:104A3C00000000000000000000000000000000006A -:104A4C00000000000000000000000000000000005A -:104A5C00000000000000000000000000000000004A -:104A6C00000000000000000000000000000000003A -:104A7C00000000000000000000000000000000002A -:104A8C00000000000000000000000000000000001A -:104A9C00000000000000000000000000000000000A -:104AAC0000000000000000000000000000000000FA -:104ABC0000000000000000000000000000000000EA -:104ACC0000000000000000000000000000000000DA -:104ADC0000000000000000000000000000000000CA -:104AEC0000000000000000000000000000000000BA -:104AFC0000000000000000000000000000000000AA -:104B0C000000000000000000000000000000000099 -:104B1C000000000000000000000000000000000089 -:104B2C000000000000000000000000000000000079 -:104B3C000000000000000000000000000000000069 -:104B4C000000000000000000000000000000000059 -:104B5C000000000000000000000000000000000049 -:104B6C000000000000000000000000000000000039 -:104B7C000000000000000000000000000000000029 -:104B8C000000000000000000000000000000000019 -:104B9C000000000000000000000000000000000009 -:104BAC0000000000000000000000000000000000F9 -:104BBC0000000000000000000000000000000000E9 +:1000E000FCDC01F0DDFF0000AC4B0008000000204C +:1000F000300400203004002038070020FEE7C0460E +:10010000F0B5BA4A89B0138801921BB2002B01DB0B +:1001100001F0B9FC1388B64A1A4080231343019AB0 +:100120001380019B1A8880231B011340B14A01D11F +:1001300001F077FCB049B14C0B68B14801330B605A +:1001400023787F211D008D43AE49AF4E0D70E188AD +:10015000018000203080602633401370AB4A2600B7 +:100160001570834201D100F0C2FEFF23A84CCAB231 +:100170002370A84B60701C600292707801380E28C2 +:1001800001D901F0D7FB04F027FC0F00FD053A0868 +:100190000F09A00AD50BC00B6D09160A770A9E0A33 +:1001A00046094F0957095F09B078B3888C2219288E +:1001B00024D88022D20004F00FFC1A00240047014A +:1001C0002702EF028E031704D304EF04FB04030598 +:1001D0000B0514051D052B0533053B054305480597 +:1001E0005C0572059305A805BF05D702E302B0239D +:1001F000894A5B0351690B4353610022227000F06E +:1002000072FE152B01D900F0AEFD18008023DB0033 +:1002100004F0E2FB160023002E00A905390044007B +:100220004F00A9055C00690073008000A905A905BD +:100230008D009A00A500B200BF00CC00D600E000FF +:100240009022D205136875490B4013608023D16852 +:100250005B030B43D3600022D0E790210123C90543 +:100260000A689A430A60CA681343CB600022C5E754 +:1002700090210423C9050A689A430A60CA68134397 +:10028000CB600022BAE790211023C9050A689A437F +:100290000A60CA681343CB600022AFE79021402375 +:1002A000C9050A689A430A60CA681343CB600022F2 +:1002B000A4E79022D205136859490B4013608023AC +:1002C000D168DB040B43D360002297E79022D2056C +:1002D000136854490B4013608023D1685B010B43C2 +:1002E000D36000228AE704234F490A689A430A60D0 +:1002F000CA681343CB60002280E79022D2051368BE +:100300004A490B4013608023D168DB050B43D3605F +:10031000002273E79022D205136845490B40136011 +:100320008023D168DB020B43D360002266E7902272 +:10033000D20513683F490B4013608023D1685B00EE +:100340000B43D360002259E79022D20511683A4846 +:1003500001401160D1680B43D36000224EE7902228 +:10036000D205136835490B4013608023D168DB0147 +:100370000B43D360002241E79022D205136828493D +:100380000B4013608023D168DB040B43D360002251 +:1003900034E79022D205136829490B40136080236B +:1003A000D1685B050B43D360002227E701231E4978 +:1003B0000A689A430A60CA681343CB6000221DE7AB +:1003C000102320490A689A430A60CA681343CB6025 +:1003D000002213E79021C9050A68174802400A6005 +:1003E000CA681343CB60002208E7C046005C0040A7 +:1003F0008F0F0000FA06002098040020486000409B +:100400009E040020F8060020A2040020F906002027 +:10041000FC0600202C07002000100240FFFFEFFF29 +:10042000FFFFFFFBFFEFFFFF00040048FFFFFFBFE0 +:10043000FFFFFBFFFFFEFFFFFFFBFFFFFFBFFFFF15 +:10044000FFFFFFEF000C0048152B01D900F08EFCD8 +:10045000180004F0C1FA160021002C008B043700AC +:1004600042004D008B04580063006D0078008B043F +:100470008B0483008E009900A400AF00BA00C40072 +:10048000CE009023DB051968D14801401960DA6875 +:100490000240DA600022B1E690230121DB051A68F0 +:1004A0008A431A60DA688A43DA600022A6E690235B +:1004B0000421DB051A688A431A60DA688A43DA6025 +:1004C00000229BE690231021DB051A688A431A60FC +:1004D000DA688A43DA60002290E690234021DB0547 +:1004E0001A688A431A60DA688A43DA60002285E66D +:1004F0009023DB051968B74801401960DA680240AB +:10050000DA6000227AE69023DB051968B2480140E0 +:100510001960DA680240DA6000226FE60421AF4B0E +:100520001A688A431A60DA688A43DA60002265E64C +:100530009023DB051968AA4801401960DA68024077 +:10054000DA6000225AE69023DB051968A5480140CD +:100550001960DA680240DA6000224FE69023DB057A +:100560001968A14801401960DA680240DA60002287 +:1005700044E69023DB0519689C4801401960DA685D +:100580000240DA60002239E69023DB0519689848BA +:1005900001401960DA680240DA6000222EE69023FA +:1005A000DB0519688B4801401960DA680240DA609F +:1005B000002223E69023DB0519688E48014019606C +:1005C000DA680240DA60002218E60121834B1A68DB +:1005D0008A431A60DA688A43DA6000220EE6102144 +:1005E000854B1A688A431A60DA688A43DA60002207 +:1005F00004E69023DB0519687C4801401960DA683D +:100600000240DA600022F9E5152B00D9B1E31800A9 +:1006100004F0E2F916001F002700AF032F00370097 +:100620003F00AF034800510058006100AF03AF0323 +:100630006A0073007A0083008C0095009C00A30080 +:1006400090228023D20511685B030B4313600022C4 +:10065000D4E590220123D20511680B4313600022D8 +:10066000CCE590220423D20511680B4313600022CD +:10067000C4E590221023D20511680B4313600022B9 +:10068000BCE590224023D20511680B431360002281 +:10069000B4E590228023D2051168DB040B4313607C +:1006A0000022ABE590228023D20511685B010B4349 +:1006B00013600022A2E50423484A11680B4313602B +:1006C00000229BE590228023D2051168DB050B43B5 +:1006D0001360002292E590228023D2051168DB028C +:1006E0000B431360002289E590228023D205116814 +:1006F0005B000B431360002280E59021C9050B6865 +:100700001A430A60002279E590228023D2051168FD +:10071000DB010B431360002270E590228023D20599 +:100720001168DB040B431360002267E590228023ED +:10073000D20511685B050B43136000225EE50123BF +:10074000264A11680B431360002257E510232A4AFA +:1007500011680B431360002250E59021C9050B6816 +:100760001A430A60002249E58D22082B00D045E596 +:100770009022D205516838330B43536000223DE587 +:100780008D22082B00D039E590224021D2055368F4 +:100790008B435360002231E5152B00D9ECE21800A1 +:1007A00004F01AF92C0031003700EA023D00430042 +:1007B0004900EA02500056005B006200EA02EA02C9 +:1007C00069006F0075007B00820089008E00930035 +:1007D000FFFFEFFFFFFFFFFBFFEFFFFF00040048FD +:1007E000FFFFFFBFFFFFFBFFFFFEFFFFFFFBFFFF62 +:1007F000FFBFFFFFFFFFFFEF000C00489023DB056A +:100800009A620022FAE490230122DB059A62002218 +:10081000F4E490230222DB059A620022EEE49023A6 +:100820000422DB059A620022E8E490230822DB051B +:100830009A620022E2E4802290239201DB059A6210 +:100840000022DBE490234022DB059A620022D5E4FB +:100850000222CC4B9A620022D0E480229023120222 +:10086000DB059A620022C9E4802290239200DB0516 +:100870009A620022C2E490231022DB059A620022D1 +:10088000BCE490232022DB059A620022B6E4902388 +:100890008022DB059A620022B0E48022902392013C +:1008A000DB059A620022A9E480229023D201DB05B5 +:1008B0009A620022A2E40122B24B9A6200229DE4D5 +:1008C0000422B14B9A62002298E490232022DB0597 +:1008D0009A62002292E4152B00D950E2180004F02D +:1008E0007BF816001B0021004E0227002D0033006C +:1008F0004E023A00400045004C004E024E025300AA +:1009000059005F0065006C00730078007D00902343 +:10091000DB059A61002271E490230122DB059A61D4 +:1009200000226BE490230222DB059A61002265E439 +:1009300090230422DB059A6100225FE490230822C1 +:10094000DB059A61002259E4802290239201DB05A5 +:100950009A61002252E490234022DB059A61002232 +:100960004CE40222874B9A61002247E480229023C4 +:100970001202DB059A61002240E48022902392005B +:10098000DB059A61002239E490231022DB059A618D +:10099000002233E490232022DB059A6100222DE41B +:1009A00090238022DB059A61002227E48022902395 +:1009B0009201DB059A61002220E480229023D2017B +:1009C000DB059A61002219E401226E4B9A61002234 +:1009D00014E404226C4B9A6100220FE4902320223D +:1009E000DB059A61002209E402226270152B00D90E +:1009F000B1E0180003F0DCFF0B151EAF273039AF54 +:100A0000434C545DAFAF677079828C969EA690235D +:100A10008022DB051B69D200134063800022FFF7B0 +:100A2000EDFB90230122DB051B691340638000224C +:100A3000FFF7E4FB90230222DB051B691340638070 +:100A40000022FFF7DBFB90230422DB051B69134028 +:100A500063800022FFF7D2FB90230822DB051B698D +:100A6000134063800022FFF7C9FB90238022DB053F +:100A70001B699201134063800022FFF7BFFB9023A4 +:100A80004022DB051B69134063800022FFF7B6FBA1 +:100A900002223C4B1B69134063800022FFF7AEFB30 +:100AA0009023DB051B690022DB0BDB036380FFF770 +:100AB000A5FB90238022DB051B6992001340638015 +:100AC0000022FFF79BFB90231022DB051B691340DC +:100AD00063800022FFF792FB90232022DB051B6935 +:100AE000134063800022FFF789FB90238022DB05FF +:100AF0001B69134063800022FFF780FB9023802254 +:100B0000DB051B699201134063800022FFF776FB2F +:100B100090238022DB051B69D201134063800022F1 +:100B2000FFF76CFB0122174B1B6913406380002207 +:100B3000FFF764FB0422144B1B69134063800022FF +:100B4000FFF75CFB90232022DB051B6913406380C9 +:100B50000022FFF753FB00238D226370FFF74EFB4B +:100B600080230A4ADB0251690B435361054A084955 +:100B700013680B401360D168064B0B43D36000220F +:100B8000FFF73CFB00040048000C00480010024046 +:100B9000FFFFAAAA00005555ED4AEE4913680B4025 +:100BA0001360D168EC4B0B43D3600022FFF726FBA8 +:100BB000E74AE84913680B4013600022FFF71EFB69 +:100BC000E34AE54B11680B4313600022FFF716FB65 +:100BD000DF491B024A69D2B213434B610022FFF77F +:100BE0000DFBDB4B00221B691B0AA3700123637002 +:100BF000FFF704FB8023D94A1B0351690B43536160 +:100C0000D74AD84B11680B4313600022FFF7F6FA5E +:100C1000D34AD44BD1680B43D3600022FFF7EEFADE +:100C2000CF4AD14913680B4013600022FFF7E6FA60 +:100C3000CB4ACC4B11680B4313600022FFF7DEFA5E +:100C4000C74A53610022FFF7D9FA8023C34A1B0326 +:100C500051690B435361BE4AC44B11680B43136087 +:100C60009022D2051168C24B0B4313600022FFF79C +:100C7000C5FAB74ABD4BD1680B43D3609023DB055F +:100C8000D868BB490143D9601168BA480140116076 +:100C90001A68B9490A401A600022FFF7AFFAF82231 +:100CA0008027AB4D98026969D20110403F025A0279 +:100CB0003A4089051043890D08439021686110204E +:100CC0005D08C90528404A69AC4DDB012A40024352 +:100CD0008020C001034013434B610022FFF78EFACE +:100CE000C0239E4ADB0251690B435361984AA44BCF +:100CF00011680B4313609022A023D20511685B0397 +:100D00000B4313600022FFF779FA914A9C4BD1689C +:100D10000B43D3609023A021DB05D868490301432E +:100D2000D96011689748014011601A6896490A40D5 +:100D30001A600022FFF762FAFF2185489D00426990 +:100D40002940924DDB002A400A4342619022C02094 +:100D5000D205C000516903408D4801400B435361E7 +:100D60000022FFF74BFA8D22FFF748FA8D22FFF79A +:100D700045FA8D22FFF742FA8D22FFF73FFA8D22C6 +:100D8000FFF73CFAB578B288032D00D16CE155D855 +:100D9000012D64D05FD901F0D9F890220121D2054C +:100DA00013680B4313601023916111680B431360A8 +:100DB00004234021936113680B431360082393615C +:100DC0009161802311685B010B43136080236348AA +:100DD000DB0241695F4D0B435D4943610B682B406A +:100DE0000B60CC685C4B1C43CC600C682C400C60E6 +:100DF000CC682343CB60802344691B032343584CB6 +:100E000043612568574B2B43236000236361C02453 +:100E10004569E4022C4344610C685948204308604A +:100E2000A02014684003204310604869574C2040BC +:100E30004861516956480140516152E0052D00D189 +:100E4000B2E000D254E1072D00D1F1E0802D00D1B5 +:100E500080E1962345E001F079F8002341E001F0BC +:100E600075F89023DB051A683A4C2A431A608022F1 +:100E70009D61196852030A431A6080220421D2003E +:100E80009A621A680A431A6002229A6118680E323E +:100E900002431A604022996119680A431A600822C5 +:100EA0009A6180232D49DB024A6913434B61284B29 +:100EB0001A6822401A60D868274A1043D860186818 +:100EC00020401860D8680243DA6080234A691B0317 +:100ED0001343234A4B611168224B0B4313600023D9 +:100EE00053612C4A13706A462B4B12891A8033784F +:100EF000602259B2002901DB00F064FD134016D1D5 +:100F00007278062A0FD17288110A022901D100F0E5 +:100F100013FD032901D100F015FD204A012901D15B +:100F200000F00BFD03936A461B4B92891A80019BCC +:100F30001A881B4B13431B4A1A40C0239B01534082 +:100F4000019A9BB2138001F0FBFF00F05CFDC046EC +:100F500000040048FFFFAAAA0000555500100240F7 +:100F60000008004855555555AAAAAAAA0000505590 +:100F700000010010FFFFAFAAFFFEFFEFEFBF000070 +:100F800050550000AFAAFFFFFFFFEBFF03FF00007B +:100F9000FFF90000FC060020A0040020064A00081B +:100FA0008081FFFF8FBFFFFF00F0D0FF9022012163 +:100FB000D2051368C84D0B4313601023916111686B +:100FC0000B43136004234021936113680B431360A8 +:100FD000082393618023916211685B010B431360C6 +:100FE0008023BE49DB02486903434B61BC4B186850 +:100FF00028401860DC68BB480443DC601C682C4057 +:101000001C60DC682043D860802348691B030343CD +:101010004B61B549B54B086803430B6000234B6136 +:1010200080211068C901014311608021916258E755 +:1010300000F08CFF90220121D205136840200B4361 +:1010400013601023916111680B43136004239361B3 +:101050001168014311600821916111680B4313600D +:10106000022393619061ACE6D2B2022A21D0002320 +:10107000032A00D135E79723012A00D031E78023E6 +:1010800096491B03486903434B6197490B68934397 +:101090000B60CB681343CB604B6813434B608A6192 +:1010A0000B681A4300230A60914A1370914A116039 +:1010B00017E7B023894A5B03516940200B43536112 +:1010C0009023DB051A688C490A401A608022D9688F +:1010D00052011143D96059680143596098611968F8 +:1010E0000A4308211A60824A1170824A1360B4E6EA +:1010F000D2B29823012A00D0F3E690210A207F4B38 +:10110000C90519607E4B05321A70754B7D4A136014 +:101110007D4A10707D4A013013607D4A10707D4A0F +:10112000013013607C4A107080206C4A00035469BF +:10113000204350611C687948204318600868784B48 +:1011400003430B60B02351695B030B43536100F011 +:1011500021FE82E69023012740218025DB05677070 +:1011600099621A686D012A431A60C04662481C6978 +:101170001A680C4002401A60DA680240DA60F02215 +:10118000002C39D11A6802401A60DA681543DD6014 +:101190001A6994461A690492C0461A690592C046B3 +:1011A000C0461A690692C046C046C0461A690792F0 +:1011B000C046C046C046C0461D691A6802401A6053 +:1011C000DA681040D860634622000B4214D1049BB9 +:1011D0003A000B4210D1059B02320B420CD10B009E +:1011E00006990332194207D107990432194203D1F3 +:1011F00005321D4200D1D1324A4B9A702DE6B578A6 +:10120000F178B0880A2D58D016D8052D4BD009D8C2 +:10121000012D42D0002D38D0022D41D0042D45D0D3 +:10122000A02534E0072D4ED033D3082D4ED0092D04 +:10123000F6D101F063FE2EE0802D00D178E009D8D0 +:101240000C2D46D03CD3202D34D0212DE8D1364B67 +:10125000188020E0842D00D19CE009D8812D00D198 +:1012600092E0822DDCD10123637002F00DF88FE053 +:10127000852D00D193E0862DD2D1022363702A4BB5 +:101280001B88A3701B0AE37005E001F00BFE2570BC +:1012900029E601F0E3FD0025F9E701F0CDFFFAE7CB +:1012A00001F05EFDF7E701F083FFF4E7002201F0B3 +:1012B00062FFF0E71D4B1870EDE702F0A7F8EAE7D0 +:1012C00002F064F8E7E701F0A1FDE4E702F03CF882 +:1012D000E1E701F0F5FFDEE7FFFFAAAA00100240F8 +:1012E0000004004800005555000800485555555564 +:1012F0000807002004070020FFEFFFFF1C07002065 +:1013000020070020140700201807002024070020D1 +:10131000280700200C07002010070020000050556F +:1013200000010010FC060020340400208804002086 +:10133000012290236270DB051968C24D29401960B3 +:10134000D9682940D96080210225C90099629A6133 +:101350009D61BD4D6861C046C04600B299610028DC +:1013600000DA9A62C046C046C046C046C046C04683 +:1013700090228021B54BD205C9001B6991620121E1 +:101380001B0A9161A37086E70123637001F01EFDC3 +:10139000A07080E70123637001F032FFF8E70123BA +:1013A0006370AB4B1B78EDE7B078F178B388AA2275 +:1013B000042801D9FEF722FF03F0FAFA03261A1EC9 +:1013C0002200FF21A1489D0042692940A14DDB0078 +:1013D0002A400A4342619022C020D205C0005169D0 +:1013E00003409D4801400B4353610022FEF706FF76 +:1013F000180001F02BFCF8E7180001F08FFCF4E76F +:10140000180001F069FCF0E701221800627001F099 +:1014100043FCA070E9E7B278002A1DD00023012A1E +:1014200000D0AF2323705EE5B278002A14D00023E9 +:10143000012AF7D0B023F5E7B278002A0CD00023B8 +:10144000012AEFD0B123EDE7B278002A04D00023BF +:10145000012AE7D0B223E5E701236370A933A37023 +:101460000023DFE7B578F278B188112D00D19BE039 +:1014700007D8012D6BD0002D0FD0022D7DD08225F5 +:1014800005E7212D00D185E0222D00D188E0122D25 +:10149000F5D102231020637089E0012529006F4AED +:1014A0006F4F12783B68914099625A6810208A43C6 +:1014B0005A6001F055FE2900684B3A681B780427F2 +:1014C00099400B009161516804950B435360FA20D9 +:1014D000400001F045FE614A04991278FA209140DB +:1014E0005F4D40002B68013F99625A68BFB28A4342 +:1014F0005A6001F035FE594B04991B782A689940CF +:101500000B00916151680B435360002FDFD104251C +:10151000FA2001F025FE0121504A514F12783B6814 +:10152000914099625A68FA208A435A6001F018FE85 +:1015300001214A4B3A681B78013D99400B009161AB +:101540005168ADB20B435360002DE1D19FE62900F5 +:10155000424A434F12783B68914099625A68102082 +:101560008A435A6001F0FCFD3C4A3B681278954082 +:101570009D615A6815435D608DE60123374A6370AB +:10158000127838499340364A9BB21268002002F024 +:1015900027F9FDE601230020637001F031FDF7E635 +:1015A000012310206370F8E702230020637001F02C +:1015B00081FD60806FE6B378B288042B1AD006D81C +:1015C000022B1CD021D8012B0FD087232AE7072B11 +:1015D00024D003D8052BF8D1234B14E0082B22D0BC +:1015E000802BF2D100F0D6FB3AE7204A1278A270A5 +:1015F000637035E71E4B1B78A3700123F8E71B4B84 +:101600001A7083221A4B1A702AE7184B184D1A7059 +:1016100083232B7000F02EFC2B78EDE7154B1A700E +:10162000120A5A701CE7134B1A78A2705A78E270AB +:101630009A782271DA7862711A79A2715B79E37112 +:101640000623D5E7FFEFFFFF00080048000400482D +:101650008804002003FF0000FFF9000008070020B5 +:101660000407002004000200E5040020C404002058 +:10167000E6040020C5040020B378B288022B16D0FF +:10168000032B17D0012B1CD1024885460248001CB1 +:101690000047C04678120020C5CAFF1F060005009B +:1016A0000800070019C9FF1FEFBEADDED8E6B34B37 +:1016B0001A60D5E6B14B18680004104302F08AF8AE +:1016C000CEE68A23AEE68823ACE6B2781300303B40 +:1016D0002F2B19D8F078032800D9CEE003F068F951 +:1016E00014021012A64B512A00D177E024D8312AD7 +:1016F00053D00BD8002A33D0302A49D0B42345E048 +:10170000A04BF0E7A04BEEE7A04BECE7332A4ED01E +:1017100048D3502AF2D100222270063262701A7A1F +:10172000A270DA78E2705A7A22719A7A62719A78A3 +:10173000A2715B7CE37145E07F2A00D983E0702AC7 +:101740005CD2602A36D0612A40D0522AD6D10022FB +:101750001B882270A37002321B0A6270E37031E0B2 +:10176000FF238B4953540132102AFBD1844A874905 +:10177000D3709370844ACB70D370937001228B70B6 +:101780008049CB708B70834B1A700023237019E053 +:10179000B288110AD9721A73F7E7B288110A59731D +:1017A0009A73F2E7B288110AD9731A74EDE7B28816 +:1017B0005A74EAE70023237001336370B388744AD4 +:1017C000D35CA370744B1C60FFF78DFB0023237068 +:1017D00001336370714B1B68DB78F2E700222270E3 +:1017E00006326270DA7AA2701A7BE2705A7B22713A +:1017F0009A7B6271DA7BA2711B7C9BE7634B674922 +:101800005C6833787F2B00D95BE16846644B007AD3 +:1018100018700868C378002B0ED000200290982B17 +:1018200005D156E100200290D02B00D151E1594B57 +:1018300010301870FF2304E05A4B18609023C370D7 +:101840006F33029345E107201040032815D803F0B9 +:10185000AFF8160218124A4B802AB3D3872A12D93E +:101860007032D2B2072AADD800222270F2789A7272 +:10187000B2881A80A6E7444BEEE7B52386E7434BD0 +:10188000EAE7404BE8E7B188F0780A0AC9B24518A0 +:101890009446BE22102D2DDC043200282AD0DD789B +:1018A000033AFF2D26D19D780132FF2D22D100224F +:1018B000D5B2A84220D862464501013D1D724D01B6 +:1018C0002F009A700022384DDA70ED195A729A7210 +:1018D0001A80DA721A735A739A73DA731A745A7412 +:1018E0005D602B4B591863468B540132D3B283424F +:1018F000F9D30022227065E701328D18244F013D93 +:101900007D5DFF2DD4D0C122F4E7B278002A04D047 +:10191000402A07D0D222227055E72270B1881D4A92 +:10192000117050E70022227001326270194A127859 +:10193000A27048E7802375E51C4A174B1A601223F2 +:10194000FFF7F0FAD2B2012A11D0002A09D0022AF8 +:1019500001D0FFF7E7FA104B154A1A60154BFFF755 +:10196000E1FA0D4B144A1A600423FFF7DBFA0A4B25 +:10197000124A1A60124BFFF7D5FAC0463004002015 +:101980004C0400206004002074040020380400206F +:10199000E7040020A40400202C0700208C04002071 +:1019A0009404002090040020F8040020F44900086A +:1019B000704A00081E030000184A00081C4A00086C +:1019C0002A030000134208D17378052B05D17388D0 +:1019D0004B4A13704B4ADBB21380019B4A4A1B8867 +:1019E00001991340494A13439BB20B800021484B95 +:1019F0001980019B1B881A43464B1A40464B5A409C +:101A0000019B92B21A80454BDA8F520507D580218F +:101A1000434A11800022DA87424B019A138009B0B1 +:101A2000F0BD1278402AEED13F4A1278002AEAD15E +:101A30003E4A10883E4AC0B211684D7A4E68DAB20A +:101A40005419E4B2904218D84A7A82184A72394A34 +:101A500013781B1ADBB21370002B01D19833CB70B3 +:101A6000019B1A88294B1343334A1A40C0239B0118 +:101A70005340019A9BB21380C5E7304A9A181278F6 +:101A800001333255DBE7019B1B881B06BBD5019B4D +:101A90002B4A1B881340802212021343019A1380A1 +:101AA000284B1B78802B01D1FFF74DFA144A13788D +:101AB000002BA8D080210B4319490B800023137001 +:101AC000A1E70868C378D82B00D0ABE68023446830 +:101AD000C3700B6800215972DB78902B00D071E63F +:101AE000712A00D06EE6124BB2881B6859680A70E2 +:101AF000B2885968120A4A705A7A02325A7261E6FA +:101B00009C040020506000408F8EFFFF8080FFFF0C +:101B100002600040BFBFFFFF30300000065C0040A5 +:101B20004C5C004020320000F906002006600040B6 +:101B300090040020940400208FBFFFFF4860004005 +:101B40000F8FFFFFF8060020F0B5404B8BB00891D7 +:101B500019783F4B09921B78019002933D4B019DF0 +:101B60001C683D4B3D481A7801231E0096403C4AB4 +:101B7000A662102D5ED11278006893408362012026 +:101B80000200364B05901F68354B1B789A40039234 +:101B90000200344B1B680693334B1B789A4093B278 +:101BA00002000793314B1B689C46314B1B789A40CF +:101BB000002304921A000198202806D1029D05985E +:101BC0001D4105423ED00398B861089820280FD1E6 +:101BD000002B01D11E4883540698056907980542D9 +:101BE00006D01B48855C05989840054318488554E5 +:101BF00009980139C9B2002802D0002900D1A66194 +:101C00006046049D0133DBB285618562082B05D1F6 +:101C100001320F4BD2B29B5C029300230029CAD140 +:101C20000E4B1A680E4B197801238B409362A66203 +:101C30000BB0F0BD019D112DA1D112780068934029 +:101C400083619CE70398B862BFE7C046E5040020C3 +:101C5000C5040020240700202807002014070020C6 +:101C6000180700201C070020200700200C07002078 +:101C700010070020F7B51F4B1F491A781F4B10287B +:101C80002ED101241E780D68B440AC6201263500C7 +:101C90000C6831001B7801969D40194B1B6800931E +:101CA000184B1B78994000238C46190020280DD131 +:101CB000154E019F765C1E413E4219D0A56101334D +:101CC000DBB2082B02D100230131C9B26646009F66 +:101CD000013AD2B2BE61BE62002AE7D1A562F7BD69 +:101CE0001128D3D101241E780D68B440AC61CDE732 +:101CF000A562E4E7E504002024070020280700206F +:101D00000C07002010070020C5040020F7B50D00C7 +:101D10001600FF27000203B24C7A01932A7AE3B23D +:101D2000A24202D26B720020FEBD20006A683840D9 +:101D3000D15C019B0134184380B2B047A4B2EDE7F7 +:101D4000022907D10F4B104A984218D0904209D16E +:101D5000180007E0032906D10A4B0B490B4A9842A9 +:101D60000BD1080070470429FCD1064B064A984263 +:101D700005D006499042F4D0054A8842E6D11000C9 +:101D8000F0E7C046380400204C0400206004002026 +:101D900074040020F0B52C4B85B019682B4B2C48EF +:101DA0001B7800780193012302901E0018001F0089 +:101DB000019A029C9640A040264D274A2D78126831 +:101DC000AF408E628446906224489D4000688762DE +:101DD000046803941C00AC402500039C2543056067 +:101DE0004568019CBD4345609C401D00A5400868B6 +:101DF0001C00284308604868B04348601068029996 +:101E000099408C4021000143604611605168814334 +:101E1000134851600078134A984083401268124872 +:101E2000116899431160D1680B43D36080220F4B36 +:101E30001A70002319000E4A13701A18013311701A +:101E4000202BFAD105B0F0BD240700202807002080 +:101E50001807002010070020140700200C0700209E +:101E6000200700201C070020C5040020E6040020F5 +:101E7000E504002010B5334B1B78082B5DD016D835 +:101E8000314C032B44D007D8012B2DD0022B31D05D +:101E9000EE222D4B1A7023E0062B44D049D8042B98 +:101EA000F6D18123012223702021112027E00F2B5E +:101EB00034D008D8244C0D2B25D00E2BE8D181230B +:101EC0000022237027E0802B08D01F4CFF2B08D066 +:101ED000102BDDD181230022237027E0FFF75AFF6A +:101EE00010BDF0232370FBE7812320202370FFF730 +:101EF000C1FE06E081230122002123702020FFF78C +:101F000023FE8223EEE78123002223701100F5E7F0 +:101F100081230122237020211020F0E781230A4C25 +:101F200000222370C0E781230122237020210800B2 +:101F3000E5E7812310202370D9E78123024C11208B +:101F40002370D4E7C4040020E6040020BC234749E2 +:101F5000DB038A6AF0B513438B628B6A444A01241F +:101F600013408B6290238022DB051868D201024364 +:101F70001A6080229A61B0224869520302434A6182 +:101F80001A683C483C4F02401A608022D8685203CD +:101F900002430420DA601A68A2431A60DA68224316 +:101FA000DA601A6882431A60DA680243DA60102243 +:101FB0001D6895431D60DD682A43DA6040221D6874 +:101FC00095431D60DD682A43DA601A682B4D2A406C +:101FD0001A608022DD68D2042A43DA601A68284D2C +:101FE0002A401A608022DD68D2052A43DA601A6826 +:101FF000244D2A4080251A60DA68ED022A43DA600F +:10200000214A1668A6431660D6683443D4601E6819 +:102010003E401E60DC683C40DC6080234C691B0352 +:1020200023434B61194B1A4C1E681A4F26431E60FE +:102030001E683E401E60DE683443DC604B691D4311 +:102040004D611368144D2B401360D468134B1C432F +:10205000D460116829401160D1680B43D3601368C4 +:1020600083431360D3681843D060F0BD0010024072 +:10207000FFFFA1FFFFFFEFFFFFEFFFFFFFFFFFFBF2 +:10208000FFFFFFBFFFFFFBFF000400480008004800 +:1020900055555555AAAAAAAAFFFFAAAA0000555548 +:1020A0009022B64B12031968F0B50A431A608022D9 +:1020B00087B0920219681142FCD0012259680A4384 +:1020C0005A608022596852020A435A608022596835 +:1020D00052030A435A608022196852040A431A6064 +:1020E0008022920419681142FCD011210220A44AD6 +:1020F00011605A680E398A4302435A601A6B7D3167 +:102100000A431A638022DC6912042243DA6162B650 +:102110009C4B4025DA8F9C4C8243DA87DA8F01385A +:102120008243DA8700229948C2872280984C258012 +:10213000984C083525808025974C6D012580974C5B +:102140002180C2879649974A11808021964A0906C4 +:1021500011608022D98FD2000A43DA87934A944BC8 +:102160001A80FFF7F3FEF022924B1A70924E202352 +:10217000327811009943D2292ED190499048C978DC +:10218000C3780224FF2904D1FF3B1C00631E9C413D +:10219000E4B28C4BDB78FF2B00D003248A4BDB7836 +:1021A000FF2B00D00424894B894F1C703860D22A41 +:1021B00012D10023012505E02100FFF7C1FD012315 +:1021C0000135EDB2A542F7D3002B00D03860802254 +:1021D0003B68DA70D02333703378F22B05D10022BC +:1021E000023B33707A4B1B68DA703578D02D01D002 +:1021F00000F0DAFC764E3068C378802B01D000F016 +:10220000D3FC724B1978FFF79BFD002330600188E7 +:10221000C57004004372C07ACDB21038142801D9B9 +:1022200000F0C0FC02F0D8FB5100D80031013501AC +:102230003400BE04BE04BE04BE04BE04BE04BE041C +:10224000BE04BE04BE04BE04150024003E004300CC +:102250004900E07BC4230F2801D900F0A4FC000151 +:102260000143237AA278C9B2606801F049FA0EE00E +:10227000E17B3C230A009A438833002A01D000F016 +:1022800092FC237AA2782943606801F06FFA6072A9 +:102290004F4B1B6819889A7A52181A80D822DA7024 +:1022A00000F082FC237AA278E17B2943DCE7E17B22 +:1022B0003F230A009A438533DFE7E17B237AA27844 +:1022C0002943606801F0E2F9E1E7E27B012A0DD1E0 +:1022D00080208909CEB20002102100F04CFF0F21AE +:1022E000E02031400022000200F045FFE37B032B99 +:1022F0000ED120883D3380099D43364BC1B2C0B218 +:10230000C01880B200F02CFD237AA2788021CCE79F +:102310001E2B07D1C0202188223389099D43C9B2D1 +:102320000002EFE71C2B11D1A0208121C0012688DB +:1023300000F016FD8020F609F6B23100000200F030 +:102340000FFDA0200021C00100F00AFD8021E27BEA +:1023500049421F2A05D00D43EDB2237AA278290005 +:1023600082E77022A02095430D432188C00109090E +:10237000C9B2EDB200F0F4FCEFE7C0460010024035 +:1023800000200240025C0040505C0040065C0040BF +:102390000060004004600040066000404C5C00406B +:1023A00020320000005C004000E100E00080FFFF00 +:1023B000585C0040E6040020A40400204C040020E7 +:1023C000380400206004002074040020300700203E +:1023D0008C04002069FDFFFFE37BFE2B3DD1490902 +:1023E000C9B2C14800F028FF1F231D40237AA178FD +:1023F0000193BE4B28025A696768D2B202435A6100 +:1024000080209022C000D20590610120FF269062BA +:10241000033090625A69360232400A435A61C0461C +:10242000B34800228446C046604600690131000A74 +:10243000B8545869C9B23040084358610132019814 +:10244000D2B29042EFD290230421DB059961802122 +:10245000C9009962012199616272E27B012A00D070 +:1024600016E7802010210002268800F084FE1F213C +:10247000A0203609F6B231400022000200F07BFEB7 +:102480000F21237AA2782940FEE6237AA2786021E0 +:102490000BE7E37B002B1ED18033C9091D43CBB270 +:1024A0000293FF20029B92499B004A690340914896 +:1024B000024013434B61C0209021029BC905C0001C +:1024C000DB004A6903408C48024013434B61237A86 +:1024D000A2782900F5E6012BE3D18904890E3F3368 +:1024E0000B43DDE7F37B002B06D128008038C0B218 +:1024F000824A3100FFF70AFCF27B012A1CD18020BE +:1025000037881021BF053B0F0002019300F033FE16 +:10251000E02000220199000200F02DFE777ABBB284 +:10252000039380232B431B021BB20593337A039A38 +:10253000934200D3F0E07772F37B032B0BD13F2063 +:1025400028408025054330886D4B8009C0B2320099 +:10255000290001F03DF8F37B042B06D128008038D8 +:10256000C0B2684A3100FFF7D1FBF37BFD2B0BD1E2 +:102570003F202840802505433088634B8009C0B246 +:102580003200290001F024F8F37B1E2B11D13F20EB +:1025900028408025338805439B09DBB20493747A75 +:1025A0002B021BB2A7B20593337ABB4200D30DE1D5 +:1025B0007472F37B0C2B19D11F2028408025054312 +:1025C000C0203488A5216409E4B2C00100F0C8FB32 +:1025D00021004E4800F0C4FB2B021BB2747A039317 +:1025E000337AE7B2A34200D33FE17772F37B1C2B2F +:1025F0003BD1A02033888121DB09DBB2C0010393EA +:1026000000F0AEFB80200399000200F0A9FBA0209F +:102610005421C00100F0A4FB777AAA21BBB23C4848 +:10262000019300F09DFB55213A4800F099FB2021D1 +:10263000374800F095FB80232B431B021BB2059308 +:10264000337A019A934200D332E180209021000234 +:10265000777200F085FB80200021000200F080FBF3 +:102660008020F021000200F07BFBF37B1F2B33D195 +:10267000A0203188C0010909C9B200F071FB747A49 +:10268000AA21A3B22248019300F06AFB55212148F8 +:1026900000F066FB1E48202100F062FB70238020C2 +:1026A00004279D434042284340B203020493337AF7 +:1026B000019A934200D343E180209021000274727A +:1026C00000F04EFB80200021000200F049FB80203A +:1026D000F021000200F044FBF4233288F370B37A57 +:1026E0009B18338080E2C046FF3F0000000800488E +:1026F0000004004803FF0000FFF90000FD2E000861 +:10270000A52E00080D2E00085D2E0008FFFF00001A +:10271000AA8A0000558500008020002210210002B6 +:1027200000F029FDAA21E04800F01AFB5521DF48FE +:1027300000F016FBA021DC4800F012FB059C73683A +:102740003C43A4B2D95D200000F00AFB80200122A6 +:102750001021000200F00FFDE0200022019900028C +:1027600000F009FDC046200000F030FB049020007E +:1027700000F02CFB049B8342F4D17368049ADB5D68 +:10278000CB4C93420FD17B1CDFB2039B22680133F9 +:102790009BB2039304239A432260E2681343E360ED +:1027A0000223A362C2E6802001221021000200F071 +:1027B000E2FCE02000220199000200F0DCFC04238E +:1027C0002268134323600223A361AFE6C0200121E6 +:1027D000000200F0C5FAAA21B64800F0C1FAC020F4 +:1027E0000021000200F0BCFA5521B04800F0B8FA10 +:1027F000C0200121000200F0B3FAA021AD4800F092 +:10280000AFFAC0200499000200F0AAFA059B234306 +:102810009BB2019373680198195D00F0A1FAC0465C +:10282000019800F0D3FA0390019800F0CFFA039BCF +:102830008342F4D1736803991A5D9D4B8A420DD18E +:1028400004221968013491431960D96801370A4399 +:10285000DA600222E4B2BFB29A62A5E604221968E5 +:102860000A431A6002229A619EE6AA218E4800F06D +:1028700077FA55218D4800F073FAA0218A4800F0BC +:102880006FFA039AE3B213439BB201937368019802 +:10289000D95D00F065FAC046019800F097FA07008C +:1028A000019800F093FA8742F5D10134A4B297E67B +:1028B000A0205421C00100F053FA059CA0213C4304 +:1028C000A4B2200000F04CFA73682000D95D00F03B +:1028D00047FAC046200000F079FA0490200000F08A +:1028E00075FA049B8342F4D17368049ADB5D704CE3 +:1028F00093420FD17B1CDFB2019B226801339BB254 +:10290000019304239A432260E2681343E3600223A5 +:10291000A36295E6A0208121C00100F021FA802069 +:102920000399000200F01CFAA0205421C00100F01D +:1029300017FA04232268134323600223A3617FE66E +:10294000049DA0212543ADB2280000F009FA736868 +:102950002800195D00F004FAC046280000F036FA9D +:102960000390280000F032FA039B8342F4D173688D +:1029700003991A5D4E4B8A420ED1019A01340132FD +:1029800092B201921A68E4B2BA431A60DA683A4322 +:10299000DA6002229A628AE61A683A431A600222D0 +:1029A0009A6184E6F37B002B04D1434A310028006E +:1029B000FFF7ACF9F37B022B04D1404A3100280029 +:1029C000FFF7A4F9F37B042B04D13D4A3100280022 +:1029D000FFF79CF9F37B0B2B04D13A4A3100280016 +:1029E000FFF794F9F37BFE2B00D075E6318836486B +:1029F0004909C9B200F020FC747AAA21A3B2334875 +:102A0000019300F0D5FB5521314800F0D1FB2F4850 +:102A1000202100F0CDFB1F2004272840030204934F +:102A2000337A019A93420DD274729021002000F003 +:102A3000BFFB0021080000F0BBFBF021002000F0EC +:102A4000B7FB49E6049DA0212543280000F0B0FB18 +:102A500073682800195D00F0ABFBC046280000F049 +:102A6000CFFB0390280000F0CBFB039B8342F4D103 +:102A7000736803991A5D0E4B8A420ED1019A013494 +:102A8000013292B201921A68E4B2BA431A60DA686B +:102A90003A43DA6002229A62C2E71A683A431A603D +:102AA00002229A61BCE7C04655D50000AAAA0000E0 +:102AB00000040048559500000D3400088D330008CF +:102AC00049330008C1320008FF3F0000AA0A000095 +:102AD00055050000280060304A4A3100C0B2FFF7B7 +:102AE00015F9F9E5F37B042B06D128008038C0B234 +:102AF000454A3100FFF70AF9F37B052B04D1424A1E +:102B000031002800FFF702F9F37B062B06D12800DD +:102B10008038C0B23D4A3100FFF7F8F8F37B072B4D +:102B200004D13A4A31002800FFF7F0F8F37B002B7C +:102B30001CD1FF2480331D4333883548DB09DBB2C9 +:102B40009A0041692240334CDB0021400A43426134 +:102B50009021C020C905C0004A6903402E480240A8 +:102B600013434B612800310000F072FCF37B012B12 +:102B700000D0B1E53388264A264851699B049B0E54 +:102B800001409B000B4390215361C9054B69224AC8 +:102B900028001A4080239B0013434B61310000F052 +:102BA00057FC99E5C323E3701C4B1C78F02C1BD118 +:102BB0001B4D2E68F378982B16D11A4B30001978DC +:102BC000FFF7BEF800232860C370F07AF470103865 +:102BD0003578042806D801F0F5FE85FCE5FE7DFF7A +:102BE00085FF7FFDC323F3700F4B1B78F02B01D1C2 +:102BF000FFF7BCFA832B01D0FFF7B8FAFFF73AF9D9 +:102C0000FFF7B4FA612D00081D2D0008D92C00082B +:102C10000004004803FF0000FFF90000A4040020A6 +:102C20008C04002030070020E6040020002302006E +:102C30000002002A04D1002B01D0802318437047E2 +:102C4000DB43511EDBB20A40F3E700000E4B0F4A94 +:102C500058610F4B0902186802431A605A6908202C +:102C6000D2B21143902259610121D2059062916242 +:102C7000C046C046C046C046906191611A68054989 +:102C80000A401A607047C0460008004800005555C9 +:102C900000040048FFFFAAAA0D4B012258619023AF +:102CA0000421DB059A629962C046C046C046C04610 +:102CB000C046C046C046C046C046C046C046C046E4 +:102CC000C046044800699961000AC0B29A61704721 +:102CD000000800480004004870B504000D000D48CD +:102CE000AA21FFF7B3FF55210B48FFF7AFFFA02143 +:102CF0000848FFF7ABFF29002000FFF7A7FF2000DF +:102D0000FFF7CAFF0500C0462000FFF7C5FF854258 +:102D1000F5D170BDAA8A00005585000070B5040089 +:102D20000D000D48AA21FFF791FF55210B48FFF731 +:102D30008DFFA0210848FFF789FF29002000FFF739 +:102D400085FF2000FFF7A8FF0500C0462000FFF721 +:102D5000A3FF8542F5D170BD55550000AA2A000099 +:102D60009023DB0530B51C68134D09022C401C6014 +:102D7000DA68124C2A40DA60114A506102229A62E3 +:102D8000104A00B215682C4314605469E4B2214320 +:102D900051618021C9009961002801DA01209862FF +:102DA000C046C0469962012199614918996113682A +:102DB00005490B40136030BDFFEFFFFF0000555584 +:102DC0000008004800040048FFFFAAAA0D4B80221B +:102DD00058619023D200DB0500B29A61002801DA25 +:102DE00001229A62C046C046C046C046064B8022B9 +:102DF00018699023D200DB059A620122000AC0B252 +:102E00009A617047000800480004004870B504004B +:102E10000D001048AA21FFF7A3FF55210E48FFF728 +:102E20009FFFA0210B48FFF79BFF29002000FFF721 +:102E300097FF802000210002FFF792FF2000FFF79C +:102E4000C5FF0500C0462000FFF7C0FF8542F5D151 +:102E500070BDC04655D50000AAAA00000D4B0E4A11 +:102E600058610E4B0902186802431A605A69D2B2BF +:102E70001143902259618021D20510684901014314 +:102E800011604021916291611A6805490A401A60F7 +:102E90007047C0460008004800005555000400482F +:102EA000FFFFAAAA104B114A10B558611068104BC9 +:102EB00009020343136053690E4CDBB2194390239C +:102EC00051618021DB0518684901084318604020E2 +:102ED0009862186820401860D8680143D960136868 +:102EE00005490B40136010BD00080048000400486D +:102EF00000005555FFEFFFFFFFFFAAAA70B50400C1 +:102F00000D000D48AA21FFF7CDFF55210B48FFF713 +:102F1000C9FFA0210848FFF7C5FF29002000FFF7DF +:102F2000C1FF2000FFF752FF0500C0462000FFF759 +:102F30004DFF8542F5D170BD55550000AA2A00000D +:102F4000224B10B51968224B224C1A8852085200A5 +:102F5000505A214A10801A88023292B21A805208BE +:102F60005200505A1D4A10801A88023292B21A80BA +:102F700052085200505A1A4A10801A8819480232D0 +:102F800092B21A8052085200515A174A11801A8878 +:102F90002188023292B21A808A4210D908318A1AE4 +:102FA00092B2028022881A801049114B0A8813437A +:102FB000104A1A40302353409BB20B8010BD0E4C78 +:102FC00021888A42EAD808230380EDE72C070020F5 +:102FD000A2040020A00400204060004042600040A5 +:102FE000446000400260004046600040005C0040D9 +:102FF0008080FFFFBF8FFFFF9E040020FEE70000E0 +:10300000F7B501230225294F01923A780091054333 +:1030100093400421A020264E2D049BB22943326800 +:10302000C00100F0DDFB040001283DD13B78092000 +:103030009C4005437830A3B232682900FF3000F08D +:10304000CFFB040001282FD13B7832689C40290037 +:10305000A3B2002000F0C4FB0400012824D1009B8F +:10306000180AFFF7E3FD3B7832689C402900A3B2C1 +:1030700000F0B6FB0400012816D16B461878FFF764 +:10308000D5FD22003B7829009A4093B2326800F0C7 +:10309000A7FB0198FFF7CAFD3B7832689C402900E6 +:1030A000A3B200F09DFB0400E0B2FEBD08070020C3 +:1030B00004070020F7B501230225274F00903A7836 +:1030C0000191054393400421C020244E2D049BB25E +:1030D00029433268800100F083FB0400012838D1C5 +:1030E00009231D433B78C0209C403268A3B22900CD +:1030F000400000F075FB040001282AD13B783268BB +:103100009C402900A3B2002000F06AFB04000128C3 +:103110001FD1019B180AFFF789FD3B7832689C405C +:103120002900A3B200F05CFB0400012811D16B461A +:103130001879FFF77BFD22003B789A4093B2009A02 +:1031400014430922E1B209041143326800F048FB3C +:103150000400A0B2FEBDC0460807002004070020FE +:103160000023800080B2834200D17047C046C04631 +:1031700001339BB2F7E770B506000D00002A08D0B6 +:1031800080200002FFF722FE802080210002FFF74E +:10319000E7FD05243000013CFFF718FEE4B22900EA +:1031A0003000FFF7DDFD6D08002CF3D170BD00008D +:1031B0000F4B30B59022586180230124D205DB00EB +:1031C00093620C4B94621D680B48090228431860F7 +:1031D0005869C0B201435961C04608219162C04696 +:1031E00091611968054801401960946130BDC0467D +:1031F000000800480004004800005555FFFFAAAA37 +:103200000B4B10B580215861902301220424DB056B +:10321000C90099619A629C62C046C046C046054892 +:1032200000699C61000A9962C0B29A6110BDC046F3 +:1032300000080048000400480E4B984202D8802342 +:103240001B0218430C4B0D4A58610D4B09021868BC +:1032500002431A605A69D2B211435961C0469022A2 +:103260000821D2059162C04691611A6805490A4059 +:103270001A607047FF1F0000000800480000555505 +:1032800000040048FFFFAAAA0A4B984202D88023F4 +:103290001B021843084B042258619023DB059A62F5 +:1032A000C046C046C046C046044908699A61000A43 +:1032B000C0B27047FF1F000000080048000400482B +:1032C000F8B505000E001C4F1C4B3888202120301B +:1032D00080B21C78FFF744FDAA211948FFF7ACFF24 +:1032E00038881021103080B2FFF73AFD552115487B +:1032F000FFF7A2FF38882021203080B2FFF730FD91 +:10330000A0210F48FFF798FF24013888E4B2001984 +:1033100080B22100FFF724FD31002800FFF78CFF69 +:103320002800FFF7B1FF0400C0462800FFF7ACFFFC +:103330008442F5D1F8BDC046340400208804002042 +:1033400055150000AA0A000070B504000D000D48D4 +:10335000AA21FFF771FF55210B48FFF76DFFA02150 +:103360000848FFF769FF29002000FFF765FF2000EC +:10337000FFF78AFF0500C0462000FFF785FF854262 +:10338000F5D170BD55150000AA1A000070B50400F3 +:103390000D001A4E02213088023080B2FFF7E0FCA7 +:1033A000AA211748FFF748FF30880121013080B279 +:1033B000FFF7D6FC55211348FFF73EFF3088022166 +:1033C000023080B2FFF7CCFCA0210D48FFF734FF9C +:1033D0000D4B30881978401880B2FFF7C1FC2900E6 +:1033E0002000FFF729FF2000FFF74EFF0500C04631 +:1033F0002000FFF749FF8542F5D170BD340400205D +:1034000055150000AA0A00008804002070B50400C9 +:103410000D000D48AA21FFF70FFF55210B48FFF7BC +:103420000BFFA0210848FFF707FF29002000FFF746 +:1034300003FF2000FFF728FF0500C0462000FFF72C +:1034400023FF8542F5D170BD55150000AA0A000082 +:10345000F7B504000E004D7AC046C046C046C046CF +:10346000C046C046C046C046C046AA215348FFF7E2 +:10347000EDFB55215248FFF7E9FB240220214F487C +:10348000FFF7E4FB23B20193EBB20093337AAB4234 +:1034900014D26B4680201B78902173720002FFF7D4 +:1034A000D5FB802000210002FFF7D0FB8020F02117 +:1034B0000002FFF7CBFBC0460020FEBD414B424A55 +:1034C000196808200A43FF211A605A690A40A0219E +:1034D00009020A435A6190220121D2059062916249 +:1034E000C046C046C046C046FF24906191611A683C +:1034F00036492C400A401A60019B009A1C437368AD +:10350000A4B2995C2000FFF7A1FBC046C046C046AC +:10351000C046C046C046C046C046C046C046200061 +:10352000FFF7BAFB0700C046C046C046C046C046CB +:10353000C046C046C046C0467368009A9B5C834242 +:1035400016D0C046C046C046C046C046C046C0466B +:10355000C046C0462000FFF79FFBB8420BD1C046D3 +:10356000C046C046C046C046C046C046C046C0462B +:103570000135ADB288E7C046C046C046C046C04629 +:10358000C046C046C046C046C046C046C046C0460B +:10359000C046C046C046C046C046C046C046C046FB +:1035A000C046C046C046C046C046C046C046C046EB +:1035B000C0462000FFF770FB0700CBE7AA8A000097 +:1035C000558500000004004800005555FFFFAAAAD9 +:1035D000F0B5150085B00190547A09021E000BB2B7 +:1035E000A7B203932B7ABB4203D200206C7205B0C2 +:1035F000F0BD00212048FFF7B3FBAA211F48B047C8 +:1036000055211F48B047A0211C48B047019B1D4AC7 +:103610001900981880B2FFF7A3FB039B23439BB2CA +:1036200000936B680098195DB047C0460098FFF79B +:10363000CDFB02900098FFF7C9FB029B8342F4D1B7 +:103640006B6802991A5D104B8A420DD104221968E9 +:10365000013491431960D96801370A43DA600222C4 +:10366000E4B2BFB29A62BDE7042219680A431A6045 +:1036700002229A61B6E7C04669FD00005555000078 +:10368000AA2A000069FDFFFF00040048F0B51A4CAB +:10369000050060690902C0B2014361619021042004 +:1036A000FF26C905886203388862616936023140A5 +:1036B0001143616100202100104FC046C046C04642 +:1036C000C046C046C046C046C046C046C0463C692B +:1036D0000132240A2C544C69D2B2344001301443D4 +:1036E000C0B24C619842E8D990230422DB059A616C +:1036F000033A9A61F0BDC046000800480004004843 +:10370000F0B5184C050060690E02C0B2304360612C +:1037100080269020F600C00549B28661002901DAB2 +:1037200001218162FF2661693602314011436161E6 +:10373000C04600200C4FC04639690132090A29549D +:103740006169D2B2314001301143C0B26161984227 +:10375000F1D990238022DB05D2009A6201229A617E +:10376000F0BDC0460008004800040048F0B5174C02 +:1037700005000E0060691F2925D880213143090208 +:10378000C0B20143616190210420FF26C90588620F +:1037900061693602314011436161C04600200C4F1F +:1037A000C04639690132090A29546169D2B23140EF +:1037B00001301143C0B261619842F1D990230422D3 +:1037C000DB059A61F0BDC0B20902DAE700080048E3 +:1037D000000400488047C0460000000000000000D0 +:1037E000F0B5474680B4061C081C000C102801D513 +:1037F000162700E004270007000F8046FF20014045 +:103800005468251C1D439C43F60313850AD5C04606 +:10381000C046C046C046C046C046C04694801383DA +:10382000958002E0012000F081F801390AD4381CAB +:1038300000F07CF8C046948013839580C046C04653 +:103840007600E2E7381C013800F070F894801383AA +:103850009580042000F06AF8108A184001D0FF20FB +:1038600061E0C046C046C046C046C046C0469480DF +:103870009580108A184055D001200226B04552D0BC +:103880000921168A1E40FCD1012000F04FF89480D7 +:10389000C0469580C04603E0C046C046C046C0460C +:1038A000948095807600108A1840EFF300804000E5 +:1038B000C00F0643381C023800F038F89480958019 +:1038C000022000F033F80139EAD5138594800120F5 +:1038D00000F02CF813839580301C8021022399403E +:1038E0000E401BD1002341085E4149085E41490852 +:1038F0005E4149085E4149085E4149085E41490808 +:103900005E4149085E4149085E41760808D3400897 +:10391000FF21084048400002013004E00E2002E090 +:10392000092000E0002080BCB846F0BD0138FDD180 +:103930007047C04603685A0003D45B005B08C01898 +:103940007047802212061343F9E7C046F0B5574688 +:103950004E46DE464546E0B5814683B09246002994 +:1039600025D04B1E9B46002701935B46FB18DC0FBE +:10397000E4184B466410E5005E193000FFF7DAFFEB +:10398000019B8046A3420BD0280008304844FFF733 +:10399000D1FFD04506D80138504509D2671CE4E76D +:1039A000504505D9A74202D0631E9B46DDE700269D +:1039B000300003B03CBC90469946A246AB46F0BDF1 +:1039C000012809D0022805D0002801D00020704726 +:1039D0000248FCE70248FAE70248F8E7E14000083D +:1039E000F9400008ED40000830B5234B83B00500D6 +:1039F0008C1E002B2AD001A9200000E000BF002867 +:103A000020D001992200FFF7A1FF041E1AD0FFF772 +:103A100091FF6368A864012B10D0201D002B1BDBD5 +:103A2000FFF788FF0023E8642B650368002B17DB92 +:103A3000FFF780FF2861002003B030BD0023052080 +:103A40002B61F9E7002309202B61F5E70B480C49AE +:103A5000091AC9100191D5E70123E8642B65E4E751 +:103A60001801000FFFF7ACFF2861002801D10930D1 +:103A7000E2E70020E0E7C04600000000DC4A000862 +:103A8000AC4B0008036810B50400DA0705D49B07A7 +:103A90000FD5483000F084FC23685A070FD51A0769 +:103AA00014D5DB0604D42000D130FF3000F084FCB4 +:103AB00010BD483000F070FC23685A07EFD4200096 +:103AC000D03000F071FC23681A07EAD4200051308E +:103AD000FF3000F06DFC2368E3E7C0460368002B6D +:103AE00000D01B1818007047092070477047C04667 +:103AF00070B504000D0008E02B6C2A006361210002 +:103B0000012023699847082807D1296C2000FFF776 +:103B10006BFF0028F0D000F09FFE0728FBD10020AB +:103B2000296CFFF7E3FF281D00F020FCF0B5CE461E +:103B3000474680B5C368324C9846A5448369060061 +:103B400014000431402205A8994600F08DFE0023A0 +:103B500004AD296C30000493FFF746FF631E9C41BF +:103B600007000934002F15D0AB6B10216B644B4656 +:103B700021430193C9B20095330032000120C047B0 +:103B8000002833D13800F5239B009D440CBC90469F +:103B90009946F0BDF0222B6C5200736129007CA87D +:103BA00000F062FE7CAA31003369200098478A9BAE +:103BB00007006B6403934B4600950193320033007A +:103BC00021000120C047002810D1F0227CA952001A +:103BD000280000F049FE082F06D1296C3000FFF7BD +:103BE00003FF09240700BDE7072F01D00927C9E714 +:103BF0000020296CFFF77AFF05A800F0B7FBC0464C +:103C00002CFCFFFF406C704770B5CB6BFAB00B64B7 +:103C100004000E004022043103A800F025FE012319 +:103C20005B42029306E002AA21002369984705003F +:103C300008280AD1129B200019000193FFF7D4FE37 +:103C40000028F0D009207AB070BD02A8FFF71AFF53 +:103C5000062DF7D131002000FFF74AFF10B5826131 +:103C6000DA6BC1601A6419000022FFF75FFF10BD14 +:103C7000436970B50B64C36804000D00002B04D0C9 +:103C80000122FFF753FF00F0E7FD0A00236901005E +:103C900002209847072807D0082803D129002000D0 +:103CA000FFF726FF00F0D8FD0020296CFFF71EFF6C +:103CB000281D00F05BFBC046C36810B5002B05D083 +:103CC000CB6B00220B64FFF731FF10BDFFF79CFFA9 +:103CD000FBE7C0467047C046836810B5002B02D092 +:103CE00001000120984710BD10B5012907D0002917 +:103CF00007D003390224012901D9200010BD012475 +:103D0000FBE70224002BF8D10F2AF6D89200821884 +:103D10005268029B00241A60EFE7C04600B585B0E8 +:103D200003AB0A00009300210023FFF7DDFF039897 +:103D300005B000BD10B5012907D0002907D003390F +:103D40000224012901D9200010BD0124FBE702242F +:103D5000002BF8D10F2AF6D8029B92001B6882181C +:103D600053600024EFE7C04600B585B003AB039273 +:103D700000930A0000230021FFF7DCFF05B000BD1F +:103D800070B51A4CD36BA544136406000D0019A836 +:103D9000111D402200F068FD01235B42189314E0DE +:103DA0000C2118A802AAFFF7DFFF290018A8B047C6 +:103DB000002812D1069B18AA02A90830019398473F +:103DC000040005280AD0092807D0289B02A819005A +:103DD0000193FFF709FE0028E2D0092418A8FFF795 +:103DE00051FE200090239B009D4470BDC0FDFFFF4D +:103DF000F0B5DE464E464546574693460322E0B5AB +:103E00001E0013008BB003400193CB6C0D001C1DF2 +:103E10001B6808940793002E66D11B02079306AB1C +:103E20005E731A73019B022B00D16EE02B6DDB07D2 +:103E300047D40023A846B2460293083303400393B5 +:103E40002568002D00D137E15346022B49D0258843 +:103E5000668804340123370099469F4343469B6C90 +:103E60000F219C4658466744FFF758FF00228742BF +:103E700006D82A004B469A43D719B842804142429D +:103E800002230121760033400D402B43012B3ED00D +:103E9000002B5AD0022B1CD1236801995F007F08A8 +:103EA000002965D1002A06D0039A002A00D188E0B3 +:103EB000002F00D1AAE0002B65DB0137BF00E41919 +:103EC000BEE700230293022E47DDFFF70DFE002818 +:103ED00049D009200BB03CBC90469946A246AB465F +:103EE000F0BD66680834B5E7022E9BDC1A0C1B0493 +:103EF0000793022306A90B73FD3313409B00E418BC +:103F0000019B4A73022B00D090E7AC6B8EE7019BBC +:103F1000002B3AD1002A16D02368DD0F63689A1C63 +:103F2000D7D0424658320692013300D1C6E0201D58 +:103F3000FFF7D4FD06AB01002A00404600E000BFB9 +:103F4000002800D0A7E008347AE7019B002B02D0BC +:103F5000002A00D08BE0043472E707A9584600F02D +:103F6000D1FA0028B5D1029B002B5DD10820B1E722 +:103F700043460D2158461D6AFFF7D0FE854263D0A7 +:103F80002368002B99DA043497E743460D215846FD +:103F90001D6AFFF7C3FE8542D5D143469B6A9C420A +:103FA000D1D145462000FFF7C5FC0F21020058463D +:103FB000FFF7DAFE58462A000021FFF7D5FE07205A +:103FC00088E7002F22D058235146434406AABA4618 +:103FD000251D0026049405911F00914603E0043539 +:103FE0002600A24514D028000697FFF777FD4B4620 +:103FF000010000224046741C00E000BF0028EED003 +:104000005746059B049C9A46B742B9D1454601E004 +:104010004546049C0D215846FFF780FE069B28620A +:104020006B62AC62062055E70F215846FFF776FE1B +:104030000E2102005846FFF797FE5846274A0F21E7 +:10404000FFF792FE072045E743469B6A9C4297D1C3 +:10405000434642469F620023D36204331363231D09 +:1040600053632368002B32DB0123029325E72000F2 +:10407000FFF760FC454604340600AC63404600E0B0 +:1040800000BF002800D124E7584632000F21FFF777 +:104090006BFE07201EE707000D2158464546FFF737 +:1040A0003DFE2862022F0FD1069BEB6243462C3364 +:1040B0006B62AC6206200DE7564604E70D215846B8 +:1040C0004546FFF72BFE2862069B6B62F1E738003E +:1040D000013080004546201865E7C046000000001A +:1040E00010B50023FFF784FE10BDC04610B50123B4 +:1040F000FFF77EFE10BDC04610B50223FFF778FE25 +:1041000010BDC046F0B5CE46474680B50600C3B0E8 +:1041100014001D0001294ED0002933D003290AD0F4 +:10412000042902D1002B00D189E0022043B00CBC4D +:1041300090469946F0BD032BF7D11404150C240CBE +:104140002B19102BF1D8082203681A4200D0E7E09F +:1041500020AB1800984600F02DF9B36BED001A0063 +:10416000002C09D0E400EA1A1C1942441968D15005 +:1041700004339C42FAD12200B263404600F018F9A1 +:104180000020D3E70220002BD0D100230127100408 +:10419000B56B000C321D39009940084202D02968E5 +:1041A0000435116001330432102BF4D10020A30434 +:1041B000BCD4B563BAE71404170C240C012B5FD0F0 +:1041C000052BB2D13B19202BAFD80F2F7DD9A1469B +:1041D000002C65D1002223009146B16B002B00DC3E +:1041E00088E020A88046FA00DB00521ACB1842442F +:1041F0000868505004318B42FAD119004B46002B0D +:1042000010D04B4658003A00102F00D21022002345 +:10421000103AD2006A448000CC58D4500433834210 +:10422000FAD1C918012D5ED0B1630F2F74D94B4656 +:10423000002BA5D0684600F0B7F8002076E7102ADA +:1042400000D972E7102203681A4245D120AB18004A +:10425000984600F0B3F800230120B16B02009A40A9 +:10426000144204D045460F689A00AF500431013320 +:10427000042BF3D14046B16300F09EF8002055E7CF +:104280003B19102B00D950E70F2F00D94DE7002321 +:104290009946012233681A4230D14B46002B5AD03E +:1042A000042233681A4242D1012D47D00F2F06D87D +:1042B00020AB180000F076F84B46002B8AD06846F9 +:1042C00000F074F81023DB1B87E7102BDFD91022D6 +:1042D000524291469944DCE793430360D130FF306A +:1042E00000F06CF8B2E7043120A8B16300F054F894 +:1042F00000201BE74B46002B84D193E71900914324 +:104300000A003160052D1ED0032230009343336034 +:10431000483000F043F8C0E720A800F041F886E7F5 +:10432000934303605130FF3000F044F810E7300051 +:1043300093433360D03000F039F8B5E720AB180074 +:1043400000F02CF8BEE7022330001A4332604830F8 +:1043500000F028F8A1E7012D03D00F2F00D939E78D +:10436000A6E720AB180000F019F833E7011C343140 +:1043700038C9043B9C461D60A646011C20313CC93F +:1043800090469946A246AB46011C0831FCC94168DB +:104390000068E54600BDC0467047C0467047C0464D +:1043A0007047C0467047C0467047C0467047C04619 +:1043B0007047C0467047C0467047C0467047C04609 +:1043C00001B401A801B585B0FFB408A841464A462A +:1043D00053465C4665463EC001A83EC80F98009013 +:1043E00000230CB401A9FFF70FFC109B12B0184773 +:1043F00001B401A801B585B0FFB408A841464A46FA +:1044000053465C4665463EC001A83EC80F980090E2 +:1044100000230CB401A9FFF72BFC109B12B0184726 +:1044200001B401A801B585B0FFB408A841464A46C9 +:1044300053465C4665463EC001A83EC80F980090B2 +:1044400000230CB401A9FFF737FC109B12B01847EA +:1044500001B401A801B585B0FFB408A841464A4699 +:1044600053465C4665463EC001A83EC80F98009082 +:1044700000230CB401ABFFF7F1FB109B12B01847FF +:1044800001B401A801B585B0FFB408A841464A4669 +:1044900053465C4665463EC001A83EC80F98009052 +:1044A00000230CB401AAFFF76BFC109B12B0184755 +:1044B000027A0300002A04D1427AB020002A07D1F0 +:1044C0007047013A02720268100E12021A60F7E792 +:1044D000013A5A725A68111D596003211268197203 +:1044E000F2E7C04600B585B003AB00930C22002371 +:1044F0000021FFF7F9FB039805B000BD10B5FFF7E9 +:10450000F1FF10BDF0B557464E464546DE46002346 +:10451000E0B587B003930F339846083B9946802354 +:104520001B0306000F009A463800FFF7C1FF040086 +:10453000B02821D0030632D4FF2583001D4005ABEF +:104540009B4600930D220023002130000435FFF725 +:10455000CBFB63064CD5059B5D1B05955B46009325 +:1045600000230D2200213000FFF7E4FB3800FFF7A5 +:104570009FFF0400B028DDD1039B0024002B2FD126 +:1045800005AD00950E2200213000FFF7ADFB009530 +:1045900000230F2200213000FFF7CCFB20E00300B6 +:1045A00042469343DBB2802B63D0902B25D0A02BC7 +:1045B00032D0B02B45D0C02B00D173E003004A4667 +:1045C0009343DBB2D02B0AD15346024001321A4347 +:1045D000052301213000FFF795FD0028A4D0092410 +:1045E000200007B03CBC90469946A246AB46F0BDC1 +:1045F000059B9C4665440595B0E7833B03400D2B26 +:10460000EDD0424605AD0240009500230021300068 +:10461000FFF76AFB0095A3E7FF234A461B01190039 +:10462000824311410A001A40030702D58023DB01AF +:104630001A43002300213000FFF764FD0028CED18B +:1046400072E7B1284AD0B2285ED0B32800D18BE0FF +:10465000FC230340B42BC2D04A46534602400132E9 +:104660001A43012101233000FFF74CFD0028B6D189 +:104670005AE704023800FFF71BFF802520432D0274 +:10468000A842ACD004010005020C00230021300038 +:10469000FFF738FD0028A2D12C4200D144E70123C6 +:1046A000039341E7C6286AD0C7287CD003004A4656 +:1046B0009343DBB2C02B00D18BE0C82800D18FE040 +:1046C000C92800D08BE73800FFF7F2FEF023020381 +:1046D0001B03134042460240013278E73800FFF7DF +:1046E000E7FE002800D17AE7030042469343DBB29D +:1046F000002B00D073E7020000213000FFF702FD1D +:10470000002800D06BE70FE705AB00939B460D2216 +:10471000002300213000FFF7E7FA3800FFF7C8FE5A +:1047200003066AD57F25B03C059B2840A0409C46E7 +:104730006044059038000734FFF7BAFE0306F3D44F +:10474000812292009446863AFF3A1040A040059B91 +:10475000723A634418185B460590009300210023C9 +:104760003000FFF7E7FADFE63800FFF7A1FEF0239D +:1047700002031B03134042460240013270E7380037 +:10478000FFF796FEF02302031B031340424602404C +:1047900001321A43032303213000FFF7B3FC002842 +:1047A00000D01CE7C0E63800FFF782FE002800D1E9 +:1047B00015E7030042469343DBB2002B00D00EE71F +:1047C000020004213000FFF79DFC002800D006E71E +:1047D000AAE64346A0221C40013412032243D9E733 +:1047E0003800FFF765FE434602009A43D2B210320A +:1047F0001840120301300243EAE60224A0E7C04653 +:10480000030000B5DB6C85B05A6808001202019203 +:104810001A0001A908324A6003220A72DB794B723E +:10482000FFF770FE05B000BD10B5FFF767FE806CA6 +:1048300010BDC04610B5FFF761FEC26CD3799B0076 +:104840000833D01810BDC04610B500F005F8C046BA +:1048500010B5FFF7F9FFC04610B5062000F074F858 +:10486000012000F0A3F8C046F0B505000F2A2FD9AB +:104870000B0003439B0734D116000C000300103ECD +:10488000350901352D01451927681F6067685F608C +:10489000A7689F60E7681034DF6010339D42F3D152 +:1048A0000F239E431036851989191340032B1AD9FB +:1048B0001E1F0023B4080134A400CF58EF50043366 +:1048C000A342FAD10324A643331D2240C918ED1890 +:1048D000002A05D00023CC5CEC5401339342FAD17A +:1048E000F0BD0500F6E71A00F2E7C04670B5050016 +:1048F0000C001F2922D8B7239B00C358002B14D0CB +:104900008A009B181A68002A0FD0012A0BD0511C6C +:1049100005D00021200019609047002070BD1623AB +:1049200003600120FAE70020F8E7280000F02AF8E9 +:1049300022000100280000F011F8EFE716230360C1 +:1049400001204042EAE7C04610B5034B0100186859 +:10495000FFF7CCFF10BDC04600000020002370B55B +:10496000074C050008001100236000F017F8431CF5 +:1049700000D070BD2368002BFBD02B60F9E7C04648 +:104980003407002010B500F001F810BD58220120B6 +:10499000014B40421A607047340700205822012022 +:1049A000014B40421A60704734070020FEE7C046C2 +:1049B00002B4714649084900095C49008E4402BCB2 +:1049C0007047C04603B47146490840004900095E7B +:1049D00049008E4403BC704703B471464908400047 +:1049E0004900095A49008E4403BC7047F8B5C046D7 +:1049F000F8B5C04609021200010100803209040026 +:104A000000000000000012010002FF000008C016B4 +:104A1000DC05010201020001040309042A03490024 +:104A20006E00660069006E006900740065004E004B +:104A3000650073004C0069007600650073002E006D +:104A400063006F006D000000000000000000000027 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000000000000000000046 +:104A70001E0349004E004C002000520065007400E7 +:104A800072006F002D00500072006F006700000080 +:104A90000000000000000000000000000000000016 +:0C4AA0000000000000000000000000000A +:104AAC0074B20181B0AB308000000000800A01813B +:104ABC00B0B0ABF0000000003F020181B0AB308021 +:104ACC000000000080060181B0B0ABF000000000D7 +:104ADC00F8ECFF7FB0B0B08050EEFF7F010000001B +:104AEC00FCEEFF7FB0A9028090EFFF7FB0B0A880F2 +:104AFC00E0EFFF7F01000000ECEFFF7FB0B0AA8079 +:104B0C0020F0FF7F9CFFFF7FF0F0FF7F0100000093 +:104B1C00ECF0FF7FAA3F398038F1FF7FB0B0A8805E +:104B2C0044F1FF7FB0B0AA8084F1FF7FB0B0A880C1 +:104B3C0098F1FF7F0100000094F1FF7FB0B0A880D6 +:104B4C009CF1FF7F010000002CF2FF7FAA0FB280C6 +:104B5C0094F2FF7F58FFFF7F7CF5FF7FB0B0A880F9 +:104B6C0098F5FF7F54FFFF7FF8F7FF7F01000000EF +:104B7C0068F9FF7F0084048078F9FF7FB0B0A880CB +:104B8C0078F9FF7F40FFFF7F6CFCFF7F008404807F +:104B9C008CFCFF7FB0B0A880A4FCFF7F010000005C +:104BAC00080000200000000000000000F4020020BB +:104BBC005C030020C4030020000000000000000083 :104BCC0000000000000000000000000000000000D9 :104BDC0000000000000000000000000000000000C9 :104BEC0000000000000000000000000000000000B9 @@ -1221,10 +1221,61 @@ :104C2C000000000000000000000000000000000078 :104C3C000000000000000000000000000000000068 :104C4C000000000000000000000000000000000058 -:104C5C000000000000000000000000000000000048 -:104C6C000000000000000000000000000000000038 +:104C5C0001000000000000000E33CDAB34126DE6F5 +:104C6C00ECDE05000B00000000000000000000005E :104C7C000000000000000000000000000000000028 :104C8C000000000000000000000000000000000018 :104C9C000000000000000000000000000000000008 +:104CAC0000000000000000000000000000000000F8 +:104CBC0000000000000000000000000000000000E8 +:104CCC0000000000000000000000000000000000D8 +:104CDC0000000000000000000000000000000000C8 +:104CEC0000000000000000000000000000000000B8 +:104CFC0000000000000000000000000000000000A8 +:104D0C000000000000000000000000000000000097 +:104D1C000000000000000000000000000000000087 +:104D2C000000000000000000000000000000000077 +:104D3C000000000000000000000000000000000067 +:104D4C000000000000000000000000000000000057 +:104D5C000000000000000000000000000000000047 +:104D6C000000000000000000000000000000000037 +:104D7C000000000000000000000000000000000027 +:104D8C000000000000000000000000000000000017 +:104D9C000000000000000000000000000000000007 +:104DAC0000000000000000000000000000000000F7 +:104DBC0000000000000000000000000000000000E7 +:104DCC0000000000000000000000000000000000D7 +:104DDC0000000000000000000000000000000000C7 +:104DEC0000000000000000000000000000000000B7 +:104DFC0000000000000000000000000000000000A7 +:104E0C000000000000000000000000000000000096 +:104E1C000000000000000000000000000000000086 +:104E2C000000000000000000000000000000000076 +:104E3C000000000000000000000000000000000066 +:104E4C000000000000000000000000000000000056 +:104E5C000000000000000000000000000000000046 +:104E6C000000000000000000000000000000000036 +:104E7C000000000000000000000000000000000026 +:104E8C000000000000000000000000000000000016 +:104E9C000000000000000000000000000000000006 +:104EAC0000000000000000000000000000000000F6 +:104EBC0000000000000000000000000000000000E6 +:104ECC0000000000000000000000000000000000D6 +:104EDC0000000000000000000000000000000000C6 +:104EEC0000000000000000000000000000000000B6 +:104EFC0000000000000000000000000000000000A6 +:104F0C000000000000000000000000000000000095 +:104F1C000000000000000000000000000000000085 +:104F2C000000000000000000000000000000000075 +:104F3C000000000000000000000000000000000065 +:104F4C000000000000000000000000000000000055 +:104F5C000000000000000000000000000000000045 +:104F6C000000000000000000000000000000000035 +:104F7C000000000000000000000000000000000025 +:104F8C000000000000000000000000000000000015 +:104F9C000000000000000000000000000000000005 +:104FAC0000000000000000000000000000000000F5 +:104FBC0000000000000000000000000000000000E5 +:104FCC0000000000000000000000000000000000D5 :04000005080000C12E :00000001FF diff --git a/firmware/build_stm/inlretro_stm.map b/firmware/build_stm/inlretro_stm.map index f8116c9..0f0feb5 100644 --- a/firmware/build_stm/inlretro_stm.map +++ b/firmware/build_stm/inlretro_stm.map @@ -1,130 +1,111 @@ Archive member included to satisfy reference by file (symbol) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) - C:\Users\Paul\AppData\Local\Temp\cc60YfJ9.o (__aeabi_unwind_cpp_pr0) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(libunwind.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) (restore_core_regs) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(pr-support.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) (__gnu_unwind_execute) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) (abort) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o (exit) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) (_global_impure_ptr) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o (__libc_init_array) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) (memcpy) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o (memset) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) (raise) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) (_kill_r) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) (__call_exitprocs) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) (atexit) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) (__libc_fini_array) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) (__retarget_lock_acquire_recursive) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) (_malloc_r) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) (__malloc_lock) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) (errno) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) (_sbrk_r) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) (__register_exitproc) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) (_free_r) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) (_getpid) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) (_kill) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) (_sbrk) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) - c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) (_exit) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uqi.o) - C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o (__gnu_thumb1_case_uqi) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_shi.o) - C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o (__gnu_thumb1_case_shi) -c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uhi.o) - C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o (__gnu_thumb1_case_uhi) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(unwind-arm.o) + C:\Users\paul\AppData\Local\Temp\ccdBPmvz.o (__aeabi_unwind_cpp_pr0) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(libunwind.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(unwind-arm.o) (restore_core_regs) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(pr-support.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(unwind-arm.o) (__gnu_unwind_execute) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(unwind-arm.o) (abort) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o (exit) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) (_global_impure_ptr) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o (__libc_init_array) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(unwind-arm.o) (memcpy) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o (memset) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) (raise) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) (_kill_r) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) (__call_exitprocs) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) (atexit) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) (__libc_fini_array) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) (_malloc_r) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) (__malloc_lock) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) (errno) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) (_sbrk_r) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) (__register_exitproc) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) (_free_r) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) (_getpid) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) (_kill) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) (_sbrk) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) + c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) (_exit) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_uqi.o) + C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o (__gnu_thumb1_case_uqi) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_shi.o) + C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o (__gnu_thumb1_case_shi) +c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_uhi.o) + C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o (__gnu_thumb1_case_uhi) Allocating common symbols Common symbol size file -__lock___atexit_recursive_mutex - 0x1 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) -__lock___arc4random_mutex - 0x1 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) -errno 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) +errno 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) addrh 0x4 source/bootload.o (symbol from plugin) incoming_bytes_remain 0x1 source/buffer.o (symbol from plugin) -__lock___env_recursive_mutex - 0x1 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) -__lock___sinit_recursive_mutex - 0x1 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) pbje_cmd_update_flag 0x1 source/jtag.o (symbol from plugin) -__lock___malloc_recursive_mutex - 0x1 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) raw_bank_status 0x10 source/buffer.o (symbol from plugin) raw_buffer16 0x200 source/buffer.o (symbol from plugin) -__lock___at_quick_exit_mutex - 0x1 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) cur_usb_load_buff 0x4 source/buffer.o (symbol from plugin) -__lock___dd_hash_mutex - 0x1 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) -__lock___tz_mutex 0x1 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) -__lock___sfp_recursive_mutex - 0x1 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) Discarded input sections - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crti.o - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crti.o - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crti.o - .text 0x00000000 0x60 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtbegin.o - .data 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtbegin.o - .bss 0x00000000 0x1c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtbegin.o - .init_array 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtbegin.o - .fini_array 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtbegin.o - .eh_frame 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtbegin.o - .jcr 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtbegin.o + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crti.o + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crti.o + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crti.o + .text 0x00000000 0x60 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtbegin.o + .data 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtbegin.o + .bss 0x00000000 0x1c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtbegin.o + .init_array 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtbegin.o + .fini_array 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtbegin.o + .eh_frame 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtbegin.o + .jcr 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtbegin.o .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtbegin.o - .text 0x00000000 0x78 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o - .ARM.extab 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o - .ARM.exidx 0x00000000 0x8 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtbegin.o + .text 0x00000000 0x78 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o + .ARM.extab 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o + .ARM.exidx 0x00000000 0x8 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o .ARM.attributes - 0x00000000 0x1b c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o - .data 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccolB3Y5.o - .bss 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccolB3Y5.o + 0x00000000 0x1b c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o + .data 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccA8zS7I.o + .bss 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccA8zS7I.o .text 0x00000000 0x0 source/bootload.o (symbol from plugin) - .text 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - .data 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - .bss 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o + .text 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + .data 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + .bss 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o .rodata.oper_info - 0x00000000 0x4 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - .text 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - .data 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - .bss 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - .text 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - .data 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - .bss 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - .text 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o - .data 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o - .bss 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o + 0x00000000 0x4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + .text 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + .data 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + .bss 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + .text 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + .data 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + .bss 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + .text 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o + .data 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o + .bss 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o .text 0x00000000 0x0 source/buffer.o (symbol from plugin) .text 0x00000000 0x0 source/ciccom.o (symbol from plugin) .text 0x00000000 0x0 source/dump.o (symbol from plugin) @@ -144,264 +125,235 @@ Discarded input sections .text 0x00000000 0x0 source/usb.o (symbol from plugin) .text 0x00000000 0x0 source_stm_only/stm_init.o (symbol from plugin) .text 0x00000000 0x0 source_stm_only/usbstm.o (symbol from plugin) - .data 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\cc60YfJ9.o - .bss 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\cc60YfJ9.o - .ARM.extab 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\cc60YfJ9.o - .data 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccqMHYEg.o - .bss 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccqMHYEg.o - .ARM.extab 0x00000000 0x0 C:\Users\Paul\AppData\Local\Temp\ccqMHYEg.o - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) - .debug_frame 0x00000000 0x2c4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) + .data 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccdBPmvz.o + .bss 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccdBPmvz.o + .ARM.extab 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccdBPmvz.o + .data 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccgj2WWv.o + .bss 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccgj2WWv.o + .ARM.extab 0x00000000 0x0 C:\Users\paul\AppData\Local\Temp\ccgj2WWv.o + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(unwind-arm.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(unwind-arm.o) + .debug_frame 0x00000000 0x2c4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(unwind-arm.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(libunwind.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(libunwind.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(unwind-arm.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(libunwind.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(libunwind.o) .ARM.attributes - 0x00000000 0x1e c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(libunwind.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(pr-support.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(pr-support.o) - .debug_frame 0x00000000 0xf4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(pr-support.o) + 0x00000000 0x1e c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(libunwind.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(pr-support.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(pr-support.o) + .debug_frame 0x00000000 0xf4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(pr-support.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(pr-support.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) - .debug_frame 0x00000000 0x28 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(pr-support.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) + .debug_frame 0x00000000 0x28 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) - .text.exit 0x00000000 0x20 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) - .debug_frame 0x00000000 0x28 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) + .text.exit 0x00000000 0x20 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) + .debug_frame 0x00000000 0x28 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-exit.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) .rodata._global_impure_ptr - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) + 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) .text.__libc_init_array - 0x00000000 0x48 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) - .debug_frame 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) + 0x00000000 0x48 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) + .debug_frame 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) - .debug_frame 0x00000000 0x30 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-init.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) + .debug_frame 0x00000000 0x30 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) - .text.memset 0x00000000 0x94 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) - .debug_frame 0x00000000 0x30 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) + .text.memset 0x00000000 0x94 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) + .debug_frame 0x00000000 0x30 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memset.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) .text._init_signal_r.part.0 - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) .text._init_signal_r - 0x00000000 0x1c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + 0x00000000 0x1c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) .text._signal_r - 0x00000000 0x3c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + 0x00000000 0x3c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) .text.__sigtramp_r - 0x00000000 0x50 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) - .text.signal 0x00000000 0x18 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + 0x00000000 0x50 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + .text.signal 0x00000000 0x18 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) .text._init_signal - 0x00000000 0x20 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + 0x00000000 0x20 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) .text.__sigtramp - 0x00000000 0x14 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) - .debug_frame 0x00000000 0xf8 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + 0x00000000 0x14 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + .debug_frame 0x00000000 0xf8 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) - .debug_frame 0x00000000 0x44 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) + .debug_frame 0x00000000 0x44 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) .text.startup.register_fini - 0x00000000 0x18 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) + 0x00000000 0x18 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) .init_array.00000 - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) + 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) .text.__call_exitprocs - 0x00000000 0x110 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) - .data.__atexit_recursive_mutex - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) - .debug_frame 0x00000000 0x54 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) + 0x00000000 0xf8 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) + .debug_frame 0x00000000 0x54 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) - .text.atexit 0x00000000 0x10 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) - .debug_frame 0x00000000 0x28 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__call_atexit.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) + .text.atexit 0x00000000 0x10 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) + .debug_frame 0x00000000 0x28 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-atexit.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) .text.__libc_fini_array - 0x00000000 0x34 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) - .debug_frame 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) + 0x00000000 0x34 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) + .debug_frame 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .text.__retarget_lock_init - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .text.__retarget_lock_init_recursive - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .text.__retarget_lock_close - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .text.__retarget_lock_close_recursive - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .text.__retarget_lock_acquire - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .text.__retarget_lock_acquire_recursive - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .text.__retarget_lock_try_acquire - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .text.__retarget_lock_try_acquire_recursive - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .text.__retarget_lock_release - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .text.__retarget_lock_release_recursive - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .debug_frame 0x00000000 0xb0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - COMMON 0x00000000 0x21 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-lock.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-fini.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) .text._malloc_r - 0x00000000 0x568 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + 0x00000000 0x568 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) .bss.__malloc_current_mallinfo - 0x00000000 0x28 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + 0x00000000 0x28 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) .bss.__malloc_max_sbrked_mem - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) .bss.__malloc_max_total_mem - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) .bss.__malloc_top_pad - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) .data.__malloc_av_ - 0x00000000 0x408 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + 0x00000000 0x408 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) .data.__malloc_sbrk_base - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) .data.__malloc_trim_threshold - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) - .debug_frame 0x00000000 0x3c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + .debug_frame 0x00000000 0x3c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mallocr.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) .text.__malloc_lock - 0x00000000 0x10 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) + 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) .text.__malloc_unlock - 0x00000000 0x10 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) - .debug_frame 0x00000000 0x40 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) + 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) + .debug_frame 0x00000000 0x30 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-mlock.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) .text.cleanup_glue - 0x00000000 0x1c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) + 0x00000000 0x1c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) .text._reclaim_reent - 0x00000000 0x94 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) - .debug_frame 0x00000000 0x48 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) + 0x00000000 0x94 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) + .debug_frame 0x00000000 0x48 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) - .text._sbrk_r 0x00000000 0x24 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) - .debug_frame 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) + .text._sbrk_r 0x00000000 0x24 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) + .debug_frame 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-sbrkr.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) .text.__register_exitproc - 0x00000000 0xf4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) - .debug_frame 0x00000000 0x3c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) + 0x00000000 0xd4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) + .debug_frame 0x00000000 0x3c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-__atexit.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) .text._malloc_trim_r - 0x00000000 0xa0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) - .text._free_r 0x00000000 0x1bc c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) - .debug_frame 0x00000000 0x50 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) + 0x00000000 0xa0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) + .text._free_r 0x00000000 0x1bc c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) + .debug_frame 0x00000000 0x50 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) - .stab 0x00000000 0x24 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) - .debug_frame 0x00000000 0x20 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-freer.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) + .stab 0x00000000 0x24 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) + .debug_frame 0x00000000 0x20 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) - .stab 0x00000000 0x18 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) + .stab 0x00000000 0x18 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) 0x24 (size before relaxing) - .debug_frame 0x00000000 0x20 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) + .debug_frame 0x00000000 0x20 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) - .text._sbrk 0x00000000 0x1c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) + .text._sbrk 0x00000000 0x1c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) .bss.heap_end.4116 - 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) - .debug_frame 0x00000000 0x20 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) + 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) + .debug_frame 0x00000000 0x20 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) - .debug_frame 0x00000000 0x20 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(sbrk.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) + .debug_frame 0x00000000 0x20 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtend.o - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtend.o - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtend.o - .eh_frame 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtend.o - .jcr 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtend.o + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtend.o + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtend.o + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtend.o + .eh_frame 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtend.o + .jcr 0x00000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtend.o .ARM.attributes - 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtend.o - .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtn.o - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtn.o - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtn.o - .init 0x00000000 0x8 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtn.o - .fini 0x00000000 0x8 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtn.o + 0x00000000 0x2c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtend.o + .text 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtn.o + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtn.o + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtn.o + .init 0x00000000 0x8 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtn.o + .fini 0x00000000 0x8 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtn.o .ARM.attributes - 0x00000000 0x1e c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtn.o - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uqi.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uqi.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_shi.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_shi.o) - .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uhi.o) - .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uhi.o) + 0x00000000 0x1e c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtn.o + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_uqi.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_uqi.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_shi.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_shi.o) + .data 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_uhi.o) + .bss 0x00000000 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_uhi.o) Memory Configuration @@ -412,15 +364,15 @@ RAM 0x20000000 0x00001800 xrw Linker script and memory map -LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crti.o -LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtbegin.o -LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o -LOAD C:\Users\Paul\AppData\Local\Temp\ccolB3Y5.o +LOAD c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crti.o +LOAD c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtbegin.o +LOAD c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/crt0.o +LOAD C:\Users\paul\AppData\Local\Temp\ccA8zS7I.o LOAD source/bootload.o -LOAD C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o -LOAD C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o -LOAD C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o -LOAD C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o +LOAD C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o +LOAD C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o +LOAD C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o +LOAD C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o LOAD source/buffer.o LOAD source/ciccom.o LOAD source/dump.o @@ -440,27 +392,27 @@ LOAD source/swim.o LOAD source/usb.o LOAD source_stm_only/stm_init.o LOAD source_stm_only/usbstm.o -LOAD C:\Users\Paul\AppData\Local\Temp\cc60YfJ9.o -LOAD C:\Users\Paul\AppData\Local\Temp\ccqMHYEg.o +LOAD C:\Users\paul\AppData\Local\Temp\ccdBPmvz.o +LOAD C:\Users\paul\AppData\Local\Temp\ccgj2WWv.o START GROUP -LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a -LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a -LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libc.a +LOAD c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a +LOAD c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a +LOAD c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libc.a END GROUP START GROUP -LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a -LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libc.a -LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a +LOAD c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a +LOAD c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libc.a +LOAD c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a END GROUP -LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtend.o -LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtn.o +LOAD c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtend.o +LOAD c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtn.o -.text 0x08000000 0x477c +.text 0x08000000 0x4aac *(.isr_vector) - .isr_vector 0x08000000 0xc0 C:\Users\Paul\AppData\Local\Temp\ccolB3Y5.o + .isr_vector 0x08000000 0xc0 C:\Users\paul\AppData\Local\Temp\ccA8zS7I.o 0x08000000 __isr_vector *(.text*) - .text 0x080000c0 0x40 C:\Users\Paul\AppData\Local\Temp\ccolB3Y5.o + .text 0x080000c0 0x40 C:\Users\paul\AppData\Local\Temp\ccA8zS7I.o 0x080000c0 Reset_Handler 0x080000fc TSC_IRQHandler 0x080000fc ADC1_COMP_IRQHandler @@ -500,172 +452,201 @@ LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eab 0x080000fc USART1_IRQHandler 0x080000fc TIM1_BRK_UP_TRG_COM_IRQHandler .text.USB_IRQHandler - 0x08000100 0x1970 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o + 0x08000100 0x1a48 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o 0x08000100 USB_IRQHandler .text.pbje_scan - 0x08001a70 0x12c C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o + 0x08001b48 0x12c C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o .text.pbje_state_change - 0x08001b9c 0x98 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o + 0x08001c74 0x98 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + .text.write_page + 0x08001d0c 0x34 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o .text.get_next_buff - 0x08001c34 0x54 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o + 0x08001d40 0x54 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o .text.jtag_init_pbje - 0x08001c88 0xe0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - 0x08001c88 jtag_init_pbje + 0x08001d94 0xe0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + 0x08001d94 jtag_init_pbje .text.jtag_run_pbje.part.0 - 0x08001d68 0xd8 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - 0x08001d68 jtag_run_pbje.part.0 + 0x08001e74 0xd8 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + 0x08001e74 jtag_run_pbje.part.0 .text.io_reset - 0x08001e40 0x148 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - 0x08001e40 io_reset + 0x08001f4c 0x154 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + 0x08001f4c io_reset .text.startup.main - 0x08001f88 0xda8 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - 0x08001f88 main + 0x080020a0 0xb8c C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + 0x080020a0 main .text.append_pairity - 0x08002d30 0x1e C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - *fill* 0x08002d4e 0x2 - .text.nes_cpu_wr - 0x08002d50 0x6c C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x08002d50 nes_cpu_wr - .text.nes_cpu_rd - 0x08002dbc 0x40 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x08002dbc nes_cpu_rd - .text.disc_push_exp0_prgrom_wr - 0x08002dfc 0x48 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x08002dfc disc_push_exp0_prgrom_wr - .text.discrete_exp0_prgrom_wr - 0x08002e44 0x58 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x08002e44 discrete_exp0_prgrom_wr - .text.control_xfr_in.lto_priv.39 - 0x08002e9c 0xbc C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x08002e9c control_xfr_in.lto_priv.39 - .text.HardFault_Handler - 0x08002f58 0x2 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x08002f58 HardFault_Handler - *fill* 0x08002f5a 0x2 - .text.swim_wotf - 0x08002f5c 0xb4 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x08002f5c swim_wotf - .text.swim_rotf - 0x08003010 0xac C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x08003010 swim_rotf - .text.delay_us - 0x080030bc 0x16 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x080030bc delay_us - *fill* 0x080030d2 0x2 + 0x08002c2c 0x1e C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + *fill* 0x08002c4a 0x2 .text.snes_rom_wr - 0x080030d4 0x4c C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x080030d4 snes_rom_wr + 0x08002c4c 0x4c C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08002c4c snes_rom_wr .text.snes_rom_rd - 0x08003120 0x40 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x08003120 snes_rom_rd - .text.mmc1_wr 0x08003160 0x38 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x08003160 mmc1_wr + 0x08002c98 0x40 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08002c98 snes_rom_rd + .text.snes_3v_flash_wr + 0x08002cd8 0x44 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08002cd8 snes_3v_flash_wr + .text.snes_5v_flash_wr + 0x08002d1c 0x44 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08002d1c snes_5v_flash_wr + .text.nes_cpu_wr + 0x08002d60 0x6c C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08002d60 nes_cpu_wr + .text.nes_cpu_rd + 0x08002dcc 0x40 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08002dcc nes_cpu_rd + .text.mmc3_prgrom_flash_wr + 0x08002e0c 0x50 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08002e0c mmc3_prgrom_flash_wr + .text.disc_push_exp0_prgrom_wr + 0x08002e5c 0x48 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08002e5c disc_push_exp0_prgrom_wr + .text.discrete_exp0_prgrom_wr + 0x08002ea4 0x58 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08002ea4 discrete_exp0_prgrom_wr + .text.nrom_prgrom_flash_wr + 0x08002efc 0x44 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08002efc nrom_prgrom_flash_wr + .text.control_xfr_in.lto_priv.37 + 0x08002f40 0xbc C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08002f40 control_xfr_in.lto_priv.37 + .text.HardFault_Handler + 0x08002ffc 0x2 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08002ffc HardFault_Handler + *fill* 0x08002ffe 0x2 + .text.swim_wotf + 0x08003000 0xb4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08003000 swim_wotf + .text.swim_rotf + 0x080030b4 0xac C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x080030b4 swim_rotf + .text.delay_us + 0x08003160 0x16 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08003160 delay_us + .text.mmc1_wr 0x08003176 0x38 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08003176 mmc1_wr + *fill* 0x080031ae 0x2 .text.nes_dualport_wr - 0x08003198 0x50 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x08003198 nes_dualport_wr + 0x080031b0 0x50 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x080031b0 nes_dualport_wr .text.nes_dualport_rd - 0x080031e8 0x38 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x080031e8 nes_dualport_rd + 0x08003200 0x38 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08003200 nes_dualport_rd .text.nes_ppu_wr - 0x08003220 0x50 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x08003220 nes_ppu_wr + 0x08003238 0x50 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08003238 nes_ppu_wr .text.nes_ppu_rd - 0x08003270 0x38 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x08003270 nes_ppu_rd - .text.write_page.constprop.28 - 0x080032a8 0x68 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o - 0x080032a8 write_page.constprop.28 + 0x08003288 0x38 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08003288 nes_ppu_rd + .text.cdream_chrrom_flash_wr + 0x080032c0 0x88 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x080032c0 cdream_chrrom_flash_wr + .text.mmc3_chrrom_flash_wr + 0x08003348 0x44 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x08003348 mmc3_chrrom_flash_wr + .text.cnrom_chrrom_flash_wr + 0x0800338c 0x80 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x0800338c cnrom_chrrom_flash_wr + .text.nrom_chrrom_flash_wr + 0x0800340c 0x44 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x0800340c nrom_chrrom_flash_wr + .text.write_page_snes.constprop.32 + 0x08003450 0x180 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o + 0x08003450 write_page_snes.constprop.32 .text.write_page_bank.constprop.26 - 0x08003310 0xbc C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o - 0x08003310 write_page_bank.constprop.26 + 0x080035d0 0xbc C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o + 0x080035d0 write_page_bank.constprop.26 + .text.snes_rom_page_rd_poll.constprop.23 + 0x0800368c 0x74 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o + 0x0800368c snes_rom_page_rd_poll.constprop.23 .text.nes_cpu_page_rd_poll.constprop.22 - 0x080033cc 0x6c C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o - 0x080033cc nes_cpu_page_rd_poll.constprop.22 + 0x08003700 0x6c C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o + 0x08003700 nes_cpu_page_rd_poll.constprop.22 .text.nes_ppu_page_rd_poll.constprop.21 - 0x08003438 0x68 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o - 0x08003438 nes_ppu_page_rd_poll.constprop.21 - .text 0x080034a0 0x4 C:\Users\Paul\AppData\Local\Temp\cc60YfJ9.o - 0x080034a0 jump2addr - *fill* 0x080034a4 0xc - .text 0x080034b0 0x154 C:\Users\Paul\AppData\Local\Temp\ccqMHYEg.o - 0x080034b0 swim_xfr - .text 0x08003604 0xa38 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) - 0x080038d4 _Unwind_GetCFA - 0x080038d8 __gnu_Unwind_RaiseException - 0x0800392c __gnu_Unwind_ForcedUnwind - 0x08003940 __gnu_Unwind_Resume - 0x08003988 __gnu_Unwind_Resume_or_Rethrow - 0x080039a4 _Unwind_Complete - 0x080039a8 _Unwind_DeleteException - 0x080039b8 _Unwind_VRS_Get - 0x08003a04 _Unwind_VRS_Set - 0x08003a50 __gnu_Unwind_Backtrace - 0x08003db0 __aeabi_unwind_cpp_pr0 - 0x08003dbc __aeabi_unwind_cpp_pr1 - 0x08003dc8 __aeabi_unwind_cpp_pr2 - 0x08003dd4 _Unwind_VRS_Pop - .text 0x0800403c 0x144 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(libunwind.o) - 0x0800403c __restore_core_regs - 0x0800403c restore_core_regs - 0x08004068 __gnu_Unwind_Restore_VFP - 0x0800406c __gnu_Unwind_Save_VFP - 0x08004070 __gnu_Unwind_Restore_VFP_D - 0x08004074 __gnu_Unwind_Save_VFP_D - 0x08004078 __gnu_Unwind_Restore_VFP_D_16_to_31 - 0x0800407c __gnu_Unwind_Save_VFP_D_16_to_31 - 0x08004080 __gnu_Unwind_Restore_WMMXD - 0x08004084 __gnu_Unwind_Save_WMMXD - 0x08004088 __gnu_Unwind_Restore_WMMXC - 0x0800408c __gnu_Unwind_Save_WMMXC - 0x08004090 ___Unwind_RaiseException - 0x08004090 _Unwind_RaiseException - 0x080040c0 _Unwind_Resume - 0x080040c0 ___Unwind_Resume - 0x080040f0 _Unwind_Resume_or_Rethrow - 0x080040f0 ___Unwind_Resume_or_Rethrow - 0x08004120 _Unwind_ForcedUnwind - 0x08004120 ___Unwind_ForcedUnwind - 0x08004150 ___Unwind_Backtrace - 0x08004150 _Unwind_Backtrace - .text 0x08004180 0x3a8 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(pr-support.o) - 0x080041d4 __gnu_unwind_execute - 0x080044d0 __gnu_unwind_frame - 0x080044f8 _Unwind_GetRegionStart - 0x08004504 _Unwind_GetLanguageSpecificData - 0x08004518 _Unwind_GetTextRelBase - 0x08004520 _Unwind_GetDataRelBase - .text.abort 0x08004528 0x10 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) - 0x08004528 abort - .text.memcpy 0x08004538 0x84 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) - 0x08004538 memcpy + 0x0800376c 0x68 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o + 0x0800376c nes_ppu_page_rd_poll.constprop.21 + .text 0x080037d4 0x4 C:\Users\paul\AppData\Local\Temp\ccdBPmvz.o + 0x080037d4 jump2addr + *fill* 0x080037d8 0x8 + .text 0x080037e0 0x154 C:\Users\paul\AppData\Local\Temp\ccgj2WWv.o + 0x080037e0 swim_xfr + .text 0x08003934 0xa38 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(unwind-arm.o) + 0x08003c04 _Unwind_GetCFA + 0x08003c08 __gnu_Unwind_RaiseException + 0x08003c5c __gnu_Unwind_ForcedUnwind + 0x08003c70 __gnu_Unwind_Resume + 0x08003cb8 __gnu_Unwind_Resume_or_Rethrow + 0x08003cd4 _Unwind_Complete + 0x08003cd8 _Unwind_DeleteException + 0x08003ce8 _Unwind_VRS_Get + 0x08003d34 _Unwind_VRS_Set + 0x08003d80 __gnu_Unwind_Backtrace + 0x080040e0 __aeabi_unwind_cpp_pr0 + 0x080040ec __aeabi_unwind_cpp_pr1 + 0x080040f8 __aeabi_unwind_cpp_pr2 + 0x08004104 _Unwind_VRS_Pop + .text 0x0800436c 0x144 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(libunwind.o) + 0x0800436c __restore_core_regs + 0x0800436c restore_core_regs + 0x08004398 __gnu_Unwind_Restore_VFP + 0x0800439c __gnu_Unwind_Save_VFP + 0x080043a0 __gnu_Unwind_Restore_VFP_D + 0x080043a4 __gnu_Unwind_Save_VFP_D + 0x080043a8 __gnu_Unwind_Restore_VFP_D_16_to_31 + 0x080043ac __gnu_Unwind_Save_VFP_D_16_to_31 + 0x080043b0 __gnu_Unwind_Restore_WMMXD + 0x080043b4 __gnu_Unwind_Save_WMMXD + 0x080043b8 __gnu_Unwind_Restore_WMMXC + 0x080043bc __gnu_Unwind_Save_WMMXC + 0x080043c0 ___Unwind_RaiseException + 0x080043c0 _Unwind_RaiseException + 0x080043f0 _Unwind_Resume + 0x080043f0 ___Unwind_Resume + 0x08004420 _Unwind_Resume_or_Rethrow + 0x08004420 ___Unwind_Resume_or_Rethrow + 0x08004450 _Unwind_ForcedUnwind + 0x08004450 ___Unwind_ForcedUnwind + 0x08004480 ___Unwind_Backtrace + 0x08004480 _Unwind_Backtrace + .text 0x080044b0 0x3a8 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(pr-support.o) + 0x08004504 __gnu_unwind_execute + 0x08004800 __gnu_unwind_frame + 0x08004828 _Unwind_GetRegionStart + 0x08004834 _Unwind_GetLanguageSpecificData + 0x08004848 _Unwind_GetTextRelBase + 0x08004850 _Unwind_GetDataRelBase + .text.abort 0x08004858 0x10 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-abort.o) + 0x08004858 abort + .text.memcpy 0x08004868 0x84 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-memcpy-stub.o) + 0x08004868 memcpy .text._raise_r - 0x080045bc 0x5c c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) - 0x080045bc _raise_r - .text.raise 0x08004618 0x14 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) - 0x08004618 raise - .text._kill_r 0x0800462c 0x28 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) - 0x0800462c _kill_r + 0x080048ec 0x5c c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + 0x080048ec _raise_r + .text.raise 0x08004948 0x14 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signal.o) + 0x08004948 raise + .text._kill_r 0x0800495c 0x28 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) + 0x0800495c _kill_r .text._getpid_r - 0x08004654 0x8 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) - 0x08004654 _getpid_r - .text._getpid 0x0800465c 0x10 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) - 0x0800465c _getpid - .text._kill 0x0800466c 0x10 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) - 0x0800466c _kill - .text._exit 0x0800467c 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) - 0x0800467c _exit - .text 0x08004680 0x14 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uqi.o) - 0x08004680 __gnu_thumb1_case_uqi - .text 0x08004694 0x14 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_shi.o) - 0x08004694 __gnu_thumb1_case_shi - .text 0x080046a8 0x14 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uhi.o) - 0x080046a8 __gnu_thumb1_case_uhi + 0x08004984 0x8 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-signalr.o) + 0x08004984 _getpid_r + .text._getpid 0x0800498c 0x10 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) + 0x0800498c _getpid + .text._kill 0x0800499c 0x10 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(kill.o) + 0x0800499c _kill + .text._exit 0x080049ac 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(_exit.o) + 0x080049ac _exit + .text 0x080049b0 0x14 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_uqi.o) + 0x080049b0 __gnu_thumb1_case_uqi + .text 0x080049c4 0x14 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_shi.o) + 0x080049c4 __gnu_thumb1_case_shi + .text 0x080049d8 0x14 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_uhi.o) + 0x080049d8 __gnu_thumb1_case_uhi *(.init) - .init 0x080046bc 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crti.o - 0x080046bc _init + .init 0x080049ec 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crti.o + 0x080049ec _init *(.fini) - .fini 0x080046c0 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crti.o - 0x080046c0 _fini + .fini 0x080049f0 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crti.o + 0x080049f0 _fini *crtbegin.o(.ctors) *crtbegin?.o(.ctors) *(EXCLUDE_FILE(*crtend.o *crtend?.o) .ctors) @@ -678,63 +659,63 @@ LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eab *(.dtors) *(.rodata*) .rodata.config_desc - 0x080046c4 0x12 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o + 0x080049f4 0x12 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o .rodata.device_desc - 0x080046d6 0x12 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o + 0x08004a06 0x12 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o .rodata.string0_desc - 0x080046e8 0x4 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o + 0x08004a18 0x4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o .rodata.string1_desc - 0x080046ec 0x54 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o + 0x08004a1c 0x54 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o .rodata.string2_desc - 0x08004740 0x3c C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o + 0x08004a70 0x3c C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o *(.eh_frame*) -.glue_7 0x0800477c 0x0 - .glue_7 0x0800477c 0x0 linker stubs +.glue_7 0x08004aac 0x0 + .glue_7 0x08004aac 0x0 linker stubs -.glue_7t 0x0800477c 0x0 - .glue_7t 0x0800477c 0x0 linker stubs +.glue_7t 0x08004aac 0x0 + .glue_7t 0x08004aac 0x0 linker stubs -.vfp11_veneer 0x0800477c 0x0 - .vfp11_veneer 0x0800477c 0x0 linker stubs +.vfp11_veneer 0x08004aac 0x0 + .vfp11_veneer 0x08004aac 0x0 linker stubs -.v4_bx 0x0800477c 0x0 - .v4_bx 0x0800477c 0x0 linker stubs +.v4_bx 0x08004aac 0x0 + .v4_bx 0x08004aac 0x0 linker stubs -.iplt 0x0800477c 0x0 - .iplt 0x0800477c 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtbegin.o +.iplt 0x08004aac 0x0 + .iplt 0x08004aac 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtbegin.o -.ARM.extab 0x0800477c 0x30 +.ARM.extab 0x08004aac 0x30 *(.ARM.extab* .gnu.linkonce.armextab.*) - .ARM.extab 0x0800477c 0x24 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) - .ARM.extab 0x080047a0 0xc c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(pr-support.o) - 0x080047ac __exidx_start = . + .ARM.extab 0x08004aac 0x24 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(unwind-arm.o) + .ARM.extab 0x08004ad0 0xc c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(pr-support.o) + 0x08004adc __exidx_start = . -.ARM.exidx 0x080047ac 0xd0 +.ARM.exidx 0x08004adc 0xd0 *(.ARM.exidx* .gnu.linkonce.armexidx.*) - .ARM.exidx 0x080047ac 0x8 C:\Users\Paul\AppData\Local\Temp\cc60YfJ9.o - .ARM.exidx 0x080047b4 0x0 C:\Users\Paul\AppData\Local\Temp\ccqMHYEg.o + .ARM.exidx 0x08004adc 0x8 C:\Users\paul\AppData\Local\Temp\ccdBPmvz.o + .ARM.exidx 0x08004ae4 0x0 C:\Users\paul\AppData\Local\Temp\ccgj2WWv.o 0x10 (size before relaxing) - .ARM.exidx 0x080047b4 0x98 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(unwind-arm.o) + .ARM.exidx 0x08004ae4 0x98 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(unwind-arm.o) 0xd8 (size before relaxing) - .ARM.exidx 0x0800484c 0x30 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(pr-support.o) + .ARM.exidx 0x08004b7c 0x30 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(pr-support.o) 0x48 (size before relaxing) - 0x0800487c __exidx_end = . - 0x0800487c __etext = ALIGN (0x4) + 0x08004bac __exidx_end = . + 0x08004bac __etext = ALIGN (0x4) -.rel.dyn 0x0800487c 0x0 - .rel.iplt 0x0800487c 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtbegin.o +.rel.dyn 0x08004bac 0x0 + .rel.iplt 0x08004bac 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtbegin.o -.data 0x20000000 0x430 load address 0x0800487c +.data 0x20000000 0x430 load address 0x08004bac 0x20000000 __data_start__ = . *(vtable) *(.data*) .data._impure_ptr - 0x20000000 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) + 0x20000000 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) 0x20000000 _impure_ptr *fill* 0x20000004 0x4 .data.impure_data - 0x20000008 0x428 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) + 0x20000008 0x428 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-impure.o) 0x20000430 . = ALIGN (0x4) 0x20000430 PROVIDE (__preinit_array_start, .) *(.preinit_array) @@ -753,116 +734,123 @@ LOAD c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eab 0x20000430 . = ALIGN (0x4) 0x20000430 __data_end__ = . -.igot.plt 0x20000430 0x0 load address 0x08004cac - .igot.plt 0x20000430 0x0 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crtbegin.o +.igot.plt 0x20000430 0x0 load address 0x08004fdc + .igot.plt 0x20000430 0x0 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crtbegin.o -.bss 0x20000430 0x300 load address 0x08004cac +.bss 0x20000430 0x308 load address 0x08004fdc 0x20000430 . = ALIGN (0x4) 0x20000430 __bss_start__ = . *(.bss*) - .bss.addrh 0x20000430 0x4 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - .bss.buff0 0x20000434 0x14 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000434 buff0 - .bss.buff1 0x20000448 0x14 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000448 buff1 - .bss.buff2 0x2000045c 0x14 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x2000045c buff2 - .bss.buff3 0x20000470 0x14 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000470 buff3 - .bss.cur_buff 0x20000484 0x4 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000484 cur_buff + .bss.addrh 0x20000430 0x4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + .bss.bank_table + 0x20000434 0x2 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x20000434 bank_table + *fill* 0x20000436 0x2 + .bss.buff0 0x20000438 0x14 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x20000438 buff0 + .bss.buff1 0x2000044c 0x14 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x2000044c buff1 + .bss.buff2 0x20000460 0x14 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x20000460 buff2 + .bss.buff3 0x20000474 0x14 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x20000474 buff3 + .bss.cur_bank 0x20000488 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x20000488 cur_bank + *fill* 0x20000489 0x3 + .bss.cur_buff 0x2000048c 0x4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x2000048c cur_buff .bss.cur_usb_load_buff - 0x20000488 0x4 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o + 0x20000490 0x4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o .bss.incoming_bytes_remain - 0x2000048c 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - *fill* 0x2000048d 0x3 - .bss.log 0x20000490 0x4 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o + 0x20000494 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + *fill* 0x20000495 0x3 + .bss.log 0x20000498 0x4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o .bss.new_address - 0x20000494 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - *fill* 0x20000495 0x1 - .bss.num_bytes_req.lto_priv.42 - 0x20000496 0x2 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000496 num_bytes_req.lto_priv.42 - .bss.num_bytes_sending.lto_priv.41 - 0x20000498 0x2 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000498 num_bytes_sending.lto_priv.41 - .bss.num_bytes_xfrd.lto_priv.40 - 0x2000049a 0x2 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x2000049a num_bytes_xfrd.lto_priv.40 + 0x2000049c 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + *fill* 0x2000049d 0x1 + .bss.num_bytes_req.lto_priv.40 + 0x2000049e 0x2 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x2000049e num_bytes_req.lto_priv.40 + .bss.num_bytes_sending.lto_priv.39 + 0x200004a0 0x2 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x200004a0 num_bytes_sending.lto_priv.39 + .bss.num_bytes_xfrd.lto_priv.38 + 0x200004a2 0x2 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x200004a2 num_bytes_xfrd.lto_priv.38 .bss.oper_info_struct - 0x2000049c 0x20 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x2000049c oper_info_struct + 0x200004a4 0x20 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x200004a4 oper_info_struct .bss.pbje_command - 0x200004bc 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x200004bc pbje_command + 0x200004c4 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x200004c4 pbje_command .bss.pbje_data - 0x200004bd 0x20 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x200004bd pbje_data + 0x200004c5 0x20 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x200004c5 pbje_data .bss.pbje_numclk - 0x200004dd 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x200004dd pbje_numclk + 0x200004e5 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x200004e5 pbje_numclk .bss.pbje_status - 0x200004de 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x200004de pbje_status + 0x200004e6 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x200004e6 pbje_status .bss.raw_bank_status - 0x200004df 0x10 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - *fill* 0x200004ef 0x1 + 0x200004e7 0x10 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + *fill* 0x200004f7 0x1 .bss.raw_buffer16 - 0x200004f0 0x200 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - .bss.req_dir 0x200006f0 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - .bss.reqdir 0x200006f1 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - .bss.reqtype 0x200006f2 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - *fill* 0x200006f3 0x1 - .bss.rv16.4938 - 0x200006f4 0x8 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o + 0x200004f8 0x200 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + .bss.req_dir 0x200006f8 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + .bss.reqdir 0x200006f9 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + .bss.reqtype 0x200006fa 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + *fill* 0x200006fb 0x1 + .bss.rv16.4963 + 0x200006fc 0x8 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o .bss.swim_base - 0x200006fc 0x4 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x200006fc swim_base - .bss.swim_pin 0x20000700 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000700 swim_pin - *fill* 0x20000701 0x3 - .bss.tck_base 0x20000704 0x4 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000704 tck_base - .bss.tck_pin 0x20000708 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000708 tck_pin + 0x20000704 0x4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x20000704 swim_base + .bss.swim_pin 0x20000708 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x20000708 swim_pin *fill* 0x20000709 0x3 - .bss.tdi_base 0x2000070c 0x4 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x2000070c tdi_base - .bss.tdi_pin 0x20000710 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000710 tdi_pin + .bss.tck_base 0x2000070c 0x4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x2000070c tck_base + .bss.tck_pin 0x20000710 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x20000710 tck_pin *fill* 0x20000711 0x3 - .bss.tdo_base 0x20000714 0x4 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000714 tdo_base - .bss.tdo_pin 0x20000718 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000718 tdo_pin + .bss.tdi_base 0x20000714 0x4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x20000714 tdi_base + .bss.tdi_pin 0x20000718 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x20000718 tdi_pin *fill* 0x20000719 0x3 - .bss.tms_base 0x2000071c 0x4 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x2000071c tms_base - .bss.tms_pin 0x20000720 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000720 tms_pin + .bss.tdo_base 0x2000071c 0x4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x2000071c tdo_base + .bss.tdo_pin 0x20000720 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x20000720 tdo_pin *fill* 0x20000721 0x3 - .bss.usbMsgPtr - 0x20000724 0x4 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x20000724 usbMsgPtr - .bss.num_buff.5018 - 0x20000728 0x1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - *(COMMON) + .bss.tms_base 0x20000724 0x4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x20000724 tms_base + .bss.tms_pin 0x20000728 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x20000728 tms_pin *fill* 0x20000729 0x3 - COMMON 0x2000072c 0x4 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) - 0x2000072c errno - 0x20000730 . = ALIGN (0x4) - 0x20000730 __bss_end__ = . + .bss.usbMsgPtr + 0x2000072c 0x4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x2000072c usbMsgPtr + .bss.num_buff.5043 + 0x20000730 0x1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + *(COMMON) + *fill* 0x20000731 0x3 + COMMON 0x20000734 0x4 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libg.a(lib_a-reent.o) + 0x20000734 errno + 0x20000738 . = ALIGN (0x4) + 0x20000738 __bss_end__ = . -.heap 0x20000730 0x0 - 0x20000730 __end__ = . - 0x20000730 PROVIDE (end, .) +.heap 0x20000738 0x0 + 0x20000738 __end__ = . + 0x20000738 PROVIDE (end, .) *(.heap*) - .heap 0x20000730 0x0 C:\Users\Paul\AppData\Local\Temp\ccolB3Y5.o - 0x20000730 __HeapLimit = . + .heap 0x20000738 0x0 C:\Users\paul\AppData\Local\Temp\ccA8zS7I.o + 0x20000738 __HeapLimit = . -.stack_dummy 0x20000730 0xc00 +.stack_dummy 0x20000738 0xc00 *(.stack*) - .stack 0x20000730 0xc00 C:\Users\Paul\AppData\Local\Temp\ccolB3Y5.o + .stack 0x20000738 0xc00 C:\Users\paul\AppData\Local\Temp\ccA8zS7I.o 0x20001800 __StackTop = (ORIGIN (RAM) + LENGTH (RAM)) 0x20000c00 __StackLimit = (__StackTop - SIZEOF (.stack_dummy)) 0x20001800 PROVIDE (__stack, __StackTop) @@ -872,105 +860,105 @@ OUTPUT(build_stm/inlretro_stm.elf elf32-littlearm) .ARM.attributes 0x00000000 0x28 .ARM.attributes - 0x00000000 0x1e c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m/crti.o + 0x00000000 0x1e c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m/crti.o .ARM.attributes - 0x0000001e 0x1b C:\Users\Paul\AppData\Local\Temp\ccolB3Y5.o + 0x0000001e 0x1b C:\Users\paul\AppData\Local\Temp\ccA8zS7I.o .ARM.attributes - 0x00000039 0x2f C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o + 0x00000039 0x2f C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o .ARM.attributes - 0x00000068 0x2f C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o + 0x00000068 0x2f C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o .ARM.attributes - 0x00000097 0x2f C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o + 0x00000097 0x2f C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o .ARM.attributes - 0x000000c6 0x2f C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o + 0x000000c6 0x2f C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o .ARM.attributes - 0x000000f5 0x21 C:\Users\Paul\AppData\Local\Temp\cc60YfJ9.o + 0x000000f5 0x21 C:\Users\paul\AppData\Local\Temp\ccdBPmvz.o .ARM.attributes - 0x00000116 0x21 C:\Users\Paul\AppData\Local\Temp\ccqMHYEg.o + 0x00000116 0x21 C:\Users\paul\AppData\Local\Temp\ccgj2WWv.o .ARM.attributes - 0x00000137 0x1e c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uqi.o) + 0x00000137 0x1e c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_uqi.o) .ARM.attributes - 0x00000155 0x1e c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_shi.o) + 0x00000155 0x1e c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_shi.o) .ARM.attributes - 0x00000173 0x1e c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a(_thumb1_case_uhi.o) + 0x00000173 0x1e c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/thumb/v6-m\libgcc.a(_thumb1_case_uhi.o) -.comment 0x00000000 0x7f - .comment 0x00000000 0x7f C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x80 (size before relaxing) - .comment 0x0000007f 0x80 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - .comment 0x0000007f 0x80 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - .comment 0x0000007f 0x80 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o +.comment 0x00000000 0x6e + .comment 0x00000000 0x6e C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x6f (size before relaxing) + .comment 0x0000006e 0x6f C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + .comment 0x0000006e 0x6f C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + .comment 0x0000006e 0x6f C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o -.debug_line 0x00000000 0x19fc - .debug_line 0x00000000 0x6f C:\Users\Paul\AppData\Local\Temp\ccolB3Y5.o - .debug_line 0x0000006f 0xab1 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - .debug_line 0x00000b20 0x7ec C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - .debug_line 0x0000130c 0x3ce C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - .debug_line 0x000016da 0x1e6 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o - .debug_line 0x000018c0 0x49 C:\Users\Paul\AppData\Local\Temp\cc60YfJ9.o - .debug_line 0x00001909 0xf3 C:\Users\Paul\AppData\Local\Temp\ccqMHYEg.o +.debug_line 0x00000000 0x1b32 + .debug_line 0x00000000 0x6f C:\Users\paul\AppData\Local\Temp\ccA8zS7I.o + .debug_line 0x0000006f 0xae1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + .debug_line 0x00000b50 0x720 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + .debug_line 0x00001270 0x4c5 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + .debug_line 0x00001735 0x2c1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o + .debug_line 0x000019f6 0x49 C:\Users\paul\AppData\Local\Temp\ccdBPmvz.o + .debug_line 0x00001a3f 0xf3 C:\Users\paul\AppData\Local\Temp\ccgj2WWv.o -.debug_info 0x00000000 0x3d5e - .debug_info 0x00000000 0x8a C:\Users\Paul\AppData\Local\Temp\ccolB3Y5.o - .debug_info 0x0000008a 0x1823 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - .debug_info 0x000018ad 0x177e C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - .debug_info 0x0000302b 0x66d C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - .debug_info 0x00003698 0x5bc C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o - .debug_info 0x00003c54 0x87 C:\Users\Paul\AppData\Local\Temp\cc60YfJ9.o - .debug_info 0x00003cdb 0x83 C:\Users\Paul\AppData\Local\Temp\ccqMHYEg.o +.debug_info 0x00000000 0x4349 + .debug_info 0x00000000 0x8b C:\Users\paul\AppData\Local\Temp\ccA8zS7I.o + .debug_info 0x0000008b 0x185d C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + .debug_info 0x000018e8 0x14d6 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + .debug_info 0x00002dbe 0xdd0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + .debug_info 0x00003b8e 0x6af C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o + .debug_info 0x0000423d 0x88 C:\Users\paul\AppData\Local\Temp\ccdBPmvz.o + .debug_info 0x000042c5 0x84 C:\Users\paul\AppData\Local\Temp\ccgj2WWv.o -.debug_abbrev 0x00000000 0xabf - .debug_abbrev 0x00000000 0x14 C:\Users\Paul\AppData\Local\Temp\ccolB3Y5.o - .debug_abbrev 0x00000014 0x3a8 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - .debug_abbrev 0x000003bc 0x396 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - .debug_abbrev 0x00000752 0x1ba C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - .debug_abbrev 0x0000090c 0x18b C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o - .debug_abbrev 0x00000a97 0x14 C:\Users\Paul\AppData\Local\Temp\cc60YfJ9.o - .debug_abbrev 0x00000aab 0x14 C:\Users\Paul\AppData\Local\Temp\ccqMHYEg.o +.debug_abbrev 0x00000000 0xb23 + .debug_abbrev 0x00000000 0x14 C:\Users\paul\AppData\Local\Temp\ccA8zS7I.o + .debug_abbrev 0x00000014 0x3b5 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + .debug_abbrev 0x000003c9 0x3bf C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + .debug_abbrev 0x00000788 0x1c3 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + .debug_abbrev 0x0000094b 0x1b0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o + .debug_abbrev 0x00000afb 0x14 C:\Users\paul\AppData\Local\Temp\ccdBPmvz.o + .debug_abbrev 0x00000b0f 0x14 C:\Users\paul\AppData\Local\Temp\ccgj2WWv.o -.debug_aranges 0x00000000 0x1a8 +.debug_aranges 0x00000000 0x1f8 .debug_aranges - 0x00000000 0x20 C:\Users\Paul\AppData\Local\Temp\ccolB3Y5.o + 0x00000000 0x20 C:\Users\paul\AppData\Local\Temp\ccA8zS7I.o .debug_aranges - 0x00000020 0x20 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o + 0x00000020 0x20 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o .debug_aranges - 0x00000040 0x50 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o + 0x00000040 0x58 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o .debug_aranges - 0x00000090 0xa0 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o + 0x00000098 0xe0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o .debug_aranges - 0x00000130 0x38 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o + 0x00000178 0x40 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o .debug_aranges - 0x00000168 0x20 C:\Users\Paul\AppData\Local\Temp\cc60YfJ9.o + 0x000001b8 0x20 C:\Users\paul\AppData\Local\Temp\ccdBPmvz.o .debug_aranges - 0x00000188 0x20 C:\Users\Paul\AppData\Local\Temp\ccqMHYEg.o + 0x000001d8 0x20 C:\Users\paul\AppData\Local\Temp\ccgj2WWv.o -.debug_loc 0x00000000 0x404b - .debug_loc 0x00000000 0x2691 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - .debug_loc 0x00002691 0xf75 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - .debug_loc 0x00003606 0x660 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - .debug_loc 0x00003c66 0x3e5 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o +.debug_loc 0x00000000 0x42c1 + .debug_loc 0x00000000 0x2767 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + .debug_loc 0x00002767 0xda4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + .debug_loc 0x0000350b 0x91b C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + .debug_loc 0x00003e26 0x49b C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o -.debug_ranges 0x00000000 0x1708 - .debug_ranges 0x00000000 0x13e8 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - .debug_ranges 0x000013e8 0x268 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - .debug_ranges 0x00001650 0x90 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - .debug_ranges 0x000016e0 0x28 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o +.debug_ranges 0x00000000 0x16b8 + .debug_ranges 0x00000000 0x1378 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + .debug_ranges 0x00001378 0x220 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + .debug_ranges 0x00001598 0xd0 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + .debug_ranges 0x00001668 0x50 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o -.debug_str 0x00000000 0xd20 - .debug_str 0x00000000 0x8ff C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - 0x964 (size before relaxing) - .debug_str 0x000008ff 0x237 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - 0x4da (size before relaxing) - .debug_str 0x00000b36 0x12c C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - 0x319 (size before relaxing) - .debug_str 0x00000c62 0xbe C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o - 0x345 (size before relaxing) +.debug_str 0x00000000 0xdd6 + .debug_str 0x00000000 0x90a C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + 0x96f (size before relaxing) + .debug_str 0x0000090a 0x1f1 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + 0x494 (size before relaxing) + .debug_str 0x00000afb 0x1c5 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + 0x3c7 (size before relaxing) + .debug_str 0x00000cc0 0x116 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o + 0x39d (size before relaxing) -.debug_frame 0x00000000 0x31c - .debug_frame 0x00000000 0x30 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans0.ltrans.o - .debug_frame 0x00000030 0xd8 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans1.ltrans.o - .debug_frame 0x00000108 0x184 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans2.ltrans.o - .debug_frame 0x0000028c 0x90 C:\Users\Paul\AppData\Local\Temp\ccBI14BB.ltrans3.ltrans.o +.debug_frame 0x00000000 0x44c + .debug_frame 0x00000000 0x30 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans0.ltrans.o + .debug_frame 0x00000030 0x100 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans1.ltrans.o + .debug_frame 0x00000130 0x268 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans2.ltrans.o + .debug_frame 0x00000398 0xb4 C:\Users\paul\AppData\Local\Temp\cc6XiCXY.ltrans3.ltrans.o .stabstr 0x00000000 0x76 - .stabstr 0x00000000 0x76 c:/arm/gcc-arm-none-eabi-6-2017-q2-update-win32/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) + .stabstr 0x00000000 0x76 c:/arm/gcc-arm-none-eabi-6_2-2016q4-20161216-win32/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v6-m\libnosys.a(getpid.o) diff --git a/firmware/source/dump.c b/firmware/source/dump.c index 807ba76..c8cd90e 100644 --- a/firmware/source/dump.c +++ b/firmware/source/dump.c @@ -17,6 +17,57 @@ uint8_t dump_buff( buffer *buff ) { //use mem_type to set addrH/X as needed for dump loop //also use to get read function pointer switch ( buff->mem_type ) { + case NESCPU_4KB: + //mapper lower nibble specifies NES CPU A12-15 + if (buff->mapper > 0x0F) { + //mapper can only be 4bits (0-15) + return ERR_BUFF_PART_NUM_RANGE; + } + addrH |= (buff->mapper << 4); // 8 << 12 = shift by 4 + buff->cur_byte = nes_cpu_page_rd_poll( buff->data, addrH, buff->id, + //id contains MSb of page when <256B buffer + buff->last_idx, ~FALSE ); + break; + + case NESPPU_1KB: + //mapper bits 2-5 specifies NES PPU A10-13 + if (buff->mapper & 0xC3) { //make sure bits 7, 6, 1, & 0 aren't set + //mapper can only have bits 2-5 set + return ERR_BUFF_PART_NUM_RANGE; + } + addrH |= buff->mapper; // PPU A10-13 get set based on mapper + buff->cur_byte = nes_ppu_page_rd_poll( buff->data, addrH, buff->id, + buff->last_idx, ~FALSE ); + break; + + case NESCPU_PAGE: + //mapper byte specifies CPU A15-8 + addrH |= buff->mapper; + buff->cur_byte = nes_cpu_page_rd_poll( buff->data, addrH, buff->id, + //id contains MSb of page when <256B buffer + buff->last_idx, ~FALSE ); + break; + + case NESPPU_PAGE: + //mapper byte specifies PPU A13-8 + if (buff->mapper & 0xC0) { //make sure bits 7, 6 aren't set + //mapper can only have bits 5-0 set + return ERR_BUFF_PART_NUM_RANGE; + } + addrH |= buff->mapper; // PPU A10-13 get set based on mapper + buff->cur_byte = nes_ppu_page_rd_poll( buff->data, addrH, buff->id, + buff->last_idx, ~FALSE ); + break; + + case SNESROM_PAGE: //ROMSEL is always taken low + //mapper byte specifies SNES CPU A15-8 + addrH |= (buff->mapper); //no shift needed + buff->cur_byte = snes_rom_page_rd_poll( buff->data, addrH, buff->id, + //id contains MSb of page when <256B buffer + buff->last_idx, ~FALSE ); + break; + + case PRGROM: addrH |= 0x80; //$8000 if (buff->mapper == MMC1) { @@ -53,6 +104,9 @@ uint8_t dump_buff( buffer *buff ) { buff->last_idx, ~FALSE ); break; } + //if (buff->mapper == MMC3) { + // THIS IS HANDLED from the host side using NESCPU_4KB + //} if (buff->mapper == MAP30) { //addrH &= 0b1011 1111 A14 must always be low addrH &= 0xBF; @@ -67,18 +121,18 @@ uint8_t dump_buff( buffer *buff ) { buff->last_idx, ~FALSE ); break; } - if ((buff->mapper == BxROM) || (buff->mapper == CDREAM)) { - //write bank value to bank table - //page_num shift by 7 bits A15 >> A8(0) - bank = (buff->page_num)>>7; - //Lizard bank table @ FF94 - nes_cpu_wr( (0xFF94+bank), bank ); - //HH85 - //nes_cpu_wr( (0xFFE0+bank), bank ); - //Mojon bank table @ FF94 - //nes_cpu_wr( 0x800C, 0x00); //select first bank (only one with table) - //nes_cpu_wr( (0xCC43+bank), bank ); //then select desired bank - } + //if ((buff->mapper == BxROM) || (buff->mapper == CDREAM)) { + // //write bank value to bank table + // //page_num shift by 7 bits A15 >> A8(0) + // bank = (buff->page_num)>>7; + // //Lizard bank table @ FF94 + // nes_cpu_wr( (0xFF94+bank), bank ); + // //HH85 + // //nes_cpu_wr( (0xFFE0+bank), bank ); + // //Mojon bank table @ FF94 + // //nes_cpu_wr( 0x800C, 0x00); //select first bank (only one with table) + // //nes_cpu_wr( (0xCC43+bank), bank ); //then select desired bank + //} if (buff->mapper == A53) { //write bank value to bank table //page_num shift by 7 bits A15 >> A8(0) @@ -105,25 +159,44 @@ uint8_t dump_buff( buffer *buff ) { break; case CHRROM: //$0000 - if (buff->mapper == NROM) { - buff->cur_byte = nes_ppu_page_rd_poll( buff->data, addrH, buff->id, - buff->last_idx, ~FALSE ); - } + //if (buff->mapper == NROM) { + // buff->cur_byte = nes_ppu_page_rd_poll( buff->data, addrH, buff->id, + // buff->last_idx, ~FALSE ); + //} - if (buff->mapper == CDREAM) { - //select bank - //8KB banks $0000-1FFF - //page_num shift by 5 bits A13 >> A8(0) - bank = (buff->page_num)>>5; + //if (buff->mapper == MMC3) { + // THIS IS HANDLED from the host side using NESPPU_4KB + //} - //write bank to register - //TODO account for bus conflicts - nes_cpu_wr(0xFFFF, bank<<4); - - addrH &= 0x1F; //only A12-8 are directly addressable - buff->cur_byte = nes_ppu_page_rd_poll( buff->data, addrH, buff->id, - buff->last_idx, ~FALSE ); - } + //if (buff->mapper == CNROM) { + // //select bank + // //8KB banks $0000-1FFF + // //page_num shift by 5 bits A13 >> A8(0) + // bank = (buff->page_num)>>5; + + // //write bank to register + // //TODO account for bus conflicts + // nes_cpu_wr(0x8000, bank); + // + // addrH &= 0x1F; //only A12-8 are directly addressable + // buff->cur_byte = nes_ppu_page_rd_poll( buff->data, addrH, buff->id, + // buff->last_idx, ~FALSE ); + //} + + //if (buff->mapper == CDREAM) { + // //select bank + // //8KB banks $0000-1FFF + // //page_num shift by 5 bits A13 >> A8(0) + // bank = (buff->page_num)>>5; + + // //write bank to register + // //TODO account for bus conflicts + // nes_cpu_wr(0xFFFF, bank<<4); + // + // addrH &= 0x1F; //only A12-8 are directly addressable + // buff->cur_byte = nes_ppu_page_rd_poll( buff->data, addrH, buff->id, + // buff->last_idx, ~FALSE ); + //} if (buff->mapper == DPROM) { //select bank diff --git a/firmware/source/flash.c b/firmware/source/flash.c index 60ade47..7bf7425 100644 --- a/firmware/source/flash.c +++ b/firmware/source/flash.c @@ -1,44 +1,36 @@ #include "flash.h" - -uint8_t write_page( uint8_t bank, uint8_t addrH, uint16_t unlock1, uint16_t unlock2, buffer *buff, write_funcptr wr_func, read_funcptr rd_func ) +uint8_t write_page( uint8_t addrH, buffer *buff, write_funcptr wr_func ) +{ + uint16_t cur = buff->cur_byte; + uint8_t n = buff->cur_byte; + uint8_t read; + + while ( cur <= buff->last_idx ) { + + wr_func( ((addrH<<8)| n), buff->data[n] ); + //write function returns when it's complete or errors out + + n++; + cur++; + } + buff->cur_byte = n; + + //TODO error check/report + return SUCCESS; +} + +uint8_t write_page_old( uint8_t bank, uint8_t addrH, uint16_t unlock1, uint16_t unlock2, buffer *buff, write_funcptr wr_func, read_funcptr rd_func ) { uint16_t cur = buff->cur_byte; uint8_t n = buff->cur_byte; uint8_t read; -// extern operation_info *oper_info; -// while ( cur <= buff->last_idx ) { //write unlock sequence - //need to make address and unlock data variable - //best for host to communcate these values - //actual value is part mapper dependent and part flash dependent - //mapper controlled address bits dictate where split is - //32KB banking A14-0 NES ctl, A15+ mapper ctl "bank" NROM, BNROM, ANROM - //addrH_dmask = 0b0111 1111 directly addressable addrH bits - //page2bankshft = A14->A8 = 7 shifts (equal to number of set bits in addrH_mask - //16KB banking A13-0 NES ctl, A14+ mapper ctl "bank" UxROM, MMC1 - //addrH_dmask = 0b0011 1111 - //page2bankshft = A13->A8 = 6 shifts - // 8KB banking A12-0 NES ctl, A13+ mapper ctl "bank" MMC3, FME7 - //addrH_dmask = 0b0001 1111 - //page2bankshft = A12->A8 = 5 shifts - // 4KB banking A11-0 NES ctl, A12+ mapper ctl "bank" ezNSF - //addrH_dmask = 0b0000 1111 - //page2bankshft = A11->A8 = 4 shifts - //wr_func( 0x5555, 0xAA ); - //wr_func( 0xD555, 0xAA ); wr_func( unlock1, 0xAA ); -// wr_func( oper_info->unlock1_AH, oper_info->unlock1_AL, oper_info->unlock1_data ); - //wr_func( 0x2AAA, 0x55 ); - //wr_func( 0xAAAA, 0x55 ); wr_func( unlock2, 0x55 ); -// wr_func( oper_info->unlock2_AH, oper_info->unlock2_AL, oper_info->unlock2_data ); - //wr_func( 0x5555, 0xA0 ); - //wr_func( 0xD555, 0xA0 ); wr_func( unlock1, 0xA0 ); -// wr_func( oper_info->command_AH, oper_info->command_AL, oper_info->command1_data ); wr_func( ((addrH<<8)| n), buff->data[n] ); do { @@ -57,7 +49,7 @@ uint8_t write_page( uint8_t bank, uint8_t addrH, uint16_t unlock1, uint16_t unlo // } else { // nes_cpu_wr(0x5000, 0x81); //outer reg select mode // nes_cpu_wr(0x8000, bank); //outer bank -// nes_cpu_wr(0x5000, 0x00); //chr reg select act like CNROM +// nes_cpu_wr(0x5000, 0x00); //chr reg select act like cnrom // LED_OP(); // LED_HI(); // } @@ -237,8 +229,6 @@ uint8_t write_page_a53( uint8_t bank, uint8_t addrH, buffer *buff, write_funcptr uint16_t cur = buff->cur_byte; uint8_t n = buff->cur_byte; uint8_t read; -// extern operation_info *oper_info; -// //enter unlock bypass mode wr_func( 0x8AAA, 0xAA ); @@ -246,33 +236,6 @@ uint8_t write_page_a53( uint8_t bank, uint8_t addrH, buffer *buff, write_funcptr wr_func( 0x8AAA, 0x20 ); while ( cur <= buff->last_idx ) { - //write unlock sequence - //need to make address and unlock data variable - //best for host to communcate these values - //actual value is part mapper dependent and part flash dependent - //mapper controlled address bits dictate where split is - //32KB banking A14-0 NES ctl, A15+ mapper ctl "bank" NROM, BNROM, ANROM - //addrH_dmask = 0b0111 1111 directly addressable addrH bits - //page2bankshft = A14->A8 = 7 shifts (equal to number of set bits in addrH_mask - //16KB banking A13-0 NES ctl, A14+ mapper ctl "bank" UxROM, MMC1 - //addrH_dmask = 0b0011 1111 - //page2bankshft = A13->A8 = 6 shifts - // 8KB banking A12-0 NES ctl, A13+ mapper ctl "bank" MMC3, FME7 - //addrH_dmask = 0b0001 1111 - //page2bankshft = A12->A8 = 5 shifts - // 4KB banking A11-0 NES ctl, A12+ mapper ctl "bank" ezNSF - //addrH_dmask = 0b0000 1111 - //page2bankshft = A11->A8 = 4 shifts - //wr_func( 0x5555, 0xAA ); -// wr_func( 0x8AAA, 0xAA ); -//// wr_func( oper_info->unlock1_AH, oper_info->unlock1_AL, oper_info->unlock1_data ); -// //wr_func( 0x2AAA, 0x55 ); -// wr_func( 0x8555, 0x55 ); -//// wr_func( oper_info->unlock2_AH, oper_info->unlock2_AL, oper_info->unlock2_data ); -// //wr_func( 0x5555, 0xA0 ); -// wr_func( 0x8AAA, 0xA0 ); -//// wr_func( oper_info->command_AH, oper_info->command_AL, oper_info->command1_data ); -// wr_func( ((addrH<<8)| n), buff->data[n] ); //TODO FIX THIS! It shouldn't be needed! @@ -332,8 +295,6 @@ uint8_t write_page_tssop( uint8_t bank, uint8_t addrH, buffer *buff, write_funcp uint16_t cur = buff->cur_byte; uint8_t n = buff->cur_byte; uint8_t read; -// extern operation_info *oper_info; -// //enter unlock bypass mode wr_func( 0x8AAA, 0xAA ); @@ -342,15 +303,6 @@ uint8_t write_page_tssop( uint8_t bank, uint8_t addrH, buffer *buff, write_funcp while ( cur <= buff->last_idx ) { - //TODO FIX THIS! It shouldn't be needed! - //but for some reason the mapper is loosing it's setting for $5000 register to - //permit flash writes. Many writes go through, but at somepoint it gets lost.. - //maybe the best fix it to require address to be equal to $5555 to write to flash enable register.. - //but for now, this rewrite hack solves the issue. - //nes_cpu_wr(0x5000, 0x54); //chr reg select act like CNROM & enable flash writes - //AVR didn't need this patch so maybe is a speed issue - //stmadapter didn't have problems either.. - //added time delay before m2 rising edge and it didn't change anything for stm6 // curaddresswrite( 0xA0 ); //gained ~3KBps (59.13KBps) inl6 with v3.0 proto wr_func( ((addrH<<8)| n), 0xA0 ); @@ -400,35 +352,13 @@ uint8_t write_page_chr( uint8_t bank, uint8_t addrH, buffer *buff, write_funcptr uint16_t cur = buff->cur_byte; uint8_t n = buff->cur_byte; uint8_t read; -// extern operation_info *oper_info; while ( cur <= buff->last_idx ) { //write unlock sequence - //need to make address and unlock data variable - //best for host to communcate these values - //actual value is part mapper dependent and part flash dependent - //mapper controlled address bits dictate where split is - //32KB banking A14-0 NES ctl, A15+ mapper ctl "bank" NROM, BNROM, ANROM - //addrH_dmask = 0b0111 1111 directly addressable addrH bits - //page2bankshft = A14->A8 = 7 shifts (equal to number of set bits in addrH_mask - //16KB banking A13-0 NES ctl, A14+ mapper ctl "bank" UxROM, MMC1 - //addrH_dmask = 0b0011 1111 - //page2bankshft = A13->A8 = 6 shifts - // 8KB banking A12-0 NES ctl, A13+ mapper ctl "bank" MMC3, FME7 - //addrH_dmask = 0b0001 1111 - //page2bankshft = A12->A8 = 5 shifts - // 4KB banking A11-0 NES ctl, A12+ mapper ctl "bank" ezNSF - //addrH_dmask = 0b0000 1111 - //page2bankshft = A11->A8 = 4 shifts wr_func( 0x1555, 0xAA ); -// wr_func( oper_info->unlock1_AH, oper_info->unlock1_AL, oper_info->unlock1_data ); wr_func( 0x0AAA, 0x55 ); -// wr_func( oper_info->unlock2_AH, oper_info->unlock2_AL, oper_info->unlock2_data ); wr_func( 0x1555, 0xA0 ); -// wr_func( oper_info->command_AH, oper_info->command_AL, oper_info->command1_data ); wr_func( ((addrH<<8)| n), buff->data[n] ); - //wr_func( ((addrH<<8)| n), buff->page_num ); - //wr_func( ((addrH<<8)| n), addrH); do { usbPoll(); @@ -457,44 +387,67 @@ uint8_t write_page_chr( uint8_t bank, uint8_t addrH, buffer *buff, write_funcptr } +uint8_t write_page_chr_cnrom( uint8_t bank, uint8_t addrH, buffer *buff, write_funcptr wr_func, read_funcptr rd_func ) +{ + uint16_t cur = buff->cur_byte; + uint8_t n = buff->cur_byte; + uint8_t read; + + while ( cur <= buff->last_idx ) { + //write unlock sequence + nes_cpu_wr( 0x8000, 0x02 ); + wr_func( 0x1555, 0xAA ); + nes_cpu_wr( 0x8000, 0x01 ); + wr_func( 0x0AAA, 0x55 ); + nes_cpu_wr( 0x8000, 0x02 ); + wr_func( 0x1555, 0xA0 ); + nes_cpu_wr( 0x8000, bank ); + wr_func( ((addrH<<8)| n), buff->data[n] ); + + do { + usbPoll(); + nes_cpu_wr( 0x8000, bank ); + read = rd_func((addrH<<8)|n); + + } while( read != rd_func((addrH<<8)|n) ); + //TODO verify byte is value that was trying to be flashed + //move on to next byte + //n++; + //cur++; + if (read == buff->data[n]) { + // n++; + // cur++; + LED_IP_PU(); + LED_LO(); + } else { + LED_OP(); + LED_HI(); + } + + } + + buff->cur_byte = n; + + return SUCCESS; + +} + uint8_t write_page_chr_cdream( uint8_t bank, uint8_t addrH, buffer *buff, write_funcptr wr_func, read_funcptr rd_func ) { uint16_t cur = buff->cur_byte; uint8_t n = buff->cur_byte; uint8_t read; -// extern operation_info *oper_info; while ( cur <= buff->last_idx ) { //write unlock sequence - //need to make address and unlock data variable - //best for host to communcate these values - //actual value is part mapper dependent and part flash dependent - //mapper controlled address bits dictate where split is - //32KB banking A14-0 NES ctl, A15+ mapper ctl "bank" NROM, BNROM, ANROM - //addrH_dmask = 0b0111 1111 directly addressable addrH bits - //page2bankshft = A14->A8 = 7 shifts (equal to number of set bits in addrH_mask - //16KB banking A13-0 NES ctl, A14+ mapper ctl "bank" UxROM, MMC1 - //addrH_dmask = 0b0011 1111 - //page2bankshft = A13->A8 = 6 shifts - // 8KB banking A12-0 NES ctl, A13+ mapper ctl "bank" MMC3, FME7 - //addrH_dmask = 0b0001 1111 - //page2bankshft = A12->A8 = 5 shifts - // 4KB banking A11-0 NES ctl, A12+ mapper ctl "bank" ezNSF - //addrH_dmask = 0b0000 1111 - //page2bankshft = A11->A8 = 4 shifts nes_cpu_wr(0x8000, 0x20); wr_func( 0x1555, 0xAA ); -// wr_func( oper_info->unlock1_AH, oper_info->unlock1_AL, oper_info->unlock1_data ); nes_cpu_wr(0x8000, 0x10); wr_func( 0x0AAA, 0x55 ); -// wr_func( oper_info->unlock2_AH, oper_info->unlock2_AL, oper_info->unlock2_data ); nes_cpu_wr(0x8000, 0x20); wr_func( 0x1555, 0xA0 ); -// wr_func( oper_info->command_AH, oper_info->command_AL, oper_info->command1_data ); nes_cpu_wr(0x8000, bank<<4); wr_func( ((addrH<<8)| n), buff->data[n] ); - //wr_func( ((addrH<<8)| n), buff->page_num ); - //wr_func( ((addrH<<8)| n), addrH); do { usbPoll(); @@ -528,7 +481,6 @@ uint8_t write_page_dualport( uint8_t bank, uint8_t addrH, buffer *buff, write_fu uint16_t cur = buff->cur_byte; uint8_t n = buff->cur_byte; uint8_t read; -// extern operation_info *oper_info; //enter unlock bypass mode wr_func( 0x0AAA, 0xAA ); @@ -588,8 +540,6 @@ uint8_t write_page_snes( uint8_t bank, uint8_t addrH, buffer *buff, write_funcpt uint16_t cur = buff->cur_byte; uint8_t n = buff->cur_byte; uint8_t read; -// extern operation_info *oper_info; -// uint8_t cur_data = buff->data[n]; #ifdef AVR_CORE wdt_reset(); @@ -619,23 +569,6 @@ uint8_t write_page_snes( uint8_t bank, uint8_t addrH, buffer *buff, write_funcpt while ( cur <= buff->last_idx ) { //write unlock sequence - //need to make address and unlock data variable - //best for host to communcate these values - //actual value is part mapper dependent and part flash dependent - //mapper controlled address bits dictate where split is - //32KB banking A14-0 NES ctl, A15+ mapper ctl "bank" NROM, BNROM, ANROM - //addrH_dmask = 0b0111 1111 directly addressable addrH bits - //page2bankshft = A14->A8 = 7 shifts (equal to number of set bits in addrH_mask - //16KB banking A13-0 NES ctl, A14+ mapper ctl "bank" UxROM, MMC1 - //addrH_dmask = 0b0011 1111 - //page2bankshft = A13->A8 = 6 shifts - // 8KB banking A12-0 NES ctl, A13+ mapper ctl "bank" MMC3, FME7 - //addrH_dmask = 0b0001 1111 - //page2bankshft = A12->A8 = 5 shifts - // 4KB banking A11-0 NES ctl, A12+ mapper ctl "bank" ezNSF - //addrH_dmask = 0b0000 1111 - //page2bankshft = A11->A8 = 4 shifts - // //unlocked wr_func( 0x0AAA, 0xAA ); //unlocked wr_func( 0x0555, 0x55 ); @@ -816,7 +749,8 @@ uint8_t flash_buff( buffer *buff ) { switch ( buff->mem_type ) { case PRGROM: //$8000 if (buff->mapper == NROM) { - write_page( 0, (0x80 | addrH), 0x5555, 0x2AAA, buff, discrete_exp0_prgrom_wr, nes_cpu_rd ); + //write_page_old( 0, (0x80 | addrH), 0x5555, 0x2AAA, buff, discrete_exp0_prgrom_wr, nes_cpu_rd ); + write_page( (0x80+addrH), buff, nrom_prgrom_flash_wr); } if (buff->mapper == MMC1) { //write bank value @@ -838,6 +772,16 @@ uint8_t flash_buff( buffer *buff ) { //bank gets written inside flash algo write_page_bank( bank, addrH, 0x5555, 0x2AAA, buff, discrete_exp0_prgrom_wr, nes_cpu_rd ); } + + if (buff->mapper == MMC3) { + //Latest method used here! + //leave the host responsible for init & banking + //we just need to call a page write algo and give it mmc3_prgrom_flash_wr function + //think of this only as an 8KB ROM + //MMC3 flash writes are always $8000-9FFF, but the host arranges this + write_page( (0x80+addrH), buff, mmc3_prgrom_flash_wr); + } + if (buff->mapper == MM2) { //addrH &= 0b1011 1111 A14 must always be low addrH &= 0x3F; @@ -858,19 +802,20 @@ uint8_t flash_buff( buffer *buff ) { //bank gets written inside flash algo write_page_bank_map30( bank, addrH, 0x9555, 0xAAAA, buff, nes_cpu_wr, nes_cpu_rd ); } - if ((buff->mapper == BxROM) || (buff->mapper == CDREAM)) { - //write bank value - //page_num shift by 7 bits A15 >> A8(0) - bank = buff->page_num >> 7; - //Lizard banktable location - nes_cpu_wr( (0xFF94+bank), bank ); - //hh85 - //nes_cpu_wr( (0xFFE0+bank), bank ); - //Mojontales - //nes_cpu_wr( 0x800C, 0x00); //select first bank (only bank with table) - //nes_cpu_wr( (0xCC43+bank), bank ); //then select desired bank - write_page( 0, (0x80 | addrH), 0x5555, 0x2AAA, buff, discrete_exp0_prgrom_wr, nes_cpu_rd ); - } + //if ((buff->mapper == BxROM) || (buff->mapper == CDREAM)) { + //new method uses same algo as NROM, host handles all the banking! + // //write bank value + // //page_num shift by 7 bits A15 >> A8(0) + // bank = buff->page_num >> 7; + // //Lizard banktable location + // nes_cpu_wr( (0xFF94+bank), bank ); + // //hh85 + // //nes_cpu_wr( (0xFFE0+bank), bank ); + // //Mojontales + // //nes_cpu_wr( 0x800C, 0x00); //select first bank (only bank with table) + // //nes_cpu_wr( (0xCC43+bank), bank ); //then select desired bank + // write_page_old( 0, (0x80 | addrH), 0x5555, 0x2AAA, buff, discrete_exp0_prgrom_wr, nes_cpu_rd ); + //} if (buff->mapper == CNINJA) { //addrH &= 0b1001 1111 A14-13 must always be low addrH &= 0x1F; @@ -881,7 +826,7 @@ uint8_t flash_buff( buffer *buff ) { bank = buff->page_num >> 5; nes_cpu_wr( (0x6000), 0xA5 ); //select desired bank nes_cpu_wr( (0xFFFF), bank ); //select desired bank - write_page( 0, addrH, 0xD555, 0xAAAA, buff, nes_cpu_wr, nes_cpu_rd ); + write_page_old( 0, addrH, 0xD555, 0xAAAA, buff, nes_cpu_wr, nes_cpu_rd ); } if (buff->mapper == A53) { //write bank value to bank table @@ -896,11 +841,11 @@ uint8_t flash_buff( buffer *buff ) { nes_cpu_wr(0x5000, 0x54); //chr reg select act like CNROM & enable flash writes //need to use standard CPU writes - //write_page( 0, (0x80 | addrH), buff, nes_cpu_wr, nes_cpu_rd ); + //write_page_old( 0, (0x80 | addrH), buff, nes_cpu_wr, nes_cpu_rd ); //break; //WORKS PLCC Action53: //had problems later not all bytes getting programmed.. - //write_page( bank, (0x80 | addrH), 0xD555, 0xAAAA, buff, nes_cpu_wr, nes_cpu_rd ); + //write_page_old( bank, (0x80 | addrH), 0xD555, 0xAAAA, buff, nes_cpu_wr, nes_cpu_rd ); //TSSOP-28 action53: write_page_a53( bank, (0x80 | addrH), buff, nes_cpu_wr, nes_cpu_rd ); } @@ -917,20 +862,35 @@ uint8_t flash_buff( buffer *buff ) { break; case CHRROM: //$0000 if (buff->mapper == NROM) { - write_page_chr( 0, addrH, buff, nes_ppu_wr, nes_ppu_rd ); + //write_page_chr( 0, addrH, buff, nes_ppu_wr, nes_ppu_rd ); + write_page( addrH, buff, nrom_chrrom_flash_wr); + } + + if (buff->mapper == CNROM) { + //cur_bank and bank_table must be set in nes.c prior to calling + write_page( addrH, buff, cnrom_chrrom_flash_wr); + } + if (buff->mapper == MMC3) { + //Latest method used here! + //leave the host responsible for init & banking + //we just need to call a page write algo and give it mmc3_prgrom_flash_wr function + //think of this only as an 8KB ROM + //MMC3 flash writes are always $8000-9FFF + write_page( addrH, buff, mmc3_chrrom_flash_wr); } if (buff->mapper == CDREAM) { - //select bank - //8KB banks $0000-1FFF - //page_num shift by 5 bits A13 >> A8(0) - bank = (buff->page_num)>>5; - - //write bank to register - //done inside write routine - //nes_cpu_wr(0x8000, bank<<4); - - addrH &= 0x1F; //only A12-8 are directly addressable - write_page_chr_cdream( bank, addrH, buff, nes_ppu_wr, nes_ppu_rd ); +// //select bank +// //8KB banks $0000-1FFF +// //page_num shift by 5 bits A13 >> A8(0) +// bank = (buff->page_num)>>5; +// +// //write bank to register +// //done inside write routine +// //nes_cpu_wr(0x8000, bank<<4); +// +// addrH &= 0x1F; //only A12-8 are directly addressable +// write_page_chr_cdream( bank, addrH, buff, nes_ppu_wr, nes_ppu_rd ); + write_page( addrH, buff, cdream_chrrom_flash_wr); } if (buff->mapper == DPROM) { //select bank @@ -945,12 +905,29 @@ uint8_t flash_buff( buffer *buff ) { write_page_dualport( 0, addrH, buff, nes_dualport_wr, nes_dualport_rd ); } break; + case PRGRAM: - //addrH |= 0x60; //$6000 - //buff->cur_byte = nes_cpu_page_wr_poll( buff->data, addrH, buff->id, - // buff->last_idx, ~FALSE ); + write_page( addrH+0x60, buff, nes_cpu_wr); break; + case SNESROM: + if (buff->mapper == LOROM_5VOLT) { + //LOROM banks start at $XX:8000 + write_page( addrH+0x80, buff, snes_5v_flash_wr); + } + if (buff->mapper == HIROM_5VOLT) { + //HIROM banks start at $XX:0000 + write_page( addrH, buff, snes_5v_flash_wr); + } + if (buff->mapper == LOROM_3VOLT) { + //LOROM banks start at $XX:8000 + write_page( addrH+0x80, buff, snes_3v_flash_wr); + } + if (buff->mapper == HIROM_3VOLT) { + //HIROM banks start at $XX:0000 + write_page( addrH, buff, snes_3v_flash_wr); + } + if (buff->mapper == LOROM) { addrH |= 0x80; //$8000 LOROM space //need to split page_num @@ -960,6 +937,8 @@ uint8_t flash_buff( buffer *buff ) { bank = (buff->page_num)>>7; //clear any reset state //EXP0_HI(); + HADDR_SET( bank ); + write_page_snes( 0, addrH, buff, snes_rom_wr, snes_rom_rd ); } if (buff->mapper == HIROM) { //need to split page_num @@ -968,9 +947,9 @@ uint8_t flash_buff( buffer *buff ) { //A22 high (HIROM) //A23 ~page_num[14] (bank CO starts first half, bank 40 starts second) bank = ((((buff->page_num)>>8) | 0x40) & 0x7F); - } HADDR_SET( bank ); write_page_snes( 0, addrH, buff, snes_rom_wr, snes_rom_rd ); + } case SNESRAM: //warn addrX = ((buff->page_num)>>8); break; @@ -979,14 +958,6 @@ uint8_t flash_buff( buffer *buff ) { } - //lets start just reading first page of PRG-ROM then get fancy -// while (buff->cur_byte < buff->last_idx) { -// -// //might be faster to put some of these in new pointers, but not sure.. -// buff->data[buff->cur_byte] = nes_cpu_rd( addrH, buff->cur_byte ); -// buff->cur_byte++; -// } - return SUCCESS; } diff --git a/firmware/source/flash.h b/firmware/source/flash.h index 0965441..4b0884c 100644 --- a/firmware/source/flash.h +++ b/firmware/source/flash.h @@ -4,6 +4,7 @@ #include "pinport.h" #include "types.h" #include "nes.h" +#include "snes.h" #include "swim.h" #include "shared_dictionaries.h" #include "shared_errors.h" diff --git a/firmware/source/io.c b/firmware/source/io.c index 1130ba1..762bf77 100644 --- a/firmware/source/io.c +++ b/firmware/source/io.c @@ -29,6 +29,10 @@ uint8_t io_call( uint8_t opcode, uint8_t miscdata, uint16_t operand, uint8_t *rd case IO_RESET: io_reset(); break; case NES_INIT: nes_init(); break; case SNES_INIT: snes_init(); break; + case GAMEBOY_INIT: gameboy_init(); break; +// case GBA_INIT: gba_init(); break; + case SEGA_INIT: sega_init(); break; +// case N64_INIT: n64_init(); break; case SWIM_INIT: return swim_init(operand); break; case JTAG_INIT: @@ -60,14 +64,11 @@ void io_reset() RCC->AHBRSTR &= ~( RCC_AHBRSTR_GPIOARST | RCC_AHBRSTR_GPIOBRST | RCC_AHBRSTR_GPIOCRST | RCC_AHBRSTR_GPIODRST | RCC_AHBRSTR_GPIOFRST ); #endif - //pull up addr[7:0] bus - ADDR_ENABLE(); - ADDR_IP(); - ADDR_PU(); - - //pull up data bus - DATA_ENABLE(); - DATA_IP_PU(); + //First set gameboy/GBA power, default to 3v (safe for both) +#ifndef C16nodef + GBP_OP(); + GBP_3V(); +#endif //pull up control port CTL_ENABLE(); @@ -104,6 +105,16 @@ void io_reset() // -enabling EXP FF output will drive EXP0 to value of A21/EXP6 EXP0_IP_FL(); + + //pull up addr[7:0] bus + ADDR_ENABLE(); + ADDR_IP(); + ADDR_PU(); + + //pull up data bus + DATA_ENABLE(); + DATA_IP_PU(); + //LED LAST displaying complete.. //planning to have LED DIM at power on to signify kazzo is in default //mostly all pins pulled up state. @@ -163,7 +174,7 @@ void nes_init() //latch address of $00:0000 //disable cart memories //reset high disables SRAM and puts INL carts in PRGM mode -//Excersize extreme caution calling this while NES/FC cart inserted +//Excersize caution calling this while NES/FC cart inserted on old kazzo versions //probably won't work if FC inserted due to EXP0-EXP6 short due to audio jumper on cart void snes_init() { @@ -202,6 +213,133 @@ void snes_init() } +//GAMEBOY cartridge interfacing setup +//set outputs as required +//latch address of $0000 +//disable cart memories +void gameboy_init() +{ + //start with a reset + //expecting user to do this but just to be sure + io_reset(); + + //enable control outputs and disable memories + //ROM + ROMSEL_OP(); + ROMSEL_HI(); + CSRD_OP(); + CSRD_HI(); + CSWR_OP(); + CSWR_HI(); + + //Set #RESET pin low + EXP0_LO(); + EXP0_OP(); + //if SWIM is active, EXP0 must be set to pullup prior to SWIM transfers + + //other control pins are inputs or unused, leave as IP pullup from reset + + //memories are now disabled Data bus should be clear + DATA_ENABLE(); + DATA_IP_PU(); + + //now meet conditions to call other macros + //setup address $0000 + ADDR_ENABLE(); + ADDR_SET(0x0000); + +#ifndef C16nodef + //set GB/GBA power to 5v + GBP_OP(); + GBP_5V(); +#endif + +} + + +//GBA cartridge interfacing setup +//set outputs as required +//latch address of $0000 +//disable cart memories +void gba_init() +{ + //start with a reset + //expecting user to do this but just to be sure + //this also sets power to 3v + io_reset(); + + //enable control outputs and disable memories + //ROM + ROMSEL_OP(); + ROMSEL_HI(); + CSRD_OP(); + CSRD_HI(); + CSWR_OP(); + CSWR_HI(); + + //Set #RESET pin low + EXP0_LO(); + EXP0_OP(); + //if SWIM is active, EXP0 must be set to pullup prior to SWIM transfers + + //other control pins are inputs or unused, leave as IP pullup from reset + + //memories are now disabled Data bus should be clear + DATA_ENABLE(); + DATA_IP_PU(); + + //now meet conditions to call other macros + //setup address $0000 + ADDR_ENABLE(); + ADDR_SET(0x0000); + +} + + +//SEGA Genesis/MegaDrive cartridge interfacing setup +//set outputs as required +//latch address of $00:0000 +//disable cart memories +void sega_init() +{ + //start with a reset + //expecting user to do this but just to be sure + io_reset(); + + //enable control outputs and disable memories + //ROM + ROMSEL_OP(); + ROMSEL_HI(); // #C_CE + CSRD_OP(); + CSRD_HI(); // #C_OE + CSWR_OP(); + CSWR_HI(); // #UDSW + PRGRW_OP(); + PRGRW_HI(); // #LDSW + + //disable SRAM and put cart in PLAY mode + EXP0_HI(); + EXP0_OP(); + //if SWIM is active, EXP0 must be set to pullup prior to SWIM transfers + + //other control pins are inputs or unused, leave as IP pullup from reset + + //memories are now disabled Data bus should be clear + DATA_ENABLE(); + DATA_IP_PU(); + + //now meet conditions to call other macros + //setup address $0000 + ADDR_ENABLE(); + ADDR_SET(0x0000); + + //setup HIGH ADDR with bank $00 + HADDR_ENABLE(); + HADDR_SET(0x00); + +} + + //Initialization of SWIM "single wire interface module" communications //the SWIM pin depends on INL board design. //dict call must provide the "swim_lane" diff --git a/firmware/source/io.h b/firmware/source/io.h index fb5d48d..fb91b58 100644 --- a/firmware/source/io.h +++ b/firmware/source/io.h @@ -12,6 +12,9 @@ uint8_t io_call( uint8_t opcode, uint8_t miscdata, uint16_t operand, uint8_t *rd void io_reset(); void nes_init(); void snes_init(); +void gameboy_init(); +void gba_init(); +void sega_init(); uint8_t swim_init(uint8_t opcode); uint8_t jtag_init(uint8_t opcode); uint8_t exp0_pullup_test(); diff --git a/firmware/source/nes.c b/firmware/source/nes.c index 9e99ed8..5de010a 100644 --- a/firmware/source/nes.c +++ b/firmware/source/nes.c @@ -9,6 +9,12 @@ // //================================================================================================= + +//global variables +uint8_t cur_bank; //used by some flash algos, must be initialized prior to depending on it +uint16_t bank_table; //address offset of bank table for mapper writes with bus conflicts + + /* Desc:Function takes an opcode which was transmitted via USB * then decodes it to call designated function. * shared_dict_nes.h is used in both host and fw to ensure opcodes/names align @@ -50,6 +56,31 @@ uint8_t nes_call( uint8_t opcode, uint8_t miscdata, uint16_t operand, uint8_t *r case NES_MMC1_WR: mmc1_wr( operand, miscdata, 0 ); break; + case SET_CUR_BANK: + cur_bank = operand; + break; + case SET_BANK_TABLE: + bank_table = operand; + break; + case NROM_PRG_FLASH_WR: + nrom_prgrom_flash_wr( operand, miscdata ); + break; + case NROM_CHR_FLASH_WR: + nrom_chrrom_flash_wr( operand, miscdata ); + break; + case CNROM_CHR_FLASH_WR: + cnrom_chrrom_flash_wr( operand, miscdata ); + break; + case MMC3_PRG_FLASH_WR: + mmc3_prgrom_flash_wr( operand, miscdata ); + break; + case MMC3_CHR_FLASH_WR: + mmc3_chrrom_flash_wr( operand, miscdata ); + break; + case CDREAM_CHR_FLASH_WR: + cdream_chrrom_flash_wr( operand, miscdata ); + break; + //8bit return values: case EMULATE_NES_CPU_RD: @@ -68,9 +99,18 @@ uint8_t nes_call( uint8_t opcode, uint8_t miscdata, uint16_t operand, uint8_t *r rdata[RD_LEN] = BYTE_LEN; rdata[RD0] = nes_dualport_rd( operand ); break; - case CIRAM_A10_MIRROR: + // case CIRAM_A10_MIRROR: + // rdata[RD_LEN] = BYTE_LEN; + // rdata[RD0] = ciram_a10_mirroring( ); + // break; + case GET_CUR_BANK: rdata[RD_LEN] = BYTE_LEN; - rdata[RD0] = ciram_a10_mirroring( ); + rdata[RD0] = cur_bank; + break; + case GET_BANK_TABLE: + rdata[RD_LEN] = HWORD_LEN; + rdata[RD0] = bank_table; + rdata[RD1] = bank_table>>8; break; default: //macro doesn't exist @@ -569,36 +609,37 @@ void nes_dualport_wr( uint16_t addr, uint8_t data ) * errors not really possible since all combinations * of CIRAM A10 level designate something valid */ -uint8_t ciram_a10_mirroring( void ) -{ - uint16_t readV, readH; +//uint8_t ciram_a10_mirroring( void ) +//{ +// uint16_t readV, readH; +// +// //set A11, clear A10 +// //ADDRH(A11_BYTE); setting A11 in this manner doesn't work for some reason.. +// ADDR_SET(0x0800); +// //CIA10_RD(readH); +// readH = (C11bank->IDR & (1<IDR & (1< 1 screen A +// if ((readV==0) && (readH==0)) return MIR_1SCNA; +// //if CIRAM A10 was always high -> 1 screen B +// if ((readV!=0) && (readH!=0)) return MIR_1SCNB; +// //if CIRAM A10 toggled with A10 -> Vertical mirroring, horizontal arrangement +// if ((readV!=0) && (readH==0)) return MIR_VERT; +// //if CIRAM A10 toggled with A11 -> Horizontal mirroring, vertical arrangement +// if ((readV==0) && (readH!=0)) return MIR_HORZ; +// +// //shouldn't be here... +// return GEN_FAIL; +//} - //set A11, clear A10 - //ADDRH(A11_BYTE); setting A11 in this manner doesn't work for some reason.. - ADDR_SET(0x0800); - //CIA10_RD(readH); - readH = (C11bank->IDR & (1<IDR & (1< 1 screen A - if ((readV==0) && (readH==0)) return MIR_1SCNA; - //if CIRAM A10 was always high -> 1 screen B - if ((readV!=0) && (readH!=0)) return MIR_1SCNB; - //if CIRAM A10 toggled with A10 -> Vertical mirroring, horizontal arrangement - if ((readV!=0) && (readH==0)) return MIR_VERT; - //if CIRAM A10 toggled with A11 -> Horizontal mirroring, vertical arrangement - if ((readV==0) && (readH!=0)) return MIR_HORZ; - - //shouldn't be here... - return GEN_FAIL; -} /* Desc:NES CPU Page Read with optional USB polling * decode A15 from addrH to set /ROMSEL as expected @@ -801,3 +842,198 @@ void mmc1_wr( uint16_t addr, uint8_t data, uint8_t reset ) return; } + +/* Desc:NES NROM PRG-ROM FLASH Write + * Also used for discrete mappers with 32KB banking (CNROM, BxROM, etc) + * Pre: nes_init() setup of io pins + * Post:Byte written and ready for another write + * Rtn: None + */ +void nrom_prgrom_flash_wr( uint16_t addr, uint8_t data ) +{ + + uint8_t rv; + + //unlock and write data + discrete_exp0_prgrom_wr(0x5555, 0xAA); + discrete_exp0_prgrom_wr(0x2AAA, 0x55); + discrete_exp0_prgrom_wr(0x5555, 0xA0); + discrete_exp0_prgrom_wr(addr, data); + + do { + rv = nes_cpu_rd(addr); + usbPoll(); //orignal kazzo needs this frequently to slurp up incoming data + } while (rv != nes_cpu_rd(addr)); + //TODO handle timeout + + return; +} + + +/* Desc:NES NROM CHR-ROM FLASH Write + * Pre: nes_init() setup of io pins + * Post:Byte written and ready for another write + * Rtn: None + */ +void nrom_chrrom_flash_wr( uint16_t addr, uint8_t data ) +{ + + uint8_t rv; + + //unlock and write data + nes_ppu_wr(0x1555, 0xAA); + nes_ppu_wr(0x0AAA, 0x55); + nes_ppu_wr(0x1555, 0xA0); + nes_ppu_wr(addr, data); + + do { + rv = nes_ppu_rd(addr); + usbPoll(); //orignal kazzo needs this frequently to slurp up incoming data + } while (rv != nes_ppu_rd(addr)); + //TODO handle timeout + + return; +} + + +/* Desc:NES CNROM CHR-ROM FLASH Write + * Pre: nes_init() setup of io pins + * cur_bank global var must be set to desired mapper register value + * bank_table global var must be set to base address of the bank table + * Post:Byte written and ready for another write + * Rtn: None + */ +void cnrom_chrrom_flash_wr( uint16_t addr, uint8_t data ) +{ + + uint8_t rv; + + //unlock the flash + nes_cpu_wr(bank_table+2, 0x02); + nes_ppu_wr(0x1555, 0xAA); + + nes_cpu_wr(bank_table+1, 0x01); + nes_ppu_wr(0x0AAA, 0x55); + + nes_cpu_wr(bank_table+2, 0x02); + nes_ppu_wr(0x1555, 0xA0); + + //select desired bank for the write + nes_cpu_wr(bank_table+cur_bank, cur_bank); + //write the byte + nes_ppu_wr(addr, data); + + do { + rv = nes_ppu_rd(addr); + usbPoll(); //orignal kazzo needs this frequently to slurp up incoming data + } while (rv != nes_ppu_rd(addr)); + //TODO handle timeout + + return; +} + + + +/* Desc:NES MMC3 PRG-ROM FLASH Write + * Pre: nes_init() setup of io pins + * MMC3 must be properly inialized for flashing + * addr must be between $8000-9FFF as prescribed by init + * Post:Byte written and ready for another write + * Rtn: None + */ +void mmc3_prgrom_flash_wr( uint16_t addr, uint8_t data ) +{ + + uint8_t rv; + + //unlock and write data + nes_cpu_wr(0xD555, 0xAA); + nes_cpu_wr(0xAAAA, 0x55); + nes_cpu_wr(0xD555, 0xA0); + nes_cpu_wr(addr, data); + + //reset $8000 bank select register to a CHR reg + nes_cpu_wr(0x8000, 0x00); + + do { + rv = nes_cpu_rd(addr); + usbPoll(); //orignal kazzo needs this frequently to slurp up incoming data + } while (rv != nes_cpu_rd(addr)); + //TODO handle timeout + + return; +} + + +/* Desc:NES MMC3 CHR-ROM FLASH Write + * Pre: nes_init() setup of io pins + * MMC3 must be properly inialized for flashing + * addr must be between $0000-0FFF as prescribed by init + * Post:Byte written and ready for another write + * Rtn: None + */ +void mmc3_chrrom_flash_wr( uint16_t addr, uint8_t data ) +{ + + uint8_t rv; + + //unlock and write data + nes_ppu_wr(0x1555, 0xAA); + nes_ppu_wr(0x1AAA, 0x55); + nes_ppu_wr(0x1555, 0xA0); + nes_ppu_wr(addr, data); + + do { + rv = nes_ppu_rd(addr); + usbPoll(); //orignal kazzo needs this frequently to slurp up incoming data + } while (rv != nes_ppu_rd(addr)); + //TODO handle timeout + + return; +} + + +/* Desc:NES ColorDreams CHR-ROM FLASH Write + * Pre: nes_init() setup of io pins + * cur_bank global var must be set to desired mapper register value + * bank_table global var must be set to base address of the bank table + * The first PRG-ROM bank must be selected and bank table present + * Post:Byte written and ready for another write + * Rtn: None + */ +void cdream_chrrom_flash_wr( uint16_t addr, uint8_t data ) +{ + + uint8_t rv; + + //the CHR-ROM bank is in mapper register bits 4-7 + uint8_t mapper_val = cur_bank << 4; + + //unlock the flash + nes_cpu_wr(bank_table+0x20, 0x20); + nes_ppu_wr(0x1555, 0xAA); + + nes_cpu_wr(bank_table+0x10, 0x10); + nes_ppu_wr(0x0AAA, 0x55); + + nes_cpu_wr(bank_table+0x20, 0x20); + nes_ppu_wr(0x1555, 0xA0); + + //select desired bank for the write + nes_cpu_wr(bank_table+mapper_val, mapper_val); + //write the byte + nes_ppu_wr(addr, data); + + do { + rv = nes_ppu_rd(addr); + usbPoll(); //orignal kazzo needs this frequently to slurp up incoming data + } while (rv != nes_ppu_rd(addr)); + //TODO handle timeout + + return; +} + + + + + diff --git a/firmware/source/nes.h b/firmware/source/nes.h index 6ffc666..d0ceaff 100644 --- a/firmware/source/nes.h +++ b/firmware/source/nes.h @@ -18,12 +18,22 @@ uint8_t nes_ppu_rd( uint16_t addr ); void nes_ppu_wr( uint16_t addr, uint8_t data ); uint8_t nes_dualport_rd( uint16_t addr ); void nes_dualport_wr( uint16_t addr, uint8_t data ); -uint8_t ciram_a10_mirroring( void ); +//uint8_t ciram_a10_mirroring( void ); uint8_t nes_cpu_page_rd_poll( uint8_t *data, uint8_t addrH, uint8_t first, uint8_t last, uint8_t poll ); uint8_t nes_ppu_page_rd_poll( uint8_t *data, uint8_t addrH, uint8_t first, uint8_t last, uint8_t poll ); uint8_t nes_dualport_page_rd_poll( uint8_t *data, uint8_t addrH, uint8_t first, uint8_t len, uint8_t poll ); + void mmc1_wr( uint16_t addr, uint8_t data, uint8_t reset ); +void nrom_prgrom_flash_wr( uint16_t addr, uint8_t data ); +void nrom_chrrom_flash_wr( uint16_t addr, uint8_t data ); +void cnrom_chrrom_flash_wr( uint16_t addr, uint8_t data ); +void mmc3_prgrom_flash_wr( uint16_t addr, uint8_t data ); +void mmc3_chrrom_flash_wr( uint16_t addr, uint8_t data ); +void cdream_chrrom_flash_wr( uint16_t addr, uint8_t data ); + + + #define A10_BYTE 0x04 #define A11_BYTE 0x08 #define PPU_A13N_WORD 0x8000 diff --git a/firmware/source/pinport.h b/firmware/source/pinport.h index 75abedc..b29b81b 100644 --- a/firmware/source/pinport.h +++ b/firmware/source/pinport.h @@ -148,7 +148,17 @@ uint8_t pinport_call( uint8_t opcode, uint8_t miscdata, uint16_t operand, uint8_ // PC15 "AUDR" -// PC16 "CIN" +// PC16 "GBP" +#ifndef C16nodef +#define GBP_IP_PU() CTL_IP_PU(GBPbank, GBP) +#define GBP_IP_FL() CTL_IP_FL(GBPbank, GBP) +#define GBP_OP() CTL_OP(GBPbank, GBP) +#define GBP_LO() CTL_SET_LO(GBPbank, GBP) +#define GBP_HI() CTL_SET_HI(GBPbank, GBP) +#define GBP_3V() GBP_HI() +#define GBP_5V() GBP_LO() +#define GBP_RD(val) CTL_RD(GBPbank, GBP, val) +#endif // PC17 "SWD" diff --git a/firmware/source/pinport_al.h b/firmware/source/pinport_al.h index 33b4eb9..319dcba 100644 --- a/firmware/source/pinport_al.h +++ b/firmware/source/pinport_al.h @@ -6,6 +6,7 @@ //#define STM_ADAPTER //#define STM_INL6_PROTO //#define STM_INL6 +//#define STM_NES #ifdef AVR_CORE #include "avr_gpio.h" @@ -296,6 +297,11 @@ void software_AXL_CLK(); // // // +// STM32F070C6T6 "INL RETRO NES" V2.0N NESmaker edition +// Comparable to INL6, but only has NES connector +// uses Flipflop for io expansion for A8-15 similar to original kazzos +// this device is setup very similarly to STM_ADAPTER +// AHL/AHLOE, AXL, EXP port, and CIC port are main differences // @@ -595,6 +601,109 @@ void software_AXL_CLK(); #endif //STM_INL6 & PROTO + +#ifdef STM_NES + + // PC0 "M2" mcupinA3 + #define C0bank GPIOA + #define C0 (3U) + + // PC1 "ROMSEL" mcupinA4 + #define C1bank GPIOA + #define C1 (4U) + + // PC2 "PRGRW" mcupinA5 + #define C2bank GPIOA + #define C2 (5U) + + // PC3 "FREE" mcupinA6 + #define C3bank GPIOA + #define C3 (6U) + + // PC4 "CSRD" mcupinA7 + #define C4bank GPIOA + #define C4 (7U) + + // PC5 "CSWR" mcupinB0 + #define C5bank GPIOB + #define C5 (0U) + + // PC6 "CICE" mcupinA10 + #define C6bank GPIOA + #define C6 (10U) + + // PC7 "AHL" mcupinB1 + // THIS IS FLIPFLOP /OE pin as well! + #define C7bank GPIOB + #define C7 (1U) + + // PC8 "EXP0" mcupinA0 + #define C8bank GPIOA + #define C8 (0U) + + // PC9 "LED" mcupinC13 + #define C9bank GPIOC + #define C9 (13U) + + // PC10 "IRQ" mcupinA15 + #define C10bank GPIOA + #define C10 (15U) + + // PC11 "CIA10" mcupinA13 + #define C11bank GPIOA + #define C11 (13U) + + // PC12 "BL" + // Not defined + #define C12nodef + + // PC13 "AXL" + // Not present on STM_NES + #define C13nodef + + // PC14 "AUDL" + // Not defined + #define C14nodef + + // PC15 "AUDR" + // Not defined + #define C15nodef + + // PC16 "GBP" + // Not defined + #define C16nodef + + // PC17 "SWD" mcupinA13 + // Not defined due to shared with CIRAM A10 + #define C17nodef + + // PC18 "SWC" mcupinA14 + #define C18bank GPIOA + #define C18 (14U) + + // PC19 "AFL" + // Not defined + #define C19nodef + + // PC20 "COUT" + // Not defined + #define C20nodef + + // PC21 "FCAPU" double mapping of EXP0 + #define C21bank C8bank + #define C21 C8 + + +#define RCC_AHBENR_CTL (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN) +#define RCC_AHBENR_ADDR (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN) +#define RCC_AHBENR_DATA RCC_AHBENR_GPIOBEN + +#endif //STM_NES + + +//TODO combine STM_NES & STM_ADAPTER, they're predominantly the same +//AHL-AHLOE, AXL, EXP port, and CIC port are only differences + #ifdef STM_ADAPTER // PC0 "M2" mcupinA3 @@ -1030,7 +1139,7 @@ void software_AXL_CLK(); #endif //STM_INL6_PROTO -#ifdef STM_ADAPTER +#if defined(STM_ADAPTER) || defined(STM_NES) //All 8bits are on GPIOB in order, but mapped to bits15-8 #define Dbank GPIOB @@ -1047,7 +1156,7 @@ void software_AXL_CLK(); #define DATA_EN_CLK() RCC->AHBENR |= RCC_AHBENR_DATA #define DATA_ENABLE() DATA_EN_CLK(); DATA_IP_PU() -#endif //STM_ADAPTER +#endif //STM_ADAPTER or STM_NES #ifdef AVR_KAZZO @@ -1065,6 +1174,7 @@ void software_AXL_CLK(); #endif //AVR_KAZZO + // --------------------------------------------------------------------------------------- // ADDRESS PORT 16bit // @@ -1098,7 +1208,7 @@ void software_AXL_CLK(); #endif //STM_INL6 & PROTO -#ifdef STM_ADAPTER +#if defined(STM_ADAPTER) || defined(STM_NES) // A15-8 are behind AHL flipflop // A7-6 are on GPIO A9-8 @@ -1119,7 +1229,7 @@ void software_AXL_CLK(); #define ADDR_EN_FF() CTL_OP(AHLbank, AHL); CTL_SET_LO(AHLbank, AHL) #define ADDR_ENABLE() DATA_ENABLE(); ADDR_EN_CLK(); ADDR_EN_FF(); ADDR_OP() -#endif //STM_ADAPTER +#endif //STM_ADAPTER or STM_NES #ifdef AVR_KAZZO @@ -1164,7 +1274,7 @@ void software_AXL_CLK(); // // --------------------------------------------------------------------------------------- -#if defined (STM_INL6_PROTO) || defined(STM_INL6) +#ifdef STM_INL6_PROTO //pins1-5 = GPIOB10-14 (D8-12), pin6 = GPIOA4 (AUDL), pin7 = GPIOB15 (D13), pin8 = GPIOA14 (SWCLK) //these defines are quite the mess currently due to pins all over the place @@ -1184,8 +1294,39 @@ void software_AXL_CLK(); #define EXP_ENABLE() ADDR_EN_CLK(); EXP_OP() #define EXP_DISABLE() EXP_PU(); EXP_IP() -//end STM_INL6 & PROTO -#else //AVR_KAZZO or STM_ADAPTER +#endif //STM_INL6_PROTO + +#ifdef STM_INL6 + + //pins1-5 = GPIOB2-6 (D8-12), pin6 = GPIOA4 (AUDL), pin7 = GPIOB7 (D13), pin8 = GPIOA14 (SWCLK) + //these defines are quite the mess currently due to pins all over the place + //there is no real benefit to defining this port as byte wide but defining them this way 'degrades' + //them to the same quality as AVR making all devices mostly compatible. + //These can be redefined as CONTROL PORT for simpler pin granuarity access + #define E157bank GPIOB + #define E68bank GPIOA + + //TODO this is not complete!!! it's still a copy paste from the prototype + #define EXP_PU() E157bank->PUPDR |= (PUPDR_PU_ALL & 0xFFF00000); E68bank->PUPDR |= (PUPDR_PU_ALL & 0x30000300) + #define EXP_IP() E157bank->MODER &=~(MODER_OP_ALL & 0xFFF00000); E68bank->MODER &=~(MODER_OP_ALL & 0x30000300) + #define EXP_OP() E157bank->MODER |= (MODER_OP_ALL & 0xFFF00000); E68bank->MODER |= (MODER_OP_ALL & 0x30000300) + //not sure these bit shift accesses will work if the value passed in is a uint8_t variable... + #define EXP_SET(val) E157bank->ODR = ((E157bank->ODR & 0x03FF) | (val<<10 & 0x7C00) | (val<<9 & 0x8000)); E68bank->ODR = ((E68bank->ODR & 0xBFEF) | (val>>1 & 0x0010) | (val<<7 & 0x4000)) + + #define EXP_EN_CLK() RCC->AHBENR |= RCC_AHBENR_EXP + #define EXP_ENABLE() ADDR_EN_CLK(); EXP_OP() + #define EXP_DISABLE() EXP_PU(); EXP_IP() + +#endif //STM_INL6 + + +#ifdef STM_NES + //TODO + +#endif //STM_NES + + +#if defined(STM_ADAPTER) || defined(AVR_KAZZO) // EXP1-8 are behind AXL flipflop @@ -1206,6 +1347,41 @@ void software_AXL_CLK(); #endif //AVR_KAZZO or STM_ADAPTER +// --------------------------------------------------------------------------------------- +// DATA PORT 16bit +// +// This port is only present on later devices typically with Sega connectors +// Even though early devices have DATA0-7 + EXP1-8, the EXP port is unidirectional +// Directionality: All pins are bidirectional controlled as a whole +// Driver: All pins are push-pull, and unknown floating/pull-up when input +// main reason to be unknown is AVR uses PORT for pull-up enable +// don't want to require re-enabling pullups for every data access +// STM32 are default to pull-up, AVR requires manually pulling up +// by calling DATA16_IP_PU() if pullups required, otherwise unknown +// Write/Output: Byte access only, no bit accesses. Must be returned to input after read! +// Read/Input: Default condition, byte access only +// +// --------------------------------------------------------------------------------------- +// +#ifdef STM_INL6 + + //Combine 8bit DATA0-7 and 8bit EXP1-8 + + //IP and OP assume MODER[1] is clear (ie not set to Alt Func) + //also assume PUPDR is reset default floating +// #define DATA16_IP_PU() DATA_IP_PU(); = ~(MODER_OP_ALL & 0xFFFF0000); Dbank->PUPDR |= (PUPDR_PU_ALL & 0xFFFF0000) +// #define DATA_IP() Dbank->MODER &= ~(MODER_OP_ALL & 0xFFFF0000) +// #define DATA_OP() Dbank->MODER |= (MODER_OP_ALL & 0xFFFF0000) +// #define DATA_SET(data) Dbank->ODR = (Dbank->ODR & 0x00FF) | (data<<8) +// #define DATA_RD(data) data = (Dbank->IDR>>8) & 0x00FF +// +// #define DATA_EN_CLK() RCC->AHBENR |= RCC_AHBENR_DATA +// #define DATA_ENABLE() DATA_EN_CLK(); DATA_IP_PU(); + + +#endif //STM_INL6 + + // --------------------------------------------------------------------------------------- // HIGH ADDRESS PORT 8bits A16-23 // @@ -1260,6 +1436,10 @@ void software_AXL_CLK(); #define HADDR_DISABLE() HADDR_PU(); HADDR_IP() //end STM_INL6 & PROTO + +//TODO STM_NES + + #else //AVR_KAZZO or STM_ADAPTER @@ -1326,6 +1506,7 @@ void software_AXL_CLK(); #endif //STM_INL6 & PROTO +//TODO STM_NES #ifdef STM_ADAPTER diff --git a/firmware/source/snes.c b/firmware/source/snes.c index 7276d19..1ba205d 100644 --- a/firmware/source/snes.c +++ b/firmware/source/snes.c @@ -35,6 +35,12 @@ uint8_t snes_call( uint8_t opcode, uint8_t miscdata, uint16_t operand, uint8_t * case SNES_ROM_WR: snes_rom_wr( operand, miscdata ); break; + case FLASH_WR_5V: + snes_5v_flash_wr( operand, miscdata ); + break; + case FLASH_WR_3V: + snes_3v_flash_wr( operand, miscdata ); + break; //8bit return values: case SNES_ROM_RD: @@ -53,6 +59,7 @@ uint8_t snes_call( uint8_t opcode, uint8_t miscdata, uint16_t operand, uint8_t * /* Desc:SNES ROM Read without changing high bank * /ROMSEL always set low * EXP0/RESET not affected + * NOTE: this will access addresses when /ROMSEL isn't low on the console * Pre: snes_init() setup of io pins * Post:address left on bus * data bus left clear @@ -106,6 +113,7 @@ uint8_t snes_rom_rd( uint16_t addr ) * /ROMSEL always set low * EXP0/RESET unaffected * write value to currently selected bank + * NOTE: this will access addresses when /ROMSEL isn't low on the console * Pre: snes_init() setup of io pins * Post:data latched by anything listening on the bus * address left on bus @@ -227,6 +235,14 @@ uint8_t snes_rom_page_rd_poll( uint8_t *data, uint8_t addrH, uint8_t first, uint NOP(); NOP(); } + + //gameboy needed some extra NOPS + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); //latch data DATA_RD(data[i]); @@ -245,3 +261,59 @@ uint8_t snes_rom_page_rd_poll( uint8_t *data, uint8_t addrH, uint8_t first, uint } +/* Desc:SNES 5v ROM FLASH Write + * NOTE: /ROMSEL is always taken low + * NOTE: if the byte isn't erased it will stop over current value + * NOTE: doesn't hang if write fails, just returns, goal is to be fast + * Pre: snes_init() setup of io pins + * desired bank must already be selected + * Post:Byte written and ready for another write + * Rtn: None + */ +void snes_5v_flash_wr( uint16_t addr, uint8_t data ) +{ + + uint8_t rv; + + //unlock and write data + snes_rom_wr(0x5555, 0xAA); + snes_rom_wr(0x2AAA, 0x55); + snes_rom_wr(0x5555, 0xA0); + snes_rom_wr(addr, data); + + do { + rv = snes_rom_rd(addr); + usbPoll(); //orignal kazzo needs this frequently to slurp up incoming data + } while (rv != snes_rom_rd(addr)); + + return; +} + +/* Desc:SNES 3v ROM FLASH Write + * NOTE: /ROMSEL is always taken low + * NOTE: if the byte isn't erased it will stop over current value + * NOTE: doesn't hang if write fails, just returns, goal is to be fast + * Pre: snes_init() setup of io pins + * desired bank must already be selected + * Post:Byte written and ready for another write + * Rtn: None + */ +void snes_3v_flash_wr( uint16_t addr, uint8_t data ) +{ + + uint8_t rv; + + //unlock and write data + snes_rom_wr(0x8AAA, 0xAA); + snes_rom_wr(0x8555, 0x55); + snes_rom_wr(0x8AAA, 0xA0); + snes_rom_wr(addr, data); + + do { + rv = snes_rom_rd(addr); + usbPoll(); //orignal kazzo needs this frequently to slurp up incoming data + } while (rv != snes_rom_rd(addr)); + + return; +} + diff --git a/firmware/source/snes.h b/firmware/source/snes.h index 91f6476..f8f5472 100644 --- a/firmware/source/snes.h +++ b/firmware/source/snes.h @@ -12,5 +12,7 @@ void snes_rom_wr( uint16_t addr, uint8_t data ); void snes_rom_wr_cur_addr( uint8_t data ); uint8_t snes_rom_page_rd_poll( uint8_t *data, uint8_t addrH, uint8_t first, uint8_t len, uint8_t poll ); +void snes_5v_flash_wr( uint16_t addr, uint8_t data ); +void snes_3v_flash_wr( uint16_t addr, uint8_t data ); #endif diff --git a/firmware/source/types.h b/firmware/source/types.h index 0e2e009..a6aab91 100644 --- a/firmware/source/types.h +++ b/firmware/source/types.h @@ -41,23 +41,27 @@ typedef struct buffer { uint8_t reload; //add this number to page_num for next loading - - uint8_t mem_type; //SNES ROM, SNES RAM, PRG ROM, PRG RAM, CHR ROM, CHR RAM, CPLD, SPI uint8_t part_num; //used to define unlock commands, sector erase, etc + //currently unused uint8_t multiple; //number of times to program this page + //currently unused uint8_t add_mult; //add this number to page_num for multiple programs //CHR shift LSb to A13 (max 2MByte) //PRG shift LSb to A14 (max 4MByte) //SNES add to MSB of page_num (max 16MByte) uint8_t mapper; //mapper number of board + //some mem_types like NESCPU_4KB use this to specify address range + //because they're mapper independent + //currently unused uint8_t mapvar; //mapper variant + //currently unused uint8_t function; //function "pointer" for flash/dump operation control }buffer; diff --git a/host/scripts/app/ciccom.lua b/host/scripts/app/ciccom.lua index 73a3abd..2d8491e 100644 --- a/host/scripts/app/ciccom.lua +++ b/host/scripts/app/ciccom.lua @@ -179,6 +179,11 @@ local function write(data) end +local clock = os.clock +local function sleep(n) -- seconds + local t0 = clock() + while clock() - t0 <= n do end +end -- global variables so other modules can use them @@ -192,6 +197,7 @@ ciccom.set_opcode = set_opcode ciccom.write = write ciccom.wotf = wotf ciccom.rotf = rotf +ciccom.sleep = sleep -- return the module's table return ciccom diff --git a/host/scripts/app/dump.lua b/host/scripts/app/dump.lua index 8996a74..0bda6a1 100644 --- a/host/scripts/app/dump.lua +++ b/host/scripts/app/dump.lua @@ -27,7 +27,7 @@ local function dumptofile( file, sizeKB, map, mem, debug ) --2x 128Byte buffers local num_buffers = 2 local buff_size = 128 - print("allocating buffers") + if debug then print("allocating buffers") end assert(buffers.allocate( num_buffers, buff_size ), "fail to allocate buffers") --set buffer elements as needed @@ -35,15 +35,24 @@ local function dumptofile( file, sizeKB, map, mem, debug ) --set reload to 256 = 1 when translated to page_num (done in allocate buffers funct) --set page_num to non-zero if offset arg sent --set mem_type and part_num to designate how to get/write data - print("setting map n part") + if debug then print("setting map n part") end dict.buffer("SET_MEM_N_PART", (op_buffer[mem]<<8 | op_buffer["MASKROM"]), buff0 ) dict.buffer("SET_MEM_N_PART", (op_buffer[mem]<<8 | op_buffer["MASKROM"]), buff1 ) --set multiple and add_mult only when flashing --set mapper, map_var, and function to designate read/write algo - print("setting map n mapvar") - dict.buffer("SET_MAP_N_MAPVAR", (op_buffer[map]<<8 | op_buffer["NOVAR"]), buff0 ) - dict.buffer("SET_MAP_N_MAPVAR", (op_buffer[map]<<8 | op_buffer["NOVAR"]), buff1 ) + if debug then print("setting map n mapvar") end + --need to handle raw data, or defines being used for mapper + --op_buffer[map] will be nil for raw values + local mapper = op_buffer[map] + if not mapper then + if debug then print("mapper isn't defined, evaluated as raw number") end + mapper = map + end + --dict.buffer("SET_MAP_N_MAPVAR", (op_buffer[map]<<8 | op_buffer["NOVAR"]), buff0 ) + --dict.buffer("SET_MAP_N_MAPVAR", (op_buffer[map]<<8 | op_buffer["NOVAR"]), buff1 ) + dict.buffer("SET_MAP_N_MAPVAR", (mapper<<8 | op_buffer["NOVAR"]), buff0 ) + dict.buffer("SET_MAP_N_MAPVAR", (mapper<<8 | op_buffer["NOVAR"]), buff1 ) --tell buffers what function to use for dumping --TODO when start implementing other mappers @@ -62,7 +71,7 @@ local function dumptofile( file, sizeKB, map, mem, debug ) --dict.buffer("GET_PAGE_NUM", nil, buff0 ) --dict.buffer("GET_PAGE_NUM", nil, buff1 ) - print("\n\nsetting operation STARTDUMP"); + if debug then print("\n\nsetting operation STARTDUMP") end --inform buffer manager to start dumping operation now that buffers are initialized dict.operation("SET_OPERATION", op_buffer["STARTDUMP"] ) @@ -74,7 +83,7 @@ local function dumptofile( file, sizeKB, map, mem, debug ) local tstart = os.clock(); local tlast = tstart - print("starting first payload"); + if debug then print("starting first payload") end --now just need to call series of payload IN transfers to retrieve data for i=1, (sizeKB*1024/buff_size) do --dump next buff --stm adapter had trouble dumping @@ -103,18 +112,18 @@ local function dumptofile( file, sizeKB, map, mem, debug ) --if ( (i % (1024*1024/buff_size/16)) == 0) then if ( (i % (4*2024*1024/buff_size/16)) == 0) then local tdelta = os.clock() - tlast - print("time delta:", tdelta, "seconds, speed:", (1024/16/tdelta), "KBps"); + if debug then print("time delta:", tdelta, "seconds, speed:", (1024/16/tdelta), "KBps") end --print("dumped part:", i/1024, "of 16 \n") - print("dumped part:", i/(4*1024), "of 4 \n") + if debug then print("dumped part:", i/(4*1024), "of 4 \n") end tlast = os.clock(); end end - print("DUMPING DONE") + if debug then print("DUMPING DONE") end tstop = os.clock() timediff = ( tstop-tstart) - print("total time:", timediff, "seconds, average speed:", (sizeKB/timediff), "KBps") + if debug then print("total time:", timediff, "seconds, average speed:", (sizeKB/timediff), "KBps") end --buffer manager updates from USB_UNLOADING -> DUMPING -> DUMPED --while one buffer is unloading, it sends next buffer off to dump diff --git a/host/scripts/app/flash.lua b/host/scripts/app/flash.lua index c642bf5..4f1d81d 100644 --- a/host/scripts/app/flash.lua +++ b/host/scripts/app/flash.lua @@ -29,11 +29,11 @@ local function write_file( file, sizeKB, map, mem, debug ) --2x 256Byte buffers local num_buffers = 2 local buff_size = 256 - print("allocating buffers") + if debug then print("allocating buffers") end assert(buffers.allocate( num_buffers, buff_size ), "fail to allocate buffers") --set mem_type and part_num to designate how to get/write data - print("setting map n part") + if debug then print("setting map n part") end dict.buffer("SET_MEM_N_PART", (op_buffer[mem]<<8 | op_buffer["MASKROM"]), buff0 ) dict.buffer("SET_MEM_N_PART", (op_buffer[mem]<<8 | op_buffer["MASKROM"]), buff1 ) --set multiple and add_mult only when flashing @@ -41,11 +41,11 @@ local function write_file( file, sizeKB, map, mem, debug ) --set mapper, map_var, and function to designate read/write algo --just dump visible NROM memory to start - print("setting map n mapvar") + if debug then print("setting map n mapvar") end dict.buffer("SET_MAP_N_MAPVAR", (op_buffer[map]<<8 | op_buffer["NOVAR"]), buff0 ) dict.buffer("SET_MAP_N_MAPVAR", (op_buffer[map]<<8 | op_buffer["NOVAR"]), buff1 ) - print("\n\nsetting operation STARTFLASH"); + if debug then print("\n\nsetting operation STARTFLASH"); end --inform buffer manager to start flashing operation now that buffers are initialized dict.operation("SET_OPERATION", op_buffer["STARTFLASH"] ) @@ -74,11 +74,11 @@ local function write_file( file, sizeKB, map, mem, debug ) -- tlast = os.clock(); -- end end - print("FLASHING DONE") - print("number of naks", nak) + if debug then print("FLASHING DONE") end + if debug then print("number of naks", nak) end tstop = os.clock() timediff = ( tstop-tstart) - print("total time:", timediff, "seconds, average speed:", (sizeKB/timediff), "KBps") + if debug then print("total time:", timediff, "seconds, average speed:", (sizeKB/timediff), "KBps") end -- wait till all buffers are done --while flashing buffer manager updates from USB_FULL -> FLASHING -> FLASHED diff --git a/host/scripts/inlretro.lua b/host/scripts/inlretro.lua index 90d703b..663ffcf 100644 --- a/host/scripts/inlretro.lua +++ b/host/scripts/inlretro.lua @@ -64,10 +64,12 @@ function main () -- ===================================================== --cart/mapper specific scripts --local curcart = require "scripts.nes.nrom" + --local curcart = require "scripts.nes.cnrom" --local curcart = require "scripts.nes.mmc1" + local curcart = require "scripts.nes.mmc3" --local curcart = require "scripts.nes.unrom" --local curcart = require "scripts.nes.mm2" - local curcart = require "scripts.nes.mapper30" + --local curcart = require "scripts.nes.mapper30" --local curcart = require "scripts.nes.bnrom" --local curcart = require "scripts.nes.cdream" --local curcart = require "scripts.nes.cninja" @@ -75,7 +77,9 @@ function main () --local curcart = require "scripts.nes.action53_tsop" --local curcart = require "scripts.nes.easyNSF" --local curcart = require "scripts.nes.dualport" - --local curcart = require "scripts.snes.v3" + --local curcart = require "scripts.snes.v3" --and GAMEBOY for now + --local curcart = require "scripts.snes.lorom_5volt" --catskull design + --local curcart = require "scripts.snes.v2proto" -- ===================================================== -- USERS: set cart_console to the to point to the mapper script you would like to use here. @@ -266,13 +270,13 @@ function main () --perform desired operation --CART and programmer should be in a RESET condition upon calling the specific script - --NROM - --curcart.process( true, true, true, true, true, "ignore/dump.bin", "ignore/ddug2.bin", "ignore/verifyout.bin") --DUALPORT --curcart.process( true, false, false, false, false, "ignore/dump.bin", "ignore/ddug2.bin", "ignore/verifyout.bin") --MMC1 --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/BB_sgrom.prg", "ignore/verifyout.bin") --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/Zelda2.bin", "ignore/verifyout.bin") + --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/Zelda2_doubleprg.bin", "ignore/verifyout.bin") + --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/alfonzoMMC1.bin", "ignore/verifyout.bin") --UxROM --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/AFB_128.prg", "ignore/verifyout.bin") @@ -281,6 +285,7 @@ function main () --curcart.process( true, false, false, false, false, "ignore/dump.bin", "ignore/rushnattack.prg", "ignore/verifyout.bin") --curcart.process( true, false, false, false, false, "ignore/dump.bin", "ignore/TDfix.prg", "ignore/verifyout.bin") + --MM2 --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/mm2_i0.prg", "ignore/verifyout.bin") --curcart.process( true, true, false, false, false, "ignore/dump.bin", "ignore/mm2_i0.prg", "ignore/verifyout.bin") @@ -289,19 +294,12 @@ function main () --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/BBC_nonJW.bin", "ignore/verifyout.bin") --curcart.process( true, false, false, false, false, "ignore/dump.bin", "ignore/MysticOrigins.prg", "ignore/verifyout.bin") --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/NESmaker.nes", "ignore/verifyout.bin") - curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/tb_map30.prg", "ignore/verifyout.bin") + --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/tb_map30.prg", "ignore/verifyout.bin") - --BNROM - --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/lizard_PG.prg", "ignore/verifyout.bin") - --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/PJB_PRGE.prg", "ignore/verifyout.bin") - --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/SHBWar.prg", "ignore/verifyout.bin") - --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/lizard_v2_fr.prg", "ignore/verifyout.bin") - --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/hh85.prg", "ignore/verifyout.bin") - --COLOR DREAMS - --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/multicart_mojontalesFINAL.prg", "ignore/verifyout.bin") --COLOR NINJA --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/ninja.bin", "ignore/verifyout.bin") + --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/alfonzo.bin", "ignore/verifyout.bin") --A53 PLCC --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/a53v1_SBR2.prg", "ignore/verifyout.bin") @@ -316,8 +314,39 @@ function main () --easy NSF tssop --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/2a03puritans_RE.prg", "ignore/verifyout.bin") --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/rndm2_1MB.prg", "ignore/verifyout.bin") + --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/pico2015_RELEASE_1MB.prg", "ignore/verifyout.bin") + + + --later scripts which don't require specific firmware functions + --goal is to convert scripts above to be more like the ones below now that + --have a better idea of what works best and minimizing firmware compilation and updates + + --NROM + --curcart.process( true, true, true, true, true, "ignore/dump.bin", "ignore/ddug2.bin", "ignore/verifyout.bin") + --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/NTB_RE.bin", "ignore/verifyout.bin") + --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/MM_demo.bin", "ignore/verifyout.bin") + --curcart.process( true, true, true, true, true, "ignore/dump.bin", "ignore/NnD.bin", "ignore/verifyout.bin", "V") + --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/DEMO.bin", "ignore/verifyout.bin") + --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/NES_hb_present.bin", "ignore/verifyout.bin") + + --CNROM + --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/galf.bin", "ignore/verifyout.bin") + + --MMC3 + --curcart.process( true, true, true, false, true, "ignore/dump.bin", "ignore/kirby.nes", "ignore/verifyout.bin") + --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/kirby.bin", "ignore/verifyout.bin", false, false, "ignore/ramdump.bin", "ignore/ramwrite.bin") + curcart.process( true, false, false, false, false, "ignore/dump.bin", "ignore/kirby.bin", "ignore/verifyout.bin", true, true, "ignore/ramdump.bin", "ignore/kirby3xSave.bin") + + --COLOR DREAMS + --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/multicart_mojontalesFINAL.prg", "ignore/verifyout.bin") + + --BNROM + --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/lizard_PG.prg", "ignore/verifyout.bin") + --curcart.process( true, true, true, true, true, "ignore/dump.bin", "ignore/lizard_v2.prg", "ignore/verifyout.bin") + --curcart.process( true, false, true, true, false, "ignore/dump.bin", "ignore/hh85.prg", "ignore/verifyout.bin") + --[[ --FLASHING: --erase cart @@ -354,11 +383,11 @@ function main () --SNES --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/MMXdump.bin", "ignore/verifyout.bin") - --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/smw.sfc", "ignore/verifyout.bin") + curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/smw.sfc", "ignore/verifyout.bin") --curcart.process( true, true, false, false, false, "ignore/dump.bin", "ignore/hsbm_4Mbit_Lo.sfc", "ignore/verifyout.bin") --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/hsbm_4Mbit_Lo.sfc", "ignore/verifyout.bin") --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/hsbm_4Mbit_Hi.sfc", "ignore/verifyout.bin") - curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/hsbm_32Mbit_Hi.sfc", "ignore/verifyout.bin") + --curcart.process( true, false, true, true, true, "ignore/dump.bin", "ignore/hsbm_32Mbit_Hi.sfc", "ignore/verifyout.bin") -- --old SNES code @@ -518,6 +547,28 @@ function main () elseif cart_console == "DMG" then + print("testing gameboy") + + --SNES should be similar + curcart.process( false, true, false, false, false, "ignore/dump.bin", "ignore/gameboy.bin", "ignore/verifyout.bin") + ---[[ --TEST GB power + rv = dict.pinport( "CTL_ENABLE", "GBP" ) + rv = dict.pinport( "CTL_OP", "GBP") + rv = dict.pinport( "CTL_SET_HI", "GBP") + print("GBP high 3v GBA") + jtag.sleep(1) + rv = dict.pinport( "CTL_SET_LO", "GBP") + print("GBP low 5v GB") + jtag.sleep(1) + rv = dict.pinport( "CTL_SET_HI", "GBP") + print("GBP high 3v GBA") + jtag.sleep(1) + rv = dict.pinport( "CTL_SET_LO", "GBP") + print("GBP low 5v GB") + --jtag.sleep(2) + --]] + + elseif cart_console == "GBA" then elseif cart_console == "SMS" then diff --git a/host/scripts/nes/bnrom.lua b/host/scripts/nes/bnrom.lua index 66e53f3..ae6e842 100644 --- a/host/scripts/nes/bnrom.lua +++ b/host/scripts/nes/bnrom.lua @@ -8,11 +8,51 @@ local nes = require "scripts.app.nes" local dump = require "scripts.app.dump" local flash = require "scripts.app.flash" --- file constants +-- file constants & variables +local mapname = "BxROM" +local banktable_base = 0xFF94 --Lizard +--local rom_FF_addr = 0x8000 -- local functions -local function wr_flash_byte(addr, value, debug) + +--read PRG-ROM flash ID +local function prgrom_manf_id( debug ) + + --init_mapper() + + if debug then print("reading PRG-ROM manf ID") end + + --enter software mode + --ROMSEL controls PRG-ROM /OE which needs to be low for flash writes + --So unlock commands need to be addressed below $8000 + --DISCRETE_EXP0_PRGROM_WR doesn't toggle /ROMSEL by definition though, so A15 is unused + -- 15 14 13 12 + -- 0x5 = 0b 0 1 0 1 -> $5555 + -- 0x2 = 0b 0 0 1 0 -> $2AAA + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xAA) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x2AAA, 0x55) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0x90) + + --read manf ID + local rv = dict.nes("NES_CPU_RD", 0x8000) + if debug then print("attempted read PRG-ROM manf ID:", string.format("%X", rv)) end + + --read prod ID + rv = dict.nes("NES_CPU_RD", 0x8001) + if debug then print("attempted read PRG-ROM prod ID:", string.format("%X", rv)) end + + --exit software + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x8000, 0xF0) + +end + + + +--writes a byte to the currently selected bank +local function wr_prg_flash_byte(addr, value, debug) + + --same as NROM, but desired bank must already be selected dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xAA) dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x2AAA, 0x55) dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xA0) @@ -41,7 +81,7 @@ local function wr_bank_table(base, entries) -- -- --write bank table to selected bank -- while( i < entries) do --- wr_flash_byte(base+i, i) +-- wr_prg_flash_byte(base+i, i) -- i = i+1; -- end -- --now we can use that bank table to jump to any other bank @@ -58,7 +98,7 @@ local function wr_bank_table(base, entries) --write bank table to selected bank local i = 0 while( i < entries) do - wr_flash_byte(base+i, i) + wr_prg_flash_byte(base+i, i) i = i+1; end @@ -67,12 +107,114 @@ local function wr_bank_table(base, entries) end + +--dump the PRG ROM +local function dump_prgrom( file, rom_size_KB, debug ) + + local KB_per_read = 32 + local num_reads = rom_size_KB / KB_per_read + local read_count = 0 + local addr_base = 0x08 -- $8000 + + while ( read_count < num_reads ) do + + if debug then print( "dump PRG part ", read_count, " of ", num_reads) end + + --select desired bank(s) to dump + dict.nes("NES_CPU_WR", banktable_base+read_count, read_count) --32KB @ CPU $8000 + + dump.dumptofile( file, KB_per_read, addr_base, "NESCPU_4KB", false ) + + read_count = read_count + 1 + end + +end + + +--host flash one byte/bank at a time... +--this is controlled from the host side one bank at a time +--but requires mapper specific firmware flashing functions +local function flash_prgrom(file, rom_size_KB, debug) + + --init_mapper() + + --bank table should already be written + + --test some bytes + --wr_prg_flash_byte(0x0000, 0xA5, true) + --wr_prg_flash_byte(0xFFFF, 0x5A, true) + + print("\nProgramming PRG-ROM flash") + + local base_addr = 0x8000 --writes occur $8000-9FFF + local bank_size = 32*1024 --BNROM 32KByte per PRG bank + local buff_size = 1 --number of bytes to write at a time + local cur_bank = 0 + local total_banks = rom_size_KB*1024/bank_size + + local byte_num --byte number gets reset for each bank + local byte_str, data, readdata + + while cur_bank < total_banks do + + if (cur_bank %4 == 0) then + print("writting PRG bank: ", cur_bank, " of ", total_banks-1) + end + + --write the current bank to the mapper register + dict.nes("NES_CPU_WR", banktable_base+cur_bank, cur_bank) + + --program the entire bank's worth of data + + --[[ This version of the code programs a single byte at a time but doesn't require + -- MMC3 specific functions in the firmware + print("This is slow as molasses, but gets the job done") + byte_num = 0 --current byte within the bank + while byte_num < bank_size do + + --read next byte from the file and convert to binary + byte_str = file:read(buff_size) + data = string.unpack("B", byte_str, 1) + + --write the data + --SLOWEST OPTION: no firmware MMC3 specific functions 100% host flash algo: + --wr_prg_flash_byte(base_addr+byte_num, data, false) --0.7KBps + --EASIEST FIRMWARE SPEEDUP: 5x faster, create MMC3 write byte function: + --can use same write function as NROM + dict.nes("NROM_PRG_FLASH_WR", base_addr+byte_num, data) --3.8KBps (5.5x faster than above) + + if (verify) then + readdata = dict.nes("NES_CPU_RD", base_addr+byte_num) + if readdata ~= data then + print("ERROR flashing byte number", byte_num, " in bank",cur_bank, " to flash ", data, readdata) + end + end + + byte_num = byte_num + 1 + end + --]] + + --Have the device write a banks worth of data + --Same as NROM + flash.write_file( file, bank_size/1024, "NROM", "PRGROM", false ) + + cur_bank = cur_bank + 1 + end + + print("Done Programming PRG-ROM flash") + +end + + --Cart should be in reset state upon calling this function --this function processes all user requests for this specific board/mapper local function process( test, read, erase, program, verify, dumpfile, flashfile, verifyfile) local rv = nil local file + local prg_size = 512 + local chr_size = 0 + local wram_size = 0 --initialize device i/o for NES dict.io("IO_RESET") @@ -80,22 +222,29 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, --test cart by reading manf/prod ID if test then + print("Testing ", mapname) + nes.detect_mapper_mirroring(true) nes.ppu_ram_sense(0x1000, true) + print("EXP0 pull-up test:", dict.io("EXP0_PULLUP_TEST")) - nes.read_flashID_prgrom_exp0(true) + --nes.read_flashID_prgrom_exp0(true) + prgrom_manf_id(true) + end --dump the cart to dumpfile if read then + print("\nDumping PRG-ROM...") file = assert(io.open(dumpfile, "wb")) --TODO find bank table to avoid bus conflicts! --dump cart into file - dump.dumptofile( file, 512, "BxROM", "PRGROM", true ) + dump_prgrom(file, prg_size, false) --close file assert(file:close()) + print("DONE Dumping PRG-ROM") end @@ -133,15 +282,13 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, --determine if auto-doubling, deinterleaving, etc, --needs done to make board compatible with rom - --find bank table in the rom --write bank table to all banks of cartridge - --Lizard's bank table is at $FF94 so hard code that for now - wr_bank_table(0xFF94, 16) - --hh85 bank table at $FFE0 - --wr_bank_table(0xFFE0, 16) + wr_bank_table(banktable_base, 16) + --TODO need to verify where bank table belongs and properly determine number of banks --flash cart - flash.write_file( file, 512, "BxROM", "PRGROM", true ) + flash_prgrom(file, prg_size, true) + --close file assert(file:close()) @@ -150,14 +297,17 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, --verify flashfile is on the cart if verify then --for now let's just dump the file and verify manually + print("\nPost dumping PRG-ROM") file = assert(io.open(verifyfile, "wb")) --dump cart into file - dump.dumptofile( file, 512, "BxROM", "PRGROM", true ) + dump_prgrom(file, prg_size, false) --close file assert(file:close()) + + print("DONE post dumping PRG-ROM") end dict.io("IO_RESET") diff --git a/host/scripts/nes/cdream.lua b/host/scripts/nes/cdream.lua index 11589e6..72a8103 100644 --- a/host/scripts/nes/cdream.lua +++ b/host/scripts/nes/cdream.lua @@ -8,11 +8,92 @@ local nes = require "scripts.app.nes" local dump = require "scripts.app.dump" local flash = require "scripts.app.flash" --- file constants +-- file constants & variables +local mapname = "CDREAM" +local banktable_base = 0xCC43 --MTales, bank0 only though.. +local rom_FF_addr = 0xCD42 --this is only present in first bank, so go there first +local rom_00_addr = 0x800C +--perhaps can use this to always get back to first bank which has a complete bank table +--MTales does have a zero in each and every bank at $800C which could be used to get back to bank0 +--but for now let's rely on 0 always overriding 1 to allow us to always be able to get to bank0 -- local functions -local function wr_flash_byte(addr, value, debug) +--read PRG-ROM flash ID +local function prgrom_manf_id( debug ) + + --init_mapper() + + if debug then print("reading PRG-ROM manf ID") end + + --enter software mode + --ROMSEL controls PRG-ROM /OE which needs to be low for flash writes + --So unlock commands need to be addressed below $8000 + --DISCRETE_EXP0_PRGROM_WR doesn't toggle /ROMSEL by definition though, so A15 is unused + -- 15 14 13 12 + -- 0x5 = 0b 0 1 0 1 -> $5555 + -- 0x2 = 0b 0 0 1 0 -> $2AAA + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xAA) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x2AAA, 0x55) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0x90) + + --read manf ID + local rv = dict.nes("NES_CPU_RD", 0x8000) + if debug then print("attempted read PRG-ROM manf ID:", string.format("%X", rv)) end + + --read prod ID + rv = dict.nes("NES_CPU_RD", 0x8001) + if debug then print("attempted read PRG-ROM prod ID:", string.format("%X", rv)) end + + --exit software + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x8000, 0xF0) + +end + +--read CHR-ROM flash ID +local function chrrom_manf_id( debug ) + + --init_mapper() + + if debug then print("reading CHR-ROM manf ID") end + + --enter software mode + --CDREAMS connects CHR-ROM A13-16 to mapper bits 4-8 + --so need to set mapper register bits 4 & 5 properly to send unlock commands + --A13 needs to be low to address CHR-ROM + -- 15 14 13 12 + -- 0x5 = 0b 0 1 0 1 -> bank:0x20 $1555 + -- 0x2 = 0b 0 0 1 0 -> bank:0x10 $0AAA + + --TODO find bank table prior to doing this + --or write to mapper without enabling PRG-ROM via exp0 + --tried DISCRETE_EXP0_MAPPER_WR function but didn't work... + dict.nes("NES_CPU_WR", 0x8000, 0x20) + dict.nes("NES_PPU_WR", 0x1555, 0xAA) + + dict.nes("NES_CPU_WR", 0x8000, 0x10) + dict.nes("NES_PPU_WR", 0x0AAA, 0x55) + + dict.nes("NES_CPU_WR", 0x8000, 0x20) + dict.nes("NES_PPU_WR", 0x1555, 0x90) + + --read manf ID + rv = dict.nes("NES_PPU_RD", 0x0000) + if debug then print("attempted read CHR-ROM manf ID:", string.format("%X", rv)) end + + --read prod ID + rv = dict.nes("NES_PPU_RD", 0x0001) + if debug then print("attempted read CHR-ROM prod ID:", string.format("%X", rv)) end + + --exit software + dict.nes("NES_PPU_WR", 0x0000, 0xF0) + +end + + +local function wr_prg_flash_byte(addr, value, debug) + + --same as NROM dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xAA) dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x2AAA, 0x55) dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xA0) @@ -29,6 +110,65 @@ local function wr_flash_byte(addr, value, debug) if debug then print(i, "naks, done writing byte.") end end + +--write a single byte to CHR-ROM flash +--PRE: assumes mapper is initialized and bank is selected +--REQ: addr must be in within Pattern Tables ($0000-1FFF) +local function wr_chr_flash_byte(bank, addr, value, debug) + + if (addr < 0x0000 or addr > 0x1FFF) then + print("\n ERROR! flash write to CHR-ROM", string.format("$%X", addr), "must be $0000-1FFF \n\n") + return + end + + --Color Dreams CHR-ROM register is mapper bits 4-7 (upper nibble) + --need to ensure first PRG-ROM bank is selected because that's only bank with the table + dict.nes("NES_CPU_WR", rom_00_addr, 0x00) --assumes mcu wins bus conflicts if rom is high + --remaining bank switches should maintain PRG-ROM bank 0 selected + + --send unlock command + --dict.nes("NES_CPU_WR", rom_00_addr, 0x00) --assumes mcu wins bus conflicts if rom is high + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x20) --assumes mcu wins bus conflicts if rom is high + dict.nes("NES_CPU_WR", banktable_base+0x20, 0x20) + --dict.nes("NES_CPU_WR", banktable_base+2, 0x02) + dict.nes("NES_PPU_WR", 0x1555, 0xAA) + + --dict.nes("NES_CPU_WR", rom_00_addr, 0x00) --assumes mcu wins bus conflicts if rom is high + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x10) --assumes mcu wins bus conflicts if rom is high + dict.nes("NES_CPU_WR", banktable_base+0x10, 0x10) + --dict.nes("NES_CPU_WR", banktable_base+1, 0x01) + dict.nes("NES_PPU_WR", 0x0AAA, 0x55) + + --dict.nes("NES_CPU_WR", rom_00_addr, 0x00) --assumes mcu wins bus conflicts if rom is high + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x20) --assumes mcu wins bus conflicts if rom is high + dict.nes("NES_CPU_WR", banktable_base+0x20, 0x20) + --dict.nes("NES_CPU_WR", banktable_base+2, 0x02) + dict.nes("NES_PPU_WR", 0x1555, 0xA0) + + --select desired bank + --dict.nes("NES_CPU_WR", rom_00_addr, 0x00) --assumes mcu wins bus conflicts if rom is high + --dict.nes("NES_CPU_WR", rom_FF_addr, bank<<4) --assumes mcu wins bus conflicts if rom is high + dict.nes("NES_CPU_WR", banktable_base+(bank<<4), (bank<<4)) + --dict.nes("NES_CPU_WR", banktable_base+bank, bank) + --write the byte + dict.nes("NES_PPU_WR", addr, value) + + local rv = dict.nes("NES_PPU_RD", addr) + + local i = 0 + + while ( rv ~= value ) do + rv = dict.nes("NES_PPU_RD", addr) + i = i + 1 + end + if debug then print(i, "naks, done writing byte.") end + + --TODO handle timeout for problems + + --TODO return pass/fail/info +end + + --base is the actual NES CPU address, not the rom offset (ie $FFF0, not $7FF0) local function wr_bank_table(base, entries) @@ -37,41 +177,289 @@ local function wr_bank_table(base, entries) --Perhaps it's possible to squeak by with only having it in the first bank as mojontales does.. --doesn't actually matter what bank this gets written to, lets ensure we can get to bank zero - wr_flash_byte(0x800C, 0x00) +-- wr_prg_flash_byte(0x800C, 0x00) --select first bank relying on 0 to override 1 for bus conflict - dict.nes("NES_CPU_WR", 0x800C, 0x00) + dict.nes("NES_CPU_WR", banktable_base, 0x00) --write bank table to selected bank local i = 0 while( i < entries) do - wr_flash_byte(base+i, i) + wr_prg_flash_byte(base+i, i) i = i+1; end - --need a zero value in each bank to get back to first bank - wr_flash_byte(0x800C, 0x00) --first bank - - --now place one in all the other banks - --first swap to next bank - i = 1 - while( i < 16) do --16 banks total for 512KByte - dict.nes("NES_CPU_WR", 0x0000, 0x00) --select first bank - dict.nes("NES_CPU_WR", base+i, i) --jump to next bank - wr_flash_byte(0x800C, 0x00) --write zero byte - i = i + 1 - end +-- --need a zero value in each bank to get back to first bank +-- wr_prg_flash_byte(0x800C, 0x00) --first bank +-- +-- --now place one in all the other banks +-- --first swap to next bank +-- i = 1 +-- while( i < 16) do --16 banks total for 512KByte +-- dict.nes("NES_CPU_WR", 0x0000, 0x00) --select first bank +-- dict.nes("NES_CPU_WR", base+i, i) --jump to next bank +-- wr_prg_flash_byte(0x800C, 0x00) --write zero byte +-- i = i + 1 +-- end end + +--dump the PRG ROM +local function dump_prgrom( file, rom_size_KB, debug ) + + local KB_per_read = 32 + local num_reads = rom_size_KB / KB_per_read + local read_count = 0 + local addr_base = 0x08 -- $8000 + + while ( read_count < num_reads ) do + + if debug then print( "dump PRG part ", read_count, " of ", num_reads) end + + --first need to get back to bank 0 where the bank table is + dict.nes("NES_CPU_WR", rom_00_addr, 0x00) + + --select desired bank(s) to dump + dict.nes("NES_CPU_WR", banktable_base+read_count, read_count) --32KB @ CPU $8000 + + dump.dumptofile( file, KB_per_read, addr_base, "NESCPU_4KB", false ) + + read_count = read_count + 1 + end + +end + + +--dump the CHR ROM +local function dump_chrrom( file, rom_size_KB, debug ) + + --CHR-ROM dump 8KB at a time + local KB_per_read = 8 + local num_reads = rom_size_KB / KB_per_read + local read_count = 0 + local addr_base = 0x00 -- $0000 + + while ( read_count < num_reads ) do + + if debug then print( "dump CHR part ", read_count, " of ", num_reads) end + + --first need to get back to bank 0 where the bank table is + dict.nes("NES_CPU_WR", rom_00_addr, 0x00) + + --select the proper CHR-ROM bank + --dump/read size is equal to bank size, so read_count is equal to bank number + --dict.nes("NES_CPU_WR", rom_FF_addr, read_count) + dict.nes("NES_CPU_WR", banktable_base+(read_count<<4), (read_count<<4)) + + --dump the bank + dump.dumptofile( file, KB_per_read, addr_base, "NESPPU_1KB", false ) + + read_count = read_count + 1 + end + +end + + +--host flash one byte/bank at a time... +--this is controlled from the host side one bank at a time +--but requires mapper specific firmware flashing functions +local function flash_prgrom(file, rom_size_KB, debug) + + --init_mapper() + + --bank table should already be written + + --test some bytes + --wr_prg_flash_byte(0x0000, 0xA5, true) + --wr_prg_flash_byte(0xFFFF, 0x5A, true) + + print("\nProgramming PRG-ROM flash") + + local base_addr = 0x8000 --writes occur $8000-9FFF + local bank_size = 32*1024 --just like BNROM 32KByte per PRG bank + local buff_size = 1 --number of bytes to write at a time + local cur_bank = 0 + local total_banks = rom_size_KB*1024/bank_size + + local byte_num --byte number gets reset for each bank + local byte_str, data, readdata + + while cur_bank < total_banks do + + if (cur_bank %2 == 0) then + print("writting PRG bank: ", cur_bank, " of ", total_banks-1) + end + + --first need to get back to bank 0 where the bank table is + dict.nes("NES_CPU_WR", rom_00_addr, 0x00) + --write the current bank to the mapper register this should be written to bank table + dict.nes("NES_CPU_WR", banktable_base+cur_bank, cur_bank) + + --program the entire bank's worth of data + + --[[ This version of the code programs a single byte at a time but doesn't require + -- MMC3 specific functions in the firmware + print("This is slow as molasses, but gets the job done") + byte_num = 0 --current byte within the bank + while byte_num < bank_size do + + --read next byte from the file and convert to binary + byte_str = file:read(buff_size) + data = string.unpack("B", byte_str, 1) + + --write the data + --SLOWEST OPTION: no firmware MMC3 specific functions 100% host flash algo: + --wr_prg_flash_byte(base_addr+byte_num, data, false) --0.7KBps + --EASIEST FIRMWARE SPEEDUP: 5x faster, create MMC3 write byte function: + --can use same write function as NROM + dict.nes("NROM_PRG_FLASH_WR", base_addr+byte_num, data) --3.8KBps (5.5x faster than above) + + if (verify) then + readdata = dict.nes("NES_CPU_RD", base_addr+byte_num) + if readdata ~= data then + print("ERROR flashing byte number", byte_num, " in bank",cur_bank, " to flash ", data, readdata) + end + end + + byte_num = byte_num + 1 + end + --]] + + --Have the device write a banks worth of data + --Same as NROM + flash.write_file( file, bank_size/1024, "NROM", "PRGROM", false ) + + cur_bank = cur_bank + 1 + end + + print("Done Programming PRG-ROM flash") + +end + + +local function flash_chrrom(file, rom_size_KB, debug) + + --init_mapper() + + --test some bytes + --wr_chr_flash_byte(0x00, 0x0000, 0x03, true) + --wr_chr_flash_byte(0x00, 0x1FFF, 0x0C, true) + --wr_chr_flash_byte(0x01, 0x0000, 0x13, true) + --wr_chr_flash_byte(0x01, 0x1FFF, 0x1C, true) + --wr_chr_flash_byte(0x02, 0x0000, 0x23, true) + --wr_chr_flash_byte(0x02, 0x1FFF, 0x2C, true) + --wr_chr_flash_byte(0x03, 0x0000, 0x33, true) + --wr_chr_flash_byte(0x03, 0x1FFF, 0x3C, true) + --wr_chr_flash_byte(0x04, 0x0000, 0x43, true) + --wr_chr_flash_byte(0x04, 0x1FFF, 0x4C, true) + --wr_chr_flash_byte(0x05, 0x0000, 0x53, true) + --wr_chr_flash_byte(0x05, 0x1FFF, 0x5C, true) + --wr_chr_flash_byte(0x06, 0x0000, 0x63, true) + --wr_chr_flash_byte(0x06, 0x1FFF, 0x6C, true) + --wr_chr_flash_byte(0x07, 0x0000, 0x73, true) + --wr_chr_flash_byte(0x07, 0x1FFF, 0x7C, true) + --wr_chr_flash_byte(0x08, 0x0000, 0x83, true) + --wr_chr_flash_byte(0x08, 0x1FFF, 0x8C, true) + --wr_chr_flash_byte(0x09, 0x0000, 0x93, true) + --wr_chr_flash_byte(0x09, 0x1FFF, 0x9C, true) + --wr_chr_flash_byte(0x0A, 0x0000, 0xA3, true) + --wr_chr_flash_byte(0x0A, 0x1FFF, 0xAC, true) + --wr_chr_flash_byte(0x0B, 0x0000, 0xB3, true) + --wr_chr_flash_byte(0x0B, 0x1FFF, 0xBC, true) + --wr_chr_flash_byte(0x0C, 0x0000, 0xC3, true) + --wr_chr_flash_byte(0x0C, 0x1FFF, 0xCC, true) + --wr_chr_flash_byte(0x0D, 0x0000, 0xD3, true) + --wr_chr_flash_byte(0x0D, 0x1FFF, 0xDC, true) + --wr_chr_flash_byte(0x0E, 0x0000, 0xE3, true) + --wr_chr_flash_byte(0x0E, 0x1FFF, 0xEC, true) + --wr_chr_flash_byte(0x0F, 0x0000, 0xF3, true) + --wr_chr_flash_byte(0x0F, 0x1FFF, 0xFC, true) + + print("\nProgramming CHR-ROM flash") + --most of this is overkill for NROM, but it's how we want to handle things for bigger mappers + + local base_addr = 0x0000 + local bank_size = 8*1024 + local buff_size = 1 --number of bytes to write at a time + local cur_bank = 0 + local total_banks = rom_size_KB*1024/bank_size + + local byte_num --byte number gets reset for each bank + local byte_str, data, readdata + + --start with the first bank selected so the bank table is visible + dict.nes("NES_CPU_WR", rom_00_addr, 0x00) --assumes mcu wins bus conflicts if rom is high + + --set the bank table address + dict.nes("SET_BANK_TABLE", banktable_base) + if debug then print("get banktable:", string.format("%X", dict.nes("GET_BANK_TABLE"))) end + + while cur_bank < total_banks do + + if (cur_bank %2 == 0) then + print("writting CHR bank: ", cur_bank, " of ", total_banks-1) + end + + --select bank to flash + dict.nes("SET_CUR_BANK", cur_bank) + if debug then print("get bank:", dict.nes("GET_CUR_BANK")) end + --this only updates the firmware nes.c global + --which it will use when calling cnrom_chrrom_flash_wr + + + --[[ This version of the code programs a single byte at a time but doesn't require + -- mapper specific functions in the firmware + print("This is slow as molasses, but gets the job done") + byte_num = 0 --current byte within the bank + while byte_num < bank_size do + + --read next byte from the file and convert to binary + byte_str = file:read(buff_size) + data = string.unpack("B", byte_str, 1) + + --write the data + --SLOWEST OPTION: no firmware MMC3 specific functions 100% host flash algo: + --wr_chr_flash_byte(cur_bank, base_addr+byte_num, data, false) --0.7KBps + --EASIEST FIRMWARE SPEEDUP: 5x faster, create mapper write byte function: + dict.nes("CDREAM_CHR_FLASH_WR", base_addr+byte_num, data) + --FASTEST have the firmware handle flashing a bank's worth of data + --control the init and banking from the host side + + --verify write after it's complete + if (true) then + readdata = dict.nes("NES_PPU_RD", base_addr+byte_num) + if readdata ~= data then + print("ERROR flashing byte number", byte_num, " in bank",cur_bank, " to flash ", data, readdata) + end + end + + byte_num = byte_num + 1 + end + --]] + + --program the entire bank's worth of data + flash.write_file( file, 8, mapname, "CHRROM", false ) + + cur_bank = cur_bank + 1 + end + + print("Done Programming CHR-ROM flash") +end + + + --Cart should be in reset state upon calling this function --this function processes all user requests for this specific board/mapper local function process( test, read, erase, program, verify, dumpfile, flashfile, verifyfile) local rv = nil local file + local prg_size = 512 + local chr_size = 128 + local wram_size = 0 --initialize device i/o for NES dict.io("IO_RESET") @@ -79,54 +467,28 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, --test cart by reading manf/prod ID if test then + print("Testing ", mapname) + nes.detect_mapper_mirroring(true) print("EXP0 pull-up test:", dict.io("EXP0_PULLUP_TEST")) - nes.read_flashID_prgrom_exp0(true) - - --enter software mode - --CDREAMS connects CHR-ROM A13-16 to mapper bits 4-8 - --so need to set mapper register bits 4 & 5 properly to send unlock commands - --A13 needs to be low to address CHR-ROM - -- 15 14 13 12 - -- 0x5 = 0b 0 1 0 1 -> bank:0x20 $1555 - -- 0x2 = 0b 0 0 1 0 -> bank:0x10 $0AAA - - --TODO find bank table prior to doing this - --or write to mapper without enabling PRG-ROM via exp0 - --tried DISCRETE_EXP0_MAPPER_WR function but didn't work... - dict.nes("NES_CPU_WR", 0x8000, 0x20) - dict.nes("NES_PPU_WR", 0x1555, 0xAA) - - dict.nes("NES_CPU_WR", 0x8000, 0x10) - dict.nes("NES_PPU_WR", 0x0AAA, 0x55) - - dict.nes("NES_CPU_WR", 0x8000, 0x20) - dict.nes("NES_PPU_WR", 0x1555, 0x90) - - --read manf ID - rv = dict.nes("NES_PPU_RD", 0x0000) - if debug then print("attempted read CHR-ROM manf ID:", string.format("%X", rv)) end - - --read prod ID - rv = dict.nes("NES_PPU_RD", 0x0001) - if debug then print("attempted read CHR-ROM prod ID:", string.format("%X", rv)) end - - --exit software - dict.nes("NES_PPU_WR", 0x0000, 0xF0) + prgrom_manf_id(true) + chrrom_manf_id(true) end --dump the cart to dumpfile if read then + print("\nDumping PRG & CHR ROMs...") file = assert(io.open(dumpfile, "wb")) --TODO find bank table to avoid bus conflicts! --dump cart into file - dump.dumptofile( file, 512, "CDREAM", "PRGROM", true ) - dump.dumptofile( file, 128, "CDREAM", "CHRROM", true ) + dump_prgrom(file, prg_size, false) + dump_chrrom(file, chr_size, false) --close file assert(file:close()) + print("DONE Dumping PRG & CHR ROMs") end @@ -156,23 +518,12 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, print("erasing CHR-ROM"); - dict.nes("NES_CPU_WR", 0x8000, 0x20) - dict.nes("NES_PPU_WR", 0x1555, 0xAA) - - dict.nes("NES_CPU_WR", 0x8000, 0x10) - dict.nes("NES_PPU_WR", 0x0AAA, 0x55) - - dict.nes("NES_CPU_WR", 0x8000, 0x20) - dict.nes("NES_PPU_WR", 0x1555, 0x80) - - dict.nes("NES_CPU_WR", 0x8000, 0x20) - dict.nes("NES_PPU_WR", 0x1555, 0xAA) - - dict.nes("NES_CPU_WR", 0x8000, 0x10) - dict.nes("NES_PPU_WR", 0x0AAA, 0x55) - - dict.nes("NES_CPU_WR", 0x8000, 0x20) - dict.nes("NES_PPU_WR", 0x1555, 0x10) + dict.nes("NES_CPU_WR", 0x8000, 0x20) dict.nes("NES_PPU_WR", 0x1555, 0xAA) + dict.nes("NES_CPU_WR", 0x8000, 0x10) dict.nes("NES_PPU_WR", 0x0AAA, 0x55) + dict.nes("NES_CPU_WR", 0x8000, 0x20) dict.nes("NES_PPU_WR", 0x1555, 0x80) + dict.nes("NES_CPU_WR", 0x8000, 0x20) dict.nes("NES_PPU_WR", 0x1555, 0xAA) + dict.nes("NES_CPU_WR", 0x8000, 0x10) dict.nes("NES_PPU_WR", 0x0AAA, 0x55) + dict.nes("NES_CPU_WR", 0x8000, 0x20) dict.nes("NES_PPU_WR", 0x1555, 0x10) rv = dict.nes("NES_PPU_RD", 0x0000) @@ -195,11 +546,12 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, --find bank table in the rom --write bank table to all banks of cartridge --Mojontales bank table is at $CC43 so hard code that for now - wr_bank_table(0xCC43, 256) + wr_bank_table(banktable_base, 256) --flash cart --- flash.write_file( file, 32, "CDREAM", "PRGROM", true ) --- flash.write_file( file, 128, "CDREAM", "CHRROM", true ) + flash_prgrom(file, prg_size, false) + flash_chrrom(file, chr_size, false) + --close file assert(file:close()) @@ -208,15 +560,18 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, --verify flashfile is on the cart if verify then --for now let's just dump the file and verify manually + print("\nPost dumping PRG & CHR ROMs...") file = assert(io.open(verifyfile, "wb")) --dump cart into file - dump.dumptofile( file, 512, "CDREAM", "PRGROM", true ) - dump.dumptofile( file, 128, "CDREAM", "CHRROM", true ) + dump_prgrom(file, prg_size, false) + dump_chrrom(file, chr_size, false) --close file assert(file:close()) + + print("DONE post dumping PRG & CHR ROMs") end dict.io("IO_RESET") diff --git a/host/scripts/nes/cnrom.lua b/host/scripts/nes/cnrom.lua new file mode 100644 index 0000000..be489ba --- /dev/null +++ b/host/scripts/nes/cnrom.lua @@ -0,0 +1,504 @@ + +-- create the module's table +local cnrom = {} + +-- import required modules +local dict = require "scripts.app.dict" +local nes = require "scripts.app.nes" +local dump = require "scripts.app.dump" +local flash = require "scripts.app.flash" +local swim = require "scripts.app.swim" +local ciccom = require "scripts.app.ciccom" + +-- file constants & variables +local mapname = "CNROM" +local banktable_base = 0xFFC8 --galf +local rom_FF_addr = 0x8008 --galf + +-- local functions + +local function find_banktable( debug ) + + --TODO find/create the bank table + + --experimenting shows that writting to a byte where the bank bits are set + --ie 0xFF (or 0x0F in case of 128KB CNROM), is good enough + --the stm32 mcu can over power a 5v '1' with a 0, but can't overpower a 0 with a 3v '1'. + + --best solution is to dump the visible PRG-ROM and search for a bank table + --then use that to swap banks + +end + +--read PRG-ROM flash ID +--this should be identical to NROM +local function prgrom_manf_id( debug ) + + --init_mapper() + + if debug then print("reading PRG-ROM manf ID") end + + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xAA) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x2AAA, 0x55) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0x90) + + --read manf ID + local rv = dict.nes("NES_CPU_RD", 0x8000) + if debug then print("attempted read PRG-ROM manf ID:", string.format("%X", rv)) end + + --read prod ID + rv = dict.nes("NES_CPU_RD", 0x8001) + if debug then print("attempted read PRG-ROM prod ID:", string.format("%X", rv)) end + + --exit software + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x8000, 0xF0) + +end + + +--read CHR-ROM flash ID +local function chrrom_manf_id( debug ) + + --init_mapper() + + if debug then print("reading CHR-ROM manf ID") end + + local rv + --enter software mode + --CNROM has A13 & A14 register controlled lower 2 bits of mapper + -- 15 14 13 12 + -- 0x5 = 0b 0 1 0 1 -> $1555 + -- 0x2 = 0b 0 0 1 0 -> $0AAA + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x02) --assumes mcu wins bus conflicts if rom is high + dict.nes("NES_CPU_WR", banktable_base+2, 0x02) + dict.nes("NES_PPU_WR", 0x1555, 0xAA) + + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x01) --assumes mcu wins bus conflicts if rom is high + dict.nes("NES_CPU_WR", banktable_base+1, 0x01) + dict.nes("NES_PPU_WR", 0x0AAA, 0x55) + + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x02) --assumes mcu wins bus conflicts if rom is high + dict.nes("NES_CPU_WR", banktable_base+2, 0x02) + dict.nes("NES_PPU_WR", 0x1555, 0x90) + + --read manf ID + rv = dict.nes("NES_PPU_RD", 0x0000) + if debug then print("attempted read CHR-ROM manf ID:", string.format("%X", rv)) end + + --read prod ID + rv = dict.nes("NES_PPU_RD", 0x0001) + if debug then print("attempted read CHR-ROM prod ID:", string.format("%X", rv)) end + + --exit software + dict.nes("NES_PPU_WR", 0x0000, 0xF0) --TODO bank table..? + +end + + +--dump the PRG ROM +local function dump_prgrom( file, rom_size_KB, debug ) + + --same as NROM + local KB_per_read = 32 + local num_reads = rom_size_KB / KB_per_read + local read_count = 0 + local addr_base = 0x08 -- $8000 + + while ( read_count < num_reads ) do + + if debug then print( "dump PRG part ", read_count, " of ", num_reads) end + + dump.dumptofile( file, KB_per_read, addr_base, "NESCPU_4KB", false ) + + read_count = read_count + 1 + end + +end + +--dump the CHR ROM +local function dump_chrrom( file, rom_size_KB, debug ) + + --CHR-ROM dump 8KB at a time + local KB_per_read = 8 + local num_reads = rom_size_KB / KB_per_read + local read_count = 0 + local addr_base = 0x00 -- $0000 + + while ( read_count < num_reads ) do + + if debug then print( "dump CHR part ", read_count, " of ", num_reads) end + + --select the proper CHR-ROM bank + --dump/read size is equal to bank size, so read_count is equal to bank number + --dict.nes("NES_CPU_WR", rom_FF_addr, read_count) --TODO this should be write to banktable + dict.nes("NES_CPU_WR", banktable_base+read_count, read_count) + + dict.nes("NES_CPU_WR", rom_FF_addr, read_count) --TODO this should be write to banktable + + --dump the bank + dump.dumptofile( file, KB_per_read, addr_base, "NESPPU_1KB", false ) + + read_count = read_count + 1 + end + +end + + +--write a single byte to PRG-ROM flash +local function wr_prg_flash_byte(addr, value, debug) + + if (addr < 0x8000 or addr > 0xFFFF) then + print("\n ERROR! flash write to PRG-ROM", string.format("$%X", addr), "must be $8000-FFFF \n\n") + return + end + + --send unlock command and write byte + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xAA) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x2AAA, 0x55) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xA0) + dict.nes("DISCRETE_EXP0_PRGROM_WR", addr, value) + + local rv = dict.nes("NES_CPU_RD", addr) + + local i = 0 + + while ( rv ~= value ) do + rv = dict.nes("NES_CPU_RD", addr) + i = i + 1 + end + if debug then print(i, "naks, done writing byte.") end + + --TODO handle timeout for problems + + --TODO return pass/fail/info +end + + +--write a single byte to CHR-ROM flash +--PRE: assumes mapper is initialized and bank is selected as prescribed in mapper_init +--REQ: addr must be in within Pattern Tables ($0000-1FFF) +local function wr_chr_flash_byte(bank, addr, value, debug) + + if (addr < 0x0000 or addr > 0x1FFF) then + print("\n ERROR! flash write to CHR-ROM", string.format("$%X", addr), "must be $0000-1FFF \n\n") + return + end + + --send unlock command + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x02) --assumes mcu wins bus conflicts if rom is high + dict.nes("NES_CPU_WR", banktable_base+2, 0x02) + dict.nes("NES_PPU_WR", 0x1555, 0xAA) + + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x01) --assumes mcu wins bus conflicts if rom is high + dict.nes("NES_CPU_WR", banktable_base+1, 0x01) + dict.nes("NES_PPU_WR", 0x0AAA, 0x55) + + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x02) --assumes mcu wins bus conflicts if rom is high + dict.nes("NES_CPU_WR", banktable_base+2, 0x02) + dict.nes("NES_PPU_WR", 0x1555, 0xA0) + + --select desired bank + --dict.nes("NES_CPU_WR", rom_FF_addr, bank) --assumes mcu wins bus conflicts if rom is high + dict.nes("NES_CPU_WR", banktable_base+bank, bank) + --write the byte + dict.nes("NES_PPU_WR", addr, value) + + local rv = dict.nes("NES_PPU_RD", addr) + + local i = 0 + + while ( rv ~= value ) do + rv = dict.nes("NES_PPU_RD", addr) + i = i + 1 + end + if debug then print(i, "naks, done writing byte.") end + + --TODO handle timeout for problems + + --TODO return pass/fail/info +end + + + +local function flash_prgrom(file, rom_size_KB, debug) + + + print("\nProgramming PRG-ROM flash") + + local base_addr = 0x8000 --writes occur $8000-9FFF + local bank_size = 32*1024 --MMC3 8KByte per PRG bank + local buff_size = 1 --number of bytes to write at a time + local cur_bank = 0 + local total_banks = rom_size_KB*1024/bank_size + + local byte_num --byte number gets reset for each bank + local byte_str, data, readdata + + while cur_bank < total_banks do + + if (cur_bank %8 == 0) then + print("writting PRG bank: ", cur_bank, " of ", total_banks-1) + end + + --program the entire bank's worth of data + --same as NROM + flash.write_file( file, 32, "NROM", "PRGROM", false ) + + cur_bank = cur_bank + 1 + end + + print("Done Programming PRG-ROM flash") + +end + + +local function flash_chrrom(file, rom_size_KB, debug) + + --init_mapper() + + --test some bytes + --wr_chr_flash_byte(0x00, 0x0000, 0x03, true) + --wr_chr_flash_byte(0x00, 0x1FFF, 0x0C, true) + --wr_chr_flash_byte(0x01, 0x0000, 0x13, true) + --wr_chr_flash_byte(0x01, 0x1FFF, 0x1C, true) + --wr_chr_flash_byte(0x02, 0x0000, 0x23, true) + --wr_chr_flash_byte(0x02, 0x1FFF, 0x2C, true) + --wr_chr_flash_byte(0x03, 0x0000, 0x33, true) + --wr_chr_flash_byte(0x03, 0x1FFF, 0x3C, true) + --wr_chr_flash_byte(0x04, 0x0000, 0x43, true) + --wr_chr_flash_byte(0x04, 0x1FFF, 0x4C, true) + --wr_chr_flash_byte(0x05, 0x0000, 0x53, true) + --wr_chr_flash_byte(0x05, 0x1FFF, 0x5C, true) + --wr_chr_flash_byte(0x06, 0x0000, 0x63, true) + --wr_chr_flash_byte(0x06, 0x1FFF, 0x6C, true) + --wr_chr_flash_byte(0x07, 0x0000, 0x73, true) + --wr_chr_flash_byte(0x07, 0x1FFF, 0x7C, true) + --wr_chr_flash_byte(0x08, 0x0000, 0x83, true) + --wr_chr_flash_byte(0x08, 0x1FFF, 0x8C, true) + --wr_chr_flash_byte(0x09, 0x0000, 0x93, true) + --wr_chr_flash_byte(0x09, 0x1FFF, 0x9C, true) + --wr_chr_flash_byte(0x0A, 0x0000, 0xA3, true) + --wr_chr_flash_byte(0x0A, 0x1FFF, 0xAC, true) + --wr_chr_flash_byte(0x0B, 0x0000, 0xB3, true) + --wr_chr_flash_byte(0x0B, 0x1FFF, 0xBC, true) + --wr_chr_flash_byte(0x0C, 0x0000, 0xC3, true) + --wr_chr_flash_byte(0x0C, 0x1FFF, 0xCC, true) + --wr_chr_flash_byte(0x0D, 0x0000, 0xD3, true) + --wr_chr_flash_byte(0x0D, 0x1FFF, 0xDC, true) + --wr_chr_flash_byte(0x0E, 0x0000, 0xE3, true) + --wr_chr_flash_byte(0x0E, 0x1FFF, 0xEC, true) + --wr_chr_flash_byte(0x0F, 0x0000, 0xF3, true) + --wr_chr_flash_byte(0x0F, 0x1FFF, 0xFC, true) + + print("\nProgramming CHR-ROM flash") + --most of this is overkill for NROM, but it's how we want to handle things for bigger mappers + + local base_addr = 0x0000 + local bank_size = 8*1024 + local buff_size = 1 --number of bytes to write at a time + local cur_bank = 0 + local total_banks = rom_size_KB*1024/bank_size + + local byte_num --byte number gets reset for each bank + local byte_str, data, readdata + + --set the bank table address + dict.nes("SET_BANK_TABLE", banktable_base) + if debug then print("get banktable:", string.format("%X", dict.nes("GET_BANK_TABLE"))) end + + while cur_bank < total_banks do + + if (cur_bank %8 == 0) then + print("writting CHR bank: ", cur_bank, " of ", total_banks-1) + end + + --select bank to flash + dict.nes("SET_CUR_BANK", cur_bank) + if debug then print("get bank:", dict.nes("GET_CUR_BANK")) end + --this only updates the firmware nes.c global + --which it will use when calling cnrom_chrrom_flash_wr + + + --[[ This version of the code programs a single byte at a time but doesn't require + -- mapper specific functions in the firmware + print("This is slow as molasses, but gets the job done") + byte_num = 0 --current byte within the bank + while byte_num < bank_size do + + --read next byte from the file and convert to binary + byte_str = file:read(buff_size) + data = string.unpack("B", byte_str, 1) + + --write the data + --SLOWEST OPTION: no firmware MMC3 specific functions 100% host flash algo: + --wr_chr_flash_byte(cur_bank, base_addr+byte_num, data, false) --0.7KBps + --EASIEST FIRMWARE SPEEDUP: 5x faster, create mapper write byte function: + dict.nes("CNROM_CHR_FLASH_WR", base_addr+byte_num, data) + --FASTEST have the firmware handle flashing a bank's worth of data + --control the init and banking from the host side + + if (verify) then + readdata = dict.nes("NES_PPU_RD", base_addr+byte_num) + if readdata ~= data then + print("ERROR flashing byte number", byte_num, " in bank",cur_bank, " to flash ", data, readdata) + end + end + + byte_num = byte_num + 1 + end + --]] + + --program the entire bank's worth of data + flash.write_file( file, 8, mapname, "CHRROM", false ) + + cur_bank = cur_bank + 1 + end + + print("Done Programming CHR-ROM flash") +end + + +--Cart should be in reset state upon calling this function +--this function processes all user requests for this specific board/mapper +local function process( test, read, erase, program, verify, dumpfile, flashfile, verifyfile) + + local rv = nil + local file + local prg_size = 32 + local chr_size = 32 + local wram_size = 0 + +--initialize device i/o for NES + dict.io("IO_RESET") + dict.io("NES_INIT") + +--test the cart + if test then + print("Testing", mapname) + nes.detect_mapper_mirroring(true) + + print("EXP0 pull-up test:", dict.io("EXP0_PULLUP_TEST")) + prgrom_manf_id( true ) + + chrrom_manf_id( true ) + + end + +--dump the cart to dumpfile + if read then + print("\nDumping PRG & CHR ROMs...") + + file = assert(io.open(dumpfile, "wb")) + + --dump cart into file + dump_prgrom(file, prg_size, false) + dump_chrrom(file, chr_size, true) + + --close file + assert(file:close()) + print("DONE Dumping PRG & CHR ROMs") + end + + +--erase the cart + if erase then + + print("\nErasing ", mapname); + + print("erasing PRG-ROM"); + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xAA) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x2AAA, 0x55) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0x80) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xAA) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x2AAA, 0x55) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0x10) + rv = dict.nes("NES_CPU_RD", 0x8000) + + local i = 0 + + --TODO create some function to pass the read value + --that's smart enough to figure out if the board is actually erasing or not + while ( rv ~= 0xFF ) do + rv = dict.nes("NES_CPU_RD", 0x8000) + i = i + 1 + end + print(i, "naks, done erasing prg."); + + print("erasing CHR-ROM"); + --there probably isn't a bank table if PRG-ROM just erased... + --but if PRG-ROM is erased (all 0xFF) mcu should be able to write to any address + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x02) --assumes mcu can write a 0 to a 1 + dict.nes("NES_CPU_WR", banktable_base+2, 0x02) + dict.nes("NES_PPU_WR", 0x1555, 0xAA) + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x01) --assumes mcu can write a 0 to a 1 + dict.nes("NES_CPU_WR", banktable_base+1, 0x01) + dict.nes("NES_PPU_WR", 0x0AAA, 0x55) + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x02) --assumes mcu can write a 0 to a 1 + dict.nes("NES_CPU_WR", banktable_base+2, 0x02) + dict.nes("NES_PPU_WR", 0x1555, 0x80) + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x02) --assumes mcu can write a 0 to a 1 + dict.nes("NES_CPU_WR", banktable_base+2, 0x02) + dict.nes("NES_PPU_WR", 0x1555, 0xAA) + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x01) --assumes mcu can write a 0 to a 1 + dict.nes("NES_CPU_WR", banktable_base+1, 0x01) + dict.nes("NES_PPU_WR", 0x0AAA, 0x55) + --dict.nes("NES_CPU_WR", rom_FF_addr, 0x02) --assumes mcu can write a 0 to a 1 + dict.nes("NES_CPU_WR", banktable_base+2, 0x02) + dict.nes("NES_PPU_WR", 0x1555, 0x10) + + rv = dict.nes("NES_PPU_RD", 0x0000) + + i = 0 + while ( rv ~= 0xFF ) do + rv = dict.nes("NES_PPU_RD", 0x0000) + i = i + 1 + end + print(i, "naks, done erasing chr.\n"); + end + + +--program flashfile to the cart + if program then + --open file + file = assert(io.open(flashfile, "rb")) + + --flash cart + flash_prgrom(file, prg_size, false) + flash_chrrom(file, chr_size, false) + + --close file + assert(file:close()) + + end + +--verify flashfile is on the cart + if verify then + --for now let's just dump the file and verify manually + print("\nPost Dumping PRG & CHR ROMs...") + + file = assert(io.open(verifyfile, "wb")) + + --dump cart into file + dump_prgrom(file, prg_size, false) + dump_chrrom(file, chr_size, false) + + --close file + assert(file:close()) + print("DONE Post Dumping PRG & CHR ROMs") + end + + dict.io("IO_RESET") +end + + +-- global variables so other modules can use them + + +-- call functions desired to run when script is called/imported + + +-- functions other modules are able to call +cnrom.process = process + +-- return the module's table +return cnrom diff --git a/host/scripts/nes/mmc1.lua b/host/scripts/nes/mmc1.lua index 95a33c9..02578c7 100644 --- a/host/scripts/nes/mmc1.lua +++ b/host/scripts/nes/mmc1.lua @@ -173,7 +173,7 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, file = assert(io.open(dumpfile, "wb")) --dump cart into file - dump.dumptofile( file, 128, "MMC1", "PRGROM", true ) + dump.dumptofile( file, 256, "MMC1", "PRGROM", true ) dump.dumptofile( file, 128, "MMC1", "CHRROM", true ) --close file @@ -243,8 +243,8 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, --needs done to make board compatible with rom --flash cart - flash.write_file( file, 128, "MMC1", "PRGROM", true ) - --flash.write_file( file, 128, "MMC1", "CHRROM", true ) + flash.write_file( file, 256, "MMC1", "PRGROM", true ) + flash.write_file( file, 128, "MMC1", "CHRROM", true ) --close file assert(file:close()) @@ -257,7 +257,7 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, file = assert(io.open(verifyfile, "wb")) --dump cart into file - dump.dumptofile( file, 128, "MMC1", "PRGROM", true ) + dump.dumptofile( file, 256, "MMC1", "PRGROM", true ) dump.dumptofile( file, 128, "MMC1", "CHRROM", true ) --close file diff --git a/host/scripts/nes/mmc3.lua b/host/scripts/nes/mmc3.lua new file mode 100644 index 0000000..f0acb12 --- /dev/null +++ b/host/scripts/nes/mmc3.lua @@ -0,0 +1,705 @@ + +-- create the module's table +local mmc3 = {} + +-- import required modules +local dict = require "scripts.app.dict" +local nes = require "scripts.app.nes" +local dump = require "scripts.app.dump" +local flash = require "scripts.app.flash" + +-- file constants +local mapname = "MMC3" + +-- local functions + +--disables WRAM, selects Vertical mirroring +--sets up CHR-ROM flash PT0 for DATA, Commands: $5555->$1555 $2AAA->$1AAA +--sets up PRG-ROM flash DATA: $8000-9FFF, Commands: $5555->D555 $2AAA->$AAAA +--leaves reg0 selected (CHR bank & $0000) selected so PRG DATA writes don't change PRG banks +local function init_mapper( debug ) + + + --for save data safety start by disabling WRAM, and deny writes + dict.nes("NES_CPU_WR", 0xA001, 0x40) + + --set mirroring + dict.nes("NES_CPU_WR", 0xA000, 0x00) --bit0 0-vert 1-horiz + + + --$8000-9FFE even + --MMC3 bank select: + --7 bit 0 + ------ ---- + --CPMx xRRR + --||| ||| + --||| +++- Specify which bank register to update on next write to Bank Data register + --||| 0: Select 2 KB CHR bank at PPU $0000-$07FF (or $1000-$17FF); + --||| 1: Select 2 KB CHR bank at PPU $0800-$0FFF (or $1800-$1FFF); + --||| 2: Select 1 KB CHR bank at PPU $1000-$13FF (or $0000-$03FF); + --||| 3: Select 1 KB CHR bank at PPU $1400-$17FF (or $0400-$07FF); + --||| 4: Select 1 KB CHR bank at PPU $1800-$1BFF (or $0800-$0BFF); + --||| 5: Select 1 KB CHR bank at PPU $1C00-$1FFF (or $0C00-$0FFF); + --||| 6: Select 8 KB PRG ROM bank at $8000-$9FFF (or $C000-$DFFF); + --||| 7: Select 8 KB PRG ROM bank at $A000-$BFFF + --||+------- Nothing on the MMC3, see MMC6 + --|+-------- PRG ROM bank mode (0: $8000-$9FFF swappable, + --| $C000-$DFFF fixed to second-last bank; + --| 1: $C000-$DFFF swappable, + --| $8000-$9FFF fixed to second-last bank) + --+--------- CHR A12 inversion (0: two 2 KB banks at $0000-$0FFF, + -- four 1 KB banks at $1000-$1FFF; + -- 1: two 2 KB banks at $1000-$1FFF, + -- four 1 KB banks at $0000-$0FFF) + + --For CHR-ROM flash writes, use lower 4KB (PT0) for writting data & upper 4KB (PT1) for commands + dict.nes("NES_CPU_WR", 0x8000, 0x00) + dict.nes("NES_CPU_WR", 0x8001, 0x00) --2KB @ PPU $0000 + + dict.nes("NES_CPU_WR", 0x8000, 0x01) + dict.nes("NES_CPU_WR", 0x8001, 0x02) --2KB @ PPU $0800 + + --use lower half of PT1 for $5555 commands + dict.nes("NES_CPU_WR", 0x8000, 0x02) + dict.nes("NES_CPU_WR", 0x8001, 0x15) --1KB @ PPU $1000 + + dict.nes("NES_CPU_WR", 0x8000, 0x03) + dict.nes("NES_CPU_WR", 0x8001, 0x15) --1KB @ PPU $1400 + + --use upper half of PT1 for $2AAA commands + dict.nes("NES_CPU_WR", 0x8000, 0x04) + dict.nes("NES_CPU_WR", 0x8001, 0x0A) --1KB @ PPU $1800 + + dict.nes("NES_CPU_WR", 0x8000, 0x05) + dict.nes("NES_CPU_WR", 0x8001, 0x0A) --1KB @ PPU $1C00 + + + --For PRG-ROM flash writes: + --mode 0: $C000-FFFF fixed to last 16KByte + -- reg6 controls $8000-9FFF ($C000-DFFF in mode 1) + -- reg7 controls $A000-BFFF (regardless of mode) + --Don't want to write data to $8000-9FFF because those are the bank regs + --Writting data to $A000-BFFF is okay as that will only affect mirroring and WRAM ctl + + --$5555 commands can be written to $D555 (A14 set, A13 clear) + --$2AAA commands must be written through reg6/7 ($8000-BFFF) to clear A14 & set A13 + -- reg7 ($A000-BFFF) is ideal because it won't affect banking, just mirror/WRAM + -- actually $2AAA is even, so it'll only affect mirroring which is ideal + --DATA writes can occur at $8000-9FFF, but care must be taken to maintain banking. + -- Setting $8000 to a CHR bank prevents DATA writes from changing PRG banks + -- The DATA write will change the bank select if it's written to an even address though + -- To cover this, simply select the CHR bank again with $8000 reg after the data write + -- Those DATA writes can also corrupt the PRG/CHR modes, so just always follow + -- DATA writes by writting 0x00 to $8000 + + --$5555 commands written to $D555 (default due to mode 0) + --$2AAA commands written to $AAAA + dict.nes("NES_CPU_WR", 0x8000, 0x07) + dict.nes("NES_CPU_WR", 0x8001, 0x01) --8KB @ CPU $A000 + + --DATA writes written to $8000-9FFF + dict.nes("NES_CPU_WR", 0x8000, 0x06) + dict.nes("NES_CPU_WR", 0x8001, 0x00) --8KB @ CPU $8000 + + --set $8000 bank select register to a CHR reg so $8000/1 writes don't change the PRG bank + dict.nes("NES_CPU_WR", 0x8000, 0x00) + +end + + +--test the mapper's mirroring modes to verify working properly +--can be used to help identify board: returns true if pass, false if failed +local function mirror_test( debug ) + + --put MMC3 in known state (mirror bits cleared) + init_mapper() + + --M = 1: Vertical + --dict.nes("NES_CPU_WR", 0xA000, 0x00) --bit0 0-vert 1-horiz + if (nes.detect_mapper_mirroring(true) ~= "VERT") then + print(mapname, " vert mirror test fail") + return false + end + + --M = 1: Horizontal + dict.nes("NES_CPU_WR", 0xA000, 0x01) --bit0 0-vert 1-horiz + if (nes.detect_mapper_mirroring(true) ~= "HORZ") then + print(mapname, " horz mirror test fail") + return false + end + + --passed all tests + if(debug) then print(mapname, " mirror test passed") end + return true +end + +--read PRG-ROM flash ID +local function prgrom_manf_id( debug ) + + init_mapper() + + if debug then print("reading PRG-ROM manf ID") end + --A0-A14 are all directly addressable in CNROM mode + --and mapper writes don't affect PRG banking + dict.nes("NES_CPU_WR", 0xD555, 0xAA) + dict.nes("NES_CPU_WR", 0xAAAA, 0x55) + dict.nes("NES_CPU_WR", 0xD555, 0x90) + rv = dict.nes("NES_CPU_RD", 0x8000) + if debug then print("attempted read PRG-ROM manf ID:", string.format("%X", rv)) end + rv = dict.nes("NES_CPU_RD", 0x8001) + if debug then print("attempted read PRG-ROM prod ID:", string.format("%X", rv)) end + + --exit software + dict.nes("NES_CPU_WR", 0x8000, 0xF0) + +end + +--read CHR-ROM flash ID +local function chrrom_manf_id( debug ) + + init_mapper() + + if debug then print("reading CHR-ROM manf ID") end + --A0-A14 are all directly addressable in CNROM mode + --and mapper writes don't affect PRG banking + dict.nes("NES_PPU_WR", 0x1555, 0xAA) + dict.nes("NES_PPU_WR", 0x1AAA, 0x55) + dict.nes("NES_PPU_WR", 0x1555, 0x90) + rv = dict.nes("NES_PPU_RD", 0x0000) + if debug then print("attempted read CHR-ROM manf ID:", string.format("%X", rv)) end + rv = dict.nes("NES_PPU_RD", 0x0001) + if debug then print("attempted read CHR-ROM prod ID:", string.format("%X", rv)) end + + --exit software + dict.nes("NES_PPU_WR", 0x8000, 0xF0) + +end + + +--dump the PRG ROM +local function dump_prgrom( file, rom_size_KB, debug ) + + --PRG-ROM dump 16KB at a time through MMC3 reg6&7 in mode 0 + local KB_per_read = 16 + local num_reads = rom_size_KB / KB_per_read + local read_count = 0 + local addr_base = 0x08 -- $8000 + + while ( read_count < num_reads ) do + + if debug then print( "dump PRG part ", read_count, " of ", num_reads) end + + --select desired bank(s) to dump + dict.nes("NES_CPU_WR", 0x8000, 0x06) + --the bank is half the size of KB per read so must multiply by 2 + dict.nes("NES_CPU_WR", 0x8001, read_count*2) --1KB @ CPU $8000 + + dict.nes("NES_CPU_WR", 0x8000, 0x07) + --the bank is half the size of KB per read so must multiply by 2 and add 1 for second 8KB + dict.nes("NES_CPU_WR", 0x8001, read_count*2+1) --8KB @ CPU $A000 + + --16 = number of KB to dump per loop + --0x08 = starting read address A12-15 -> $8000 + --NESCPU_4KB designate mapper independent read of NES CPU address space + --mapper must be 0-15 to designate A12-15 + --dump.dumptofile( file, 16, 0x08, "NESCPU_4KB", true ) + dump.dumptofile( file, KB_per_read, addr_base, "NESCPU_4KB", false ) + + read_count = read_count + 1 + end + +end + +--dump the CHR ROM +local function dump_chrrom( file, rom_size_KB, debug ) + + local KB_per_read = 4 --dump one PT at a time so only need 2 reg writes + local num_reads = rom_size_KB / KB_per_read + local read_count = 0 + local addr_base = 0x00 -- $0000 + + while ( read_count < num_reads ) do + + if debug then print( "dump CHR part ", read_count, " of ", num_reads) end + dict.nes("NES_CPU_WR", 0x8000, 0x00) + --the bank is half the size of KB per read so must multiply by 2 + --but bit0 isn't used with these 2KB banks, so shift by 1 + dict.nes("NES_CPU_WR", 0x8001, ((read_count*2)<<1)) --2KB @ PPU $0000 + + dict.nes("NES_CPU_WR", 0x8000, 0x01) + --the bank is half the size of KB per read so must multiply by 2 and add 1 for second 4KB + --but bit0 isn't used with these 2KB banks, so shift by 1 + dict.nes("NES_CPU_WR", 0x8001, ((read_count*2+1)<<1)) --2KB @ CPU $0800 + + --4 = number of KB to dump per loop + --0x00 = starting read address A10-13 -> $0000 + --mapper must be 0x00 or 0x04-0x3C to designate A10-13 + -- bits 7, 6, 1, & 0 CAN NOT BE SET! + -- 0x04 would designate that A10 is set -> $0400 (the second 1KB PT bank) + -- 0x20 would designate that A13 is set -> $2000 (first name table) + dump.dumptofile( file, KB_per_read, addr_base, "NESPPU_1KB", false ) + + read_count = read_count + 1 + end + +end + + +--dump the WRAM, assumes the WRAM was enabled/disabled as desired prior to calling +local function dump_wram( file, rom_size_KB, debug ) + + local KB_per_read = 8 + local num_reads = rom_size_KB / KB_per_read + local read_count = 0 + local addr_base = 0x06 -- $6000 + + while ( read_count < num_reads ) do + + if debug then print( "dump WRAM part ", read_count, " of ", num_reads) end + + dump.dumptofile( file, KB_per_read, addr_base, "NESCPU_4KB", false ) + + read_count = read_count + 1 + end + +end + + +--write a single byte to PRG-ROM flash +--PRE: assumes mapper is initialized and bank is selected as prescribed in mapper_init +--REQ: addr must be in the first bank $8000-9FFF +local function wr_prg_flash_byte(addr, value, debug) + + if (addr < 0x8000 or addr > 0x9FFF) then + print("\n ERROR! flash write to PRG-ROM", string.format("$%X", addr), "must be $8000-9FFF \n\n") + return + end + + --send unlock command and write byte + dict.nes("NES_CPU_WR", 0xD555, 0xAA) + dict.nes("NES_CPU_WR", 0xAAAA, 0x55) + dict.nes("NES_CPU_WR", 0xD555, 0xA0) + dict.nes("NES_CPU_WR", addr, value) + + --recover by setting $8000 reg select back to a CHR reg + dict.nes("NES_CPU_WR", 0x8000, 0x00) + + local rv = dict.nes("NES_CPU_RD", addr) + + local i = 0 + + while ( rv ~= value ) do + rv = dict.nes("NES_CPU_RD", addr) + i = i + 1 + end + if debug then print(i, "naks, done writing byte.") end + + --TODO handle timeout for problems + + --TODO return pass/fail/info +end + + +--write a single byte to CHR-ROM flash +--PRE: assumes mapper is initialized and bank is selected as prescribed in mapper_init +--REQ: addr must be in the first 2 banks $0000-0FFF +local function wr_chr_flash_byte(addr, value, debug) + + if (addr < 0x0000 or addr > 0x0FFF) then + print("\n ERROR! flash write to CHR-ROM", string.format("$%X", addr), "must be $0000-0FFF \n\n") + return + end + + --send unlock command and write byte + dict.nes("NES_PPU_WR", 0x1555, 0xAA) + dict.nes("NES_PPU_WR", 0x1AAA, 0x55) + dict.nes("NES_PPU_WR", 0x1555, 0xA0) + dict.nes("NES_PPU_WR", addr, value) + + local rv = dict.nes("NES_PPU_RD", addr) + + local i = 0 + + while ( rv ~= value ) do + rv = dict.nes("NES_PPU_RD", addr) + i = i + 1 + end + if debug then print(i, "naks, done writing byte.") end + + --TODO handle timeout for problems + + --TODO return pass/fail/info +end + + +--host flash one bank at a time... +--this is controlled from the host side one bank at a time +--but requires mapper specific firmware flashing functions +--there is super slow version commented out that doesn't require MMC3 specific firmware code +local function flash_prgrom(file, rom_size_KB, debug) + + init_mapper() + + --test some bytes + --wr_prg_flash_byte(0x0000, 0xA5, true) + --wr_prg_flash_byte(0x0FFF, 0x5A, true) + + print("\nProgramming PRG-ROM flash") + --initial testing of MMC3 with no specific MMC3 flash firmware functions 6min per 256KByte = 0.7KBps + + + local base_addr = 0x8000 --writes occur $8000-9FFF + local bank_size = 8*1024 --MMC3 8KByte per PRG bank + local buff_size = 1 --number of bytes to write at a time + local cur_bank = 0 + local total_banks = rom_size_KB*1024/bank_size + + local byte_num --byte number gets reset for each bank + local byte_str, data, readdata + + + while cur_bank < total_banks do + + if (cur_bank %8 == 0) then + print("writting PRG bank: ", cur_bank, " of ", total_banks-1) + end + + --write the current bank to the mapper register + --DATA writes written to $8000-9FFF + dict.nes("NES_CPU_WR", 0x8000, 0x06) + dict.nes("NES_CPU_WR", 0x8001, cur_bank) --8KB @ CPU $8000 + + --set $8000 bank select back to a CHR register + --keeps from having the PRG bank changing when writting data + dict.nes("NES_CPU_WR", 0x8000, 0x00) + + + --program the entire bank's worth of data + + --[[ This version of the code programs a single byte at a time but doesn't require + -- MMC3 specific functions in the firmware + print("This is slow as molasses, but gets the job done") + byte_num = 0 --current byte within the bank + while byte_num < bank_size do + + --read next byte from the file and convert to binary + byte_str = file:read(buff_size) + data = string.unpack("B", byte_str, 1) + + --write the data + --SLOWEST OPTION: no firmware MMC3 specific functions 100% host flash algo: + --wr_prg_flash_byte(base_addr+byte_num, data, false) --0.7KBps + + --EASIEST FIRMWARE SPEEDUP: 5x faster, create MMC3 write byte function: + dict.nes("MMC3_PRG_FLASH_WR", base_addr+byte_num, data) --3.8KBps (5.5x faster than above) + --NEXT STEP: firmware write page/bank function can use function pointer for the function above + -- this may cause issues with more complex algos + -- sometimes cur bank is needed + -- for this to work, need to have function post conditions meet the preconditions + -- that way host intervention is only needed for bank controls + -- Is there a way to allow for double buffering though..? + -- YES! just think of the bank as a complete memory + -- this greatly simplifies things and is exactly where we want to go + -- This is completed below outside the byte while loop @ 39KBps + + if (verify) then + readdata = dict.nes("NES_CPU_RD", base_addr+byte_num) + if readdata ~= data then + print("ERROR flashing byte number", byte_num, " in bank",cur_bank, " to flash ", data, readdata) + end + end + + byte_num = byte_num + 1 + end + --]] + + --Have the device write a banks worth of data + --FAST! 13sec for 512KB = 39KBps + flash.write_file( file, 8, mapname, "PRGROM", false ) + + cur_bank = cur_bank + 1 + end + + print("Done Programming PRG-ROM flash") + +end + + +--slow host flash one byte at a time... +--this is controlled from the host side byte by byte making it slow +--but doesn't require specific firmware MMC3 flashing functions +local function flash_chrrom(file, rom_size_KB, debug) + + init_mapper() + + --test some bytes + --wr_chr_flash_byte(0x0000, 0xA5, true) + --wr_chr_flash_byte(0x0FFF, 0x5A, true) + + print("\nProgramming CHR-ROM flash") + + local base_addr = 0x0000 + local bank_size = 4*1024 --MMC3 2KByte per lower CHR bank and we're using 2 of them.. + local buff_size = 1 --number of bytes to write at a time + local cur_bank = 0 + local total_banks = rom_size_KB*1024/bank_size + + local byte_num --byte number gets reset for each bank + local byte_str, data, readdata + + + while cur_bank < total_banks do + + if (cur_bank %8 == 0) then + print("writting CHR bank: ", cur_bank, " of ", total_banks-1) + end + + --write the current bank to the mapper register + --DATA writes written to $0000-0FFF + dict.nes("NES_CPU_WR", 0x8000, 0x00) + dict.nes("NES_CPU_WR", 0x8001, (cur_bank*2)<<1) --2KB @ PPU $0000 + dict.nes("NES_CPU_WR", 0x8000, 0x01) + dict.nes("NES_CPU_WR", 0x8001, (cur_bank*2+1)<<1) --2KB @ PPU $0800 + + --program the entire bank's worth of data + --[[ This version of the code programs a single byte at a time but doesn't require + -- MMC3 specific functions in the firmware + print("This is slow as molasses, but gets the job done") + byte_num = 0 --current byte within the bank + while byte_num < bank_size do + + --read next byte from the file and convert to binary + byte_str = file:read(buff_size) + data = string.unpack("B", byte_str, 1) + + --write the data + --SLOWEST OPTION: no firmware MMC3 specific functions 100% host flash algo: + --wr_chr_flash_byte(base_addr+byte_num, data, false) --0.7KBps + --EASIEST FIRMWARE SPEEDUP: 5x faster, create MMC3 write byte function: + dict.nes("MMC3_CHR_FLASH_WR", base_addr+byte_num, data) --3.8KBps (5.5x faster than above) + --FASTEST have the firmware handle flashing a bank's worth of data + --control the init and banking from the host side + + if (verify) then + readdata = dict.nes("NES_PPU_RD", base_addr+byte_num) + if readdata ~= data then + print("ERROR flashing byte number", byte_num, " in bank",cur_bank, " to flash ", data, readdata) + end + end + + byte_num = byte_num + 1 + end + --]] + + --Have the device write a "banks" worth of data, actually 2x banks of 2KB each + --FAST! 13sec for 512KB = 39KBps + flash.write_file( file, 4, mapname, "CHRROM", false ) + + cur_bank = cur_bank + 1 + end + + print("Done Programming CHR-ROM flash") +end + + +--Cart should be in reset state upon calling this function +--this function processes all user requests for this specific board/mapper +local function process( test, read, erase, program, verify, dumpfile, flashfile, verifyfile, dumpram, writeram, ramdumpfile, ramwritefile) + + local rv = nil + local file + local prg_size = 512 + local chr_size = 256 + local wram_size = 8 + +--initialize device i/o for NES + dict.io("IO_RESET") + dict.io("NES_INIT") + +--test cart by reading manf/prod ID + if test then + print("Testing ", mapname) + + --verify mirroring is behaving as expected + mirror_test(true) + + nes.ppu_ram_sense(0x1000, true) + print("EXP0 pull-up test:", dict.io("EXP0_PULLUP_TEST")) + + --attempt to read PRG-ROM flash ID + prgrom_manf_id(true) + --attempt to read CHR-ROM flash ID + chrrom_manf_id(true) + end + +--dump the ram to file + if dumpram then + + print("\nDumping WRAM...") + + init_mapper() + + --maintain write protection, but allow reads + dict.nes("NES_CPU_WR", 0xA001, 0xC0) + + file = assert(io.open(ramdumpfile, "wb")) + + --dump cart into file + dump_wram(file, wram_size, false) + + --for save data safety disable WRAM, and deny writes + dict.nes("NES_CPU_WR", 0xA001, 0x40) + + --close file + assert(file:close()) + + print("DONE Dumping WRAM") + end + + + +--dump the cart to dumpfile + if read then + + print("\nDumping PRG & CHR ROMs...") + + init_mapper() + + file = assert(io.open(dumpfile, "wb")) + + --dump cart into file + dump_prgrom(file, prg_size, false) + dump_chrrom(file, chr_size, false) + + --close file + assert(file:close()) + + print("DONE Dumping PRG & CHR ROMs") + end + + +--erase the cart + if erase then + + print("\nerasing ", mapname) + + init_mapper() + + print("erasing PRG-ROM"); + dict.nes("NES_CPU_WR", 0xD555, 0xAA) + dict.nes("NES_CPU_WR", 0xAAAA, 0x55) + dict.nes("NES_CPU_WR", 0xD555, 0x80) + dict.nes("NES_CPU_WR", 0xD555, 0xAA) + dict.nes("NES_CPU_WR", 0xAAAA, 0x55) + dict.nes("NES_CPU_WR", 0xD555, 0x10) + rv = dict.nes("NES_CPU_RD", 0x8000) + + local i = 0 + + --TODO create some function to pass the read value + --that's smart enough to figure out if the board is actually erasing or not + while ( rv ~= 0xFF ) do + rv = dict.nes("NES_CPU_RD", 0x8000) + i = i + 1 + end + print(i, "naks, done erasing prg."); + + + --TODO erase CHR-ROM only if present + init_mapper() + + print("erasing CHR-ROM"); + dict.nes("NES_PPU_WR", 0x1555, 0xAA) + dict.nes("NES_PPU_WR", 0x1AAA, 0x55) + dict.nes("NES_PPU_WR", 0x1555, 0x80) + dict.nes("NES_PPU_WR", 0x1555, 0xAA) + dict.nes("NES_PPU_WR", 0x1AAA, 0x55) + dict.nes("NES_PPU_WR", 0x1555, 0x10) + rv = dict.nes("NES_PPU_RD", 0x0000) + + local i = 0 + + --TODO create some function to pass the read value + --that's smart enough to figure out if the board is actually erasing or not + while ( rv ~= 0xFF ) do + rv = dict.nes("NES_PPU_RD", 0x8000) + i = i + 1 + end + print(i, "naks, done erasing chr."); + + + end + +--write to wram on the cart + if writeram then + + print("\nWritting to WRAM...") + + init_mapper() + + --disable write protection, and enable WRAM + dict.nes("NES_CPU_WR", 0xA001, 0x80) + + file = assert(io.open(ramwritefile, "rb")) + + flash.write_file( file, wram_size, "NOVAR", "PRGRAM", false ) + + --for save data safety disable WRAM, and deny writes + dict.nes("NES_CPU_WR", 0xA001, 0x40) + + --close file + assert(file:close()) + + print("DONE Writting WRAM") + end + +--program flashfile to the cart + if program then + + --open file + file = assert(io.open(flashfile, "rb")) + --determine if auto-doubling, deinterleaving, etc, + --needs done to make board compatible with rom + + flash_prgrom(file, prg_size, true) + flash_chrrom(file, chr_size, true) + + --close file + assert(file:close()) + + end + +--verify flashfile is on the cart + if verify then + --for now let's just dump the file and verify manually + print("\nPost dumping PRG & CHR ROMs...") + + init_mapper() + + file = assert(io.open(verifyfile, "wb")) + + --dump cart into file + dump_prgrom(file, prg_size, false) + dump_chrrom(file, chr_size, false) + + --close file + assert(file:close()) + + print("DONE post dumping PRG & CHR ROMs") + end + + dict.io("IO_RESET") +end + + +-- global variables so other modules can use them + + +-- call functions desired to run when script is called/imported + + +-- functions other modules are able to call +mmc3.process = process + +-- return the module's table +return mmc3 diff --git a/host/scripts/nes/nrom.lua b/host/scripts/nes/nrom.lua index bcc60f0..c2f6835 100644 --- a/host/scripts/nes/nrom.lua +++ b/host/scripts/nes/nrom.lua @@ -7,23 +7,280 @@ local dict = require "scripts.app.dict" local nes = require "scripts.app.nes" local dump = require "scripts.app.dump" local flash = require "scripts.app.flash" +local swim = require "scripts.app.swim" +local ciccom = require "scripts.app.ciccom" -- file constants +local mapname = "NROM" -- local functions + --read PRG-ROM flash ID local function prgrom_manf_id( debug ) + --init_mapper() + + if debug then print("reading PRG-ROM manf ID") end + + --enter software mode + --ROMSEL controls PRG-ROM /OE which needs to be low for flash writes + --So unlock commands need to be addressed below $8000 + --DISCRETE_EXP0_PRGROM_WR doesn't toggle /ROMSEL by definition though, so A15 is unused + -- 15 14 13 12 + -- 0x5 = 0b 0 1 0 1 -> $5555 + -- 0x2 = 0b 0 0 1 0 -> $2AAA + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xAA) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x2AAA, 0x55) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0x90) + + --read manf ID + local rv = dict.nes("NES_CPU_RD", 0x8000) + if debug then print("attempted read PRG-ROM manf ID:", string.format("%X", rv)) end + + --read prod ID + rv = dict.nes("NES_CPU_RD", 0x8001) + if debug then print("attempted read PRG-ROM prod ID:", string.format("%X", rv)) end + + --exit software + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x8000, 0xF0) + + --verify exited +-- rv = dict.nes("NES_CPU_RD", 0x8001) +-- if debug then print("attempted read PRG-ROM prod ID:", string.format("%X", rv)) end + +end + + +--read CHR-ROM flash ID +local function chrrom_manf_id( debug ) + + --init_mapper() + + if debug then print("reading CHR-ROM manf ID") end + + --enter software mode + --NROM has A13 tied to A11, and A14 tied to A12. + --So only A0-12 needs to be valid + --A13 needs to be low to address CHR-ROM + -- 15 14 13 12 + -- 0x5 = 0b 0 1 0 1 -> $1555 + -- 0x2 = 0b 0 0 1 0 -> $0AAA + dict.nes("NES_PPU_WR", 0x1555, 0xAA) + dict.nes("NES_PPU_WR", 0x0AAA, 0x55) + dict.nes("NES_PPU_WR", 0x1555, 0x90) + --read manf ID + local rv = dict.nes("NES_PPU_RD", 0x0000) + if debug then print("attempted read CHR-ROM manf ID:", string.format("%X", rv)) end + + --read prod ID + rv = dict.nes("NES_PPU_RD", 0x0001) + if debug then print("attempted read CHR-ROM prod ID:", string.format("%X", rv)) end + + --exit software + dict.nes("NES_PPU_WR", 0x0000, 0xF0) end +--dump the PRG ROM +local function dump_prgrom( file, rom_size_KB, debug ) + + --PRG-ROM dump all 32KB, most of this code is overkill for NROM. + -- but follows same format as banked mappers + local KB_per_read = 32 + local num_reads = rom_size_KB / KB_per_read + local read_count = 0 + local addr_base = 0x08 -- $8000 + + while ( read_count < num_reads ) do + + if debug then print( "dump PRG part ", read_count, " of ", num_reads) end + + dump.dumptofile( file, KB_per_read, addr_base, "NESCPU_4KB", false ) + + read_count = read_count + 1 + end + +end + +--dump the CHR ROM +local function dump_chrrom( file, rom_size_KB, debug ) + + --CHR-ROM dump all 8KB, most of this code is overkill for NROM. + -- but follows same format as banked mappers + local KB_per_read = 8 + local num_reads = rom_size_KB / KB_per_read + local read_count = 0 + local addr_base = 0x00 -- $0000 + + while ( read_count < num_reads ) do + + if debug then print( "dump CHR part ", read_count, " of ", num_reads) end + + dump.dumptofile( file, KB_per_read, addr_base, "NESPPU_1KB", false ) + + read_count = read_count + 1 + end + +end + + +--write a single byte to PRG-ROM flash +local function wr_prg_flash_byte(addr, value, debug) + + if (addr < 0x8000 or addr > 0xFFFF) then + print("\n ERROR! flash write to PRG-ROM", string.format("$%X", addr), "must be $8000-FFFF \n\n") + return + end + + --send unlock command and write byte + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xAA) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x2AAA, 0x55) + dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xA0) + dict.nes("DISCRETE_EXP0_PRGROM_WR", addr, value) + + local rv = dict.nes("NES_CPU_RD", addr) + + local i = 0 + + while ( rv ~= value ) do + rv = dict.nes("NES_CPU_RD", addr) + i = i + 1 + end + if debug then print(i, "naks, done writing byte.") end + + --TODO handle timeout for problems + + --TODO return pass/fail/info +end + + +--write a single byte to CHR-ROM flash +--PRE: assumes mapper is initialized and bank is selected as prescribed in mapper_init +--REQ: addr must be in the first 2 banks $0000-0FFF +local function wr_chr_flash_byte(addr, value, debug) + + if (addr < 0x0000 or addr > 0x1FFF) then + print("\n ERROR! flash write to CHR-ROM", string.format("$%X", addr), "must be $0000-1FFF \n\n") + return + end + + --send unlock command and write byte + dict.nes("NES_PPU_WR", 0x1555, 0xAA) + dict.nes("NES_PPU_WR", 0x0AAA, 0x55) + dict.nes("NES_PPU_WR", 0x1555, 0xA0) + dict.nes("NES_PPU_WR", addr, value) + + local rv = dict.nes("NES_PPU_RD", addr) + + local i = 0 + + while ( rv ~= value ) do + rv = dict.nes("NES_PPU_RD", addr) + i = i + 1 + end + if debug then print(i, "naks, done writing byte.") end + + --TODO handle timeout for problems + + --TODO return pass/fail/info +end + + + +--fast host flash one bank at a time... +--this is controlled from the host side one bank at a time +--but requires specific firmware MMC3 flashing functions +--there is super slow version commented out that doesn't require MMC3 specific firmware code +local function flash_prgrom(file, rom_size_KB, debug) + + --init_mapper() + + --test some bytes + --wr_prg_flash_byte(0x8000, 0xA5, true) + --wr_prg_flash_byte(0xFFFF, 0x5A, true) + + + print("\nProgramming PRG-ROM flash") + + --most of this is overkill for NROM, but it's how we want to handle things for bigger mappers + local base_addr = 0x8000 --writes occur $8000-9FFF + local bank_size = 32*1024 --MMC3 8KByte per PRG bank + local buff_size = 1 --number of bytes to write at a time + local cur_bank = 0 + local total_banks = rom_size_KB*1024/bank_size + + local byte_num --byte number gets reset for each bank + local byte_str, data, readdata + + while cur_bank < total_banks do + + if (cur_bank %8 == 0) then + print("writting PRG bank: ", cur_bank, " of ", total_banks-1) + end + + --program the entire bank's worth of data + flash.write_file( file, 32, mapname, "PRGROM", false ) + + cur_bank = cur_bank + 1 + end + + print("Done Programming PRG-ROM flash") + +end + + +--slow host flash one byte at a time... +--this is controlled from the host side byte by byte making it slow +--but doesn't require specific firmware MMC3 flashing functions +local function flash_chrrom(file, rom_size_KB, debug) + + --init_mapper() + + --test some bytes + --wr_chr_flash_byte(0x0000, 0xC3, true) + --wr_chr_flash_byte(0x1FFF, 0x3C, true) + + print("\nProgramming CHR-ROM flash") + --most of this is overkill for NROM, but it's how we want to handle things for bigger mappers + + local base_addr = 0x0000 + local bank_size = 8*1024 + local buff_size = 1 --number of bytes to write at a time + local cur_bank = 0 + local total_banks = rom_size_KB*1024/bank_size + + local byte_num --byte number gets reset for each bank + local byte_str, data, readdata + + while cur_bank < total_banks do + + if (cur_bank %8 == 0) then + print("writting CHR bank: ", cur_bank, " of ", total_banks-1) + end + + --program the entire bank's worth of data + flash.write_file( file, 8, mapname, "CHRROM", false ) + + cur_bank = cur_bank + 1 + end + + print("Done Programming CHR-ROM flash") +end + + + + + --Cart should be in reset state upon calling this function --this function processes all user requests for this specific board/mapper -local function process( test, read, erase, program, verify, dumpfile, flashfile, verifyfile) +local function process( test, read, erase, program, verify, dumpfile, flashfile, verifyfile, mirror) local rv = nil local file + local prg_size = 32 + local chr_size = 8 + local wram_size = 0 --initialize device i/o for NES dict.io("IO_RESET") @@ -31,29 +288,74 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, --test the cart if test then + print("Testing ", mapname) + nes.detect_mapper_mirroring(true) - nes.read_flashID_chrrom_8K(true) print("EXP0 pull-up test:", dict.io("EXP0_PULLUP_TEST")) - nes.read_flashID_prgrom_exp0(true) + --nes.read_flashID_prgrom_exp0(true) + prgrom_manf_id(true) + --nes.read_flashID_chrrom_8K(true) + chrrom_manf_id(true) + end + +--change mirroring + if mirror then + --mirror set to "H" of "V" for desired mirroring + print("Setting", mirror, "mirroring via CIC software mirror control") + nes.detect_mapper_mirroring(true) + + ciccom.start() + ciccom.set_opcode("M") + --now send operand "V" (0x56) or "H" (0x48) + ciccom.write(mirror) + + dict.io("IO_RESET") + ciccom.sleep(0.01) --10msec to be overly safe + + --test reading back CIC version + dict.io("SWIM_INIT", "SWIM_ON_A0") + --dict.io("SWIM_INIT", "SWIM_ON_EXP0") + if swim.start(true) then + + swim.read_stack() + + else + print("ERROR trying to read back CIC signature stack data") + end + swim.stop_and_reset() + + print("done reading STM8 stack on A0\n") + + dict.io("IO_RESET") + dict.io("NES_INIT") + nes.detect_mapper_mirroring(true) end --dump the cart to dumpfile if read then + + print("\nDumping PRG & CHR ROMs...") + + --init_mapper() + file = assert(io.open(dumpfile, "wb")) --dump cart into file - dump.dumptofile( file, 32, "NROM", "PRGROM", true ) - dump.dumptofile( file, 8, "NROM", "CHRROM", true ) + dump_prgrom(file, prg_size, false) + dump_chrrom(file, chr_size, false) --close file assert(file:close()) + print("DONE Dumping PRG & CHR ROMs") end --erase the cart if erase then - print("erasing NROM"); + print("\nErasing ", mapname); + + --init_mapper() print("erasing PRG-ROM"); dict.nes("DISCRETE_EXP0_PRGROM_WR", 0x5555, 0xAA) @@ -99,8 +401,10 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, --determine if auto-doubling, deinterleaving, etc, --needs done to make board compatible with rom --flash cart - flash.write_file( file, 32, "NROM", "PRGROM", true ) - flash.write_file( file, 8, "NROM", "CHRROM", true ) + --flash.write_file( file, 32, "NROM", "PRGROM", true ) + --flash.write_file( file, 8, "NROM", "CHRROM", true ) + flash_prgrom(file, prg_size, true) + flash_chrrom(file, chr_size, true) --close file assert(file:close()) @@ -109,15 +413,20 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, --verify flashfile is on the cart if verify then --for now let's just dump the file and verify manually + print("\nPost dumping PRG & CHR ROMs...") + + --init_mapper() file = assert(io.open(verifyfile, "wb")) --dump cart into file - dump.dumptofile( file, 32, "NROM", "PRGROM", true ) - dump.dumptofile( file, 8, "NROM", "CHRROM", true ) + dump_prgrom(file, prg_size, false) + dump_chrrom(file, chr_size, false) --close file assert(file:close()) + + print("DONE post dumping PRG & CHR ROMs") end dict.io("IO_RESET") diff --git a/host/scripts/snes/lorom_5volt.lua b/host/scripts/snes/lorom_5volt.lua new file mode 100644 index 0000000..4ce92e4 --- /dev/null +++ b/host/scripts/snes/lorom_5volt.lua @@ -0,0 +1,347 @@ + +-- create the module's table +local lorom_5volt = {} + +-- import required modules +local dict = require "scripts.app.dict" +local dump = require "scripts.app.dump" +local flash = require "scripts.app.flash" +local snes = require "scripts.app.snes" + +-- file constants + +-- local functions + + + +-- Desc: attempt to read flash rom ID +-- Pre: snes_init() been called to setup i/o +-- Post:Address left on bus memories disabled +-- Rtn: true if valid flash ID found +local function rom_manf_id( debug ) + + local rv + --enter software mode A14 is highest address bit that needs to be valid + dict.snes("SNES_SET_BANK", 0x00) + + --/ROMSEL wouldn't normally be low for these addresses.. + --true SNES mapped reads would set A15 high to be in lorom /ROMSEL space + --but A15 isn't connected to the rom on LOROM so the cart can't see the difference + --plus A15 doesn't need to be valid to read manf/prod ID anyway.. + dict.snes("SNES_ROM_WR", 0x5555, 0xAA) + dict.snes("SNES_ROM_WR", 0x2AAA, 0x55) + dict.snes("SNES_ROM_WR", 0x5555, 0x90) + + --read manf ID + local manf_id = dict.snes("SNES_ROM_RD", 0x8000) + if debug then print("attempted read SNES ROM manf ID:", string.format("%X", manf_id)) end + + --read prod ID + local prod_id = dict.snes("SNES_ROM_RD", 0x8001) + if debug then print("attempted read SNES ROM prod ID:", string.format("%X", prod_id)) end + + --exit software + dict.snes("SNES_ROM_WR", 0x0000, 0xF0) + + --return true if detected flash chip + if (manf_id == 0xBF and prod_id == 0xB7) then + print("512KByte flash detected") + return true + elseif (manf_id == 0xBF and prod_id == 0xB6) then + print("256KByte flash detected") + return true + elseif (manf_id == 0xBF and prod_id == 0xB5) then + print("128KByte flash detected") + return true + else + return false + end + +end + +--dump the SNES ROM starting at the provided bank +--/ROMSEL is always low for this dump +local function dump_rom( file, start_bank, rom_size_KB, debug ) + + local KB_per_bank = 32 -- LOROM has 32KB per bank + local num_reads = rom_size_KB / KB_per_bank + local read_count = 0 + local addr_base = 0x80 -- $8000 LOROM + + while ( read_count < num_reads ) do + + if debug then print( "dump ROM part ", read_count, " of ", num_reads) end + + --select desired bank + dict.snes("SNES_SET_BANK", start_bank+read_count) + + dump.dumptofile( file, KB_per_bank, addr_base, "SNESROM_PAGE", false ) + + read_count = read_count + 1 + end + +end + + +--write a single byte to SNES ROM flash +--writes to currently selected bank address +local function wr_flash_byte(addr, value, debug) + + if (addr < 0x0000 or addr > 0xFFFF) then + print("\n ERROR! flash write to SNES", string.format("$%X", addr), "must be $0000-FFFF \n\n") + return + end + + --send unlock command and write byte + dict.snes("SNES_ROM_WR", 0x5555, 0xAA) + dict.snes("SNES_ROM_WR", 0x2AAA, 0x55) + dict.snes("SNES_ROM_WR", 0x5555, 0xA0) + dict.snes("SNES_ROM_WR", addr, value) + + local rv = dict.snes("SNES_ROM_RD", addr) + + local i = 0 + + while ( rv ~= value ) do + rv = dict.snes("SNES_ROM_RD", addr) + i = i + 1 + end + if debug then print(i, "naks, done writing byte.") end + if debug then print("written value:", string.format("%X",value), "verified value:", string.format("%X",rv)) end + + --TODO handle timeout for problems + + --TODO return pass/fail/info +end + + +--fast host flash one bank at a time... +--this is controlled from the host side one bank at a time +local function flash_rom(file, rom_size_KB, debug) + + --init_mapper() + + --test some bytes + --dict.snes("SNES_SET_BANK", 0x00) wr_flash_byte(0x8000, 0xA5, true) wr_flash_byte(0xFFFF, 0x5A, true) + --dict.snes("SNES_SET_BANK", 0x01) wr_flash_byte(0x8000, 0x15, true) wr_flash_byte(0xFFFF, 0x1A, true) + --last of 512KB + --dict.snes("SNES_SET_BANK", 0x0F) wr_flash_byte(0x8000, 0xF5, true) wr_flash_byte(0xFFFF, 0xFA, true) + + print("\nProgramming ROM flash") + + --most of this is overkill for NROM, but it's how we want to handle things for bigger mappers + local base_addr = 0x8000 --writes occur $8000-9FFF + local bank_size = 32*1024 --SNES LOROM 32KB per ROM bank + local buff_size = 1 --number of bytes to write at a time + local cur_bank = 0 + local total_banks = rom_size_KB*1024/bank_size + + local byte_num --byte number gets reset for each bank + local byte_str, data, readdata + + while cur_bank < total_banks do + + if (cur_bank %4 == 0) then + print("writting ROM bank: ", cur_bank, " of ", total_banks-1) + end + + --select the current bank + if (cur_bank <= 0xFF) then + dict.snes("SNES_SET_BANK", cur_bank) + else + print("\n\nERROR!!!! SNES bank cannot exceed 0xFF, it was:", string.format("0x%X",cur_bank)) + return + end + + --program the entire bank's worth of data + + --[[ This version of the code programs a single byte at a time but doesn't require + -- board specific functions in the firmware + print("This is slow as molasses, but gets the job done") + byte_num = 0 --current byte within the bank + while byte_num < bank_size do + + --read next byte from the file and convert to binary + byte_str = file:read(buff_size) + data = string.unpack("B", byte_str, 1) + + --write the data + --SLOWEST OPTION: no firmware specific functions 100% host flash algo: + --wr_flash_byte(base_addr+byte_num, data, false) --0.7KBps + --EASIEST FIRMWARE SPEEDUP: 5x faster, create firmware write byte function: + dict.snes("FLASH_WR_5V", base_addr+byte_num, data) --3.8KBps (5.5x faster than above) + + --if (verify) then + -- readdata = dict.nes("NES_CPU_RD", base_addr+byte_num) + -- if readdata ~= data then + -- print("ERROR flashing byte number", byte_num, " in bank",cur_bank, " to flash ", data, readdata) + -- end + --end + + byte_num = byte_num + 1 + end + --]] + + --Have the device write a banks worth of data + flash.write_file( file, bank_size/1024, "LOROM_5VOLT", "SNESROM", false ) + + cur_bank = cur_bank + 1 + end + + print("Done Programming ROM flash") + +end + + +--Cart should be in reset state upon calling this function +--this function processes all user requests for this specific board/mapper +local function process( test, read, erase, program, verify, dumpfile, flashfile, verifyfile) + + local rv = nil + local file + + local snes_mapping = "LOROM" + --local snes_mapping = "HIROM" + + local ram_size = 0 + + --local rom_size = 32 + local rom_size = 512 + --local rom_size = 1024 + --local rom_size = 2048 + --local rom_size = 4096 + --local rom_size = 8192 + --local rom_size = 12288 + --local rom_size = 16384 + + + -- SNES memory map banking + -- A15 always high for LOROM (A22 is typically low too) + -- A22 always high for HIROM + -- A23 splits the map in half + -- A22 splits it in quarters (between what's typically low half and high half) + -- b 7 6 5 4 : 3 2 1 0 + -- A23 22 21 20 : 19 18 17 16 + + local first_bank --byte that contains A23-16 + + if (snes_mapping == "LOROM") then + -- LOROM typically sees the upper half (A15=1) of the first address 0b0000:1000_0000 + first_bank = 0x00 + elseif (snes_mapping == "HIROM") then + -- HIROM typically sees the last 4MByte as the first addresses = 0b1100:0000_0000 + first_bank = 0xC0 + end + + +--initialize device i/o for SNES + dict.io("IO_RESET") + dict.io("SNES_INIT") + + +--test cart by reading manf/prod ID + if test then + + print("\nTesting SNES board"); + + --SNES detect HiROM or LoROM & RAM + + --SNES detect if able to read flash ID's + if not rom_manf_id(true) then + print("ERROR unable to read flash ID") + return + end + end + +--dump the cart to dumpfile + if read then + print("\nDumping SNES ROM...") + + file = assert(io.open(dumpfile, "wb")) + + --dump cart into file + dump_rom(file, first_bank, rom_size, false) + + --close file + assert(file:close()) + print("DONE Dumping SNES ROM") + end + +--erase the cart + if erase then + + print("\nErasing PLCC flash"); + + local rv = nil + + --WR $AAA:AA $555:55 $AAA:AA + dict.snes("SNES_SET_BANK", 0x00) + + dict.snes("SNES_ROM_WR", 0x5555, 0xAA) + dict.snes("SNES_ROM_WR", 0x2AAA, 0x55) + dict.snes("SNES_ROM_WR", 0x5555, 0x80) + dict.snes("SNES_ROM_WR", 0x5555, 0xAA) + dict.snes("SNES_ROM_WR", 0x2AAA, 0x55) + dict.snes("SNES_ROM_WR", 0x5555, 0x10) + rv = dict.snes("SNES_ROM_RD", 0x0000) + + local i = 0 + + while ( rv ~= 0xFF ) do + rv = dict.snes("SNES_ROM_RD", 0x8000) + i = i + 1 + end + print(i, "naks, done erasing snes rom."); + + --reset flash + dict.snes("SNES_ROM_WR", 0x0000, 0xF0) + + end + + +--program flashfile to the cart + if program then + + --open file + file = assert(io.open(flashfile, "rb")) + --determine if auto-doubling, deinterleaving, etc, + --needs done to make board compatible with rom + + --flash cart + flash_rom(file, rom_size, true) + + --close file + assert(file:close()) + + end + +--verify flashfile is on the cart + if verify then + print("\nPost dumping SNES ROM...") + --for now let's just dump the file and verify manually + + file = assert(io.open(verifyfile, "wb")) + + --dump cart into file + dump_rom(file, first_bank, rom_size, false) + + --close file + assert(file:close()) + print("DONE Post dumping SNES ROM") + end + + dict.io("IO_RESET") +end + + +-- global variables so other modules can use them + + +-- call functions desired to run when script is called/imported + + +-- functions other modules are able to call +lorom_5volt.process = process + +-- return the module's table +return lorom_5volt diff --git a/host/scripts/snes/v2proto.lua b/host/scripts/snes/v2proto.lua new file mode 100644 index 0000000..a3c7c76 --- /dev/null +++ b/host/scripts/snes/v2proto.lua @@ -0,0 +1,357 @@ + +-- create the module's table +local v2proto = {} + +-- import required modules +local dict = require "scripts.app.dict" +local dump = require "scripts.app.dump" +local flash = require "scripts.app.flash" +local snes = require "scripts.app.snes" +local apperase = require "scripts.app.erase" + +-- file constants + +-- local functions + + +-- Desc: attempt to read flash rom ID +-- Pre: snes_init() been called to setup i/o +-- Post:Address left on bus memories disabled +-- Rtn: true if proper flash ID found +local function rom_manf_id( debug ) + + local rv + --enter software mode A11 is highest address bit that needs to be valid + --datasheet not exactly explicit, A11 might not need to be valid + --part has A-1 (negative 1) since it's in byte mode, meaning the part's A11 is actually A12 + --WR $AAA:AA $555:55 $AAA:AA + dict.snes("SNES_SET_BANK", 0x00) + + dict.snes("SNES_ROM_WR", 0x8AAA, 0xAA) + dict.snes("SNES_ROM_WR", 0x8555, 0x55) + dict.snes("SNES_ROM_WR", 0x8AAA, 0x90) + + --read manf ID + local manf_id = dict.snes("SNES_ROM_RD", 0x8000) --0x01 Cypress Manf ID + if debug then print("attempted read SNES ROM manf ID:", string.format("%X", manf_id)) end + + --read prod ID + local prod_id = dict.snes("SNES_ROM_RD", 0x8002) --0x7E Prod ID S29GL + if debug then print("attempted read SNES ROM prod ID:", string.format("%X", prod_id)) end + + local density_id = dict.snes("SNES_ROM_RD", 0x801C) --density 0x10=8MB 0x1A=4MB + if debug then print("attempted read SNES density ID: ", string.format("%X", density_id)) end + + local boot_sect = dict.snes("SNES_ROM_RD", 0x801E) --boot sector 0x00=top 0x01=bottom + if debug then print("attempted read SNES boot sect ID:", string.format("%X", boot_sect)) end + + --exit software + dict.snes("SNES_ROM_WR", 0x8000, 0xF0) + + --return true if detected flash chip + if (manf_id == 0x01 and prod_id == 0x49) then + print("2MB flash detected") + return true + elseif (manf_id == 0x01 and prod_id == 0x7E) then + print("4-8MB flash detected") + return true + else + return false + end + +end + + + +local function erase_flash( debug ) + + local rv = nil + + print("\nErasing TSSOP flash takes about 30sec..."); + + --WR $AAA:AA $555:55 $AAA:AA + dict.snes("SNES_SET_BANK", 0x00) + + dict.snes("SNES_ROM_WR", 0x8AAA, 0xAA) + dict.snes("SNES_ROM_WR", 0x8555, 0x55) + dict.snes("SNES_ROM_WR", 0x8AAA, 0x80) + dict.snes("SNES_ROM_WR", 0x8AAA, 0xAA) + dict.snes("SNES_ROM_WR", 0x8555, 0x55) + dict.snes("SNES_ROM_WR", 0x8AAA, 0x10) + + rv = dict.snes("SNES_ROM_RD", 0x8000) + + local i = 0 + + while ( rv ~= 0xFF ) do + rv = dict.snes("SNES_ROM_RD", 0x8000) + i = i + 1 + -- if debug then print(" ", i,":", string.format("%x",rv)) end + end + print(i, "naks, done erasing snes."); + + --reset flash + dict.snes("SNES_ROM_WR", 0x8000, 0xF0) +end + + +--dump the SNES ROM starting at the provided bank +--/ROMSEL is always low for this dump +local function dump_rom( file, start_bank, rom_size_KB, debug ) + + local KB_per_bank = 32 -- LOROM has 32KB per bank + local num_reads = rom_size_KB / KB_per_bank + local read_count = 0 + local addr_base = 0x80 -- $8000 LOROM + + while ( read_count < num_reads ) do + + if debug then print( "dump ROM part ", read_count, " of ", num_reads) end + + --select desired bank + dict.snes("SNES_SET_BANK", start_bank+read_count) + + dump.dumptofile( file, KB_per_bank, addr_base, "SNESROM_PAGE", false ) + + read_count = read_count + 1 + end + +end + + +--write a single byte to SNES ROM flash +--writes to currently selected bank address +local function wr_flash_byte(addr, value, debug) + + if (addr < 0x0000 or addr > 0xFFFF) then + print("\n ERROR! flash write to SNES", string.format("$%X", addr), "must be $0000-FFFF \n\n") + return + end + + --send unlock command and write byte + dict.snes("SNES_ROM_WR", 0x8AAA, 0xAA) + dict.snes("SNES_ROM_WR", 0x8555, 0x55) + dict.snes("SNES_ROM_WR", 0x8AAA, 0xA0) + dict.snes("SNES_ROM_WR", addr, value) + + local rv = dict.snes("SNES_ROM_RD", addr) + + local i = 0 + + while ( rv ~= value ) do + rv = dict.snes("SNES_ROM_RD", addr) + i = i + 1 + end + if debug then print(i, "naks, done writing byte.") end + if debug then print("written value:", string.format("%X",value), "verified value:", string.format("%X",rv)) end + + --TODO handle timeout for problems + + --TODO return pass/fail/info +end + + +--fast host flash one bank at a time... +--this is controlled from the host side one bank at a time +local function flash_rom(file, rom_size_KB, debug) + + print("\nProgramming ROM flash") + + --test some bytes +-- dict.snes("SNES_SET_BANK", 0x00) wr_flash_byte(0x8000, 0xA5, true) wr_flash_byte(0xFFFF, 0x5A, true) +-- dict.snes("SNES_SET_BANK", 0x01) wr_flash_byte(0x8000, 0x15, true) wr_flash_byte(0xFFFF, 0x1A, true) + --last of 512KB +-- dict.snes("SNES_SET_BANK", 0x0F) wr_flash_byte(0x8000, 0xF5, true) wr_flash_byte(0xFFFF, 0xFA, true) + + --most of this is overkill for NROM, but it's how we want to handle things for bigger mappers + local base_addr = 0x8000 --writes occur $8000-9FFF + local bank_size = 32*1024 --SNES LOROM 32KB per ROM bank + local buff_size = 1 --number of bytes to write at a time + local cur_bank = 0 + local total_banks = rom_size_KB*1024/bank_size + + local byte_num --byte number gets reset for each bank + local byte_str, data, readdata + + while cur_bank < total_banks do + + if (cur_bank %4 == 0) then + print("writting ROM bank: ", cur_bank, " of ", total_banks-1) + end + + --select the current bank + if (cur_bank <= 0xFF) then + dict.snes("SNES_SET_BANK", cur_bank) + else + print("\n\nERROR!!!! SNES bank cannot exceed 0xFF, it was:", string.format("0x%X",cur_bank)) + return + end + + --program the entire bank's worth of data + + --[[ This version of the code programs a single byte at a time but doesn't require + -- board specific functions in the firmware + print("This is slow as molasses, but gets the job done") + byte_num = 0 --current byte within the bank + while byte_num < bank_size do + + --read next byte from the file and convert to binary + byte_str = file:read(buff_size) + data = string.unpack("B", byte_str, 1) + + --write the data + --SLOWEST OPTION: no firmware specific functions 100% host flash algo: + --wr_flash_byte(base_addr+byte_num, data, false) --0.7KBps + --EASIEST FIRMWARE SPEEDUP: 5x faster, create firmware write byte function: + dict.snes("FLASH_WR_3V", base_addr+byte_num, data) --3.8KBps (5.5x faster than above) + + --if (verify) then + -- readdata = dict.nes("NES_CPU_RD", base_addr+byte_num) + -- if readdata ~= data then + -- print("ERROR flashing byte number", byte_num, " in bank",cur_bank, " to flash ", data, readdata) + -- end + --end + + byte_num = byte_num + 1 + end + --]] + + --Have the device write a banks worth of data + flash.write_file( file, bank_size/1024, "LOROM_3VOLT", "SNESROM", false ) + + cur_bank = cur_bank + 1 + end + + print("Done Programming ROM flash") + +end + + + +--Cart should be in reset state upon calling this function +--this function processes all user requests for this specific board/mapper +local function process( test, read, erase, program, verify, dumpfile, flashfile, verifyfile) + + local rv = nil + local file + + local snes_mapping = "LOROM" + --local snes_mapping = "HIROM" + + local ram_size = 0 + + --local rom_size = 32 + local rom_size = 512 + --local rom_size = 1024 + --local rom_size = 2048 + --local rom_size = 4096 + --local rom_size = 8192 + --local rom_size = 12288 + --local rom_size = 16384 + + + -- SNES memory map banking + -- A15 always high for LOROM (A22 is typically low too) + -- A22 always high for HIROM + -- A23 splits the map in half + -- A22 splits it in quarters (between what's typically low half and high half) + -- b 7 6 5 4 : 3 2 1 0 + -- A23 22 21 20 : 19 18 17 16 + + local first_bank --byte that contains A23-16 + + if (snes_mapping == "LOROM") then + -- LOROM typically sees the upper half (A15=1) of the first address 0b0000:1000_0000 + first_bank = 0x00 + elseif (snes_mapping == "HIROM") then + -- HIROM typically sees the last 4MByte as the first addresses = 0b1100:0000_0000 + first_bank = 0xC0 + end + + +--initialize device i/o for SNES + dict.io("IO_RESET") + dict.io("SNES_INIT") + + +--test cart by reading manf/prod ID + if test then + + print("Testing SNES board"); + + --SNES detect HiROM or LoROM & RAM + + --SNES detect if able to read flash ID's + if not rom_manf_id(true) then + print("ERROR unable to read flash ID") + return + end + end + +--dump the cart to dumpfile + if read then + print("\nDumping SNES ROM...") + + file = assert(io.open(dumpfile, "wb")) + + --dump cart into file + dump_rom(file, first_bank, rom_size, false) + + --close file + assert(file:close()) + print("DONE Dumping SNES ROM") + end + +--erase the cart + if erase then + + erase_flash() + end + + +--program flashfile to the cart + if program then + + --open file + file = assert(io.open(flashfile, "rb")) + --determine if auto-doubling, deinterleaving, etc, + --needs done to make board compatible with rom + + --flash cart + flash_rom(file, rom_size, true) + + --close file + assert(file:close()) + + end + +--verify flashfile is on the cart + if verify then + print("\nPost dumping SNES ROM...") + --for now let's just dump the file and verify manually + + file = assert(io.open(verifyfile, "wb")) + + --dump cart into file + dump_rom(file, first_bank, rom_size, false) + + --close file + assert(file:close()) + print("DONE Post dumping SNES ROM") + end + + dict.io("IO_RESET") +end + + +-- global variables so other modules can use them + + +-- call functions desired to run when script is called/imported + + +-- functions other modules are able to call +v2proto.process = process + +-- return the module's table +return v2proto diff --git a/host/scripts/snes/v3.lua b/host/scripts/snes/v3.lua index ca9b7a0..f0d1875 100644 --- a/host/scripts/snes/v3.lua +++ b/host/scripts/snes/v3.lua @@ -65,17 +65,17 @@ local function read_flashID( debug ) -- play_mode() --read manf ID - local manf_id = dict.snes("SNES_ROM_RD", 0x8000) + local manf_id = dict.snes("SNES_ROM_RD", 0x8000) --0x01 Cypress Manf ID if debug then print("attempted read SNES ROM manf ID:", string.format("%X", manf_id)) end --read prod ID - local prod_id = dict.snes("SNES_ROM_RD", 0x8002) + local prod_id = dict.snes("SNES_ROM_RD", 0x8002) --0x7E Prod ID S29GL if debug then print("attempted read SNES ROM prod ID:", string.format("%X", prod_id)) end - local density_id = dict.snes("SNES_ROM_RD", 0x801C) + local density_id = dict.snes("SNES_ROM_RD", 0x801C) --density 0x10=8MB 0x1A=4MB if debug then print("attempted read SNES density ID: ", string.format("%X", density_id)) end - local boot_sect = dict.snes("SNES_ROM_RD", 0x801E) + local boot_sect = dict.snes("SNES_ROM_RD", 0x801E) --boot sector 0x00=top 0x01=bottom if debug then print("attempted read SNES boot sect ID:", string.format("%X", boot_sect)) end --put cart in program mode @@ -115,10 +115,11 @@ local function process( test, read, erase, program, verify, dumpfile, flashfile, -- local snes_mapping = "LOROM" local snes_mapping = "HIROM" + local rom_size = 32 -- local rom_size = 512 -- local rom_size = 1024 -- local rom_size = 2048 - local rom_size = 4096 +-- local rom_size = 4096 -- local rom_size = 8192 -- local rom_size = 12288 -- local rom_size = 16384 diff --git a/shared/shared_dict_buffer.h b/shared/shared_dict_buffer.h index fbc3fbb..414fd0b 100644 --- a/shared/shared_dict_buffer.h +++ b/shared/shared_dict_buffer.h @@ -106,6 +106,20 @@ #define SNESROM 0x13 #define SNESRAM 0x14 + //Read specific sections of memory map + // 4KB/1KB naming designates the granularity of the starting address + // Any amount can be read, but unexpected behavior will result when reading past memory map limits + // designate the address base with mapper since this read is mapper independent + #define NESCPU_4KB 0x20 //mapper (bits 3-0) specifies A12-15 (4bits) + #define NESPPU_1KB 0x21 //mapper (bits 5-2) specifies A10-13 (4bits) + + //since the types above only specify the granularity of the read, there is no reason + //to limit it to 1-4KByte. May as well give page granularity and use the whole mapper byte! + #define NESCPU_PAGE 0x22 //mapper byte specifies A15-8 + #define NESPPU_PAGE 0x23 //mapper byte specifies A13-8 bits 6 & 7 can't be set + #define SNESROM_PAGE 0x24 //mapper byte specifies A15-8 + + //operand LSB //SST 39SF0x0 manf/prod IDs #define SST_MANF_ID 0xBF @@ -164,6 +178,12 @@ #define EXHIROM 2 //file starts at bank C0 #define SOROM 3 //12MB star ocean mapping + #define LOROM_5VOLT 4 //Catskull 5v SNES board with SST PLCC flash + #define HIROM_5VOLT 5 + + #define LOROM_3VOLT 6 + #define HIROM_3VOLT 7 + //set function //miscdata: buffer number diff --git a/shared/shared_dict_io.h b/shared/shared_dict_io.h index 20a5e1f..8e49cb4 100644 --- a/shared/shared_dict_io.h +++ b/shared/shared_dict_io.h @@ -36,7 +36,6 @@ //reset high disables SRAM and puts INL carts in PRGM mode #define SNES_INIT 2 - //SWIM protocol init //"single wire interface module" //different INL boards have this signal on different pins @@ -58,6 +57,14 @@ // don't define 0x00 to protect from forgetting to pass jtag lane #define JTAG_ON_EXP0_3 0x01 //Most NES carts with CPLDs + + +#define GAMEBOY_INIT 5 +#define GBA_INIT 6 +#define SEGA_INIT 7 +#define N64_INIT 8 + + //Test EXP0 drive with pull up //This is an important test if reling on pulling up EXP0 pin to drive the cart's pin. //EXP0 is used for various things and may have pull up/down of it's own or significant load diff --git a/shared/shared_dict_nes.h b/shared/shared_dict_nes.h index 4492a3f..bb0e6e1 100644 --- a/shared/shared_dict_nes.h +++ b/shared/shared_dict_nes.h @@ -45,6 +45,18 @@ #define DISC_PUSH_EXP0_PRGROM_WR 0x06 + +#define MMC3_PRG_FLASH_WR 0x07 +#define MMC3_CHR_FLASH_WR 0x08 +#define NROM_PRG_FLASH_WR 0x09 +#define NROM_CHR_FLASH_WR 0x0A +#define CNROM_CHR_FLASH_WR 0x0B //needs cur_bank & bank_table prior to calling +#define CDREAM_CHR_FLASH_WR 0x0C //needs cur_bank & bank_table prior to calling + + +#define SET_CUR_BANK 0x20 +#define SET_BANK_TABLE 0x21 + //============================================================================================= // OPCODES WITH OPERAND AND RETURN VALUE plus SUCCESS/ERROR_CODE //============================================================================================= @@ -61,13 +73,16 @@ #define NES_PPU_RD 0x82 //RL=3 //doesn't have operands just returns sensed CIRAM A10 mirroring -#define CIRAM_A10_MIRROR 0x83 //RL=3 -//returns VERT/HORIZ/1SCNA/1SCNB values: - #define MIR_1SCNA 0x10 - #define MIR_1SCNB 0x11 - #define MIR_VERT 0x12 - #define MIR_HORZ 0x13 +//#define CIRAM_A10_MIRROR 0x83 //RL=3 +////returns VERT/HORIZ/1SCNA/1SCNB values: +// #define MIR_1SCNA 0x10 +// #define MIR_1SCNB 0x11 +// #define MIR_VERT 0x12 +// #define MIR_HORZ 0x13 #define NES_DUALPORT_RD 0x84 //RL=3 +#define GET_CUR_BANK 0x85 //RL=3 +#define GET_BANK_TABLE 0x86 //RL=4 16bit value so 2 bytes need returned + #endif diff --git a/shared/shared_dict_snes.h b/shared/shared_dict_snes.h index e74b47c..a789169 100644 --- a/shared/shared_dict_snes.h +++ b/shared/shared_dict_snes.h @@ -28,6 +28,9 @@ //SNES reset is unaffected #define SNES_ROM_WR 0x02 +#define FLASH_WR_5V 0x03 //5v PLCC flash algo +#define FLASH_WR_3V 0x04 //3v TSSOP flash algo + diff --git a/shared/shared_errors.h b/shared/shared_errors.h index b35d7be..6f5ef2b 100644 --- a/shared/shared_errors.h +++ b/shared/shared_errors.h @@ -41,6 +41,7 @@ #define ERR_BUFF_RAW_ALREADY_ALLOC 193 #define ERR_BUFF_ALLOC_SIZE_ZERO 194 #define ERR_BUFF_UNSUP_MEM_TYPE 195 +#define ERR_BUFF_PART_NUM_RANGE 196 //#define ERR_OUT_CURLDBUF_STATUS 200 //#define ERR_OUT_CURLDBUF_TO_SMALL 201