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 df2677d..52cbc36 100644 Binary files a/firmware/build_avr/avr_kazzo.elf and b/firmware/build_avr/avr_kazzo.elf differ diff --git a/firmware/build_avr/avr_kazzo.hex b/firmware/build_avr/avr_kazzo.hex index 38a4f4d..21b32a8 100644 --- a/firmware/build_avr/avr_kazzo.hex +++ b/firmware/build_avr/avr_kazzo.hex @@ -1,4 +1,4 @@ -:100000000C9476000C9422170C9493000C9493009B +:100000000C9476000C94C5190C9493000C949300F6 :100010000C9493000C9493000C9493000C94930014 :100020000C9493000C9493000C9493000C94930004 :100030000C9493000C9493000C9493000C949300F4 @@ -13,10 +13,10 @@ :1000C00049006E00660069006E00690074006500FA :1000D0004E00650073004C006900760065007300F7 :1000E0002E0063006F006D000403090411241FBE7D -:1000F000CFEFD4E0DEBFCDBF11E0A0E0B1E0E2ED94 -:10010000F0E302C005900D92A630B107D9F723E0C5 -:10011000A6E0B1E001C01D92A13EB207E1F70E9446 -:1001200036180C9467180C94000080E00895089528 +:1000F000CFEFD4E0DEBFCDBF11E0A0E0B1E0E8E19A +:10010000F6E302C005900D92A630B107D9F723E0BF +:10011000A6E0B1E001C01D92A43EB207E1F70E9443 +:10012000D91A0C940A1B0C94000080E008950895DD :100130000F931F93CF93DF93EC01FB01D901009143 :100140004D0110914E01888187FF09C08E818C93EB :10015000442399F00481158180E883831DC08FEFCB @@ -30,12 +30,12 @@ :1001D000E02D8D818183E0916903F0916A0387812D :1001E0008E5F8783C801DF91CF911F910F91089592 :1001F000803D11F41C92CCCF8FEF8C9380E10E9454 -:10020000D810C6CFE0912501F0912601838181119C +:100200001B13C6CFE0912501F09126018381811156 :1002100006C0F0936A03E093690380E9B8CF883998 :1002200069F7E8CFE9E5F1E08FEF819391E0E936F6 :10023000F907D9F780934C0180932B0180934B01F0 :1002400080932A0180933C018093180180933B01A5 -:100250008093170181E00C94D810CF93DF93FC01B9 +:100250008093170181E00C941B13CF93DF93FC0173 :1002600050E0CA01820F911D4197E4F52223E1F18C :1002700083818F3FD9F582818F3FD1F5DA01A75A6B :10028000BE4FED0180E099919F3FA1F58F5F28134C @@ -83,702 +83,786 @@ :10052000E9F721E08934920769F021E088329207E7 :1005300061F021E08933920759F021E0853192077B :1005400069F7DBCF88E291E0089589E391E00895AF -:1005500085E191E008951F93CF93DF930E94DE1011 +:1005500085E191E008951F93CF93DF930E942113CB :10056000823D09F071C00E945C028093060189E41B -:1005700091E090932601809325010E94DE10823D38 +:1005700091E090932601809325010E942113823DF2 :10058000A1F4D09106018091250190912601C1E04E :10059000CD1708F45FC0909326018093250120E8D1 -:1005A000FC01238380ED0E94D8100E94DE10823F60 -:1005B00041F480EF0E94D810E0912501F0912601CE -:1005C00013820E94DE10C82F803DE1F48091250146 +:1005A000FC01238380ED0E941B130E942113823FD4 +:1005B00041F480EF0E941B13E0912501F091260188 +:1005C00013820E942113C82F803DE1F48091250100 :1005D00090912601FC0123812038A1F4609106014D :1005E0000E9473029093260180932501FC011782DB :1005F000C3830E944403E0912501F09126018823E2 -:1006000071F183830E94DE10182F803FC9F4C091DE +:1006000071F183830E942113182F803FC9F4C09198 :100610002501D09126018B81883991F460910601E2 :10062000CE010E9473029093260180932501FC0164 -:1006300013821B83CE010E942C0A8823C9F08B836E -:10064000DF91CF911F9108950E94DE10823F09F043 +:1006300013821B83CE010E94CC0A8823C9F08B83CE +:10064000DF91CF911F9108950E942113823F09F0FD :1006500094CF89CF6D2F0E947302CF5F99CF2085F1 :1006600080819181820F911D9183808388EDC9CF14 :1006700084EF8B83288588819981820F911D9983CE :100680008883DECF88E80895EF92FF920F931F933F -:10069000CF93DF93EC01E880F9801E2D89858231AC -:1006A00009F4F8C068F4803191F0813109F490C008 -:1006B00083ECDF91CF911F910F91FF90EF90089500 -:1006C000833109F4EAC0843199F780E0F2CF8D8557 -:1006D000813091F441E060E180E090E80E943B10BD -:1006E000B701B6E076956795BA95E1F76F7040E08F -:1006F00080E090EE0E943B108D858330A9F41E2D82 -:100700001F7B68817981A6E076956795AA95E1F7C8 -:10071000CB019927875992400E94F10E612F6068A2 -:100720000FEF2E814A8141C08E3161F41E2D1F7B57 -:1007300068817981F6E076956795FA95E1F780E032 -:1007400090ECEACF823211F08B3069F468817981C4 -:10075000660F672F661F770B7195CB0199278C5613 -:1007600091090E94F10E8D858C31B1F408811981B7 -:10077000000F012F001F110B119561E880E090E53B -:100780000E94F10E602F80E090E80E94F10E60E080 -:1007900080E090E50E94F10E8D851E2D8F3151F085 -:1007A00010680FEF2E814A81612F8C819D810E94FC -:1007B000920F6EC01F7810686881798144E0769549 -:1007C00067954A95E1F780E090E50E94F10EE9CF48 -:1007D0008D85811109C00FEF2E814A816E2D8C818C -:1007E0009D810E94CA0F8F838D858B30C1F46881F3 -:1007F000798135E0769567953A95E1F76295607F66 -:100800008FEF9FEF0E94F10E1E2D1F710FEF2E81B3 -:100810004A81612F8C819D810E94CA0F8F838D85B3 -:100820008E3FA9F46881798125E0769567952A95B0 -:10083000E1F78FEF9FE30E941B0F1F710FEF2E81D7 -:100840004A81612F8C819D810E9402108F838D854A -:10085000813009F03ACFE880F98094E0F694E7948B -:100860009A95E1F741E060E180E090E80E943B105A -:100870006E2D6F7140E080E090EA0E943B10612F86 -:100880006F700FEF2E814A818C819D810E94CA0F6B -:100890008F831BCF6E2D606643CF8D85811117C06E -:1008A0001E2D1068EE0CEF2CEE1CFF08F1946E2D3F -:1008B0008FEF84B965B95F9A5F9814B80FEF2E81F6 -:1008C0004A81612F8C819D810E942514E1CF813066 -:1008D00079F76F2D6F736064EBCF3F924F925F9209 -:1008E0006F927F928F929F92AF92BF92CF92DF9240 -:1008F000EF92FF920F931F93CF93DF934A01390139 -:10090000D8011796CC91D0E0462E512C542C44247B -:10091000D80116968C91169790E08C179D07A8F435 -:100920001796CC9380E0DF91CF911F910F91FF90AC -:10093000EF90DF90CF90BF90AF909F908F907F907F -:100940006F905F904F903F9008956AEAC401F7015D -:10095000099565E5C301F701099560EAC401F7014E -:100960000995CE0199275C01A428B528D8011496D1 -:10097000ED91FC911597E80FF91F6081C501F70112 -:1009800009950E940316C501F6010995382EC50187 -:10099000F60109953812F5CF2196BACF2F923F92E2 -:1009A0004F925F926F927F928F929F92AF92BF927F -:1009B000CF92DF92EF92FF920F931F93CF93DF932B -:1009C000CDB7DEB727970FB6F894DEBF0FBECDBF09 -:1009D000582E4A013C832B831F830E83D801179620 -:1009E0004C90042D10E070E0F62FEE27FA83E98397 -:1009F000252C312CF7E92F1AF2E03F0AAE81BF8196 -:100A000016968C91169790E080179107E0F4179650 -:100A10004C9280E027960FB6F894DEBF0FBECDBF94 -:100A2000DF91CF911F910F91FF90EF90DF90CF90CA -:100A3000BF90AF909F908F907F906F905F904F90FE -:100A40003F902F90089560E089E69DEF0E94F10E9F -:100A50006AEAC401F701099565E58B819C81F7017C -:100A6000099560EAC401F7010995652DC1010E944D -:100A7000F10E642C712CA980BA80A628B728AE810B -:100A8000BF811496ED91FC911597E60DF71D6081DD -:100A9000C501F70109950E940316C501F6010995E4 -:100AA000282FC5012D83F60109952D812813F3CF39 -:100AB000AE81BF8114968D919C911597680E791E19 -:100AC000F3018081281307C043940F5F1F4F519893 -:100AD000599A599893CF519A599A90CF2F923F9201 -:100AE0004F925F926F927F928F929F92AF92BF923E -:100AF000CF92DF92EF92FF920F931F93CF93DF93EA -:100B000000D000D01F92CDB7DEB7382E4A012901A0 -:100B10001D830C83D80117962C90022D10E070E0F5 -:100B2000F62FEE27FA83E983AC81BD8116968C916E -:100B3000169790E080179107D8F417962C9280E0D2 -:100B40000F900F900F900F900F90DF91CF911F910A -:100B50000F91FF90EF90DF90CF90BF90AF909F905C -:100B60008F907F906F905F904F903F902F9008955F -:100B700061E080E090EC0E94F10E6AEAC401F701A6 -:100B8000099560E080E090EC0E94F10E65E5C201FD -:100B9000F701099561E080E090EC0E94F10E60EAB7 -:100BA000C401F7010995632D80E090EC0E94F10EDD -:100BB000622C712CA980BA80A628B728AC81BD818F -:100BC0001496ED91FC911597E60DF71D6081C50116 -:100BD000F70109950E940316C501F6010995282F12 -:100BE000C5012B83F60109952B812813F3CFAC8126 -:100BF000BD8114968D919C911597680E791EF30115 -:100C00008081281307C023940F5F1F4F5198599A72 -:100C100059988ACF519A599A87CF2F923F924F92E3 -:100C20005F926F927F928F929F92AF92BF92CF927C -:100C3000DF92EF92FF920F931F93CF93DF9300D039 -:100C400000D01F92CDB7DEB7582E4A0119011D837F -:100C50000C83D80117964C90042D10E070E0F62F0D -:100C6000EE27FA83E983AC81BD8116968C911697A5 -:100C700090E080179107D8F417964C9280E00F907F -:100C80000F900F900F900F90DF91CF911F910F91C8 -:100C9000FF90EF90DF90CF90BF90AF909F908F909C -:100CA0007F906F905F904F903F902F90089540E01D -:100CB00060E180E090E80E943B106AEAC401F7011D -:100CC000099565E5C101F701099560EAC401F701DD -:100CD0000995A42CB12C69807A806A287B28AC8184 -:100CE000BD811496ED91FC911597EA0DFB1D608175 -:100CF000C301F701099541E060E180E090E80E94BE -:100D00003B1040E0652D80E090EE0E943B100E9479 -:100D10000316C301F6010995282FC3012B83F601A1 -:100D200009952B812813F3CFAC81BD8114968D9149 -:100D30009C911597A80EB91EF5018081281307C054 -:100D400043940F5F1F4F5198599A59988CCF41E0A7 -:100D500060E180E090E80E943B1040E0652D80E07B -:100D600090EE0E943B10519A599A7DCF3F924F923C -:100D70005F926F927F928F929F92AF92BF92CF922B -:100D8000DF92EF92FF920F931F93CF93DF93482E42 -:100D9000662E7A01E901DA0117965C90A52CB12C38 -:100DA0006AEA8AEA9AE8F901099565E585E595E830 -:100DB000FE01099560E28AEA9AE8FE010995712C24 -:100DC000762C6624D70116968C91169790E08A159A -:100DD0009B0520F517965C9260E980E090E8FE01A3 -:100DE000099560E080E090E8FE01099560EF80E001 -:100DF00090E8FE01099580E0DF91CF911F910F915E -:100E0000FF90EF90DF90CF90BF90AF909F908F902A -:100E10007F906F905F904F903F90089564E580E0E1 -:100E200090E50E94F10E852C912C6401C628D728EC -:100E300060EAC601FE010995D7011496ED91FC9177 -:100E40001597E80DF91D6081C601FE0109950E9404 -:100E50000316C601F8010995382EC601F801099557 -:100E60003812F5CFD70114968D919C911597880E65 -:100E7000991EF4018081381208C05394FFEFAF1A15 -:100E8000BF0A5198599A59989DCF61E880E090E542 -:100E90000E94F10E642D80E090E80E94F10E64E55E -:100EA00080E090E50E94F10E519A599A8BCF4F92B3 -:100EB0005F926F927F928F929F92AF92BF92CF92EA -:100EC000DF92EF92FF920F931F93CF93DF93662EE3 -:100ED0007A01E901DA0117965C90A52CB12C6AEA37 -:100EE0008AEA9AE8F901099565E585E595E8FE0144 -:100EF000099560E28AEA9AE8FE010995712C762C40 -:100F00006624D70116968C91169790E08A159B055A -:100F100018F517965C9260E980E090E8FE0109956B -:100F200060E080E090E8FE01099560EF80E090E8E5 -:100F3000FE01099580E0DF91CF911F910F91FF9005 -:100F4000EF90DF90CF90BF90AF909F908F907F9069 -:100F50006F905F904F900895852C912C6401C62866 -:100F6000D72860EAC601FE010995D7011496ED91D4 -:100F7000FC911597E80DF91D6081C601FE010995E8 -:100F80000E940316C601F8010995482EC601F80112 -:100F900009954812F5CFD70114968D919C9115971C -:100FA000880E991EF4018081481208C05394FFEF07 -:100FB000AF1ABF0A5198599A5998A3CF519A599A82 -:100FC000A0CF4F925F926F927F928F929F92AF923B -:100FD000BF92CF92DF92EF92FF920F931F93CF9326 -:100FE000DF93EA0169015F80A52CB12CE62EF12C7C -:100FF000FE2CEE248E8190E08A159B0598F45F828A -:1010000080E0DF91CF911F910F91FF90EF90DF90E3 -:10101000CF90BF90AF909F908F907F906F905F9098 -:101020004F9008956AEA85E595E1F601099565E531 -:101030008AEA9AE0F601099560EA85E595E1F6010C -:101040000995652C712C43018E289F28EC81FD8128 -:10105000E60DF71D6081C401F60109950E94031693 -:10106000C401F8010995482EC401F80109954812F8 -:10107000F5CF8C819D81680E791EF3018081481225 -:1010800008C05394FFEFAF1ABF0A5198599A599864 -:10109000B1CF519A599AAECF3F924F925F926F92D1 -:1010A0007F928F929F92AF92BF92CF92DF92EF92F8 -:1010B000FF920F931F93CF93DF93EA0169015F8043 -:1010C000A52CB12C482E429480EF4822E62EF12C1C -:1010D000FE2CEE248E8190E08A159B05A0F45F82A1 -:1010E00080E0DF91CF911F910F91FF90EF90DF9003 -:1010F000CF90BF90AF909F908F907F906F905F90B8 -:101100004F903F90089560E280E090E80E94F10ED9 -:101110006AEA85E595E1F601099560E180E090E8ED -:101120000E94F10E65E58AEA9AE0F601099560E20F -:1011300080E090E80E94F10E60EA85E595E1F60115 -:101140000995642D80E090E80E94F10E652C712CC9 -:1011500043018E289F28EC81FD81E60DF71D6081FB -:10116000C401F60109950E940316C401F80109950E -:10117000382EC401F80109953812F5CF8C819D8174 -:10118000680E791EF3018081381208C05394FFEF76 -:10119000AF1ABF0A5198599A59989CCF519A599AA7 -:1011A00099CF4F925F926F927F928F929F92AF9260 -:1011B000BF92CF92DF92EF92FF920F931F93CF9344 -:1011C000DF93662E7A01E901DA0117965C90A52C6F -:1011D000B12C6AEA8AEA9AE0F901099565E585E5A4 -:1011E00095E0FE01099560E28AEA9AE0FE01099520 -:1011F000712C762C6624D70116968C91169790E068 -:101200008A159B0518F517965C9260E980E090E0DE -:10121000FE01099560E080E090E0FE01099560EF35 -:1012200080E090E0FE01099580E0DF91CF911F9171 -:101230000F91FF90EF90DF90CF90BF90AF909F9075 -:101240008F907F906F905F904F900895852C912C98 -:101250006401C628D72860EAC601FE010995D701B6 -:101260001496ED91FC911597E80DF91D6081C6016A -:10127000FE0109950E940316C601F8010995482E42 -:10128000C601F80109954812F5CFD70114968D9142 -:101290009C911597880E991EF4018081481208C010 -:1012A0005394FFEFAF1ABF0A5198599A5998A3CF98 -:1012B000519A599AA0CF4F925F927F928F929F92AC -:1012C000AF92BF92CF92DF92EF92FF920F931F9354 -:1012D000CF93DF93A62E6A01E901DA011796EC900D -:1012E000F12CA895000000000000000000000000A4 -:1012F0000000000000006AEA8AEA9AE8F90109950C -:1013000065E585E595E8FE01099560E28AEA9AE8D7 -:10131000FE010995B12CBA2CAA24D60116968C91FF -:10132000169790E08E159F0518F51796EC9260E9D8 -:1013300080E090E8FE01099560E080E090E8FE0121 -:10134000099560EF80E090E8FE010995000080E0DB -:10135000DF91CF911F910F91FF90EF90DF90CF9091 -:10136000BF90AF909F908F907F905F904F90089527 -:1013700080EA0E9418142701552442018A289B28DC -:10138000D6011496ED91FC911597E40DF51D608141 -:10139000C401FE01099500000000000000000000EB -:1013A0000000000000000000A8950E940316C40180 -:1013B000F8010995782E00000000000000000000F0 -:1013C0000000000000000000D6011496ED91FC9191 -:1013D0001597E40DF51D80817816B9F00000000026 -:1013E0000000000000000000000000000000C40138 -:1013F000F801099578120DC00000000000000000FF -:1014000000000000000000000000FFEFEF1AFF0ADC -:1014100084CF000000000000000000000000000079 -:1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC -:101440000000000000000000000000000000C401D7 -:10145000F8010995782ECBCF8F929F92AF92BF92D1 -:10146000CF92DF92EF92FF920F931F93CF93DF9370 -:10147000EC0188809980B82C8985823169F038F434 -:101480008031C1F0813109F437C183EC06C083316A -:1014900009F46CC18431C9F780E0DF91CF911F91CD -:1014A0000F91FF90EF90DF90CF90BF90AF909F9003 -:1014B0008F9008958D85811111C01FEDC12E1EE002 -:1014C000D12E07EAE02E0EE0F02E8E012AEA3AE253 -:1014D00045E555E5682D60680E946D048D85813075 -:1014E00041F588819981F6E096958795FA95E1F71F -:1014F000282F2F70A22E41E060E180E090E80E944A -:101500003B1040E06A2D80E090EE0E943B10AFED72 -:10151000CA2EAEE0DA2EB1EFEB2EBEE0FB2E8E012E -:101520002AEA3AEA45E555ED682D60688A2D0E9461 -:101530000D068D858330D1F4682D6F736068B62EEB -:101540008881998156E0969587955A95E1F77FEDC8 -:10155000C72E7EE0D72EE7EAEE2EEEE0FE2E8E01BD -:101560002AEA3AE245E555E50E94CE048D858D3F95 -:10157000D1F46B2D6F736068B62E8881998126E057 -:10158000969587952A95E1F73FEDC32E3EE0D32E41 -:1015900046EBE42E4EE0F42E8E012AEA3AE245E5CF -:1015A00055E50E94CE048D858E31D1F46B2D6F737D -:1015B0006068B62E88819981B6E096958795BA9530 -:1015C000E1F71FEDC12E1EE0D12E01EFE02E0EE05F -:1015D000F02E8E012AEA3AEA45E555E90E946E05A9 -:1015E0008D85823211F08B30F9F468817981660F34 -:1015F000672F661F770B7195CB0199278C56910940 -:101600000E94F10EFFEDCF2EFEE0DF2EA7EAEA2EBC -:10161000AEE0FA2E8E012AEA3AE245E555E56B2D59 -:10162000606880E00E946D048D858C3031F56B2DF3 -:101630006F716068B62E8880998055E09694879483 -:101640005A95E1F765EA80E090E60E94F10E682D78 -:101650008FEF9FEF0E94F10E6FEDC62E6EE0D62E3B -:1016600071EFE72E7EE0F72E8E012AEA3AEA45E591 -:1016700055ED6B2D80E00E946D048D858C3101F558 -:1016800088809980880C892C881C9908919461E83D -:1016900080E090E50E94F10E682D80E090E80E94C5 -:1016A000F10E64E580E090E50E94F10E0FED1EE082 -:1016B00021EF3EE0AE016B2D6068882D0E94B606DA -:1016C0008D858F3109F0E8CE8880998034E096943A -:1016D00087943A95E1F7682D80E090E50E94F10E3D -:1016E0006B2D6F7860680FED1EE021EF3EE0AE01DC -:1016F000882D0E945707D0CE8D85811108C007E044 -:101700001FE02BE13FE0AE01682D0E94E1078D85CF -:101710008B3091F4882D8F71B82E8881998125E0C6 -:10172000969587952A95E1F707E01FE02BE13FE0CA -:10173000AE016B2D0E944C088D858E3F09F0ACCE1A -:101740006881798195E0769567959A95E1F78FEFB5 -:101750009FE30E941B0F6B2D6F710FE21FE021E4CE -:101760003FE0AE0180E00E94D10896CE8D858111C8 -:1017700019C0282D2068B22E880C892C881C990845 -:101780009194682D8FEF84B965B95F9A5F9814B80A -:101790000CEC13E126EE33E1AE016B2D80E00E94EC -:1017A0005B097ACE813071F7692D6F736064EACF7F -:1017B000882321F0813041F480E0089591E0F9011F -:1017C00090839AEA918308958FEA08958AEA0895AA -:1017D0000895882321F0813041F480E0089591E05C -:1017E000F90190839AEA9183089580EB08958AEA3B -:1017F0000895089514B88FEF85B93F9A479881B935 -:1018000011B882B914B885B914B885B93898409A16 -:101810003998419A3A98429A3C98449A3D98459A08 -:101820003E98469A53985B9A55985D9A3B98439A8E -:101830003F98479A57985F9A509858985198599A54 -:1018400008950E94FA0B399A419A389A40983A9A28 -:10185000429A3C9A449A3D9A459A14B88FEF85B9BA -:1018600014B885B914B885B93F9A479881B912B8A8 -:1018700084B915B8479A479814B808950E94FA0B8E -:10188000399A419A3C9A449A3D9A459A589A509A64 -:1018900014B88FEF85B914B885B914B885B93F9AD3 -:1018A000479881B912B884B915B8479A479814B8BF -:1018B00014B885B9579A5F9884B915B85F9A5F983C -:1018C00014B80895823081F0833061F08130A1F442 -:1018D0000898109A1092B60380E290E09093B503B6 -:1018E0008093B40380E008955098589A88E08093DC -:1018F000B60389E290E0F2CF87E90895813049F498 -:1019000014B88FEF85B9579A5F980E94F70C80E062 -:10191000089588E908955898509A000089B1509820 -:10192000589880FD22C05098589A59B149B100008A -:1019300039B10000000029B100000000000099B199 -:10194000000000000000000089B15098589850FD38 -:101950000EC040FD0EC030FD0EC020FD0EC090FD3B -:101960000EC080FD0EC080EE089580EF089580E0E7 -:10197000089581E0089583E0089586E008958AE05F -:1019800008958FE008950F931F93CF93C82F842F4E -:101990008901C230F9F030F4CC2389F0C130B1F0C4 -:1019A000C6E90FC0C430F1F0C0F0C038C9F781E01B -:1019B000F90180830E948B0CF801818309C00E9489 -:1019C000FA0B8C2FCF911F910F9108950E94210C3B -:1019D000C0E0F7CF0E943E0CFBCFCF911F910F913B -:1019E0000C94620CCF911F910F910C947E0C10926D -:1019F00014018FEF84B915B85F9A5F9814B85098A6 -:101A0000589A80E880936C0310927A03EBE7F3E036 -:101A1000119283E0EB39F807D9F7089560917A03C2 -:101A2000813109F441C0109214019FEF94B9909153 -:101A3000140195B95F9A5F9814B820E070E03FEF09 -:101A40008032C9F4E72FF0E0E558FC4F408150E0C8 -:101A5000022E02C0559547950A94E2F740FF28C030 -:101A600092E034B995B95F9A5F9814B82F5F283027 -:101A700011F47F5F20E0492F446034B945B95F9A83 -:101A80005F9814B8615034B995B95F9A5F9814B8EB -:101A90006111D6CF909314014093270134B915B842 -:101AA0005F9A5F9814B8089592E090931401BDCFA7 -:101AB00090E0D7CF0F931F93CF93DF9350917A038A -:101AC000B0917B03813109F46BC0109214019FEF38 -:101AD00094B99091140195B95F9A5F9814B820E079 -:101AE00030E07FEFC1E0D0E0803281F4EB2FF0E016 -:101AF000022E02C0F595E7950A94E2F7E0FF54C084 -:101B0000916074B995B95F9A5F9814B86032B1F476 -:101B1000211105C0E32FF0E0E558FC4F1082489BEF -:101B20000DC0E32FF0E0E558FC4FA0818E01022E9E -:101B300001C0000F0A94EAF7A02BA0835150442360 -:101B400041F0511106C0926074B995B95F9A5F98DF -:101B500014B8A92FA46074B9A5B95F9A5F9814B896 -:101B600074B995B95F9A5F9814B82F5F283039F42B -:101B70003F5FE32FF0E0E558FC4FB08120E05111CA -:101B8000B3CF90931401A09327018FEF84B915B8B8 -:101B90005F9A5F9814B8DF91CF911F910F910895CC -:101BA00091E09093140193CF9E7FABCF80916C0313 -:101BB0008338D1F580916D03883009F463C0C0F497 -:101BC000833009F445C030F4813079F18230A1F1DD -:101BD0008EEE28C0863009F44AC008F04EC084302A -:101BE000B9F781E880936C0341E060E281E136C09F -:101BF0008F30C1F148F48D3031F18E3049F781E8F2 -:101C000080936C0340E028C0803849F08F3F49F052 -:101C10008031F1F681E880936C0340E02CC00C9495 -:101C2000F70C80EF80936C03089581E880936C0338 -:101C300080E20E940E0D14C081E880936C0341E0A5 -:101C400060E080E20BC081E880936C0340E0F8CF55 -:101C500081E880936C0341E060E280E10E945A0DCC -:101C600082E8E0CF81E880936C0340E0BECF81E85A -:101C700080936C0341E060E2E4CF81E880936C03E1 -:101C800080E1D7CF81E880936C0381E1D2CFCF93FD -:101C9000DF93E901843061F138F48230E1F008F536 -:101CA0008130A1F087E80FC0873039F128F4853002 -:101CB000C9F740937A0306C0883021F1803891F744 -:101CC0000E94F70C80E0DF91CF91089590916D0311 -:101CD00099838883F7CF40936D0383E880936C03E7 -:101CE000F1CF40936D0383E880936C030E94D60D7F -:101CF00080916C03898381E0ECCF40937B03509308 -:101D00007C03E0CF80917B03898380917C038A836D -:101D100080917D038B8380917E038C8380917F03F0 -:101D20008D83809180038E8386E0D3CF882321F03A -:101D3000813041F480E0089591E0F90190839AEABE -:101D40009183089582EB08958AEA0895089582B9EF -:101D50008FEF84B995B9479A479814B884B965B993 -:101D6000509A58985098589A14B8089582B98FEF9D -:101D700084B995B9479A479814B884B965B9509A07 -:101D80005898589A14B80895509858984098419A7D -:101D9000429A82B92FEF24B995B9479A479814B857 -:101DA00000000000409A97FD4198000000000000EC -:101DB00000000000000083B14098419A089582B964 -:101DC0002FEF24B995B9479A479814B8409A97FDD0 -:101DD0004198000000000000000083B14098419A43 -:101DE00008955098589882B92FEF24B995B9479A19 -:101DF000479814B8429824B965B9409A97FD41981C -:101E0000000000004098419A429A14B80895811544 -:101E100020E2920708F4906882B98FEF84B995B9EF -:101E2000479A479814B8449800000000000000004A -:101E300083B1449A0895811520E2920708F49068CE -:101E400082B98FEF84B995B9479A479814B884B985 -:101E500065B9000045980000459A14B8089582B904 -:101E60008FEF84B995B9479A479814B8409A41982A -:101E7000449800000000000083B1449A4098419AC1 -:101E8000089582B98FEF84B995B9479A479814B8E5 -:101E90004098419884B965B9000045980000459A7A -:101EA00014B8419A089512B82FEF24B988E085B983 -:101EB000479A479814B889B1807290E024B924E019 -:101EC00025B9479A479814B829B1207230E041E00B -:101ED0002115310509F040E061E0009709F060E06C -:101EE000442311F0611116C051E0232B09F450E096 -:101EF00021E0892B09F420E0552311F021110CC0B9 -:101F0000662311F051110AC0442311F0211108C0B9 -:101F10008FEF089580E1089581E1089582E10895A9 -:101F200083E10895EF92FF920F93CF93DF9300D058 -:101F30001F92CDB7DEB77C018FEF84B965B9479AA0 -:101F4000479814B8409A67FD419842B9000080E074 -:101F5000011117C00000000093B1F701E80FF11D57 -:101F600090834F5F42B98F5F281790F74098419A4E -:101F70000F900F900F90DF91CF910F91FF90EF9006 -:101F800008952B834A8389830E94031689814A819D -:101F90002B81E2CFEF92FF920F93CF93DF9300D08C -:101FA0001F92CDB7DEB77C01603208F460688FEF16 -:101FB00084B965B9479A479814B8449842B9000063 -:101FC00080E0011116C00000000093B1F701E80F96 -:101FD000F11D90834F5F42B98F5F281790F7449AA5 -:101FE0000F900F900F90DF91CF910F91FF90EF9096 -:101FF00008952B834A8389830E94031689814A812D -:102000002B81E3CFEF92FF920F93CF93DF9300D01A -:102010001F92CDB7DEB77C018FEF84B965B9479ABF -:10202000479814B8409A4198449842B9000080E01B -:10203000011118C00000000093B1F701E80FF11D75 -:1020400090834F5F42B98F5F281790F7449A40986A -:10205000419A0F900F900F90DF91CF910F91FF90C9 -:10206000EF9008952B834A8389830E940316898108 -:102070004A812B81E1CF0F931F93CF93DF938C0184 -:10208000D62F442349F080E090E80E94DF0E60E8FC -:1020900080E090E80E94F10EC5E0C8010E94DF0ECA -:1020A0006D2FC8010E94F10ED695C150B1F7DF9196 -:1020B000CF911F910F9108950F931F93CF93C82F26 -:1020C000CA018901C63079F180F4C23099F130F447 -:1020D000CC2311F1C13059F1C0EA20C0C43069F1FC -:1020E000C530D1F70E94410F20C0C23891F150F4A1 -:1020F000C03839F1C13881F721E0F80120830E940E -:10210000DF0E24C0C33859F1C43831F721E0F8019B -:1021100020830E942F0F1AC00E94A70E8C2FCF91F0 -:102120001F910F9108950E94B60EC0E0F7CF0E9454 -:102130001B0FFBCF0E94F10EF8CF40E00E943B1036 -:10214000F4CF21E0F80120830E94C40EF8018183BE -:10215000ECCF21E0F80120830E94070FF7CF81E048 -:10216000F90180830E94530FF1CFCF93DF93FB01DE -:10217000DC0112962C91222329F0203479F082ED93 -:10218000808308C01082A0910201B0910301EC018C -:102190008C818C93CF01DF91CF910895108281E0E3 -:1021A0008183A0910201B09103018C918283F2CFCF -:1021B000E0910201F091030180830895E091020112 -:1021C000F0910301808108950F931F93D901082F87 -:1021D00010E00831110508F0C2C2F801EE50FF4EC0 -:1021E0000C9461182C110A116711C2110E125A12A7 -:1021F000A612511356135B135E13621365136D130E -:10220000751379137C1380138913901394139C1303 -:10221000A313A7134631510508F0A3C2FA01ED5EDE -:10222000FE4E0C94611829112F11331137113B11F7 -:102230003F11431147114B114F11531157115B11AE -:102240005F11B113B113B113B113B113B113B113C2 -:1022500063113898409A80E01F910F910895399842 -:10226000419A80E0F9CF3A98429A80E0F5CF3B98C6 -:10227000439A80E0F1CF3C98449A80E0EDCF3D98BE -:10228000459A80E0E9CF3E98469A80E0E5CF3F98B6 -:10229000479A80E0E1CF5098589A80E0DDCF51987E -:1022A000599A80E0D9CF53985B9A80E0D5CF559862 -:1022B0005D9A80E0D1CF56985E9A80E0CDCF579856 -:1022C0005F9A80E0C9CF5098589A80E0C5CF4631D8 -:1022D000510508F048C2FA01E059FE4E0C9461180D -:1022E00086118A118E11921196119A119E11A211C6 -:1022F000A611AA11AE11B211B611BA11B313B313CC -:10230000B313B313B313B313B313BE113898409878 -:1023100080E0A2CF3998419880E09ECF3A984298C9 -:1023200080E09ACF3B98439880E096CF3C984498C1 -:1023300080E092CF3D98459880E08ECF3E984698B9 -:1023400080E08ACF3F98479880E086CF5098589891 -:1023500080E082CF5198599880E07ECF53985B9867 -:1023600080E07ACF55985D9880E076CF56985E9859 -:1023700080E072CF57985F9880E06ECF5098589861 -:1023800080E06ACF4631510508F0EFC1FA01E5530C -:10239000FE4E0C946118E111E411E711EA11ED1100 -:1023A000F011F311F611F911FC11FF1102120512CF -:1023B0000812B513B513B513B513B513B513B5138B -:1023C0000B12389A80E048CF399A80E045CF3A9A8C -:1023D00080E042CF3B9A80E03FCF3C9A80E03CCF08 -:1023E0003D9A80E039CF3E9A80E036CF3F9A80E038 -:1023F00033CF509A80E030CF519A80E02DCF539A5E -:1024000080E02ACF559A80E027CF569A80E024CFEB -:10241000579A80E021CF509A80E01ECF4631510577 -:1024200008F0A5C1FA01E95EFD4E0C9461182D1269 -:1024300030123312361239123C123F124212451238 -:1024400048124B124E1251125412B713B713B7134E -:10245000B713B713B713B7135712409880E0FCCEE9 -:10246000419880E0F9CE429880E0F6CE439880E033 -:10247000F3CE449880E0F0CE459880E0EDCE4698CB -:1024800080E0EACE479880E0E7CE589880E0E4CE3E -:10249000599880E0E1CE5B9880E0DECE5D9880E0E8 -:1024A000DBCE5E9880E0D8CE5F9880E0D5CE58989D -:1024B00080E0D2CE4631510508F05BC1FA01ED59FA -:1024C000FD4E0C94611879127C127F1282128512D3 -:1024D00088128B128E129112941297129A129D12D8 -:1024E000A012B913B913B913B913B913B913B913A6 -:1024F000A312409A80E0B0CE419A80E0ADCE429ADD -:1025000080E0AACE439A80E0A7CE449A80E0A4CE91 -:10251000459A80E0A1CE469A80E09ECE479A80E020 -:102520009BCE589A80E098CE599A80E095CE5B9ADF -:1025300080E092CE5D9A80E08FCE5E9A80E08CCE75 -:102540005F9A80E089CE589A80E086CE82E08C93B4 -:102550004631510508F0A2C0FA01EF54FD4E0C942B -:102560006118C712D012D912E212EB12F412FD1246 -:1025700006130F13181321132A1333133C134E138E -:102580004E134E134E134E134E134E13451386B176 -:10259000817011968C93119712961C9280E05CCEFC -:1025A00086B1827090E012969C938E93119780E092 -:1025B00053CE86B1847090E012969C938E931197BF -:1025C00080E04ACE86B1887090E012969C938E93FC -:1025D000119780E041CE86B1807190E012969C9375 -:1025E0008E93119780E038CE86B1807290E012967B -:1025F0009C938E93119780E02FCE86B1807490E0EB -:1026000012969C938E93119780E026CE86B18078A7 -:1026100090E012969C938E93119780E01DCE89B125 -:10262000817011968C93119712961C9280E014CEB3 -:1026300089B1827090E012969C938E93119780E0FE -:102640000BCE89B1887090E012969C938E9311976F -:1026500080E002CE89B1807290E012969C938E93B6 -:10266000119780E0F9CD89B1807490E012969C9327 -:102670008E93119780E0F0CD89B1807890E012962A -:102680009C938E93119780E0E7CD89B1817011966C -:102690008C93119712961C9280E0DECD1C928DE8EF -:1026A000DBCD14B88FEF85B980E0D6CD14B88FEFAD -:1026B00085B980E0D1CD14B880E0CECD8FEF84B95C -:1026C00080E0CACD45B980E0C7CD83B111968C9327 -:1026D000119781E08C9380E0BFCD14B88FEF85B95E -:1026E0003F9A479881B980E0B7CD8FEF82B980E0FB -:1026F000B3CD11B880E0B0CD8FEF81B980E0ACCD23 -:1027000042B98FEF84B955B9479A479814B880E019 -:10271000A3CD14B88FEF85B9579A5F9880E09CCD10 -:1027200057985F9A80E098CD8FEF84B945B95F9A4A -:102730005F9814B880E090CD14B88FEF85B9579AA0 -:102740005F9880E089CD57985F9A80E085CD8FEFC4 -:1027500084B945B95F9A5F9814B880E07DCD8CE864 -:102760007BCD8DE879CD8DE877CD8DE875CD8DE881 -:1027700073CD8DE871CD882321F0813041F480E064 -:10278000089591E0F90190839AEA9183089581EB8D -:1027900008958AEA0895089582B98FEF84B995B9AA -:1027A000479A479814B841984498000000000000E8 -:1027B0000000000000000000000000000000000019 -:1027C0000000000083B1449A419A089582B98FEFC6 -:1027D00084B995B9479A479814B884B965B94598AA -:1027E00041980000000000000000459A419A14B88A -:1027F0000895CF93DF93952FE901813099F020F070 -:10280000823059F08AEA06C09FEF94B945B95F9AC1 -:102810005F9814B8DF91CF910895842F0E94E6133A -:1028200080E0F8CF8883842F0E94CC138983F8CF6F -:102830009FEF94B985B945984198000000000000C9 -:102840000000459A419A14B80895EF92FF920F93B1 -:10285000CF93DF9300D01F92CDB7DEB77C018FEF0F -:1028600084B965B9479A479814B84498419842B9D1 -:1028700080E0011119C0000000000000000093B1C9 -:10288000F701E80FF11D90834F5F42B98F5F281762 -:1028900080F7449A419A0F900F900F90DF91CF915B -:1028A0000F91FF90EF9008952B834A8389830E94B4 -:1028B000031600000000000089814A812B81DFCFD0 -:1028C000880F991F880F991F20E030E028173907DB -:1028D00009F40895000000002F5F3F4FF7CF20E07C -:1028E00030E02817390709F40895000000002F5F31 -:1028F0003F4FF7CFCF93DF9380E190E00E946014C9 -:10290000C4E0D0E084EF91E00E94601484EF91E095 -:102910000E9460142197B1F7C4E0D0E08AEF90E004 -:102920000E9460148AEF90E00E9460142197B1F732 -:10293000DF91CF91089580E190E00C946014CF93E3 -:10294000DF931F92CDB7DEB7F901813171F038F412 -:102950008130C1F078F08230C9F082E80FC0813256 -:10296000A9F0823299F08231C1F782E0808312822D -:1029700011820AC089830E947A1489810F90DF91A5 -:10298000CF9108950E949B1480E0F8CF81E080836E -:102990001182FACF482F90E0982F882720E041112C -:1029A00003C021118068089520953FEF340F432321 -:1029B000F6CF80E090E0089580E0089560E070E058 -:1029C000CB010895CF93DF931F92CDB7DEB7DC0123 -:1029D0008FEF809307011092080187E091E09093B8 -:1029E000C6038093C50316968C911697898311961A -:1029F000EC9111974E2F50E0FA013197EF30F1052D -:102A000008F0D7C0EA5FFA4E0C9461181515251529 -:102A100033154115BF15D915D01587159515A31573 -:102A2000B1154F155D156B15791514964D915C9187 -:102A3000159728E031E013966C91139712968C91BC -:102A40000E94E41080930701A6C014964D915C91FA -:102A5000159728E031E013966C91139712968C919C -:102A60000E94C30CEFCF14964D915C91159728E00E -:102A700031E013966C91139712968C910E945C1022 -:102A8000E1CF14964D915C91159728E031E01396B3 -:102A90006C91139712968C910E94F913D3CF1496D0 -:102AA0004D915C91159728E031E013966C91139746 -:102AB00012968C910E94D80BC5CF14964D915C91C3 -:102AC000159728E031E013966C91139712968C912C -:102AD0000E94E90BB7CF14964D915C91159728E0B1 -:102AE00031E013966C91139712968C910E94BB1350 -:102AF000A9CF14964D915C91159728E031E013967B -:102B00006C91139712968C910E94960E9BCF1496FF -:102B10004D915C91159728E031E013966C911397D5 -:102B200012968C910E949F148DCF14964D915C91BA -:102B3000159728E031E013966C91139712968C91BB -:102B40000E94470E7FCF14964D915C91159728E017 -:102B500031E013966C91139712968C910E94950018 -:102B600071CF14964D915C91159728E031E0139642 -:102B70006C91139712968C910E94420363CFAE0121 -:102B80004F5F5F4F67E071E0CD010E947C01909341 -:102B9000C6038093C50389810F90DF91CF9108957B -:102BA000AE014F5F5F4F67E071E0CD010E94B5104D -:102BB000EECF80E847CFE0916903F0916A03278167 -:102BC00044815581322F360F231312C0E0916903DF -:102BD000F0916A038781860F878380913801861B75 -:102BE0008093380181110DC088E9838381E00895C5 -:102BF000FC017191CF01FA01E20FF11D70832F5F8B -:102C0000E3CF80E00895CF93DF936091C7036350D3 -:102C100067FD91C08091C403CCE0D0E0C81BD1090E -:102C2000C553DC4F8091C3038D3209F0CFC06830AB -:102C300009F07FC083EC8093B7038AE58093050198 -:102C400010920F018881807679F0CE010E94E21403 -:102C50008F3F09F466C09F81911169C09E819817CA -:102C600008F065C0892F63C02A811092C003998142 -:102C700091110AC01092C10320EC33E082E030933E -:102C8000C6032093C503E7CF953029F42093C803EA -:102C900020EC33E0F4CF963099F59B81913059F4D4 -:102CA0008EE890E09093C6038093C50382E190E4A0 -:102CB00090930F01D0CF923019F48CE790E0F2CFCF -:102CC0009330A9F7211108C088EE90E09093C603D5 -:102CD0008093C50384E0EBCF213041F48EEB90E08C -:102CE0009093C6038093C5038AE2E1CF2230F9F6C0 -:102CF00080EA90E09093C6038093C5038EE1D7CF1E -:102D0000983059F0993019F42093CA03C1CF81E06B -:102D10009A3009F4BDCF80E0BBCF2AEC33E081E0EC -:102D2000AECF988197FD8E8190E890930F018093AC -:102D300004011092C7038091050184FF3AC080917D -:102D400004018F3FB1F1C82F893008F0C8E08C1B17 -:102D5000809304018091B70398E889278093B70393 -:102D6000CC23D1F08091C5039091C60320910F012F -:102D700026FF3FC0A8EBB3E0FC012C2F34913D931C -:102D800031962150D9F701962FEF2C0F820F911D0C -:102D90009093C6038093C5036C2F88EB93E00E9449 -:102DA0001E17CC5FCC3019F08FEF80930401C093D5 -:102DB000050184E199B1947131F48150D9F71092F1 -:102DC000C8031092C203DF91CF91089580910F0143 -:102DD00087FFAFCFCE010E94DB158F3F21F48EE13C -:102DE00080930501A6CF882309F4A3CF1092040194 -:102DF000A0CFE8EBF3E0DC012C2F3D913193215083 -:102E0000E1F7C1CFE9E6F0E0808182608083E89A53 -:102E10000895A82FB92F80E090E041E050EA609536 -:102E200030E009C02D9182279795879510F084276F -:102E30009527305EC8F36F5FA8F30895EADF8D939E -:102E40009D930895CF93CFB7CF93DF93C3954C9BBA -:102E5000E9F74C9B0BC04C9B09C04C9B07C04C9B9B -:102E600005C04C9B03C04C9B01C089C06F93C091AF -:102E7000C403DD27C553DC4F2F9365E54C9B03C08E -:102E80002F916F91E6CF0F931F934F9320E040E176 -:102E90005F9309B1047104FB27F93F9350E03BE0D5 -:102EA00039C0147140642F77012F5F5F1EC04068E6 -:102EB00019B114712F7752501FC0406409B12F7798 -:102EC0000471D1F15F5F00C023C0406219B12F7758 -:102ED000147191F15F5F00C025C00471102751503B -:102EE00012F45D5F0000115027952C3F19B1C8F610 -:102EF00014710127015027952C3FC8F642274993AA -:102F000009B1047110274F73115027952C3FA8F673 -:102F10004695469519B1147179F00127015027950E -:102F20002C3F98F66B5A60F3315009B1B0F600C0EF -:102F300011E01CBB002717C03B503195C31BD0408C -:102F400011E01CBB0881033CF9F00B34E9F020913F -:102F5000C2031981110F1213EDCF093651F10D3251 -:102F600011F0013E39F70093C9033F915F914F91F2 -:102F70001F910F912F916F91CCB3C0FD67CFDF915F -:102F8000CF91CFBFCF9118952091C903222369F328 -:102F90001091C703112339F534303AF13093C70348 -:102FA0002093C3031091C4033BE0311B3093C4034F -:102FB0001CC00091C7030130B4F40AE5309105014B -:102FC00034FD14C000930501C7EBD3E013C00527FF -:102FD00010E000C000000BB91AC0052710E0221F46 -:102FE0001DC010E021C04AE502C032ED432FC4E10C -:102FF000D0E032E01AB114615C9A0BB11AB954E115 -:1030000020E865E320FF05270BB9279517951C3F9E -:10301000F0F66695B8F7B1F720FF05270BB92795AD -:1030200017951C3FD0F62795179517FF0527000029 -:103030001C3F0BB9B0F629913A9519F70B7E109108 -:10304000C803110FC651D0400BB911F01093C20341 -:1030500011E01CBB00611AB11B7E402F4B7E54E077 -:103060005A95F1F70BB91AB94BB97FCF9EE088E1B9 -:103070000FB6F894A895809360000FBE90936000FF -:103080000E940217549A80E0815099F454987894E1 -:103090000E94FA0B80EF80936C03A8950E940316A0 -:1030A0000E94AB0280916C03803FB9F30E94D60D61 -:1030B000F4CFA895EFE9FFE03197F1F700C00000E9 -:1030C000E3CFEE0FFF1F0590F491E02D0994F894E3 -:0230D000FFCF30 -:0630D20069019B03FF5A97 +:10069000CF93DF93EC0108811981F02EE9858E2F2D +:1006A00090E0FC017097E531F10508F004C1E55ACE +:1006B000FC4F0C94041BA10307043B043E0481037C +:1006C0005B045B045B045B045B045B045B045B0432 +:1006D0005B045B045B047003830391039303970340 +:1006E0006D85603108F0EFC080E1689FB001112492 +:1006F000602B0FEF2E814A818C819D810E945710C3 +:100700008F8380E0D9C06D85862F837C8111DBC00B +:10071000602B0FEF2E814A818C819D810E948F106A +:10072000EFCF6D85E5CF6D85862F807CEFCF6D8512 +:10073000602B0FEF2E814A818C819D810E9449168A +:10074000DFCF8D85813091F441E060E180E090E879 +:100750000E940011B801F6E076956795FA95E1F7E9 +:100760006F7040E080E090EE0E9400118D85833034 +:1007700089F40F7B68817981E6E076956795EA9543 +:10078000E1F7CB019927875992400E94F50F602F1E +:100790006068AFCF8E3159F40F7B6881798156E064 +:1007A000769567955A95E1F780E090ECEECF8C3125 +:1007B000B1F4E880F980EE0CEF2CEE1CFF08F19408 +:1007C00061E880E090E50E94F50F6E2D80E090E8F2 +:1007D0000E94F50F60E080E090E50E94F50F8D85A6 +:1007E000102F8F3131F010680FEF2E814A81612F69 +:1007F00083CF1F7810686881798134E0769567959A +:100800003A95E1F780E090E50E94F50FEDCF8D85F8 +:100810008E3FB1F4B80125E0769567952A95E1F70A +:100820008FEF9FE30E941F10802F8F71F82E0FEF24 +:100830002E814A81682F8C819D810E94C7108F83F1 +:100840008D85813009F05DCF0881198194E016957E +:1008500007959A95E1F741E060E180E090E80E9419 +:100860000011602F6F7140E080E090EA0E9400115B +:100870006F2D6F704ECF602F60663BCF8D858111DD +:1008800014C0802F8068F82EB801660F672F661F8E +:10089000770B71958FEF84B965B95F9A5F9814B83B +:1008A0000FEF2E814A816F2D47CF813099F7612F4D +:1008B0006F736064EFCF83ECDF91CF911F910F9145 +:1008C000FF90EF90089584ECF7CFCF92DF92EF92F4 +:1008D000FF920F931F93CF93DF937B016A01DB019C +:1008E0001796CC91D0E0082F10E0102F0027D701E9 +:1008F00016968C91169790E08C179D0760F41796CA +:10090000CC9380E0DF91CF911F910F91FF90EF90FA +:10091000DF90CF900895CE019927D7011496ED91DD +:10092000FC911597E80FF91F6081802B912BF60140 +:1009300009952196DCCF3F924F925F926F927F9202 +:100940008F929F92AF92BF92CF92DF92EF92FF92DF +:100950000F931F93CF93DF934A013901D801179664 +:10096000CC91D0E0462E512C542C4424D80116961C +:100970008C91169790E08C179D07A8F41796CC934E +:1009800080E0DF91CF911F910F91FF90EF90DF906A +:10099000CF90BF90AF909F908F907F906F905F901F +:1009A0004F903F9008956AEAC401F701099565E503 +:1009B000C301F701099560EAC401F7010995CE0169 +:1009C00099275C01A428B528D8011496ED91FC91D3 +:1009D0001597E80FF91F6081C501F70109950E947D +:1009E000A618C501F6010995382EC501F60109952D +:1009F0003812F5CF2196BACF2F923F924F925F9245 +:100A00006F927F928F929F92AF92BF92CF92DF921E +:100A1000EF92FF920F931F93CF93DF93CDB7DEB783 +:100A200027970FB6F894DEBF0FBECDBF582E4A01F0 +:100A30003C832B831F830E83D80117964C90042D83 +:100A400010E070E0F62FEE27FA83E983252C312C95 +:100A5000F7E92F1AF2E03F0AAE81BF8116968C911A +:100A6000169790E080179107E0F417964C9280E07B +:100A700027960FB6F894DEBF0FBECDBFDF91CF91A2 +:100A80001F910F91FF90EF90DF90CF90BF90AF90AC +:100A90009F908F907F906F905F904F903F902F909E +:100AA000089560E089E69DEF0E94F50F6AEAC401AF +:100AB000F701099565E58B819C81F701099560EA4D +:100AC000C401F7010995652DC1010E94F50F642C41 +:100AD000712CA980BA80A628B728AE81BF81149650 +:100AE000ED91FC911597E60DF71D6081C501F701A9 +:100AF00009950E94A618C501F6010995282FC50180 +:100B00002D83F60109952D812813F3CFAE81BF8186 +:100B100014968D919C911597680E791EF301808132 +:100B2000281307C043940F5F1F4F5198599A599843 +:100B300093CF519A599A90CF2F923F924F925F92B2 +:100B40006F927F928F929F92AF92BF92CF92DF92DD +:100B5000EF92FF920F931F93CF93DF9300D000D0BB +:100B60001F92CDB7DEB7382E4A0129011D830C83B1 +:100B7000D80117962C90022D10E070E0F62FEE278A +:100B8000FA83E983AC81BD8116968C91169790E02B +:100B900080179107D8F417962C9280E00F900F9051 +:100BA0000F900F900F90DF91CF911F910F91FF90B9 +:100BB000EF90DF90CF90BF90AF909F908F907F90FD +:100BC0006F905F904F903F902F90089561E080E08C +:100BD00090EC0E94F50F6AEAC401F701099560E004 +:100BE00080E090EC0E94F50F65E5C201F7010995E0 +:100BF00061E080E090EC0E94F50F60EAC401F7012B +:100C00000995632D80E090EC0E94F50F622C712C09 +:100C1000A980BA80A628B728AC81BD811496ED9131 +:100C2000FC911597E60DF71D6081C501F701099547 +:100C30000E94A618C501F6010995282FC5012B832E +:100C4000F60109952B812813F3CFAC81BD81149651 +:100C50008D919C911597680E791EF3018081281360 +:100C600007C023940F5F1F4F5198599A59988ACF04 +:100C7000519A599A87CF2F923F924F925F926F92DB +:100C80007F928F929F92AF92BF92CF92DF92EF921C +:100C9000FF920F931F93CF93DF9300D000D01F924A +:100CA000CDB7DEB7582E4A0119011D830C83D80138 +:100CB00017964C90042D10E070E0F62FEE27FA8383 +:100CC000E983AC81BD8116968C91169790E08017D0 +:100CD0009107D8F417964C9280E00F900F900F90E8 +:100CE0000F900F90DF91CF911F910F91FF90EF9098 +:100CF000DF90CF90BF90AF909F908F907F906F903C +:100D00005F904F903F902F90089540E060E180E029 +:100D100090E80E9400116AEAC401F701099565E5AF +:100D2000C101F701099560EAC401F7010995A42CF6 +:100D3000B12C69807A806A287B28AC81BD811496A9 +:100D4000ED91FC911597EA0DFB1D6081C301F70140 +:100D5000099541E060E180E090E80E94001140E0E8 +:100D6000652D80E090EE0E9400110E94A618C3013C +:100D7000F6010995282FC3012B83F60109952B81D4 +:100D80002813F3CFAC81BD8114968D919C9115975A +:100D9000A80EB91EF5018081281307C043940F5F88 +:100DA0001F4F5198599A59988CCF41E060E180E0EB +:100DB00090E80E94001140E0652D80E090EE0E94D6 +:100DC0000011519A599A7DCF3F924F925F926F9244 +:100DD0007F928F929F92AF92BF92CF92DF92EF92CB +:100DE000FF920F931F93CF93DF93482E662E7A01C5 +:100DF000E901DA0117965C90A52CB12C6AEA8AEA1F +:100E00009AE8F901099565E585E595E8FE010995FA +:100E100060E28AEA9AE8FE010995712C762C662434 +:100E2000D70116968C91169790E08A159B0520F5B0 +:100E300017965C9260E980E090E8FE01099560E019 +:100E400080E090E8FE01099560EF80E090E8FE0107 +:100E5000099580E0DF91CF911F910F91FF90EF9066 +:100E6000DF90CF90BF90AF909F908F907F906F90CA +:100E70005F904F903F90089564E580E090E50E9478 +:100E8000F50F852C912C6401C628D72860EAC6018D +:100E9000FE010995D7011496ED91FC911597E80D87 +:100EA000F91D6081C601FE0109950E94A618C601C0 +:100EB000F8010995382EC601F80109953812F5CFC9 +:100EC000D70114968D919C911597880E991EF40167 +:100ED0008081381208C05394FFEFAF1ABF0A5198AF +:100EE000599A59989DCF61E880E090E50E94F50FEE +:100EF000642D80E090E80E94F50F64E580E090E5C5 +:100F00000E94F50F519A599A8BCF4F925F926F9230 +:100F10007F928F929F92AF92BF92CF92DF92EF9289 +:100F2000FF920F931F93CF93DF93662E7A01E9010F +:100F3000DA0117965C90A52CB12C6AEA8AEA9AE845 +:100F4000F901099565E585E595E8FE01099560E2F9 +:100F50008AEA9AE8FE010995712C762C6624D7015D +:100F600016968C91169790E08A159B0518F51796A2 +:100F70005C9260E980E090E8FE01099560E080E025 +:100F800090E8FE01099560EF80E090E8FE01099588 +:100F900080E0DF91CF911F910F91FF90EF90DF9054 +:100FA000CF90BF90AF909F908F907F906F905F9009 +:100FB0004F900895852C912C6401C628D72860EAAB +:100FC000C601FE010995D7011496ED91FC91159784 +:100FD000E80DF91D6081C601FE0109950E94A61861 +:100FE000C601F8010995482EC601F8010995481275 +:100FF000F5CFD70114968D919C911597880E991E67 +:10100000F4018081481208C05394FFEFAF1ABF0A61 +:101010005198599A5998A3CF519A599AA0CF4F9263 +:101020005F926F927F928F929F92AF92BF92CF9278 +:10103000DF92EF92FF920F931F93CF93DF93EA011A +:1010400069015F80A52CB12CE62EF12CFE2CEE243C +:101050008E8190E08A159B0598F45F8280E0DF9195 +:10106000CF911F910F91FF90EF90DF90CF90BF90A5 +:10107000AF909F908F907F906F905F904F9008956A +:101080006AEA85E595E1F601099565E58AEA9AE05F +:10109000F601099560EA85E595E1F6010995652C6B +:1010A000712C43018E289F28EC81FD81E60DF71DF0 +:1010B0006081C401F60109950E94A618C401F801D7 +:1010C0000995482EC401F80109954812F5CF8C8185 +:1010D0009D81680E791EF3018081481208C05394E7 +:1010E000FFEFAF1ABF0A5198599A5998B1CF519A48 +:1010F000599AAECF7F928F929F92AF92BF92CF922A +:10110000DF92EF92FF920F931F93CF93DF93782E8E +:10111000EA01790148011F81C12ED12C5601B62A5E +:101120008E81811780F41F8380E0DF91CF911F9122 +:101130000F91FF90EF90DF90CF90BF90AF909F9076 +:101140008F907F90089562E080E090E80E94F50F14 +:101150006AEA85E595E1F701099561E080E090E8AC +:101160000E94F50F65E58AEA9AE0F701099562E0C9 +:1011700080E090E80E94F50F60EA85E595E1F701CF +:101180000995672D80E090E80E94F50FEC81FD81C4 +:10119000EC0DFD1D6081C501F70109950E94A6189F +:1011A000672D80E090E80E94F50FC501F4010995D4 +:1011B000082FC501F40109950813F0CFEC81FD81DA +:1011C000EC0DFD1D8081081304C05198599A59985F +:1011D000A7CF519A599AA4CF3F924F925F926F92A4 +:1011E0007F928F929F92AF92BF92CF92DF92EF92B7 +:1011F000FF920F931F93CF93DF93EA0169015F8002 +:10120000A52CB12C482E429480EF4822E62EF12CDA +:10121000FE2CEE248E8190E08A159B05A0F45F825F +:1012200080E0DF91CF911F910F91FF90EF90DF90C1 +:10123000CF90BF90AF909F908F907F906F905F9076 +:101240004F903F90089560E280E090E80E94F50F93 +:101250006AEA85E595E1F601099560E180E090E8AC +:101260000E94F50F65E58AEA9AE0F601099560E2C9 +:1012700080E090E80E94F50F60EA85E595E1F601CF +:101280000995642D80E090E80E94F50F652C712C83 +:1012900043018E289F28EC81FD81E60DF71D6081BA +:1012A000C401F60109950E94A618C401F801099528 +:1012B000382EC401F80109953812F5CF8C819D8133 +:1012C000680E791EF3018081381208C05394FFEF35 +:1012D000AF1ABF0A5198599A59989CCF519A599A66 +:1012E00099CF4F925F926F927F928F929F92AF921F +:1012F000BF92CF92DF92EF92FF920F931F93CF9303 +:10130000DF93662E7A01E901DA0117965C90A52C2D +:10131000B12C6AEA8AEA9AE0F901099565E585E562 +:1013200095E0FE01099560E28AEA9AE0FE010995DE +:10133000712C762C6624D70116968C91169790E026 +:101340008A159B0518F517965C9260E980E090E09D +:10135000FE01099560E080E090E0FE01099560EFF4 +:1013600080E090E0FE01099580E0DF91CF911F9130 +:101370000F91FF90EF90DF90CF90BF90AF909F9034 +:101380008F907F906F905F904F900895852C912C57 +:101390006401C628D72860EAC601FE010995D70175 +:1013A0001496ED91FC911597E80DF91D6081C60129 +:1013B000FE0109950E94A618C601F8010995482E5C +:1013C000C601F80109954812F5CFD70114968D9101 +:1013D0009C911597880E991EF4018081481208C0CF +:1013E0005394FFEFAF1ABF0A5198599A5998A3CF57 +:1013F000519A599AA0CF4F925F927F928F929F926B +:10140000AF92BF92CF92DF92EF92FF920F931F9312 +:10141000CF93DF93A62E6A01E901DA011796EC90CB +:10142000F12CA89500000000000000000000000062 +:101430000000000000006AEA8AEA9AE8F9010995CA +:1014400065E585E595E8FE01099560E28AEA9AE896 +:10145000FE010995B12CBA2CAA24D60116968C91BE +:10146000169790E08E159F0518F51796EC9260E997 +:1014700080E090E8FE01099560E080E090E8FE01E0 +:10148000099560EF80E090E8FE010995000080E09A +:10149000DF91CF911F910F91FF90EF90DF90CF9050 +:1014A000BF90AF909F908F907F905F904F900895E6 +:1014B00080EA0E943C162701552442018A289B2875 +:1014C000D6011496ED91FC911597E40DF51D608100 +:1014D000C401FE01099500000000000000000000AA +:1014E0000000000000000000A8950E94A618C4019A +:1014F000F8010995782E00000000000000000000AF +:101500000000000000000000D6011496ED91FC914F +:101510001597E40DF51D80817816B9F000000000E4 +:101520000000000000000000000000000000C401F6 +:10153000F801099578120DC00000000000000000BD +:1015400000000000000000000000FFEFEF1AFF0A9B +:1015500084CF000000000000000000000000000038 +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:101580000000000000000000000000000000C40196 +:10159000F8010995782ECBCFAF92BF92CF92DF9210 +:1015A000EF92FF920F931F93CF93DF93EC01B880DC +:1015B0008985823109F455C138F48031B1F0813127 +:1015C00009F411C183EC06C0833109F452C184319E +:1015D000C9F780E0DF91CF911F910F91FF90EF90BD +:1015E000DF90CF90BF90AF9008958D85811107C097 +:1015F00041E251E1BE0180E88B0D0E9465048D85BA +:10160000813041F58881998156E0969587955A9564 +:10161000E1F7282F2F70A22E41E060E180E090E8F2 +:101620000E94001140E06A2D80E090EE0E940011BF +:1016300063EEC62E6FE0D62E75EFE72E7FE0F72E15 +:101640008E012AEA3AEA45E555ED6B2D60688A2D50 +:101650000E943B068D858330D1F46B2D6F736068DB +:10166000B62E8881998126E0969587952A95E1F78F +:1016700033EEC32E3FE0D32E4BEAE42E4FE0F42EA0 +:101680008E012AEA3AE245E555E50E94FC048D8583 +:10169000843039F44BEB51E1BE0180E88B0D0E94A0 +:1016A00065048D858D3FD1F46B2D6F736068B62E08 +:1016B0008881998116E0969587951A95E1F703EE52 +:1016C000C02E0FE0D02E9AEBE92E9FE0F92E8E016E +:1016D0002AEA3AE245E555E50E94FC048D858E3103 +:1016E000D1F46B2D6F736068B62E88819981F6E016 +:1016F00096958795FA95E1F7A3EECA2EAFE0DA2E1C +:10170000B5EFEB2EBFE0FB2E8E012AEA3AEA45E563 +:1017100055E90E949C058D858C3031F56B2D6F71DC +:101720006068B62EE880F98065E0F694E7946A95E3 +:10173000E1F765EA80E090E60E94F50F6E2D8FEFED +:101740009FEF0E94F50F73EEC72E7FE0D72EE5EFD7 +:10175000EE2EEFE0FE2E8E012AEA3AEA45E555ED3F +:101760006B2D80E00E949B048D858C3101F5E88013 +:10177000F980EE0CEF2CEE1CFF08F19461E880E09C +:1017800090E50E94F50F6E2D80E090E80E94F50F25 +:1017900064E580E090E50E94F50F03EE1FE025EF81 +:1017A0003FE0AE016B2D60688E2D0E94E4068D85B2 +:1017B0008F3109F00ECFE880F98044E0F694E79489 +:1017C0004A95E1F76E2D80E090E50E94F50F6B2DB4 +:1017D0006F78606803EE1FE025EF3FE0AE018E2DCD +:1017E0000E948507F6CE8D85811106C048E451E13F +:1017F000BE018B2D0E9465048D85823031F44FE649 +:1018000051E1BE018B2D0E9465048D85843031F439 +:1018100047EE51E1BE018B2D0E9465048D858B3012 +:1018200031F44EE052E1BE018B2D0E9465048D859E +:101830008E3F09F0CECE6881798135E07695679547 +:101840003A95E1F78FEF9FE30E941F106B2D6F71A8 +:1018500003E310E125E430E1AE0180E00E9471096C +:10186000B8CE45EF5FE0BE0180E68B0D0E946504B7 +:10187000B0CE8D85843039F44AE856E1BE0180E867 +:101880008B0D0E9465048D85853031F44AE856E160 +:10189000BE018B2D0E9465048D85863039F441EBA5 +:1018A00056E1BE0180E88B0D0E9465048D8587306E +:1018B00031F441EB56E1BE018B2D0E9465048D850C +:1018C000811119C08B2D8068B82E88819981880F6D +:1018D000892F881F990B91959FEF94B985B95F9ACD +:1018E0005F9814B80FE016E129E236E1AE016B2DE6 +:1018F00080E00E94FB098D85813009F06ACE8981E4 +:101900008F7380649FEF94B985B95F9A5F9814B81C +:101910000FE016E129E236E1AE016B2D80E00E9476 +:10192000FB0957CE882321F0813041F480E00895EF +:1019300091E0F90190839AEA918308958FEA0895DE +:101940008AEA08950895882321F0813041F480E0E7 +:10195000089591E0F90190839AEA9183089580EBCC +:1019600008958AEA089508953898409A3998419AD6 +:101970003A98429A3C98449A3D98459A3E98469A9D +:1019800053985B9A55985D9A3B98439A3F98479A2B +:1019900057985F9A5098589814B88FEF85B93F9A26 +:1019A000479881B911B882B914B885B914B885B906 +:1019B0005198599A08950E94B40C399A419A389ACC +:1019C00040983A9A429A3C9A449A3D9A459A14B859 +:1019D0008FEF85B914B885B914B885B93F9A47987F +:1019E00081B912B884B915B8479A479814B80895C0 +:1019F0000E94B40C399A419A3C9A449A3D9A459A6D +:101A0000589A509A14B88FEF85B914B885B914B89C +:101A100085B93F9A479881B912B884B915B8479AE1 +:101A2000479814B814B885B9579A5F9884B915B80F +:101A30005F9A5F9814B808950E94B40C399A419A3D +:101A40003C9A449A3D9A459A5898509A14B88FEF08 +:101A500085B914B885B914B885B93F9A479881B942 +:101A600012B884B915B8479A479814B808950C94D9 +:101A70001C0D0E94B40C399A419A3C9A449A3D9AA2 +:101A8000459A3A9A429A589A509A14B88FEF85B963 +:101A900014B885B914B885B93F9A479881B912B876 +:101AA00084B915B8479A479814B814B885B9579AA5 +:101AB0005F9884B915B85F9A5F9814B8089582301A +:101AC00081F0833061F08130A1F40898109A10926F +:101AD000B90380E290E09093B8038093B70380E06D +:101AE00008955098589A88E08093B90389E290E06D +:101AF000F2CF87E90895813049F414B88FEF85B9A2 +:101B0000579A5F980E94FB0D80E0089588E9089538 +:101B10005898509A000089B15098589880FD22C07A +:101B20005098589A59B149B1000039B100000000ED +:101B300029B100000000000099B100000000000081 +:101B4000000089B15098589850FD0EC040FD0EC05D +:101B500030FD0EC020FD0EC090FD0EC080FD0EC0F9 +:101B600080EE089580EF089580E0089581E0089563 +:101B700083E0089586E008958AE008958FE008954F +:101B80000F931F93CF93C82F842F8901C33009F17E +:101B900030F4C130A1F060F00E94F80C12C0C530E2 +:101BA00091F0E0F0C73091F0C038E9F0C6E902C02A +:101BB0000E94B40C8C2FCF911F910F9108950E9419 +:101BC000DB0CC0E0F7CF0E941C0DFBCF0E94390D4B +:101BD000F8CFCF911F910F910C945F0DCF911F9172 +:101BE0000F910C947B0D81E0F90180830E94880D98 +:101BF000F8018183E6CF109214018FEF84B915B8F4 +:101C00005F9A5F9814B85098589A80E880936C0354 +:101C100010927A03EBE7F3E0119283E0EB39F807D7 +:101C2000D9F7089560917A03813109F441C0109287 +:101C300014019FEF94B99091140195B95F9A5F9840 +:101C400014B820E070E03FEF8032C9F4E72FF0E0F5 +:101C5000E558FC4F408150E0022E02C05595479553 +:101C60000A94E2F740FF28C092E034B995B95F9A30 +:101C70005F9814B82F5F283011F47F5F20E0492F60 +:101C8000446034B945B95F9A5F9814B8615034B96B +:101C900095B95F9A5F9814B86111D6CF90931401EB +:101CA0004093270134B915B85F9A5F9814B8089526 +:101CB00092E090931401BDCF90E0D7CF0F931F9384 +:101CC000CF93DF9350917A03B0917B03813109F474 +:101CD0006BC0109214019FEF94B99091140195B9C3 +:101CE0005F9A5F9814B820E030E07FEFC1E0D0E069 +:101CF000803281F4EB2FF0E0022E02C0F595E795DB +:101D00000A94E2F7E0FF54C0916074B995B95F9A04 +:101D10005F9814B86032B1F4211105C0E32FF0E0F0 +:101D2000E558FC4F1082489B0DC0E32FF0E0E558CA +:101D3000FC4FA0818E01022E01C0000F0A94EAF729 +:101D4000A02BA0835150442341F0511106C0926052 +:101D500074B995B95F9A5F9814B8A92FA46074B943 +:101D6000A5B95F9A5F9814B874B995B95F9A5F98EE +:101D700014B82F5F283039F43F5FE32FF0E0E558C7 +:101D8000FC4FB08120E05111B3CF90931401A09388 +:101D900027018FEF84B915B85F9A5F9814B8DF9167 +:101DA000CF911F910F91089591E09093140193CFDB +:101DB0009E7FABCF80916C038338D1F580916D030A +:101DC000883009F463C0C0F4833009F445C030F4AE +:101DD000813079F18230A1F18EEE28C0863009F48D +:101DE0004AC008F04EC08430B9F781E880936C0394 +:101DF00041E060E281E136C08F30C1F148F48D30BE +:101E000031F18E3049F781E880936C0340E028C0BF +:101E1000803849F08F3F49F08031F1F681E88093B6 +:101E20006C0340E02CC00C94FB0D80EF80936C039E +:101E3000089581E880936C0380E20E94120E14C022 +:101E400081E880936C0341E060E080E20BC081E8B0 +:101E500080936C0340E0F8CF81E880936C0341E00D +:101E600060E280E10E945E0E82E8E0CF81E880932C +:101E70006C0340E0BECF81E880936C0341E060E2F8 +:101E8000E4CF81E880936C0380E1D7CF81E8809331 +:101E90006C0381E1D2CFCF93DF93E901843061F10C +:101EA00038F48230E1F008F58130A1F087E80FC006 +:101EB000873039F128F48530C9F740937A0306C09A +:101EC000883021F1803891F70E94FB0D80E0DF918E +:101ED000CF91089590916D0399838883F7CF4093B4 +:101EE0006D0383E880936C03F1CF40936D0383E827 +:101EF00080936C030E94DA0E80916C03898381E0E9 +:101F0000ECCF40937B0350937C03E0CF80917B0325 +:101F1000898380917C038A8380917D038B83809168 +:101F20007E038C8380917F038D83809180038E83D9 +:101F300086E0D3CF882321F0813041F480E00895FA +:101F400091E0F90190839AEA9183089582EB0895D4 +:101F50008AEA0895089582B98FEF84B995B9479AAE +:101F6000479814B884B965B9509A58985098589AB7 +:101F700014B8089582B98FEF84B995B9479A4798F4 +:101F800014B884B965B9509A5898589A14B80895F5 +:101F9000509858984098419A429A82B92FEF24B9A4 +:101FA00095B9479A479814B800000000409A97FDE9 +:101FB000419800000000000000000000000083B114 +:101FC0004098419A089582B92FEF24B995B9479A5C +:101FD000479814B8409A97FD41980000000000000F +:101FE000000083B14098419A08955098589882B95A +:101FF0002FEF24B995B9479A479814B8429824B955 +:1020000065B9409A97FD4198000000004098419AB8 +:10201000429A14B80895811520E2920708F4906856 +:1020200082B98FEF84B995B9479A479814B8449804 +:10203000000000000000000083B1449A089581155B +:1020400020E2920708F4906882B98FEF84B995B9BD +:10205000479A479814B884B965B9000045980000BC +:10206000459A14B8089582B98FEF84B995B9479A03 +:10207000479814B8409A4198449800000000000026 +:1020800083B1449A4098419A089582B98FEF84B9F8 +:1020900095B9479A479814B84098419884B965B95A +:1020A000000045980000459A14B8419A0895EF92AF +:1020B000FF920F93CF93DF9300D01F92CDB7DEB77F +:1020C0007C018FEF84B965B9479A479814B8409A54 +:1020D00067FD419842B9000080E0011117C000007F +:1020E000000093B1F701E80FF11D90834F5F42B9F3 +:1020F0008F5F281790F74098419A0F900F900F909C +:10210000DF91CF910F91FF90EF9008952B834A8339 +:1021100089830E94A61889814A812B81E2CFEF92A0 +:10212000FF920F93CF93DF9300D01F92CDB7DEB70E +:102130007C01603208F460688FEF84B965B9479A12 +:10214000479814B8449842B9000080E0011116C0C5 +:102150000000000093B1F701E80FF11D90834F5F7D +:1021600042B98F5F281790F7449A0F900F900F9005 +:10217000DF91CF910F91FF90EF9008952B834A83C9 +:1021800089830E94A61889814A812B81E3CFEF922F +:10219000FF920F93CF93DF9300D01F92CDB7DEB79E +:1021A0007C018FEF84B965B9479A479814B8409A73 +:1021B0004198449842B9000080E0011118C0000025 +:1021C000000093B1F701E80FF11D90834F5F42B912 +:1021D0008F5F281790F7449A4098419A0F900F907C +:1021E0000F90DF91CF910F91FF90EF9008952B8387 +:1021F0004A8389830E94A61889814A812B81E1CF75 +:102200000F931F93CF93DF938C01D62F442349F074 +:1022100080E090E80E94E30F60E880E090E80E9490 +:10222000F50FC5E0C8010E94E30F6D2FC8010E94A1 +:10223000F50FD695C150B1F7DF91CF911F910F9156 +:1022400008951F93CF93DF93EC01162F6AEA85E57B +:1022500095E50E94AB0F65E58AEA9AE20E94AB0F12 +:1022600060EA85E595E50E94AB0F612FCE010E94E3 +:10227000AB0FCE010E94E30F182F0E94A618CE01CB +:102280000E94E30F1813F5CFDF91CF911F910895AE +:102290001F93CF93DF93EC01162F6AEA85E595E152 +:1022A0000E941F1065E58AEA9AE00E941F1060EA0A +:1022B00085E595E10E941F10612FCE010E941F103D +:1022C000CE010E940B10182F0E94A618CE010E946A +:1022D0000B101813F5CFDF91CF911F9108951F9325 +:1022E000CF93DF93EC01162F80919B0390919C0379 +:1022F00062E002960E94F50F6AEA85E595E10E9488 +:102300001F1080919B0390919C0361E001960E94B5 +:10231000F50F65E58AEA9AE00E941F1080919B0301 +:1023200090919C0362E002960E94F50F60EA85E5B9 +:1023300095E10E941F1090919D0320919B03309185 +:102340009C03692FA901490F511DCA010E94F50F75 +:10235000612FCE010E941F10CE010E940B10182F7A +:102360000E94A618CE010E940B101813F5CFDF9122 +:10237000CF911F9108951F93CF93DF93EC01162FF8 +:102380006AEA85E595ED0E94F50F65E58AEA9AEA25 +:102390000E94F50F60EA85E595ED0E94F50F612F2B +:1023A000CE010E94F50F60E080E090E80E94F50FFA +:1023B000CE010E94E30F182F0E94A618CE010E94A2 +:1023C000E30F1813F5CFDF91CF911F9108951F935D +:1023D000CF93DF93EC01162F6AEA85E595E10E9421 +:1023E0001F1065E58AEA9AE10E941F1060EA85E500 +:1023F00095E10E941F10612FCE010E941F10CE0197 +:102400000E940B10182F0E94A618CE010E940B10DC +:102410001813F5CFDF91CF911F9108950F931F935C +:10242000CF93DF938C01D62FC0919D03C295C07FBF +:1024300080919B0390919C0360E280960E94F50F2F +:102440006AEA85E595E10E941F1080919B039091B7 +:102450009C0360E140960E94F50F65E58AEA9AE0E8 +:102460000E941F1080919B0390919C0360E28096D4 +:102470000E94F50F60EA85E595E10E941F108091AA +:102480009B0390919C036C2F8C0F911D0E94F50F64 +:102490006D2FC8010E941F10C8010E940B10C82F89 +:1024A0000E94A618C8010E940B10C813F5CFDF9137 +:1024B000CF911F910F9108950F931F93CF93C82F22 +:1024C000CA018901CA3009F46AC0F0F4C53009F4C0 +:1024D0005CC068F4C13009F452C008F445C0C23091 +:1024E00009F450C0C43009F453C0C0EA3FC0C7303B +:1024F00009F45BC008F43FC0C83009F459C0C930C2 +:10250000A1F70E94211139C0C03809F457C070F4F6 +:10251000CC3009F450C008F445C0C032E9F1C132F2 +:1025200021F740939B0390939C0327C0C43809F480 +:1025300053C058F4C13809F449C0C238B1F621E09B +:10254000F80120830E940B103EC0C53809F44AC030 +:10255000C63859F682E0F901808380919B0381831C +:1025600080919C03828309C00E94AB0F8C2FCF9176 +:102570001F910F9108950E94BA0FC0E0F7CF0E94FB +:102580001F10FBCF0E94F50FF8CF0E944510F5CF2A +:1025900040E00E940011F1CF40939D03EECF0E94D6 +:1025A0004811EBCF0E946F11E8CF0E94BB11E5CF1D +:1025B0000E94E711E2CF0E940E12DFCF21E0F80166 +:1025C00020830E94C80FF8018183D7CF21E0F80152 +:1025D00020830E94E30FF7CF21E0F80120830E94BF +:1025E0003310F1CF81E0F901808380919D03ECCF1E +:1025F000CF93DF93FB01DC0112962C91222329F06B +:10260000203479F082ED808308C01082A09102010D +:10261000B0910301EC018C818C93CF01DF91CF91BC +:102620000895108281E08183A0910201B09103019D +:102630008C918283F2CFE0910201F09103018083BB +:102640000895E0910201F0910301808108950F93B4 +:102650001F93D901082F10E00831110508F0C2C2FC +:10266000F801EB5CFC4E0C94041B6F134D13AA1382 +:10267000051451149D14E914941599159E15A1156E +:10268000A515A815B015B815BC15BF15C315CC15E3 +:10269000D315D715DF15E615EA154631510508F0B3 +:1026A000A3C2FA01EA5AFC4E0C94041B6C13721379 +:1026B00076137A137E13821386138A138E13921362 +:1026C00096139A139E13A213F415F415F415F4152A +:1026D000F415F415F415A6133898409A80E01F916C +:1026E0000F9108953998419A80E0F9CF3A98429A2B +:1026F00080E0F5CF3B98439A80E0F1CF3C98449A34 +:1027000080E0EDCF3D98459A80E0E9CF3E98469A2B +:1027100080E0E5CF3F98479A80E0E1CF5098589A03 +:1027200080E0DDCF5198599A80E0D9CF53985B9AD9 +:1027300080E0D5CF55985D9A80E0D1CF56985E9ACB +:1027400080E0CDCF57985F9A80E0C9CF5098589AD3 +:1027500080E0C5CF4631510508F048C2FA01ED547A +:10276000FC4E0C94041BC913CD13D113D513D913EC +:10277000DD13E113E513E913ED13F113F513F91369 +:10278000FD13F615F615F615F615F615F615F615EC +:1027900001143898409880E0A2CF3998419880E0A1 +:1027A0009ECF3A98429880E09ACF3B98439880E039 +:1027B00096CF3C98449880E092CF3D98459880E031 +:1027C0008ECF3E98469880E08ACF3F98479880E029 +:1027D00086CF5098589880E082CF5198599880E0E1 +:1027E0007ECF53985B9880E07ACF55985D9880E0D3 +:1027F00076CF56985E9880E072CF57985F9880E0C9 +:102800006ECF5098589880E06ACF4631510508F055 +:10281000EFC1FA01E25FFB4E0C94041B2414271451 +:102820002A142D1430143314361439143C143F1464 +:102830004214451448144B14F815F815F815F815FA +:10284000F815F815F8154E14389A80E048CF399AE3 +:1028500080E045CF3A9A80E042CF3B9A80E03FCF7C +:102860003C9A80E03CCF3D9A80E039CF3E9A80E0B0 +:1028700036CF3F9A80E033CF509A80E030CF519AE4 +:1028800080E02DCF539A80E02ACF559A80E027CF61 +:10289000569A80E024CF579A80E021CF509A80E06A +:1028A0001ECF4631510508F0A5C1FA01E65AFB4E8C +:1028B0000C94041B70147314761479147C147F1414 +:1028C0008214851488148B148E1491149414971404 +:1028D000FA15FA15FA15FA15FA15FA15FA159A14E1 +:1028E000409880E0FCCE419880E0F9CE429880E0AC +:1028F000F6CE439880E0F3CE449880E0F0CE459841 +:1029000080E0EDCE469880E0EACE479880E0E7CEC2 +:10291000589880E0E4CE599880E0E1CE5B9880E062 +:10292000DECE5D9880E0DBCE5E9880E0D8CE5F980A +:1029300080E0D5CE589880E0D2CE4631510508F0DF +:102940005BC1FA01EA55FB4E0C94041BBC14BF1486 +:10295000C214C514C814CB14CE14D114D414D71473 +:10296000DA14DD14E014E314FC15FC15FC15FC1559 +:10297000FC15FC15FC15E614409A80E0B0CE419A97 +:1029800080E0ADCE429A80E0AACE439A80E0A7CE06 +:10299000449A80E0A4CE459A80E0A1CE469A80E099 +:1029A0009ECE479A80E09BCE589A80E098CE599A66 +:1029B00080E095CE5B9A80E092CE5D9A80E08FCEEB +:1029C0005E9A80E08CCE5F9A80E089CE589A80E053 +:1029D00086CE82E08C934631510508F0A2C0FA0100 +:1029E000EC50FB4E0C94041B0A1513151C152515F1 +:1029F0002E1537154015491552155B1564156D15C3 +:102A000076157F15911591159115911591159115C3 +:102A10009115881586B1817011968C931197129635 +:102A20001C9280E05CCE86B1827090E012969C93FE +:102A30008E93119780E053CE86B1847090E0129609 +:102A40009C938E93119780E04ACE86B1887090E077 +:102A500012969C938E93119780E041CE86B180713F +:102A600090E012969C938E93119780E038CE86B1B9 +:102A7000807290E012969C938E93119780E02FCEF7 +:102A800086B1807490E012969C938E93119780E0AB +:102A900026CE86B1807890E012969C938E93119703 +:102AA00080E01DCE89B1817011968C93119712969A +:102AB0001C9280E014CE89B1827090E012969C93B3 +:102AC0008E93119780E00BCE89B1887090E01296BA +:102AD0009C938E93119780E002CE89B1807290E032 +:102AE00012969C938E93119780E0F9CD89B18074F2 +:102AF00090E012969C938E93119780E0F0CD89B16F +:102B0000807890E012969C938E93119780E0E7CDA9 +:102B100089B1817011968C93119712961C9280E066 +:102B2000DECD1C928DE8DBCD14B88FEF85B980E047 +:102B3000D6CD14B88FEF85B980E0D1CD14B880E040 +:102B4000CECD8FEF84B980E0CACD45B980E0C7CD46 +:102B500083B111968C93119781E08C9380E0BFCD67 +:102B600014B88FEF85B93F9A479881B980E0B7CD07 +:102B70008FEF82B980E0B3CD11B880E0B0CD8FEF98 +:102B800081B980E0ACCD42B98FEF84B955B9479A8D +:102B9000479814B880E0A3CD14B88FEF85B9579A41 +:102BA0005F9880E09CCD57985F9A80E098CD8FEF3A +:102BB00084B945B95F9A5F9814B880E090CD14B895 +:102BC0008FEF85B9579A5F9880E089CD57985F9AC3 +:102BD00080E085CD8FEF84B945B95F9A5F9814B8CE +:102BE00080E07DCD8CE87BCD8DE879CD8DE877CD0B +:102BF0008DE875CD8DE873CD8DE871CD882321F0FA +:102C0000813041F480E0089591E0F90190839AEADF +:102C10009183089581EB08958AEA0895089582B911 +:102C20008FEF84B995B9479A479814B8419844985A +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000083B1449A419A97 +:102C5000089582B98FEF84B995B9479A479814B807 +:102C600084B965B945984198000000000000000053 +:102C7000459A419A14B808959FEF94B985B945983B +:102C800041980000000000000000459A419A14B8E5 +:102C90000895EF92FF920F93CF93DF9300D01F928E +:102CA000CDB7DEB77C018FEF84B965B9479A4798F5 +:102CB00014B84498419842B980E001111FC0000047 +:102CC0000000000000000000000000000000000004 +:102CD000000093B1F701E80FF11D90834F5F42B9F7 +:102CE0008F5F281750F7449A419A0F900F900F90DA +:102CF000DF91CF910F91FF90EF9008952B834A833E +:102D000089830E94A61800000000000089814A8182 +:102D10002B81D9CF1F93CF93DF93EC01162F6AEA53 +:102D200085E595E50E94291665E58AEA9AE20E9402 +:102D3000291660EA85E595E50E942916612FCE01E6 +:102D40000E942916CE010E940F16182F0E94A61865 +:102D5000CE010E940F161813F5CFDF91CF911F916E +:102D600008951F93CF93DF93EC01162F6AEA8AEA46 +:102D70009AE80E94291665E585E595E80E942916DE +:102D800060EA8AEA9AE80E942916612FCE010E9421 +:102D90002916CE010E940F16182F0E94A618CE01E8 +:102DA0000E940F161813F5CFDF91CF911F91089550 +:102DB000CF93DF93782FCA01E9017230C1F030F46C +:102DC000772359F07130D1F07AEA0DC0733099F061 +:102DD0007430D1F70E94B1160CC09FEF94B985B939 +:102DE0005F9A5F9814B8872FDF91CF9108950E9462 +:102DF000291670E0F8CF0E948A16FBCF78830E94D4 +:102E00000F168983F6CF880F991F880F991F20E02E +:102E100030E02817390709F40895000000002F5FFB +:102E20003F4FF7CF20E030E02817390709F4089525 +:102E3000000000002F5F3F4FF7CFCF93DF9380E17B +:102E400090E00E940317C4E0D0E084EF91E00E947C +:102E5000031784EF91E00E9403172197B1F7C4E0B4 +:102E6000D0E08AEF90E00E9403178AEF90E00E9482 +:102E700003172197B1F7DF91CF91089580E190E09A +:102E80000C940317CF93DF931F92CDB7DEB7F901F0 +:102E9000813171F038F48130C1F078F08230C9F0BE +:102EA00082E80FC08132A9F0823299F08231C1F7F5 +:102EB00082E08083128211820AC089830E941D17DA +:102EC00089810F90DF91CF9108950E943E1780E095 +:102ED000F8CF81E080831182FACF482F90E0982FBD +:102EE000882720E0411103C02111806808952095B2 +:102EF0003FEF340F4323F6CF80E090E0089580E069 +:102F0000089560E070E0CB010895CF93DF931F92A6 +:102F1000CDB7DEB7DC018FEF809307011092080177 +:102F200087E091E09093C9038093C80316968C9133 +:102F3000169789831196EC9111974E2F50E0FA0164 +:102F40003197EF30F10508F0D7C0E755F84E0C94F3 +:102F5000041BB817C817D617E41762187C18731823 +:102F60002A18381846185418F21700180E181C188A +:102F700014964D915C91159728E031E013966C9171 +:102F8000139712968C910E94271380930701A6C075 +:102F900014964D915C91159728E031E013966C9151 +:102FA000139712968C910E94C00DEFCF14964D91FD +:102FB0005C91159728E031E013966C911397129667 +:102FC0008C910E945C12E1CF14964D915C91159703 +:102FD00028E031E013966C91139712968C910E9421 +:102FE000D816D3CF14964D915C91159728E031E017 +:102FF00013966C91139712968C910E94920CC5CFE8 +:1030000014964D915C91159728E031E013966C91E0 +:10301000139712968C910E94A30CB7CF14964D91E2 +:103020005C91159728E031E013966C9113971296F6 +:103030008C910E94FE15A9CF14964D915C91159725 +:1030400028E031E013966C91139712968C910E94B0 +:103050009A0F9BCF14964D915C91159728E031E023 +:1030600013966C91139712968C910E9442178DCFF4 +:1030700014964D915C91159728E031E013966C9170 +:10308000139712968C910E944B0F7FCF14964D91FF +:103090005C91159728E031E013966C911397129686 +:1030A0008C910E94950071CF14964D915C9115976B +:1030B00028E031E013966C91139712968C910E9440 +:1030C000420363CFAE014F5F5F4F67E071E0CD0118 +:1030D0000E947C019093C9038093C80389810F905B +:1030E000DF91CF910895AE014F5F5F4F67E071E0D0 +:1030F000CD010E94F812EECF80E847CFE09169033E +:10310000F0916A03278144815581322F360F2313B2 +:1031100012C0E0916903F0916A038781860F87836B +:1031200080913801861B8093380181110DC088E998 +:10313000838381E00895FC017191CF01FA01E20FD0 +:10314000F11D70832F5FE3CF80E00895CF93DF936D +:103150006091CA03635067FD91C08091C703CCE0C2 +:10316000D0E0C81BD109C253DC4F8091C6038D3219 +:1031700009F0CFC0683009F07FC083EC8093BA03B8 +:103180008AE58093050110920F018881807679F09D +:10319000CE010E9485178F3F09F466C09F8191116F +:1031A00069C09E81981708F065C0892F63C02A8185 +:1031B0001092C303998191110AC01092C40323ECA9 +:1031C00033E082E03093C9032093C803E7CF953002 +:1031D00029F42093CB0323EC33E0F4CF963099F518 +:1031E0009B81913059F48EE890E09093C9038093CD +:1031F000C80382E190E490930F01D0CF923019F48C +:103200008CE790E0F2CF9330A9F7211108C088EE47 +:1032100090E09093C9038093C80384E0EBCF213002 +:1032200041F48EEB90E09093C9038093C8038AE247 +:10323000E1CF2230F9F680EA90E09093C9038093C1 +:10324000C8038EE1D7CF983059F0993019F4209304 +:10325000CD03C1CF81E09A3009F4BDCF80E0BBCF70 +:103260002DEC33E081E0AECF988197FD8E8190E820 +:1032700090930F01809304011092CA03809105017D +:1032800084FF3AC0809104018F3FB1F1C82F89308B +:1032900008F0C8E08C1B809304018091BA0398E881 +:1032A00089278093BA03CC23D1F08091C8039091F1 +:1032B000C90320910F0126FF3FC0ABEBB3E0FC0137 +:1032C0002C2F34913D9331962150D9F701962FEF51 +:1032D0002C0F820F911D9093C9038093C8036C2F0C +:1032E0008BEB93E00E94C119CC5FCC3019F08FEFCB +:1032F00080930401C093050184E199B1947131F484 +:103300008150D9F71092CB031092C503DF91CF9172 +:10331000089580910F0187FFAFCFCE010E947E18E4 +:103320008F3F21F48EE180930501A6CF882309F415 +:10333000A3CF10920401A0CFEBEBF3E0DC012C2F24 +:103340003D9131932150E1F7C1CFE9E6F0E0808172 +:1033500082608083E89A0895A82FB92F80E090E0DA +:1033600041E050EA609530E009C02D9182279795A1 +:10337000879510F084279527305EC8F36F5FA8F318 +:103380000895EADF8D939D930895CF93CFB7CF93A0 +:10339000DF93C3954C9BE9F74C9B0BC04C9B09C03A +:1033A0004C9B07C04C9B05C04C9B03C04C9B01C071 +:1033B00089C06F93C091C703DD27C253DC4F2F93A1 +:1033C00065E54C9B03C02F916F91E6CF0F931F9340 +:1033D0004F9320E040E15F9309B1047104FB27F9AA +:1033E0003F9350E03BE039C0147140642F77012FC8 +:1033F0005F5F1EC0406819B114712F7752501FC013 +:10340000406409B12F770471D1F15F5F00C023C020 +:10341000406219B12F77147191F15F5F00C025C030 +:1034200004711027515012F45D5F00001150279570 +:103430002C3F19B1C8F614710127015027952C3F74 +:10344000C8F64227499309B1047110274F731150F0 +:1034500027952C3FA8F64695469519B1147179F039 +:103460000127015027952C3F98F66B5A60F3315095 +:1034700009B1B0F600C011E01CBB002717C03B50DB +:103480003195C31BD04011E01CBB0881033CF9F00F +:103490000B34E9F02091C5031981110F1213EDCF00 +:1034A000093651F10D3211F0013E39F70093CC038A +:1034B0003F915F914F911F910F912F916F91CCB3DD +:1034C000C0FD67CFDF91CF91CFBFCF9118952091ED +:1034D000CC03222369F31091CA03112339F5343048 +:1034E0003AF13093CA032093C6031091C7033BE01F +:1034F000311B3093C7031CC00091CA030130B4F4E0 +:103500000AE53091050134FD14C000930501CAEBB2 +:10351000D3E013C0052710E000C000000BB91AC0AB +:10352000052710E0221F1DC010E021C04AE502C09F +:1035300032ED432FC4E1D0E032E01AB114615C9A5D +:103540000BB11AB954E120E865E320FF05270BB958 +:10355000279517951C3FF0F66695B8F7B1F720FF51 +:1035600005270BB9279517951C3FD0F6279517957A +:1035700017FF052700001C3F0BB9B0F629913A95BB +:1035800019F70B7E1091CB03110FC651D0400BB928 +:1035900011F01093C50311E01CBB00611AB11B7E32 +:1035A000402F4B7E54E05A95F1F70BB91AB94BB93D +:1035B0007FCF9EE088E10FB6F894A89580936000D5 +:1035C0000FBE909360000E94A519549A80E081502C +:1035D00099F4549878940E94B40C80EF80936C0313 +:1035E000A8950E94A6180E94AB0280916C03803FB0 +:1035F000B9F30E94DA0EF4CFA895EFE9FFE0319716 +:10360000F1F700C00000E3CFEE0FFF1F0590F4912B +:08361000E02D0994F894FFCFAE +:0636180069019E03FF5A48 :00000001FF diff --git a/firmware/build_stm/inlretro_stm.bin b/firmware/build_stm/inlretro_stm.bin index 259ec67..1a9588c 100644 Binary files a/firmware/build_stm/inlretro_stm.bin and b/firmware/build_stm/inlretro_stm.bin differ diff --git a/firmware/build_stm/inlretro_stm.elf b/firmware/build_stm/inlretro_stm.elf index 0666535..cba581d 100644 Binary files a/firmware/build_stm/inlretro_stm.elf and b/firmware/build_stm/inlretro_stm.elf differ 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